Ver Fonte

Physics

Panagiotis Christopoulos Charitos há 15 anos atrás
pai
commit
d9e8208f2a

Diff do ficheiro suprimidas por serem muito extensas
+ 434 - 431
build/debug/Makefile


+ 2 - 2
src/Main.cpp

@@ -265,12 +265,12 @@ void init()
 	imp->meshNodes[0]->meshSkelCtrl->skelNode->skelAnimCtrl->step = 0.8;
 
 	// cave map
-	for(int i=1; i<21; i++)
+	/*for(int i=1; i<21; i++)
 	{
 		MeshNode* node = new MeshNode();
 		node->init(("maps/cave/rock." + lexical_cast<string>(i) + ".mesh").c_str());
 		node->setLocalTransform(Transform(Vec3(0.0, -0.0, 0.0), Mat3::getIdentity(), 0.01));
-	}
+	}*/
 
 	// particle emitter
 	partEmitter = new ParticleEmitter;

+ 3 - 7
src/Physics/MotionState.h

@@ -4,16 +4,15 @@
 #include "Common.h"
 #include "PhyCommon.h"
 #include "SceneNode.h"
-#include "Object.h"
 
 
 /**
  * A custom motion state
  */
-class MotionState: public btMotionState, public Object
+class MotionState: public btMotionState
 {
 	public:
-		MotionState(const btTransform& initialTransform, SceneNode& node_, Object* parent = NULL);
+		MotionState(const btTransform& initialTransform, SceneNode& node_);
 
 		~MotionState() {}
 
@@ -33,8 +32,7 @@ class MotionState: public btMotionState, public Object
 // Inlines                                                                                                             =
 //======================================================================================================================
 
-inline MotionState::MotionState(const btTransform& initialTransform, SceneNode& node_, Object* parent):
-	Object(parent),
+inline MotionState::MotionState(const btTransform& initialTransform, SceneNode& node_):
 	worldTransform(initialTransform),
 	node(node_)
 {}
@@ -62,6 +60,4 @@ inline void MotionState::setWorldTransform(const btTransform& worldTrans)
 }
 
 
-
-
 #endif

+ 38 - 6
src/Physics/RigidBody.cpp

@@ -8,9 +8,8 @@
 // Constructor                                                                                                         =
 //======================================================================================================================
 RigidBody::RigidBody(float mass, const Transform& startTransform, btCollisionShape* shape, SceneNode* node,
-                     int group, int mask, Object* parent):
-  btRigidBody(btRigidBody::btRigidBodyConstructionInfo(0.0, NULL, NULL, btVector3(0.0, 0.0, 0.0))),
-	Object(parent)
+                     int group, int mask):
+  btRigidBody(btRigidBody::btRigidBodyConstructionInfo(0.0, NULL, NULL, btVector3(0.0, 0.0, 0.0))) // dummy init
 {
 	DEBUG_ERR(shape==NULL || shape->getShapeType()==INVALID_SHAPE_PROXYTYPE);
 
@@ -20,16 +19,49 @@ RigidBody::RigidBody(float mass, const Transform& startTransform, btCollisionSha
 	if(isDynamic)
 		shape->calculateLocalInertia(mass,localInertia);
 
-	MotionState* myMotionState = new MotionState(toBt(startTransform), *node, this);
+	motionState.reset(new MotionState(toBt(startTransform), *node));
 
-	btRigidBody::btRigidBodyConstructionInfo cInfo(mass, myMotionState, shape, localInertia);
+	btRigidBody::btRigidBodyConstructionInfo cInfo(mass, motionState.get(), shape, localInertia);
 
 	setupRigidBody(cInfo);
 
-	setContactProcessingThreshold(defaultContactProcessingThreshold);
+	setContactProcessingThreshold(app->getScene()->getPhysics()->getDefaultContactProcessingThreshold());
 
 	if(mask==-1 || group==-1)
 		app->getScene()->getPhysics()->getDynamicsWorld()->addRigidBody(this);
 	else
 		app->getScene()->getPhysics()->getDynamicsWorld()->addRigidBody(this, group, mask);
 }
+
+
+//======================================================================================================================
+// RigidBody                                                                                                           =
+//======================================================================================================================
+RigidBody::~RigidBody()
+{
+	// find the body
+	RigidBody* body = NULL;
+	btCollisionObject* obj;
+	int i;
+	for(i=0; i<app->getScene()->getPhysics()->getDynamicsWorld()->getNumCollisionObjects(); i++)
+	{
+		obj = app->getScene()->getPhysics()->getDynamicsWorld()->getCollisionObjectArray()[i];
+		RigidBody* body1 = static_cast<RigidBody*>(btRigidBody::upcast(obj)); // from btCollisionShapt to RigidBody
+
+		if(body1 == this)
+		{
+			body = body1;
+			break;
+		}
+	}
+
+	// check
+	if(body == NULL)
+	{
+		ERROR("Cannot find body 0x" << hex << body);
+		return;
+	}
+
+	// remove it from world
+	app->getScene()->getPhysics()->getDynamicsWorld()->removeCollisionObject(obj);
+}

+ 17 - 9
src/Physics/RigidBody.h

@@ -1,35 +1,43 @@
 #ifndef MY_RIGIDBODY_H // Watch the naming cause Bullet uses the same
 #define MY_RIGIDBODY_H
 
+#include <memory>
 #include <btBulletDynamicsCommon.h>
 #include <btBulletCollisionCommon.h>
 #include "Common.h"
-#include "Object.h"
 #include "Math.h"
 
 
 class SceneNode;
+class MotionState;
 
 
 /**
  * Wrapper for rigid body
  */
-class RigidBody: public btRigidBody, public Object
+class RigidBody: public btRigidBody
 {
+	private:
+		auto_ptr<MotionState> motionState; ///< Keep it here as well for garbage collection
+
 	public:
 		/**
-		 *
+		 * Create and register
 		 * @param mass
-		 * @param startTransform
+		 * @param startTransform Initial pos
 		 * @param shape
 		 * @param node
-		 * @param group
-		 * @param mask
-		 * @param parent
-		 * @return
+		 * @param group -1 if not used
+		 * @param mask -1 if not used
+		 * @param parent Object stuff
 		 */
 		RigidBody(float mass, const Transform& startTransform, btCollisionShape* shape, SceneNode* node,
-		          int group = -1, int mask = -1, Object* parent = NULL);
+		          int group = -1, int mask = -1);
+
+		/**
+		 * Unregister it
+		 */
+		~RigidBody();
 };
 
 

