[D3D 59] D3D7 material and lighting support

Lionel Ulmer lionel.ulmer at free.fr
Sat Dec 28 11:51:27 CST 2002


A lot of this code is duplicated. THis will be 'fixed' when we introduce a
HAL or when we re-re-re-organize this code :-)

           Lionel

Changelog:
 - beginning of Material and Light support for D3D7
 - new rendering states supported

-- 
		 Lionel Ulmer - http://www.bbrox.org/
-------------- next part --------------
--- /home/ulmer/Wine/wine_base//dlls/ddraw/d3ddevice/main.c	2002-12-26 12:42:50.000000000 +0100
+++ /home/ulmer/Wine/wine_work//dlls/ddraw/d3ddevice/main.c	2002-12-28 17:27:42.000000000 +0100
@@ -162,7 +162,12 @@
 						 DWORD dwFlags)
 {
     ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice7, iface);
-    FIXME("(%p/%p)->(%p,%08lx): stub!\n", This, iface, lpNewRenderTarget, dwFlags);
+    IDirectDrawSurfaceImpl *target_impl = ICOM_OBJECT(IDirectDrawSurfaceImpl, IDirectDrawSurface7, lpNewRenderTarget);
+
+    TRACE("(%p/%p)->(%p,%08lx)\n", This, iface, lpNewRenderTarget, dwFlags);
+    if (target_impl != This->surface) {
+        WARN(" Change of rendering target not handled yet !\n");
+    }
     return DD_OK;
 }
 
@@ -307,7 +312,15 @@
                                        LPD3DMATERIAL7 lpMat)
 {
     ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice7, iface);
-    FIXME("(%p/%p)->(%p): stub!\n", This, iface, lpMat);
+    TRACE("(%p/%p)->(%p)\n", This, iface, lpMat);
+    
+    *lpMat = This->current_material;
+
+    if (TRACE_ON(ddraw)) {
+        TRACE(" returning material : \n");
+	dump_D3DMATERIAL7(lpMat);
+    }
+
     return DD_OK;
 }
 
@@ -327,7 +340,16 @@
                                     LPD3DLIGHT7 lpLight)
 {
     ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice7, iface);
-    FIXME("(%p/%p)->(%08lx,%p): stub!\n", This, iface, dwLightIndex, lpLight);
+    TRACE("(%p/%p)->(%08lx,%p)\n", This, iface, dwLightIndex, lpLight);
+
+    if (dwLightIndex > MAX_LIGHTS) return DDERR_INVALIDPARAMS;
+    *lpLight = This->light_parameters[dwLightIndex];
+
+    if (TRACE_ON(ddraw)) {
+        TRACE(" returning light : \n");
+	dump_D3DLIGHT7(lpLight);
+    }
+
     return DD_OK;
 }
 
@@ -624,7 +646,13 @@
                                           BOOL* pbEnable)
 {
     ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice7, iface);
-    FIXME("(%p/%p)->(%08lx,%p): stub!\n", This, iface, dwLightIndex, pbEnable);
+    TRACE("(%p/%p)->(%08lx,%p)\n", This, iface, dwLightIndex, pbEnable);
+
+    if (dwLightIndex > MAX_LIGHTS) *pbEnable = 0;
+    else *pbEnable = ((0x00000001 << dwLightIndex) & This->active_lights) != 0;
+    
+    TRACE(" returning %d.\n", *pbEnable);
+
     return DD_OK;
 }
 
--- /home/ulmer/Wine/wine_base//dlls/ddraw/d3ddevice/mesa.c	2002-12-27 17:41:29.000000000 +0100
+++ /home/ulmer/Wine/wine_work//dlls/ddraw/d3ddevice/mesa.c	2002-12-28 17:48:03.000000000 +0100
@@ -538,6 +538,8 @@
 					  DWORD dwLightState)
 {
     ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice3, iface);
+    IDirect3DDeviceGLImpl *glThis = (IDirect3DDeviceGLImpl *) This;
+
     TRACE("(%p/%p)->(%08x,%08lx)\n", This, iface, dwLightStateType, dwLightState);
 
     switch (dwLightStateType) {
@@ -553,17 +555,10 @@
 	    }
 	} break;
 
