mirror of
https://github.com/devZoGok/vb01.git
synced 2026-08-26 19:43:30 +00:00
animatable properties
This commit is contained in:
+17
-1
@@ -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};
|
||||
|
||||
+13
-5
@@ -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));
|
||||
|
||||
+3
-3
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user