From 6bae0a003e893072ab2b636d5b6c982d76b39f36 Mon Sep 17 00:00:00 2001 From: Nikolay Sivov Date: Mon, 6 Nov 2017 13:31:10 +0300 Subject: [PATCH] d3dx9: Implement D3DXFrameFind(). Signed-off-by: Nikolay Sivov Signed-off-by: Matteo Bruni Signed-off-by: Alexandre Julliard --- dlls/d3dx9_24/d3dx9_24.spec | 2 +- dlls/d3dx9_25/d3dx9_25.spec | 2 +- dlls/d3dx9_26/d3dx9_26.spec | 2 +- dlls/d3dx9_27/d3dx9_27.spec | 2 +- dlls/d3dx9_28/d3dx9_28.spec | 2 +- dlls/d3dx9_29/d3dx9_29.spec | 2 +- dlls/d3dx9_30/d3dx9_30.spec | 2 +- dlls/d3dx9_31/d3dx9_31.spec | 2 +- dlls/d3dx9_32/d3dx9_32.spec | 2 +- dlls/d3dx9_33/d3dx9_33.spec | 2 +- dlls/d3dx9_34/d3dx9_34.spec | 2 +- dlls/d3dx9_35/d3dx9_35.spec | 2 +- dlls/d3dx9_36/d3dx9_36.spec | 2 +- dlls/d3dx9_36/mesh.c | 80 +++++++++++++++++++++++++++++++++++++ dlls/d3dx9_36/tests/mesh.c | 76 +++++++++++++++++++++++++++++++++++ dlls/d3dx9_37/d3dx9_37.spec | 2 +- dlls/d3dx9_38/d3dx9_38.spec | 2 +- dlls/d3dx9_39/d3dx9_39.spec | 2 +- dlls/d3dx9_40/d3dx9_40.spec | 2 +- dlls/d3dx9_41/d3dx9_41.spec | 2 +- dlls/d3dx9_42/d3dx9_42.spec | 2 +- dlls/d3dx9_43/d3dx9_43.spec | 2 +- 22 files changed, 176 insertions(+), 20 deletions(-) diff --git a/dlls/d3dx9_24/d3dx9_24.spec b/dlls/d3dx9_24/d3dx9_24.spec index b524fadf93d..0ca8777efe6 100644 --- a/dlls/d3dx9_24/d3dx9_24.spec +++ b/dlls/d3dx9_24/d3dx9_24.spec @@ -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) diff --git a/dlls/d3dx9_25/d3dx9_25.spec b/dlls/d3dx9_25/d3dx9_25.spec index 9344e44d687..a5449810a43 100644 --- a/dlls/d3dx9_25/d3dx9_25.spec +++ b/dlls/d3dx9_25/d3dx9_25.spec @@ -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) diff --git a/dlls/d3dx9_26/d3dx9_26.spec b/dlls/d3dx9_26/d3dx9_26.spec index 7a28ca6e7ee..9e1200442f4 100644 --- a/dlls/d3dx9_26/d3dx9_26.spec +++ b/dlls/d3dx9_26/d3dx9_26.spec @@ -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) diff --git a/dlls/d3dx9_27/d3dx9_27.spec b/dlls/d3dx9_27/d3dx9_27.spec index 7a28ca6e7ee..9e1200442f4 100644 --- a/dlls/d3dx9_27/d3dx9_27.spec +++ b/dlls/d3dx9_27/d3dx9_27.spec @@ -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) diff --git a/dlls/d3dx9_28/d3dx9_28.spec b/dlls/d3dx9_28/d3dx9_28.spec index da49c9e23b5..b316a23baf1 100644 --- a/dlls/d3dx9_28/d3dx9_28.spec +++ b/dlls/d3dx9_28/d3dx9_28.spec @@ -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) diff --git a/dlls/d3dx9_29/d3dx9_29.spec b/dlls/d3dx9_29/d3dx9_29.spec index da49c9e23b5..b316a23baf1 100644 --- a/dlls/d3dx9_29/d3dx9_29.spec +++ b/dlls/d3dx9_29/d3dx9_29.spec @@ -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) diff --git a/dlls/d3dx9_30/d3dx9_30.spec b/dlls/d3dx9_30/d3dx9_30.spec index c8648fb984f..e00fa547862 100644 --- a/dlls/d3dx9_30/d3dx9_30.spec +++ b/dlls/d3dx9_30/d3dx9_30.spec @@ -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) diff --git a/dlls/d3dx9_31/d3dx9_31.spec b/dlls/d3dx9_31/d3dx9_31.spec index 7f881ddaf8e..d308939ef67 100644 --- a/dlls/d3dx9_31/d3dx9_31.spec +++ b/dlls/d3dx9_31/d3dx9_31.spec @@ -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) diff --git a/dlls/d3dx9_32/d3dx9_32.spec b/dlls/d3dx9_32/d3dx9_32.spec index 2f51ece333d..c2292dff396 100644 --- a/dlls/d3dx9_32/d3dx9_32.spec +++ b/dlls/d3dx9_32/d3dx9_32.spec @@ -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) diff --git a/dlls/d3dx9_33/d3dx9_33.spec b/dlls/d3dx9_33/d3dx9_33.spec index 2f51ece333d..c2292dff396 100644 --- a/dlls/d3dx9_33/d3dx9_33.spec +++ b/dlls/d3dx9_33/d3dx9_33.spec @@ -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) diff --git a/dlls/d3dx9_34/d3dx9_34.spec b/dlls/d3dx9_34/d3dx9_34.spec index 2f51ece333d..c2292dff396 100644 --- a/dlls/d3dx9_34/d3dx9_34.spec +++ b/dlls/d3dx9_34/d3dx9_34.spec @@ -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) diff --git a/dlls/d3dx9_35/d3dx9_35.spec b/dlls/d3dx9_35/d3dx9_35.spec index 2f51ece333d..c2292dff396 100644 --- a/dlls/d3dx9_35/d3dx9_35.spec +++ b/dlls/d3dx9_35/d3dx9_35.spec @@ -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) diff --git a/dlls/d3dx9_36/d3dx9_36.spec b/dlls/d3dx9_36/d3dx9_36.spec index 0408ff9ffd0..0fdf4e135e1 100644 --- a/dlls/d3dx9_36/d3dx9_36.spec +++ b/dlls/d3dx9_36/d3dx9_36.spec @@ -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) diff --git a/dlls/d3dx9_36/mesh.c b/dlls/d3dx9_36/mesh.c index c26aa7271f0..6294ce624fe 100644 --- a/dlls/d3dx9_36/mesh.c +++ b/dlls/d3dx9_36/mesh.c @@ -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; +} diff --git a/dlls/d3dx9_36/tests/mesh.c b/dlls/d3dx9_36/tests/mesh.c index 95dd06e4662..d0b1adb00e8 100644 --- a/dlls/d3dx9_36/tests/mesh.c +++ b/dlls/d3dx9_36/tests/mesh.c @@ -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(); } diff --git a/dlls/d3dx9_37/d3dx9_37.spec b/dlls/d3dx9_37/d3dx9_37.spec index 0408ff9ffd0..0fdf4e135e1 100644 --- a/dlls/d3dx9_37/d3dx9_37.spec +++ b/dlls/d3dx9_37/d3dx9_37.spec @@ -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) diff --git a/dlls/d3dx9_38/d3dx9_38.spec b/dlls/d3dx9_38/d3dx9_38.spec index 0408ff9ffd0..0fdf4e135e1 100644 --- a/dlls/d3dx9_38/d3dx9_38.spec +++ b/dlls/d3dx9_38/d3dx9_38.spec @@ -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) diff --git a/dlls/d3dx9_39/d3dx9_39.spec b/dlls/d3dx9_39/d3dx9_39.spec index 0408ff9ffd0..0fdf4e135e1 100644 --- a/dlls/d3dx9_39/d3dx9_39.spec +++ b/dlls/d3dx9_39/d3dx9_39.spec @@ -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) diff --git a/dlls/d3dx9_40/d3dx9_40.spec b/dlls/d3dx9_40/d3dx9_40.spec index 0408ff9ffd0..0fdf4e135e1 100644 --- a/dlls/d3dx9_40/d3dx9_40.spec +++ b/dlls/d3dx9_40/d3dx9_40.spec @@ -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) diff --git a/dlls/d3dx9_41/d3dx9_41.spec b/dlls/d3dx9_41/d3dx9_41.spec index 0408ff9ffd0..0fdf4e135e1 100644 --- a/dlls/d3dx9_41/d3dx9_41.spec +++ b/dlls/d3dx9_41/d3dx9_41.spec @@ -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) diff --git a/dlls/d3dx9_42/d3dx9_42.spec b/dlls/d3dx9_42/d3dx9_42.spec index 23bb40d7b11..2f2ac5fd619 100644 --- a/dlls/d3dx9_42/d3dx9_42.spec +++ b/dlls/d3dx9_42/d3dx9_42.spec @@ -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) diff --git a/dlls/d3dx9_43/d3dx9_43.spec b/dlls/d3dx9_43/d3dx9_43.spec index 23bb40d7b11..2f2ac5fd619 100644 --- a/dlls/d3dx9_43/d3dx9_43.spec +++ b/dlls/d3dx9_43/d3dx9_43.spec @@ -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)