Commit 778b644f authored by Henri Verbeet's avatar Henri Verbeet Committed by Alexandre Julliard

d3dx9: Get rid of the ID3DXMeshImpl typedef.

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