d3dx9: Implement D3DXFrameFind().

Signed-off-by: Nikolay Sivov <nsivov@codeweavers.com>
Signed-off-by: Matteo Bruni <mbruni@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Nikolay Sivov 2017-11-06 13:31:10 +03:00 committed by Alexandre Julliard
parent 63e3179c64
commit 6bae0a003e
22 changed files with 176 additions and 20 deletions

View File

@ -132,7 +132,7 @@
@ stub D3DXFrameAppendChild(ptr ptr)
@ stub D3DXFrameCalculateBoundingSphere(ptr ptr ptr)
@ stdcall D3DXFrameDestroy(ptr ptr)
@ stub D3DXFrameFind(ptr str)
@ stdcall D3DXFrameFind(ptr str)
@ stub D3DXFrameNumNamedMatrices(ptr)
@ stub D3DXFrameRegisterNamedMatrices(ptr ptr)
@ stdcall D3DXFresnelTerm(float float)

View File

@ -132,7 +132,7 @@
@ stub D3DXFrameAppendChild(ptr ptr)
@ stub D3DXFrameCalculateBoundingSphere(ptr ptr ptr)
@ stdcall D3DXFrameDestroy(ptr ptr)
@ stub D3DXFrameFind(ptr str)
@ stdcall D3DXFrameFind(ptr str)
@ stub D3DXFrameNumNamedMatrices(ptr)
@ stub D3DXFrameRegisterNamedMatrices(ptr ptr)
@ stdcall D3DXFresnelTerm(float float)

View File

@ -136,7 +136,7 @@
@ stub D3DXFrameAppendChild(ptr ptr)
@ stub D3DXFrameCalculateBoundingSphere(ptr ptr ptr)
@ stdcall D3DXFrameDestroy(ptr ptr)
@ stub D3DXFrameFind(ptr str)
@ stdcall D3DXFrameFind(ptr str)
@ stub D3DXFrameNumNamedMatrices(ptr)
@ stub D3DXFrameRegisterNamedMatrices(ptr ptr)
@ stdcall D3DXFresnelTerm(float float)

View File

@ -136,7 +136,7 @@
@ stub D3DXFrameAppendChild(ptr ptr)
@ stub D3DXFrameCalculateBoundingSphere(ptr ptr ptr)
@ stdcall D3DXFrameDestroy(ptr ptr)
@ stub D3DXFrameFind(ptr str)
@ stdcall D3DXFrameFind(ptr str)
@ stub D3DXFrameNumNamedMatrices(ptr)
@ stub D3DXFrameRegisterNamedMatrices(ptr ptr)
@ stdcall D3DXFresnelTerm(float float)

View File

@ -136,7 +136,7 @@
@ stub D3DXFrameAppendChild(ptr ptr)
@ stub D3DXFrameCalculateBoundingSphere(ptr ptr ptr)
@ stdcall D3DXFrameDestroy(ptr ptr)
@ stub D3DXFrameFind(ptr str)
@ stdcall D3DXFrameFind(ptr str)
@ stub D3DXFrameNumNamedMatrices(ptr)
@ stub D3DXFrameRegisterNamedMatrices(ptr ptr)
@ stdcall D3DXFresnelTerm(float float)

View File

@ -136,7 +136,7 @@
@ stub D3DXFrameAppendChild(ptr ptr)
@ stub D3DXFrameCalculateBoundingSphere(ptr ptr ptr)
@ stdcall D3DXFrameDestroy(ptr ptr)
@ stub D3DXFrameFind(ptr str)
@ stdcall D3DXFrameFind(ptr str)
@ stub D3DXFrameNumNamedMatrices(ptr)
@ stub D3DXFrameRegisterNamedMatrices(ptr ptr)
@ stdcall D3DXFresnelTerm(float float)

View File

@ -136,7 +136,7 @@
@ stub D3DXFrameAppendChild(ptr ptr)
@ stub D3DXFrameCalculateBoundingSphere(ptr ptr ptr)
@ stdcall D3DXFrameDestroy(ptr ptr)
@ stub D3DXFrameFind(ptr str)
@ stdcall D3DXFrameFind(ptr str)
@ stub D3DXFrameNumNamedMatrices(ptr)
@ stub D3DXFrameRegisterNamedMatrices(ptr ptr)
@ stdcall D3DXFresnelTerm(float float)

