[D3D8 - 5] split of patch1:

Raphaël Junqueira fenix at club-internet.fr
Sat Jan 11 12:18:49 CST 2003


-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Hi again,

This path need the [D3D8 - 3] patch (who contains some basic defs for extension use)

The vertex matrix blending patch isn't complete in this patch as it partially conflicts with the [D3D8 - 2] and [D3D8 - 3] patches
I'll send it later after [D3D8 - 5] commit.

Changelog:
  - beginning of vertex matrix blending using extensions (currently alpha alpha stage as i haven't understand needed extension behavior)
  - modify SetRenderState for matrix blending specific params
  - by default diffuse color is white ;)
  - comments most of the traces (else flood ...)
  - add more urls in comments
  - indent, cleanups

Raphael
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.2.1 (GNU/Linux)

iD8DBQE+IGAJp7NA3AmQTU4RAgefAJ9GVD+Lz5XcJsrTXHN+uNFlHQTbzwCfQ09I
qTZcJvJ+GuHRBf/dD7+wfFQ=
=pFAk
-----END PGP SIGNATURE-----
-------------- next part --------------
Index: device.c
===================================================================
RCS file: /home/wine/wine/dlls/d3d8/device.c,v
retrieving revision 1.23
diff -u -r1.23 device.c
--- device.c	9 Jan 2003 06:02:39 -0000	1.23
+++ device.c	11 Jan 2003 17:41:09 -0000
@@ -36,9 +36,9 @@
 
 /* Per-vertex trace: */
 #if 0
-   #define VTRACE(A) TRACE A
+# define VTRACE(A) TRACE A
 #else 
-   #define VTRACE(A) 
+# define VTRACE(A) 
 #endif
 
 
@@ -150,12 +150,16 @@
         BOOL                        enableTexture = FALSE;
         int                         vx_index;
 
-        float x=0.0, y=0.0, z=0.0;             /* x,y,z coordinates          */
-        float nx=0.0, ny=0.0, nz=0.0;          /* normal x,y,z coordinates   */
-        float rhw=0.0;                         /* rhw                        */
-        float ptSize=0.0;                      /* Point size                 */
-        DWORD diffuseColor=0;                  /* Diffusre Color             */
-        DWORD specularColor=0;                 /* Specular Color             */
+        float x = 0.0f, 
+              y = 0.0f, 
+              z = 0.0f;                     /* x,y,z coordinates          */
+        float nx = 0.0f, 
+              ny =0.0, 
+              nz = 0.0f;                    /* normal x,y,z coordinates   */
+        float rhw = 0.0f;                   /* rhw                        */
+        float ptSize = 0.0f;                /* Point size                 */
+        DWORD diffuseColor = 0xFFFFFFFF;    /* Diffuse Color              */
+        DWORD specularColor = 0;            /* Specular Color             */
 
         ENTER_GL();
 
@@ -165,11 +169,15 @@
         }
 
         /* Check vertex formats expected ? */
+	/** 
+	 * FVF parser as seen it
+	 * http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dx8_c/directx_cpp/Graphics/Reference/CPP/D3D/FlexibleVertexFormatFlags.asp 
+	 */
         normal        = fvf & D3DFVF_NORMAL;
         isRHW         = fvf & D3DFVF_XYZRHW;
-        numBlends     = ((fvf & D3DFVF_POSITION_MASK) >> 1) - 2; /* WARNING can be < 0 because -2 */
         isLastUByte4  = fvf & D3DFVF_LASTBETA_UBYTE4;
+        numBlends     = ((fvf & D3DFVF_POSITION_MASK) >> 1) - 2 + ((FALSE == isLastUByte4) ? 0 : -1); /* WARNING can be < 0 because -2 */    
         isPtSize      = fvf & D3DFVF_PSIZE;
         isDiffuse     = fvf & D3DFVF_DIFFUSE;
         isSpecular    = fvf & D3DFVF_SPECULAR;
@@ -622,20 +665,44 @@
             if (isRHW) {
                glVertexPointer(4, GL_FLOAT, skip, curPos);
                checkGLcall("glVertexPointer(4, ...)");
-               curPos += 4*sizeof(float);
+               curPos += 4 * sizeof(float);
             } else {
                glVertexPointer(3, GL_FLOAT, skip, curPos);
                checkGLcall("glVertexPointer(3, ...)");
-               curPos += 3*sizeof(float);
+               curPos += 3 * sizeof(float);
             }
             glEnableClientState(GL_VERTEX_ARRAY);
             checkGLcall("glEnableClientState(GL_VERTEX_ARRAY)");
  
