[PATCH 3/3] d3drm/tests: Some tests for mesh builder and faces

Nikolay Sivov nsivov at codeweavers.com
Thu Jun 8 18:36:50 CDT 2017


Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
---
 dlls/d3drm/tests/d3drm.c | 213 ++++++++++++++++++++++++++++++++++++++++++++++-
 include/d3drmobj.h       |   4 +-
 2 files changed, 213 insertions(+), 4 deletions(-)

diff --git a/dlls/d3drm/tests/d3drm.c b/dlls/d3drm/tests/d3drm.c
index ccbc9a62d7..e70614ae29 100644
--- a/dlls/d3drm/tests/d3drm.c
+++ b/dlls/d3drm/tests/d3drm.c
@@ -62,6 +62,19 @@ static HWND create_window(void)
             CW_USEDEFAULT, CW_USEDEFAULT, r.right - r.left, r.bottom - r.top, NULL, NULL, NULL, NULL);
 }
 
+#define test_vector_eq(a, b, c, d) test_vector_eq_(__LINE__, a, b, c, d)
+static void test_vector_eq_(unsigned int line, D3DVECTOR *v, float x, float y, float z)
+{
+    D3DVECTOR right;
+
+    U1(right).x = x;
+    U2(right).y = y;
+    U3(right).z = z;
+
+    ok_(__FILE__, line)(!memcmp(v, &right, sizeof(*v)), "Unexpected vector data, (%f, %f, %f).\n",
+        U1(v)->x, U2(v)->y, U3(v)->z);
+}
+
 #define test_class_name(a, b) test_class_name_(__LINE__, a, b)
 static void test_class_name_(unsigned int line, IDirect3DRMObject *object, const char *name)
 {
@@ -252,15 +265,18 @@ static char data_frame_mesh_materials[] =
 
 static void test_MeshBuilder(void)
 {
+    IDirect3DRMMeshBuilder *pMeshBuilder, *mesh_builder;
+    IDirect3DRMMeshBuilder2 *mesh_builder2;
+    IDirect3DRMFace *face, *face1;
     HRESULT hr;
     IDirect3DRM *d3drm;
-    IDirect3DRMMeshBuilder *pMeshBuilder;
     IDirect3DRMMeshBuilder3 *meshbuilder3;
     IDirect3DRMMesh *mesh;
     D3DRMLOADMEMORY info;
-    int val;
+    int val, count;
     DWORD val1, val2, val3;
     D3DVALUE valu, valv;
+    ULONG ref, ref1;
     D3DVECTOR v[3];
     D3DVECTOR n[4];
     DWORD f[8];
@@ -561,6 +577,72 @@ static void test_MeshBuilder(void)
 
     IDirect3DRMMeshBuilder_Release(pMeshBuilder);
 
+    /* Face manipulation */
+    hr = IDirect3DRM_CreateMeshBuilder(d3drm, &mesh_builder);
+    ok(SUCCEEDED(hr), "Failed to create a mesh builder, hr %#x.\n", hr);
+
+    hr = IDirect3DRMMeshBuilder_QueryInterface(mesh_builder, &IID_IDirect3DRMMeshBuilder2, (void **)&mesh_builder2);
+    ok(SUCCEEDED(hr), "Failed to get IDirect3DRMMeshBuilder2, hr %#x.\n", hr);
+
+    hr = IDirect3DRMMeshBuilder_CreateFace(mesh_builder, &face);
+    ok(SUCCEEDED(hr), "Failed to create a face, hr %#x.\n", hr);
+    CHECK_REFCOUNT(face, 1);
+
+    hr = IDirect3DRMMeshBuilder2_GetFace(mesh_builder2, 0, &face1);
+todo_wine
+    ok(SUCCEEDED(hr), "Failed to get a face, hr %#x.\n", hr);
+if (hr == S_OK)
+{
+    ok(face1 == face, "Unexpected face pointer.\n");
+    IDirect3DRMFace_Release(face1);
+
+    count = IDirect3DRMMeshBuilder_GetFaceCount(mesh_builder);
+    ok(count == 1, "Unexpected face count %d.\n", count);
+
+    /* CreateFace() already added this face. */
+    hr = IDirect3DRMMeshBuilder_AddFace(mesh_builder, face);
+    ok(hr == D3DRMERR_FACEUSED, "Got unexpected hr %#x.\n", hr);
+
+    count = IDirect3DRMMeshBuilder_GetFaceCount(mesh_builder);
+    ok(count == 1, "Unexpected face count %d.\n", count);
+
+    hr = IDirect3DRMFace_AddVertex(face, 1.0f, 2.0f, 3.0f);
+    ok(SUCCEEDED(hr), "Failed to add a vertex, hr %#x.\n", hr);
+
+    ref = IDirect3DRMFace_Release(face);
+    ok(ref == 0, "Unexpected ref count %u.\n", ref);
+
+    count = IDirect3DRMMeshBuilder_GetFaceCount(mesh_builder);
+    ok(count == 1, "Unexpected face count %d.\n", count);
+
+    hr = IDirect3DRMMeshBuilder2_GetFace(mesh_builder2, 0, &face1);
+    ok(SUCCEEDED(hr), "Failed to get a face, hr %#x.\n", hr);
+    ok(face1 != face, "Unexpected face pointer.\n");
+
+    memset(v, 0, sizeof(v));
+    hr = IDirect3DRMFace_GetVertex(face1, 0, v, n);
+    ok(SUCCEEDED(hr), "Failed to get vertex data, hr %#x.\n", hr);
+    ok(U1(v[0]).x == 1.0f, "Wrong component v[0].x = %f (expected %f)\n", U1(v[0]).x, 1.0f);
+    ok(U2(v[0]).y == 2.0f, "Wrong component v[0].y = %f (expected %f)\n", U2(v[0]).y, 2.0f);
+    ok(U3(v[0]).z == 3.0f, "Wrong component v[0].z = %f (expected %f)\n", U3(v[0]).z, 3.0f);
+
+    IDirect3DRMFace_Release(face1);
+
+    /* Check mesh builder refcount after adding a face. */
+    hr = IDirect3DRM_CreateFace(d3drm, &face1);
+    ok(SUCCEEDED(hr), "Failed to create a face, hr %#x.\n", hr);
+
+    ref = get_refcount((IUnknown *)mesh_builder);
+    hr = IDirect3DRMMeshBuilder_AddFace(mesh_builder, face1);
+    ok(SUCCEEDED(hr), "Failed to add a face, hr %#x.\n", hr);
+    ref1 = get_refcount((IUnknown *)mesh_builder);
+    ok(ref1 == ref, "Expected mesh builder refcount unchanged.\n");
+
+    IDirect3DRMFace_Release(face1);
+}
+    IDirect3DRMMeshBuilder2_Release(mesh_builder2);
+    IDirect3DRMMeshBuilder_Release(mesh_builder);
+
     IDirect3DRM_Release(d3drm);
 }
 
@@ -704,6 +786,7 @@ static void test_Face(void)
     IDirect3DRMFaceArray *array1;
     D3DRMLOADMEMORY info;
     D3DVECTOR v1[4], n1[4], v2[4], n2[4];
+    D3DCOLOR color;
     DWORD count;
     int icount;
 
@@ -729,6 +812,22 @@ static void test_Face(void)
     icount = IDirect3DRMFace_GetVertexCount(face1);
     ok(!icount, "wrong VertexCount: %i\n", icount);
 
+    hr = IDirect3DRMFace_SetColor(face1, 0xff00ff00);
+todo_wine
+    ok(SUCCEEDED(hr), "Failed to set color, hr %#x.\n", hr);
+
+    hr = IDirect3DRMFace_AddVertex(face1, 1.0f, 2.0f, 3.0f);
+todo_wine
+    ok(SUCCEEDED(hr), "Failed to add a vertex, %#x.\n", hr);
+
+    hr = IDirect3DRMFace_AddVertexAndNormalIndexed(face1, 0, 0);
+todo_wine
+    ok(hr == D3DRMERR_NOTFOUND, "Got unexpected hr %#x.\n", hr);
+
+    color = IDirect3DRMFace_GetColor(face1);
+todo_wine
+    ok(color == 0xff00ff00, "Got wrong color, %#x.\n", color);
+
     IDirect3DRMFace_Release(face1);
 
     if (FAILED(hr = IDirect3DRM_QueryInterface(d3drm, &IID_IDirect3DRM2, (void **)&d3drm2)))
@@ -6629,6 +6728,115 @@ static void test_create_texture_from_surface(void)
     IDirectDraw_Release(ddraw);
 }
 
