180 lines
6.1 KiB
C++
180 lines
6.1 KiB
C++
//////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Rigid Entity header
|
|
//
|
|
// File: rigidentity.h
|
|
// Description : RigidEntity class declaration
|
|
//
|
|
// History:
|
|
// -:Created by Anton Knyazev
|
|
//
|
|
//////////////////////////////////////////////////////////////////////
|
|
|
|
#ifndef rigidentity_h
|
|
#define rigidentity_h
|
|
#pragma once
|
|
|
|
typedef uint64 masktype;
|
|
#define getmask(i) ((uint64)1<<(i))
|
|
const int NMASKBITS = 64;
|
|
|
|
enum rentity_flags_int {
|
|
ref_contact_overflow = 0x4000000
|
|
};
|
|
|
|
//typedef unsigned int masktype;
|
|
//#define getmask(i) (1u<<(i))
|
|
//const int NMASKBITS = 32;
|
|
|
|
enum constr_info_flags { constraint_limited_1axis=1, constraint_limited_2axes=2, constraint_rope=4 };
|
|
|
|
struct constraint_info {
|
|
quaternionf qframe_rel[2];
|
|
float limits[2];
|
|
unsigned int flags;
|
|
CPhysicalEntity *pConstraintEnt;
|
|
int bActive;
|
|
};
|
|
|
|
struct checksum_item {
|
|
int iPhysTime;
|
|
unsigned int checksum;
|
|
};
|
|
const int NCHECKSUMS = 32;
|
|
|
|
class CRigidEntity : public CPhysicalEntity {
|
|
public:
|
|
CRigidEntity(CPhysicalWorld *pworld);
|
|
virtual ~CRigidEntity();
|
|
virtual pe_type GetType() { return PE_RIGID; }
|
|
|
|
virtual int AddGeometry(phys_geometry *pgeom, pe_geomparams* params,int id=-1);
|
|
virtual void RemoveGeometry(int id);
|
|
virtual int SetParams(pe_params *_params);
|
|
virtual int GetParams(pe_params *_params);
|
|
virtual int GetStatus(pe_status*);
|
|
virtual int Action(pe_action*);
|
|
|
|
virtual int AddCollider(CPhysicalEntity *pCollider);
|
|
virtual int RemoveCollider(CPhysicalEntity *pCollider, bool bRemoveAlways=true);
|
|
virtual int RemoveContactPoint(CPhysicalEntity *pCollider, const vectorf &pt, float mindist2);
|
|
virtual int HasContactsWith(CPhysicalEntity *pent);
|
|
virtual int HasCollisionContactsWith(CPhysicalEntity *pent);
|
|
virtual int Awake(int bAwake=1,int iSource=0);
|
|
virtual int IsAwake(int ipart=-1) { return m_bAwake; }
|
|
virtual void AlertNeighbourhoodND();
|
|
|
|
virtual RigidBody *GetRigidBody(int ipart=-1) { return &m_body; }
|
|
virtual void GetContactMatrix(const vectorf &pt, int ipart, matrix3x3f &K) { m_body.GetContactMatrix(pt-m_body.pos,K); }
|
|
virtual float GetMassInv() { return m_body.Minv; }
|
|
|
|
enum snapver { SNAPSHOT_VERSION = 9 };
|
|
virtual int GetSnapshotVersion() { return SNAPSHOT_VERSION; }
|
|
virtual int GetStateSnapshot(class CStream &stm, float time_back=0, int flags=0);
|
|
virtual int SetStateFromSnapshot(class CStream &stm, int flags=0);
|
|
virtual int PostSetStateFromSnapshot();
|
|
virtual unsigned int GetStateChecksum();
|
|
int WriteContacts(CStream &stm,int flags);
|
|
int ReadContacts(CStream &stm,int flags);
|
|
|
|
virtual void StartStep(float time_interval);
|
|
virtual float GetMaxTimeStep(float time_interval);
|
|
virtual float GetLastTimeStep(float time_interval) { return m_lastTimeStep; }
|
|
virtual int Step(float time_interval);
|
|
virtual void StepBack(float time_interval);
|
|
virtual int GetContactCount(int nMaxPlaneContacts);
|
|
virtual int RegisterContacts(float time_interval,int nMaxPlaneContacts);
|
|
virtual int Update(float time_interval, float damping);
|
|
virtual float CalcEnergy(float time_interval);
|
|
virtual float GetDamping(float time_interval);
|
|
|
|
virtual void CheckAdditionalGeometry(float time_interval, masktype &contact_mask) {}
|
|
virtual void AddAdditionalImpulses(float time_interval) {}
|
|
virtual void RecomputeMassDistribution(int ipart=-1,int bMassChanged=1);
|
|
|
|
virtual void DrawHelperInformation(void (*DrawLineFunc)(float*,float*), int flags);
|
|
virtual void GetMemoryStatistics(ICrySizer *pSizer);
|
|
|
|
int RegisterConstraint(const vectorf &pt0,const vectorf &pt1, int ipart0, CPhysicalEntity *pBuddy,int ipart1, int flags);
|
|
int RemoveConstraint(int iConstraint);
|
|
int RegisterContactPoint(masktype &contact_mask, int idx, const vectorf &pt, const geom_contact *pcontacts, int iPrim0,int iFeature0,
|
|
int iPrim1,int iFeature1, int flags=contact_new, float penetration=0);
|
|
int CheckForNewContacts(geom_world_data *pgwd0,intersection_params *pip, int &itmax, int iStartPart=0,int nParts=-1);
|
|
virtual int GetPotentialColliders(CPhysicalEntity **&pentlist);
|
|
virtual int CheckSelfCollision(int ipart0,int ipart1) { return 0; }
|
|
void UpdatePenaltyContacts(float time_interval);
|
|
int UpdatePenaltyContact(int i, float time_interval);
|
|
int VerifyExistingContacts(float maxdist);
|
|
void UpdateConstraints();
|
|
void UpdateContactsAfterStepBack(float time_interval);
|
|
void ApplyBuoyancy(float time_interval,const vectorf &gravity);
|
|
void ArchiveContact(int idx);
|
|
int CompactContactBlock(masktype &contact_mask, float maxPlaneDist, int nMaxContacts,int &nContacts, vectorf &n, float &maxDist,
|
|
const vectorf& ptTest = vectorf(zero), const vectorf& dirTest = vectorf(zero));
|
|
int IsFast(float time_interval);
|
|
|
|
masktype *m_pColliderContacts,*m_pColliderConstraints;
|
|
entity_contact *m_pContacts,*m_pConstraints;
|
|
constraint_info *m_pConstraintInfos;
|
|
int m_nContactsAlloc,m_nConstraintsAlloc;
|
|
//int m_iStickyContacts[8],m_nStickyContacts;
|
|
//int m_iSlidingContacts[8],m_nSlidingContacts;
|
|
int m_bProhibitUnproj;
|
|
int m_bProhibitUnprojection,m_bEnforceContacts;
|
|
vectorf m_prevUnprojDir;
|
|
int m_bCollisionCulling;
|
|
int m_bJustLoaded;
|
|
int m_bStable;
|
|
int m_bHadSeverePenetration;
|
|
unsigned int m_nRestMask;
|
|
int m_nPrevColliders;
|
|
int m_bSteppedBack,m_nStepBackCount;
|
|
float m_velFastDir,m_sizeFastDir;
|
|
int m_bCanSweep;
|
|
|
|
float m_timeStepFull;
|
|
float m_timeStepPerformed;
|
|
float m_lastTimeStep;
|
|
float m_minAwakeTime;
|
|
|
|
vectorf m_gravity,m_gravityFreefall;
|
|
float m_Emin;
|
|
float m_maxAllowedStep;
|
|
vectorf m_vhist[4],m_whist[4],m_Lhist[4];
|
|
int m_iDynHist;
|
|
int m_bAwake;
|
|
int m_nSleepFrames;
|
|
float m_damping,m_dampingFreefall;
|
|
float m_dampingEx;
|
|
float m_maxw;
|
|
float m_softness[4];
|
|
|
|
RigidBody m_body;
|
|
vectorf m_Pext[2],m_Lext[2];
|
|
vectorf m_prevPos,m_prevv,m_prevw;
|
|
quaternionf m_prevq;
|
|
float m_E0,m_Estep;
|
|
float m_impulseTime;
|
|
float m_timeContactOverflow;
|
|
|
|
coll_history_item m_CollHistory[8];
|
|
int m_iCollHistory;
|
|
|
|
plane m_waterPlane;
|
|
float m_waterDensity;
|
|
float m_waterDamping;
|
|
float m_waterResistance;
|
|
vectorf m_waterFlow;
|
|
float m_EminWater;
|
|
int m_bFloating;
|
|
float m_submergedFraction;
|
|
float m_maxWaterResistance2;
|
|
|
|
checksum_item m_checksums[NCHECKSUMS];
|
|
int m_iLastChecksum;
|
|
};
|
|
|
|
extern CPhysicalEntity *g_CurColliders[128];
|
|
extern int g_CurCollParts[128][2];
|
|
|
|
#endif |