animatable properties

This commit is contained in:
devZoGok
2021-10-19 19:06:41 +03:00
parent f0c88291ec
commit 7adf42ad7b
4 changed files with 81 additions and 9 deletions
+17 -1
View File
@@ -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
View File
@@ -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
View File
@@ -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;
+48
View File
@@ -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;
}
}
}