d3dx9_36: Fill children info into ID3DXFileData object.
This commit is contained in:
parent
ed367c504d
commit
5880ff01be
|
@ -60,7 +60,10 @@ typedef struct {
|
||||||
typedef struct {
|
typedef struct {
|
||||||
ID3DXFileData ID3DXFileData_iface;
|
ID3DXFileData ID3DXFileData_iface;
|
||||||
LONG ref;
|
LONG ref;
|
||||||
|
BOOL reference;
|
||||||
IDirectXFileData *dxfile_data;
|
IDirectXFileData *dxfile_data;
|
||||||
|
ULONG nb_children;
|
||||||
|
ID3DXFileData **children;
|
||||||
} ID3DXFileDataImpl;
|
} ID3DXFileDataImpl;
|
||||||
|
|
||||||
|
|
||||||
|
@ -117,6 +120,11 @@ static ULONG WINAPI ID3DXFileDataImpl_Release(ID3DXFileData *iface)
|
||||||
|
|
||||||
if (!ref)
|
if (!ref)
|
||||||
{
|
{
|
||||||
|
ULONG i;
|
||||||
|
|
||||||
|
for (i = 0; i < This->nb_children; i++)
|
||||||
|
(This->children[i])->lpVtbl->Release(This->children[i]);
|
||||||
|
HeapFree(GetProcessHeap(), 0, This->children);
|
||||||
IDirectXFileData_Release(This->dxfile_data);
|
IDirectXFileData_Release(This->dxfile_data);
|
||||||
HeapFree(GetProcessHeap(), 0, This);
|
HeapFree(GetProcessHeap(), 0, This);
|
||||||
}
|
}
|
||||||
|
@ -266,21 +274,70 @@ static const ID3DXFileDataVtbl ID3DXFileData_Vtbl =
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
static HRESULT ID3DXFileDataImpl_Create(IDirectXFileData *dxfile_data, ID3DXFileData **ret_iface)
|
static HRESULT ID3DXFileDataImpl_Create(IDirectXFileObject *dxfile_object, ID3DXFileData **ret_iface)
|
||||||
{
|
{
|
||||||
ID3DXFileDataImpl *object;
|
ID3DXFileDataImpl *object;
|
||||||
|
IDirectXFileObject *data_object;
|
||||||
|
HRESULT ret;
|
||||||
|
|
||||||
TRACE("(%p, %p)\n", dxfile_data, ret_iface);
|
TRACE("(%p, %p)\n", dxfile_object, ret_iface);
|
||||||
|
|
||||||
*ret_iface = NULL;
|
*ret_iface = NULL;
|
||||||
|
|
||||||
object = HeapAlloc(GetProcessHeap(), 0, sizeof(*object));
|
object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*object));
|
||||||
if (!object)
|
if (!object)
|
||||||
return E_OUTOFMEMORY;
|
return E_OUTOFMEMORY;
|
||||||
|
|
||||||
object->ID3DXFileData_iface.lpVtbl = &ID3DXFileData_Vtbl;
|
object->ID3DXFileData_iface.lpVtbl = &ID3DXFileData_Vtbl;
|
||||||
object->ref = 1;
|
object->ref = 1;
|
||||||
object->dxfile_data = dxfile_data;
|
|
||||||
|
ret = IDirectXFileObject_QueryInterface(dxfile_object, &IID_IDirectXFileData, (void **)&object->dxfile_data);
|
||||||
|
if (FAILED(ret))
|
||||||
|
{
|
||||||
|
IDirectXFileDataReference *reference;
|
||||||
|
|
||||||
|
ret = IDirectXFileObject_QueryInterface(dxfile_object, &IID_IDirectXFileDataReference, (void **)&reference);
|
||||||
|
if (SUCCEEDED(ret))
|
||||||
|
{
|
||||||
|
ret = IDirectXFileDataReference_Resolve(reference, &object->dxfile_data);
|
||||||
|
if (FAILED(ret))
|
||||||
|
{
|
||||||
|
HeapFree(GetProcessHeap(), 0, object);
|
||||||
|
return E_FAIL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
FIXME("Don't known what to do with binary object\n");
|
||||||
|
HeapFree(GetProcessHeap(), 0, object);
|
||||||
|
return E_FAIL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
while (SUCCEEDED(ret = IDirectXFileData_GetNextObject(object->dxfile_data, &data_object)))
|
||||||
|
{
|
||||||
|
if (object->children)
|
||||||
|
object->children = HeapReAlloc(GetProcessHeap(), 0, object->children, sizeof(ID3DXFileData*) * (object->nb_children + 1));
|
||||||
|
else
|
||||||
|
object->children = HeapAlloc(GetProcessHeap(), 0, sizeof(ID3DXFileData*));
|
||||||
|
if (!object->children)
|
||||||
|
{
|
||||||
|
ret = E_OUTOFMEMORY;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
ret = ID3DXFileDataImpl_Create(data_object, &object->children[object->nb_children]);
|
||||||
|
if (ret != S_OK)
|
||||||
|
break;
|
||||||
|
object->nb_children++;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ret != DXFILEERR_NOMOREOBJECTS)
|
||||||
|
{
|
||||||
|
(&object->ID3DXFileData_iface)->lpVtbl->Release(&object->ID3DXFileData_iface);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
TRACE("Found %u children\n", object->nb_children);
|
||||||
|
|
||||||
*ret_iface = &object->ID3DXFileData_iface;
|
*ret_iface = &object->ID3DXFileData_iface;
|
||||||
|
|
||||||
|
@ -534,7 +591,7 @@ static HRESULT WINAPI ID3DXFileImpl_CreateEnumObject(ID3DXFile *iface, const voi
|
||||||
ret = E_OUTOFMEMORY;
|
ret = E_OUTOFMEMORY;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
ret = ID3DXFileDataImpl_Create(data_object, &object->children[object->nb_children]);
|
ret = ID3DXFileDataImpl_Create((IDirectXFileObject*)data_object, &object->children[object->nb_children]);
|
||||||
if (ret != S_OK)
|
if (ret != S_OK)
|
||||||
break;
|
break;
|
||||||
object->nb_children++;
|
object->nb_children++;
|
||||||
|
|
Loading…
Reference in New Issue