Panagiotis Christopoulos Charitos 13 éve
szülő
commit
376a21a609

+ 5 - 12
include/anki/scene/ParticleEmitter.h

@@ -85,12 +85,7 @@ public:
 
 	/// Revive the particle
 	virtual void revive(const ParticleEmitter& pe,
-		F32 prevUpdateTime, F32 crntTime)
-	{
-		(void)pe;
-		(void)prevUpdateTime;
-		(void)crntTime;
-	}
+		F32 prevUpdateTime, F32 crntTime);
 
 	/// Only relevant for non-bullet simulations
 	virtual void simulate(const ParticleEmitter& pe, 
@@ -120,11 +115,7 @@ public:
 		U32 movableFlags, Movable* movParent);
 
 	void revive(const ParticleEmitter& pe,
-		F32 prevUpdateTime, F32 crntTime)
-	{
-		ParticleBase::revive(pe, prevUpdateTime, crntTime);
-		velocity = Vec3(0.0);
-	}
+		F32 prevUpdateTime, F32 crntTime);
 
 	void simulate(const ParticleEmitter& pe, F32 prevUpdateTime, F32 crntTime);
 
@@ -171,6 +162,7 @@ public:
 class ParticleEmitter: public SceneNode, public Spatial, public Movable,
 	public Renderable, private ParticleEmitterProperties
 {
+	friend class ParticleBase;
 	friend class Particle;
 	friend class ParticleSimple;
 
@@ -256,7 +248,8 @@ private:
 
 	RenderableVariable* alphaRenderableVar = nullptr;
 
-	void init(const char* filename, Scene* scene);
+	void createParticlesSimulation(Scene* scene);
+	void createParticlesSimpleSimulation(Scene* scene);
 };
 
 } // end namespace anki

+ 1 - 0
include/anki/util/Object.h

@@ -24,6 +24,7 @@ public:
 		: self(self_)
 	{
 		ANKI_ASSERT(self != nullptr && "Self can't be nullptr");
+		ANKI_ASSERT(parent_ != this && "Cannot put itself");
 		if(parent_ != nullptr)
 		{
 			parent_->addChild(self);

+ 7 - 2
src/scene/Movable.cpp

@@ -50,9 +50,14 @@ void Movable::updateWorldTransform()
 			timestamp = crntTimestamp;
 		}
 	}
-	else if(timestamp == crntTimestamp)
+	else
 	{
-		wTrf = lTrf;
+		if(timestamp == crntTimestamp)
+		{
+			wTrf = lTrf;
+		}
+
+		ANKI_ASSERT(wTrf == lTrf && "Somehow timestamp is incorrect");
 	}
 
 	if(timestamp == crntTimestamp)

+ 68 - 18
src/scene/ParticleEmitter.cpp

@@ -55,6 +55,19 @@ ParticleBase::ParticleBase(
 ParticleBase::~ParticleBase()
 {}
 
+//==============================================================================
+void ParticleBase::revive(const ParticleEmitter& pe,
+	F32 /*prevUpdateTime*/, F32 crntTime)
+{
+	ANKI_ASSERT(isDead());
+	const ParticleEmitterProperties& props = pe;
+
+	// life
+	timeOfDeath = getRandom(crntTime + props.particle.life,
+		props.particle.lifeDeviation);
+	timeOfBirth = crntTime;
+}
+
 //==============================================================================
 // ParticleSimple                                                              =
 //==============================================================================
@@ -72,7 +85,7 @@ ParticleSimple::ParticleSimple(
 void ParticleSimple::simulate(const ParticleEmitter& pe,
 	F32 prevUpdateTime, F32 crntTime)
 {
-	F32 dt = crntTime - prevUpdateTime;
+	/*F32 dt = crntTime - prevUpdateTime;
 
 	const ParticleEmitterProperties& props = pe;
 	
@@ -84,6 +97,29 @@ void ParticleSimple::simulate(const ParticleEmitter& pe,
 
 	trf.setOrigin(xc);
 
+	std::cout << xc << std::endl;
+
+	setLocalTransform(trf);*/
+}
+
+//==============================================================================
+void ParticleSimple::revive(const ParticleEmitter& pe,
+	F32 prevUpdateTime, F32 crntTime)
+{
+	ParticleBase::revive(pe, prevUpdateTime, crntTime);
+	velocity = Vec3(0.0);
+
+	const ParticleEmitterProperties& props = pe;
+
+	// Set the initial position
+	Vec3 pos = getRandom(props.particle.startingPos,
+		props.particle.startingPosDeviation);
+
+	pos += pe.getWorldTransform().getOrigin();
+
+	Transform trf;
+	trf.setIdentity();
+	trf.setOrigin(pos);
 	setLocalTransform(trf);
 }
 
@@ -112,7 +148,6 @@ void Particle::revive(const ParticleEmitter& pe,
 	F32 prevUpdateTime, F32 crntTime)
 {
 	ParticleBase::revive(pe, prevUpdateTime, crntTime);
-	ANKI_ASSERT(isDead());
 
 	const ParticleEmitterProperties& props = pe;
 
@@ -122,11 +157,6 @@ void Particle::revive(const ParticleEmitter& pe,
 	Bool forceFlag = props.forceEnabled;
 	Bool worldGravFlag = props.wordGravityEnabled;
 
-	// life
-	timeOfDeath = getRandom(crntTime + props.particle.life,
-		props.particle.lifeDeviation);
-	timeOfBirth = crntTime;
-
 	// activate it (Bullet stuff)
 	body.forceActivationState(ACTIVE_TAG);
 	body.activate();
@@ -192,8 +222,25 @@ ParticleEmitter::ParticleEmitter(
 	: SceneNode(name, scene), Spatial(this, &aabb),
 		Movable(movableFlags, movParent, *this)
 {
-	init(filename, scene);
+	// Load resource
+	particleEmitterResource.load(filename);
+
+	// copy the resource to me
+	ParticleEmitterProperties& me = *this;
+	const ParticleEmitterProperties& other =
+		particleEmitterResource->getProperties();
+	me = other;
 
+	if(usePhysicsEngine)
+	{
+		createParticlesSimulation(scene);
+	}
+	else
+	{
+		createParticlesSimpleSimulation(scene);
+	}
+
+	timeLeftForNextEmission = 0.0;
 	instancesCount = particles.size();
 	Renderable::init(*this);
 
@@ -233,16 +280,8 @@ void ParticleEmitter::movableUpdate()
 }
 
 //==============================================================================
-void ParticleEmitter::init(const char* filename, Scene* scene)
+void ParticleEmitter::createParticlesSimulation(Scene* scene)
 {
-	particleEmitterResource.load(filename);
-
-	// copy the resource to me
-	ParticleEmitterProperties& me = *this;
-	const ParticleEmitterProperties& other = 
-		particleEmitterResource->getProperties();
-	me = other;
-
 	// create the particles
 	collShape.reset(new btSphereShape(particle.size));
 
@@ -264,8 +303,19 @@ void ParticleEmitter::init(const char* filename, Scene* scene)
 
 		part->forceActivationState(DISABLE_SIMULATION);
 	}
+}
 
-	timeLeftForNextEmission = 0.0;
+//==============================================================================
+void ParticleEmitter::createParticlesSimpleSimulation(Scene* scene)
+{
+	for(U i = 0; i < maxNumOfParticles; i++)
+	{
+		ParticleSimple* p = new ParticleSimple(
+			(getName() + std::to_string(i)).c_str(),
+			scene, Movable::MF_NONE, nullptr);
+
+		particles.push_back(p);
+	}
 }
 
 //==============================================================================