[D3D 71] Various refactoring...
Lionel Ulmer
lionel.ulmer at free.fr
Wed Jan 1 10:24:01 CST 2003
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/
-------------- next part --------------
--- /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 {
More information about the wine-patches
mailing list