159 lines
5.3 KiB
C++
159 lines
5.3 KiB
C++
#pragma once
|
|
|
|
#include "../eterbase/Stl.h"
|
|
#include "../eterlib/GrpObjectInstance.h"
|
|
#include "../eterlib/GrpShadowTexture.h"
|
|
|
|
#include "LODController.h"
|
|
|
|
const int DONTUSEVALUE = -1;
|
|
class CGraphicThingInstance : public CGraphicObjectInstance
|
|
{
|
|
public:
|
|
typedef struct SModelThingSet
|
|
{
|
|
void Clear()
|
|
{
|
|
stl_wipe(m_pLODThingRefVector);
|
|
}
|
|
|
|
std::vector<CGraphicThing::TRef *> m_pLODThingRefVector;
|
|
} TModelThingSet;
|
|
|
|
public:
|
|
enum
|
|
{
|
|
ID = THING_OBJECT
|
|
};
|
|
int GetType() const { return ID; }
|
|
|
|
CGraphicThingInstance();
|
|
virtual ~CGraphicThingInstance();
|
|
|
|
void DeformNoSkin();
|
|
|
|
void UpdateLODLevel();
|
|
void UpdateTime();
|
|
void DeformAll(); // ¸ðµç LOD µðÆû
|
|
|
|
bool LessRenderOrder(CGraphicThingInstance* pkThingInst);
|
|
|
|
bool Picking(const D3DXVECTOR3 & v, const D3DXVECTOR3 & dir, float & out_x, float & out_y);
|
|
|
|
void OnInitialize();
|
|
|
|
bool CreateDeviceObjects();
|
|
void DestroyDeviceObjects();
|
|
|
|
void ReserveModelInstance(int iCount);
|
|
void ReserveModelThing(int iCount);
|
|
|
|
bool CheckModelInstanceIndex(int iModelInstance);
|
|
bool CheckModelThingIndex(int iModelThing);
|
|
bool CheckMotionThingIndex(DWORD dwMotionKey);
|
|
bool GetMotionThingPointer(DWORD dwKey, CGraphicThing ** ppMotion);
|
|
bool IsMotionThing();
|
|
|
|
void RegisterModelThing(int iModelThing, CGraphicThing * pModelThing);
|
|
void RegisterLODThing(int iModelThing, CGraphicThing * pModelThing);
|
|
void RegisterMotionThing(DWORD dwMotionKey, CGraphicThing * pMotionThing);
|
|
|
|
bool SetModelInstance(int iDstModelInstance, int iSrcModelThing, int iSrcModel,int iSkelInstance = DONTUSEVALUE);
|
|
void SetEndStopMotion();
|
|
void SetMotionAtEnd();
|
|
|
|
void AttachModelInstance(int iDstModelInstance, const char * c_szBoneName, int iSrcModelInstance);
|
|
void AttachModelInstance(int iDstModelInstance, const char * c_szBoneName, CGraphicThingInstance & rsrcInstance, int iSrcModelInstance);
|
|
void DetachModelInstance(int iDstModelInstance, CGraphicThingInstance & rSrcInstance, int SrcModelInstance);
|
|
bool FindBoneIndex(int iModelInstance, const char* c_szBoneName, int * iRetBone);
|
|
bool GetBonePosition(int iModelIndex, int iBoneIndex, float * pfx, float * pfy, float * pfz);
|
|
|
|
void ResetLocalTime();
|
|
void InsertDelay(float fDelay);
|
|
|
|
void SetMaterialImagePointer(UINT ePart, const char* c_szImageName, CGraphicImage* pImage);
|
|
void SetMaterialData(UINT ePart, const char* c_szImageName, SMaterialData kMaterialData);
|
|
void SetSpecularInfo(UINT ePart, const char* c_szMtrlName, BOOL bEnable, float fPower);
|
|
|
|
void __SetLocalTime(float fLocalTime); // Only Used by Tools
|
|
float GetLastLocalTime();
|
|
float GetLocalTime();
|
|
float GetSecondElapsed();
|
|
float GetAverageSecondElapsed();
|
|
|
|
BYTE GetLODLevel(DWORD dwModelInstance);
|
|
float GetHeight();
|
|
|
|
void RenderWithOneTexture();
|
|
void RenderWithTwoTexture();
|
|
void BlendRenderWithOneTexture();
|
|
void BlendRenderWithTwoTexture();
|
|
|
|
DWORD GetLODControllerCount() const;
|
|
CGrannyLODController * GetLODControllerPointer(DWORD dwModelIndex) const;
|
|
CGrannyLODController * GetLODControllerPointer(DWORD dwModelIndex);
|
|
|
|
void ReloadTexture();
|
|
|
|
public:
|
|
CGraphicThing* GetBaseThingPtr();
|
|
|
|
bool SetMotion(DWORD dwMotionKey, float blendTime = 0.0f, int loopCount = 0, float speedRatio=1.0f);
|
|
bool ChangeMotion(DWORD dwMotionKey, int loopCount = 0, float speedRatio=1.0f);
|
|
bool Intersect(float * pu, float * pv, float * pt);
|
|
void GetBoundBox(D3DXVECTOR3 * vtMin, D3DXVECTOR3 * vtMax);
|
|
BOOL GetBoundBox(DWORD dwModelInstanceIndex, D3DXVECTOR3 * vtMin, D3DXVECTOR3 * vtMax);
|
|
BOOL GetBoneMatrix(DWORD dwModelInstanceIndex, DWORD dwBoneIndex, D3DXMATRIX ** ppMatrix);
|
|
BOOL GetCompositeBoneMatrix(DWORD dwModelInstanceIndex, DWORD dwBoneIndex, D3DXMATRIX ** ppMatrix);
|
|
void UpdateTransform(D3DXMATRIX * pMatrix, float fSecondsElapsed = 0.0f, int iModelInstanceIndex = 0);
|
|
void ProjectShadow(const CGraphicShadowTexture & c_rShadowTexture);
|
|
|
|
public:
|
|
void BuildBoundingSphere();
|
|
void BuildBoundingAABB();
|
|
virtual void CalculateBBox();
|
|
virtual bool GetBoundingSphere(D3DXVECTOR3 & v3Center, float & fRadius);
|
|
virtual bool GetBoundingAABB(D3DXVECTOR3 & v3Min, D3DXVECTOR3 & v3Max);
|
|
|
|
protected:
|
|
void OnClear();
|
|
void OnDeform();
|
|
void OnUpdate();
|
|
void OnRender();
|
|
void OnBlendRender();
|
|
void OnRenderToShadowMap();
|
|
void OnRenderShadow();
|
|
void OnRenderPCBlocker();
|
|
|
|
protected:
|
|
bool m_bUpdated;
|
|
float m_fLastLocalTime;
|
|
float m_fLocalTime;
|
|
float m_fDelay;
|
|
float m_fSecondElapsed;
|
|
float m_fAverageSecondElapsed;
|
|
float m_fRadius;
|
|
D3DXVECTOR3 m_v3Center;
|
|
D3DXVECTOR3 m_v3Min, m_v3Max;
|
|
|
|
std::vector<CGrannyLODController *> m_LODControllerVector;
|
|
std::vector<TModelThingSet> m_modelThingSetVector;
|
|
std::map<DWORD, CGraphicThing::TRef *> m_roMotionThingMap;
|
|
|
|
protected:
|
|
virtual void OnUpdateCollisionData(const CStaticCollisionDataVector * pscdVector);
|
|
virtual void OnUpdateHeighInstance(CAttributeInstance * pAttributeInstance);
|
|
virtual bool OnGetObjectHeight(float fX, float fY, float * pfHeight);
|
|
|
|
public:
|
|
static void CreateSystem(UINT uCapacity);
|
|
static void DestroySystem();
|
|
|
|
static CGraphicThingInstance* New();
|
|
static void Delete(CGraphicThingInstance* pkInst);
|
|
|
|
static CDynamicPool<CGraphicThingInstance> ms_kPool;
|
|
|
|
bool HaveBlendThing();
|
|
};
|