+ 2 - 0
src/Renderer/Dbg.cpp

@@ -275,8 +275,10 @@ void Renderer::Dbg::run()
 	}
 
 	// Physics
+	glPolygonMode(GL_FRONT, GL_LINE);
 	setModelMat(Mat4::getIdentity());
 	app->getScene()->getPhysics()->getDynamicsWorld()->debugDrawWorld();
+	glPolygonMode(GL_FRONT, GL_FILL);
 }
 
 

+ 5 - 6
src/Resources/ParticleEmitterProps.cpp

@@ -53,17 +53,16 @@ bool ParticleEmitterProps::load(const char* filename)
 	particleLife = 7.0;
 	particleLifeMargin = 2.0;
 
-	forceDirection = Vec3(0.0, 0.000001, 0.0);
-	forceDirectionMargin = Vec3(1.0, 0.0, 1.0);
-	forceMagnitude = 200.0;
+	forceDirection = Vec3(0.0, 0.1, 0.0);
+	forceDirectionMargin = Vec3(0.0, 0.0, 0.0);
+	forceMagnitude = 900.0;
 	forceMagnitudeMargin = 100.0;
 
 	particleMass = 1.0;
 	particleMassMargin = 0.0;
 
-	usingWorldGrav = false;
-	gravity = Vec3(0.0, 10.0, 0.0);
-	gravityMargin = Vec3(0.0, 0.0, 0.0);
+	/*gravity = Vec3(0.0, 10.0, 0.0);
+	gravityMargin = Vec3(0.0, 0.0, 0.0);*/
 
 	startingPos = Vec3(0.0, 1.0, 0.0);
 	startingPosMargin = Vec3(0.0, 0.0, 0.0);

+ 2 - 3
src/Scene/ParticleEmitter.cpp

@@ -47,9 +47,8 @@ void ParticleEmitter::init(const char* filename)
 		Particle* particle = &particles.back();
 		float mass = particleMass + Util::randFloat(particleMassMargin) * 2.0 - particleMassMargin;
 
-		btRigidBody* body = app->getScene()->getPhysics()->createNewRigidBody(mass, startTransform, colShape, particle,
-		                                                                      Physics::CG_PARTICLE,
-		                                                                      Physics::CG_ALL ^ Physics::CG_PARTICLE);
+		RigidBody* body = new RigidBody(mass, startTransform, colShape, particle, Physics::CG_PARTICLE,
+		                                Physics::CG_ALL ^ Physics::CG_PARTICLE); ///@todo add parent
 		body->forceActivationState(DISABLE_SIMULATION);
 
 		particle->body = body;

+ 2 - 2
src/Scene/ParticleEmitter.h

@@ -6,8 +6,8 @@
 #include "SceneNode.h"
 #include "MeshNode.h"
 #include "GhostNode.h"
-#include "PhyCommon.h"
 #include "ParticleEmitterProps.h"
+#include "RigidBody.h"
 
 
 /**
@@ -23,7 +23,7 @@ class ParticleEmitter: public SceneNode, public ParticleEmitterPropsStruct
 		{
 			public:
 				float timeOfDeath; ///< Life of death. If < 0.0 then dead. In seconds
-				btRigidBody* body;
+				RigidBody* body;
 
 				Particle();
 				void render();

Alguns ficheiros não foram mostrados porque muitos ficheiros mudaram neste diff