particle_oriented_animated_quad_vbuf_pixel_shader: implement particle reset

This commit is contained in:
Zack Buhman 2025-11-09 22:30:27 -06:00
parent 314267afe1
commit 3ebdfda196
3 changed files with 48 additions and 12 deletions

View File

@ -1158,15 +1158,17 @@ int _floatbuffer(const shaders& shaders,
// fragment constants // fragment constants
//const vec3 velocity_scale = vec3(0.003f, 0.01f, 0.003f); //const vec3 velocity_scale = vec3(0.003f, 0.01f, 0.003f);
const vec3 velocity_scale = vec3(0.09f, 0.50f, 0.09f); const vec3 velocity_scale = vec3(0.9f, 5.0f, 0.9f);
const float delta_age = 0.01f; const float delta_age = -0.01f;
const float velocity_attenuation = -0.6f; // multiplied by velocity.y after bounce const float velocity_attenuation = -0.6f; // multiplied by velocity.y after bounce
const float gravity = -0.04f; const float gravity = -0.04f;
const float max_age = 3.0f;
const float reset_radius = 20.0f;
const float fragment_consts[] = { const float fragment_consts[] = {
// 0: // 0:
velocity_scale.x, velocity_scale.y, velocity_scale.z, delta_age, velocity_scale.x, velocity_scale.y, velocity_scale.z, delta_age,
// 1: // 1:
velocity_attenuation, gravity, 0, 0, velocity_attenuation, gravity, max_age, reset_radius,
}; };
int fragment_consts_length = (sizeof (fragment_consts)) / (sizeof (fragment_consts[0])); int fragment_consts_length = (sizeof (fragment_consts)) / (sizeof (fragment_consts[0]));
ib_ga_consts(fragment_consts, fragment_consts_length, 0); ib_ga_consts(fragment_consts, fragment_consts_length, 0);
@ -1307,8 +1309,8 @@ int main()
int colorbuffer_ix = 0; int colorbuffer_ix = 0;
float theta = PI * 0.5; float theta = PI * 0.5;
const int floatbuffer_width = 8; const int floatbuffer_width = 64;
const int floatbuffer_height = 8; const int floatbuffer_height = 64;
floatbuffer_state state = create_floatbuffers(fd, floatbuffer_width * floatbuffer_height); floatbuffer_state state = create_floatbuffers(fd, floatbuffer_width * floatbuffer_height);
vertexbuffer_handle = init_particles_vertexbuffer(fd, state.length, &vertexbuffer_ptr); vertexbuffer_handle = init_particles_vertexbuffer(fd, state.length, &vertexbuffer_ptr);

View File

@ -20,7 +20,7 @@
-- const[0] = { velocity_scale.rgb, delta_age } -- const[0] = { velocity_scale.rgb, delta_age }
-- gravity = -0.05 -- gravity = -0.05
-- velocity_attenuation = -0.7 -- velocity_attenuation = -0.7
-- const[1] = { velocity_attenuation, gravity, 0, 0 } -- const[1] = { velocity_attenuation, gravity, max_age, 0 }
-- out[0].rgb : position -- out[0].rgb : position
-- out[0].a : age -- out[0].a : age
@ -64,14 +64,48 @@ src2.rgb = temp[4] : -- position
src0.rgb = temp[4] : src0.rgb = temp[4] :
temp[4].g = MAX |src0.0g0| |src0.0g0| ; temp[4].g = MAX |src0.0g0| |src0.0g0| ;
--
-- reset
--
-- normalize(vec3(velocity.x, 0, velocity.z))
src0.rgb = temp[1] : -- velocity
DP3 src0.r0b src0.r0b ,
temp[2].a = DP ;
src0.a = temp[2] :
temp[2].a = RSQ |src0.a| ;
src0.a = temp[2] ,
src0.rgb = temp[1] : -- velocity
temp[2].rgb = MAD src0.r0b src0.a0a src0.000 ;
-- age = age + max_age
-- reset__position = reset__position * 20
src0.a = temp[0] , -- age
src1.rgb = const[1] , -- max_age
src2.a = const[1] , -- reset_radius
src0.rgb = temp[2] : -- reset__position
temp[2].a = MAD src0.a src0.1 src1.b ,
temp[2].rgb = MAD src0.rgb src2.aaa src2.000 ;
-- reset__velocity
src0.a = temp[1] , -- delta
src1.a = float(64) , -- 2.0
src0.rgb = temp[1] : -- velocity
temp[3].rgb = MAD src0.rab src1.1a1 src1.000 ;
OUT OUT
src0.a = temp[4] , -- update__age src0.a = temp[4] , -- update__age
src0.rgb = temp[4] : -- update__position src1.a = temp[2] , -- reset__age
out[0].a = MAX src0.a src0.a , src2.a = temp[0] , -- age
out[0].rgb = MAX src0.rgb src0.rgb ; src0.rgb = temp[4] , -- update__position
src1.rgb = temp[2] : -- reset__position
out[0].a = CMP src0.a src1.a src2.a ,
out[0].rgb = CMP src0.rgb src1.rgb src2.aaa ;
OUT TEX_SEM_WAIT OUT TEX_SEM_WAIT
src0.a = temp[1] , -- delta src0.a = temp[1] , -- delta
src0.rgb = temp[5] : -- update__velocity src2.a = temp[0] , -- age
out[1].a = MAX src0.a src0.a , src0.rgb = temp[5] , -- update__velocity
out[1].rgb = MAX src0.rgb src0.rgb ; src1.rgb = temp[3] : -- reset__velocity
out[1].a = MAX src0.a src0.a , -- constant
out[1].rgb = CMP src0.rgb src1.rgb src2.aaa ;

Binary file not shown.