+static void test_add_vertex_normal_indexed(void)
+{
+    IDirect3DRMMeshBuilder3 *mesh_builder3;
+    IDirect3DRMMeshBuilder *mesh_builder;
+    IDirect3DRMFace2 *face2;
+    IDirect3DRMFace *face;
+    D3DVECTOR v[1], n[1];
+    IDirect3DRM *d3drm;
+    int count, index;
+    HRESULT hr;
+
+    hr = Direct3DRMCreate(&d3drm);
+    ok(SUCCEEDED(hr), "Failed to create IDirect3DRM interface, hr %#x.\n", hr);
+
+    hr = IDirect3DRM_CreateMeshBuilder(d3drm, &mesh_builder);
+    ok(SUCCEEDED(hr), "Failed to create a mesh builder, hr %#x.\n", hr);
+
+    hr = IDirect3DRMMeshBuilder_QueryInterface(mesh_builder, &IID_IDirect3DRMMeshBuilder3, (void **)&mesh_builder3);
+    ok(SUCCEEDED(hr), "Failed to get IDirect3DRMMeshBuilder3, hr %#x.\n", hr);
+
+    hr = IDirect3DRMMeshBuilder_CreateFace(mesh_builder, &face);
+    ok(SUCCEEDED(hr), "Failed to create a face, hr %#x.\n", hr);
+
+    hr = IDirect3DRMFace_AddVertexAndNormalIndexed(face, 0, 0);
+todo_wine
+    ok(hr == D3DRMERR_BADVALUE, "Got unexpected hr %#x.\n", hr);
+
+    count = IDirect3DRMMeshBuilder3_GetNormalCount(mesh_builder3);
+    ok(count == 0, "Unexpected normal count, %d.\n", count);
+
+    hr = IDirect3DRMFace_AddVertex(face, 1.0f, 2.0f, 3.0f);
+todo_wine
+    ok(SUCCEEDED(hr), "Failed to add a vertex, hr %#x.\n", hr);
+
+if (hr == S_OK)
+{
+    count = IDirect3DRMMeshBuilder_GetVertexCount(mesh_builder);
+    ok(count == 1, "Unexpected vertex count, %d.\n", count);
+
+    count = IDirect3DRMMeshBuilder3_GetNormalCount(mesh_builder3);
+    ok(count == 1, "Unexpected normal count, %d.\n", count);
+
+    index = IDirect3DRMMeshBuilder_AddVertex(mesh_builder, 4.0f, 5.0f, 6.0f);
+    ok(index == 1, "Unexpected vertex index, %d.\n", index);
+
+    count = IDirect3DRMMeshBuilder3_GetNormalCount(mesh_builder3);
+    ok(count == 1, "Unexpected normal count, %d.\n", count);
+
+    hr = IDirect3DRMFace_AddVertexAndNormalIndexed(face, 0, 0);
+    ok(SUCCEEDED(hr), "Failed to add vertex/normal, hr %#x.\n", hr);
+
+    count = IDirect3DRMMeshBuilder3_GetNormalCount(mesh_builder3);
+    ok(count == 1, "Unexpected normal count, %d.\n", count);
+
+    memset(n, 0xcc, sizeof(n));
+    hr = IDirect3DRMMeshBuilder3_GetNormal(mesh_builder3, 0, n);
+    ok(SUCCEEDED(hr), "Failed to get normal, %#x.\n", hr);
+    test_vector_eq(n, 0.0f, 0.0f, 0.0f);
+
+    index = IDirect3DRMMeshBuilder_AddNormal(mesh_builder, 1.0f, 0.0f, 0.0f);
+    ok(index == 1, "Unexpected vertex index, %d.\n", index);
+
+    hr = IDirect3DRMFace_AddVertexAndNormalIndexed(face, 0, 0);
+    ok(SUCCEEDED(hr), "Failed to add vertex and normal, hr %#x.\n", hr);
+
+    index = IDirect3DRMMeshBuilder_AddVertex(mesh_builder, 7.0f, 8.0f, 9.0f);
+    ok(index == 2, "Unexpected vertex index, %d.\n", index);
+
+    index = IDirect3DRMMeshBuilder_AddVertex(mesh_builder, 10.0f, 11.0f, 12.0f);
+    ok(index == 3, "Unexpected vertex index, %d.\n", index);
+
+    hr = IDirect3DRMFace_AddVertexAndNormalIndexed(face, 2, 0);
+    ok(SUCCEEDED(hr), "Failed to add vertex and normal, hr %#x.\n", hr);
+
+    /* Builder has 3 vertices, 0 and 2 are used, now remove 1st one. */
+    hr = IDirect3DRMMeshBuilder3_DeleteVertices(mesh_builder3, 1, 1);
+    ok(SUCCEEDED(hr), "Failed to delete vertices, hr %#x.\n", hr);
+
+    memset(v, 0xcc, sizeof(v));
+    memset(n, 0xcc, sizeof(n));
+    hr = IDirect3DRMFace_GetVertex(face, 3, v, n);
+    ok(SUCCEEDED(hr), "Failed to get a vertex, hr %#x.\n", hr);
+    test_vector_eq(v, 7.0f, 8.0f, 9.0f);
+    test_vector_eq(n, 0.0f, 0.0f, 0.0f);
+
+    hr = IDirect3DRMMeshBuilder3_DeleteVertices(mesh_builder3, 0, 1);
+    ok(hr == D3DRMERR_ELEMENTINUSE, "Got unexpected hr %#x.\n", hr);
+
+    IDirect3DRMFace_Release(face);
+
+    hr = IDirect3DRMMeshBuilder3_DeleteVertices(mesh_builder3, 0, 1);
+    ok(hr == D3DRMERR_ELEMENTINUSE, "Got unexpected hr %#x.\n", hr);
+
+    hr = IDirect3DRMMeshBuilder3_GetFace(mesh_builder3, 0, &face2);
+    ok(SUCCEEDED(hr), "Failed to delete a face, %#x.\n", hr);
+
+    hr = IDirect3DRMMeshBuilder3_DeleteFace(mesh_builder3, face2);
+    ok(SUCCEEDED(hr), "Failed to delete a face, %#x.\n", hr);
+    IDirect3DRMFace2_Release(face2);
+
+    hr = IDirect3DRMMeshBuilder3_DeleteVertices(mesh_builder3, 0, 1);
+    ok(SUCCEEDED(hr), "Failed to delete vertices, hr %#x.\n", hr);
+}
+    IDirect3DRMMeshBuilder3_Release(mesh_builder3);
+    IDirect3DRMMeshBuilder_Release(mesh_builder);
+
+    IDirect3DRM_Release(d3drm);
+}
+
 START_TEST(d3drm)
 {
     test_MeshBuilder();
@@ -6663,4 +6871,5 @@ START_TEST(d3drm)
     test_viewport_clear1();
     test_viewport_clear2();
     test_create_texture_from_surface();
+    test_add_vertex_normal_indexed();
 }
