[4/10] d3drm: Move Load implementation to IDirect3DRMMeshBuilder3 (resend)

André Hentschel nerv at dawncrow.de
Thu Jan 12 17:15:16 CST 2012


---
 dlls/d3drm/meshbuilder.c |  423 +++++++++++++++++++++++-----------------------
 dlls/d3drm/tests/d3drm.c |   10 +-
 2 files changed, 217 insertions(+), 216 deletions(-)

diff --git a/dlls/d3drm/meshbuilder.c b/dlls/d3drm/meshbuilder.c
index 072a23c..0fd7537 100644
--- a/dlls/d3drm/meshbuilder.c
+++ b/dlls/d3drm/meshbuilder.c
@@ -461,219 +461,14 @@ static HRESULT WINAPI IDirect3DRMMeshBuilder2Impl_GetClassName(IDirect3DRMMeshBu
 static HRESULT WINAPI IDirect3DRMMeshBuilder2Impl_Load(IDirect3DRMMeshBuilder2* iface,
                                                        LPVOID filename, LPVOID name,
                                                        D3DRMLOADOPTIONS loadflags,
-                                                       D3DRMLOADTEXTURECALLBACK cb, LPVOID pArg)
+                                                       D3DRMLOADTEXTURECALLBACK cb, LPVOID arg)
 {
     IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder2(iface);
-    DXFILELOADOPTIONS load_options;
-    LPDIRECTXFILE pDXFile = NULL;
-    LPDIRECTXFILEENUMOBJECT pEnumObject = NULL;
-    LPDIRECTXFILEDATA pData = NULL;
-    LPDIRECTXFILEOBJECT pObject = NULL;
-    LPDIRECTXFILEDATA pData2 = NULL;
-    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;
-    HeapFree(GetProcessHeap(), 0, This->pCoords2d);
-    This->pCoords2d = NULL;
-
-    if (loadflags == D3DRMLOAD_FROMMEMORY)
-    {
-        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, strlen(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, &TID_DXFILEHeader))
-    {
-        ret = D3DRMERR_BADFILE;
-        goto end;
-    }
-
-    hr = IDirectXFileData_GetData(pData, NULL, &size, (void**)&pHeader);
-    if ((hr != DXFILE_OK) || (size != sizeof(Header)))
-        goto end;
-
-    TRACE("Version is %d %d %d\n", pHeader->major, pHeader->minor, pHeader->flags);
-
-    /* Version must be 1.0.x */
-    if ((pHeader->major != 1) || (pHeader->minor != 0))
-    {
-        ret = D3DRMERR_BADFILE;
-        goto end;
-    }
-
-    IDirectXFileData_Release(pData);
-    pData = NULL;
-
-    hr = IDirectXFileEnumObject_GetNextDataObject(pEnumObject, &pData);
-    if (hr != DXFILE_OK)
-    {
-        ret = D3DRMERR_NOTFOUND;
-        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, &TID_D3DRMMesh))
-    {
-        ret = D3DRMERR_NOTFOUND;
-        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);
-
-    while (1)
-    {
-        hr =  IDirectXFileData_GetNextObject(pData, &pObject);
-        if (hr == DXFILEERR_NOMOREOBJECTS)
-        {
-	    FIXME("no more object\n");
-            break;
-        }
-        if (hr != DXFILE_OK)
-           goto end;
-
-            hr = IDirectXFileObject_QueryInterface(pObject, &IID_IDirectXFileData, (void**)&pData2);
-        IDirectXFileObject_Release(pObject);
-        if (hr != DXFILE_OK)
-            goto end;
-
-        hr = IDirectXFileData_GetType(pData2, &pGuid);
-        if (hr != DXFILE_OK)
-        {
-            IDirectXFileData_Release(pData2);
-            goto end;
-        }
-
-        FIXME("Found object type whose GUID = %s\n", debugstr_guid(pGuid));
-
-        if (!IsEqualGUID(pGuid, &TID_D3DRMMeshNormals))
-        {
-            DWORD tmp;
-
-            hr = IDirectXFileData_GetData(pData, NULL, &size, (void**)&ptr);
-            if (hr != DXFILE_OK)
-                goto end;
 
-            This->nb_normals = *(DWORD*)ptr;
-            tmp = *(DWORD*)(ptr + sizeof(DWORD) + This->nb_normals * sizeof(D3DVECTOR));
+    TRACE("(%p)->(%p,%p,%x,%p,%p): partial stub\n", This, filename, name, loadflags, cb, arg);
 
-            FIXME("MeshNormals: nb_normals = %d, nb_faces_normals = %d\n", This->nb_normals, tmp);
-
-            This->pNormals = HeapAlloc(GetProcessHeap(), 0, This->nb_normals * sizeof(D3DVECTOR));
-            memcpy(This->pNormals, ptr + sizeof(DWORD), This->nb_normals * sizeof(D3DVECTOR));
-        }
-        else if(!IsEqualGUID(pGuid, &TID_D3DRMMeshTextureCoords))
-        {
-            hr = IDirectXFileData_GetData(pData, NULL, &size, (void**)&ptr);
-            if (hr != DXFILE_OK)
-                goto end;
-
-            This->nb_coords2d = *(DWORD*)ptr;
-
-            FIXME("MeshTextureCoords: nb_coords2d = %d\n", This->nb_coords2d);
-
-            This->pCoords2d = HeapAlloc(GetProcessHeap(), 0, This->nb_coords2d * sizeof(Coords2d));
-            memcpy(This->pCoords2d, ptr + sizeof(DWORD), This->nb_coords2d * sizeof(Coords2d));
-
-        }
-        else if(!IsEqualGUID(pGuid, &TID_D3DRMMeshMaterialList))
-        {
-            FIXME("MeshMaterialList not supported yet, ignoring...\n");
-        }
-	else
-        {
-            FIXME("Unknown GUID %s, ignoring...\n", debugstr_guid(pGuid));
-        }
-
-        IDirectXFileData_Release(pData2);
-    }
-
-    ret = D3DRM_OK;
-
-end:
-    if (pData)
-        IDirectXFileData_Release(pData);
-    if (pEnumObject)
-        IDirectXFileEnumObject_Release(pEnumObject);
-    if (pDXFile)
-        IDirectXFile_Release(pDXFile);
-
-    if (ret != D3DRM_OK)
-    {
-        /* Clean mesh data */
-        This->nb_vertices = 0;
-        This->nb_normals = 0;
-        This->nb_faces = 0;
-        This->face_data_size = 0;
-        This->nb_coords2d = 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;
-        HeapFree(GetProcessHeap(), 0, This->pCoords2d);
-        This->pCoords2d = NULL;
-    }
-
-    return ret;
+    return IDirect3DRMMeshBuilder3_Load(&This->IDirect3DRMMeshBuilder3_iface, filename, name,
+                                        loadflags, (D3DRMLOADTEXTURE3CALLBACK)cb, arg);
 }
 
 static HRESULT WINAPI IDirect3DRMMeshBuilder2Impl_Save(IDirect3DRMMeshBuilder2* iface,
@@ -1279,10 +1074,216 @@ static HRESULT WINAPI IDirect3DRMMeshBuilder3Impl_Load(IDirect3DRMMeshBuilder3*
                                                        D3DRMLOADTEXTURE3CALLBACK cb, LPVOID arg)
 {
     IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder3(iface);
+    DXFILELOADOPTIONS load_options;
+    LPDIRECTXFILE pDXFile = NULL;
+    LPDIRECTXFILEENUMOBJECT pEnumObject = NULL;
+    LPDIRECTXFILEDATA pData = NULL;
+    LPDIRECTXFILEOBJECT pObject = NULL;
+    LPDIRECTXFILEDATA pData2 = NULL;
+    const GUID* pGuid;
+    DWORD size;
+    Header* pHeader;
+    LPBYTE ptr;
+    HRESULT hr;
+    HRESULT ret = D3DRMERR_BADOBJECT;
 
-    FIXME("(%p)->(%p,%p,%u,%p,%p): stub\n", This, filename, name, loadflags, cb, arg);
+    FIXME("(%p)->(%p,%p,%x,%p,%p): partial stub\n", This, filename, name, loadflags, cb, arg);
 
-    return E_NOTIMPL;
+    /* 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;
+    HeapFree(GetProcessHeap(), 0, This->pCoords2d);
+    This->pCoords2d = NULL;
+
+    if (loadflags == D3DRMLOAD_FROMMEMORY)
+    {
+        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, strlen(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, &TID_DXFILEHeader))
+    {
+        ret = D3DRMERR_BADFILE;
+        goto end;
+    }
+
+    hr = IDirectXFileData_GetData(pData, NULL, &size, (void**)&pHeader);
+    if ((hr != DXFILE_OK) || (size != sizeof(Header)))
+        goto end;
+
+    TRACE("Version is %d %d %d\n", pHeader->major, pHeader->minor, pHeader->flags);
+
+    /* Version must be 1.0.x */
+    if ((pHeader->major != 1) || (pHeader->minor != 0))
+    {
+        ret = D3DRMERR_BADFILE;
+        goto end;
+    }
+
+    IDirectXFileData_Release(pData);
+    pData = NULL;
+
+    hr = IDirectXFileEnumObject_GetNextDataObject(pEnumObject, &pData);
+    if (hr != DXFILE_OK)
+    {
+        ret = D3DRMERR_NOTFOUND;
+        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, &TID_D3DRMMesh))
+    {
+        ret = D3DRMERR_NOTFOUND;
+        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);
+
+    while (1)
+    {
+        hr =  IDirectXFileData_GetNextObject(pData, &pObject);
+        if (hr == DXFILEERR_NOMOREOBJECTS)
+        {
+            FIXME("no more object\n");
+            break;
+        }
+        if (hr != DXFILE_OK)
+           goto end;
+
+            hr = IDirectXFileObject_QueryInterface(pObject, &IID_IDirectXFileData, (void**)&pData2);
+        IDirectXFileObject_Release(pObject);
+        if (hr != DXFILE_OK)
+            goto end;
+
+        hr = IDirectXFileData_GetType(pData2, &pGuid);
+        if (hr != DXFILE_OK)
+        {
+            IDirectXFileData_Release(pData2);
+            goto end;
+        }
+
+        FIXME("Found object type whose GUID = %s\n", debugstr_guid(pGuid));
+
+        if (!IsEqualGUID(pGuid, &TID_D3DRMMeshNormals))
+        {
+            DWORD tmp;
+
+            hr = IDirectXFileData_GetData(pData, NULL, &size, (void**)&ptr);
+            if (hr != DXFILE_OK)
+                goto end;
+
+            This->nb_normals = *(DWORD*)ptr;
+            tmp = *(DWORD*)(ptr + sizeof(DWORD) + This->nb_normals * sizeof(D3DVECTOR));
+
+            FIXME("MeshNormals: nb_normals = %d, nb_faces_normals = %d\n", This->nb_normals, tmp);
+
+            This->pNormals = HeapAlloc(GetProcessHeap(), 0, This->nb_normals * sizeof(D3DVECTOR));
+            memcpy(This->pNormals, ptr + sizeof(DWORD), This->nb_normals * sizeof(D3DVECTOR));
+        }
+        else if(!IsEqualGUID(pGuid, &TID_D3DRMMeshTextureCoords))
+        {
+            hr = IDirectXFileData_GetData(pData, NULL, &size, (void**)&ptr);
+            if (hr != DXFILE_OK)
+                goto end;
+
+            This->nb_coords2d = *(DWORD*)ptr;
+
+            FIXME("MeshTextureCoords: nb_coords2d = %d\n", This->nb_coords2d);
+
+            This->pCoords2d = HeapAlloc(GetProcessHeap(), 0, This->nb_coords2d * sizeof(Coords2d));
+            memcpy(This->pCoords2d, ptr + sizeof(DWORD), This->nb_coords2d * sizeof(Coords2d));
+
+        }
+        else if(!IsEqualGUID(pGuid, &TID_D3DRMMeshMaterialList))
+        {
+            FIXME("MeshMaterialList not supported yet, ignoring...\n");
+        }
+        else
+        {
+            FIXME("Unknown GUID %s, ignoring...\n", debugstr_guid(pGuid));
+        }
+
+        IDirectXFileData_Release(pData2);
+    }
+
+    ret = D3DRM_OK;
+
+end:
+    if (pData)
+        IDirectXFileData_Release(pData);
+    if (pEnumObject)
+        IDirectXFileEnumObject_Release(pEnumObject);
+    if (pDXFile)
+        IDirectXFile_Release(pDXFile);
+
+    if (ret != D3DRM_OK)
+    {
+        /* Clean mesh data */
+        This->nb_vertices = 0;
+        This->nb_normals = 0;
+        This->nb_faces = 0;
+        This->face_data_size = 0;
+        This->nb_coords2d = 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;
+        HeapFree(GetProcessHeap(), 0, This->pCoords2d);
+        This->pCoords2d = NULL;
+    }
+
+    return ret;
 }
 
 static HRESULT WINAPI IDirect3DRMMeshBuilder3Impl_Save(IDirect3DRMMeshBuilder3* iface,
diff --git a/dlls/d3drm/tests/d3drm.c b/dlls/d3drm/tests/d3drm.c
index 67c6d8c..8f3c01c 100644
--- a/dlls/d3drm/tests/d3drm.c
+++ b/dlls/d3drm/tests/d3drm.c
@@ -174,23 +174,23 @@ static void test_MeshBuilder3(void)
     info.lpMemory = data_bad_version;
     info.dSize = strlen(data_bad_version);
     hr = IDirect3DRMMeshBuilder_Load(pMeshBuilder3, &info, NULL, D3DRMLOAD_FROMMEMORY, NULL, NULL);
-    todo_wine ok(hr == D3DRMERR_BADFILE, "Should have returned D3DRMERR_BADFILE (hr = %x)\n", hr);
+    ok(hr == D3DRMERR_BADFILE, "Should have returned D3DRMERR_BADFILE (hr = %x)\n", hr);
 
     info.lpMemory = data_no_mesh;
     info.dSize = strlen(data_no_mesh);
     hr = IDirect3DRMMeshBuilder_Load(pMeshBuilder3, &info, NULL, D3DRMLOAD_FROMMEMORY, NULL, NULL);
-    todo_wine ok(hr == D3DRMERR_NOTFOUND, "Should have returned D3DRMERR_NOTFOUND (hr = %x)\n", hr);
+    ok(hr == D3DRMERR_NOTFOUND, "Should have returned D3DRMERR_NOTFOUND (hr = %x)\n", hr);
 
     info.lpMemory = data_ok;
     info.dSize = strlen(data_ok);
     hr = IDirect3DRMMeshBuilder_Load(pMeshBuilder3, &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);
 
     val = IDirect3DRMMeshBuilder_GetVertexCount(pMeshBuilder3);
-    todo_wine ok(val == 4, "Wrong number of vertices %d (must be 4)\n", val);
+    ok(val == 4, "Wrong number of vertices %d (must be 4)\n", val);
 
     val = IDirect3DRMMeshBuilder_GetFaceCount(pMeshBuilder3);
-    todo_wine ok(val == 3, "Wrong number of faces %d (must be 3)\n", val);
+    ok(val == 3, "Wrong number of faces %d (must be 3)\n", val);
 
     hr = IDirect3DRMMeshBuilder3_GetVertices(pMeshBuilder3, 0, &val1, NULL);
     todo_wine ok(hr == D3DRM_OK, "Cannot get vertices information (hr = %x)\n", hr);
-- 

Best Regards, André Hentschel
-------------- next part --------------
An embedded and charset-unspecified text was scrubbed...
Name: Nachrichtenteil als Anhang
URL: <http://www.winehq.org/pipermail/wine-patches/attachments/20120113/9d3eb331/attachment-0001.ksh>


More information about the wine-patches mailing list