-	case D3DLIGHTSTATE_AMBIENT: {   /* 2 */
-	    float light[4];
-
-	    light[0] = ((dwLightState >> 16) & 0xFF) / 255.0;
-	    light[1] = ((dwLightState >>  8) & 0xFF) / 255.0;
-	    light[2] = ((dwLightState >>  0) & 0xFF) / 255.0;
-	    light[3] = 1.0;
-	    ENTER_GL();
-	    glLightModelfv(GL_LIGHT_MODEL_AMBIENT, (float *) light);
-	    LEAVE_GL();
-	} break;
+	case D3DLIGHTSTATE_AMBIENT:     /* 2 */
+	    /* Call the render_state function... */
+	    set_render_state(D3DRENDERSTATE_AMBIENT, dwLightState, &(glThis->render_state));
+	    break;
 
 #define UNSUP(x) case D3DLIGHTSTATE_##x: FIXME("unsupported D3DLIGHTSTATE_" #x "!\n");break;
 	UNSUP(COLORMODEL);
@@ -1469,6 +1464,103 @@
     return DD_OK;
 }
 
+HRESULT WINAPI
+GL_IDirect3DDeviceImpl_7_SetMaterial(LPDIRECT3DDEVICE7 iface,
+				     LPD3DMATERIAL7 lpMat)
+{
+    ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice7, iface);
+    TRACE("(%p/%p)->(%p)\n", This, iface, lpMat);
+    
+    if (TRACE_ON(ddraw)) {
+        TRACE(" material is : \n");
+	dump_D3DMATERIAL7(lpMat);
+    }
+    
+    This->current_material = *lpMat;
+
+    glMaterialfv(GL_FRONT,
+		 GL_DIFFUSE,
+		 (float *) &(This->current_material.u.diffuse));
+    glMaterialfv(GL_FRONT,
+		 GL_AMBIENT,
+		 (float *) &(This->current_material.u1.ambient));
+    glMaterialfv(GL_FRONT,
+		 GL_SPECULAR,
+		 (float *) &(This->current_material.u2.specular));
+    glMaterialfv(GL_FRONT,
+		 GL_EMISSION,
+		 (float *) &(This->current_material.u3.emissive));
+    glMaterialf(GL_FRONT,
+		GL_SHININESS,
+		This->current_material.u4.power); /* Not sure about this... */
+
+    return DD_OK;
+}
+
+
+HRESULT WINAPI
+GL_IDirect3DDeviceImpl_7_SetLight(LPDIRECT3DDEVICE7 iface,
+				  DWORD dwLightIndex,
+				  LPD3DLIGHT7 lpLight)
+{
+    ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice7, iface);
+    TRACE("(%p/%p)->(%08lx,%p)\n", This, iface, dwLightIndex, lpLight);
+    
+    if (TRACE_ON(ddraw)) {
+        TRACE(" setting light : \n");
+	dump_D3DLIGHT7(lpLight);
+    }
+    
+    if (dwLightIndex > MAX_LIGHTS) return DDERR_INVALIDPARAMS;
+    This->set_lights |= 0x00000001 << dwLightIndex;
+    This->light_parameters[dwLightIndex] = *lpLight;
+
+    switch (lpLight->dltType) {
+	case D3DLIGHT_DIRECTIONAL: {  /* 3 */
+	    float direction[4];
+
+	    glLightfv(GL_LIGHT0 + dwLightIndex, GL_AMBIENT,  (float *) &(lpLight->dcvAmbient));
+	    glLightfv(GL_LIGHT0 + dwLightIndex, GL_DIFFUSE,  (float *) &(lpLight->dcvDiffuse));
+	    glLightfv(GL_LIGHT0 + dwLightIndex, GL_SPECULAR, (float *) &(lpLight->dcvSpecular));
+
+	    direction[0] = lpLight->dvDirection.u1.x;
+	    direction[1] = lpLight->dvDirection.u2.y;
+	    direction[2] = lpLight->dvDirection.u3.z;
+	    direction[3] = 0.0; /* This is a directional light */
+
+	    glLightfv(GL_LIGHT0 + dwLightIndex, GL_POSITION, (float *) direction);
+	} break;
+
+        default: WARN(" light type not handled yet...\n");
+    }
+
+    return DD_OK;
+}
+
+HRESULT WINAPI
+GL_IDirect3DDeviceImpl_7_LightEnable(LPDIRECT3DDEVICE7 iface,
+				     DWORD dwLightIndex,
+				     BOOL bEnable)
+{
+    ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice7, iface);
+    TRACE("(%p/%p)->(%08lx,%d)\n", This, iface, dwLightIndex, bEnable);
+    
+    if (dwLightIndex > MAX_LIGHTS) return DDERR_INVALIDPARAMS;
+
+    if (bEnable) {
+        if (((0x00000001 << dwLightIndex) & This->set_lights) == 0) {
+	    /* Set the default parameters.. */
+	    TRACE(" setting default light parameters...\n");
+	    GL_IDirect3DDeviceImpl_7_SetLight(iface, dwLightIndex, &(This->light_parameters[dwLightIndex]));
+	}
+	glEnable(GL_LIGHT0 + dwLightIndex);
+    } else {
+        glDisable(GL_LIGHT0 + dwLightIndex);
+    }
+
+    return DD_OK;
+}
+
 #if !defined(__STRICT_ANSI__) && defined(__GNUC__)
 # define XCAST(fun)     (typeof(VTABLE_IDirect3DDevice7.fun))
 #else
