From db0ad52b497887eb8860b1cb0895dd306d353a9d Mon Sep 17 00:00:00 2001 From: Christian Costa Date: Mon, 26 Mar 2012 22:35:12 +0200 Subject: [PATCH] d3drm: Move mesh loading code into a separate function so it can be shared. --- dlls/d3drm/d3drm_private.h | 11 +++ dlls/d3drm/meshbuilder.c | 222 ++++++++++++++++++++++++--------------------- 2 files changed, 131 insertions(+), 102 deletions(-) diff --git a/dlls/d3drm/d3drm_private.h b/dlls/d3drm/d3drm_private.h index 452f22f8c88..8a74ee07768 100644 --- a/dlls/d3drm/d3drm_private.h +++ b/dlls/d3drm/d3drm_private.h @@ -22,6 +22,7 @@ #define __D3DRM_PRIVATE_INCLUDED__ #include "d3drm.h" +#include "dxfile.h" HRESULT Direct3DRM_create(IUnknown** ppObj) DECLSPEC_HIDDEN; HRESULT Direct3DRMDevice_create(REFIID riid, IUnknown** ppObj) DECLSPEC_HIDDEN; @@ -29,4 +30,14 @@ HRESULT Direct3DRMFrame_create(REFIID riid, IUnknown** ppObj) DECLSPEC_HIDDEN; HRESULT Direct3DRMMeshBuilder_create(REFIID riid, IUnknown** ppObj) DECLSPEC_HIDDEN; HRESULT Direct3DRMViewport_create(REFIID riid, IUnknown** ppObj) DECLSPEC_HIDDEN; +HRESULT load_mesh_data(IDirect3DRMMeshBuilder3* iface, LPDIRECTXFILEDATA pData) DECLSPEC_HIDDEN; + +typedef struct { + WORD major; + WORD minor; + DWORD flags; +} Header; + +extern char templates[]; + #endif /* __D3DRM_PRIVATE_INCLUDED__ */ diff --git a/dlls/d3drm/meshbuilder.c b/dlls/d3drm/meshbuilder.c index b386cbf3124..398ce2c7deb 100644 --- a/dlls/d3drm/meshbuilder.c +++ b/dlls/d3drm/meshbuilder.c @@ -52,13 +52,7 @@ typedef struct { Coords2d* pCoords2d; } IDirect3DRMMeshBuilderImpl; -typedef struct { - WORD major; - WORD minor; - DWORD flags; -} Header; - -static char templates[] = { +char templates[] = { "xof 0302txt 0064" "template Header" "{" @@ -1025,22 +1019,13 @@ static HRESULT WINAPI IDirect3DRMMeshBuilder3Impl_GetClassName(IDirect3DRMMeshBu return E_NOTIMPL; } -/*** IDirect3DRMMeshBuilder3 methods ***/ -static HRESULT WINAPI IDirect3DRMMeshBuilder3Impl_Load(IDirect3DRMMeshBuilder3* iface, - LPVOID filename, LPVOID name, - D3DRMLOADOPTIONS loadflags, - D3DRMLOADTEXTURE3CALLBACK cb, LPVOID arg) +HRESULT load_mesh_data(IDirect3DRMMeshBuilder3* iface, LPDIRECTXFILEDATA pData) { 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; @@ -1053,90 +1038,7 @@ static HRESULT WINAPI IDirect3DRMMeshBuilder3Impl_Load(IDirect3DRMMeshBuilder3* DWORD faces_data_size = 0; DWORD i; - TRACE("(%p)->(%p,%p,%x,%p,%p)\n", This, filename, name, loadflags, cb, arg); - - /* 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; - } + TRACE("(%p)->(%p)\n", This, pData); hr = IDirectXFileData_GetData(pData, NULL, &size, (void**)&ptr); if (hr != DXFILE_OK) @@ -1170,7 +1072,7 @@ static HRESULT WINAPI IDirect3DRMMeshBuilder3Impl_Load(IDirect3DRMMeshBuilder3* if (hr != DXFILE_OK) goto end; - hr = IDirectXFileObject_QueryInterface(pObject, &IID_IDirectXFileData, (void**)&pData2); + hr = IDirectXFileObject_QueryInterface(pObject, &IID_IDirectXFileData, (void**)&pData2); IDirectXFileObject_Release(pObject); if (hr != DXFILE_OK) goto end; @@ -1285,11 +1187,127 @@ static HRESULT WINAPI IDirect3DRMMeshBuilder3Impl_Load(IDirect3DRMMeshBuilder3* } } + TRACE("Mesh data loaded successfully\n"); + ret = D3DRM_OK; end: + HeapFree(GetProcessHeap(), 0, faces_normal_idx_data); HeapFree(GetProcessHeap(), 0, faces_vertex_idx_data); + + return ret; +} + +/*** IDirect3DRMMeshBuilder3 methods ***/ +static HRESULT WINAPI IDirect3DRMMeshBuilder3Impl_Load(IDirect3DRMMeshBuilder3* iface, + LPVOID filename, LPVOID name, + D3DRMLOADOPTIONS loadflags, + D3DRMLOADTEXTURE3CALLBACK cb, LPVOID arg) +{ + IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder3(iface); + DXFILELOADOPTIONS load_options; + LPDIRECTXFILE pDXFile = NULL; + LPDIRECTXFILEENUMOBJECT pEnumObject = NULL; + LPDIRECTXFILEDATA pData = NULL; + LPDIRECTXFILEDATA pData2 = NULL; + const GUID* pGuid; + DWORD size; + Header* pHeader; + HRESULT hr; + HRESULT ret = D3DRMERR_BADOBJECT; + + TRACE("(%p)->(%p,%p,%x,%p,%p)\n", This, filename, name, loadflags, cb, arg); + + /* 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 = load_mesh_data(iface, pData); + if (hr == S_OK) + ret = D3DRM_OK; + +end: + if (pData2) IDirectXFileData_Release(pData2); if (pData) -- 2.11.4.GIT