From b89c32b2a12f78572da336d982aa53b8c8bb99d0 Mon Sep 17 00:00:00 2001 From: Christian Costa Date: Fri, 16 Mar 2012 08:16:18 +0100 Subject: [PATCH] d3drm: If there is no texture coordinates in loaded mesh, generate default texture coordinates for each vertex. --- dlls/d3drm/meshbuilder.c | 14 ++++++++++++- dlls/d3drm/tests/d3drm.c | 54 ++++++++++++++++++++++++++++++++++++++++++------ 2 files changed, 61 insertions(+), 7 deletions(-) diff --git a/dlls/d3drm/meshbuilder.c b/dlls/d3drm/meshbuilder.c index e9d0e67ede9..43ce2d6f2e0 100644 --- a/dlls/d3drm/meshbuilder.c +++ b/dlls/d3drm/meshbuilder.c @@ -1272,6 +1272,18 @@ static HRESULT WINAPI IDirect3DRMMeshBuilder3Impl_Load(IDirect3DRMMeshBuilder3* /* Set size (in number of DWORD) of all faces data */ This->face_data_size = faces_data_size; + /* If there is no texture coordinates, generate default texture coordinates (0.0f, 0.0f) for each vertex */ + if (!This->pCoords2d) + { + This->nb_coords2d = This->nb_vertices; + This->pCoords2d = HeapAlloc(GetProcessHeap(), 0, This->nb_coords2d * sizeof(Coords2d)); + for (i = 0; i < This->nb_coords2d; i++) + { + This->pCoords2d[i].u = 0.0f; + This->pCoords2d[i].v = 0.0f; + } + } + ret = D3DRM_OK; end: @@ -1603,7 +1615,7 @@ static HRESULT WINAPI IDirect3DRMMeshBuilder3Impl_GetTextureCoordinates(IDirect3 TRACE("(%p)->(%d,%p,%p)\n", This, index, u, v); if (index >= This->nb_coords2d) - return D3DRMERR_NOTFOUND; + return D3DRMERR_BADVALUE; *u = This->pCoords2d[index].u; *v = This->pCoords2d[index].v; diff --git a/dlls/d3drm/tests/d3drm.c b/dlls/d3drm/tests/d3drm.c index 1732db6af3f..341519bf984 100644 --- a/dlls/d3drm/tests/d3drm.c +++ b/dlls/d3drm/tests/d3drm.c @@ -180,12 +180,33 @@ static void test_MeshBuilder(void) todo_wine ok(val2 == 4, "Wrong number of normals %d (must be 4)\n", val2); ok(val3 == 22, "Wrong number of face data bytes %d (must be 22)\n", val3); + /* Check that Load method generated default texture coordinates (0.0f, 0.0f) for each vertex */ + valu = 1.23f; + valv = 3.21f; + hr = IDirect3DRMMeshBuilder_GetTextureCoordinates(pMeshBuilder, 0, &valu, &valv); + ok(hr == D3DRM_OK, "Cannot get texture coordinates (hr = %x)\n", hr); + ok(valu == 0.0f, "Wrong coordinate %f (must be 0.0)\n", valu); + ok(valv == 0.0f, "Wrong coordinate %f (must be 0.0)\n", valv); valu = 1.23f; valv = 3.21f; hr = IDirect3DRMMeshBuilder_GetTextureCoordinates(pMeshBuilder, 1, &valu, &valv); - todo_wine ok(hr == D3DRM_OK, "Cannot get texture coordinates (hr = %x)\n", hr); - todo_wine ok(valu == 0.0f, "Wrong coordinate %f (must be 0.0)\n", valu); - todo_wine ok(valv == 0.0f, "Wrong coordinate %f (must be 0.0)\n", valv); + ok(hr == D3DRM_OK, "Cannot get texture coordinates (hr = %x)\n", hr); + ok(valu == 0.0f, "Wrong coordinate %f (must be 0.0)\n", valu); + ok(valv == 0.0f, "Wrong coordinate %f (must be 0.0)\n", valv); + valu = 1.23f; + valv = 3.21f; + hr = IDirect3DRMMeshBuilder_GetTextureCoordinates(pMeshBuilder, 2, &valu, &valv); + ok(hr == D3DRM_OK, "Cannot get texture coordinates (hr = %x)\n", hr); + ok(valu == 0.0f, "Wrong coordinate %f (must be 0.0)\n", valu); + ok(valv == 0.0f, "Wrong coordinate %f (must be 0.0)\n", valv); + valu = 1.23f; + valv = 3.21f; + hr = IDirect3DRMMeshBuilder_GetTextureCoordinates(pMeshBuilder, 3, &valu, &valv); + ok(hr == D3DRM_OK, "Cannot get texture coordinates (hr = %x)\n", hr); + ok(valu == 0.0f, "Wrong coordinate %f (must be 0.0)\n", valu); + ok(valv == 0.0f, "Wrong coordinate %f (must be 0.0)\n", valv); + hr = IDirect3DRMMeshBuilder_GetTextureCoordinates(pMeshBuilder, 4, &valu, &valv); + ok(hr == D3DRMERR_BADVALUE, "Should fail and return D3DRM_BADVALUE (hr = %x)\n", hr); valu = 1.23f; valv = 3.21f; @@ -302,12 +323,33 @@ static void test_MeshBuilder3(void) ok(hr == D3DRM_OK, "Cannot get vertices information (hr = %x)\n", hr); ok(val1 == 4, "Wrong number of vertices %d (must be 4)\n", val1); + /* Check that Load method generated default texture coordinates (0.0f, 0.0f) for each vertex */ + valu = 1.23f; + valv = 3.21f; + hr = IDirect3DRMMeshBuilder3_GetTextureCoordinates(pMeshBuilder3, 0, &valu, &valv); + ok(hr == D3DRM_OK, "Cannot get texture coordinates (hr = %x)\n", hr); + ok(valu == 0.0f, "Wrong coordinate %f (must be 0.0)\n", valu); + ok(valv == 0.0f, "Wrong coordinate %f (must be 0.0)\n", valv); valu = 1.23f; valv = 3.21f; hr = IDirect3DRMMeshBuilder3_GetTextureCoordinates(pMeshBuilder3, 1, &valu, &valv); - todo_wine ok(hr == D3DRM_OK, "Cannot get texture coordinates (hr = %x)\n", hr); - todo_wine ok(valu == 0.0f, "Wrong coordinate %f (must be 0.0)\n", valu); - todo_wine ok(valv == 0.0f, "Wrong coordinate %f (must be 0.0)\n", valv); + ok(hr == D3DRM_OK, "Cannot get texture coordinates (hr = %x)\n", hr); + ok(valu == 0.0f, "Wrong coordinate %f (must be 0.0)\n", valu); + ok(valv == 0.0f, "Wrong coordinate %f (must be 0.0)\n", valv); + valu = 1.23f; + valv = 3.21f; + hr = IDirect3DRMMeshBuilder3_GetTextureCoordinates(pMeshBuilder3, 2, &valu, &valv); + ok(hr == D3DRM_OK, "Cannot get texture coordinates (hr = %x)\n", hr); + ok(valu == 0.0f, "Wrong coordinate %f (must be 0.0)\n", valu); + ok(valv == 0.0f, "Wrong coordinate %f (must be 0.0)\n", valv); + valu = 1.23f; + valv = 3.21f; + hr = IDirect3DRMMeshBuilder3_GetTextureCoordinates(pMeshBuilder3, 3, &valu, &valv); + ok(hr == D3DRM_OK, "Cannot get texture coordinates (hr = %x)\n", hr); + ok(valu == 0.0f, "Wrong coordinate %f (must be 0.0)\n", valu); + ok(valv == 0.0f, "Wrong coordinate %f (must be 0.0)\n", valv); + hr = IDirect3DRMMeshBuilder3_GetTextureCoordinates(pMeshBuilder3, 4, &valu, &valv); + ok(hr == D3DRMERR_BADVALUE, "Should fail and return D3DRM_BADVALUE (hr = %x)\n", hr); valu = 1.23f; valv = 3.21f; -- 2.11.4.GIT