diff --git a/dlls/d3dx9_36/d3dx9_36.spec b/dlls/d3dx9_36/d3dx9_36.spec index 6ce5643a068..8a5082d8324 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 521d6942d4a..0d3eb2ced1f 100644 --- a/dlls/d3dx9_36/mesh.c +++ b/dlls/d3dx9_36/mesh.c @@ -88,6 +88,45 @@ HRESULT WINAPI D3DXComputeBoundingSphere(CONST D3DXVECTOR3* pfirstposition, DWOR return D3D_OK; } +/************************************************************************* + * 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 */ diff --git a/include/d3dx9mesh.h b/include/d3dx9mesh.h index a85f80de58b..72ea60727ae 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