View File

@ -135,7 +135,7 @@
@ stub D3DXFrameAppendChild(ptr ptr)
@ stub D3DXFrameCalculateBoundingSphere(ptr ptr ptr)
@ stdcall D3DXFrameDestroy(ptr ptr)
@ stub D3DXFrameFind(ptr str)
@ stdcall D3DXFrameFind(ptr str)
@ stub D3DXFrameNumNamedMatrices(ptr)
@ stub D3DXFrameRegisterNamedMatrices(ptr ptr)
@ stdcall D3DXFresnelTerm(float float)

View File

@ -135,7 +135,7 @@
@ stub D3DXFrameAppendChild(ptr ptr)
@ stub D3DXFrameCalculateBoundingSphere(ptr ptr ptr)
@ stdcall D3DXFrameDestroy(ptr ptr)
@ stub D3DXFrameFind(ptr str)
@ stdcall D3DXFrameFind(ptr str)
@ stub D3DXFrameNumNamedMatrices(ptr)
@ stub D3DXFrameRegisterNamedMatrices(ptr ptr)
@ stdcall D3DXFresnelTerm(float float)

View File

@ -135,7 +135,7 @@
@ stub D3DXFrameAppendChild(ptr ptr)
@ stub D3DXFrameCalculateBoundingSphere(ptr ptr ptr)
@ stdcall D3DXFrameDestroy(ptr ptr)
@ stub D3DXFrameFind(ptr str)
@ stdcall D3DXFrameFind(ptr str)
@ stub D3DXFrameNumNamedMatrices(ptr)
@ stub D3DXFrameRegisterNamedMatrices(ptr ptr)
@ stdcall D3DXFresnelTerm(float float)

View File

@ -135,7 +135,7 @@
@ stub D3DXFrameAppendChild(ptr ptr)
@ stub D3DXFrameCalculateBoundingSphere(ptr ptr ptr)
@ stdcall D3DXFrameDestroy(ptr ptr)
@ stub D3DXFrameFind(ptr str)
@ stdcall D3DXFrameFind(ptr str)
@ stub D3DXFrameNumNamedMatrices(ptr)
@ stub D3DXFrameRegisterNamedMatrices(ptr ptr)
@ stdcall D3DXFresnelTerm(float float)

View File

@ -135,7 +135,7 @@
@ stub D3DXFrameAppendChild(ptr ptr)
@ stub D3DXFrameCalculateBoundingSphere(ptr ptr ptr)
@ stdcall D3DXFrameDestroy(ptr ptr)
@ stub D3DXFrameFind(ptr str)
@ stdcall D3DXFrameFind(ptr str)
@ stub D3DXFrameNumNamedMatrices(ptr)
@ stub D3DXFrameRegisterNamedMatrices(ptr ptr)
@ stdcall D3DXFresnelTerm(float float)

View File

@ -136,7 +136,7 @@
@ stub D3DXFrameAppendChild(ptr ptr)
@ stub D3DXFrameCalculateBoundingSphere(ptr ptr ptr)
@ stdcall D3DXFrameDestroy(ptr ptr)
@ stub D3DXFrameFind(ptr str)
@ stdcall D3DXFrameFind(ptr str)
@ stub D3DXFrameNumNamedMatrices(ptr)
@ stub D3DXFrameRegisterNamedMatrices(ptr ptr)
@ stdcall D3DXFresnelTerm(float float)

View File

