David Adam : d3dx9_36: Implement D3DXGetFVFVertexSize.

Alexandre Julliard julliard at winehq.org
Wed Feb 11 09:25:04 CST 2009


Module: wine
Branch: master
Commit: ca469499bbbcf2c69afdf6ff96a34cdd33b30206
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=ca469499bbbcf2c69afdf6ff96a34cdd33b30206

Author: David Adam <david.adam.cnrs at gmail.com>
Date:   Tue Feb 10 15:44:24 2009 +0100

d3dx9_36: Implement D3DXGetFVFVertexSize.

---

 dlls/d3dx9_36/d3dx9_36.spec |    2 +-
 dlls/d3dx9_36/mesh.c        |   39 +++++++++++++++++++++++++++++++++++++++
 include/d3dx9mesh.h         |    1 +
 3 files changed, 41 insertions(+), 1 deletions(-)

diff --git a/dlls/d3dx9_36/d3dx9_36.spec b/dlls/d3dx9_36/d3dx9_36.spec
index 6ce5643..8a5082d 100644
--- a/dlls/d3dx9_36/d3dx9_36.spec
+++ b/dlls/d3dx9_36/d3dx9_36.spec
@@ -150,7 +150,7 @@
 @ stub D3DXGetDeclLength
 @ stub D3DXGetDeclVertexSize
 @ stdcall D3DXGetDriverLevel(ptr)
-@ stub D3DXGetFVFVertexSize
+@ stdcall D3DXGetFVFVertexSize(long)
 @ stdcall D3DXGetImageInfoFromFileA(ptr ptr) d3dx8.D3DXGetImageInfoFromFileA
 @ stdcall D3DXGetImageInfoFromFileInMemory(ptr long ptr) d3dx8.D3DXGetImageInfoFromFileInMemory
 @ stdcall D3DXGetImageInfoFromFileW(ptr ptr) d3dx8.D3DXGetImageInfoFromFileW
diff --git a/dlls/d3dx9_36/mesh.c b/dlls/d3dx9_36/mesh.c
index 521d694..0d3eb2c 100644
--- a/dlls/d3dx9_36/mesh.c
+++ b/dlls/d3dx9_36/mesh.c
@@ -89,6 +89,45 @@ HRESULT WINAPI D3DXComputeBoundingSphere(CONST D3DXVECTOR3* pfirstposition, DWOR
 }
 
 /*************************************************************************
+ * D3DXGetFVFVertexSize
+ */
+static UINT Get_TexCoord_Size_From_FVF(DWORD FVF, int tex_num)
+{
+    return (((((FVF) >> (16 + (2 * (tex_num)))) + 1) & 0x03) + 1);
+}
+
+UINT WINAPI D3DXGetFVFVertexSize(DWORD FVF)
+{
+    DWORD size = 0;
+    UINT i;
+    UINT numTextures = (FVF & D3DFVF_TEXCOUNT_MASK) >> D3DFVF_TEXCOUNT_SHIFT;
+
+    if (FVF & D3DFVF_NORMAL) size +=  sizeof(D3DXVECTOR3);
+    if (FVF & D3DFVF_DIFFUSE) size += sizeof(DWORD);
+    if (FVF & D3DFVF_SPECULAR) size += sizeof(DWORD);
+    if (FVF & D3DFVF_PSIZE) size += sizeof(DWORD);
+
+    switch (FVF & D3DFVF_POSITION_MASK)
+    {
+        case D3DFVF_XYZ:    size += sizeof(D3DXVECTOR3); break;
+        case D3DFVF_XYZRHW: size += 4 * sizeof(FLOAT); break;
+        case D3DFVF_XYZB1:  size += 4 * sizeof(FLOAT); break;
+        case D3DFVF_XYZB2:  size += 5 * sizeof(FLOAT); break;
+        case D3DFVF_XYZB3:  size += 6 * sizeof(FLOAT); break;
+        case D3DFVF_XYZB4:  size += 7 * sizeof(FLOAT); break;
+        case D3DFVF_XYZB5:  size += 8 * sizeof(FLOAT); break;
+        case D3DFVF_XYZW:   size += 4 * sizeof(FLOAT); break;
+    }
+
+    for (i = 0; i < numTextures; i++)
+    {
+        size += Get_TexCoord_Size_From_FVF(FVF, i) * sizeof(FLOAT);
+    }
+
+    return size;
+}
+
+/*************************************************************************
  * D3DXIntersectTri
  */
 BOOL WINAPI D3DXIntersectTri(CONST D3DXVECTOR3 *p0, CONST D3DXVECTOR3 *p1, CONST D3DXVECTOR3 *p2, CONST D3DXVECTOR3 *praypos, CONST D3DXVECTOR3 *praydir, FLOAT *pu, FLOAT *pv, FLOAT *pdist)
diff --git a/include/d3dx9mesh.h b/include/d3dx9mesh.h
index a85f80d..72ea607 100644
--- a/include/d3dx9mesh.h
+++ b/include/d3dx9mesh.h
@@ -31,6 +31,7 @@ BOOL    WINAPI D3DXBoxBoundProbe(CONST D3DXVECTOR3 *, CONST D3DXVECTOR3 *, CONST
 BOOL    WINAPI D3DXSphereBoundProbe(CONST D3DXVECTOR3 *,FLOAT,CONST D3DXVECTOR3 *,CONST D3DXVECTOR3 *);
 HRESULT WINAPI D3DXComputeBoundingBox(CONST D3DXVECTOR3 *, DWORD, DWORD, D3DXVECTOR3 *, D3DXVECTOR3 *);
 HRESULT WINAPI D3DXComputeBoundingSphere(CONST D3DXVECTOR3 *, DWORD, DWORD, D3DXVECTOR3 *, FLOAT *);
+UINT WINAPI D3DXGetFVFVertexSize(DWORD);
 BOOL    WINAPI D3DXIntersectTri(CONST D3DXVECTOR3 *, CONST D3DXVECTOR3 *, CONST D3DXVECTOR3 *, CONST D3DXVECTOR3 *, CONST D3DXVECTOR3*, FLOAT *, FLOAT *, FLOAT *);
 
 #ifdef __cplusplus




More information about the wine-cvs mailing list