[PATCH 2/5] d3drm: Handle texture associated with the materail when loading a mesh.
Christian Costa
titan.costa at gmail.com
Fri Jun 8 08:38:34 CDT 2012
---
dlls/d3drm/meshbuilder.c | 57 ++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 57 insertions(+), 0 deletions(-)
diff --git a/dlls/d3drm/meshbuilder.c b/dlls/d3drm/meshbuilder.c
index 1bb84c5..56f53fd 100644
--- a/dlls/d3drm/meshbuilder.c
+++ b/dlls/d3drm/meshbuilder.c
@@ -1248,6 +1248,7 @@ HRESULT load_mesh_data(IDirect3DRMMeshBuilder3* iface, LPDIRECTXFILEDATA pData)
LPDIRECTXFILEDATA data;
LPDIRECTXFILEDATAREFERENCE reference;
LPDIRECT3DRMMATERIAL2 material;
+ LPDIRECTXFILEOBJECT material_child;
hr = IDirectXFileObject_QueryInterface(child, &IID_IDirectXFileData, (void **)&data);
if (FAILED(hr))
@@ -1290,6 +1291,62 @@ HRESULT load_mesh_data(IDirect3DRMMeshBuilder3* iface, LPDIRECTXFILEDATA pData)
This->material = material;
+ hr = IDirectXFileData_GetNextObject(data, &material_child);
+ if (hr == S_OK)
+ {
+ LPDIRECTXFILEDATA data;
+ LPDIRECT3DRMTEXTURE3 texture;
+ char** filename;
+
+ hr = IDirectXFileObject_QueryInterface(material_child, &IID_IDirectXFileData, (void **)&data);
+ if (FAILED(hr))
+ {
+ LPDIRECTXFILEDATAREFERENCE reference;
+
+ hr = IDirectXFileObject_QueryInterface(material_child, &IID_IDirectXFileDataReference, (void **)&reference);
+ if (FAILED(hr))
+ goto end;
+
+ hr = IDirectXFileDataReference_Resolve(reference, &data);
+ IDirectXFileDataReference_Release(reference);
+ if (FAILED(hr))
+ goto end;
+ }
+
+ hr = IDirectXFileData_GetType(data, &pGuid);
+ if (hr != DXFILE_OK)
+ goto end;
+ if (!IsEqualGUID(pGuid, &TID_D3DRMTextureFilename))
+ {
+ WARN("Not a texture filename\n");
+ goto end;
+ }
+
+ size = 4;
+ hr = IDirectXFileData_GetData(data, NULL, &size, (void**)&filename);
+ if (SUCCEEDED(hr))
+ {
+ HANDLE file;
+
+ file = CreateFileA(*filename, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL);
+ if (file != INVALID_HANDLE_VALUE)
+ {
+ hr = Direct3DRMTexture_create(&IID_IDirect3DRMTexture3, (LPUNKNOWN*)&texture);
+ if (FAILED(hr))
+ {
+ IDirectXFileData_Release(data);
+ goto end;
+ }
+ This->texture = texture;
+ }
+ }
+ }
+ else if (hr != DXFILEERR_NOMOREOBJECTS)
+ {
+ goto end;
+ }
+ hr = S_OK;
+
IDirectXFileData_Release(data);
i++;
}
More information about the wine-patches
mailing list