Module: wine Branch: master Commit: 0023ddf1174af71701f66bd609119117d52d6869 URL: http://source.winehq.org/git/wine.git/?a=commit;h=0023ddf1174af71701f66bd609...
Author: Christian Costa titan.costa@gmail.com Date: Fri Jun 8 15:38:34 2012 +0200
d3drm: Handle texture associated with the material when loading a mesh.
---
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++; }