@@ -1494,9 +1586,9 @@
     XCAST(SetViewport) Main_IDirect3DDeviceImpl_7_SetViewport,
     XCAST(MultiplyTransform) Main_IDirect3DDeviceImpl_7_3T_2T_MultiplyTransform,
     XCAST(GetViewport) Main_IDirect3DDeviceImpl_7_GetViewport,
-    XCAST(SetMaterial) Main_IDirect3DDeviceImpl_7_SetMaterial,
+    XCAST(SetMaterial) GL_IDirect3DDeviceImpl_7_SetMaterial,
     XCAST(GetMaterial) Main_IDirect3DDeviceImpl_7_GetMaterial,
-    XCAST(SetLight) Main_IDirect3DDeviceImpl_7_SetLight,
+    XCAST(SetLight) GL_IDirect3DDeviceImpl_7_SetLight,
     XCAST(GetLight) Main_IDirect3DDeviceImpl_7_GetLight,
     XCAST(SetRenderState) GL_IDirect3DDeviceImpl_7_3T_2T_SetRenderState,
     XCAST(GetRenderState) Main_IDirect3DDeviceImpl_7_3T_2T_GetRenderState,
@@ -1522,7 +1614,7 @@
     XCAST(DeleteStateBlock) Main_IDirect3DDeviceImpl_7_DeleteStateBlock,
     XCAST(CreateStateBlock) Main_IDirect3DDeviceImpl_7_CreateStateBlock,
     XCAST(Load) Main_IDirect3DDeviceImpl_7_Load,
-    XCAST(LightEnable) Main_IDirect3DDeviceImpl_7_LightEnable,
+    XCAST(LightEnable) GL_IDirect3DDeviceImpl_7_LightEnable,
     XCAST(GetLightEnable) Main_IDirect3DDeviceImpl_7_GetLightEnable,
     XCAST(SetClipPlane) Main_IDirect3DDeviceImpl_7_SetClipPlane,
     XCAST(GetClipPlane) Main_IDirect3DDeviceImpl_7_GetClipPlane,
@@ -1884,6 +1980,7 @@
     int num;
     XVisualInfo template;
     GLenum buffer;
+    int light;
     
     object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirect3DDeviceGLImpl));
     if (object == NULL) return DDERR_OUTOFMEMORY;
@@ -1965,6 +2062,29 @@
     gl_object->render_state.alpha_func = GL_ALWAYS; /* Here either but it seems logical */
     gl_object->render_state.alpha_blend_enable = FALSE;
     gl_object->render_state.fog_on = FALSE;
+    gl_object->render_state.stencil_func = GL_ALWAYS;
+    gl_object->render_state.stencil_mask = 0xFFFFFFFF;
+    gl_object->render_state.stencil_ref = 0;
+    gl_object->render_state.stencil_enable = FALSE;
+    gl_object->render_state.stencil_fail = GL_KEEP;
+    gl_object->render_state.stencil_zfail = GL_KEEP;
+    gl_object->render_state.stencil_pass = GL_KEEP;
+    gl_object->render_state.lighting_enable = FALSE;
+    gl_object->render_state.specular_enable = FALSE;
+    gl_object->render_state.color_diffuse = D3DMCS_COLOR1;
+    gl_object->render_state.color_specular = D3DMCS_COLOR2;
+    gl_object->render_state.color_ambient = D3DMCS_COLOR2;
+    gl_object->render_state.color_emissive = D3DMCS_MATERIAL;
+
+    /* Set the various light parameters */
+    for (light = 0; light < MAX_LIGHTS; light++) {
+        /* Only set the fields that are not zero-created */
+        object->light_parameters[light].dltType = D3DLIGHT_DIRECTIONAL;
+	object->light_parameters[light].dcvDiffuse.u1.r = 1.0;
+	object->light_parameters[light].dcvDiffuse.u2.g = 1.0;
+	object->light_parameters[light].dcvDiffuse.u3.b = 1.0;
+	object->light_parameters[light].dvDirection.u3.z = 1.0;
+    }
     
     /* Allocate memory for the matrices */
     object->world_mat = (D3DMATRIX *) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, 16 * sizeof(float));
