[D3D 92] GetMatrix fixes + implement MultiplyTransform

Lionel Ulmer lionel.ulmer at free.fr
Wed Feb 5 16:30:30 CST 2003


Hi all,

This makes the screen corruption in Nascar2002 a bit less.. It's still ugly
(you will be able to see the screenshots soon on my update of the d3d_status
page), but a bit less than before :-)

                    Lionel

Changelog:
 - fix GetTransform
 - implement MultiplyTransform

-- 
		 Lionel Ulmer - http://www.bbrox.org/
-------------- next part --------------
--- ../wine_base/dlls/ddraw/d3ddevice/main.c	Sat Feb  1 10:12:20 2003
+++ dlls/ddraw/d3ddevice/main.c	Wed Feb  5 23:27:47 2003
@@ -424,7 +424,7 @@
 	        TRACE(" returning D3DTRANSFORMSTATE_VIEW :\n");
 		dump_D3DMATRIX(lpD3DMatrix);
 	    }
-	    memcpy(lpD3DMatrix, This->world_mat, 16 * sizeof(D3DVALUE));
+	    memcpy(lpD3DMatrix, This->view_mat, 16 * sizeof(D3DVALUE));
 	} break;
 
 	case D3DTRANSFORMSTATE_PROJECTION: {
@@ -432,7 +432,7 @@
 	        TRACE(" returning D3DTRANSFORMSTATE_PROJECTION :\n");
 		dump_D3DMATRIX(lpD3DMatrix);
 	    }
-	    memcpy(lpD3DMatrix, This->world_mat, 16 * sizeof(D3DVALUE));
+	    memcpy(lpD3DMatrix, This->proj_mat, 16 * sizeof(D3DVALUE));
 	} break;
 
 	default:
@@ -444,6 +444,86 @@
 }
 
 HRESULT WINAPI
