36 #include "qmanifold.h"
38 #include "qbroadphase.h"
39 #include "qcollision.h"
40 #include "qrigidbody.h"
41 #include "qsoftbody.h"
44 #include "qmath_utils.h"
59 vector <QJoint*> joints=vector<QJoint*>();
61 vector <QSpring*> springs=vector<QSpring*>();
63 vector<QRaycast*> raycasts=vector<QRaycast*>();
65 vector <QGizmo*> gizmos=vector<QGizmo*>();
67 vector<vector<QBody*> > sleepingIslands=vector<vector<QBody*> >();
71 vector<QManifold> manifolds;
82 bool enableSleeping=
true;
83 bool enableBroadphase=
true;
89 float sleepingPositionTolerance=0.1f;
90 float sleepingRotationTolerance=M_PI/180.0f;
93 int debugAABBTestCount=0;
94 int debugCollisionTestCount=0;
101 void CreateIslands(
int bodyIndex, vector<QBody*> &bodyList, vector<QBody*> &island, vector<bool> &visitedList);
102 void GenerateIslands(vector<QBody*> &bodyList, vector<vector<QBody*>> &islandList);
103 static bool SortBodiesHorizontal(
const QBody *bodyA,
const QBody *bodyB);
104 static bool SortBodiesVertical(
const QBody *bodyA,
const QBody *bodyB);
105 void GetCollisionPairs(vector<QBody *> &bodyList,vector<pair<QBody *, QBody *> > *resList);
107 void CreateIslands(
QBody &body, vector<QBody*> island);
108 vector<vector<QBody>> GenerateIslands(vector<QBody> bodyList );
109 float softBodyCollisionHysteresis=0.2f;
112 void UpdateConstraints();
121 vector<QBody*> bodies=vector<QBody*>();
124 inline static float MAX_WORLD_SIZE=99999.0f;
137 return enableSleeping;
142 return sleepingPositionTolerance;
147 return sleepingRotationTolerance;
152 return enableBroadphase;
182 return softBodyCollisionHysteresis;
198 enableSleeping=value;
205 sleepingPositionTolerance=value;
212 sleepingRotationTolerance=value;
218 enableBroadphase=value;
227 broadPhase=externalBroadphase;
228 if (broadPhase!=
nullptr){
249 if (timeScale!=value){
250 float velocityTimeScaleFactor=0.0f;
252 if (value<timeScale){
253 velocityTimeScaleFactor=1/timeScale*value;
255 velocityTimeScaleFactor=1.0f;
260 for (
auto body:bodies){
261 if(body->enableBodySpecificTimeScale==
false){
263 if (body->bodyType==QBody::BodyTypes::RIGID){
265 vel*=velocityTimeScaleFactor;
268 rotVel*=velocityTimeScaleFactor;
270 }
else if(body->bodyType!=QBody::BodyTypes::AREA){
271 for(
auto mesh :body->_meshes){
272 for (
auto particle :mesh->particles){
273 QVector vel=particle->GetGlobalPosition()-particle->GetPreviousGlobalPosition();
274 vel*=velocityTimeScaleFactor;
275 particle->SetPreviousGlobalPosition(particle->GetGlobalPosition()-vel );
302 softBodyCollisionHysteresis=value;
320 static vector<QCollision::Contact*> GetCollisions(
QBody *bodyA,
QBody *bodyB,
bool applyHotSolvers=
true);
332 QWorld *AddBodyGroup(
const vector<QBody*> &bodyGroup);
343 QWorld *RemoveBodyAt(
int index);
347 return bodies.size();
353 return bodies[index];
361 for(
int i=0;i<bodies.size();i++){
373 vector<QBody*> GetBodiesHitByPoint(
QVector point,
int maxBodyCount=1,
bool onlyRigidBodies=
true,
int layersBit=-1);
381 vector<QParticle*> GetParticlesCloseToPoint(
QVector point,
float distance,
int maxParticleCount=1,
bool exceptRigidBodies=
true,
int layersBit=-1);
385 bool CollideWithWorld(
QBody *body);
390 vector<QManifold> TestCollisionWithWorld(
QBody *body);
405 QWorld *RemoveJointAt(
int index);
413 return joints.size();
419 return joints[index];
425 for(
int i=0;i<joints.size();i++)
444 QWorld *RemoveSpringAt(
int index);
456 return springs.size();
462 return springs[index];
468 for(
int i=0;i<springs.size();i++)
469 if(springs[i]==spring)
487 QWorld *RemoveRaycastAt(
int index);
491 return raycasts.size();
497 return raycasts[index];
503 for(
int i=0;i<raycasts.size();i++)
504 if(raycasts[i]==raycast)
530 QWorld *RemoveMatchingCollisionException(
QBody *body);
535 bool CheckCollisionException(
QBody *bodyA,
QBody *bodyB);
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
QBody * WakeUp()
Definition: qbody.h:679
float GetPreviousRotation()
Definition: qbody.h:214
float GetRotation()
Definition: qbody.h:206
QVector GetPosition()
Definition: qbody.h:198
QBody * SetPreviousRotation(float angleRadian)
Definition: qbody.h:461
QBody * SetPreviousPosition(QVector value)
Definition: qbody.h:416
Definition: qbroadphase.h:44
The QCollision class performs all collision detection operations. The relevant methods return contact...
Definition: qcollision.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
QRaycast objects send a ray into the world and return collision results with body objects....
Definition: qraycast.h:38
QSoftBody is a body type that defines deformable, soft objects in the physics world....
Definition: qsoftbody.h:35
You can apply distance constraints between 2 particles using the QSpring. The physics engine uses QSp...
Definition: qspring.h:39
A QWorld object is required to create a physics simulation. The QWorld class manages the entire physi...
Definition: qworld.h:51
bool GetEnabled()
Definition: qworld.h:176
QWorld * SetSleepingRotationTolerance(float value)
Definition: qworld.h:211
bool GetBroadphaseEnabled()
Definition: qworld.h:151
QWorld * SetSleepingPositionTolerance(float value)
Definition: qworld.h:204
QWorld * SetTimeScale(float value=1.0f)
Definition: qworld.h:248
QSpring * GetSpringAt(int index)
Definition: qworld.h:461
float GetTimeScale()
Definition: qworld.h:171
int GetBodyCount()
Definition: qworld.h:346
int GetBodyIndex(QBody *body)
Definition: qworld.h:358
int GetIterationCount()
Definition: qworld.h:166
int GetRaycastCount()
Definition: qworld.h:490
float GetSleepingPositionTolerance()
Definition: qworld.h:141
QWorld * SetSoftBodyCollisionHysteresis(float value)
Definition: qworld.h:301
int GetJointCount()
Definition: qworld.h:412
bool GetSleepingEnabled()
Definition: qworld.h:136
QJoint * GetJointAt(int index)
Definition: qworld.h:418
QBody * GetBodyAt(int index)
Definition: qworld.h:352
int GetJointIndex(QJoint *joint)
Definition: qworld.h:424
QRaycast * GetRaycastAt(int index)
Definition: qworld.h:496
QWorld * SetBroadphaseEnabled(bool value)
Definition: qworld.h:217
QWorld * SetSleepingEnabled(bool value)
Definition: qworld.h:197
int GetSpringIndex(QSpring *spring)
Definition: qworld.h:467
QWorld * SetBroadphase(QBroadPhase *externalBroadphase)
Definition: qworld.h:226
QWorld * SetIterationCount(int value)
Definition: qworld.h:239
QWorld * SetGravity(QVector value)
Definition: qworld.h:190
vector< QGizmo * > * GetGizmos()
Definition: qworld.h:512
float GetSoftBodyCollisionHysteresis()
Definition: qworld.h:181
float GetSleepingRotationTolerance()
Definition: qworld.h:146
int GetRaycastIndex(QRaycast *raycast)
Definition: qworld.h:502
QWorld * SetEnabled(bool value)
Definition: qworld.h:292
QBroadPhase * GetBroadphase()
Definition: qworld.h:158
int GetSpringCount()
Definition: qworld.h:455