diff --git a/keyframeChannel.h b/keyframeChannel.h index 0874f86..bf23291 100644 --- a/keyframeChannel.h +++ b/keyframeChannel.h @@ -32,7 +32,23 @@ namespace vb01{ SPECULAR_COLOR_Z, TEXTURE_FRAME_A, TEXTURE_FRAME_B, - TEXTURE_MIX_RATIO + TEXTURE_MIX_RATIO, + PARTICLE_EMITTER_SPEED, + PARTICLE_EMITTER_SPREAD, + PARTICLE_EMITTER_START_COLOR_W, + PARTICLE_EMITTER_START_COLOR_X, + PARTICLE_EMITTER_START_COLOR_Y, + PARTICLE_EMITTER_START_COLOR_Z, + PARTICLE_EMITTER_END_COLOR_W, + PARTICLE_EMITTER_END_COLOR_X, + PARTICLE_EMITTER_END_COLOR_Y, + PARTICLE_EMITTER_END_COLOR_Z, + PARTICLE_EMITTER_START_SIZE_X, + PARTICLE_EMITTER_START_SIZE_Y, + PARTICLE_EMITTER_END_SIZE_X, + PARTICLE_EMITTER_END_SIZE_Y, + PARTICLE_EMITTER_LOW_LIFE, + PARTICLE_EMITTER_HIGH_LIFE }; struct Keyframe{ enum Interpolation{CONSTANT, LINEAR, BEZIER}; diff --git a/particle.frag b/particle.frag index e7a56ef..b188d4e 100755 --- a/particle.frag +++ b/particle.frag @@ -4,19 +4,27 @@ in vec2 texCoords; flat in int id; -const int numParticles = 500; +const int numParticles = 1; layout (location = 0) out vec4 FragColor; layout (location = 1) out vec4 BrightColor; -uniform sampler2D tex; +struct Texture{ + float mixRatio; + sampler2D pastTexture, nextTexture; + bool animated; +}; + +uniform Texture tex; uniform float lifePercentage[numParticles]; uniform vec4 startColor, endColor; void main(){ - float alpha = texture(tex, texCoords).r; - vec4 c = mix(startColor, endColor, lifePercentage[id]); - c = vec4(c.xyz, alpha); + float alpha = texture(tex.pastTexture, texCoords).r; + if(tex.animated) + alpha = mix(alpha, texture(tex.nextTexture, texCoords).r, tex.mixRatio); + + vec4 c = (alpha > 0 ? mix(startColor, endColor, alpha) : vec4(0)); FragColor = c; float brightness = dot(c.rgb, vec3(0.2126, 0.7152, 0.0722)); diff --git a/particle.vert b/particle.vert index 3a006d9..d5580d5 100755 --- a/particle.vert +++ b/particle.vert @@ -8,7 +8,7 @@ out vec2 texCoords; flat out int id; -const int numParticles = 500; +const int numParticles = 1; uniform mat4 proj, view; uniform float lifePercentage[numParticles]; @@ -20,8 +20,8 @@ void main(){ vec3 camUp = vec3(view[0][1], view[1][1], view[2][1]); id = gl_InstanceID; - vec2 s = startSize + (endSize - startSize) * lifePercentage[id]; - vec3 v = camLeft * s.x * aPos.x+camUp * s.y * aPos.y; + vec2 s = mix(startSize, endSize, lifePercentage[id]); + vec3 v = camLeft * s.x * aPos.x + camUp * s.y * aPos.y; mat4 model = aInstancedModel; model[3][0] = trans[id].x; model[3][1] = trans[id].y; diff --git a/particleEmitter.cpp b/particleEmitter.cpp index 88ddfb4..fbd3284 100755 --- a/particleEmitter.cpp +++ b/particleEmitter.cpp @@ -202,6 +202,54 @@ namespace vb01{ void ParticleEmitter::animate(float value, KeyframeChannel keyframeChannel){ switch(keyframeChannel.type){ + case KeyframeChannel::PARTICLE_EMITTER_SPEED: + speed = value; + break; + case KeyframeChannel::PARTICLE_EMITTER_SPREAD: + spread = value; + break; + case KeyframeChannel::PARTICLE_EMITTER_START_COLOR_W: + startColor.w = value; + break; + case KeyframeChannel::PARTICLE_EMITTER_START_COLOR_X: + startColor.x = value; + break; + case KeyframeChannel::PARTICLE_EMITTER_START_COLOR_Y: + startColor.y = value; + break; + case KeyframeChannel::PARTICLE_EMITTER_START_COLOR_Z: + startColor.z = value; + break; + case KeyframeChannel::PARTICLE_EMITTER_END_COLOR_W: + endColor.w = value; + break; + case KeyframeChannel::PARTICLE_EMITTER_END_COLOR_X: + endColor.x = value; + break; + case KeyframeChannel::PARTICLE_EMITTER_END_COLOR_Y: + endColor.y = value; + break; + case KeyframeChannel::PARTICLE_EMITTER_END_COLOR_Z: + endColor.z = value; + break; + case KeyframeChannel::PARTICLE_EMITTER_START_SIZE_X: + startSize.x = value; + break; + case KeyframeChannel::PARTICLE_EMITTER_START_SIZE_Y: + startSize.y = value; + break; + case KeyframeChannel::PARTICLE_EMITTER_END_SIZE_X: + endSize.x = value; + break; + case KeyframeChannel::PARTICLE_EMITTER_END_SIZE_Y: + endSize.y = value; + break; + case KeyframeChannel::PARTICLE_EMITTER_LOW_LIFE: + lowLife = value; + break; + case KeyframeChannel::PARTICLE_EMITTER_HIGH_LIFE: + highLife = value; + break; } } }