From: Alistair Leslie-Hughes Subject: [PATCH] d3dx9_36: Supplying a AnimationController isn't an error Message-Id: Date: Mon, 26 Oct 2015 19:56:15 +1100 In-Reply-To: <1445849778-3086-1-git-send-email-leslie_alistair@hotmail.com> References: <1445849778-3086-1-git-send-email-leslie_alistair@hotmail.com> D3DXLoadMeshHierarchyFromXInMemory will only return an AnimationController when the xfile has an AnimationSet node. The current examples will return a NULL AnimationController. Signed-off-by: Alistair Leslie-Hughes --- dlls/d3dx9_36/mesh.c | 10 +++++++--- dlls/d3dx9_36/tests/mesh.c | 27 +++++++++++++++++++++++++++ 2 files changed, 34 insertions(+), 3 deletions(-) diff --git a/dlls/d3dx9_36/mesh.c b/dlls/d3dx9_36/mesh.c index 39d279d..5d2963c 100644 --- a/dlls/d3dx9_36/mesh.c +++ b/dlls/d3dx9_36/mesh.c @@ -3912,11 +3912,9 @@ HRESULT WINAPI D3DXLoadMeshHierarchyFromXInMemory(const void *memory, DWORD memo if (!memory || !memory_size || !device || !frame_hierarchy || !alloc_hier) return D3DERR_INVALIDCALL; - if (load_user_data || anim_controller) { + if (load_user_data) { if (load_user_data) FIXME("Loading user data not implemented\n"); - if (anim_controller) - FIXME("Animation controller creation not implemented\n"); return E_NOTIMPL; } @@ -3986,6 +3984,12 @@ HRESULT WINAPI D3DXLoadMeshHierarchyFromXInMemory(const void *memory, DWORD memo hr = D3D_OK; } + if (anim_controller) { + *anim_controller = NULL; + + FIXME("Animation controller creation not implemented\n"); + } + cleanup: if (FAILED(hr) && first_frame) D3DXFrameDestroy(first_frame, alloc_hier); if (filedata) filedata->lpVtbl->Release(filedata); diff --git a/dlls/d3dx9_36/tests/mesh.c b/dlls/d3dx9_36/tests/mesh.c index 4186e19..36dabfb 100644 --- a/dlls/d3dx9_36/tests/mesh.c +++ b/dlls/d3dx9_36/tests/mesh.c @@ -2225,6 +2225,7 @@ static void D3DXLoadMeshTest(void) D3DXFRAME *frame_hier = NULL; D3DXMATRIX transform; struct test_context *test_context; + struct ID3DXAnimationController *controller; if (!(test_context = new_test_context())) { @@ -2281,6 +2282,32 @@ static void D3DXLoadMeshTest(void) frame_hier = NULL; } + controller = (void *)0xdeadbeef; + hr = D3DXLoadMeshHierarchyFromXInMemory(simple_xfile, sizeof(simple_xfile) - 1, + D3DXMESH_MANAGED, device, &alloc_hier, NULL, &frame_hier, &controller); + ok(hr == D3D_OK, "Expected D3D_OK, got %#x\n", hr); + if (SUCCEEDED(hr)) { + D3DXMESHCONTAINER *container = frame_hier->pMeshContainer; + + ok(!controller, "Animation Controller not NULL\n"); + ok(frame_hier->Name == NULL, "Expected NULL, got '%s'\n", frame_hier->Name); + D3DXMatrixIdentity(&transform); + check_matrix(&frame_hier->TransformationMatrix, &transform); + + ok(!strcmp(container->Name, ""), "Expected '', got '%s'\n", container->Name); + ok(container->MeshData.Type == D3DXMESHTYPE_MESH, "Expected %d, got %d\n", + D3DXMESHTYPE_MESH, container->MeshData.Type); + mesh = U(container->MeshData).pMesh; + check_vertex_buffer(mesh, simple_vertex_buffer, ARRAY_SIZE(simple_vertex_buffer), simple_fvf); + check_index_buffer(mesh, simple_index_buffer, ARRAY_SIZE(simple_index_buffer), sizeof(*simple_index_buffer)); + check_materials(container->pMaterials, container->NumMaterials, NULL, 0); + check_generated_effects(container->pMaterials, container->NumMaterials, container->pEffects); + check_generated_adjacency(mesh, container->pAdjacency, 0.0f); + hr = D3DXFrameDestroy(frame_hier, &alloc_hier); + ok(hr == D3D_OK, "Expected D3D_OK, got %#x\n", hr); + frame_hier = NULL; + } + hr = D3DXLoadMeshHierarchyFromXInMemory(box_xfile, sizeof(box_xfile) - 1, D3DXMESH_MANAGED, device, &alloc_hier, NULL, &frame_hier, NULL); ok(hr == D3D_OK, "Expected D3D_OK, got %#x\n", hr); -- 1.9.1