d3drm: Make IDirect3DRMMeshBuilderImpl_Load handle normals and texture coordinates.

Implement IDirect3DRMMeshBuilderImpl_GetTextureCoordinates.
This commit is contained in:
Christian Costa 2010-02-15 09:48:50 +01:00 committed by Alexandre Julliard
parent 739c1177d9
commit e0756602a4
1 changed files with 94 additions and 4 deletions

View File

@ -34,6 +34,11 @@
WINE_DEFAULT_DEBUG_CHANNEL(d3drm); WINE_DEFAULT_DEBUG_CHANNEL(d3drm);
typedef struct {
D3DVALUE u;
D3DVALUE v;
} Coords2d;
typedef struct { typedef struct {
const IDirect3DRMMeshBuilderVtbl *lpVtbl; const IDirect3DRMMeshBuilderVtbl *lpVtbl;
LONG ref; LONG ref;
@ -44,6 +49,8 @@ typedef struct {
DWORD nb_faces; DWORD nb_faces;
DWORD face_data_size; DWORD face_data_size;
LPVOID pFaceData; LPVOID pFaceData;
DWORD nb_coords2d;
Coords2d* pCoords2d;
} IDirect3DRMMeshBuilderImpl; } IDirect3DRMMeshBuilderImpl;
typedef struct { typedef struct {
@ -54,8 +61,11 @@ typedef struct {
static const struct IDirect3DRMMeshBuilderVtbl Direct3DRMMeshBuilder_Vtbl; 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_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_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[] = { static char templates[] = {
"xof 0302txt 0064" "xof 0302txt 0064"
@ -426,6 +436,8 @@ static HRESULT WINAPI IDirect3DRMMeshBuilderImpl_Load(IDirect3DRMMeshBuilder* if
LPDIRECTXFILE pDXFile = NULL; LPDIRECTXFILE pDXFile = NULL;
LPDIRECTXFILEENUMOBJECT pEnumObject = NULL; LPDIRECTXFILEENUMOBJECT pEnumObject = NULL;
LPDIRECTXFILEDATA pData = NULL; LPDIRECTXFILEDATA pData = NULL;
LPDIRECTXFILEOBJECT pObject = NULL;
LPDIRECTXFILEDATA pData2 = NULL;
const GUID* pGuid; const GUID* pGuid;
DWORD size; DWORD size;
Header* pHeader; Header* pHeader;
@ -442,6 +454,8 @@ static HRESULT WINAPI IDirect3DRMMeshBuilderImpl_Load(IDirect3DRMMeshBuilder* if
This->pNormals = NULL; This->pNormals = NULL;
HeapFree(GetProcessHeap(), 0, This->pFaceData); HeapFree(GetProcessHeap(), 0, This->pFaceData);
This->pFaceData = NULL; This->pFaceData = NULL;
HeapFree(GetProcessHeap(), 0, This->pCoords2d);
This->pCoords2d = NULL;
if (loadflags == D3DRMLOAD_FROMMEMORY) if (loadflags == D3DRMLOAD_FROMMEMORY)
{ {
@ -536,6 +550,73 @@ static HRESULT WINAPI IDirect3DRMMeshBuilderImpl_Load(IDirect3DRMMeshBuilder* if
This->pFaceData = HeapAlloc(GetProcessHeap(), 0, This->face_data_size); 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); 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; ret = D3DRM_OK;
end: end:
@ -546,19 +627,22 @@ end:
if (pDXFile) if (pDXFile)
IDirectXFile_Release(pDXFile); IDirectXFile_Release(pDXFile);
if (hr != D3DRM_OK) if (ret != D3DRM_OK)
{ {
/* Clean mesh data */ /* Clean mesh data */
This->nb_vertices = 0; This->nb_vertices = 0;
This->nb_normals = 0; This->nb_normals = 0;
This->nb_faces = 0; This->nb_faces = 0;
This->face_data_size = 0; This->face_data_size = 0;
This->nb_coords2d = 0;
HeapFree(GetProcessHeap(), 0, This->pVertices); HeapFree(GetProcessHeap(), 0, This->pVertices);
This->pVertices = NULL; This->pVertices = NULL;
HeapFree(GetProcessHeap(), 0, This->pNormals); HeapFree(GetProcessHeap(), 0, This->pNormals);
This->pNormals = NULL; This->pNormals = NULL;
HeapFree(GetProcessHeap(), 0, This->pFaceData); HeapFree(GetProcessHeap(), 0, This->pFaceData);
This->pFaceData = NULL; This->pFaceData = NULL;
HeapFree(GetProcessHeap(), 0, This->pCoords2d);
This->pCoords2d = NULL;
} }
return ret; return ret;
@ -826,7 +910,13 @@ static HRESULT WINAPI IDirect3DRMMeshBuilderImpl_GetTextureCoordinates(IDirect3D
FIXME("(%p)->(%d,%p,%p): stub\n", This, index, u, v); 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) static int WINAPI IDirect3DRMMeshBuilderImpl_AddVertex(IDirect3DRMMeshBuilder* iface, D3DVALUE x, D3DVALUE y, D3DVALUE z)