Christian Costa : d3drm: Beginning of Mesh info retrieval.
Alexandre Julliard
julliard at winehq.org
Mon Feb 8 11:06:07 CST 2010
Module: wine
Branch: master
Commit: a4b622d81afc53682b44085735ffad6686376771
URL: http://source.winehq.org/git/wine.git/?a=commit;h=a4b622d81afc53682b44085735ffad6686376771
Author: Christian Costa <titan.costa at wanadoo.fr>
Date: Sun Feb 7 21:17:24 2010 +0100
d3drm: Beginning of Mesh info retrieval.
---
dlls/d3drm/meshbuilder.c | 77 ++++++++++++++++++++++++++++++++++++++++++---
dlls/d3drm/tests/d3drm.c | 25 ++++++++++++++-
2 files changed, 94 insertions(+), 8 deletions(-)
diff --git a/dlls/d3drm/meshbuilder.c b/dlls/d3drm/meshbuilder.c
index 0848920..e5d1307 100644
--- a/dlls/d3drm/meshbuilder.c
+++ b/dlls/d3drm/meshbuilder.c
@@ -37,6 +37,13 @@ WINE_DEFAULT_DEBUG_CHANNEL(d3drm);
typedef struct {
const IDirect3DRMMeshBuilderVtbl *lpVtbl;
LONG ref;
+ DWORD nb_vertices;
+ D3DVECTOR* pVertices;
+ DWORD nb_normals;
+ D3DVECTOR* pNormals;
+ DWORD nb_faces;
+ DWORD face_data_size;
+ LPVOID pFaceData;
} IDirect3DRMMeshBuilderImpl;
typedef struct {
@@ -328,7 +335,12 @@ static ULONG WINAPI IDirect3DRMMeshBuilderImpl_Release(IDirect3DRMMeshBuilder* i
TRACE("(%p)\n", This);
if (!ref)
+ {
+ HeapFree(GetProcessHeap(), 0, This->pVertices);
+ HeapFree(GetProcessHeap(), 0, This->pNormals);
+ HeapFree(GetProcessHeap(), 0, This->pFaceData);
HeapFree(GetProcessHeap(), 0, This);
+ }
return ref;
}
@@ -417,11 +429,20 @@ static HRESULT WINAPI IDirect3DRMMeshBuilderImpl_Load(IDirect3DRMMeshBuilder* if
const GUID* pGuid;
DWORD size;
Header* pHeader;
+ LPBYTE ptr;
HRESULT hr;
HRESULT ret = D3DRMERR_BADOBJECT;
FIXME("(%p)->(%p,%p,%x,%p,%p): partial stub\n", This, filename, name, loadflags, cb, pArg);
+ /* First free allocated buffers of previous mesh data */
+ HeapFree(GetProcessHeap(), 0, This->pVertices);
+ This->pVertices = NULL;
+ HeapFree(GetProcessHeap(), 0, This->pNormals);
+ This->pNormals = NULL;
+ HeapFree(GetProcessHeap(), 0, This->pFaceData);
+ This->pFaceData = NULL;
+
if (loadflags == D3DRMLOAD_FROMMEMORY)
{
DXFILELOADMEMORY info;
@@ -499,6 +520,22 @@ static HRESULT WINAPI IDirect3DRMMeshBuilderImpl_Load(IDirect3DRMMeshBuilder* if
goto end;
}
+ hr = IDirectXFileData_GetData(pData, NULL, &size, (void**)&ptr);
+ if (hr != DXFILE_OK)
+ goto end;
+
+ This->nb_vertices = *(DWORD*)ptr;
+ This->nb_faces = *(DWORD*)(ptr + sizeof(DWORD) + This->nb_vertices * sizeof(D3DVECTOR));
+ This->face_data_size = size - sizeof(DWORD) - This->nb_vertices * sizeof(D3DVECTOR) - sizeof(DWORD);
+
+ TRACE("Mesh: nb_vertices = %d, nb_faces = %d, face_data_size = %d\n", This->nb_vertices, This->nb_faces, This->face_data_size);
+
+ This->pVertices = HeapAlloc(GetProcessHeap(), 0, This->nb_vertices * sizeof(D3DVECTOR));
+ memcpy(This->pVertices, ptr + sizeof(DWORD), This->nb_vertices * sizeof(D3DVECTOR));
+
+ This->pFaceData = HeapAlloc(GetProcessHeap(), 0, This->face_data_size);
+ memcpy(This->pFaceData, ptr + sizeof(DWORD) + This->nb_vertices * sizeof(D3DVECTOR) + sizeof(DWORD), This->face_data_size);
+
ret = D3DRM_OK;
end:
@@ -509,6 +546,21 @@ end:
if (pDXFile)
IDirectXFile_Release(pDXFile);
+ if (hr != D3DRM_OK)
+ {
+ /* Clean mesh data */
+ This->nb_vertices = 0;
+ This->nb_normals = 0;
+ This->nb_faces = 0;
+ This->face_data_size = 0;
+ HeapFree(GetProcessHeap(), 0, This->pVertices);
+ This->pVertices = NULL;
+ HeapFree(GetProcessHeap(), 0, This->pNormals);
+ This->pNormals = NULL;
+ HeapFree(GetProcessHeap(), 0, This->pFaceData);
+ This->pFaceData = NULL;
+ }
+
return ret;
}
@@ -750,9 +802,22 @@ static HRESULT WINAPI IDirect3DRMMeshBuilderImpl_GetVertices(IDirect3DRMMeshBuil
{
IDirect3DRMMeshBuilderImpl *This = (IDirect3DRMMeshBuilderImpl *)iface;
- FIXME("(%p)->(%p,%p,%p,%p,%p,%p): stub\n", This, vcount, vertices, ncount, normals, face_data_size, face_data);
+ TRACE("(%p)->(%p,%p,%p,%p,%p,%p)\n", This, vcount, vertices, ncount, normals, face_data_size, face_data);
- return E_NOTIMPL;
+ if (vcount)
+ *vcount = This->nb_vertices;
+ if (vertices && This->nb_vertices)
+ memcpy(vertices, This->pVertices, This->nb_vertices * sizeof(D3DVECTOR));
+ if (ncount)
+ *ncount = This->nb_normals;
+ if (normals && This->nb_normals)
+ memcpy(normals, This->pNormals, This->nb_normals * sizeof(D3DVECTOR));
+ if (face_data_size)
+ *face_data_size = This->face_data_size;
+ if (face_data && This->face_data_size)
+ memcpy(face_data, This->pFaceData, This->face_data_size);
+
+ return D3DRM_OK;
}
static HRESULT WINAPI IDirect3DRMMeshBuilderImpl_GetTextureCoordinates(IDirect3DRMMeshBuilder* iface, DWORD index, D3DVALUE *u, D3DVALUE *v)
@@ -813,18 +878,18 @@ static int WINAPI IDirect3DRMMeshBuilderImpl_GetFaceCount(IDirect3DRMMeshBuilder
{
IDirect3DRMMeshBuilderImpl *This = (IDirect3DRMMeshBuilderImpl *)iface;
- FIXME("(%p)->(): stub\n", This);
+ TRACE("(%p)->()\n", This);
- return 0;
+ return This->nb_faces;
}
static int WINAPI IDirect3DRMMeshBuilderImpl_GetVertexCount(IDirect3DRMMeshBuilder* iface)
{
IDirect3DRMMeshBuilderImpl *This = (IDirect3DRMMeshBuilderImpl *)iface;
- FIXME("(%p)->(): stub\n", This);
+ TRACE("(%p)->()\n", This);
- return 0;
+ return This->nb_vertices;
}
static D3DCOLOR WINAPI IDirect3DRMMeshBuilderImpl_GetVertexColor(IDirect3DRMMeshBuilder* iface, DWORD index)
diff --git a/dlls/d3drm/tests/d3drm.c b/dlls/d3drm/tests/d3drm.c
index d5fb645..aa1193b 100644
--- a/dlls/d3drm/tests/d3drm.c
+++ b/dlls/d3drm/tests/d3drm.c
@@ -69,8 +69,15 @@ char data_ok[] =
"}\n"
"Mesh Object\n"
"{\n"
-"0;\n"
-"0;\n"
+"4;\n"
+"1.0; 0.0; 0.0;,\n"
+"0.0; 1.0; 0.0;,\n"
+"0.0; 0.0; 1.0;,\n"
+"1.0; 1.0; 1.0;;\n"
+"3;\n"
+"3; 0, 1, 2;,\n"
+"3; 1, 2, 3;,\n"
+"3; 3, 1, 2;;\n"
"}\n";
static void MeshBuilderTest(void)
@@ -79,6 +86,8 @@ static void MeshBuilderTest(void)
LPDIRECT3DRM pD3DRM;
LPDIRECT3DRMMESHBUILDER pMeshBuilder;
D3DRMLOADMEMORY info;
+ int val;
+ DWORD val1, val2, val3;
hr = pDirect3DRMCreate(&pD3DRM);
ok(hr == D3DRM_OK, "Cannot get IDirect3DRM interface (hr = %x)\n", hr);
@@ -101,6 +110,18 @@ static void MeshBuilderTest(void)
hr = IDirect3DRMMeshBuilder_Load(pMeshBuilder, &info, NULL, D3DRMLOAD_FROMMEMORY, NULL, NULL);
ok(hr == D3DRM_OK, "Cannot load mesh data (hr = %x)\n", hr);
+ val = IDirect3DRMMeshBuilder_GetVertexCount(pMeshBuilder);
+ ok(val == 4, "Wrong number of vertices %d (must be 4)\n", val);
+
+ val = IDirect3DRMMeshBuilder_GetFaceCount(pMeshBuilder);
+ ok(val == 3, "Wrong number of faces %d (must be 3)\n", val);
+
+ hr = IDirect3DRMMeshBuilder_GetVertices(pMeshBuilder, &val1, NULL, &val2, NULL, &val3, NULL);
+ ok(hr == D3DRM_OK, "Cannot get vertices information (hr = %x)\n", hr);
+ ok(val1 == 4, "Wrong number of vertices %d (must be 4)\n", val1);
+ todo_wine ok(val2 == 4, "Wrong number of normals %d (must be 4)\n", val2);
+ todo_wine ok(val3 == 22, "Wrong number of face data bytes %d (must be 22)\n", val3);
+
IDirect3DRMMeshBuilder_Release(pMeshBuilder);
IDirect3DRM_Release(pD3DRM);
More information about the wine-cvs
mailing list