[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