WINE_DEFAULT_DEBUG_CHANNEL(d3drm);
+typedef struct {
+ D3DVALUE u;
+ D3DVALUE v;
+} Coords2d;
+
typedef struct {
const IDirect3DRMMeshBuilderVtbl *lpVtbl;
LONG ref;
DWORD nb_faces;
DWORD face_data_size;
LPVOID pFaceData;
+ DWORD nb_coords2d;
+ Coords2d* pCoords2d;
} IDirect3DRMMeshBuilderImpl;
typedef struct {
static const struct IDirect3DRMMeshBuilderVtbl Direct3DRMMeshBuilder_Vtbl;
-static const GUID GUID_Header = { 0x3D82AB43, 0x62DA, 0x11CF, { 0xAB, 0x39, 0x00, 0x20, 0xAF, 0x71, 0xE4, 0x33 } };
-static const GUID GUID_Mesh = { 0x3D82AB44, 0x62DA, 0x11CF, { 0xAB, 0x39, 0x00, 0x20, 0xAF, 0x71, 0xE4, 0x33 } };
+static const GUID GUID_Header = { 0x3D82AB43, 0x62DA, 0x11CF, { 0xAB, 0x39, 0x00, 0x20, 0xAF, 0x71, 0xE4, 0x33 } };
+static const GUID GUID_Mesh = { 0x3D82AB44, 0x62DA, 0x11CF, { 0xAB, 0x39, 0x00, 0x20, 0xAF, 0x71, 0xE4, 0x33 } };
+static const GUID GUID_MeshTextureCoords = { 0xF6F23F40, 0x7686, 0x11CF, { 0x8F, 0x52, 0x00, 0x40, 0x33, 0x35, 0x94, 0xA3 } };
+static const GUID GUID_MeshMaterialList = { 0xF6F23F42, 0x7686, 0x11CF, { 0x8F, 0x52, 0x00, 0x40, 0x33, 0x35, 0x94, 0xA3 } };
+static const GUID GUID_MeshNormals = { 0xF6F23F43, 0x7686, 0x11CF, { 0x8F, 0x52, 0x00, 0x40, 0x33, 0x35, 0x94, 0xA3 } };
static char templates[] = {
"xof 0302txt 0064"
LPDIRECTXFILE pDXFile = NULL;
LPDIRECTXFILEENUMOBJECT pEnumObject = NULL;
LPDIRECTXFILEDATA pData = NULL;
+ LPDIRECTXFILEOBJECT pObject = NULL;
+ LPDIRECTXFILEDATA pData2 = NULL;
const GUID* pGuid;
DWORD size;
Header* pHeader;
This->pNormals = NULL;
HeapFree(GetProcessHeap(), 0, This->pFaceData);
This->pFaceData = NULL;
+ HeapFree(GetProcessHeap(), 0, This->pCoords2d);
+ This->pCoords2d = NULL;
if (loadflags == D3DRMLOAD_FROMMEMORY)
{
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("toto: Found object type whose GUID = %s\n", debugstr_guid(pGuid));
+
+ if (!IsEqualGUID(pGuid, &GUID_MeshNormals))
+ {
+ 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, &GUID_MeshTextureCoords))
+ {
+ 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, &GUID_MeshMaterialList))
+ {
+ 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 (pDXFile)
IDirectXFile_Release(pDXFile);
- if (hr != D3DRM_OK)
+ 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;
FIXME("(%p)->(%d,%p,%p): stub\n", This, index, u, v);
- return E_NOTIMPL;
+ if (index >= This->nb_coords2d)
+ return D3DRMERR_NOTFOUND;
+
+ *u = This->pCoords2d[index].u;
+ *v = This->pCoords2d[index].v;
+
+ return D3DRM_OK;
}
static int WINAPI IDirect3DRMMeshBuilderImpl_AddVertex(IDirect3DRMMeshBuilder* iface, D3DVALUE x, D3DVALUE y, D3DVALUE z)