d3dx9: Get rid of the ID3DXMeshImpl typedef.

This commit is contained in:
Henri Verbeet 2013-09-24 09:48:48 +02:00 committed by Alexandre Julliard
parent ffc66f471c
commit 778b644fc6
1 changed files with 185 additions and 176 deletions

View File

@ -47,7 +47,7 @@
WINE_DEFAULT_DEBUG_CHANNEL(d3dx);
typedef struct ID3DXMeshImpl
struct d3dx9_mesh
{
ID3DXMesh ID3DXMesh_iface;
LONG ref;
@ -67,7 +67,7 @@ typedef struct ID3DXMeshImpl
int attrib_buffer_lock_count;
DWORD attrib_table_size;
D3DXATTRIBUTERANGE *attrib_table;
} ID3DXMeshImpl;
};
const UINT d3dx_decltype_size[] =
{
@ -90,12 +90,12 @@ const UINT d3dx_decltype_size[] =
/* D3DDECLTYPE_FLOAT16_4 */ 4 * sizeof(D3DXFLOAT16),
};
static inline ID3DXMeshImpl *impl_from_ID3DXMesh(ID3DXMesh *iface)
static inline struct d3dx9_mesh *impl_from_ID3DXMesh(ID3DXMesh *iface)
{
return CONTAINING_RECORD(iface, ID3DXMeshImpl, ID3DXMesh_iface);
return CONTAINING_RECORD(iface, struct d3dx9_mesh, ID3DXMesh_iface);
}
static HRESULT WINAPI ID3DXMeshImpl_QueryInterface(ID3DXMesh *iface, REFIID riid, void **out)
static HRESULT WINAPI d3dx9_mesh_QueryInterface(ID3DXMesh *iface, REFIID riid, void **out)
{
TRACE("iface %p, riid %s, out %p.\n", iface, debugstr_guid(riid), out);
@ -113,47 +113,47 @@ static HRESULT WINAPI ID3DXMeshImpl_QueryInterface(ID3DXMesh *iface, REFIID riid
return E_NOINTERFACE;
}
static ULONG WINAPI ID3DXMeshImpl_AddRef(ID3DXMesh *iface)
static ULONG WINAPI d3dx9_mesh_AddRef(ID3DXMesh *iface)
{
ID3DXMeshImpl *This = impl_from_ID3DXMesh(iface);
struct d3dx9_mesh *mesh = impl_from_ID3DXMesh(iface);
ULONG refcount = InterlockedIncrement(&mesh->ref);
TRACE("(%p)->(): AddRef from %d\n", This, This->ref);
TRACE("%p increasing refcount to %u.\n", mesh, refcount);
return InterlockedIncrement(&This->ref);
return refcount;
}
static ULONG WINAPI ID3DXMeshImpl_Release(ID3DXMesh *iface)
static ULONG WINAPI d3dx9_mesh_Release(ID3DXMesh *iface)
{
ID3DXMeshImpl *This = impl_from_ID3DXMesh(iface);
ULONG ref = InterlockedDecrement(&This->ref);
struct d3dx9_mesh *mesh = impl_from_ID3DXMesh(iface);
ULONG refcount = InterlockedDecrement(&mesh->ref);
TRACE("(%p)->(): Release from %d\n", This, ref + 1);
TRACE("%p decreasing refcount to %u.\n", mesh, refcount);
if (!ref)
if (!refcount)
{
IDirect3DIndexBuffer9_Release(This->index_buffer);
IDirect3DVertexBuffer9_Release(This->vertex_buffer);
if (This->vertex_declaration)
IDirect3DVertexDeclaration9_Release(This->vertex_declaration);
IDirect3DDevice9_Release(This->device);
HeapFree(GetProcessHeap(), 0, This->attrib_buffer);
HeapFree(GetProcessHeap(), 0, This->attrib_table);
HeapFree(GetProcessHeap(), 0, This);
IDirect3DIndexBuffer9_Release(mesh->index_buffer);
IDirect3DVertexBuffer9_Release(mesh->vertex_buffer);
if (mesh->vertex_declaration)
IDirect3DVertexDeclaration9_Release(mesh->vertex_declaration);
IDirect3DDevice9_Release(mesh->device);
HeapFree(GetProcessHeap(), 0, mesh->attrib_buffer);
HeapFree(GetProcessHeap(), 0, mesh->attrib_table);
HeapFree(GetProcessHeap(), 0, mesh);
}
return ref;
return refcount;
}
/*** ID3DXBaseMesh ***/
static HRESULT WINAPI ID3DXMeshImpl_DrawSubset(ID3DXMesh *iface, DWORD attrib_id)
static HRESULT WINAPI d3dx9_mesh_DrawSubset(ID3DXMesh *iface, DWORD attrib_id)
{
ID3DXMeshImpl *This = impl_from_ID3DXMesh(iface);
struct d3dx9_mesh *This = impl_from_ID3DXMesh(iface);
HRESULT hr;
DWORD face_start;
DWORD face_end = 0;
DWORD vertex_size;
TRACE("(%p)->(%u)\n", This, attrib_id);
TRACE("iface %p, attrib_id %u.\n", iface, attrib_id);
if (!This->vertex_declaration)
{
@ -193,31 +193,31 @@ static HRESULT WINAPI ID3DXMeshImpl_DrawSubset(ID3DXMesh *iface, DWORD attrib_id
return D3D_OK;
}
static DWORD WINAPI ID3DXMeshImpl_GetNumFaces(ID3DXMesh *iface)
static DWORD WINAPI d3dx9_mesh_GetNumFaces(ID3DXMesh *iface)
{
ID3DXMeshImpl *This = impl_from_ID3DXMesh(iface);
struct d3dx9_mesh *mesh = impl_from_ID3DXMesh(iface);
TRACE("(%p)\n", This);
TRACE("iface %p.\n", iface);
return This->numfaces;
return mesh->numfaces;
}
static DWORD WINAPI ID3DXMeshImpl_GetNumVertices(ID3DXMesh *iface)
static DWORD WINAPI d3dx9_mesh_GetNumVertices(ID3DXMesh *iface)
{
ID3DXMeshImpl *This = impl_from_ID3DXMesh(iface);
struct d3dx9_mesh *mesh = impl_from_ID3DXMesh(iface);
TRACE("(%p)\n", This);
TRACE("iface %p.\n", iface);
return This->numvertices;
return mesh->numvertices;
}
static DWORD WINAPI ID3DXMeshImpl_GetFVF(ID3DXMesh *iface)
static DWORD WINAPI d3dx9_mesh_GetFVF(ID3DXMesh *iface)
{
ID3DXMeshImpl *This = impl_from_ID3DXMesh(iface);
struct d3dx9_mesh *mesh = impl_from_ID3DXMesh(iface);
TRACE("(%p)\n", This);
TRACE("iface %p.\n", iface);
return This->fvf;
return mesh->fvf;
}
static void copy_declaration(D3DVERTEXELEMENT9 *dst, const D3DVERTEXELEMENT9 *src, UINT num_elem)
@ -225,61 +225,63 @@ static void copy_declaration(D3DVERTEXELEMENT9 *dst, const D3DVERTEXELEMENT9 *sr
memcpy(dst, src, num_elem * sizeof(*src));
}
static HRESULT WINAPI ID3DXMeshImpl_GetDeclaration(ID3DXMesh *iface, D3DVERTEXELEMENT9 declaration[MAX_FVF_DECL_SIZE])
static HRESULT WINAPI d3dx9_mesh_GetDeclaration(ID3DXMesh *iface, D3DVERTEXELEMENT9 declaration[MAX_FVF_DECL_SIZE])
{
ID3DXMeshImpl *This = impl_from_ID3DXMesh(iface);
struct d3dx9_mesh *mesh = impl_from_ID3DXMesh(iface);
TRACE("(%p)\n", This);
TRACE("iface %p, declaration %p.\n", iface, declaration);
if (declaration == NULL) return D3DERR_INVALIDCALL;
if (!declaration)
return D3DERR_INVALIDCALL;
copy_declaration(declaration, This->cached_declaration, This->num_elem);
copy_declaration(declaration, mesh->cached_declaration, mesh->num_elem);
return D3D_OK;
}
static DWORD WINAPI ID3DXMeshImpl_GetNumBytesPerVertex(ID3DXMesh *iface)
static DWORD WINAPI d3dx9_mesh_GetNumBytesPerVertex(ID3DXMesh *iface)
{
ID3DXMeshImpl *This = impl_from_ID3DXMesh(iface);
struct d3dx9_mesh *mesh = impl_from_ID3DXMesh(iface);
TRACE("iface (%p)\n", This);
TRACE("iface %p.\n", iface);
return This->vertex_declaration_size;
return mesh->vertex_declaration_size;
}
static DWORD WINAPI ID3DXMeshImpl_GetOptions(ID3DXMesh *iface)
static DWORD WINAPI d3dx9_mesh_GetOptions(ID3DXMesh *iface)
{
ID3DXMeshImpl *This = impl_from_ID3DXMesh(iface);
struct d3dx9_mesh *mesh = impl_from_ID3DXMesh(iface);
TRACE("(%p)\n", This);
TRACE("iface %p.\n", iface);
return This->options;
return mesh->options;
}
static HRESULT WINAPI ID3DXMeshImpl_GetDevice(struct ID3DXMesh *iface, struct IDirect3DDevice9 **device)
static HRESULT WINAPI d3dx9_mesh_GetDevice(struct ID3DXMesh *iface, struct IDirect3DDevice9 **device)
{
ID3DXMeshImpl *This = impl_from_ID3DXMesh(iface);
struct d3dx9_mesh *mesh = impl_from_ID3DXMesh(iface);
TRACE("(%p)->(%p)\n", This, device);
TRACE("iface %p, device %p.\n", iface, device);
if (device == NULL) return D3DERR_INVALIDCALL;
*device = This->device;
IDirect3DDevice9_AddRef(This->device);
if (!device)
return D3DERR_INVALIDCALL;
*device = mesh->device;
IDirect3DDevice9_AddRef(mesh->device);
return D3D_OK;
}
static HRESULT WINAPI ID3DXMeshImpl_CloneMeshFVF(struct ID3DXMesh *iface, DWORD options, DWORD fvf,
static HRESULT WINAPI d3dx9_mesh_CloneMeshFVF(struct ID3DXMesh *iface, DWORD options, DWORD fvf,
struct IDirect3DDevice9 *device, struct ID3DXMesh **clone_mesh)
{
ID3DXMeshImpl *This = impl_from_ID3DXMesh(iface);
HRESULT hr;
D3DVERTEXELEMENT9 declaration[MAX_FVF_DECL_SIZE];
TRACE("(%p)->(%x,%x,%p,%p)\n", This, options, fvf, device, clone_mesh);
TRACE("iface %p, options %#x, fvf %#x, device %p, clone_mesh %p.\n",
iface, options, fvf, device, clone_mesh);
hr = D3DXDeclaratorFromFVF(fvf, declaration);
if (FAILED(hr)) return hr;
if (FAILED(hr = D3DXDeclaratorFromFVF(fvf, declaration)))
return hr;
return iface->lpVtbl->CloneMesh(iface, options, declaration, device, clone_mesh);
}
@ -677,11 +679,11 @@ static BOOL declaration_equals(const D3DVERTEXELEMENT9 *declaration1, const D3DV
return FALSE;
}
static HRESULT WINAPI ID3DXMeshImpl_CloneMesh(struct ID3DXMesh *iface, DWORD options,
static HRESULT WINAPI d3dx9_mesh_CloneMesh(struct ID3DXMesh *iface, DWORD options,
const D3DVERTEXELEMENT9 *declaration, struct IDirect3DDevice9 *device, struct ID3DXMesh **clone_mesh_out)
{
ID3DXMeshImpl *This = impl_from_ID3DXMesh(iface);
ID3DXMeshImpl *cloned_this;
struct d3dx9_mesh *This = impl_from_ID3DXMesh(iface);
struct d3dx9_mesh *cloned_this;
ID3DXMesh *clone_mesh;
D3DVERTEXELEMENT9 orig_declaration[MAX_FVF_DECL_SIZE] = { D3DDECL_END() };
void *data_in, *data_out;
@ -689,7 +691,8 @@ static HRESULT WINAPI ID3DXMeshImpl_CloneMesh(struct ID3DXMesh *iface, DWORD opt
HRESULT hr;
BOOL same_declaration;
TRACE("(%p)->(%x,%p,%p,%p)\n", This, options, declaration, device, clone_mesh_out);
TRACE("iface %p, options %#x, declaration %p, device %p, clone_mesh_out %p.\n",
iface, options, declaration, device, clone_mesh_out);
if (!clone_mesh_out)
return D3DERR_INVALIDCALL;
@ -773,81 +776,87 @@ error:
return hr;
}
static HRESULT WINAPI ID3DXMeshImpl_GetVertexBuffer(struct ID3DXMesh *iface,
static HRESULT WINAPI d3dx9_mesh_GetVertexBuffer(struct ID3DXMesh *iface,
struct IDirect3DVertexBuffer9 **vertex_buffer)
{
ID3DXMeshImpl *This = impl_from_ID3DXMesh(iface);
struct d3dx9_mesh *mesh = impl_from_ID3DXMesh(iface);
TRACE("(%p)->(%p)\n", This, vertex_buffer);
TRACE("iface %p, vertex_buffer %p.\n", iface, vertex_buffer);
if (vertex_buffer == NULL) return D3DERR_INVALIDCALL;
*vertex_buffer = This->vertex_buffer;
IDirect3DVertexBuffer9_AddRef(This->vertex_buffer);
if (!vertex_buffer)
return D3DERR_INVALIDCALL;
*vertex_buffer = mesh->vertex_buffer;
IDirect3DVertexBuffer9_AddRef(mesh->vertex_buffer);
return D3D_OK;
}
static HRESULT WINAPI ID3DXMeshImpl_GetIndexBuffer(struct ID3DXMesh *iface,
static HRESULT WINAPI d3dx9_mesh_GetIndexBuffer(struct ID3DXMesh *iface,
struct IDirect3DIndexBuffer9 **index_buffer)
{
ID3DXMeshImpl *This = impl_from_ID3DXMesh(iface);
struct d3dx9_mesh *mesh = impl_from_ID3DXMesh(iface);
TRACE("(%p)->(%p)\n", This, index_buffer);
TRACE("iface %p, index_buffer %p.\n", iface, index_buffer);
if (index_buffer == NULL) return D3DERR_INVALIDCALL;
*index_buffer = This->index_buffer;
IDirect3DIndexBuffer9_AddRef(This->index_buffer);
if (!index_buffer)
return D3DERR_INVALIDCALL;
*index_buffer = mesh->index_buffer;
IDirect3DIndexBuffer9_AddRef(mesh->index_buffer);
return D3D_OK;
}
static HRESULT WINAPI ID3DXMeshImpl_LockVertexBuffer(ID3DXMesh *iface, DWORD flags, void **data)
static HRESULT WINAPI d3dx9_mesh_LockVertexBuffer(ID3DXMesh *iface, DWORD flags, void **data)
{
ID3DXMeshImpl *mesh = impl_from_ID3DXMesh(iface);
struct d3dx9_mesh *mesh = impl_from_ID3DXMesh(iface);
TRACE("iface %p, flags %#x, data %p.\n", iface, flags, data);
return IDirect3DVertexBuffer9_Lock(mesh->vertex_buffer, 0, 0, data, flags);
}
static HRESULT WINAPI ID3DXMeshImpl_UnlockVertexBuffer(ID3DXMesh *iface)
static HRESULT WINAPI d3dx9_mesh_UnlockVertexBuffer(ID3DXMesh *iface)
{
ID3DXMeshImpl *This = impl_from_ID3DXMesh(iface);
struct d3dx9_mesh *mesh = impl_from_ID3DXMesh(iface);
TRACE("(%p)\n", This);
TRACE("iface %p.\n", iface);
return IDirect3DVertexBuffer9_Unlock(This->vertex_buffer);
return IDirect3DVertexBuffer9_Unlock(mesh->vertex_buffer);
}
static HRESULT WINAPI ID3DXMeshImpl_LockIndexBuffer(ID3DXMesh *iface, DWORD flags, void **data)
static HRESULT WINAPI d3dx9_mesh_LockIndexBuffer(ID3DXMesh *iface, DWORD flags, void **data)
{
ID3DXMeshImpl *mesh = impl_from_ID3DXMesh(iface);
struct d3dx9_mesh *mesh = impl_from_ID3DXMesh(iface);
TRACE("iface %p, flags %#x, data %p.\n", iface, flags, data);
return IDirect3DIndexBuffer9_Lock(mesh->index_buffer, 0, 0, data, flags);
}
static HRESULT WINAPI ID3DXMeshImpl_UnlockIndexBuffer(ID3DXMesh *iface)
static HRESULT WINAPI d3dx9_mesh_UnlockIndexBuffer(ID3DXMesh *iface)
{
ID3DXMeshImpl *This = impl_from_ID3DXMesh(iface);
struct d3dx9_mesh *mesh = impl_from_ID3DXMesh(iface);
TRACE("(%p)\n", This);
TRACE("iface %p.\n", iface);
return IDirect3DIndexBuffer9_Unlock(This->index_buffer);
return IDirect3DIndexBuffer9_Unlock(mesh->index_buffer);
}
static HRESULT WINAPI ID3DXMeshImpl_GetAttributeTable(ID3DXMesh *iface, D3DXATTRIBUTERANGE *attrib_table, DWORD *attrib_table_size)
/* FIXME: This looks just wrong, we never check *attrib_table_size before
* copying the data. */
static HRESULT WINAPI d3dx9_mesh_GetAttributeTable(ID3DXMesh *iface,
D3DXATTRIBUTERANGE *attrib_table, DWORD *attrib_table_size)
{
ID3DXMeshImpl *This = impl_from_ID3DXMesh(iface);
struct d3dx9_mesh *mesh = impl_from_ID3DXMesh(iface);
TRACE("(%p)->(%p,%p)\n", This, attrib_table, attrib_table_size);
TRACE("iface %p, attrib_table %p, attrib_table_size %p.\n",
iface, attrib_table, attrib_table_size);
if (attrib_table_size)
*attrib_table_size = This->attrib_table_size;
*attrib_table_size = mesh->attrib_table_size;
if (attrib_table)
CopyMemory(attrib_table, This->attrib_table, This->attrib_table_size * sizeof(*attrib_table));
memcpy(attrib_table, mesh->attrib_table, mesh->attrib_table_size * sizeof(*attrib_table));
return D3D_OK;
}
@ -946,7 +955,7 @@ static DWORD *generate_identity_point_reps(DWORD num_vertices)
return id_point_reps;
}
static HRESULT WINAPI ID3DXMeshImpl_ConvertPointRepsToAdjacency(ID3DXMesh *iface,
static HRESULT WINAPI d3dx9_mesh_ConvertPointRepsToAdjacency(ID3DXMesh *iface,
const DWORD *point_reps, DWORD *adjacency)
{
HRESULT hr;
@ -1096,9 +1105,10 @@ static HRESULT propagate_face_vertices(const DWORD *adjacency, DWORD *point_reps
return D3D_OK;
}
static HRESULT WINAPI ID3DXMeshImpl_ConvertAdjacencyToPointReps(ID3DXMesh *iface,
static HRESULT WINAPI d3dx9_mesh_ConvertAdjacencyToPointReps(ID3DXMesh *iface,
const DWORD *adjacency, DWORD *point_reps)
{
struct d3dx9_mesh *This = impl_from_ID3DXMesh(iface);
HRESULT hr;
DWORD face;
DWORD i;
@ -1107,8 +1117,6 @@ static HRESULT WINAPI ID3DXMeshImpl_ConvertAdjacencyToPointReps(ID3DXMesh *iface
DWORD *new_indices = NULL;
const unsigned int VERTS_PER_FACE = 3;
ID3DXMeshImpl *This = impl_from_ID3DXMesh(iface);
TRACE("iface %p, adjacency %p, point_reps %p.\n", iface, adjacency, point_reps);
if (!adjacency)
@ -1218,9 +1226,9 @@ static int compare_vertex_keys(const void *a, const void *b)
return left->key < right->key ? -1 : 1;
}
static HRESULT WINAPI ID3DXMeshImpl_GenerateAdjacency(ID3DXMesh *iface, FLOAT epsilon, DWORD *adjacency)
static HRESULT WINAPI d3dx9_mesh_GenerateAdjacency(ID3DXMesh *iface, float epsilon, DWORD *adjacency)
{
ID3DXMeshImpl *This = impl_from_ID3DXMesh(iface);
struct d3dx9_mesh *This = impl_from_ID3DXMesh(iface);
HRESULT hr;
BYTE *vertices = NULL;
const DWORD *indices = NULL;
@ -1234,7 +1242,7 @@ static HRESULT WINAPI ID3DXMeshImpl_GenerateAdjacency(ID3DXMesh *iface, FLOAT ep
const FLOAT epsilon_sq = epsilon * epsilon;
DWORD i;
TRACE("(%p)->(%f,%p)\n", This, epsilon, adjacency);
TRACE("iface %p, epsilon %.8e, adjacency %p.\n", iface, epsilon, adjacency);
if (!adjacency)
return D3DERR_INVALIDCALL;
@ -1364,14 +1372,14 @@ cleanup:
return hr;
}
static HRESULT WINAPI ID3DXMeshImpl_UpdateSemantics(ID3DXMesh *iface, D3DVERTEXELEMENT9 declaration[MAX_FVF_DECL_SIZE])
static HRESULT WINAPI d3dx9_mesh_UpdateSemantics(ID3DXMesh *iface, D3DVERTEXELEMENT9 declaration[MAX_FVF_DECL_SIZE])
{
struct d3dx9_mesh *This = impl_from_ID3DXMesh(iface);
HRESULT hr;
ID3DXMeshImpl *This = impl_from_ID3DXMesh(iface);
UINT vertex_declaration_size;
int i;
TRACE("(%p)->(%p)\n", This, declaration);
TRACE("iface %p, declaration %p.\n", iface, declaration);
if (!declaration)
{
@ -1423,53 +1431,54 @@ static HRESULT WINAPI ID3DXMeshImpl_UpdateSemantics(ID3DXMesh *iface, D3DVERTEXE
return D3D_OK;
}
/*** ID3DXMesh ***/
static HRESULT WINAPI ID3DXMeshImpl_LockAttributeBuffer(ID3DXMesh *iface, DWORD flags, DWORD **data)
static HRESULT WINAPI d3dx9_mesh_LockAttributeBuffer(ID3DXMesh *iface, DWORD flags, DWORD **data)
{
ID3DXMeshImpl *This = impl_from_ID3DXMesh(iface);
struct d3dx9_mesh *mesh = impl_from_ID3DXMesh(iface);
TRACE("(%p)->(%u,%p)\n", This, flags, data);
TRACE("iface %p, flags %#x, data %p.\n", iface, flags, data);
InterlockedIncrement(&This->attrib_buffer_lock_count);
InterlockedIncrement(&mesh->attrib_buffer_lock_count);
if (!(flags & D3DLOCK_READONLY)) {
D3DXATTRIBUTERANGE *attrib_table = This->attrib_table;
This->attrib_table_size = 0;
This->attrib_table = NULL;
if (!(flags & D3DLOCK_READONLY))
{
D3DXATTRIBUTERANGE *attrib_table = mesh->attrib_table;
mesh->attrib_table_size = 0;
mesh->attrib_table = NULL;
HeapFree(GetProcessHeap(), 0, attrib_table);
}
*data = This->attrib_buffer;
*data = mesh->attrib_buffer;
return D3D_OK;
}
static HRESULT WINAPI ID3DXMeshImpl_UnlockAttributeBuffer(ID3DXMesh *iface)
static HRESULT WINAPI d3dx9_mesh_UnlockAttributeBuffer(ID3DXMesh *iface)
{
ID3DXMeshImpl *This = impl_from_ID3DXMesh(iface);
struct d3dx9_mesh *mesh = impl_from_ID3DXMesh(iface);
int lock_count;
TRACE("(%p)\n", This);
TRACE("iface %p.\n", iface);
lock_count = InterlockedDecrement(&This->attrib_buffer_lock_count);
if (lock_count < 0) {
InterlockedIncrement(&This->attrib_buffer_lock_count);
lock_count = InterlockedDecrement(&mesh->attrib_buffer_lock_count);
if (lock_count < 0)
{
InterlockedIncrement(&mesh->attrib_buffer_lock_count);
return D3DERR_INVALIDCALL;
}
return D3D_OK;
}
static HRESULT WINAPI ID3DXMeshImpl_Optimize(ID3DXMesh *iface, DWORD flags, const DWORD *adjacency_in,
static HRESULT WINAPI d3dx9_mesh_Optimize(ID3DXMesh *iface, DWORD flags, const DWORD *adjacency_in,
DWORD *adjacency_out, DWORD *face_remap, ID3DXBuffer **vertex_remap, ID3DXMesh **opt_mesh)
{
ID3DXMeshImpl *This = impl_from_ID3DXMesh(iface);
struct d3dx9_mesh *mesh = impl_from_ID3DXMesh(iface);
HRESULT hr;
D3DVERTEXELEMENT9 declaration[MAX_FVF_DECL_SIZE] = { D3DDECL_END() };
ID3DXMesh *optimized_mesh;
TRACE("(%p)->(%x,%p,%p,%p,%p,%p)\n", This, flags, adjacency_in, adjacency_out, face_remap, vertex_remap, opt_mesh);
TRACE("iface %p, flags %#x, adjacency_in %p, adjacency_out %p, face_remap %p, vertex_remap %p, opt_mesh %p.\n",
iface, flags, adjacency_in, adjacency_out, face_remap, vertex_remap, opt_mesh);
if (!opt_mesh)
return D3DERR_INVALIDCALL;
@ -1477,8 +1486,8 @@ static HRESULT WINAPI ID3DXMeshImpl_Optimize(ID3DXMesh *iface, DWORD flags, cons
hr = iface->lpVtbl->GetDeclaration(iface, declaration);
if (FAILED(hr)) return hr;
hr = iface->lpVtbl->CloneMesh(iface, This->options, declaration, This->device, &optimized_mesh);
if (FAILED(hr)) return hr;
if (FAILED(hr = iface->lpVtbl->CloneMesh(iface, mesh->options, declaration, mesh->device, &optimized_mesh)))
return hr;
hr = optimized_mesh->lpVtbl->OptimizeInplace(optimized_mesh, flags, adjacency_in, adjacency_out, face_remap, vertex_remap);
if (SUCCEEDED(hr))
@ -1490,7 +1499,8 @@ static HRESULT WINAPI ID3DXMeshImpl_Optimize(ID3DXMesh *iface, DWORD flags, cons
/* Creates a vertex_remap that removes unused vertices.
* Indices are updated according to the vertex_remap. */
static HRESULT compact_mesh(ID3DXMeshImpl *This, DWORD *indices, DWORD *new_num_vertices, ID3DXBuffer **vertex_remap)
static HRESULT compact_mesh(struct d3dx9_mesh *This, DWORD *indices,
DWORD *new_num_vertices, ID3DXBuffer **vertex_remap)
{
HRESULT hr;
DWORD *vertex_remap_ptr;
@ -1599,7 +1609,7 @@ static int attrib_entry_compare(const DWORD **a, const DWORD **b)
}
/* Create face_remap, a new attribute buffer for attribute sort optimization. */
static HRESULT remap_faces_for_attrsort(ID3DXMeshImpl *This, const DWORD *indices,
static HRESULT remap_faces_for_attrsort(struct d3dx9_mesh *This, const DWORD *indices,
const DWORD *attrib_buffer, DWORD **sorted_attrib_buffer, DWORD **face_remap)
{
const DWORD **sorted_attrib_ptr_buffer = NULL;
@ -1630,10 +1640,10 @@ static HRESULT remap_faces_for_attrsort(ID3DXMeshImpl *This, const DWORD *indice
return D3D_OK;
}
static HRESULT WINAPI ID3DXMeshImpl_OptimizeInplace(ID3DXMesh *iface, DWORD flags, const DWORD *adjacency_in,
static HRESULT WINAPI d3dx9_mesh_OptimizeInplace(ID3DXMesh *iface, DWORD flags, const DWORD *adjacency_in,
DWORD *adjacency_out, DWORD *face_remap_out, ID3DXBuffer **vertex_remap_out)
{
ID3DXMeshImpl *This = impl_from_ID3DXMesh(iface);
struct d3dx9_mesh *This = impl_from_ID3DXMesh(iface);
void *indices = NULL;
DWORD *attrib_buffer = NULL;
HRESULT hr;
@ -1646,7 +1656,8 @@ static HRESULT WINAPI ID3DXMeshImpl_OptimizeInplace(ID3DXMesh *iface, DWORD flag
DWORD *sorted_attrib_buffer = NULL;
DWORD i;
TRACE("(%p)->(%x,%p,%p,%p,%p)\n", This, flags, adjacency_in, adjacency_out, face_remap_out, vertex_remap_out);
TRACE("iface %p, flags %#x, adjacency_in %p, adjacency_out %p, face_remap_out %p, vertex_remap_out %p.\n",
iface, flags, adjacency_in, adjacency_out, face_remap_out, vertex_remap_out);
if (!flags)
return D3DERR_INVALIDCALL;
@ -1827,10 +1838,10 @@ cleanup:
return hr;
}
static HRESULT WINAPI ID3DXMeshImpl_SetAttributeTable(ID3DXMesh *iface,
static HRESULT WINAPI d3dx9_mesh_SetAttributeTable(ID3DXMesh *iface,
const D3DXATTRIBUTERANGE *attrib_table, DWORD attrib_table_size)
{
ID3DXMeshImpl *This = impl_from_ID3DXMesh(iface);
struct d3dx9_mesh *mesh = impl_from_ID3DXMesh(iface);
D3DXATTRIBUTERANGE *new_table = NULL;
TRACE("iface %p, attrib_table %p, attrib_table_size %u.\n", iface, attrib_table, attrib_table_size);
@ -1846,47 +1857,44 @@ static HRESULT WINAPI ID3DXMeshImpl_SetAttributeTable(ID3DXMesh *iface,
} else if (attrib_table) {
return D3DERR_INVALIDCALL;
}
HeapFree(GetProcessHeap(), 0, This->attrib_table);
This->attrib_table = new_table;
This->attrib_table_size = attrib_table_size;
HeapFree(GetProcessHeap(), 0, mesh->attrib_table);
mesh->attrib_table = new_table;
mesh->attrib_table_size = attrib_table_size;
return D3D_OK;
}
static const struct ID3DXMeshVtbl D3DXMesh_Vtbl =
{
/*** IUnknown methods ***/
ID3DXMeshImpl_QueryInterface,
ID3DXMeshImpl_AddRef,
ID3DXMeshImpl_Release,
/*** ID3DXBaseMesh ***/
ID3DXMeshImpl_DrawSubset,
ID3DXMeshImpl_GetNumFaces,
ID3DXMeshImpl_GetNumVertices,
ID3DXMeshImpl_GetFVF,
ID3DXMeshImpl_GetDeclaration,
ID3DXMeshImpl_GetNumBytesPerVertex,
ID3DXMeshImpl_GetOptions,
ID3DXMeshImpl_GetDevice,
ID3DXMeshImpl_CloneMeshFVF,
ID3DXMeshImpl_CloneMesh,
ID3DXMeshImpl_GetVertexBuffer,
ID3DXMeshImpl_GetIndexBuffer,
ID3DXMeshImpl_LockVertexBuffer,
ID3DXMeshImpl_UnlockVertexBuffer,
ID3DXMeshImpl_LockIndexBuffer,
ID3DXMeshImpl_UnlockIndexBuffer,
ID3DXMeshImpl_GetAttributeTable,
ID3DXMeshImpl_ConvertPointRepsToAdjacency,
ID3DXMeshImpl_ConvertAdjacencyToPointReps,
ID3DXMeshImpl_GenerateAdjacency,
ID3DXMeshImpl_UpdateSemantics,
/*** ID3DXMesh ***/
ID3DXMeshImpl_LockAttributeBuffer,
ID3DXMeshImpl_UnlockAttributeBuffer,
ID3DXMeshImpl_Optimize,
ID3DXMeshImpl_OptimizeInplace,
ID3DXMeshImpl_SetAttributeTable
d3dx9_mesh_QueryInterface,
d3dx9_mesh_AddRef,
d3dx9_mesh_Release,
d3dx9_mesh_DrawSubset,
d3dx9_mesh_GetNumFaces,
d3dx9_mesh_GetNumVertices,
d3dx9_mesh_GetFVF,
d3dx9_mesh_GetDeclaration,
d3dx9_mesh_GetNumBytesPerVertex,
d3dx9_mesh_GetOptions,
d3dx9_mesh_GetDevice,
d3dx9_mesh_CloneMeshFVF,
d3dx9_mesh_CloneMesh,
d3dx9_mesh_GetVertexBuffer,
d3dx9_mesh_GetIndexBuffer,
d3dx9_mesh_LockVertexBuffer,
d3dx9_mesh_UnlockVertexBuffer,
d3dx9_mesh_LockIndexBuffer,
d3dx9_mesh_UnlockIndexBuffer,
d3dx9_mesh_GetAttributeTable,
d3dx9_mesh_ConvertPointRepsToAdjacency,
d3dx9_mesh_ConvertAdjacencyToPointReps,
d3dx9_mesh_GenerateAdjacency,
d3dx9_mesh_UpdateSemantics,
d3dx9_mesh_LockAttributeBuffer,
d3dx9_mesh_UnlockAttributeBuffer,
d3dx9_mesh_Optimize,
d3dx9_mesh_OptimizeInplace,
d3dx9_mesh_SetAttributeTable,
};
@ -2434,7 +2442,7 @@ HRESULT WINAPI D3DXCreateMesh(DWORD numfaces, DWORD numvertices, DWORD options,
IDirect3DVertexBuffer9 *vertex_buffer;
IDirect3DIndexBuffer9 *index_buffer;
DWORD *attrib_buffer;
ID3DXMeshImpl *object;
struct d3dx9_mesh *object;
DWORD index_usage = 0;
D3DPOOL index_pool = D3DPOOL_DEFAULT;
D3DFORMAT index_format = D3DFMT_INDEX16;
@ -2442,7 +2450,8 @@ HRESULT WINAPI D3DXCreateMesh(DWORD numfaces, DWORD numvertices, DWORD options,
D3DPOOL vertex_pool = D3DPOOL_DEFAULT;
int i;
TRACE("(%d, %d, %x, %p, %p, %p)\n", numfaces, numvertices, options, declaration, device, mesh);
TRACE("numfaces %u, numvertices %u, options %#x, declaration %p, device %p, mesh %p.\n",
numfaces, numvertices, options, declaration, device, mesh);
if (numfaces == 0 || numvertices == 0 || declaration == NULL || device == NULL || mesh == NULL ||
/* D3DXMESH_VB_SHARE is for cloning, and D3DXMESH_USEHWONLY is for ConvertToBlendedMesh */
@ -2548,7 +2557,7 @@ HRESULT WINAPI D3DXCreateMesh(DWORD numfaces, DWORD numvertices, DWORD options,
}
attrib_buffer = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, numfaces * sizeof(*attrib_buffer));
object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(ID3DXMeshImpl));
object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*object));
if (object == NULL || attrib_buffer == NULL)
{
HeapFree(GetProcessHeap(), 0, object);
@ -6666,13 +6675,13 @@ HRESULT WINAPI D3DXWeldVertices(ID3DXMesh *mesh, DWORD flags, const D3DXWELDEPSI
BOOL indices_are_32bit = mesh->lpVtbl->GetOptions(mesh) & D3DXMESH_32BIT;
DWORD optimize_flags;
DWORD *point_reps = NULL;
ID3DXMeshImpl *This = impl_from_ID3DXMesh(mesh);
struct d3dx9_mesh *This = impl_from_ID3DXMesh(mesh);
DWORD *vertex_face_map = NULL;
ID3DXBuffer *vertex_remap = NULL;
BYTE *vertices = NULL;
TRACE("(%p, %x, %p, %p, %p, %p, %p)\n", mesh, flags, epsilons,
adjacency, adjacency_out, face_remap_out, vertex_remap_out);
TRACE("mesh %p, flags %#x, epsilons %p, adjacency %p, adjacency_out %p, face_remap_out %p, vertex_remap_out %p.\n",
mesh, flags, epsilons, adjacency, adjacency_out, face_remap_out, vertex_remap_out);
if (flags == 0)
{