37 #include "qmath_utils.h"
45 float circumference=0.0f;
70 size_t operator()(
const std::pair<QBody*, QBody*>& p)
const {
71 std::size_t h1 = std::hash<QBody*>{}(p.first);
72 std::size_t h2 = std::hash<QBody*>{}(p.second);
73 return h1 ^ (h2 + 0x9e3779b9 + (h1 << 6) + (h1 >> 2));
78 bool operator()(
const std::pair<QBody*, QBody*>& p1,
const std::pair<QBody*, QBody*>& p2)
const {
79 return (p1.first == p2.first && p1.second == p2.second) ||
80 (p1.first == p2.second && p1.second == p2.first);
90 QVector prevPosition=QVector::Zero();
92 float prevRotation=0.0f;
94 Modes mode=QBody::Modes::DYNAMIC;
95 bool inertiaNeedsUpdate=
true;
96 bool circumferenceNeedsUpdate=
true;
97 bool enableBodySpecificTimeScale=
false;
98 float bodySpecificTimeScale=1.0f;
99 BodyTypes bodyType=BodyTypes::RIGID;
101 float velocityLimit=0.0f;
102 bool enableIntegratedVelocities=
true;
103 bool enableCustomGravity=
false;
104 QVector customGravity=QVector::Zero();
109 float staticFriction=0.5f;
110 float airFriction=0.01f;
112 float restitution=0.0f;
116 int collidableLayersBit=1;
117 bool isKinematic=
false;
118 bool allowKinematicCollisions=
false;
121 bool isSleeping=
false;
124 int fixedVelocityTick=0;
125 int fixedAngularTick=0;
132 void UpdateMeshTransforms();
137 virtual bool CanGiveCollisionResponseTo(
QBody *otherBody);
227 for(
auto mesh:_meshes){
228 res+=mesh->GetInitialArea();
235 for(
auto mesh:_meshes){
236 res+=mesh->GetInitialPolygonsArea();
243 for(
auto mesh:_meshes){
244 res+=mesh->GetArea();
251 for(
auto mesh:_meshes){
252 res+=mesh->GetPolygonsArea();
262 if(inertiaNeedsUpdate==
true){
264 inertia=inertia<500.0f ? 500.0f:inertia;
265 inertiaNeedsUpdate=
false;
275 return collidableLayersBit;
281 if( (layersBit & this->collidableLayersBit)==0 )
289 if( (layersBit & this->layersBit)==0 ){
304 return simulationModel;
313 return staticFriction;
332 if(circumferenceNeedsUpdate==
true){
334 for(
auto mesh:_meshes){
335 circumference+=mesh->GetCircumference();
337 circumferenceNeedsUpdate=
false;
340 return circumference;
345 return enableBodySpecificTimeScale;
350 return bodySpecificTimeScale;
389 if (withPreviousPosition) {
390 prevPosition=position;
394 UpdateMeshTransforms();
433 rotation=angleRadian;
434 if(withPreviousRotation)
435 prevRotation=angleRadian;
437 UpdateMeshTransforms();
446 return SetRotation( degree*(M_PI/180.0f),withPreviousRotation );
462 prevRotation=angleRadian;
489 collidableLayersBit=value;
514 simulationModel=model;
515 for(
auto mesh:_meshes){
516 mesh->UpdateCollisionBehavior();
518 UpdateMeshTransforms();
535 staticFriction=value;
554 inertiaNeedsUpdate=
true;
571 enableBodySpecificTimeScale=value;
580 bodySpecificTimeScale=value;
672 vector<QMesh*> _meshes=vector<QMesh*>();
675 static bool CanCollide(
QBody *bodyA,
QBody *bodyB,
bool checkBodiesAreEnabled=
true);
677 bool ignoreGravity=
false;
QAreaBody objects are objects that don't respond to collisions or receive any response from them,...
Definition: qareabody.h:38
QBody objects are the base class for all types of bodies. Any class derived from QBody shares these m...
Definition: qbody.h:43
QVector GetPreviousPosition()
Definition: qbody.h:202
virtual void OnPreStep()
Definition: qbody.h:160
QBody * SetBodySpecificTimeScaleEnabled(bool value)
Definition: qbody.h:570
QBody * AddPreviousRotation(float angleRadian)
Definition: qbody.h:469
float GetTotalPolygonsInitialArea()
Definition: qbody.h:233
QBody * SetVelocityLimit(float value)
Definition: qbody.cpp:75
QBody * SetStaticFriction(float value)
Definition: qbody.h:534
QBody * SetIntegratedVelocitiesEnabled(bool value)
Definition: qbody.cpp:137
float GetFriction()
Definition: qbody.h:308
QBody * RemoveMeshAt(int index)
Definition: qbody.cpp:173
virtual void OnStep()
Definition: qbody.h:162
QBody * AddMesh(QMesh *mesh)
Definition: qbody.cpp:154
bool manualDeletion
Definition: qbody.h:660
float GetAirFriction()
Definition: qbody.h:317
QBody * SetCollidableLayersBit(int value)
Definition: qbody.h:488
QBody * WakeUp()
Definition: qbody.h:646
virtual bool OnCollision(CollisionInfo)
Definition: qbody.h:167
QBody * AddRotation(float angleRadian, bool withPreviousRotation=true)
Definition: qbody.h:454
SimulationModels GetSimulationModel()
Definition: qbody.h:303
QBody * SetMass(float value)
Definition: qbody.h:552
QBody * SetLayersBit(int value)
Definition: qbody.h:480
int GetCollidableLayersBit()
Definition: qbody.h:274
QBody * SetCustomGravityEnabled(bool value)
Definition: qbody.cpp:142
QBody * SetRestitution(float value)
Definition: qbody.h:561
QAABB GetAABB() const
Definition: qbody.h:218
QBody * AddPosition(QVector value, bool withPreviousPosition=true)
Definition: qbody.h:404
float GetStaticFriction()
Definition: qbody.h:312
bool GetCustomGravityEnabled()
Definition: qbody.cpp:63
float GetTotalArea()
Definition: qbody.h:241
QWorld * GetWorld()
Definition: qbody.h:194
QBody * SetMode(QBody::Modes bodyMode)
Definition: qbody.h:504
virtual void Update()
Definition: qbody.cpp:253
float GetPreviousRotation()
Definition: qbody.h:214
float GetCircumference()
Definition: qbody.h:331
int GetMeshCount()
Definition: qbody.cpp:191
QBody * SetFriction(float value)
Definition: qbody.h:526
float GetRotation()
Definition: qbody.h:206
bool GetBodySpecificTimeScaleEnabled()
Definition: qbody.h:344
QBody * SetBodySpecificTimeScale(float value)
Definition: qbody.h:579
virtual QBody * ApplyForce(QVector value)
Definition: qbody.h:411
virtual float GetMass()
Definition: qbody.h:322
QBody * SetCustomGravity(QVector value)
Definition: qbody.cpp:148
bool GetIsSleeping()
Definition: qbody.h:295
bool GetEnabled()
Definition: qbody.h:354
SimulationModels
Definition: qbody.h:64
QBody * SetRotationDegree(float degree, bool withPreviousRotation=true)
Definition: qbody.h:445
float GetVelocityLimit()
Definition: qbody.cpp:55
float GetInertia()
Definition: qbody.h:261
std::function< void(QBody *body)> PreStepEventListener
Definition: qbody.h:173
QVector GetPosition()
Definition: qbody.h:198
virtual void PostUpdate()
Definition: qbody.h:136
float GetTotalInitialArea()
Definition: qbody.h:225
QBody * AddMeshesFromFile(string filePath)
Definition: qbody.cpp:164
bool GetOverlapWithCollidableLayersBit(int layersBit)
Definition: qbody.h:280
BodyTypes GetBodyType()
Definition: qbody.h:190
bool GetIntegratedVelocitiesEnabled()
Definition: qbody.cpp:59
QBody * SetPreviousRotation(float angleRadian)
Definition: qbody.h:461
float GetRestitution()
Definition: qbody.h:326
QBody * AddPreviousPosition(QVector value)
Definition: qbody.h:424
std::function< bool(QBody *body, CollisionInfo)> CollisionEventListener
Definition: qbody.h:182
float GetRotationDegree()
Definition: qbody.h:210
QMesh * GetMeshAt(int index)
Definition: qbody.cpp:184
QBody * SetAirFriction(float value)
Definition: qbody.h:543
QBody * SetSimulationModel(SimulationModels model)
Definition: qbody.h:512
Modes GetMode()
Definition: qbody.h:257
float GetBodySpesificTimeScale()
Definition: qbody.h:349
QBody * SetEnabled(bool value)
Definition: qbody.h:587
std::function< void(QBody *body)> StepEventListener
Definition: qbody.h:177
float GetTotalPolygonsArea()
Definition: qbody.h:249
Modes
Definition: qbody.h:51
vector< QMesh * > * GetMeshes()
Definition: qbody.cpp:187
QBody * SetPosition(QVector value, bool withPreviousPosition=true)
Definition: qbody.h:387
QBody * SetPreviousPosition(QVector value)
Definition: qbody.h:416
QBody * SetRotation(float angleRadian, bool withPreviousRotation=true)
Definition: qbody.h:432
int GetLayersBit()
Definition: qbody.h:270
bool GetOverlapWithLayersBit(int layersBit)
Definition: qbody.h:288
QBody * SetCanSleep(bool value)
Definition: qbody.h:496
bool GetCanSleep()
Definition: qbody.h:299
Definition: qbroadphase.h:44
QJoint objects serves to apply various distance constraints between rigid bodies. Additionally,...
Definition: qjoint.h:37
QManifold retrieves collision data from collision tests between two QBody objects using QCollision me...
Definition: qmanifold.h:36
QParticle objects form the network structures of QMesh objects defined for all body object types....
Definition: qparticle.h:40
A QWorld object is required to create a physics simulation. The QWorld class manages the entire physi...
Definition: qworld.h:51
CollisionInfo structure contains collision information of a body object. This information is sent to ...
Definition: qbody.h:146
QVector position
Definition: qbody.h:148
QBody * body
Definition: qbody.h:150
QVector normal
Definition: qbody.h:152
float penetration
Definition: qbody.h:154
Every QBody object requires meshes. In other traditional physics engines, the term 'shape' is used in...
Definition: qmesh.h:49