33 #include "qparticle.h"
34 #include "qangleconstraint.h"
35 #include "json/json.hpp"
37 #include "qmath_utils.h"
39 using json =nlohmann::json;
51 enum CollisionBehaviors{
57 vector<QParticle*> particles=vector<QParticle*>();
60 QVector position=QVector::Zero();
61 QVector globalPosition=QVector::Zero();
63 float globalRotation=0.0f;
64 vector<QSpring*> springs=vector<QSpring*>();
65 vector<QAngleConstraint*> angleConstraints=vector<QAngleConstraint*>();
66 vector <QParticle*> polygon=vector<QParticle*>();
67 vector<vector<QParticle*>> subConvexPolygons=vector<vector<QParticle*>>();
68 vector<QVector> polygonBisectors;
69 float circumference=0.0f;
70 QBody *ownerBody=
nullptr;
71 CollisionBehaviors collisionBehavior=CollisionBehaviors::CIRCLES;
72 vector<vector<int>> UVMaps=vector<vector<int>>();
73 bool disablePolygonForCollisions=
false;
76 bool collisionBehaviorNeedsUpdate=
false;
79 void UpdateCollisionBehavior();
83 vector<float> lastPolygonCornerAngles;
84 float minAngleConstraintOfPolygon=M_PI*0.3;
87 void UpdateSubConvexPolygons(
bool majorUpdate=
true);
88 void UpdatePolygonBisectors();
89 static vector<QVector> GetBisectors(vector<QParticle*> polygonParticles);
90 void ApplyAngleConstraintsToPolygon();
91 bool CheckIsPolygonConcave(vector<QParticle*> polygonParticles);
93 static bool CheckIsReflex(
int indexA,
int indexB,
int indexC, vector<QParticle*> polygonParticles);
94 static void TriangulatePolygon(vector<QParticle*> &polygonParticles,vector<vector<int>> &triangles);
95 static void DecompositePolygon(vector<QParticle*> &polygonParticles,vector<vector<QParticle*>> &polygons);
96 static void DecompositePolygon2(vector<QParticle*> &polygonParticles,vector<vector<QParticle*>> &polygons);
97 bool subConvexPolygonsNeedsUpdate=
false;
98 bool polygonBisectorsNeedsUpdate=
true;
99 bool isPolygonSelfIntersected=
false;
167 return globalPosition;
175 return globalRotation;
180 res+=GetPolygonArea(polygon,
true);
181 for(
auto particle:particles){
182 if(particle->GetRadius()>0.5f){
183 res+=particle->GetRadius()*particle->GetRadius();
190 float res=GetPolygonArea(polygon,
true);
197 res+=GetPolygonArea(polygon,
false);
198 for(
auto particle:particles){
199 if(particle->GetRadius()>0.5f){
200 res+=particle->GetRadius()*particle->GetRadius();
207 float res=GetPolygonArea(polygon,
false);
215 for(
int i=0;i<polygon.size();i++){
217 QParticle *np=polygon[(i+1)%polygon.size()];
234 if(collisionBehaviorNeedsUpdate){
235 UpdateCollisionBehavior();
236 collisionBehaviorNeedsUpdate=
false;
238 return collisionBehavior;
247 return disablePolygonForCollisions;
265 globalPosition=value;
286 disablePolygonForCollisions=value;
287 collisionBehaviorNeedsUpdate=
true;
307 QMesh * RemoveParticleAt(
int index);
315 int GetParticleCount();
326 for(
int i=0;i<particles.size();i++){
327 if(particles[i]==particle){
343 QMesh * SetPolygon(vector<QParticle *> polygonParticles);
351 QMesh * AddParticleToPolygon(
QParticle * particle,
int position=-1);
367 QMesh * RemoveParticleFromPolygonAt(
int index);
373 QMesh * RemovePolygon();
377 int GetPolygonParticleCount();
384 QParticle *GetParticleFromPolygon(
int index);
392 return minAngleConstraintOfPolygon;
401 minAngleConstraintOfPolygon=radian;
410 if (subConvexPolygonsNeedsUpdate==
true){
411 UpdateSubConvexPolygons();
412 subConvexPolygonsNeedsUpdate=
false;
414 return subConvexPolygons.size();
420 if (subConvexPolygonsNeedsUpdate==
true){
421 UpdateSubConvexPolygons();
422 subConvexPolygonsNeedsUpdate=
false;
424 return subConvexPolygons[index];
427 QVector GetPolygonBisectorVectorAt(
int index){
428 return polygonBisectors[index];
448 QMesh *RemoveSpringAt(
int index);
457 return springs.size();
463 return springs[index];
470 for(
int i=0;i<springs.size();i++)
471 if(springs[i]==spring)
483 return UVMaps.size();
490 return UVMaps[index];
497 QMesh * AddUVMap(vector<int> map);
504 QMesh * RemoveUVMapAt(
int index);
510 QMesh * ClearUVMaps();
517 QMesh * RemoveMatchingUVMaps(
int particleIndex);
526 return angleConstraints.size();
533 return angleConstraints[index];
540 angleConstraints.push_back(angleConstraint);
550 angleConstraints.erase(angleConstraints.begin()+index );
558 for(
int i=0;i<angleConstraints.size();i++)
559 if(angleConstraints[i]==angleConstraint)
569 int index=GetAngleConstraintIndex(angleConstraint);
571 RemoveAngleConstraintAt(index);
583 while(i<angleConstraints.size()){
586 RemoveAngleConstraintAt(i);
606 static QMesh * CreateWithCircle(
float radius,
QVector centerPosition=QVector::Zero());
618 static QMesh * CreateWithPolygon(
float radius,
int sideCount,
QVector centerPosition=QVector::Zero(),
int polarGrid=-1,
bool enableSprings=
true,
bool enablePolygons=
true,
float particleRadius=0.5f);
630 static QMesh * CreateWithRect(
QVector size,
QVector centerPosition=QVector::Zero(),
QVector grid=QVector::Zero(),
bool enableSprings=
true,
bool enablePolygons=
true,
float particleRadius=0.5f);
638 static QMesh * CreateWithMeshData(
QMesh::MeshData &data,
bool enableSprings=
true,
bool enablePolygons=
true);
644 static vector<QMesh::MeshData> GetMeshDatasFromFile(
string filePath);
651 static vector<QMesh::MeshData> GetMeshDatasFromJsonData(std::string &jsonBasedData);
662 static float GetPolygonArea(vector<QParticle*> &polygonPoints,
bool withLocalPositions=
false);
672 static bool CheckCollisionBehaviors(
QMesh *meshA,
QMesh * meshB,CollisionBehaviors firstBehavior,CollisionBehaviors secondBehavior );
681 static MeshData GenerateRectangleMeshData(
QVector size,
QVector centerPosition=QVector::Zero(),
QVector grid=QVector::Zero(),
float particleRadius=0.5f);
691 static MeshData GeneratePolygonMeshData(
float radius,
int sideCount,
QVector centerPosition=QVector::Zero(),
int polarGrid=-1,
float particleRadius=0.5f);
697 static pair<QVector, float> GetAveragePositionAndRotation(vector<QParticle*> particleCollection);
706 static vector<QVector> GetMatchingParticlePositions(vector<QParticle*> particleCollection,
QVector targetPosition,
float targetRotation);
You can apply angle constraints between 3 particles using the QAngleConstraint. The physics engine us...
Definition: qangleconstraint.h:38
QParticle * GetParticleB()
Definition: qangleconstraint.h:84
QParticle * GetParticleC()
Definition: qangleconstraint.h:88
QParticle * GetParticleA()
Definition: qangleconstraint.h:80
QBody objects are the base class for all types of bodies. Any class derived from QBody shares these m...
Definition: qbody.h:43
The QCollision class performs all collision detection operations. The relevant methods return contact...
Definition: qcollision.h:44
QParticle objects form the network structures of QMesh objects defined for all body object types....
Definition: qparticle.h:40
bool manualDeletion
Definition: qparticle.h:270
QVector GetPosition()
Definition: qparticle.h:102
QRaycast objects send a ray into the world and return collision results with body objects....
Definition: qraycast.h:38
QRigidBody is a type of body that is simulated with the dynamics of Rigid body. A rigid body is a typ...
Definition: qrigidbody.h:40
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
vector< QVector > particlePositions
Definition: qmesh.h:106
vector< pair< int, int > > springList
Definition: qmesh.h:118
vector< bool > particleLazyValues
Definition: qmesh.h:114
vector< bool > particleInternalValues
Definition: qmesh.h:110
vector< int > polygon
Definition: qmesh.h:129
vector< vector< int > > UVMaps
Definition: qmesh.h:137
vector< float > particleRadValues
Definition: qmesh.h:108
vector< pair< int, int > > internalSpringList
Definition: qmesh.h:123
vector< bool > particleEnabledValues
Definition: qmesh.h:112
Every QBody object requires meshes. In other traditional physics engines, the term 'shape' is used in...
Definition: qmesh.h:49
vector< QParticle * > & GetSubConvexPolygonAt(int index)
Definition: qmesh.h:419
QVector GetGlobalPosition()
Definition: qmesh.h:166
QSpring * GetSpringAt(int index)
Definition: qmesh.h:462
int GetSpringIndex(QSpring *spring)
Definition: qmesh.h:469
float GetPolygonArea()
Definition: qmesh.h:206
QMesh * SetPolygonForCollisionsDisabled(bool value)
Definition: qmesh.h:285
bool GetPolygonForCollisionsDisabled()
Definition: qmesh.h:246
QVector GetPosition()
Definition: qmesh.h:162
QMesh * RemoveAngleConstraintAt(int index)
Definition: qmesh.h:549
float GetRotation()
Definition: qmesh.h:170
int GetAngleConstraintCount()
Definition: qmesh.h:525
QAngleConstraint * GetAngleConstraintAt(int index)
Definition: qmesh.h:532
QMesh * SetGlobalPosition(QVector value)
Definition: qmesh.h:264
QMesh * AddAngleConstraint(QAngleConstraint *angleConstraint)
Definition: qmesh.h:539
float GetGlobalRotation()
Definition: qmesh.h:174
int GetUVMapCount()
Definition: qmesh.h:482
float GetMinAngleConstraintOfPolygon()
Definition: qmesh.h:391
float GetArea()
Definition: qmesh.h:195
int GetParticleIndex(QParticle *particle)
Definition: qmesh.h:325
int GetAngleConstraintIndex(QAngleConstraint *angleConstraint)
Definition: qmesh.h:557
vector< int > GetUVMapAt(int index)
Definition: qmesh.h:489
QBody * GetOwnerBody()
Definition: qmesh.h:227
QMesh * SetRotation(float value)
Definition: qmesh.h:272
int GetSpringCount()
Definition: qmesh.h:456
int GetSubConvexPolygonCount()
Definition: qmesh.h:409
float GetInitialPolygonArea()
Definition: qmesh.h:189
QMesh * RemoveAngleConstraint(QAngleConstraint *angleConstraint)
Definition: qmesh.h:568
float GetCircumference()
Definition: qmesh.h:213
QMesh * RemoveMatchingAngleConstraints(QParticle *particle)
Definition: qmesh.h:581
float GetInitialArea()
Definition: qmesh.h:178
QMesh * SetPosition(QVector value)
Definition: qmesh.h:256
QMesh * SetMinAngleConstraintOfPolygon(float radian)
Definition: qmesh.h:400
CollisionBehaviors GetCollisionBehavior()
Definition: qmesh.h:233