diff --git a/Extensions/ParticleSystem/ExtensionSubDeclaration3.cpp b/Extensions/ParticleSystem/ExtensionSubDeclaration3.cpp index 4e3b44e241..f41527c2bb 100644 --- a/Extensions/ParticleSystem/ExtensionSubDeclaration3.cpp +++ b/Extensions/ParticleSystem/ExtensionSubDeclaration3.cpp @@ -207,6 +207,10 @@ void Extension::ExtensionSubDeclaration3(ExtensionObjectInfos & objInfos) DECLARE_END_OBJECT_CONDITION() + DECLARE_OBJECT_STR_EXPRESSION("Texture", _("Image des particules"), _("Nom de l'image affichée par les particules"), _("Particules"), "Extensions/particleSystemicon16.png", &ParticleEmitterObject::ExpTexture) + DECLARE_PARAMETER("object", _("Objet"), true, "ParticleEmitter") + DECLARE_END_OBJECT_STR_EXPRESSION() + DECLARE_OBJECT_EXPRESSION("NbParticles", _("Nombre de particules"), _("Nombre de particules"), _("Particules"), "Extensions/particleSystemicon16.png", &ParticleEmitterObject::ExpNbParticles) DECLARE_PARAMETER("object", _("Objet"), true, "ParticleEmitter") DECLARE_END_OBJECT_EXPRESSION() diff --git a/Extensions/ParticleSystem/ParticleEmitterActions.cpp b/Extensions/ParticleSystem/ParticleEmitterActions.cpp index 39b8a90521..1259d0367e 100644 --- a/Extensions/ParticleSystem/ParticleEmitterActions.cpp +++ b/Extensions/ParticleSystem/ParticleEmitterActions.cpp @@ -683,7 +683,22 @@ bool ParticleEmitterObject::ActParticleAngleRandomness2( RuntimeScene & scene, O bool ParticleEmitterObject::ActTexture( RuntimeScene & scene, ObjectsConcerned & objectsConcerned, const Instruction & action ) { textureParticleName = action.GetParameter(1).GetAsTextExpressionResult(scene, objectsConcerned, shared_from_this()); - if ( rendererType == Quad ) particleSystem.openGLTextureParticle = scene.game->imageManager->GetOpenGLTexture(textureParticleName); + if ( rendererType == Quad ) + { + //Load new texture + particleSystem.openGLTextureParticle = scene.game->imageManager->GetOpenGLTexture(textureParticleName); + + //Notify the renderer of the change + SPK::GL::GLQuadRenderer * quadRenderer = dynamic_cast(particleSystem.renderer); + + if ( quadRenderer && particleSystem.openGLTextureParticle->GetOpenGLTexture() != 0 ) + { + quadRenderer->setTexturingMode(SPK::TEXTURE_2D); + quadRenderer->setTexture(particleSystem.openGLTextureParticle->GetOpenGLTexture()); + } + } + + return true; } bool ParticleEmitterObject::ActRecreateParticleSystem( RuntimeScene & scene, ObjectsConcerned & objectsConcerned, const Instruction & action ) diff --git a/Extensions/ParticleSystem/ParticleEmitterObject.cpp b/Extensions/ParticleSystem/ParticleEmitterObject.cpp index 283192aaf7..ec16fb7702 100644 --- a/Extensions/ParticleSystem/ParticleEmitterObject.cpp +++ b/Extensions/ParticleSystem/ParticleEmitterObject.cpp @@ -382,9 +382,8 @@ void ParticleEmitterObject::CreateParticleSystem() UpdateLifeTime(); // Create the renderer - SPK::GL::GLRenderer* renderer = NULL; if ( rendererType == Line ) - renderer = SPK::GL::GLLineRenderer::create(rendererParam1,rendererParam2); + particleSystem.renderer = SPK::GL::GLLineRenderer::create(rendererParam1,rendererParam2); else if ( rendererType == Quad) { SPK::GL::GLQuadRenderer * quadRenderer = new SPK::GL::GLQuadRenderer(rendererParam1,rendererParam2); @@ -395,7 +394,7 @@ void ParticleEmitterObject::CreateParticleSystem() quadRenderer->setTexture(particleSystem.openGLTextureParticle->GetOpenGLTexture()); } - renderer = quadRenderer; + particleSystem.renderer = quadRenderer; } else { @@ -403,14 +402,14 @@ void ParticleEmitterObject::CreateParticleSystem() pointRenderer->setType(SPK::POINT_CIRCLE); pointRenderer->setSize(rendererParam1); - renderer = pointRenderer; + particleSystem.renderer = pointRenderer; } - renderer->enableBlending(true); - if ( additive ) renderer->setBlendingFunctions(GL_SRC_ALPHA,GL_ONE); - else renderer->setBlendingFunctions(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - renderer->setTextureBlending(GL_MODULATE); //Texture color modulated with particle color - renderer->enableRenderingHint(SPK::DEPTH_TEST,false); //No depth test for performance + particleSystem.renderer->enableBlending(true); + if ( additive ) particleSystem.renderer->setBlendingFunctions(GL_SRC_ALPHA,GL_ONE); + else particleSystem.renderer->setBlendingFunctions(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + particleSystem.renderer->setTextureBlending(GL_MODULATE); //Texture color modulated with particle color + particleSystem.renderer->enableRenderingHint(SPK::DEPTH_TEST,false); //No depth test for performance // Create the zone particleSystem.zone = SPK::Sphere::create(SPK::Vector3D(GetX()*0.25f, -GetY()*0.25f, 0.0f), zoneRadius); @@ -427,7 +426,7 @@ void ParticleEmitterObject::CreateParticleSystem() particleSystem.group->addEmitter(particleSystem.emitter); particleSystem.group->setGravity(SPK::Vector3D(particleGravityX,-particleGravityY,particleGravityZ)); particleSystem.group->setFriction(friction); - particleSystem.group->setRenderer(renderer); + particleSystem.group->setRenderer(particleSystem.renderer); // Create the System particleSystem.particleSystem = SPK::System::create(); diff --git a/Extensions/ParticleSystem/ParticleSystemExtension.layout b/Extensions/ParticleSystem/ParticleSystemExtension.layout index 376780db7a..9ccadc6fb4 100644 --- a/Extensions/ParticleSystem/ParticleSystemExtension.layout +++ b/Extensions/ParticleSystem/ParticleSystemExtension.layout @@ -7,20 +7,20 @@ - - + + - - + + - - + + - - + + - - + + @@ -31,11 +31,11 @@ - - + + - - + + @@ -43,10 +43,10 @@ - - + + - - + + diff --git a/Extensions/ParticleSystem/ParticleSystemWrapper.cpp b/Extensions/ParticleSystem/ParticleSystemWrapper.cpp index f506cfcccd..f44591ad75 100644 --- a/Extensions/ParticleSystem/ParticleSystemWrapper.cpp +++ b/Extensions/ParticleSystem/ParticleSystemWrapper.cpp @@ -34,7 +34,8 @@ particleSystem(NULL), particleModel(NULL), emitter(NULL), zone(NULL), -group(NULL) +group(NULL), +renderer(NULL) { if ( !SPKinitialized ) { @@ -53,6 +54,7 @@ ParticleSystemWrapper::~ParticleSystemWrapper() if ( emitter ) delete emitter; if ( zone ) delete zone; if ( group ) delete group; + if ( renderer ) delete renderer; } void ParticleSystemWrapper::Init(const ParticleSystemWrapper & other) @@ -62,6 +64,7 @@ void ParticleSystemWrapper::Init(const ParticleSystemWrapper & other) if ( emitter ) delete emitter; if ( zone ) delete zone; if ( group ) delete group; + if ( renderer ) delete renderer; //Don't initialize members if the other object's member are NULL. if ( other.particleModel == NULL ) return; diff --git a/Extensions/ParticleSystem/ParticleSystemWrapper.h b/Extensions/ParticleSystem/ParticleSystemWrapper.h index 7de465cd78..9b7f61966d 100644 --- a/Extensions/ParticleSystem/ParticleSystemWrapper.h +++ b/Extensions/ParticleSystem/ParticleSystemWrapper.h @@ -50,6 +50,7 @@ class ParticleSystemWrapper emitter = NULL; zone = NULL; group = NULL; + renderer = NULL; Init(other); }; ParticleSystemWrapper & operator=(const ParticleSystemWrapper & other) @@ -64,6 +65,7 @@ class ParticleSystemWrapper SPK::SphericEmitter * emitter; SPK::Sphere * zone; SPK::Group * group; + SPK::GL::GLRenderer * renderer; boost::shared_ptr openGLTextureParticle; private: