[PATCH 5/5] d3drm: Implement partially IDirect3DRMMeshBuilderImpl_Load

Christian Costa titan.costa at wanadoo.fr
Mon Feb 1 01:18:48 CST 2010


---

 dlls/d3drm/Makefile.in   |    2 
 dlls/d3drm/meshbuilder.c |  287 ++++++++++++++++++++++++++++++++++++++++++++++
 dlls/d3drm/tests/d3drm.c |    4 -
 3 files changed, 288 insertions(+), 5 deletions(-)
-------------- next part --------------
diff --git a/dlls/d3drm/Makefile.in b/dlls/d3drm/Makefile.in
index 4dfd89c..01f28f0 100644
--- a/dlls/d3drm/Makefile.in
+++ b/dlls/d3drm/Makefile.in
@@ -4,7 +4,7 @@ SRCDIR    = @srcdir@
 VPATH     = @srcdir@
 MODULE    = d3drm.dll
 IMPORTLIB = d3drm
-IMPORTS   = dxguid uuid kernel32
+IMPORTS   = dxguid uuid d3dxof kernel32
 
 C_SRCS = \
 	d3drm.c \
diff --git a/dlls/d3drm/meshbuilder.c b/dlls/d3drm/meshbuilder.c
index b2ef539..1d649e4 100644
--- a/dlls/d3drm/meshbuilder.c
+++ b/dlls/d3drm/meshbuilder.c
@@ -27,6 +27,7 @@
 
 #include "winbase.h"
 #include "wingdi.h"
+#include "dxfile.h"
 
 #include "d3drm_private.h"
 #include "d3drm.h"
