Files
Towards/external/loft/examples/viewer/shaders/Particles.comp.spirv
T

129 lines
13 KiB
Plaintext
Raw Normal View History

2026-07-18 14:31:15 +02:00
# °
SPV_KHR_non_semantic_info NonSemantic.Shader.DebugInfo.100 GLSL.std.450mainÅ/home/martin/projects/loft/examples/viewer/shaders/Particles.compuintfloatattractionî"// OpModuleProcessed client vulkan100
// OpModuleProcessed target-env vulkan1.0
// OpModuleProcessed entry-point main
#line 1
#version 450
struct Particle {
vec4 position;
vec4 velocity;
vec4 gradient_pos;
};
layout(std140, binding = 0) buffer ParticleBuffer {
Particle particles[];
};
layout (local_size_x = 256) in;
vec2 attraction(vec2 pos, vec2 attractPos)
{
vec2 delta = attractPos - pos;
const float damp = 0.5;
float dDampedDot = dot(delta, delta) + damp;
float invDist = 1.0f / sqrt(dDampedDot);
float invDistCubed = invDist*invDist*invDist;
return delta * invDistCubed * 0.0035;
}
vec2 repulsion(vec2 pos, vec2 attractPos)
{
vec2 delta = attractPos - pos;
float targetDistance = sqrt(dot(delta, delta));
return delta * (1.0 / (targetDistance * targetDistance * targetDistance)) * -0.000035;
}
void main()
{
uint particle_count = 1000;
float dest_x = 0.0f;
float dest_y = 0.0f;
float delta_time = 0.001;
// Current SSBO index
uint index = gl_GlobalInvocationID.x;
// Don't try to write beyond particle count
if (index >= particle_count)
return;
// Read position and velocity
vec2 vVel = particles[index].velocity.xy;
vec2 vPos = particles[index].position.xy;
vec2 destPos = vec2(dest_x, dest_y);
vec2 delta = destPos - vPos;
float targetDistance = sqrt(dot(delta, delta));
vVel += repulsion(vPos, destPos.xy) * 0.05;
// Move by velocity
vPos += vVel * delta_time;
// collide with boundary
if ((vPos.x < -1.0) || (vPos.x > 1.0) || (vPos.y < -1.0) || (vPos.y > 1.0))
vVel = (-vVel * 0.1) + attraction(vPos, destPos) * 12;
else
particles[index].position.xy = vPos;
// Write back
particles[index].velocity.xy = vVel;
particles[index].gradient_pos.x += 0.02 * delta_time;
if (particles[index].gradient_pos.x > 1.0)
particles[index].gradient_pos.x -= 1.0;
particles[index].position = vec4(0.0, index, index, 1.0f);
}
(pos.attractPos4repulsion=mainCdeltaNdDampedDotYinvDistcinvDistCubedƒtargetDistance¢particle_count©dest_x°dest_ydelta_time½indexÇgl_GlobalInvocationIDÒboolÝvVelægradient_posêParticleïparticlesóParticleBufferøúintvPosdestPosmainattraction(vf2;vf2;posattractPos2repulsion(vf2;vf2;0pos1attractPosAdeltaLdDampedDotWinvDistainvDistCubedydeltatargetDistance particle_count§dest_x®dest_y´delta_time»indexÅgl_GlobalInvocationIDÛvVeläParticleäpositionävelocityägradient_posíParticleBufferíparticlesövPosdestPosdeltatargetDistance(param,paramjparamlparamGÅ Hä#Hä#Hä# Gë0GíHí#Gö!Gö"G¯ ! +
+ +  
+
 
 
+  +  ! 
 !#"+#+%+& $%&!  !# $
#
'(!# &% *
-.!# &+6 54!6 $4
6
7(!6 5&%
;.!6 5&+?" >=!? $=
?+D BC!D & J K +O MN!O &+U?+Z XY!Z &+]€?+d bc!d &+n+qB`e;+w+{ zC!{ 5&+ ƒ! 5&++÷̸ ž Ÿ  +£$ ¡¢ !£ >&+¦è+ª% ¨©!ª >&+­+±& ¯°!± >&+·' µ!· >&+ºoƒ:+¾) ¼½ !¾ >&Á Â
ÃÁ ÄÂ% ;ÃÅ+È ÆÇÂ!¾ $ÇÅÈ É Ê % +Ï+Ñ ÓÒ
 +Ù,+Þ/ ÜÝ!Þ >&â ã&äâââ
å æã! 
ç æã! 
è æã! 
é
ê%!Þ $ê
åçèëä ìé íë+ð
+ñ
î ïì!ðñ
ò
ó%!Þ $ó
î ôí õò ;ôö ÷øò!Þ $øöÈù  ûú
& +ùü+ùþ ÿâ ã +0 ! >&+2 ! >&+4 C! >&+!5  ƒ!! >&++6+/ÍÌL=+59+<<+>€¿+f=+hÍÌÌ=+o@A+v? x y +B+C+ùŠ+
×£<+D+E+¥F+­H+®,Á¯®%%6ø;ž ;J§;J®;J´;ž»;Û;;;;J;(;,;j;l œ>
g!?? e>
¥g!££ ¤¡ *> ¦
¬g!ªª «¨§*>§­
³g!±± ²¯®*>®­
¹g!·· ¸µ´*>´º
Àg!¾¾ ¿¼»*AÉËÅ =ÌË>»Ì
Îg!ÏÏ =Í»=Р®ÑÔÍÐ÷ÖúÔÕÖøÕ ×>
Øg!ÙÙ ýøÖ à>
ág!ÞÞ ßÜÛ*=ý»Aÿöüýþ=âO>Û
 g! *=
»Aÿ öü
ü=â  O
  >

g! *=§=®P>
g! *==ƒ>
#g!!! " *=$=%&$% '&>'
*g!++ =)>()=->,-9.2(,Ž0./=1Û210>Û2
4g!55 =3Û=6´Ž736=8987>9
;g!<< AJ: ==:¸Ñ?=>¨Ñ@?÷Bú@ABøA D>