Jelajahi Sumber

Particle emitter

Panagiotis Christopoulos Charitos 15 tahun lalu
induk
melakukan
45549e06ae
4 mengubah file dengan 36 tambahan dan 1 penghapusan
  1. 3 1
      build/debug/Makefile
  2. 24 0
      src/Scene/ParticleEmitter.cpp
  3. 7 0
      src/Scene/Scene.cpp
  4. 2 0
      src/Scene/Scene.h

+ 3 - 1
build/debug/Makefile

@@ -2282,7 +2282,9 @@ Scene.o: ../../src/Scene//Scene.cpp ../../src/Scene//Scene.h \
  ../../src/Resources/Mesh.h \
  ../../src/Scene/Controllers/MeshSkelNodeCtrl.h ../../src/Scene//Light.h \
  ../../src/Resources/LightProps.h \
- ../../src/Scene/Controllers/Controller.h
+ ../../src/Scene/Controllers/Controller.h \
+ ../../src/Scene//ParticleEmitter.h ../../src/Scene//GhostNode.h \
+ ../../src/Physics/PhyCommon.h ../../src/Resources/ParticleEmitterProps.h
 	@echo Compiling ../../src/Scene//Scene.cpp...
 	@$(CXX) $(INCPATH) $(CFLAGS) ../../src/Scene//Scene.cpp -o Scene.o
 

+ 24 - 0
src/Scene/ParticleEmitter.cpp

@@ -35,6 +35,28 @@ void ParticleEmitter::init(const char* filename)
 	ParticleEmitterPropsStruct& me = *this;
 	ParticleEmitterPropsStruct& other = *particleEmitterProps.get();
 	me = other;
+
+	// create the particles
+	btCollisionShape* colShape = new btSphereShape(0.5);
+	btTransform startTransform;
+	startTransform.setIdentity();
+
+	particles.resize(maxNumOfParticles);
+	for(uint i = 0; i < maxNumOfParticles; i++)
+	{
+		particles[i] = new Particle;
+		float mass = particleMass + randFloat(particleMassMargin) * 2.0 - particleMassMargin;
+
+		/*btVector3 origin = startTransform.getOrigin();
+		 origin.setX( origin.getX() + 0.6*2.0);
+		 startTransform.setOrigin(origin);*/
+
+		btRigidBody* body = physics->createNewRigidBody(mass, startTransform, colShape, Physics::CG_PARTICLE, Physics::CG_ALL
+		    ^ Physics::CG_PARTICLE);
+		body->forceActivationState(DISABLE_SIMULATION);
+		//body->setActivationState(ISLAND_SLEEPING);
+		particles[i]->body = body;
+	}
 }
 
 
@@ -81,6 +103,8 @@ void ParticleEmitter::update()
 			Particle& p = particles[i];
 			if(p.timeOfDeath > 0.0) continue; // its alive so skip it
 
+			INFO("Reiniting " << i);
+
 			// life
 			if(particleLifeMargin != 0.0)
 				p.timeOfDeath = crntTime + particleLife + Util::randFloat(particleLifeMargin) * 2.0 - particleLifeMargin;

+ 7 - 0
src/Scene/Scene.cpp

@@ -6,6 +6,7 @@
 #include "Light.h"
 #include "Controller.h"
 #include "Material.h"
+#include "ParticleEmitter.h"
 
 
 //======================================================================================================================
@@ -44,6 +45,9 @@ void Scene::registerNode(SceneNode* node)
 		case SceneNode::NT_SKEL_MODEL:
 			// ToDo
 			break;
+		case SceneNode::NT_PARTICLE_EMITTER:
+			putBackNode(particleEmitters, static_cast<ParticleEmitter*>(node));
+			break;
 	};
 }
 
@@ -72,6 +76,9 @@ void Scene::unregisterNode(SceneNode* node)
 		case SceneNode::NT_SKEL_MODEL:
 			// ToDo
 			break;
+		case SceneNode::NT_PARTICLE_EMITTER:
+			eraseNode(particleEmitters, static_cast<ParticleEmitter*>(node));
+			break;
 	};
 }
 

+ 2 - 0
src/Scene/Scene.h

@@ -12,6 +12,7 @@ class Camera;
 class MeshNode;
 class SkelNode;
 class Controller;
+class ParticleEmitter;
 
 
 /**
@@ -57,6 +58,7 @@ class Scene
 		Container<MeshNode>   meshNodes;
 		Container<SkelNode>   skelNodes;
 		Container<Controller> controllers;
+		Container<ParticleEmitter> particleEmitters;
 		Skybox                skybox; // ToDo to be removed
 
 		// The funcs