|

楼主 |
发表于 2010-4-26 20:20:00
|
显示全部楼层
Re:SkinnedMesh
能再详细一下吗 我自己也在网上看了一下回调函数 但是还是不太理解 感觉我的Alloc 里面的函数没有调用啊
这是我的代码
#ifndef __MyAllocHierarchyH__
#define __MyAllocHierarchyH__
#include <d3dx9.h>
#include "d3dUtility.h"
// enum for various skinning modes possible
enum METHOD
{
D3DNONINDEXED,
D3DINDEXED,
SOFTWARE,
D3DINDEXEDVS,
D3DINDEXEDHLSLVS,
NONE
};
//--------------------------------------------------------------------------------------
// Name: struct D3DXFRAME_DERIVED
// Desc: Structure derived from D3DXFRAME so we can add some app-specific
// info that will be stored with each frame
//--------------------------------------------------------------------------------------
struct D3DXFRAME_DERIVED : public D3DXFRAME
{
D3DXMATRIXA16 CombinedTransformationMatrix;
};
//--------------------------------------------------------------------------------------
// Name: struct D3DXMESHCONTAINER_DERIVED
// Desc: Structure derived from D3DXMESHCONTAINER so we can add some app-specific
// info that will be stored with each mesh
//--------------------------------------------------------------------------------------
struct D3DXMESHCONTAINER_DERIVED : public D3DXMESHCONTAINER
{
LPDIRECT3DTEXTURE9* ppTextures; // array of textures, entries are NULL if no texture specified
// SkinMesh info
LPD3DXMESH pOrigMesh;
LPD3DXATTRIBUTERANGE pAttributeTable;
DWORD NumAttributeGroups;
DWORD NumInfl;
LPD3DXBUFFER pBoneCombinationBuf;
D3DXMATRIX** ppBoneMatrixPtrs;
D3DXMATRIX* pBoneOffsetMatrices;
DWORD NumPaletteEntries;
bool UseSoftwareVP;
DWORD iAttributeSW; // used to denote the split between SW and HW if necessary for non-indexed skinning
};
//--------------------------------------------------------------------------------------
// Name: class CAllocateHierarchy
// Desc: Custom version of ID3DXAllocateHierarchy with custom methods to create
// frames and meshcontainers.
//--------------------------------------------------------------------------------------
class MyAllocHierarchy : public ID3DXAllocateHierarchy
{
public:
bool bUseSoftwareVP; // Flag to indicate whether software vp is
METHOD SkinningMethod; // Current skinning method
UINT NumBoneMatricesMax;
D3DXMATRIXA16* pBoneMatrices;
STDMETHOD (CreateFrame) ( THIS_ LPCSTR Name, LPD3DXFRAME *ppNewFrame );
#if (D3D_SDK_VERSION &31) //Here is for Directx9.0b
STDMETHOD(CreateMeshContainer)(THIS_ LPCTSTR Name,
LPD3DXMESHDATA pMeshData,
LPD3DXMATERIAL pMaterials,
LPD3DXEFFECTINSTANCE pEffectInstances,
DWORD NumMaterials,
DWORD *pAdjacency, LPD3DXSKININFO pSkinInfo,
LPD3DXMESHCONTAINER *ppNewMeshContainer);
#else //Here is for Directx9.0c
STDMETHOD(CreateMeshContainer)(
THIS_ LPCSTR Name,
CONST D3DXMESHDATA *pMeshData,
CONST D3DXMATERIAL *pMaterials,
CONST D3DXEFFECTINSTANCE *pEffectInstances,
DWORD NumMaterials,
CONST DWORD *pAdjacency,
LPD3DXSKININFO pSkinInfo,
LPD3DXMESHCONTAINER *ppNewMeshContainer);
#endif
STDMETHOD (DestroyFrame) ( THIS_ LPD3DXFRAME pFrameToFree );//HRESULT STDMETHODCALLTYPE STDMETHODIMP
STDMETHOD (DestroyMeshContainer) ( THIS_ LPD3DXMESHCONTAINER pMeshContainerBase );
MyAllocHierarchy()
{
SkinningMethod = SOFTWARE;
}
HRESULT GenerateSkinnedMesh( IDirect3DDevice9* pd3dDevice, D3DXMESHCONTAINER_DERIVED* pMeshContainer );
HRESULT AllocateName( LPCSTR Name, LPSTR* pNewName );
};
#endif |
|