Ivan Gyurdiev : wined3d: Fix missing light recording.
Alexandre Julliard
julliard at wine.codeweavers.com
Wed Jun 7 09:13:40 CDT 2006
Module: wine
Branch: refs/heads/master
Commit: 4d66615bbb94ebb05802acd3e521ca543b487585
URL: http://source.winehq.org/git/?p=wine.git;a=commit;h=4d66615bbb94ebb05802acd3e521ca543b487585
Author: Ivan Gyurdiev <ivg2 at cornell.edu>
Date: Tue Jun 6 23:37:05 2006 -0400
wined3d: Fix missing light recording.
Write a light with the default parameters in disabled state if
capturing a missing light.
---
dlls/wined3d/device.c | 48 +++++++++++++++-------------------------
dlls/wined3d/stateblock.c | 31 +++++++++++++-------------
dlls/wined3d/wined3d_private.h | 3 +++
3 files changed, 36 insertions(+), 46 deletions(-)
diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c
index 27c9dc9..13d497c 100644
--- a/dlls/wined3d/device.c
+++ b/dlls/wined3d/device.c
@@ -32,6 +32,22 @@ #include "wined3d_private.h"
WINE_DEFAULT_DEBUG_CHANNEL(d3d);
#define GLINFO_LOCATION ((IWineD3DImpl *)(This->wineD3D))->gl_info
+/* Define the default light parameters as specified by MSDN */
+const WINED3DLIGHT WINED3D_default_light = {
+
+ D3DLIGHT_DIRECTIONAL, /* Type */
+ { 1.0, 1.0, 1.0, 0.0 }, /* Diffuse r,g,b,a */
+ { 0.0, 0.0, 0.0, 0.0 }, /* Specular r,g,b,a */
+ { 0.0, 0.0, 0.0, 0.0 }, /* Ambient r,g,b,a, */
+ { 0.0, 0.0, 0.0 }, /* Position x,y,z */
+ { 0.0, 0.0, 1.0 }, /* Direction x,y,z */
+ 0.0, /* Range */
+ 0.0, /* Falloff */
+ 0.0, 0.0, 0.0, /* Attenuation 0,1,2 */
+ 0.0, /* Theta */
+ 0.0 /* Phi */
+};
+
/* x11drv GDI escapes */
#define X11DRV_ESCAPE 6789
enum x11drv_escape_codes
@@ -2515,37 +2531,9 @@ HRESULT WINAPI IWineD3DDeviceImpl_SetLig
/* Special case - enabling an undefined light creates one with a strict set of parms! */
if (lightInfo == NULL) {
- D3DLIGHT9 lightParms;
- /* Warning - untested code :-) Prob safe to change fixme to a trace but
- wait until someone confirms it seems to work! */
+
TRACE("Light enabled requested but light not defined, so defining one!\n");
- lightParms.Type = D3DLIGHT_DIRECTIONAL;
- lightParms.Diffuse.r = 1.0;
- lightParms.Diffuse.g = 1.0;
- lightParms.Diffuse.b = 1.0;
- lightParms.Diffuse.a = 0.0;
- lightParms.Specular.r = 0.0;
- lightParms.Specular.g = 0.0;
- lightParms.Specular.b = 0.0;
- lightParms.Specular.a = 0.0;
- lightParms.Ambient.r = 0.0;
- lightParms.Ambient.g = 0.0;
- lightParms.Ambient.b = 0.0;
- lightParms.Ambient.a = 0.0;
- lightParms.Position.x = 0.0;
- lightParms.Position.y = 0.0;
- lightParms.Position.z = 0.0;
- lightParms.Direction.x = 0.0;
- lightParms.Direction.y = 0.0;
- lightParms.Direction.z = 1.0;
- lightParms.Range = 0.0;
- lightParms.Falloff = 0.0;
- lightParms.Attenuation0 = 0.0;
- lightParms.Attenuation1 = 0.0;
- lightParms.Attenuation2 = 0.0;
- lightParms.Theta = 0.0;
- lightParms.Phi = 0.0;
- IWineD3DDeviceImpl_SetLight(iface, Index, &lightParms);
+ IWineD3DDeviceImpl_SetLight(iface, Index, &WINED3D_default_light);
/* Search for it again! Should be fairly quick as near head of list */
lightInfo = This->stateBlock->lights;
diff --git a/dlls/wined3d/stateblock.c b/dlls/wined3d/stateblock.c
index c694f44..752773b 100644
--- a/dlls/wined3d/stateblock.c
+++ b/dlls/wined3d/stateblock.c
@@ -213,24 +213,23 @@ HRESULT WINAPI IWineD3DStateBlockImpl_Ca
realLight = targetStateBlock->lights;
while (realLight != NULL && realLight->OriginalIndex != src->OriginalIndex) realLight = realLight->next;
- if (realLight == NULL) {
- FIXME("A captured light no longer exists...?\n");
- } else {
-
- /* If 'changed' then its a SetLight command. Rather than comparing to see
- if the OriginalParms have changed and then copy them (twice through
- memory) just do the copy */
- if (src->changed) {
- TRACE("Updating lights for light %ld\n", src->OriginalIndex);
- memcpy(&src->OriginalParms, &realLight->OriginalParms, sizeof(src->OriginalParms));
- }
+ /* If 'changed' then its a SetLight command. Rather than comparing to see
+ if the OriginalParms have changed and then copy them (twice through
+ memory) just do the copy */
+ if (src->changed) {
- /* If 'enabledchanged' then its a LightEnable command */
- if (src->enabledChanged) {
- TRACE("Updating lightEnabled for light %ld\n", src->OriginalIndex);
- src->lightEnabled = realLight->lightEnabled;
- }
+ /* If the light exists, copy its parameters, otherwise copy the default parameters */
+ const WINED3DLIGHT* params = realLight? &realLight->OriginalParms: &WINED3D_default_light;
+ TRACE("Updating lights for light %ld\n", src->OriginalIndex);
+ memcpy(&src->OriginalParms, params, sizeof(*params));
+ }
+
+ /* If 'enabledchanged' then its a LightEnable command */
+ if (src->enabledChanged) {
+ /* If the light exists, check if it's enabled, otherwise default is disabled state */
+ TRACE("Updating lightEnabled for light %ld\n", src->OriginalIndex);
+ src->lightEnabled = realLight? realLight->lightEnabled: FALSE;
}
src = src->next;
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index d9c7406..3a42228 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -393,6 +393,9 @@ struct PLIGHTINFOEL {
PLIGHTINFOEL *prev;
};
+/* The default light parameters */
+extern const WINED3DLIGHT WINED3D_default_light;
+
/*****************************************************************************
* IWineD3D implementation structure
*/
More information about the wine-cvs
mailing list