diff --git a/include/d3drmobj.h b/include/d3drmobj.h
index dc1ba0881e..b181bd29e5 100644
--- a/include/d3drmobj.h
+++ b/include/d3drmobj.h
@@ -2335,7 +2335,7 @@ DECLARE_INTERFACE_(IDirect3DRMFace,IDirect3DRMObject)
 #define IDirect3DRMFace_GetVertexCount(p)                 (p)->lpVtbl->GetVertexCount(p)
 #define IDirect3DRMFace_GetVertexIndex(p,a)               (p)->lpVtbl->GetVertexIndex(p,a)
 #define IDirect3DRMFace_GetTextureCoordinateIndex(p,a)    (p)->lpVtbl->GetTextureCoordinateIndex(p,a)
-#define IDirect3DRMFace_GetColor(p,a)                     (p)->lpVtbl->GetColor(p,a)
+#define IDirect3DRMFace_GetColor(p)                       (p)->lpVtbl->GetColor(p)
 #else
 /*** IUnknown methods ***/
 #define IDirect3DRMFace_QueryInterface(p,a,b)             (p)->QueryInterface(a,b)
@@ -2368,7 +2368,7 @@ DECLARE_INTERFACE_(IDirect3DRMFace,IDirect3DRMObject)
 #define IDirect3DRMFace_GetVertexCount(p)                 (p)->GetVertexCount()
 #define IDirect3DRMFace_GetVertexIndex(p,a)               (p)->GetVertexIndex(a)
 #define IDirect3DRMFace_GetTextureCoordinateIndex(p,a)    (p)->GetTextureCoordinateIndex(a)
-#define IDirect3DRMFace_GetColor(p,a)                     (p)->GetColor(a)
+#define IDirect3DRMFace_GetColor(p)                       (p)->GetColor()
 #endif
 
 /*****************************************************************************
-- 
2.11.0




More information about the wine-patches mailing list