r500/src/particle_physics.fs.asm

122 lines
3.5 KiB
NASM

-- temp[0].rgb : position
-- temp[0].a : age
-- temp[1].rgb : velocity
-- temp[1].a : delta
-- temp[2].rgb : reset__position
-- temp[2].a : reset__age
-- temp[3].rgb : reset__velocity
-- temp[3].a : reset__delta
-- temp[4].rgb : update__position
-- temp[4].a : update__age
-- temp[5].rgb : update__velocity
-- temp[5].a : update__delta
-- temp[6].rgb : temp
-- velocity_scale.rgb = vec3(0.003 , 0.01, 0.003)
-- delta_age = 0.01
-- const[0] = { velocity_scale.rgb, delta_age }
-- gravity = -0.05
-- velocity_attenuation = -0.7
-- const[1] = { velocity_attenuation, gravity, max_age, 0 }
-- out[0].rgb : position
-- out[0].a : age
TEX
temp[0].rgba = LD tex[0].rgba temp[0].rgaa ;
TEX TEX_SEM_WAIT TEX_SEM_ACQUIRE
temp[1].rgba = LD tex[1].rgba temp[0].rgaa ;
-- update_particle (position)
TEX_SEM_WAIT
src0.a = temp[0] , -- age
src0.rgb = temp[0] , -- position
src1.a = const[0] , -- delta_age
src1.rgb = const[0] , -- scale
src2.rgb = temp[1] : -- velocity
temp[4].a = MAD src0.a src0.1 src1.a , -- update__age = (age * 1) - delta_age
temp[4].rgb = MAD src2.rgb src1.rgb src0.rgb ; -- update__position = (velocity * scale) + position
-- update_particle (velocity gravity)
-- p.velocity.y += -0.05;
src0.rgb = temp[1] , -- velocity
src1.rgb = const[1] : -- gravity (g)
temp[5].rgb = MAD src0.rgb src1.111 src1.0g0 ;
-- update_particle (velocity bounce)
-- p.velocity.y *= -0.7;
src0.rgb = temp[5] , -- velocity <gravity>
src1.rgb = const[1] : -- velocity_attenuation (r)
temp[6].rgb = MAD src0.rgb src1.1r1 src1.000 ;
-- update_particle (velocity bounce)
-- p.velocity = (p.position.y >= 0) ? temp[5] : temp[6]
src0.rgb = temp[5] , -- velocity <gravity>
src1.rgb = temp[6] , -- velocity <bounce>
src2.rgb = temp[4] : -- position
temp[5].rgb = CMP src0.rgb src1.rgb src2.ggg ;
-- position.y = abs(position.y)
src0.rgb = temp[4] :
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
src1.a = temp[1] : -- delta
temp[2].rgb = MAD src0.r0b src0.a0a src1.0a0 ;
-- 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
-- (p.velocity.x * 0.5 + 0.5)
-- velocity.xz = velocity.xz
src0.rgb = temp[1] , -- velocity.x
src1.a = float(48) : -- 0.5
temp[3].a = MAD src0.r src1.a src1.a ,
temp[3].rgb = MAX src0.r0b src0.r0b ;
-- reset__velocity
-- velocity.y = (temp[3].a * delta + 2.0)
src0.a = temp[1] , -- delta
src1.a = float(56) , -- 1.0
src2.a = temp[3] : --
temp[3].g = MAD src2.0a0 src0.0a0 src1.0a0 ;
OUT
src0.a = temp[4] , -- update__age
src1.a = temp[2] , -- reset__age
src2.a = temp[0] , -- age
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
src0.a = temp[1] , -- delta
src2.a = temp[0] , -- age
src0.rgb = temp[5] , -- update__velocity
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 ;