--- /home/ulmer/Wine/wine_base//dlls/ddraw/d3d_private.h	2002-12-27 11:07:26.000000000 +0100
+++ /home/ulmer/Wine/wine_work//dlls/ddraw/d3d_private.h	2002-12-28 17:25:52.000000000 +0100
@@ -166,6 +166,7 @@
  */
 
 #define MAX_TEXTURES 8
+#define MAX_LIGHTS  16
 
 struct IDirect3DDeviceImpl
 {
@@ -189,6 +190,13 @@
     D3DMATRIX *view_mat;
     D3DMATRIX *proj_mat;
 
+    /* Current material used in D3D7 mode */
+    D3DMATERIAL7 current_material;
+
+    /* Light parameters */
+    DWORD active_lights, set_lights;
+    D3DLIGHT7 light_parameters[MAX_LIGHTS];
+
     void (*set_context)(IDirect3DDeviceImpl*);
     HRESULT (*clear)(IDirect3DDeviceImpl *This,
 		     DWORD dwCount,
@@ -215,6 +223,9 @@
 
 /* Various dump functions */
 extern const char *_get_renderstate(D3DRENDERSTATETYPE type);
+extern void dump_D3DMATERIAL7(LPD3DMATERIAL7 lpMat);
+extern void dump_D3DCOLORVALUE(D3DCOLORVALUE *lpCol);
+extern void dump_D3DLIGHT7(LPD3DLIGHT7 lpLight);
 
 #define dump_mat(mat) \
     TRACE("%f %f %f %f\n", (mat)->_11, (mat)->_12, (mat)->_13, (mat)->_14); \
--- /home/ulmer/Wine/wine_base//dlls/ddraw/d3dcommon.c	2002-12-23 17:35:44.000000000 +0100
+++ /home/ulmer/Wine/wine_work//dlls/ddraw/d3dcommon.c	2002-12-28 17:35:49.000000000 +0100
@@ -163,3 +163,44 @@
     if (type >= (sizeof(states) / sizeof(states[0]))) return "ERR";
     return states[type];
 }
+
+void
+dump_D3DCOLORVALUE(D3DCOLORVALUE *lpCol)
+{
+    DPRINTF("%f %f %f %f", lpCol->u1.r, lpCol->u2.g, lpCol->u3.b, lpCol->u4.a);
+}
+
+void
+dump_D3DVECTOR(D3DVECTOR *lpVec)
+{
+    DPRINTF("%f %f %f", lpVec->u1.x, lpVec->u2.y, lpVec->u3.z);
+}
+
+void
+dump_D3DMATERIAL7(LPD3DMATERIAL7 lpMat)
+{
+    DPRINTF(" - diffuse  : "); dump_D3DCOLORVALUE(&(lpMat->u.diffuse)); DPRINTF("\n");
+    DPRINTF(" - ambient  : "); dump_D3DCOLORVALUE(&(lpMat->u1.ambient)); DPRINTF("\n");
+    DPRINTF(" - specular : "); dump_D3DCOLORVALUE(&(lpMat->u2.specular)); DPRINTF("\n");
+    DPRINTF(" - emissive : "); dump_D3DCOLORVALUE(&(lpMat->u3.emissive)); DPRINTF("\n");
+    DPRINTF(" - power    : %f\n", lpMat->u4.power);
+}
+
+void
+dump_D3DLIGHT7(LPD3DLIGHT7 lpLight)
+{
+    DPRINTF(" - light type : %s\n", (lpLight->dltType == D3DLIGHT_POINT ? "D3DLIGHT_POINT" : 
+				     (lpLight->dltType == D3DLIGHT_SPOT ? "D3DLIGHT_SPOT" : 
+				      (lpLight->dltType == D3DLIGHT_DIRECTIONAL ? "D3DLIGHT_DIRECTIONAL" : 
+				       "UNSUPPORTED"))));
+    DPRINTF(" - diffuse       : "); dump_D3DCOLORVALUE(&(lpLight->dcvDiffuse)); DPRINTF("\n");
+    DPRINTF(" - specular      : "); dump_D3DCOLORVALUE(&(lpLight->dcvSpecular)); DPRINTF("\n");
+    DPRINTF(" - ambient       : "); dump_D3DCOLORVALUE(&(lpLight->dcvAmbient)); DPRINTF("\n");
+    DPRINTF(" - position      : "); dump_D3DVECTOR(&(lpLight->dvPosition)); DPRINTF("\n");
+    DPRINTF(" - direction     : "); dump_D3DVECTOR(&(lpLight->dvDirection)); DPRINTF("\n");
+    DPRINTF(" - dvRange       : %f\n", lpLight->dvRange);
+    DPRINTF(" - dvFalloff     : %f\n", lpLight->dvFalloff);
+    DPRINTF(" - dvAttenuation : %f %f %f\n", lpLight->dvAttenuation0, lpLight->dvAttenuation1, lpLight->dvAttenuation2);
+    DPRINTF(" - dvTheta       : %f\n", lpLight->dvTheta);
+    DPRINTF(" - dvPhi         : %f\n", lpLight->dvPhi);
+}
--- /home/ulmer/Wine/wine_base//dlls/ddraw/mesa.c	2002-12-27 10:30:26.000000000 +0100
+++ /home/ulmer/Wine/wine_work//dlls/ddraw/mesa.c	2002-12-28 17:30:04.000000000 +0100
@@ -46,6 +46,21 @@
     return GL_ALWAYS;
 }
 