+Main_IDirect3DDeviceImpl_7_3T_2T_MultiplyTransform(LPDIRECT3DDEVICE7 iface,
+                                                   D3DTRANSFORMSTATETYPE dtstTransformStateType,
+                                                   LPD3DMATRIX lpD3DMatrix)
+{
+    ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice7, iface);
+    LPD3DMATRIX mat;
+    D3DMATRIX temp;
+    DWORD matrix_changed = 0x00000000;
+
+    TRACE("(%p/%p)->(%08x,%p)\n", This, iface, dtstTransformStateType, lpD3DMatrix);
+    
+    if (TRACE_ON(ddraw)) {
+        TRACE(" Multiplying by :\n"); dump_D3DMATRIX(lpD3DMatrix);
+    }
+    
+    switch (dtstTransformStateType) {
+        case D3DTRANSFORMSTATE_WORLD: {
+	    if (TRACE_ON(ddraw)) {
+	        TRACE(" Resulting D3DTRANSFORMSTATE_WORLD matrix is :\n");
+	    }
+	    mat = This->world_mat;
+	    matrix_changed = WORLDMAT_CHANGED;
+	} break;
+
+        case D3DTRANSFORMSTATE_VIEW: {
+	    if (TRACE_ON(ddraw)) {
+	        TRACE(" Resulting D3DTRANSFORMSTATE_VIEW matrix is :\n");
+	    }
+	    mat = This->view_mat;
+	    matrix_changed = VIEWMAT_CHANGED;
+	} break;
+
+        case D3DTRANSFORMSTATE_PROJECTION: {
+	    if (TRACE_ON(ddraw)) {
+	        TRACE(" Resulting D3DTRANSFORMSTATE_PROJECTION matrix is :\n");
+	    }
+	    mat = This->proj_mat;
+	    matrix_changed = PROJMAT_CHANGED;
+	} break;
+
+	default:
+	    ERR("Unknown transform type %08x !!!\n", dtstTransformStateType);
+	    return DDERR_INVALIDPARAMS;
+    }
+
+    /* Now do the multiplication 'by hand'.
+       I know that all this could be optimised, but this will be done later :-) */
+    temp._11 = (mat->_11 * lpD3DMatrix->_11) + (mat->_21 * lpD3DMatrix->_12) + (mat->_31 * lpD3DMatrix->_13) + (mat->_41 * lpD3DMatrix->_14);
+    temp._21 = (mat->_11 * lpD3DMatrix->_21) + (mat->_21 * lpD3DMatrix->_22) + (mat->_31 * lpD3DMatrix->_23) + (mat->_41 * lpD3DMatrix->_24);
+    temp._31 = (mat->_11 * lpD3DMatrix->_31) + (mat->_21 * lpD3DMatrix->_32) + (mat->_31 * lpD3DMatrix->_33) + (mat->_41 * lpD3DMatrix->_34);
+    temp._41 = (mat->_11 * lpD3DMatrix->_41) + (mat->_21 * lpD3DMatrix->_42) + (mat->_31 * lpD3DMatrix->_43) + (mat->_41 * lpD3DMatrix->_44);
+
+    temp._12 = (mat->_12 * lpD3DMatrix->_11) + (mat->_22 * lpD3DMatrix->_12) + (mat->_32 * lpD3DMatrix->_13) + (mat->_42 * lpD3DMatrix->_14);
+    temp._22 = (mat->_12 * lpD3DMatrix->_21) + (mat->_22 * lpD3DMatrix->_22) + (mat->_32 * lpD3DMatrix->_23) + (mat->_42 * lpD3DMatrix->_24);
+    temp._32 = (mat->_12 * lpD3DMatrix->_31) + (mat->_22 * lpD3DMatrix->_32) + (mat->_32 * lpD3DMatrix->_33) + (mat->_42 * lpD3DMatrix->_34);
+    temp._42 = (mat->_12 * lpD3DMatrix->_41) + (mat->_22 * lpD3DMatrix->_42) + (mat->_32 * lpD3DMatrix->_43) + (mat->_42 * lpD3DMatrix->_44);
+
+    temp._13 = (mat->_13 * lpD3DMatrix->_11) + (mat->_23 * lpD3DMatrix->_12) + (mat->_33 * lpD3DMatrix->_13) + (mat->_43 * lpD3DMatrix->_14);
+    temp._23 = (mat->_13 * lpD3DMatrix->_21) + (mat->_23 * lpD3DMatrix->_22) + (mat->_33 * lpD3DMatrix->_23) + (mat->_43 * lpD3DMatrix->_24);
+    temp._33 = (mat->_13 * lpD3DMatrix->_31) + (mat->_23 * lpD3DMatrix->_32) + (mat->_33 * lpD3DMatrix->_33) + (mat->_43 * lpD3DMatrix->_34);
+    temp._43 = (mat->_13 * lpD3DMatrix->_41) + (mat->_23 * lpD3DMatrix->_42) + (mat->_33 * lpD3DMatrix->_43) + (mat->_43 * lpD3DMatrix->_44);
+
+    temp._14 = (mat->_14 * lpD3DMatrix->_11) + (mat->_24 * lpD3DMatrix->_12) + (mat->_34 * lpD3DMatrix->_13) + (mat->_44 * lpD3DMatrix->_14);
+    temp._24 = (mat->_14 * lpD3DMatrix->_21) + (mat->_24 * lpD3DMatrix->_22) + (mat->_34 * lpD3DMatrix->_23) + (mat->_44 * lpD3DMatrix->_24);
+    temp._34 = (mat->_14 * lpD3DMatrix->_31) + (mat->_24 * lpD3DMatrix->_32) + (mat->_34 * lpD3DMatrix->_33) + (mat->_44 * lpD3DMatrix->_34);
+    temp._44 = (mat->_14 * lpD3DMatrix->_41) + (mat->_24 * lpD3DMatrix->_42) + (mat->_34 * lpD3DMatrix->_43) + (mat->_44 * lpD3DMatrix->_44);
+
+    
+    /* And copy the new matrix in the good storage.. */
+    memcpy(mat, &temp, 16 * sizeof(D3DVALUE));
+    if (TRACE_ON(ddraw)) {
+        dump_D3DMATRIX(mat);
+    }
+    
+    if (matrix_changed != 0x00000000) This->matrices_updated(This, matrix_changed);
+    
+    return DD_OK;
+}
+
+HRESULT WINAPI
 Main_IDirect3DDeviceImpl_7_SetViewport(LPDIRECT3DDEVICE7 iface,
                                        LPD3DVIEWPORT7 lpData)
 {
@@ -461,16 +541,6 @@
     }
     This->active_viewport = *lpData;
 
-    return DD_OK;
-}
-
-HRESULT WINAPI
-Main_IDirect3DDeviceImpl_7_3T_2T_MultiplyTransform(LPDIRECT3DDEVICE7 iface,
-                                                   D3DTRANSFORMSTATETYPE dtstTransformStateType,
-                                                   LPD3DMATRIX lpD3DMatrix)
-{
-    ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice7, iface);
-    FIXME("(%p/%p)->(%08x,%p): stub!\n", This, iface, dtstTransformStateType, lpD3DMatrix);
     return DD_OK;
 }
 


More information about the wine-patches mailing list