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

Nikolay Sivov nsivov at codeweavers.com
Sun Jun 11 10:52:26 CDT 2017


Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
---
 dlls/d3drm/tests/d3drm.c | 198 ++++++++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 196 insertions(+), 2 deletions(-)

diff --git a/dlls/d3drm/tests/d3drm.c b/dlls/d3drm/tests/d3drm.c
index d5c1bcd0a2..c1054386d3 100644
--- a/dlls/d3drm/tests/d3drm.c
+++ b/dlls/d3drm/tests/d3drm.c
@@ -282,15 +282,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];
@@ -560,6 +563,70 @@ 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 retrieve 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 retrieve 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);
+    check_vector(v, 1.0f, 2.0f, 3.0f, 0);
+
+    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);
 }
 
@@ -703,6 +770,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;
 
@@ -728,6 +796,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 unexpected color 0x%08x.\n", color);
+
     IDirect3DRMFace_Release(face1);
 
     if (FAILED(hr = IDirect3DRM_QueryInterface(d3drm, &IID_IDirect3DRM2, (void **)&d3drm2)))
@@ -6599,6 +6683,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);
+    check_vector(n, 0.0f, 0.0f, 0.0f, 0);
+
+    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);
+    check_vector(v, 7.0f, 8.0f, 9.0f, 0);
+    check_vector(n, 0.0f, 0.0f, 0.0f, 0);
+
+    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 retrieve face, %#x.\n", hr);
+
+    hr = IDirect3DRMMeshBuilder3_DeleteFace(mesh_builder3, face2);
+    ok(SUCCEEDED(hr), "Failed to delete 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();
@@ -6633,4 +6826,5 @@ START_TEST(d3drm)
     test_viewport_clear1();
     test_viewport_clear2();
     test_create_texture_from_surface();
+    test_add_vertex_normal_indexed();
 }
-- 
2.11.0




More information about the wine-patches mailing list