Files
wine-staging/patches/d3drm-starwars/0001-d3drm-IDirect3DRMMeshBuilder2-Clone-stub.patch
Alistair Leslie-Hughes 31b114a4e3 Added d3drm-starwars patchset
This stops the crash but doesn't show the battle at all.

Patchset shows what is needed (as a minimum), to be
implemented in order for it to work correctly.
2025-10-16 17:40:42 +11:00

110 lines
4.6 KiB
Diff

From 4abe3ab87631c7bb6144437ff2e1473030d033cb Mon Sep 17 00:00:00 2001
From: Alistair Leslie-Hughes <leslie_alistair@hotmail.com>
Date: Fri, 13 May 2022 12:13:11 +1000
Subject: [PATCH] d3drm: IDirect3DRMMeshBuilder2 Clone stub
---
dlls/d3drm/meshbuilder.c | 85 +++++++++++++++++++++++++++++++++++++++-
1 file changed, 83 insertions(+), 2 deletions(-)
diff --git a/dlls/d3drm/meshbuilder.c b/dlls/d3drm/meshbuilder.c
index 27e76c1cf25..0c765d77281 100644
--- a/dlls/d3drm/meshbuilder.c
+++ b/dlls/d3drm/meshbuilder.c
@@ -402,9 +402,90 @@ static ULONG WINAPI d3drm_mesh_builder2_Release(IDirect3DRMMeshBuilder2 *iface)
static HRESULT WINAPI d3drm_mesh_builder2_Clone(IDirect3DRMMeshBuilder2 *iface,
IUnknown *outer, REFIID iid, void **out)
{
- FIXME("iface %p, outer %p, iid %s, out %p stub!\n", iface, outer, debugstr_guid(iid), out);
+ struct d3drm_mesh_builder *mesh_builder = impl_from_IDirect3DRMMeshBuilder2(iface);
+ struct d3drm_mesh_builder *mesh2;
+ HRESULT hr;
- return E_NOTIMPL;
+ FIXME("iface %p, outer %p, iid %s, out %p Semi-stub\n", iface, outer, debugstr_guid(iid), out);
+
+ if (outer)
+ FIXME("outer currently ignored\n");
+
+ *out = NULL;
+
+ hr = d3drm_mesh_builder_create(&mesh2, mesh_builder->d3drm);
+ if(SUCCEEDED(hr))
+ {
+ mesh2->nb_vertices = mesh_builder->nb_vertices;
+ mesh2->vertices_size = mesh_builder->vertices_size;
+ if (mesh_builder->vertices && mesh_builder->nb_vertices)
+ {
+ if (!d3drm_array_reserve((void **)&mesh2->vertices, &mesh_builder->vertices_size, mesh_builder->nb_vertices,
+ sizeof(*mesh_builder->vertices)))
+ {
+ IDirect3DRMMeshBuilder2_Release(&mesh2->IDirect3DRMMeshBuilder2_iface);
+ return E_OUTOFMEMORY;
+ }
+ memcpy(mesh2->vertices, mesh_builder->vertices, mesh_builder->nb_vertices * sizeof(*mesh_builder->vertices));
+ }
+
+ mesh2->nb_normals = mesh_builder->nb_normals;
+ mesh2->normals_size = mesh_builder->normals_size;
+ if (mesh_builder->normals && mesh_builder->nb_normals)
+ {
+ if (!d3drm_array_reserve((void **)&mesh2->normals, &mesh_builder->normals_size,
+ mesh_builder->nb_vertices, sizeof(*mesh_builder->normals)))
+ {
+ IDirect3DRMMeshBuilder2_Release(&mesh2->IDirect3DRMMeshBuilder2_iface);
+ return E_OUTOFMEMORY;
+ }
+ memcpy(mesh2->normals, mesh_builder->normals, mesh_builder->nb_normals * sizeof(*mesh_builder->normals));
+ }
+
+ mesh2->nb_faces = mesh_builder->nb_faces;
+ mesh2->face_data_size = mesh_builder->face_data_size;
+ if (mesh_builder->pFaceData && mesh_builder->face_data_size)
+ {
+ mesh2->pFaceData = malloc(mesh_builder->face_data_size * 2);
+ if(!mesh2->pFaceData)
+ {
+ IDirect3DRMMeshBuilder2_Release(&mesh2->IDirect3DRMMeshBuilder2_iface);
+ return E_OUTOFMEMORY;
+ }
+ memcpy(mesh2->pFaceData, mesh_builder->pFaceData, mesh_builder->face_data_size * 2);
+ }
+
+ mesh2->nb_coords2d = mesh_builder->nb_coords2d;
+ if (mesh_builder->pCoords2d && mesh_builder->nb_coords2d)
+ {
+ mesh2->pCoords2d = calloc(mesh_builder->nb_coords2d, sizeof(*mesh_builder->pCoords2d));
+ if (!mesh2->pCoords2d)
+ {
+ IDirect3DRMMeshBuilder2_Release(&mesh2->IDirect3DRMMeshBuilder2_iface);
+ return E_OUTOFMEMORY;
+ }
+ memcpy(mesh2->pCoords2d, mesh_builder->pCoords2d, mesh_builder->nb_coords2d * sizeof(*mesh_builder->pCoords2d));
+ }
+
+ mesh2->color = mesh_builder->color;
+ mesh2->material = mesh_builder->material;
+ if (mesh2->material)
+ IDirect3DRMTexture2_AddRef(mesh2->material);
+ mesh2->texture = mesh_builder->texture;
+ if (mesh2->texture)
+ IDirect3DRMTexture2_AddRef(mesh2->texture);
+ mesh2->nb_materials = mesh_builder->nb_materials;
+ if (mesh2->nb_materials > 0)
+ FIXME("materials NOT copied yet\n");
+ //struct mesh_material *materials;
+ //DWORD *material_indices;
+ mesh2->quality = mesh_builder->quality;
+
+ hr = IDirect3DRMMeshBuilder2_QueryInterface(&mesh2->IDirect3DRMMeshBuilder2_iface, iid, out);
+ IDirect3DRMMeshBuilder2_Release(&mesh2->IDirect3DRMMeshBuilder3_iface);
+ }
+
+ return hr;
}
static HRESULT WINAPI d3drm_mesh_builder2_AddDestroyCallback(IDirect3DRMMeshBuilder2 *iface,
--
2.45.2