@@ -40,6 +41,229 @@ typedef struct {
 
 static const struct IDirect3DRMMeshBuilderVtbl Direct3DRMMeshBuilder_Vtbl;
 
+static const GUID GUID_Mesh = { 0x3D82AB44, 0x62DA, 0x11CF, { 0xAB, 0x39, 0x00, 0x20, 0xAF, 0x71, 0xE4, 0x33 } };
+
+static char templates[] = {
+"xof 0302txt 0064"
+"template Header"
+"{"
+"<3D82AB43-62DA-11CF-AB39-0020AF71E433>"
+"WORD major;"
+"WORD minor;"
+"DWORD flags;"
+"}"
+"template Vector"
+"{"
+"<3D82AB5E-62DA-11CF-AB39-0020AF71E433>"
+"FLOAT x;"
+"FLOAT y;"
+"FLOAT z;"
+"}"
+"template Coords2d"
+"{"
+"<F6F23F44-7686-11CF-8F52-0040333594A3>"
+"FLOAT u;"
+"FLOAT v;"
+"}"
+"template Matrix4x4"
+"{"
+"<F6F23F45-7686-11CF-8F52-0040333594A3>"
+"array FLOAT matrix[16];"
+"}"
+"template ColorRGBA"
+"{"
+"<35FF44E0-6C7C-11CF-8F52-0040333594A3>"
+"FLOAT red;"
+"FLOAT green;"
+"FLOAT blue;"
+"FLOAT alpha;"
+"}"
+"template ColorRGB"
+"{"
+"<D3E16E81-7835-11CF-8F52-0040333594A3>"
+"FLOAT red;"
+"FLOAT green;"
+"FLOAT blue;"
+"}"
+"template IndexedColor"
+"{"
+"<1630B820-7842-11CF-8F52-0040333594A3>"
+"DWORD index;"
+"ColorRGBA indexColor;"
+"}"
+"template Boolean"
+"{"
+"<537DA6A0-CA37-11D0-941C-0080C80CFA7B>"
+"DWORD truefalse;"
+"}"
+"template Boolean2d"
+"{"
+"<4885AE63-78E8-11CF-8F52-0040333594A3>"
+"Boolean u;"
+"Boolean v;"
+"}"
+"template MaterialWrap"
+"{"
+"<4885AE60-78E8-11CF-8F52-0040333594A3>"
+"Boolean u;"
+"Boolean v;"
+"}"
+"template TextureFilename"
+"{"
+"<A42790E1-7810-11CF-8F52-0040333594A3>"
+"STRING filename;"
+"}"
+"template Material"
+"{"
+"<3D82AB4D-62DA-11CF-AB39-0020AF71E433>"
+"ColorRGBA faceColor;"
+"FLOAT power;"
+"ColorRGB specularColor;"
+"ColorRGB emissiveColor;"
+"[...]"
+"}"
+"template MeshFace"
+"{"
+"<3D82AB5F-62DA-11CF-AB39-0020AF71E433>"
+"DWORD nFaceVertexIndices;"
+"array DWORD faceVertexIndices[nFaceVertexIndices];"
+"}"
+"template MeshFaceWraps"
+"{"
+"<ED1EC5C0-C0A8-11D0-941C-0080C80CFA7B>"
+"DWORD nFaceWrapValues;"
+"array Boolean2d faceWrapValues[nFaceWrapValues];"
+"}"
+"template MeshTextureCoords"
+"{"
+"<F6F23F40-7686-11CF-8F52-0040333594A3>"
+"DWORD nTextureCoords;"
+"array Coords2d textureCoords[nTextureCoords];"
+"}"
+"template MeshMaterialList"
+"{"
+"<F6F23F42-7686-11CF-8F52-0040333594A3>"
+"DWORD nMaterials;"
+"DWORD nFaceIndexes;"
+"array DWORD faceIndexes[nFaceIndexes];"
+"[Material]"
+"}"
+"template MeshNormals"
+"{"
+"<F6F23F43-7686-11CF-8F52-0040333594A3>"
+"DWORD nNormals;"
+"array Vector normals[nNormals];"
+"DWORD nFaceNormals;"
+"array MeshFace faceNormals[nFaceNormals];"
+"}"
+"template MeshVertexColors"
+"{"
+"<1630B821-7842-11CF-8F52-0040333594A3>"
+"DWORD nVertexColors;"
+"array IndexedColor vertexColors[nVertexColors];"
+"}"
+"template Mesh"
+"{"
+"<3D82AB44-62DA-11CF-AB39-0020AF71E433>"
+"DWORD nVertices;"
+"array Vector vertices[nVertices];"
+"DWORD nFaces;"
+"array MeshFace faces[nFaces];"
+"[...]"
+"}"
+"template FrameTransformMatrix"
+"{"
+"<F6F23F41-7686-11CF-8F52-0040333594A3>"
+"Matrix4x4 frameMatrix;"
+"}"
+"template Frame"
+"{"
+"<3D82AB46-62DA-11CF-AB39-0020AF71E433>"
+"[...]"
+"}"
+"template FloatKeys"
+"{"
+"<10DD46A9-775B-11CF-8F52-0040333594A3>"
+"DWORD nValues;"
+"array FLOAT values[nValues];"
+"}"
+"template TimedFloatKeys"
+"{"
+"<F406B180-7B3B-11CF-8F52-0040333594A3>"
+"DWORD time;"
+"FloatKeys tfkeys;"
+"}"
+"template AnimationKey"
+"{"
+"<10DD46A8-775B-11CF-8F52-0040333594A3>"
+"DWORD keyType;"
+"DWORD nKeys;"
+"array TimedFloatKeys keys[nKeys];"
+"}"
+"template AnimationOptions"
+"{"
+"<E2BF56C0-840F-11CF-8F52-0040333594A3>"
+"DWORD openclosed;"
+"DWORD positionquality;"
+"}"
+"template Animation"
+"{"
+"<3D82AB4F-62DA-11CF-AB39-0020AF71E433>"
+"[...]"
+"}"
+"template AnimationSet"
+"{"
+"<3D82AB50-62DA-11CF-AB39-0020AF71E433>"
+"[Animation]"
+"}"
+"template InlineData"
+"{"
+"<3A23EEA0-94B1-11D0-AB39-0020AF71E433>"
+"[BINARY]"
+"}"
+"template Url"
+"{"
+"<3A23EEA1-94B1-11D0-AB39-0020AF71E433>"
+"DWORD nUrls;"
+"array STRING urls[nUrls];"
+"}"
+"template ProgressiveMesh"
+"{"
+"<8A63C360-997D-11D0-941C-0080C80CFA7B>"
+"[Url,InlineData]"
+"}"
+"template Guid"
+"{"
+"<A42790E0-7810-11CF-8F52-0040333594A3>"
+"DWORD data1;"
+"WORD data2;"
+"WORD data3;"
+"array UCHAR data4[8];"
+"}"
+"template StringProperty"
+"{"
+"<7F0F21E0-BFE1-11D1-82C0-00A0C9697271>"
+"STRING key;"
+"STRING value;"
+"}"
+"template PropertyBag"
+"{"
+"<7F0F21E1-BFE1-11D1-82C0-00A0C9697271>"
+"[StringProperty]"
+"}"
+"template ExternalVisual"
+"{"
+"<98116AA0-BDBA-11D1-82C0-00A0C9697271>"
+"Guid guidExternalVisual;"
+"[...]"
+"}"
+"template RightHanded"
+"{"
+"<7F5D5EA0-D53A-11D1-82C0-00A0C9697271>"
+"DWORD bRightHanded;"
+"}"
+};
+
 HRESULT Direct3DRMMeshBuilder_create(LPDIRECT3DRMMESHBUILDER* ppMeshBuilder)
 {
     IDirect3DRMMeshBuilderImpl* object;
@@ -179,10 +403,69 @@ static HRESULT WINAPI IDirect3DRMMeshBuilderImpl_GetClassName(IDirect3DRMMeshBui
 static HRESULT WINAPI IDirect3DRMMeshBuilderImpl_Load(IDirect3DRMMeshBuilder* iface, LPVOID filename, LPVOID name, D3DRMLOADOPTIONS loadflags, D3DRMLOADTEXTURECALLBACK cb, LPVOID pArg)
 {
     IDirect3DRMMeshBuilderImpl *This = (IDirect3DRMMeshBuilderImpl *)iface;
+    DXFILELOADOPTIONS load_options;
+    LPDIRECTXFILE pDXFile = NULL;
+    LPDIRECTXFILEENUMOBJECT pEnumObject = NULL;
+    LPDIRECTXFILEDATA pData = NULL;
+    const GUID* pGuid;
+    HRESULT hr;
+    HRESULT ret = D3DRMERR_BADOBJECT;
 
-    FIXME("(%p)->(%p,%p,%x,%p,%p): stub\n", This, filename, name, loadflags, cb, pArg);
+    FIXME("(%p)->(%p,%p,%x,%p,%p): partial stub\n", This, filename, name, loadflags, cb, pArg);
 
-    return E_NOTIMPL;
+    if (loadflags == D3DRMLOAD_FROMMEMORY)
+    {
+        DXFILELOADMEMORY info;
+        LPD3DRMLOADMEMORY pinfo = (LPD3DRMLOADMEMORY)filename;
+        info.lpMemory = pinfo->lpMemory;
+        info.dSize = pinfo->dSize;
+        load_options = DXFILELOAD_FROMMEMORY;
+    }
+    else
+    {
+        FIXME("Load options %d not supported yet\n", loadflags);
+        return E_NOTIMPL;
+    }
+
+    hr = DirectXFileCreate(&pDXFile);
+    if (hr != DXFILE_OK)
+        goto end;
+
+    hr = IDirectXFile_RegisterTemplates(pDXFile, templates, sizeof(templates));
+    if (hr != DXFILE_OK)
+        goto end;
+
+    hr = IDirectXFile_CreateEnumObject(pDXFile, filename, load_options, &pEnumObject);
+    if (hr != DXFILE_OK)
+        goto end;
+
+    hr = IDirectXFileEnumObject_GetNextDataObject(pEnumObject, &pData);
+    if (hr != DXFILE_OK)
+        goto end;
+    
+    hr = IDirectXFileData_GetType(pData, &pGuid);
+    if (hr != DXFILE_OK)
+        goto end;
+
+    TRACE("Found object type whose GUID = %s\n", debugstr_guid(pGuid));
+
+    if (!IsEqualGUID(pGuid, &GUID_Mesh))
+    {
+        ret = D3DRMERR_BADFILE;
+        goto end;
+    }
+
+    ret = D3DRM_OK;
+
+end:
+    if (pData)
+        IDirectXFileData_Release(pData);
+    if (pEnumObject)
+        IDirectXFileEnumObject_Release(pEnumObject);
+    if (pDXFile)
+        IDirectXFile_Release(pDXFile);
+
+    return ret;
 }
 
 static HRESULT WINAPI IDirect3DRMMeshBuilderImpl_Save(IDirect3DRMMeshBuilder* iface, const char *filename, D3DRMXOFFORMAT format, D3DRMSAVEOPTIONS save)
diff --git a/dlls/d3drm/tests/d3drm.c b/dlls/d3drm/tests/d3drm.c
index 0d8e342..9e74c12 100644
--- a/dlls/d3drm/tests/d3drm.c
+++ b/dlls/d3drm/tests/d3drm.c
@@ -78,12 +78,12 @@ void Test(void)
     info.lpMemory = data_bad;
     info.dSize = sizeof(data_bad);
     hr = IDirect3DRMMeshBuilder_Load(pMeshBuilder, &info, NULL, D3DRMLOAD_FROMMEMORY, NULL, NULL);
-    todo_wine ok(hr == D3DRMERR_BADFILE, "Sould have returned D3DRMERR_BADFILE (hr = %x)\n", hr);
+    ok(hr == D3DRMERR_BADFILE, "Sould have returned D3DRMERR_BADFILE (hr = %x)\n", hr);
 
     info.lpMemory = data_ok;
     info.dSize = sizeof(data_ok);
     hr = IDirect3DRMMeshBuilder_Load(pMeshBuilder, &info, NULL, D3DRMLOAD_FROMMEMORY, NULL, NULL);
-    todo_wine ok(hr == D3DRM_OK, "Cannot load mesh data (hr = %x)\n", hr);
+    ok(hr == D3DRM_OK, "Cannot load mesh data (hr = %x)\n", hr);
 
     IDirect3DRMMeshBuilder_Release(pMeshBuilder);
 


More information about the wine-patches mailing list