Files
FC1/CryPhysics/rigidentity.h
romkazvo 34d6c5d489 123
2023-08-07 19:29:24 +08:00

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