Browse Source

Particles

Panagiotis Christopoulos Charitos 13 years ago
parent
commit
b98c5bd93d
2 changed files with 49 additions and 3 deletions
  1. 14 3
      include/anki/scene/ParticleEmitter.h
  2. 35 0
      src/scene/ParticleEmitter.cpp

+ 14 - 3
include/anki/scene/ParticleEmitter.h

@@ -79,6 +79,7 @@ public:
 	/// Kill the particle
 	virtual void kill()
 	{
+		ANKI_ASSERT(timeOfDeath > 0.0);
 		timeOfDeath = -1.0;
 	}
 
@@ -91,6 +92,15 @@ public:
 		(void)crntTime;
 	}
 
+	/// Only relevant for non-bullet simulations
+	virtual void simulate(const ParticleEmitter& pe, 
+		F32 prevUpdateTime, F32 crntTime)
+	{
+		(void)pe;
+		(void)prevUpdateTime;
+		(void)crntTime;
+	}
+
 protected:
 	F32 timeOfBirth; ///< Keep the time of birth for nice effects
 	F32 timeOfDeath = -1.0; ///< Time of death. If < 0.0 then dead. In seconds
@@ -107,9 +117,7 @@ public:
 		// SceneNode
 		const char* name, Scene* scene, 
 		// Movable
-		U32 movableFlags, Movable* movParent)
-		: ParticleBase(PT_SIMPLE, name, scene, movableFlags, movParent)
-	{}
+		U32 movableFlags, Movable* movParent);
 
 	void revive(const ParticleEmitter& pe,
 		F32 prevUpdateTime, F32 crntTime)
@@ -118,6 +126,8 @@ public:
 		velocity = Vec3(0.0);
 	}
 
+	void simulate(const ParticleEmitter& pe, F32 prevUpdateTime, F32 crntTime);
+
 private:
 	/// The velocity
 	Vec3 velocity = Vec3(0.0);
@@ -162,6 +172,7 @@ class ParticleEmitter: public SceneNode, public Spatial, public Movable,
 	public Renderable, private ParticleEmitterProperties
 {
 	friend class Particle;
+	friend class ParticleSimple;
 
 public:
 	ParticleEmitter(

+ 35 - 0
src/scene/ParticleEmitter.cpp

@@ -55,6 +55,38 @@ ParticleBase::ParticleBase(
 ParticleBase::~ParticleBase()
 {}
 
+//==============================================================================
+// ParticleSimple                                                              =
+//==============================================================================
+
+//==============================================================================
+ParticleSimple::ParticleSimple(
+	// SceneNode
+	const char* name, Scene* scene, 
+	// Movable
+	U32 movableFlags, Movable* movParent)
+	: ParticleBase(PT_SIMPLE, name, scene, movableFlags, movParent)
+{}
+
+//==============================================================================
+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;
+
+	trf.setOrigin(xc);
+
+	setLocalTransform(trf);
+}
+
 //==============================================================================
 // Particle                                                                    =
 //==============================================================================
@@ -264,6 +296,9 @@ void ParticleEmitter::frameUpdate(F32 prevUpdateTime, F32 crntTime, I frame)
 		}
 		else
 		{
+			// This will calculate a new world transformation
+			p->simulate(*this, prevUpdateTime, crntTime);
+
 			// An alive
 			const Vec3& origin = p->Movable::getWorldTransform().getOrigin();