This is similar to [this commit](https://gitlab.winehq.org/wine/wine/-/commit/1dcc3ab292151cd91ea4202b92107c3...) for [bug 48529](https://bugs.winehq.org/show_bug.cgi?id=48529).
This makes Pikachu Volleyball 3D playable with builtin d3dx9.
From: Gijs Vermeulen gijsvrm@gmail.com
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=28635 --- dlls/d3dx9_36/mesh.c | 1 - 1 file changed, 1 deletion(-)
diff --git a/dlls/d3dx9_36/mesh.c b/dlls/d3dx9_36/mesh.c index f033ac14cb7..ff56736ec8d 100644 --- a/dlls/d3dx9_36/mesh.c +++ b/dlls/d3dx9_36/mesh.c @@ -1656,7 +1656,6 @@ static HRESULT WINAPI d3dx9_mesh_OptimizeInplace(ID3DXMesh *iface, DWORD flags, FIXME("D3DXMESHOPT_VERTEXCACHE not implemented.\n"); if (flags & D3DXMESHOPT_STRIPREORDER) FIXME("D3DXMESHOPT_STRIPREORDER not implemented.\n"); - return E_NOTIMPL; }
hr = iface->lpVtbl->LockIndexBuffer(iface, 0, &indices);
From: Gijs Vermeulen gijsvrm@gmail.com
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=28635 --- 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 | 6 ++++++ 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 +- 21 files changed, 26 insertions(+), 20 deletions(-)
diff --git a/dlls/d3dx9_24/d3dx9_24.spec b/dlls/d3dx9_24/d3dx9_24.spec index 8791e4ec044..c4c11841dfb 100644 --- a/dlls/d3dx9_24/d3dx9_24.spec +++ b/dlls/d3dx9_24/d3dx9_24.spec @@ -130,7 +130,7 @@ @ stdcall D3DXFloat16To32Array(ptr ptr long) @ stdcall D3DXFloat32To16Array(ptr ptr long) @ stub D3DXFrameAppendChild(ptr ptr) -@ stub D3DXFrameCalculateBoundingSphere(ptr ptr ptr) +@ stdcall D3DXFrameCalculateBoundingSphere(ptr ptr ptr) @ stdcall D3DXFrameDestroy(ptr ptr) @ stdcall D3DXFrameFind(ptr str) @ stub D3DXFrameNumNamedMatrices(ptr) diff --git a/dlls/d3dx9_25/d3dx9_25.spec b/dlls/d3dx9_25/d3dx9_25.spec index 0431a9f7f75..675f5b30a8d 100644 --- a/dlls/d3dx9_25/d3dx9_25.spec +++ b/dlls/d3dx9_25/d3dx9_25.spec @@ -130,7 +130,7 @@ @ stdcall D3DXFloat16To32Array(ptr ptr long) @ stdcall D3DXFloat32To16Array(ptr ptr long) @ stub D3DXFrameAppendChild(ptr ptr) -@ stub D3DXFrameCalculateBoundingSphere(ptr ptr ptr) +@ stdcall D3DXFrameCalculateBoundingSphere(ptr ptr ptr) @ stdcall D3DXFrameDestroy(ptr ptr) @ stdcall D3DXFrameFind(ptr str) @ stub D3DXFrameNumNamedMatrices(ptr) diff --git a/dlls/d3dx9_26/d3dx9_26.spec b/dlls/d3dx9_26/d3dx9_26.spec index 5ab0a1d9fea..302dc869a12 100644 --- a/dlls/d3dx9_26/d3dx9_26.spec +++ b/dlls/d3dx9_26/d3dx9_26.spec @@ -134,7 +134,7 @@ @ stdcall D3DXFloat16To32Array(ptr ptr long) @ stdcall D3DXFloat32To16Array(ptr ptr long) @ stub D3DXFrameAppendChild(ptr ptr) -@ stub D3DXFrameCalculateBoundingSphere(ptr ptr ptr) +@ stdcall D3DXFrameCalculateBoundingSphere(ptr ptr ptr) @ stdcall D3DXFrameDestroy(ptr ptr) @ stdcall D3DXFrameFind(ptr str) @ stub D3DXFrameNumNamedMatrices(ptr) diff --git a/dlls/d3dx9_27/d3dx9_27.spec b/dlls/d3dx9_27/d3dx9_27.spec index 5ab0a1d9fea..302dc869a12 100644 --- a/dlls/d3dx9_27/d3dx9_27.spec +++ b/dlls/d3dx9_27/d3dx9_27.spec @@ -134,7 +134,7 @@ @ stdcall D3DXFloat16To32Array(ptr ptr long) @ stdcall D3DXFloat32To16Array(ptr ptr long) @ stub D3DXFrameAppendChild(ptr ptr) -@ stub D3DXFrameCalculateBoundingSphere(ptr ptr ptr) +@ stdcall D3DXFrameCalculateBoundingSphere(ptr ptr ptr) @ stdcall D3DXFrameDestroy(ptr ptr) @ stdcall D3DXFrameFind(ptr str) @ stub D3DXFrameNumNamedMatrices(ptr) diff --git a/dlls/d3dx9_28/d3dx9_28.spec b/dlls/d3dx9_28/d3dx9_28.spec index af5b6077202..0559c534b6b 100644 --- a/dlls/d3dx9_28/d3dx9_28.spec +++ b/dlls/d3dx9_28/d3dx9_28.spec @@ -134,7 +134,7 @@ @ stdcall D3DXFloat16To32Array(ptr ptr long) @ stdcall D3DXFloat32To16Array(ptr ptr long) @ stub D3DXFrameAppendChild(ptr ptr) -@ stub D3DXFrameCalculateBoundingSphere(ptr ptr ptr) +@ stdcall D3DXFrameCalculateBoundingSphere(ptr ptr ptr) @ stdcall D3DXFrameDestroy(ptr ptr) @ stdcall D3DXFrameFind(ptr str) @ stub D3DXFrameNumNamedMatrices(ptr) diff --git a/dlls/d3dx9_29/d3dx9_29.spec b/dlls/d3dx9_29/d3dx9_29.spec index af5b6077202..0559c534b6b 100644 --- a/dlls/d3dx9_29/d3dx9_29.spec +++ b/dlls/d3dx9_29/d3dx9_29.spec @@ -134,7 +134,7 @@ @ stdcall D3DXFloat16To32Array(ptr ptr long) @ stdcall D3DXFloat32To16Array(ptr ptr long) @ stub D3DXFrameAppendChild(ptr ptr) -@ stub D3DXFrameCalculateBoundingSphere(ptr ptr ptr) +@ stdcall D3DXFrameCalculateBoundingSphere(ptr ptr ptr) @ stdcall D3DXFrameDestroy(ptr ptr) @ stdcall D3DXFrameFind(ptr str) @ stub D3DXFrameNumNamedMatrices(ptr) diff --git a/dlls/d3dx9_30/d3dx9_30.spec b/dlls/d3dx9_30/d3dx9_30.spec index af5b6077202..0559c534b6b 100644 --- a/dlls/d3dx9_30/d3dx9_30.spec +++ b/dlls/d3dx9_30/d3dx9_30.spec @@ -134,7 +134,7 @@ @ stdcall D3DXFloat16To32Array(ptr ptr long) @ stdcall D3DXFloat32To16Array(ptr ptr long) @ stub D3DXFrameAppendChild(ptr ptr) -@ stub D3DXFrameCalculateBoundingSphere(ptr ptr ptr) +@ stdcall D3DXFrameCalculateBoundingSphere(ptr ptr ptr) @ stdcall D3DXFrameDestroy(ptr ptr) @ stdcall D3DXFrameFind(ptr str) @ stub D3DXFrameNumNamedMatrices(ptr) diff --git a/dlls/d3dx9_31/d3dx9_31.spec b/dlls/d3dx9_31/d3dx9_31.spec index 8f77dc666a2..528443d829c 100644 --- a/dlls/d3dx9_31/d3dx9_31.spec +++ b/dlls/d3dx9_31/d3dx9_31.spec @@ -133,7 +133,7 @@ @ stdcall D3DXFloat16To32Array(ptr ptr long) @ stdcall D3DXFloat32To16Array(ptr ptr long) @ stub D3DXFrameAppendChild(ptr ptr) -@ stub D3DXFrameCalculateBoundingSphere(ptr ptr ptr) +@ stdcall D3DXFrameCalculateBoundingSphere(ptr ptr ptr) @ stdcall D3DXFrameDestroy(ptr ptr) @ stdcall D3DXFrameFind(ptr str) @ stub D3DXFrameNumNamedMatrices(ptr) diff --git a/dlls/d3dx9_32/d3dx9_32.spec b/dlls/d3dx9_32/d3dx9_32.spec index 2fdd2a00615..63fc1d38f52 100644 --- a/dlls/d3dx9_32/d3dx9_32.spec +++ b/dlls/d3dx9_32/d3dx9_32.spec @@ -133,7 +133,7 @@ @ stdcall D3DXFloat16To32Array(ptr ptr long) @ stdcall D3DXFloat32To16Array(ptr ptr long) @ stub D3DXFrameAppendChild(ptr ptr) -@ stub D3DXFrameCalculateBoundingSphere(ptr ptr ptr) +@ stdcall D3DXFrameCalculateBoundingSphere(ptr ptr ptr) @ stdcall D3DXFrameDestroy(ptr ptr) @ stdcall D3DXFrameFind(ptr str) @ stub D3DXFrameNumNamedMatrices(ptr) diff --git a/dlls/d3dx9_33/d3dx9_33.spec b/dlls/d3dx9_33/d3dx9_33.spec index 2fdd2a00615..63fc1d38f52 100644 --- a/dlls/d3dx9_33/d3dx9_33.spec +++ b/dlls/d3dx9_33/d3dx9_33.spec @@ -133,7 +133,7 @@ @ stdcall D3DXFloat16To32Array(ptr ptr long) @ stdcall D3DXFloat32To16Array(ptr ptr long) @ stub D3DXFrameAppendChild(ptr ptr) -@ stub D3DXFrameCalculateBoundingSphere(ptr ptr ptr) +@ stdcall D3DXFrameCalculateBoundingSphere(ptr ptr ptr) @ stdcall D3DXFrameDestroy(ptr ptr) @ stdcall D3DXFrameFind(ptr str) @ stub D3DXFrameNumNamedMatrices(ptr) diff --git a/dlls/d3dx9_34/d3dx9_34.spec b/dlls/d3dx9_34/d3dx9_34.spec index 2fdd2a00615..63fc1d38f52 100644 --- a/dlls/d3dx9_34/d3dx9_34.spec +++ b/dlls/d3dx9_34/d3dx9_34.spec @@ -133,7 +133,7 @@ @ stdcall D3DXFloat16To32Array(ptr ptr long) @ stdcall D3DXFloat32To16Array(ptr ptr long) @ stub D3DXFrameAppendChild(ptr ptr) -@ stub D3DXFrameCalculateBoundingSphere(ptr ptr ptr) +@ stdcall D3DXFrameCalculateBoundingSphere(ptr ptr ptr) @ stdcall D3DXFrameDestroy(ptr ptr) @ stdcall D3DXFrameFind(ptr str) @ stub D3DXFrameNumNamedMatrices(ptr) diff --git a/dlls/d3dx9_35/d3dx9_35.spec b/dlls/d3dx9_35/d3dx9_35.spec index 2fdd2a00615..63fc1d38f52 100644 --- a/dlls/d3dx9_35/d3dx9_35.spec +++ b/dlls/d3dx9_35/d3dx9_35.spec @@ -133,7 +133,7 @@ @ stdcall D3DXFloat16To32Array(ptr ptr long) @ stdcall D3DXFloat32To16Array(ptr ptr long) @ stub D3DXFrameAppendChild(ptr ptr) -@ stub D3DXFrameCalculateBoundingSphere(ptr ptr ptr) +@ stdcall D3DXFrameCalculateBoundingSphere(ptr ptr ptr) @ stdcall D3DXFrameDestroy(ptr ptr) @ stdcall D3DXFrameFind(ptr str) @ stub D3DXFrameNumNamedMatrices(ptr) diff --git a/dlls/d3dx9_36/d3dx9_36.spec b/dlls/d3dx9_36/d3dx9_36.spec index 5b7070145de..4e2100a8fc8 100644 --- a/dlls/d3dx9_36/d3dx9_36.spec +++ b/dlls/d3dx9_36/d3dx9_36.spec @@ -134,7 +134,7 @@ @ stdcall D3DXFloat16To32Array(ptr ptr long) @ stdcall D3DXFloat32To16Array(ptr ptr long) @ stub D3DXFrameAppendChild(ptr ptr) -@ stub D3DXFrameCalculateBoundingSphere(ptr ptr ptr) +@ stdcall D3DXFrameCalculateBoundingSphere(ptr ptr ptr) @ stdcall D3DXFrameDestroy(ptr ptr) @ stdcall D3DXFrameFind(ptr str) @ stub D3DXFrameNumNamedMatrices(ptr) diff --git a/dlls/d3dx9_36/mesh.c b/dlls/d3dx9_36/mesh.c index ff56736ec8d..1f49c15d07d 100644 --- a/dlls/d3dx9_36/mesh.c +++ b/dlls/d3dx9_36/mesh.c @@ -7667,3 +7667,9 @@ cleanup:
return found; } + +HRESULT WINAPI D3DXFrameCalculateBoundingSphere(const D3DXFRAME *frame_root, D3DXVECTOR3 *center, FLOAT *radius) +{ + FIXME("(%p, %p, %p) stub!\n", frame_root, center, radius); + return E_NOTIMPL; +} diff --git a/dlls/d3dx9_37/d3dx9_37.spec b/dlls/d3dx9_37/d3dx9_37.spec index 5b7070145de..4e2100a8fc8 100644 --- a/dlls/d3dx9_37/d3dx9_37.spec +++ b/dlls/d3dx9_37/d3dx9_37.spec @@ -134,7 +134,7 @@ @ stdcall D3DXFloat16To32Array(ptr ptr long) @ stdcall D3DXFloat32To16Array(ptr ptr long) @ stub D3DXFrameAppendChild(ptr ptr) -@ stub D3DXFrameCalculateBoundingSphere(ptr ptr ptr) +@ stdcall D3DXFrameCalculateBoundingSphere(ptr ptr ptr) @ stdcall D3DXFrameDestroy(ptr ptr) @ stdcall D3DXFrameFind(ptr str) @ stub D3DXFrameNumNamedMatrices(ptr) diff --git a/dlls/d3dx9_38/d3dx9_38.spec b/dlls/d3dx9_38/d3dx9_38.spec index 5b7070145de..4e2100a8fc8 100644 --- a/dlls/d3dx9_38/d3dx9_38.spec +++ b/dlls/d3dx9_38/d3dx9_38.spec @@ -134,7 +134,7 @@ @ stdcall D3DXFloat16To32Array(ptr ptr long) @ stdcall D3DXFloat32To16Array(ptr ptr long) @ stub D3DXFrameAppendChild(ptr ptr) -@ stub D3DXFrameCalculateBoundingSphere(ptr ptr ptr) +@ stdcall D3DXFrameCalculateBoundingSphere(ptr ptr ptr) @ stdcall D3DXFrameDestroy(ptr ptr) @ stdcall D3DXFrameFind(ptr str) @ stub D3DXFrameNumNamedMatrices(ptr) diff --git a/dlls/d3dx9_39/d3dx9_39.spec b/dlls/d3dx9_39/d3dx9_39.spec index 5b7070145de..4e2100a8fc8 100644 --- a/dlls/d3dx9_39/d3dx9_39.spec +++ b/dlls/d3dx9_39/d3dx9_39.spec @@ -134,7 +134,7 @@ @ stdcall D3DXFloat16To32Array(ptr ptr long) @ stdcall D3DXFloat32To16Array(ptr ptr long) @ stub D3DXFrameAppendChild(ptr ptr) -@ stub D3DXFrameCalculateBoundingSphere(ptr ptr ptr) +@ stdcall D3DXFrameCalculateBoundingSphere(ptr ptr ptr) @ stdcall D3DXFrameDestroy(ptr ptr) @ stdcall D3DXFrameFind(ptr str) @ stub D3DXFrameNumNamedMatrices(ptr) diff --git a/dlls/d3dx9_40/d3dx9_40.spec b/dlls/d3dx9_40/d3dx9_40.spec index 5b7070145de..4e2100a8fc8 100644 --- a/dlls/d3dx9_40/d3dx9_40.spec +++ b/dlls/d3dx9_40/d3dx9_40.spec @@ -134,7 +134,7 @@ @ stdcall D3DXFloat16To32Array(ptr ptr long) @ stdcall D3DXFloat32To16Array(ptr ptr long) @ stub D3DXFrameAppendChild(ptr ptr) -@ stub D3DXFrameCalculateBoundingSphere(ptr ptr ptr) +@ stdcall D3DXFrameCalculateBoundingSphere(ptr ptr ptr) @ stdcall D3DXFrameDestroy(ptr ptr) @ stdcall D3DXFrameFind(ptr str) @ stub D3DXFrameNumNamedMatrices(ptr) diff --git a/dlls/d3dx9_41/d3dx9_41.spec b/dlls/d3dx9_41/d3dx9_41.spec index 5b7070145de..4e2100a8fc8 100644 --- a/dlls/d3dx9_41/d3dx9_41.spec +++ b/dlls/d3dx9_41/d3dx9_41.spec @@ -134,7 +134,7 @@ @ stdcall D3DXFloat16To32Array(ptr ptr long) @ stdcall D3DXFloat32To16Array(ptr ptr long) @ stub D3DXFrameAppendChild(ptr ptr) -@ stub D3DXFrameCalculateBoundingSphere(ptr ptr ptr) +@ stdcall D3DXFrameCalculateBoundingSphere(ptr ptr ptr) @ stdcall D3DXFrameDestroy(ptr ptr) @ stdcall D3DXFrameFind(ptr str) @ stub D3DXFrameNumNamedMatrices(ptr) diff --git a/dlls/d3dx9_42/d3dx9_42.spec b/dlls/d3dx9_42/d3dx9_42.spec index 4a418d1508a..67e8b050a43 100644 --- a/dlls/d3dx9_42/d3dx9_42.spec +++ b/dlls/d3dx9_42/d3dx9_42.spec @@ -132,7 +132,7 @@ @ stdcall D3DXFloat16To32Array(ptr ptr long) @ stdcall D3DXFloat32To16Array(ptr ptr long) @ stub D3DXFrameAppendChild(ptr ptr) -@ stub D3DXFrameCalculateBoundingSphere(ptr ptr ptr) +@ stdcall D3DXFrameCalculateBoundingSphere(ptr ptr ptr) @ stdcall D3DXFrameDestroy(ptr ptr) @ stdcall D3DXFrameFind(ptr str) @ stub D3DXFrameNumNamedMatrices(ptr) diff --git a/dlls/d3dx9_43/d3dx9_43.spec b/dlls/d3dx9_43/d3dx9_43.spec index 4a418d1508a..67e8b050a43 100644 --- a/dlls/d3dx9_43/d3dx9_43.spec +++ b/dlls/d3dx9_43/d3dx9_43.spec @@ -132,7 +132,7 @@ @ stdcall D3DXFloat16To32Array(ptr ptr long) @ stdcall D3DXFloat32To16Array(ptr ptr long) @ stub D3DXFrameAppendChild(ptr ptr) -@ stub D3DXFrameCalculateBoundingSphere(ptr ptr ptr) +@ stdcall D3DXFrameCalculateBoundingSphere(ptr ptr ptr) @ stdcall D3DXFrameDestroy(ptr ptr) @ stdcall D3DXFrameFind(ptr str) @ stub D3DXFrameNumNamedMatrices(ptr)
Matteo Bruni (@Mystral) commented about dlls/d3dx9_36/mesh.c:
FIXME("D3DXMESHOPT_VERTEXCACHE not implemented.\n"); if (flags & D3DXMESHOPT_STRIPREORDER) FIXME("D3DXMESHOPT_STRIPREORDER not implemented.\n");
return E_NOTIMPL;
As opposed to 1dcc3ab292151cd91ea4202b92107c3a91527c7a, not reordering faces (vs vertices) in the order expected by the game is not safe in general.
Matteo Bruni (@Mystral) commented about dlls/d3dx9_36/mesh.c:
return found;
}
+HRESULT WINAPI D3DXFrameCalculateBoundingSphere(const D3DXFRAME *frame_root, D3DXVECTOR3 *center, FLOAT *radius) +{
- FIXME("(%p, %p, %p) stub!\n", frame_root, center, radius);
- return E_NOTIMPL;
It shouldn't be too hard to implement this one, in theory. Basically, compute the min and max x, y, z coordinates over the vertices of the transformed mesh. The midpoint in the 3 coordinates will be the center, while the radius is the distance from the center to min(x, y, z) (or max(x, y, z), they should match).
I haven't checked that all that's required to get the transformed mesh is already in place, but at a quick look it looks like the basic functionality is there at least.
On Tue Jul 11 20:10:11 2023 +0000, Matteo Bruni wrote:
As opposed to 1dcc3ab292151cd91ea4202b92107c3a91527c7a, not reordering faces (vs vertices) in the order expected by the game is not safe in general.
@Mystral The game actually only uses `D3DXMESHOPT_VERTEXCACHE` and not `D3DXMESHOPT_STRIPREORDER`, but I guess only removing the `E_NOTIMPL` for that is not safe either?
On Tue Jul 11 20:10:12 2023 +0000, Matteo Bruni wrote:
It shouldn't be too hard to implement this one, in theory. Basically, compute the min and max x, y, z coordinates over the vertices of the transformed mesh. The midpoint in the 3 coordinates will be the center, while the radius is the distance from the center to min(x, y, z) (or max(x, y, z), they should match). I haven't checked that all that's required to get the transformed mesh is already in place, but at a quick look it looks like the basic functionality is there at least.
I'll try and see if I can get this done.
On Tue Jul 11 20:28:11 2023 +0000, Gijs Vermeulen wrote:
@Mystral The game actually only uses `D3DXMESHOPT_VERTEXCACHE` and not `D3DXMESHOPT_STRIPREORDER`, but I guess only removing the `E_NOTIMPL` for that is not safe either?
Yeah, according to https://learn.microsoft.com/en-us/windows/win32/direct3d9/d3dxmeshopt they both affect face ordering, at least.