@ -7555,3 +7555,83 @@ HRESULT WINAPI D3DXConvertMeshSubsetToSingleStrip(struct ID3DXBaseMesh *mesh_in,
return E_NOTIMPL;
}
struct frame_node
{
struct list entry;
D3DXFRAME *frame;
};
static BOOL queue_frame_node(struct list *queue, D3DXFRAME *frame)
{
struct frame_node *node;
if (!frame->pFrameFirstChild)
return TRUE;
node = HeapAlloc(GetProcessHeap(), 0, sizeof(*node));
if (!node)
return FALSE;
node->frame = frame;
list_add_tail(queue, &node->entry);
return TRUE;
}
static void empty_frame_queue(struct list *queue)
{
struct frame_node *cur, *cur2;
LIST_FOR_EACH_ENTRY_SAFE(cur, cur2, queue, struct frame_node, entry)
{
list_remove(&cur->entry);
HeapFree(GetProcessHeap(), 0, cur);
}
}
D3DXFRAME * WINAPI D3DXFrameFind(const D3DXFRAME *root, const char *name)
{
D3DXFRAME *found = NULL, *frame;
struct list queue;
TRACE("root frame %p, name %s.\n", root, debugstr_a(name));
if (!root)
return NULL;
list_init(&queue);
frame = (D3DXFRAME *)root;
for (;;)
{
struct frame_node *node;
while (frame)
{
if ((name && frame->Name && !strcmp(frame->Name, name)) || (!name && !frame->Name))
{
found = frame;
goto cleanup;
}
if (!queue_frame_node(&queue, frame))
goto cleanup;
frame = frame->pFrameSibling;
}
if (list_empty(&queue))
break;
node = LIST_ENTRY(list_head(&queue), struct frame_node, entry);
list_remove(&node->entry);
frame = node->frame->pFrameFirstChild;
HeapFree(GetProcessHeap(), 0, node);
}
cleanup:
empty_frame_queue(&queue);
return found;
}

View File

@ -11188,6 +11188,81 @@ static void D3DXCreateAnimationControllerTest(void)
animation->lpVtbl->Release(animation);
}
static void test_D3DXFrameFind(void)
{
static char n1[] = "name1";
static char n2[] = "name2";
static char n3[] = "name3";
static char n4[] = "name4";
static char n5[] = "name5";
static char n6[] = "name6";
static char N1[] = "Name1";
D3DXFRAME root, sibling, sibling2, child, *ret;
D3DXFRAME child2, child3;
ret = D3DXFrameFind(NULL, NULL);
ok(ret == NULL, "Unexpected frame, %p.\n", ret);
ret = D3DXFrameFind(NULL, "test");
ok(ret == NULL, "Unexpected frame, %p.\n", ret);
memset(&root, 0, sizeof(root));
ret = D3DXFrameFind(&root, NULL);
ok(ret == &root, "Unexpected frame, %p.\n", ret);
root.Name = n1;
ret = D3DXFrameFind(&root, NULL);
ok(ret == NULL, "Unexpected frame, %p.\n", ret);
ret = D3DXFrameFind(&root, n1);
ok(ret == &root, "Unexpected frame, %p.\n", ret);
ret = D3DXFrameFind(&root, N1);
ok(ret == NULL, "Unexpected frame, %p.\n", ret);
/* Test siblings order traversal. */
memset(&sibling, 0, sizeof(sibling));
sibling.Name = n2;
root.pFrameSibling = &sibling;
ret = D3DXFrameFind(&root, n2);
ok(ret == &sibling, "Unexpected frame, %p.\n", ret);
memset(&sibling2, 0, sizeof(sibling2));
sibling2.Name = n2;
sibling.pFrameSibling = &sibling2;
ret = D3DXFrameFind(&root, n2);
ok(ret == &sibling, "Unexpected frame, %p.\n", ret);
sibling2.Name = n3;
ret = D3DXFrameFind(&root, n3);
ok(ret == &sibling2, "Unexpected frame, %p.\n", ret);
/* Siblings first. */
memset(&child, 0, sizeof(child));
child.Name = n2;
root.pFrameFirstChild = &child;
ret = D3DXFrameFind(&root, n2);
ok(ret == &sibling, "Unexpected frame, %p.\n", ret);
child.Name = n4;
ret = D3DXFrameFind(&root, n4);
ok(ret == &child, "Unexpected frame, %p.\n", ret);
/* Link a grandchild and another one for sibling. */
memset(&child2, 0, sizeof(child2));
memset(&child3, 0, sizeof(child3));
child2.Name = child3.Name = n5;
sibling.pFrameFirstChild = &child2;
child.pFrameFirstChild = &child3;
ret = D3DXFrameFind(&root, n5);
ok(ret == &child2, "Unexpected frame, %p.\n", ret);
child3.Name = n6;
ret = D3DXFrameFind(&root, n6);
ok(ret == &child3, "Unexpected frame, %p.\n", ret);
}
START_TEST(mesh)
{
D3DXBoundProbeTest();
@ -11218,4 +11293,5 @@ START_TEST(mesh)
test_valid_mesh();
test_optimize_faces();
test_compute_normals();
test_D3DXFrameFind();
}

