Changelog - create a function to set the various transformation matrices to factorize the code between the various code path - fixed some logging stuff -- Lionel Ulmer - http://www.bbrox.org/
--- /home/ulmer/Wine/wine_base//dlls/ddraw/d3ddevice/main.c 2002-12-31 18:56:34.000000000 +0100 +++ /home/ulmer/Wine/wine_work//dlls/ddraw/d3ddevice/main.c 2003-01-01 15:23:38.000000000 +0100 @@ -206,7 +206,42 @@ LPD3DMATRIX lpD3DMatrix) { ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice7, iface); - FIXME("(%p/%p)->(%08x,%p): stub!\n", This, iface, dtstTransformStateType, lpD3DMatrix); + DWORD matrix_changed = 0x00000000; + + TRACE("(%p/%p)->(%08x,%p)\n", This, iface, dtstTransformStateType, lpD3DMatrix); + + switch (dtstTransformStateType) { + case D3DTRANSFORMSTATE_WORLD: { + if (TRACE_ON(ddraw)) { + TRACE(" D3DTRANSFORMSTATE_WORLD :\n"); dump_D3DMATRIX(lpD3DMatrix); + } + memcpy(This->world_mat, lpD3DMatrix, 16 * sizeof(float)); + matrix_changed = WORLDMAT_CHANGED; + } break; + + case D3DTRANSFORMSTATE_VIEW: { + if (TRACE_ON(ddraw)) { + TRACE(" D3DTRANSFORMSTATE_VIEW :\n"); dump_D3DMATRIX(lpD3DMatrix); + } + memcpy(This->view_mat, lpD3DMatrix, 16 * sizeof(float)); + matrix_changed = VIEWMAT_CHANGED; + } break; + + case D3DTRANSFORMSTATE_PROJECTION: { + if (TRACE_ON(ddraw)) { + TRACE(" D3DTRANSFORMSTATE_PROJECTION :\n"); dump_D3DMATRIX(lpD3DMatrix); + } + memcpy(This->proj_mat, lpD3DMatrix, 16 * sizeof(float)); + matrix_changed = PROJMAT_CHANGED; + } break; + + default: + ERR("Unknown transform type %08x !!!\n", dtstTransformStateType); + break; + } + + if (matrix_changed != 0x00000000) This->matrices_updated(This, matrix_changed); + return DD_OK; } @@ -220,21 +255,27 @@ switch (dtstTransformStateType) { case D3DTRANSFORMSTATE_WORLD: { - TRACE(" returning D3DTRANSFORMSTATE_WORLD :\n"); + if (TRACE_ON(ddraw)) { + TRACE(" returning D3DTRANSFORMSTATE_WORLD :\n"); + dump_D3DMATRIX(lpD3DMatrix); + } memcpy(lpD3DMatrix, This->world_mat, 16 * sizeof(D3DVALUE)); - dump_mat(lpD3DMatrix); } break; case D3DTRANSFORMSTATE_VIEW: { - TRACE(" returning D3DTRANSFORMSTATE_VIEW :\n"); + if (TRACE_ON(ddraw)) { + TRACE(" returning D3DTRANSFORMSTATE_VIEW :\n"); + dump_D3DMATRIX(lpD3DMatrix); + } memcpy(lpD3DMatrix, This->world_mat, 16 * sizeof(D3DVALUE)); - dump_mat(lpD3DMatrix); } break; case D3DTRANSFORMSTATE_PROJECTION: { - TRACE(" returning D3DTRANSFORMSTATE_PROJECTION :\n"); + if (TRACE_ON(ddraw)) { + TRACE(" returning D3DTRANSFORMSTATE_PROJECTION :\n"); + dump_D3DMATRIX(lpD3DMatrix); + } memcpy(lpD3DMatrix, This->world_mat, 16 * sizeof(D3DVALUE)); - dump_mat(lpD3DMatrix); } break; default: @@ -1098,7 +1139,7 @@ ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice, iface); TRACE("(%p/%p)->(%08lx,%p)\n", This, iface, (DWORD) D3DMatHandle, lpD3DMatrix); - dump_mat(lpD3DMatrix); + dump_D3DMATRIX(lpD3DMatrix); *((D3DMATRIX *) D3DMatHandle) = *lpD3DMatrix; return DD_OK; --- /home/ulmer/Wine/wine_base//dlls/ddraw/d3ddevice/mesa.c 2002-12-30 20:35:05.000000000 +0100 +++ /home/ulmer/Wine/wine_work//dlls/ddraw/d3ddevice/mesa.c 2003-01-01 15:22:58.000000000 +0100 @@ -588,88 +588,6 @@ return DD_OK; } -HRESULT WINAPI -GL_IDirect3DDeviceImpl_7_3T_2T_SetTransform(LPDIRECT3DDEVICE7 iface, - D3DTRANSFORMSTATETYPE dtstTransformStateType, - LPD3DMATRIX lpD3DMatrix) -{ - ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice7, iface); - IDirect3DDeviceGLImpl *glThis = (IDirect3DDeviceGLImpl *) This; - - TRACE("(%p/%p)->(%08x,%p)\n", This, iface, dtstTransformStateType, lpD3DMatrix); - - ENTER_GL(); - - /* Using a trial and failure approach, I found that the order of - Direct3D transformations that works best is : - - ScreenCoord = ProjectionMat * ViewMat * WorldMat * ObjectCoord - - As OpenGL uses only two matrices, I combined PROJECTION and VIEW into - OpenGL's GL_PROJECTION matrix and the WORLD into GL_MODELVIEW. - - If anyone has a good explanation of the three different matrices in - the SDK online documentation, feel free to point it to me. For example, - which matrices transform lights ? In OpenGL only the PROJECTION matrix - transform the lights, not the MODELVIEW. Using the matrix names, I - supposed that PROJECTION and VIEW (all 'camera' related names) do - transform lights, but WORLD do not. It may be wrong though... */ - - /* After reading through both OpenGL and Direct3D documentations, I - thought that D3D matrices were written in 'line major mode' transposed - from OpenGL's 'column major mode'. But I found out that a simple memcpy - works fine to transfer one matrix format to the other (it did not work - when transposing).... - - So : - 1) are the documentations wrong - 2) does the matrix work even if they are not read correctly - 3) is Mesa's implementation of OpenGL not compliant regarding Matrix - loading using glLoadMatrix ? - - Anyway, I always use 'conv_mat' to transfer the matrices from one format - to the other so that if I ever find out that I need to transpose them, I - will able to do it quickly, only by changing the macro conv_mat. */ - - switch (dtstTransformStateType) { - case D3DTRANSFORMSTATE_WORLD: { - TRACE(" D3DTRANSFORMSTATE_WORLD :\n"); - conv_mat(lpD3DMatrix, This->world_mat); - if (glThis->last_vertices_transformed == FALSE) { - glMatrixMode(GL_MODELVIEW); - glLoadMatrixf((float *) This->view_mat); - glMultMatrixf((float *) This->world_mat); - } - } break; - - case D3DTRANSFORMSTATE_VIEW: { - TRACE(" D3DTRANSFORMSTATE_VIEW :\n"); - conv_mat(lpD3DMatrix, This->view_mat); - if (glThis->last_vertices_transformed == FALSE) { - glMatrixMode(GL_MODELVIEW); - glLoadMatrixf((float *) This->view_mat); - glMultMatrixf((float *) This->world_mat); - } - } break; - - case D3DTRANSFORMSTATE_PROJECTION: { - TRACE(" D3DTRANSFORMSTATE_PROJECTION :\n"); - conv_mat(lpD3DMatrix, This->proj_mat); - if (glThis->last_vertices_transformed == FALSE) { - glMatrixMode(GL_PROJECTION); - glLoadMatrixf((float *) This->proj_mat); - } - } break; - - default: - ERR("Unknown transform type %08x !!!\n", dtstTransformStateType); - break; - } - LEAVE_GL(); - - return DD_OK; -} - static void draw_primitive_start_GL(D3DPRIMITIVETYPE d3dpt) { switch (d3dpt) { @@ -716,22 +634,23 @@ /* Puts GL in the correct lighting / transformation mode */ if ((vertex_transformed == FALSE) && - (glThis->last_vertices_transformed == TRUE)) { + (glThis->transform_state != GL_TRANSFORM_NORMAL)) { /* Need to put the correct transformation again if we go from Transformed vertices to non-transformed ones. */ - glMatrixMode(GL_MODELVIEW); - glLoadMatrixf((float *) This->view_mat); - glMultMatrixf((float *) This->world_mat); - glMatrixMode(GL_PROJECTION); - glLoadMatrixf((float *) This->proj_mat); + This->set_matrices(This, VIEWMAT_CHANGED|WORLDMAT_CHANGED|PROJMAT_CHANGED, + This->world_mat, This->view_mat, This->proj_mat); + glThis->transform_state = GL_TRANSFORM_NORMAL; - if (glThis->render_state.fog_on == TRUE) glEnable(GL_FOG); + if (glThis->render_state.fog_on == TRUE) + glEnable(GL_FOG); } else if ((vertex_transformed == TRUE) && - (glThis->last_vertices_transformed == FALSE)) { + (glThis->transform_state != GL_TRANSFORM_ORTHO)) { GLfloat height, width; GLfloat trans_mat[16]; + glThis->transform_state = GL_TRANSFORM_ORTHO; + width = glThis->parent.surface->surface_desc.dwWidth; height = glThis->parent.surface->surface_desc.dwHeight; @@ -770,9 +689,6 @@ } } } - - /* And save the current state */ - glThis->last_vertices_transformed = vertex_transformed; } @@ -883,67 +799,6 @@ return ret_value; } -DWORD get_flexible_vertex_size(DWORD d3dvtVertexType, DWORD *elements) -{ - DWORD size = 0; - DWORD elts = 0; - - if (d3dvtVertexType & D3DFVF_NORMAL) { size += 3 * sizeof(D3DVALUE); elts += 1; } - if (d3dvtVertexType & D3DFVF_DIFFUSE) { size += sizeof(DWORD); elts += 1; } - if (d3dvtVertexType & D3DFVF_SPECULAR) { size += sizeof(DWORD); elts += 1; } - switch (d3dvtVertexType & D3DFVF_POSITION_MASK) { - case D3DFVF_XYZ: size += 3 * sizeof(D3DVALUE); elts += 1; break; - case D3DFVF_XYZRHW: size += 4 * sizeof(D3DVALUE); elts += 1; break; - default: TRACE(" matrix weighting not handled yet...\n"); - } - size += 2 * sizeof(D3DVALUE) * ((d3dvtVertexType & D3DFVF_TEXCOUNT_MASK) >> D3DFVF_TEXCOUNT_SHIFT); - elts += (d3dvtVertexType & D3DFVF_TEXCOUNT_MASK) >> D3DFVF_TEXCOUNT_SHIFT; - - if (elements) *elements = elts; - - return size; -} - -void dump_flexible_vertex(DWORD d3dvtVertexType) -{ - static const flag_info flags[] = { - FE(D3DFVF_NORMAL), - FE(D3DFVF_RESERVED1), - FE(D3DFVF_DIFFUSE), - FE(D3DFVF_SPECULAR) - }; - int i; - - if (d3dvtVertexType & D3DFVF_RESERVED0) DPRINTF("D3DFVF_RESERVED0 "); - switch (d3dvtVertexType & D3DFVF_POSITION_MASK) { -#define GEN_CASE(a) case a: DPRINTF(#a " "); break - GEN_CASE(D3DFVF_XYZ); - GEN_CASE(D3DFVF_XYZRHW); - GEN_CASE(D3DFVF_XYZB1); - GEN_CASE(D3DFVF_XYZB2); - GEN_CASE(D3DFVF_XYZB3); - GEN_CASE(D3DFVF_XYZB4); - GEN_CASE(D3DFVF_XYZB5); - } - DDRAW_dump_flags_(d3dvtVertexType, flags, sizeof(flags)/sizeof(flags[0]), FALSE); - switch (d3dvtVertexType & D3DFVF_TEXCOUNT_MASK) { - GEN_CASE(D3DFVF_TEX0); - GEN_CASE(D3DFVF_TEX1); - GEN_CASE(D3DFVF_TEX2); - GEN_CASE(D3DFVF_TEX3); - GEN_CASE(D3DFVF_TEX4); - GEN_CASE(D3DFVF_TEX5); - GEN_CASE(D3DFVF_TEX6); - GEN_CASE(D3DFVF_TEX7); - GEN_CASE(D3DFVF_TEX8); - } -#undef GEN_CASE - for (i = 0; i < ((d3dvtVertexType & D3DFVF_TEXCOUNT_MASK) >> D3DFVF_TEXCOUNT_SHIFT); i++) { - DPRINTF(" T%d-s%ld", i + 1, (((d3dvtVertexType >> (16 + (2 * i))) + 1) & 0x03) + 1); - } - DPRINTF("\n"); -} - /* These are the various handler used in the generic path */ inline static void handle_xyz(D3DVALUE *coords) { glVertex3fv(coords); @@ -1745,7 +1600,7 @@ XCAST(SetRenderTarget) Main_IDirect3DDeviceImpl_7_3T_2T_SetRenderTarget, XCAST(GetRenderTarget) Main_IDirect3DDeviceImpl_7_3T_2T_GetRenderTarget, XCAST(Clear) Main_IDirect3DDeviceImpl_7_Clear, - XCAST(SetTransform) GL_IDirect3DDeviceImpl_7_3T_2T_SetTransform, + XCAST(SetTransform) Main_IDirect3DDeviceImpl_7_3T_2T_SetTransform, XCAST(GetTransform) Main_IDirect3DDeviceImpl_7_3T_2T_GetTransform, XCAST(SetViewport) Main_IDirect3DDeviceImpl_7_SetViewport, XCAST(MultiplyTransform) Main_IDirect3DDeviceImpl_7_3T_2T_MultiplyTransform, @@ -2035,6 +1890,30 @@ return DDERR_INVALIDPARAMS; } +void +d3ddevice_set_matrices(IDirect3DDeviceImpl *This, DWORD matrices, + D3DMATRIX *world_mat, D3DMATRIX *view_mat, D3DMATRIX *proj_mat) +{ + if ((matrices & (VIEWMAT_CHANGED|WORLDMAT_CHANGED)) != 0) { + glMatrixMode(GL_MODELVIEW); + glLoadMatrixf((float *) view_mat); + glMultMatrixf((float *) world_mat); + } + if ((matrices & PROJMAT_CHANGED) != 0) { + glMatrixMode(GL_PROJECTION); + glLoadMatrixf((float *) proj_mat); + } +} + +void +d3ddevice_matrices_updated(IDirect3DDeviceImpl *This, DWORD matrices) +{ + IDirect3DDeviceGLImpl *glThis = (IDirect3DDeviceGLImpl *) This; + if (glThis->transform_state == GL_TRANSFORM_NORMAL) { + /* This will force an update of the transform state at the next drawing. */ + glThis->transform_state = GL_TRANSFORM_NONE; + } +} /* TODO for both these functions : - change / restore OpenGL parameters for pictures transfers in case they are ever modified @@ -2152,6 +2035,8 @@ object->surface = surface; object->set_context = set_context; object->clear = d3ddevice_clear; + object->set_matrices = d3ddevice_set_matrices; + object->matrices_updated = d3ddevice_matrices_updated; TRACE(" creating OpenGL device for surface = %p, d3d = %p\n", surface, d3d); --- /home/ulmer/Wine/wine_base//dlls/ddraw/d3d_private.h 2002-12-29 09:28:51.000000000 +0100 +++ /home/ulmer/Wine/wine_work//dlls/ddraw/d3d_private.h 2003-01-01 12:09:51.000000000 +0100 @@ -168,6 +168,10 @@ #define MAX_TEXTURES 8 #define MAX_LIGHTS 16 +#define WORLDMAT_CHANGED (0x00000001 << 0) +#define VIEWMAT_CHANGED (0x00000001 << 1) +#define PROJMAT_CHANGED (0x00000001 << 2) + struct IDirect3DDeviceImpl { ICOM_VFIELD_MULTI(IDirect3DDevice7); @@ -205,6 +209,9 @@ DWORD dwColor, D3DVALUE dvZ, DWORD dwStencil); + void (*matrices_updated)(IDirect3DDeviceImpl *This, DWORD matrices); + void (*set_matrices)(IDirect3DDeviceImpl *This, DWORD matrices, + D3DMATRIX *world_mat, D3DMATRIX *view_mat, D3DMATRIX *proj_mat); }; /***************************************************************************** @@ -221,17 +228,15 @@ DWORD vertex_buffer_size; }; -/* Various dump functions */ +/* Various dump and helper 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); extern void dump_DPFLAGS(DWORD dwFlags); - -#define dump_mat(mat) \ - TRACE("%f %f %f %f\n", (mat)->_11, (mat)->_12, (mat)->_13, (mat)->_14); \ - TRACE("%f %f %f %f\n", (mat)->_21, (mat)->_22, (mat)->_23, (mat)->_24); \ - TRACE("%f %f %f %f\n", (mat)->_31, (mat)->_32, (mat)->_33, (mat)->_34); \ - TRACE("%f %f %f %f\n", (mat)->_41, (mat)->_42, (mat)->_43, (mat)->_44); +extern void dump_D3DMATRIX(D3DMATRIX *mat); +extern void dump_D3DVECTOR(D3DVECTOR *lpVec); +extern void dump_flexible_vertex(DWORD d3dvtVertexType); +extern DWORD get_flexible_vertex_size(DWORD d3dvtVertexType, DWORD *elements); #endif /* __GRAPHICS_WINE_D3D_PRIVATE_H */ --- /home/ulmer/Wine/wine_base//dlls/ddraw/d3dcommon.c 2002-12-29 15:16:14.000000000 +0100 +++ /home/ulmer/Wine/wine_work//dlls/ddraw/d3dcommon.c 2003-01-01 12:02:07.000000000 +0100 @@ -219,3 +219,74 @@ DDRAW_dump_flags(dwFlags, flags, sizeof(flags)/sizeof(flags[0])); } + +void +dump_D3DMATRIX(D3DMATRIX *mat) +{ + DPRINTF(" %f %f %f %f\n", mat->_11, mat->_12, mat->_13, mat->_14); + DPRINTF(" %f %f %f %f\n", mat->_21, mat->_22, mat->_23, mat->_24); + DPRINTF(" %f %f %f %f\n", mat->_31, mat->_32, mat->_33, mat->_34); + DPRINTF(" %f %f %f %f\n", mat->_41, mat->_42, mat->_43, mat->_44); +} + + +DWORD get_flexible_vertex_size(DWORD d3dvtVertexType, DWORD *elements) +{ + DWORD size = 0; + DWORD elts = 0; + + if (d3dvtVertexType & D3DFVF_NORMAL) { size += 3 * sizeof(D3DVALUE); elts += 1; } + if (d3dvtVertexType & D3DFVF_DIFFUSE) { size += sizeof(DWORD); elts += 1; } + if (d3dvtVertexType & D3DFVF_SPECULAR) { size += sizeof(DWORD); elts += 1; } + switch (d3dvtVertexType & D3DFVF_POSITION_MASK) { + case D3DFVF_XYZ: size += 3 * sizeof(D3DVALUE); elts += 1; break; + case D3DFVF_XYZRHW: size += 4 * sizeof(D3DVALUE); elts += 1; break; + default: TRACE(" matrix weighting not handled yet...\n"); + } + size += 2 * sizeof(D3DVALUE) * ((d3dvtVertexType & D3DFVF_TEXCOUNT_MASK) >> D3DFVF_TEXCOUNT_SHIFT); + elts += (d3dvtVertexType & D3DFVF_TEXCOUNT_MASK) >> D3DFVF_TEXCOUNT_SHIFT; + + if (elements) *elements = elts; + + return size; +} + +void dump_flexible_vertex(DWORD d3dvtVertexType) +{ + static const flag_info flags[] = { + FE(D3DFVF_NORMAL), + FE(D3DFVF_RESERVED1), + FE(D3DFVF_DIFFUSE), + FE(D3DFVF_SPECULAR) + }; + int i; + + if (d3dvtVertexType & D3DFVF_RESERVED0) DPRINTF("D3DFVF_RESERVED0 "); + switch (d3dvtVertexType & D3DFVF_POSITION_MASK) { +#define GEN_CASE(a) case a: DPRINTF(#a " "); break + GEN_CASE(D3DFVF_XYZ); + GEN_CASE(D3DFVF_XYZRHW); + GEN_CASE(D3DFVF_XYZB1); + GEN_CASE(D3DFVF_XYZB2); + GEN_CASE(D3DFVF_XYZB3); + GEN_CASE(D3DFVF_XYZB4); + GEN_CASE(D3DFVF_XYZB5); + } + DDRAW_dump_flags_(d3dvtVertexType, flags, sizeof(flags)/sizeof(flags[0]), FALSE); + switch (d3dvtVertexType & D3DFVF_TEXCOUNT_MASK) { + GEN_CASE(D3DFVF_TEX0); + GEN_CASE(D3DFVF_TEX1); + GEN_CASE(D3DFVF_TEX2); + GEN_CASE(D3DFVF_TEX3); + GEN_CASE(D3DFVF_TEX4); + GEN_CASE(D3DFVF_TEX5); + GEN_CASE(D3DFVF_TEX6); + GEN_CASE(D3DFVF_TEX7); + GEN_CASE(D3DFVF_TEX8); + } +#undef GEN_CASE + for (i = 0; i < ((d3dvtVertexType & D3DFVF_TEXCOUNT_MASK) >> D3DFVF_TEXCOUNT_SHIFT); i++) { + DPRINTF(" T%d-s%ld", i + 1, (((d3dvtVertexType >> (16 + (2 * i))) + 1) & 0x03) + 1); + } + DPRINTF("\n"); +} --- /home/ulmer/Wine/wine_base//dlls/ddraw/d3dexecutebuffer.c 2002-12-27 17:40:23.000000000 +0100 +++ /home/ulmer/Wine/wine_work//dlls/ddraw/d3dexecutebuffer.c 2003-01-01 14:40:39.000000000 +0100 @@ -244,9 +244,9 @@ transformation phase */ glMatrixMode(GL_PROJECTION); TRACE(" Projection Matrix : (%p)\n", lpDevice->proj_mat); - dump_mat(lpDevice->proj_mat); + dump_D3DMATRIX(lpDevice->proj_mat); TRACE(" View Matrix : (%p)\n", lpDevice->view_mat); - dump_mat(lpDevice->view_mat); + dump_D3DMATRIX(lpDevice->view_mat); /* Although z axis is inverted between OpenGL and Direct3D, the z projected coordinates are always 0.0 at the front viewing volume and 1.0 at the back with Direct 3D and with @@ -266,9 +266,9 @@ glMatrixMode(GL_PROJECTION); TRACE(" Projection Matrix : (%p)\n", lpDevice->proj_mat); - dump_mat(lpDevice->proj_mat); + dump_D3DMATRIX(lpDevice->proj_mat); TRACE(" View Matrix : (%p)\n", lpDevice->view_mat); - dump_mat(lpDevice->view_mat); + dump_D3DMATRIX(lpDevice->view_mat); /* Although z axis is inverted between OpenGL and Direct3D, the z projected coordinates are always 0 at the front viewing volume and 1 at the back with Direct 3D and with @@ -535,7 +535,7 @@ D3DMATRIX *mat = lpDevice->world_mat; TRACE(" World Matrix : (%p)\n", mat); - dump_mat(mat); + dump_D3DMATRIX(mat); This->vertex_type = D3DVT_VERTEX; @@ -564,7 +564,7 @@ D3DMATRIX *mat = lpDevice->world_mat; TRACE(" World Matrix : (%p)\n", mat); - dump_mat(mat); + dump_D3DMATRIX(mat); This->vertex_type = D3DVT_LVERTEX; --- /home/ulmer/Wine/wine_base//dlls/ddraw/d3dlight.c 2002-12-22 12:06:18.000000000 +0100 +++ /home/ulmer/Wine/wine_work//dlls/ddraw/d3dlight.c 2003-01-01 11:59:56.000000000 +0100 @@ -120,23 +120,21 @@ ENTER_GL(); switch (glThis->parent.light.dltType) { case D3DLIGHT_POINT: /* 1 */ - TRACE("Activating POINT\n"); + FIXME("Activating POINT - not supported yet\n"); break; case D3DLIGHT_SPOT: /* 2 */ - TRACE("Activating SPOT\n"); + FIXME("Activating SPOT - not supported yet\n"); break; case D3DLIGHT_DIRECTIONAL: { /* 3 */ float direction[4]; - TRACE("Activating DIRECTIONAL\n"); - TRACE(" direction : %f %f %f\n", - glThis->parent.light.dvDirection.u1.x, - glThis->parent.light.dvDirection.u2.y, - glThis->parent.light.dvDirection.u3.z); - _dump_colorvalue(" color ", glThis->parent.light.dcvColor); - + if (TRACE_ON(ddraw)) { + TRACE("Activating DIRECTIONAL\n"); + DPRINTF(" - direction : "); dump_D3DVECTOR(&(glThis->parent.light.dvDirection)); DPRINTF("\n"); + DPRINTF(" - color : "); dump_D3DCOLORVALUE(&(glThis->parent.light.dcvColor)); DPRINTF("\n"); + } glLightfv(glThis->light_num, GL_AMBIENT, (float *) zero_value); glLightfv(glThis->light_num, GL_DIFFUSE, (float *) &(glThis->parent.light.dcvColor)); @@ -149,7 +147,7 @@ } break; case D3DLIGHT_PARALLELPOINT: /* 4 */ - TRACE("Activating PARRALLEL-POINT\n"); + FIXME("Activating PARRALLEL-POINT - not supported yet\n"); break; default: --- /home/ulmer/Wine/wine_base//dlls/ddraw/d3dmaterial.c 2002-12-28 23:11:40.000000000 +0100 +++ /home/ulmer/Wine/wine_work//dlls/ddraw/d3dmaterial.c 2003-01-01 11:56:28.000000000 +0100 @@ -284,33 +284,33 @@ * Matrial2 static functions */ static void activate(IDirect3DMaterialImpl* This) { - TRACE("Activating material %p\n", This); + TRACE("Activating material %p\n", This); - ENTER_GL(); - - /* Set the current Material */ - _dump_colorvalue("Diffuse", This->mat.u.diffuse); - glMaterialfv(GL_FRONT_AND_BACK, - GL_DIFFUSE, - (float *) &(This->mat.u.diffuse)); - _dump_colorvalue("Ambient", This->mat.u1.ambient); - glMaterialfv(GL_FRONT_AND_BACK, - GL_AMBIENT, - (float *) &(This->mat.u1.ambient)); - _dump_colorvalue("Specular", This->mat.u2.specular); - glMaterialfv(GL_FRONT_AND_BACK, - GL_SPECULAR, - (float *) &(This->mat.u2.specular)); - _dump_colorvalue("Emissive", This->mat.u3.emissive); - glMaterialfv(GL_FRONT_AND_BACK, - GL_EMISSION, - (float *) &(This->mat.u3.emissive)); - - TRACE("Size : %ld\n", This->mat.dwSize); - TRACE("Power : %f\n", This->mat.u4.power); - - TRACE("Texture handle : %08lx\n", (DWORD)This->mat.hTexture); - LEAVE_GL(); + /* Set the current Material */ + ENTER_GL(); + glMaterialfv(GL_FRONT_AND_BACK, + GL_DIFFUSE, + (float *) &(This->mat.u.diffuse)); + glMaterialfv(GL_FRONT_AND_BACK, + GL_AMBIENT, + (float *) &(This->mat.u1.ambient)); + glMaterialfv(GL_FRONT_AND_BACK, + GL_SPECULAR, + (float *) &(This->mat.u2.specular)); + glMaterialfv(GL_FRONT_AND_BACK, + GL_EMISSION, + (float *) &(This->mat.u3.emissive)); + LEAVE_GL(); + + if (TRACE_ON(ddraw)) { + DPRINTF(" - size : %ld\n", This->mat.dwSize); + DPRINTF(" - diffuse : "); dump_D3DCOLORVALUE(&(This->mat.u.diffuse)); DPRINTF("\n"); + DPRINTF(" - ambient : "); dump_D3DCOLORVALUE(&(This->mat.u1.ambient)); DPRINTF("\n"); + DPRINTF(" - specular: "); dump_D3DCOLORVALUE(&(This->mat.u2.specular)); DPRINTF("\n"); + DPRINTF(" - emissive: "); dump_D3DCOLORVALUE(&(This->mat.u3.emissive)); DPRINTF("\n"); + DPRINTF(" - power : %f\n", This->mat.u4.power); + DPRINTF(" - texture handle : %08lx\n", (DWORD)This->mat.hTexture); + } return ; } --- /home/ulmer/Wine/wine_base//dlls/ddraw/mesa_private.h 2002-12-29 20:55:40.000000000 +0100 +++ /home/ulmer/Wine/wine_work//dlls/ddraw/mesa_private.h 2003-01-01 14:45:23.000000000 +0100 @@ -114,6 +114,13 @@ void (*set_palette)(IDirectDrawSurfaceImpl* This, IDirectDrawPaletteImpl* pal); } IDirect3DTextureGLImpl; +typedef enum { + GL_TRANSFORM_NONE = 0, + GL_TRANSFORM_ORTHO, + GL_TRANSFORM_NORMAL, + GL_TRANSFORM_VERTEXBUFFER +} GL_TRANSFORM_STATE; + typedef struct IDirect3DDeviceGLImpl { struct IDirect3DDeviceImpl parent; @@ -124,7 +131,7 @@ RenderState render_state; /* The last type of vertex drawn */ - BOOLEAN last_vertices_transformed; + GL_TRANSFORM_STATE transform_state; Display *display; Drawable drawable; @@ -145,48 +152,6 @@ extern HRESULT d3ddevice_enumerate7(LPD3DENUMDEVICESCALLBACK7 cb, LPVOID context) ; extern HRESULT d3ddevice_find(IDirect3DImpl *d3d, LPD3DFINDDEVICESEARCH lpD3DDFS, LPD3DFINDDEVICERESULT lplpD3DDevice); -/* Some helper functions.. Would need to put them in a better place */ -extern void dump_flexible_vertex(DWORD d3dvtVertexType); -extern DWORD get_flexible_vertex_size(DWORD d3dvtVertexType, DWORD *elements); - -/* Matrix copy WITH transposition */ -#define conv_mat2(mat,gl_mat) \ -{ \ - TRACE("%f %f %f %f\n", (mat)->_11, (mat)->_12, (mat)->_13, (mat)->_14); \ - TRACE("%f %f %f %f\n", (mat)->_21, (mat)->_22, (mat)->_23, (mat)->_24); \ - TRACE("%f %f %f %f\n", (mat)->_31, (mat)->_32, (mat)->_33, (mat)->_34); \ - TRACE("%f %f %f %f\n", (mat)->_41, (mat)->_42, (mat)->_43, (mat)->_44); \ - (gl_mat)->_11 = (mat)->_11; \ - (gl_mat)->_12 = (mat)->_21; \ - (gl_mat)->_13 = (mat)->_31; \ - (gl_mat)->_14 = (mat)->_41; \ - (gl_mat)->_21 = (mat)->_12; \ - (gl_mat)->_22 = (mat)->_22; \ - (gl_mat)->_23 = (mat)->_32; \ - (gl_mat)->_24 = (mat)->_42; \ - (gl_mat)->_31 = (mat)->_13; \ - (gl_mat)->_32 = (mat)->_23; \ - (gl_mat)->_33 = (mat)->_33; \ - (gl_mat)->_34 = (mat)->_43; \ - (gl_mat)->_41 = (mat)->_14; \ - (gl_mat)->_42 = (mat)->_24; \ - (gl_mat)->_43 = (mat)->_34; \ - (gl_mat)->_44 = (mat)->_44; \ -}; - -/* Matrix copy WITHOUT transposition */ -#define conv_mat(mat,gl_mat) \ -{ \ - TRACE("%f %f %f %f\n", (mat)->_11, (mat)->_12, (mat)->_13, (mat)->_14); \ - TRACE("%f %f %f %f\n", (mat)->_21, (mat)->_22, (mat)->_23, (mat)->_24); \ - TRACE("%f %f %f %f\n", (mat)->_31, (mat)->_32, (mat)->_33, (mat)->_34); \ - TRACE("%f %f %f %f\n", (mat)->_41, (mat)->_42, (mat)->_43, (mat)->_44); \ - memcpy(gl_mat, (mat), 16 * sizeof(float)); \ -}; - -#define _dump_colorvalue(s,v) \ - DPRINTF(" - " s); dump_D3DCOLORVALUE(&v); DPRINTF("\n"); - /* This structure contains all the function pointers to OpenGL extensions that are used by Wine */ typedef struct {