[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