Christian Costa : d3drm: If there is no texture coordinates in loaded mesh, generate default texture coordinates for each vertex.

Alexandre Julliard julliard at winehq.org
Fri Mar 16 11:27:49 CDT 2012


Module: wine
Branch: master
Commit: b89c32b2a12f78572da336d982aa53b8c8bb99d0
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=b89c32b2a12f78572da336d982aa53b8c8bb99d0

Author: Christian Costa <titan.costa at gmail.com>
Date:   Fri Mar 16 08:16:18 2012 +0100

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 e9d0e67..43ce2d6 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 1732db6..341519b 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;




More information about the wine-cvs mailing list