DragonNest/Common/EternityEngine/EtCollisionEntity.h
2024-12-19 09:48:26 +08:00

69 lines
2.8 KiB
C++

#pragma once
#define COLLISION_TYPE_STATIC 0x0000ffff
#define COLLISION_TYPE_DYNAMIC 0xffff0000
#define COLLISION_GROUP_STATIC( x ) ( 0x00000001 << x )
#define COLLISION_GROUP_DYNAMIC( x ) ( 0x00010000 << x )
class CEtCollisionEntity
{
public:
CEtCollisionEntity(void);
virtual ~CEtCollisionEntity(void);
protected:
std::vector< SCollisionPrimitive * > *m_pvecOriginalPrimitive;
std::vector< SCollisionPrimitive * > m_vecPrimitive;
std::vector< int > m_vecPrimitiveParentIndex;
std::vector< BOOL > m_vecPrimitiveEnable;
EtVector3 m_vScale;
int m_nCollisionGroup;
int m_nTargetCollisionGroup;
bool m_bDraw;
bool m_bEnableCollision;
std::vector< CEtMeshStream * > m_vecMeshStream;
int m_nVertexDecl;
bool m_bUpdateNeeded;
public:
void Initialize( std::vector< SCollisionPrimitive * > &vecPrimitive, std::vector< int > &vecPrimitiveBoneIndex );
std::vector< SCollisionPrimitive * > *GetCollisionPrimitive() { return &m_vecPrimitive; }
void SetCollisionScale( float fScale ) { m_vScale = EtVector3( fScale, fScale, fScale ); m_bUpdateNeeded = true; }
void SetCollisionScale( const EtVector3 &vScale ) { m_vScale = vScale; m_bUpdateNeeded = true;}
void GetCollisionScale( EtVector3 &vScale ) { vScale = m_vScale; }
void SetCollisionGroup( int nGroup ) { m_nCollisionGroup = nGroup; }
int GetCollisionGroup() { return m_nCollisionGroup; }
void SetTargetCollisionGroup( int nGroup ) { m_nTargetCollisionGroup = nGroup; }
int GetTargetCollisionGroup() { return m_nTargetCollisionGroup; }
void SetUpdateNeeded( bool bValue ) { m_bUpdateNeeded = bValue; }
void ShowCollisionPrimitive( bool bShow );
bool IsShowCollisionPrimitive() { return m_bDraw; }
void EnableCollision( bool bEnable ) { m_bEnableCollision = bEnable; }
bool IsEnableCollision() { return m_bEnableCollision; }
void EnableCollision( SCollisionPrimitive *pPrimitive, bool bEnable );
bool IsEnableCollision( SCollisionPrimitive *pPrimitive );
int GetCollisionPrimitiveCount() { return ( int )m_vecPrimitive.size(); }
void UpdateCollisionPrimitive( int nIndex, EtMatrix &WorldMat, bool bUpdate = true );
virtual void UpdateCollisionPrimitive( EtMatrix &WorldMat );
SCollisionPrimitive *FindCollisionPrimitive( int nBoneIndex );
void DrawCollisionPrimitive();
bool TestCollision( SCollisionPrimitive &Primitive );
bool FindCollision( SCollisionPrimitive &TragetPrimitive, EtVector3 &vMove, SCollisionResponse &Response, bool bCalcContactTime );
bool FindCollision( std::vector< SCollisionPrimitive * > &TragetPrimitive, EtVector3 &vMove, DNVector(SCollisionResponse) &vecResponse, bool bCalcContactTime = true);
bool TestSegmentCollision( SSegment &Segment );
bool FindSegmentCollision( SSegment &Segment, SCollisionResponse &Response );
bool FindCapsuleCollision( SCollisionCapsule &Capsule, SCollisionResponse &Response );
};