+GLenum convert_D3D_stencilop_to_GL(D3DSTENCILOP dwRenderState)
+{
+    switch (dwRenderState) {
+        case D3DSTENCILOP_KEEP: return GL_KEEP;
+        case D3DSTENCILOP_ZERO: return GL_ZERO;
+        case D3DSTENCILOP_REPLACE: return GL_REPLACE;
+        case D3DSTENCILOP_INCRSAT: return GL_INCR;
+        case D3DSTENCILOP_DECRSAT: return GL_DECR;
+        case D3DSTENCILOP_INVERT: return GL_INVERT;
+        case D3DSTENCILOP_INCR: WARN("D3DSTENCILOP_INCR not properly handled !\n"); return GL_INCR;
+        case D3DSTENCILOP_DECR: WARN("D3DSTENCILOP_DECR not properly handled !\n"); return GL_DECR;
+        default: ERR("Unexpected compare type %d !\n", dwRenderState);      
+    }
+    return GL_KEEP;
+}
 
 void set_render_state(D3DRENDERSTATETYPE dwRenderStateType,
 		      DWORD dwRenderState, RenderState *rs)
@@ -400,6 +415,47 @@
 	    case D3DRENDERSTATE_FLUSHBATCH:         /* 50 */
 	        break;
 
+	    case D3DRENDERSTATE_STENCILENABLE:    /* 52 */
+	        if (dwRenderState)
+		    glDisable(GL_STENCIL_TEST);
+		else
+		    glDisable(GL_STENCIL_TEST);
+		break;
+	    
+	    case D3DRENDERSTATE_STENCILFAIL:      /* 53 */
+	        rs->stencil_fail = convert_D3D_stencilop_to_GL(dwRenderState);
+		glStencilOp(rs->stencil_fail, rs->stencil_zfail, rs->stencil_pass);
+		break;
+
+	    case D3DRENDERSTATE_STENCILZFAIL:     /* 54 */
+	        rs->stencil_zfail = convert_D3D_stencilop_to_GL(dwRenderState);
+		glStencilOp(rs->stencil_fail, rs->stencil_zfail, rs->stencil_pass);
+		break;
+
+	    case D3DRENDERSTATE_STENCILPASS:      /* 55 */
+	        rs->stencil_pass = convert_D3D_stencilop_to_GL(dwRenderState);
+		glStencilOp(rs->stencil_fail, rs->stencil_zfail, rs->stencil_pass);
+		break;
+
+	    case D3DRENDERSTATE_STENCILFUNC:      /* 56 */
+	        rs->stencil_func = convert_D3D_compare_to_GL(dwRenderState);
+		glStencilFunc(rs->stencil_func, rs->stencil_ref, rs->stencil_mask);
+		break;
+
+	    case D3DRENDERSTATE_STENCILREF:       /* 57 */
+	        rs->stencil_ref = dwRenderState;
+		glStencilFunc(rs->stencil_func, rs->stencil_ref, rs->stencil_mask);
+		break;
+
+	    case D3DRENDERSTATE_STENCILMASK:      /* 58 */
+	        rs->stencil_mask = dwRenderState;
+		glStencilFunc(rs->stencil_func, rs->stencil_ref, rs->stencil_mask);
+		break;
+	  
+	    case D3DRENDERSTATE_STENCILWRITEMASK: /* 59 */
+	        glStencilMask(dwRenderState);
+	        break;
+
 	    case D3DRENDERSTATE_LIGHTING:    /* 137 */
 	        /* There will be more to do here once we really support D3D7 Lighting.
 		   Should be enough for now to prevent warnings :-) */