View File

@ -136,7 +136,7 @@
@ stub D3DXFrameAppendChild(ptr ptr)
@ stub D3DXFrameCalculateBoundingSphere(ptr ptr ptr)
@ stdcall D3DXFrameDestroy(ptr ptr)
@ stub D3DXFrameFind(ptr str)
@ stdcall D3DXFrameFind(ptr str)
@ stub D3DXFrameNumNamedMatrices(ptr)
@ stub D3DXFrameRegisterNamedMatrices(ptr ptr)
@ stdcall D3DXFresnelTerm(float float)

View File

@ -136,7 +136,7 @@
@ stub D3DXFrameAppendChild(ptr ptr)
@ stub D3DXFrameCalculateBoundingSphere(ptr ptr ptr)
@ stdcall D3DXFrameDestroy(ptr ptr)
@ stub D3DXFrameFind(ptr str)
@ stdcall D3DXFrameFind(ptr str)
@ stub D3DXFrameNumNamedMatrices(ptr)
@ stub D3DXFrameRegisterNamedMatrices(ptr ptr)
@ stdcall D3DXFresnelTerm(float float)

View File

@ -136,7 +136,7 @@
@ stub D3DXFrameAppendChild(ptr ptr)
@ stub D3DXFrameCalculateBoundingSphere(ptr ptr ptr)
@ stdcall D3DXFrameDestroy(ptr ptr)
@ stub D3DXFrameFind(ptr str)
@ stdcall D3DXFrameFind(ptr str)
@ stub D3DXFrameNumNamedMatrices(ptr)
@ stub D3DXFrameRegisterNamedMatrices(ptr ptr)
@ stdcall D3DXFresnelTerm(float float)

View File

@ -136,7 +136,7 @@
@ stub D3DXFrameAppendChild(ptr ptr)
@ stub D3DXFrameCalculateBoundingSphere(ptr ptr ptr)
@ stdcall D3DXFrameDestroy(ptr ptr)
@ stub D3DXFrameFind(ptr str)
@ stdcall D3DXFrameFind(ptr str)
@ stub D3DXFrameNumNamedMatrices(ptr)
@ stub D3DXFrameRegisterNamedMatrices(ptr ptr)
@ stdcall D3DXFresnelTerm(float float)

View File

@ -136,7 +136,7 @@
@ stub D3DXFrameAppendChild(ptr ptr)
@ stub D3DXFrameCalculateBoundingSphere(ptr ptr ptr)
@ stdcall D3DXFrameDestroy(ptr ptr)
@ stub D3DXFrameFind(ptr str)
@ stdcall D3DXFrameFind(ptr str)
@ stub D3DXFrameNumNamedMatrices(ptr)
@ stub D3DXFrameRegisterNamedMatrices(ptr ptr)
@ stdcall D3DXFresnelTerm(float float)

View File

@ -134,7 +134,7 @@
@ stub D3DXFrameAppendChild(ptr ptr)
@ stub D3DXFrameCalculateBoundingSphere(ptr ptr ptr)
@ stdcall D3DXFrameDestroy(ptr ptr)
@ stub D3DXFrameFind(ptr str)
@ stdcall D3DXFrameFind(ptr str)
@ stub D3DXFrameNumNamedMatrices(ptr)
@ stub D3DXFrameRegisterNamedMatrices(ptr ptr)
@ stdcall D3DXFresnelTerm(float float)

View File

@ -134,7 +134,7 @@
@ stub D3DXFrameAppendChild(ptr ptr)
@ stub D3DXFrameCalculateBoundingSphere(ptr ptr ptr)
@ stdcall D3DXFrameDestroy(ptr ptr)
@ stub D3DXFrameFind(ptr str)
@ stdcall D3DXFrameFind(ptr str)
@ stub D3DXFrameNumNamedMatrices(ptr)
@ stub D3DXFrameRegisterNamedMatrices(ptr ptr)
@ stdcall D3DXFresnelTerm(float float)