particle system with exori flam

This commit is contained in:
Henrique Santiago
2011-12-19 01:24:35 -02:00
parent ab9efe5a95
commit 56a392f681
11 changed files with 84 additions and 43 deletions

View File

@@ -34,7 +34,7 @@ void Painter::init()
{
setColor(Fw::white);
setOpacity(255);
setCompositionMode(CompositionMode_SourceOver);
setCompositionMode(CompositionMode_Normal);
m_drawTexturedProgram = PainterShaderProgramPtr(new PainterShaderProgram);
m_drawTexturedProgram->addShaderFromSourceCode(Shader::Vertex, glslMainWithTexCoordsVertexShader + glslPositionOnlyVertexShader);
@@ -154,13 +154,13 @@ void Painter::setCustomProgram(PainterShaderProgramPtr program)
void Painter::setCompositionMode(Painter::CompositionMode compositionMode)
{
switch(compositionMode) {
case CompositionMode_SourceOver:
case CompositionMode_Normal:
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
break;
case CompositionMode_ColorizeSource:
case CompositionMode_Multiply:
glBlendFunc(GL_DST_COLOR, GL_ONE_MINUS_SRC_ALPHA);
break;
case CompositionMode_AdditiveSource:
case CompositionMode_Addition:
glBlendFunc(GL_SRC_ALPHA, GL_ONE);
break;
}

View File

@@ -32,9 +32,9 @@ class Painter
{
public:
enum CompositionMode {
CompositionMode_SourceOver,
CompositionMode_ColorizeSource,
CompositionMode_AdditiveSource
CompositionMode_Normal,
CompositionMode_Multiply,
CompositionMode_Addition
};
void init();

View File

@@ -24,7 +24,7 @@
#include "graphics.h"
#include <framework/core/clock.h>
Particle::Particle(const Point& pos, const Size& startSize, const Size& finalSize, const PointF& velocity, const PointF& acceleration, float duration, float ignorePhysicsAfter, const std::vector<Color>& colors, const std::vector<float>& colorsStops, TexturePtr texture)
Particle::Particle(const Point& pos, const Size& startSize, const Size& finalSize, const PointF& velocity, const PointF& acceleration, float duration, float ignorePhysicsAfter, const std::vector<Color>& colors, const std::vector<float>& colorsStops, Painter::CompositionMode compositionMode, TexturePtr texture)
{
m_colors = colors;
m_colorsStops = colorsStops;
@@ -35,6 +35,7 @@ Particle::Particle(const Point& pos, const Size& startSize, const Size& finalSiz
m_velocity = velocity;
m_acceleration = acceleration;
m_compositionMode = compositionMode;
m_texture = texture;
m_duration = duration;
m_ignorePhysicsAfter = ignorePhysicsAfter;
@@ -49,9 +50,9 @@ void Particle::render()
if(!m_texture)
g_painter.drawFilledRect(m_rect);
else {
g_painter.setCompositionMode(Painter::CompositionMode_AdditiveSource);
g_painter.setCompositionMode(m_compositionMode);
g_painter.drawTexturedRect(m_rect, m_texture);
g_painter.setCompositionMode(Painter::CompositionMode_SourceOver);
g_painter.setCompositionMode(Painter::CompositionMode_Normal);
}
}

View File

@@ -24,11 +24,12 @@
#define PARTICLE_H
#include "declarations.h"
#include "painter.h"
#include <framework/global.h>
class Particle {
public:
Particle(const Point& pos, const Size& startSize, const Size& finalSize, const PointF& velocity, const PointF& acceleration, float duration, float ignorePhysicsAfter, const std::vector<Color>& colors, const std::vector<float>& colorsStops, TexturePtr texture = nullptr);
Particle(const Point& pos, const Size& startSize, const Size& finalSize, const PointF& velocity, const PointF& acceleration, float duration, float ignorePhysicsAfter, const std::vector<Color>& colors, const std::vector<float>& colorsStops, Painter::CompositionMode compositionMode = Painter::CompositionMode_Normal, TexturePtr texture = nullptr);
void render();
void update(double elapsedTime);
@@ -53,6 +54,7 @@ private:
PointF m_acceleration;
Size m_size, m_startSize, m_finalSize;
Rect m_rect;
Painter::CompositionMode m_compositionMode;
float m_duration, m_ignorePhysicsAfter;
double m_elapsedTime;
bool m_finished;

View File

@@ -112,6 +112,8 @@ bool AttractionAffector::load(const OTMLNodePtr& node)
return false;
m_acceleration = 32;
m_reduction = 0;
m_repelish = false;
for(const OTMLNodePtr& childNode : node->children()) {
if(childNode->tag() == "position")
@@ -120,6 +122,8 @@ bool AttractionAffector::load(const OTMLNodePtr& node)
m_acceleration = childNode->value<float>();
else if(childNode->tag() == "velocity-reduction-percent")
m_reduction = childNode->value<float>();
else if(childNode->tag() == "repelish")
m_repelish = childNode->value<bool>();
}
return true;
}
@@ -134,6 +138,10 @@ void AttractionAffector::updateParticle(const ParticlePtr& particle, double elap
if(d.length() == 0)
return;
PointF pVelocity = particle->getVelocity() + (d / d.length() * m_acceleration * elapsedTime);
PointF direction = PointF(1, 1);
if(m_repelish)
direction = PointF(-1, -1);
PointF pVelocity = particle->getVelocity() + (d / d.length() * m_acceleration * elapsedTime) * direction;
particle->setVelocity(pVelocity - pVelocity * m_reduction/100.0 * elapsedTime);
}

View File

@@ -60,6 +60,7 @@ public:
private:
Point m_position;
float m_acceleration, m_reduction;
bool m_repelish;
};
#endif

View File

@@ -159,6 +159,14 @@ bool ParticleEmitter::load(const OTMLNodePtr& node)
m_pColorsStops = Fw::split<float>(childNode->value());
else if(childNode->tag() == "particle-texture")
m_pTexture = g_textures.getTexture(childNode->value());
else if(childNode->tag() == "particle-composition-mode") {
if(childNode->value() == "normal")
m_pCompositionMode = Painter::CompositionMode_Normal;
else if(childNode->value() == "multiply")
m_pCompositionMode = Painter::CompositionMode_Multiply;
else if(childNode->value() == "addition")
m_pCompositionMode = Painter::CompositionMode_Addition;
}
}
if(m_pColors.empty())
@@ -210,7 +218,7 @@ void ParticleEmitter::update(double elapsedTime)
PointF pAcceleration(pAccelerationAbs * cos(pAccelerationAngle), pAccelerationAbs * sin(pAccelerationAngle));
ParticleSystemPtr particleSystem = m_parent.lock();
particleSystem->addParticle(ParticlePtr(new Particle(pPosition, m_pStartSize, m_pFinalSize, pVelocity, pAcceleration, pDuration, m_pIgnorePhysicsAfter, m_pColors, m_pColorsStops, m_pTexture)));
particleSystem->addParticle(ParticlePtr(new Particle(pPosition, m_pStartSize, m_pFinalSize, pVelocity, pAcceleration, pDuration, m_pIgnorePhysicsAfter, m_pColors, m_pColorsStops, m_pCompositionMode, m_pTexture)));
}
}

View File

@@ -24,6 +24,7 @@
#define PARTICLEEMITTER_H
#include "declarations.h"
#include "painter.h"
#include <framework/global.h>
#include <framework/graphics/texture.h>
#include <framework/otml/otml.h>
@@ -73,6 +74,7 @@ private:
std::vector<Color> m_pColors;
std::vector<float> m_pColorsStops;
TexturePtr m_pTexture;
Painter::CompositionMode m_pCompositionMode;
};
#endif