From: Nikolay Sivov Subject: [PATCH 3/3] d3drm/tests: Some tests for mesh builder and faces Message-Id: <20170608233650.17162-3-nsivov@codeweavers.com> Date: Fri, 9 Jun 2017 02:36:50 +0300 In-Reply-To: <20170608233650.17162-1-nsivov@codeweavers.com> References: <20170608233650.17162-1-nsivov@codeweavers.com> Signed-off-by: Nikolay Sivov --- 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