Browse Source

Particles: fixing a bug

Panagiotis Christopoulos Charitos 13 years ago
parent
commit
d47fab94fd

+ 1 - 0
include/anki/scene/ParticleEmitter.h

@@ -122,6 +122,7 @@ public:
 private:
 	/// The velocity
 	Vec3 velocity = Vec3(0.0);
+	Vec3 acceleration = Vec3(0.0);
 };
 
 /// Particle for bullet simulations

+ 3 - 2
src/physics/PhysWorld.cpp

@@ -17,7 +17,7 @@ PhysWorld::PhysWorld()
 	sol = new btSequentialImpulseConstraintSolver;
 	dynamicsWorld = new btDiscreteDynamicsWorld(
 		dispatcher, broadphase, sol, collisionConfiguration);
-	dynamicsWorld->setGravity(btVector3(0,-10, 0));
+	dynamicsWorld->setGravity(btVector3(0, -10, 0));
 }
 
 //==============================================================================
@@ -37,7 +37,8 @@ void PhysWorld::setDebugDrawer(btIDebugDraw* newDebugDrawer)
 //==============================================================================
 void PhysWorld::update(F32 prevUpdateTime, F32 crntTime)
 {
-	dynamicsWorld->stepSimulation(crntTime - prevUpdateTime);
+	F32 dt = crntTime - prevUpdateTime;
+	dynamicsWorld->stepSimulation(dt);
 
 	// updateNonRigidBodiesMotionStates
 	for(U i = 0; i < characters.size(); i++)

+ 6 - 3
src/scene/ParticleEmitter.cpp

@@ -86,18 +86,18 @@ void ParticleSimple::simulate(const ParticleEmitter& pe,
 	F32 prevUpdateTime, F32 crntTime)
 {
 	F32 dt = crntTime - prevUpdateTime;
-
-	const ParticleEmitterProperties& props = pe;
 	
 	ANKI_ASSERT(props.particle.gravity.getLength() > 0.0);
 
 	Transform trf = getWorldTransform();
 	Vec3 xp = trf.getOrigin();
-	Vec3 xc = props.particle.gravity * (dt * dt) + velocity * dt + xp;
+	Vec3 xc = acceleration * (dt * dt) + velocity * dt + xp;
 
 	trf.setOrigin(xc);
 
 	setLocalTransform(trf);
+
+	velocity += acceleration * dt;
 }
 
 //==============================================================================
@@ -109,6 +109,9 @@ void ParticleSimple::revive(const ParticleEmitter& pe,
 
 	const ParticleEmitterProperties& props = pe;
 
+	acceleration = getRandom(props.particle.gravity,
+			props.particle.gravityDeviation);
+
 	// Set the initial position
 	Vec3 pos = getRandom(props.particle.startingPos,
 		props.particle.startingPosDeviation);

+ 2 - 2
testapp/Main.cpp

@@ -68,12 +68,12 @@ void initPhysics()
 
 	new RigidBody(&SceneSingleton::get().getPhysics(), init);
 
-#if 0
+#if 1
 	btCollisionShape* colShape = new btBoxShape(
 	    btVector3(1, 1, 1));
 
 	init.startTrf.setOrigin(Vec3(0.0, 15.0, 0.0));
-	init.mass = 1;
+	init.mass = 20;
 	init.shape = colShape;
 	init.group = PhysWorld::CG_PARTICLE;
 	init.mask = PhysWorld::CG_MAP | PhysWorld::CG_PARTICLE;