@@ -408,6 +464,33 @@
 		else
 		    glDisable(GL_LIGHTING);
 	        break;
+		
+	    case D3DRENDERSTATE_AMBIENT: {            /* 139 */
+	        float light[4];
+
+		light[0] = ((dwRenderState >> 16) & 0xFF) / 255.0;
+		light[1] = ((dwRenderState >>  8) & 0xFF) / 255.0;
+		light[2] = ((dwRenderState >>  0) & 0xFF) / 255.0;
+		light[3] = ((dwRenderState >> 24) & 0xFF) / 255.0;
+		glLightModelfv(GL_LIGHT_MODEL_AMBIENT, (float *) light);
+	    } break;
+
+	    case D3DRENDERSTATE_LOCALVIEWER:          /* 142 */
+	        if (dwRenderState)
+		    glLightModeli(GL_LIGHT_MODEL_LOCAL_VIEWER, GL_TRUE);
+		else
+		    glLightModeli(GL_LIGHT_MODEL_LOCAL_VIEWER, GL_FALSE);
+		break;
+
+	    case D3DRENDERSTATE_NORMALIZENORMALS:     /* 143 */
+	        if (dwRenderState) {
+		    glEnable(GL_NORMALIZE);
+		    glEnable(GL_RESCALE_NORMAL);
+		} else {
+		    glDisable(GL_NORMALIZE);
+		    glDisable(GL_RESCALE_NORMAL);
+		}
+		break;
 
 	    default:
 	        ERR("Unhandled dwRenderStateType %s (%08x) !\n", _get_renderstate(dwRenderStateType), dwRenderStateType);
--- /home/ulmer/Wine/wine_base//dlls/ddraw/mesa_private.h	2002-12-27 17:40:23.000000000 +0100
+++ /home/ulmer/Wine/wine_work//dlls/ddraw/mesa_private.h	2002-12-28 17:04:48.000000000 +0100
@@ -69,6 +69,17 @@
     GLclampf alpha_ref;
     BOOLEAN alpha_blend_enable;
 
+    /* This is needed for the stencil stuff */
+    GLint stencil_ref;
+    GLuint stencil_mask;
+    GLenum stencil_func;
+    BOOLEAN stencil_enable;
+    GLenum stencil_fail, stencil_zfail, stencil_pass;
+  
+    /* This is needed for proper lighting */
+    BOOLEAN lighting_enable, specular_enable;
+    D3DMATERIALCOLORSOURCE color_diffuse, color_specular, color_ambient, color_emissive;
+
     /* This is needed to re-enable fogging when XYZRHW and XYZ primitives are mixed */
     BOOLEAN fog_on;
 } RenderState;
@@ -175,8 +186,7 @@
 };
 
 #define _dump_colorvalue(s,v)                \
-    TRACE(" " s " : %f %f %f %f\n",          \
-    (v).u1.r, (v).u2.g, (v).u3.b, (v).u4.a);
+    DPRINTF(" - " s); dump_D3DCOLORVALUE(&v); DPRINTF("\n");
 
 /* This structure contains all the function pointers to OpenGL extensions
    that are used by Wine */
--- /home/ulmer/Wine/wine_base//dlls/ddraw/ddraw/main.c	2002-12-24 15:48:08.000000000 +0100
+++ /home/ulmer/Wine/wine_work//dlls/ddraw/ddraw/main.c	2002-12-28 16:07:44.000000000 +0100
@@ -840,7 +840,7 @@
 			LPDDCAPS pHELCaps)
 {
     ICOM_THIS(IDirectDrawImpl,iface);
-    TRACE("(%p,%p,%p), stub\n",This,pDriverCaps,pHELCaps);
+    TRACE("(%p,%p,%p)\n",This,pDriverCaps,pHELCaps);
     if (pDriverCaps != NULL) {
 	DD_STRUCT_COPY_BYSIZE(pDriverCaps,&This->caps);
 	if (TRACE_ON(ddraw)) {


More information about the wine-patches mailing list