-            if (numBlends>0) {
-                /* no such functionality in the fixed function GL pipeline */
-                /* FIXME: Wont get here as will drop to slow method        */
-                FIXME("Cannot handle blending data here in openGl\n");
-            }
+            if (numBlends > 0) {
+               /* no such functionality in the fixed function GL pipeline */
+               /* FIXME: Wont get here as will drop to slow method        */
+   	       /* FIXME("Cannot handle blending data here in openGl\n");*/
+	       if (checkGLSupport(ARB_VERTEX_BLEND)) {
+		  FIXME("TODO\n");
+	       } else if (checkGLSupport(EXT_VERTEX_WEIGHTING)) {
+		  FIXME("TODO\n");
+		  /*
+		  GLExtCall(glVertexWeightPointerEXT)(numBlends, GL_FLOAT, skip, curPos); 
+		  checkGLcall("glVertexWeightPointerEXT(numBlends, ...)");
+		  glEnableClientState(GL_VERTEX_WEIGHT_ARRAY_EXT);
+		  checkGLcall("glEnableClientState(GL_VERTEX_WEIGHT_ARRAY_EXT)");
+		  */
+		  curPos += numBlends * sizeof(float);
+	       } else {
+		  FIXME("unsupported blending in openGl\n");
+	       }
+            } else {
+	       if (checkGLSupport(ARB_VERTEX_BLEND)) {
+		  FIXME("TODO\n");
+	       } else if (checkGLSupport(EXT_VERTEX_WEIGHTING)) {
+		  FIXME("TODO\n");
+		  /*
+		  glDisableClientState(GL_VERTEX_WEIGHT_ARRAY_EXT);
+		  checkGLcall("glDisableClientState(GL_VERTEX_WEIGHT_ARRAY_EXT)");
+		  */
+	       }
+	    }
 
  
             if (normal) {
@@ -643,7 +710,7 @@
                 checkGLcall("glNormalPointer");
                 glEnableClientState(GL_NORMAL_ARRAY);
                 checkGLcall("glEnableClientState(GL_NORMAL_ARRAY)");
-                curPos += 3*sizeof(float);
+                curPos += 3 * sizeof(float);
             } else {
                 glDisableClientState(GL_NORMAL_ARRAY);
                 checkGLcall("glDisableClientState(GL_NORMAL_ARRAY)");
@@ -1599,7 +1666,9 @@
 }
 HRESULT  WINAPI  IDirect3DDevice8Impl_SetTransform(LPDIRECT3DDEVICE8 iface, D3DTRANSFORMSTATETYPE d3dts,CONST D3DMATRIX* lpmatrix) {
     ICOM_THIS(IDirect3DDevice8Impl,iface);
+    D3DMATRIX m;
     int k;
+    float f;
 
     /* Most of this routine, comments included copied from ddraw tree initially: */
     TRACE("(%p) : State=%d\n", This, d3dts);
@@ -1638,22 +1707,48 @@
        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 (d3dts) {
-    case D3DTS_WORLDMATRIX(0):
+    if (d3dts < 256) {
+      switch (d3dts) {
+      case D3DTS_WORLDMATRIX(0):
         conv_mat(lpmatrix, &This->StateBlock.transforms[D3DTS_WORLDMATRIX(0)]);
         break;
 
-    case D3DTS_VIEW:
+      case D3DTS_VIEW:
         conv_mat(lpmatrix, &This->StateBlock.transforms[D3DTS_VIEW]);
         break;
 
-    case D3DTS_PROJECTION:
+      case D3DTS_PROJECTION:
         conv_mat(lpmatrix, &This->StateBlock.transforms[D3DTS_PROJECTION]);
         break;
 
-    default:
+      case D3DTS_TEXTURE0:
+      case D3DTS_TEXTURE1:
+      case D3DTS_TEXTURE2:
+      case D3DTS_TEXTURE3:
+      case D3DTS_TEXTURE4:
+      case D3DTS_TEXTURE5:
+      case D3DTS_TEXTURE6:
+      case D3DTS_TEXTURE7:
+	conv_mat(lpmatrix, &This->StateBlock.transforms[d3dts]);
+        FIXME("Unhandled transform state for TEXTURE%d!!!\n", d3dts - D3DTS_TEXTURE0);
+        FIXME("must use glMatrixMode(GL_TEXTURE) before texturing\n");
+        break;
+
+      default:
         FIXME("Unhandled transform state!!\n");
         break;
+      }
+    } else {
+      /** 
+       * Indexed Vertex Blending Matrices 256 -> 511 
+       */
+      /** store it */
+      conv_mat(lpmatrix, &This->StateBlock.transforms[d3dts]);
+      if (checkGLSupport(ARB_VERTEX_BLEND)) {
+	FIXME("TODO\n");
+      } else if (checkGLSupport(EXT_VERTEX_WEIGHTING)) {
+	FIXME("TODO\n");
+      }
     }
 
     /*
@@ -1681,8 +1776,59 @@
         }
     }
 
-    glMultMatrixf((float *) &This->StateBlock.transforms[D3DTS_WORLDMATRIX(0)].u.m[0][0]);
-    checkGLcall("glMultMatrixf");
+    /**
+     * Vertex Blending as described
+     *  http://msdn.microsoft.com/library/default.asp?url=/library/en-us/directx9_c/directx/graphics/reference/d3d/enums/d3dvertexblendflags.asp
+     */
+    switch (This->UpdateStateBlock->vertex_blend) {
+    case D3DVBF_DISABLE:
+      {
+	glMultMatrixf((float *) &This->StateBlock.transforms[D3DTS_WORLDMATRIX(0)].u.m[0][0]);
+	checkGLcall("glMultMatrixf");
+      }
+      break;
+    case D3DVBF_1WEIGHTS:
+    case D3DVBF_2WEIGHTS:
+    case D3DVBF_3WEIGHTS:
+      {
+	FIXME("valid/correct D3DVBF_[1..3]WEIGHTS\n");
+	/*
+	 * doc seems to say that the weight values must be in vertex data (specified in FVF by D3DFVF_XYZB*)
+	 * so waiting for the values before matrix work
+	for (k = 0; k < This->UpdateStateBlock->vertex_blend; ++k) {
+	  glMultMatrixf((float *) &This->StateBlock.transforms[D3DTS_WORLDMATRIX(k)].u.m[0][0]);
+	  checkGLcall("glMultMatrixf");
+	}
+	*/
+      }
+      break;
+    case D3DVBF_TWEENING:
+      {
+	FIXME("valid/correct D3DVBF_TWEENING\n");
+	f = This->UpdateStateBlock->tween_factor;
+	m.u.s._11 = f; m.u.s._12 = f; m.u.s._13 = f; m.u.s._14 = f;
+	m.u.s._21 = f; m.u.s._22 = f; m.u.s._23 = f; m.u.s._24 = f;
+	m.u.s._31 = f; m.u.s._32 = f; m.u.s._33 = f; m.u.s._34 = f;
+	m.u.s._41 = f; m.u.s._42 = f; m.u.s._43 = f; m.u.s._44 = f;
+	glMultMatrixf((float *) &m.u.m[0][0]);
+	checkGLcall("glMultMatrixf");
+      }
+      break;
+    case D3DVBF_0WEIGHTS:
+      {
+	FIXME("valid/correct D3DVBF_0WEIGHTS\n");
+	/* single matrix of weight 1.0f */
+	m.u.s._11 = 1.0f; m.u.s._12 = 1.0f; m.u.s._13 = 1.0f; m.u.s._14 = 1.0f;
+	m.u.s._21 = 1.0f; m.u.s._22 = 1.0f; m.u.s._23 = 1.0f; m.u.s._24 = 1.0f;
+	m.u.s._31 = 1.0f; m.u.s._32 = 1.0f; m.u.s._33 = 1.0f; m.u.s._34 = 1.0f;
+	m.u.s._41 = 1.0f; m.u.s._42 = 1.0f; m.u.s._43 = 1.0f; m.u.s._44 = 1.0f;
+	glMultMatrixf((float *) &m.u.m[0][0]);
+	checkGLcall("glMultMatrixf");
+      }
+      break;
+    default:
+      break; /* stupid compilator */
+    }
 
     LEAVE_GL();
 
@@ -2541,6 +2687,27 @@
         }
         break;
 
+    case D3DRS_VERTEXBLEND               :
+        {
+	  This->UpdateStateBlock->vertex_blend = (D3DVERTEXBLENDFLAGS) Value;
+	  TRACE("Vertex Blending state to %ld\n",  Value);
+        }
+	break;
+
+    case D3DRS_TWEENFACTOR               :
+        {
+	  This->UpdateStateBlock->tween_factor = *((float*) &Value);
+	  TRACE("Vertex Blending Tween Factor to %f\n", This->UpdateStateBlock->tween_factor);
+        }
+	break;
+
+    case D3DRS_INDEXEDVERTEXBLENDENABLE  :
+        {
+	  TRACE("Indexed Vertex Blend Enable to %ul\n", (BOOL) Value);
+        }
+	break;
+
+
         /* Unhandled yet...! */
     case D3DRS_LINEPATTERN               :
     case D3DRS_LASTPIXEL                 :
@@ -2565,7 +2732,6 @@
     case D3DRS_SPECULARMATERIALSOURCE    :
     case D3DRS_AMBIENTMATERIALSOURCE     :
     case D3DRS_EMISSIVEMATERIALSOURCE    :
-    case D3DRS_VERTEXBLEND               :
     case D3DRS_SOFTWAREVERTEXPROCESSING  :
     case D3DRS_POINTSIZE                 :
     case D3DRS_POINTSIZE_MIN             :
@@ -2580,9 +2746,7 @@
     case D3DRS_PATCHSEGMENTS             :
     case D3DRS_DEBUGMONITORTOKEN         :
     case D3DRS_POINTSIZE_MAX             :
-    case D3DRS_INDEXEDVERTEXBLENDENABLE  :
     case D3DRS_COLORWRITEENABLE          :
-    case D3DRS_TWEENFACTOR               :
     case D3DRS_POSITIONORDER             :
     case D3DRS_NORMALORDER               :
         /*Put back later: FIXME("(%p)->(%d,%ld) not handled yet\n", This, State, Value); */
@@ -3595,7 +3759,7 @@
     VERTEXSHADER8* object;
     UINT i;
 
-    FIXME("(%p) : VertexShader not fully supported yet : Decl=%p, Func=%p\n", This, pDeclaration, pFunction);    
+    TRACE("(%p) : VertexShader not fully supported yet : Decl=%p, Func=%p\n", This, pDeclaration, pFunction);    
     if (NULL == pDeclaration || NULL == pHandle) { /* pFunction can be NULL see MSDN */
       return D3DERR_INVALIDCALL;
     }
@@ -4063,10 +4227,12 @@
     This->StateBlock.blockType = D3DSBT_ALL;
 
     /* FIXME: Set some of the defaults for lights, transforms etc */
-    memcpy(&This->StateBlock.transforms[D3DTS_WORLDMATRIX(0)], &idmatrix, sizeof(idmatrix));
     memcpy(&This->StateBlock.transforms[D3DTS_PROJECTION], &idmatrix, sizeof(idmatrix));
     memcpy(&This->StateBlock.transforms[D3DTS_VIEW], &idmatrix, sizeof(idmatrix));
-
+    for (i = 0; i < 256; ++i) {
+      memcpy(&This->StateBlock.transforms[D3DTS_WORLDMATRIX(i)], &idmatrix, sizeof(idmatrix));
+    }
+ 
     /* Render states: */
     if (This->PresentParms.EnableAutoDepthStencil) {
        IDirect3DDevice8Impl_SetRenderState(iface, D3DRS_ZENABLE, D3DZB_TRUE );
Index: directx.c
===================================================================
RCS file: /home/wine/wine/dlls/d3d8/directx.c,v
retrieving revision 1.11
diff -u -r1.11 directx.c
--- directx.c	7 Jan 2003 20:36:30 -0000	1.11
+++ directx.c	11 Jan 2003 17:41:11 -0000
@@ -370,10 +370,10 @@
     pCaps->MaxStreams = 1;
     pCaps->MaxStreamStride = 1024;
 
-    pCaps->VertexShaderVersion = 01;
+    pCaps->VertexShaderVersion = D3DVS_VERSION(1,1);
     pCaps->MaxVertexShaderConst = D3D8_VSHADER_MAX_CONSTANTS;
 
-    pCaps->PixelShaderVersion = 01;
+    pCaps->PixelShaderVersion = D3DPS_VERSION(1,1);
     pCaps->MaxPixelShaderValue = 1.0;
 
     return D3D_OK;


More information about the wine-patches mailing list