Ivan Safrin 14 лет назад
Родитель
Сommit
4dc2969591

+ 9 - 3
Core/Contents/Include/PolyParticleEmitter.h

@@ -51,6 +51,8 @@ namespace Polycode {
 			ParticleEmitter(const String& imageFile, Mesh *particleMesh, int particleType, int emitterType, Number lifespan, unsigned int numParticles, Vector3 direction, Vector3 gravity, Vector3 deviation);
 			virtual ~ParticleEmitter();
 		
+			virtual void dispatchTriggerCompleteEvent() = 0;
+		
 			void createParticles();
 			
 			/**
@@ -133,7 +135,7 @@ namespace Polycode {
 			void setParticleCount(int count);
 		
 			virtual void addParticleBody(Entity *particleBody) {}
-			virtual Matrix4 getBaseMatrix() const {Matrix4 m; return m;}
+			virtual Matrix4 getBaseMatrix() = 0;
 		
 			/**
 			* Particle movement speed multiplier
@@ -270,9 +272,11 @@ namespace Polycode {
 		
 		void respawnSceneParticles();
 		void addParticleBody(Entity *particleBody);
-		Matrix4 getBaseMatrix() const;
+		Matrix4 getBaseMatrix();
 		void Update();
 		
+		void dispatchTriggerCompleteEvent();
+		
 	protected:
 		SceneMesh *emitterMesh;		
 		Scene *particleParentScene;
@@ -291,8 +295,10 @@ namespace Polycode {
 		*/ 		
 		ParticleEmitter *getEmitter() { return this; }		
 		
+		void dispatchTriggerCompleteEvent();
+		
 		void addParticleBody(Entity *particleBody);
-		Matrix4 getBaseMatrix() const;
+		Matrix4 getBaseMatrix();
 		void Update();
 		
 	protected:

+ 18 - 3
Core/Contents/Source/PolyParticleEmitter.cpp

@@ -62,7 +62,12 @@ void SceneParticleEmitter::addParticleBody(Entity *particleBody) {
 	particleParentScene->addEntity((SceneEntity*)particleBody);	
 }
 
-Matrix4 SceneParticleEmitter::getBaseMatrix() const {
+void SceneParticleEmitter::dispatchTriggerCompleteEvent() {
+	((EventDispatcher*)this)->dispatchEvent(new Event(Event::COMPLETE_EVENT), Event::COMPLETE_EVENT);
+}
+
+Matrix4 SceneParticleEmitter::getBaseMatrix() {
+	rebuildTransformMatrix();
 	return getConcatenatedMatrix();	
 }
 
@@ -82,7 +87,11 @@ ScreenEntity()
 }
 
 ScreenParticleEmitter::~ScreenParticleEmitter(){ 
-	
+	particleParentScreen->removeChild(this);
+	for(int i=0;i < particles.size(); i++) {
+		particleParentScreen->removeChild((ScreenEntity*)particles[i]->particleBody);
+		delete particles[i];
+	}
 }
 
 void ScreenParticleEmitter::Update() {
@@ -93,7 +102,12 @@ void ScreenParticleEmitter::addParticleBody(Entity *particleBody) {
 	particleParentScreen->addChild((ScreenEntity*)particleBody);
 }
 
-Matrix4 ScreenParticleEmitter::getBaseMatrix() const {
+void ScreenParticleEmitter::dispatchTriggerCompleteEvent() {
+	((EventDispatcher*)this)->dispatchEvent(new Event(Event::COMPLETE_EVENT), Event::COMPLETE_EVENT);
+}
+
+Matrix4 ScreenParticleEmitter::getBaseMatrix() {
+	rebuildTransformMatrix();
 	return getConcatenatedMatrix();
 }
 
@@ -379,6 +393,7 @@ void ParticleEmitter::updateEmitter() {
 			if(emitterType == CONTINUOUS_EMITTER) {
 				resetParticle(particle);
 			} else {
+				dispatchTriggerCompleteEvent();
 //				particle->particleBody->visible = false;
 			}
 		}