gpuUpdateParticles.vertex.js 9.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257
  1. // Do not edit.
  2. import { ShaderStore } from "../Engines/shaderStore.js";
  3. const name = "gpuUpdateParticlesVertexShader";
  4. const shader = `#version 300 es
  5. #define PI 3.14159
  6. uniform float currentCount;uniform float timeDelta;uniform float stopFactor;
  7. #ifndef LOCAL
  8. uniform mat4 emitterWM;
  9. #endif
  10. uniform vec2 lifeTime;uniform vec2 emitPower;uniform vec2 sizeRange;uniform vec4 scaleRange;
  11. #ifndef COLORGRADIENTS
  12. uniform vec4 color1;uniform vec4 color2;
  13. #endif
  14. uniform vec3 gravity;uniform sampler2D randomSampler;uniform sampler2D randomSampler2;uniform vec4 angleRange;
  15. #ifdef BOXEMITTER
  16. uniform vec3 direction1;uniform vec3 direction2;uniform vec3 minEmitBox;uniform vec3 maxEmitBox;
  17. #endif
  18. #ifdef POINTEMITTER
  19. uniform vec3 direction1;uniform vec3 direction2;
  20. #endif
  21. #ifdef HEMISPHERICEMITTER
  22. uniform float radius;uniform float radiusRange;uniform float directionRandomizer;
  23. #endif
  24. #ifdef SPHEREEMITTER
  25. uniform float radius;uniform float radiusRange;
  26. #ifdef DIRECTEDSPHEREEMITTER
  27. uniform vec3 direction1;uniform vec3 direction2;
  28. #else
  29. uniform float directionRandomizer;
  30. #endif
  31. #endif
  32. #ifdef CYLINDEREMITTER
  33. uniform float radius;uniform float height;uniform float radiusRange;
  34. #ifdef DIRECTEDCYLINDEREMITTER
  35. uniform vec3 direction1;uniform vec3 direction2;
  36. #else
  37. uniform float directionRandomizer;
  38. #endif
  39. #endif
  40. #ifdef CONEEMITTER
  41. uniform vec2 radius;uniform float coneAngle;uniform vec2 height;uniform float directionRandomizer;
  42. #endif
  43. in vec3 position;
  44. #ifdef CUSTOMEMITTER
  45. in vec3 initialPosition;
  46. #endif
  47. in float age;in float life;in vec4 seed;in vec3 size;
  48. #ifndef COLORGRADIENTS
  49. in vec4 color;
  50. #endif
  51. in vec3 direction;
  52. #ifndef BILLBOARD
  53. in vec3 initialDirection;
  54. #endif
  55. #ifdef ANGULARSPEEDGRADIENTS
  56. in float angle;
  57. #else
  58. in vec2 angle;
  59. #endif
  60. #ifdef ANIMATESHEET
  61. in float cellIndex;
  62. #ifdef ANIMATESHEETRANDOMSTART
  63. in float cellStartOffset;
  64. #endif
  65. #endif
  66. #ifdef NOISE
  67. in vec3 noiseCoordinates1;in vec3 noiseCoordinates2;
  68. #endif
  69. out vec3 outPosition;
  70. #ifdef CUSTOMEMITTER
  71. out vec3 outInitialPosition;
  72. #endif
  73. out float outAge;out float outLife;out vec4 outSeed;out vec3 outSize;
  74. #ifndef COLORGRADIENTS
  75. out vec4 outColor;
  76. #endif
  77. out vec3 outDirection;
  78. #ifndef BILLBOARD
  79. out vec3 outInitialDirection;
  80. #endif
  81. #ifdef ANGULARSPEEDGRADIENTS
  82. out float outAngle;
  83. #else
  84. out vec2 outAngle;
  85. #endif
  86. #ifdef ANIMATESHEET
  87. out float outCellIndex;
  88. #ifdef ANIMATESHEETRANDOMSTART
  89. out float outCellStartOffset;
  90. #endif
  91. #endif
  92. #ifdef NOISE
  93. out vec3 outNoiseCoordinates1;out vec3 outNoiseCoordinates2;
  94. #endif
  95. #ifdef SIZEGRADIENTS
  96. uniform sampler2D sizeGradientSampler;
  97. #endif
  98. #ifdef ANGULARSPEEDGRADIENTS
  99. uniform sampler2D angularSpeedGradientSampler;
  100. #endif
  101. #ifdef VELOCITYGRADIENTS
  102. uniform sampler2D velocityGradientSampler;
  103. #endif
  104. #ifdef LIMITVELOCITYGRADIENTS
  105. uniform sampler2D limitVelocityGradientSampler;uniform float limitVelocityDamping;
  106. #endif
  107. #ifdef DRAGGRADIENTS
  108. uniform sampler2D dragGradientSampler;
  109. #endif
  110. #ifdef NOISE
  111. uniform vec3 noiseStrength;uniform sampler2D noiseSampler;
  112. #endif
  113. #ifdef ANIMATESHEET
  114. uniform vec4 cellInfos;
  115. #endif
  116. vec3 getRandomVec3(float offset) {return texture(randomSampler2,vec2(float(gl_VertexID)*offset/currentCount,0)).rgb;}
  117. vec4 getRandomVec4(float offset) {return texture(randomSampler,vec2(float(gl_VertexID)*offset/currentCount,0));}
  118. void main() {float newAge=age+timeDelta;
  119. if (newAge>=life && stopFactor != 0.) {vec3 newPosition;vec3 newDirection;vec4 randoms=getRandomVec4(seed.x);outLife=lifeTime.x+(lifeTime.y-lifeTime.x)*randoms.r;outAge=newAge-life;outSeed=seed;
  120. #ifdef SIZEGRADIENTS
  121. outSize.x=texture(sizeGradientSampler,vec2(0,0)).r;
  122. #else
  123. outSize.x=sizeRange.x+(sizeRange.y-sizeRange.x)*randoms.g;
  124. #endif
  125. outSize.y=scaleRange.x+(scaleRange.y-scaleRange.x)*randoms.b;outSize.z=scaleRange.z+(scaleRange.w-scaleRange.z)*randoms.a;
  126. #ifndef COLORGRADIENTS
  127. outColor=color1+(color2-color1)*randoms.b;
  128. #endif
  129. #ifndef ANGULARSPEEDGRADIENTS
  130. outAngle.y=angleRange.x+(angleRange.y-angleRange.x)*randoms.a;outAngle.x=angleRange.z+(angleRange.w-angleRange.z)*randoms.r;
  131. #else
  132. outAngle=angleRange.z+(angleRange.w-angleRange.z)*randoms.r;
  133. #endif
  134. #ifdef POINTEMITTER
  135. vec3 randoms2=getRandomVec3(seed.y);vec3 randoms3=getRandomVec3(seed.z);newPosition=vec3(0,0,0);newDirection=direction1+(direction2-direction1)*randoms3;
  136. #elif defined(BOXEMITTER)
  137. vec3 randoms2=getRandomVec3(seed.y);vec3 randoms3=getRandomVec3(seed.z);newPosition=minEmitBox+(maxEmitBox-minEmitBox)*randoms2;newDirection=direction1+(direction2-direction1)*randoms3;
  138. #elif defined(HEMISPHERICEMITTER)
  139. vec3 randoms2=getRandomVec3(seed.y);vec3 randoms3=getRandomVec3(seed.z);float phi=2.0*PI*randoms2.x;float theta=acos(2.0*randoms2.y-1.0);float randX=cos(phi)*sin(theta);float randY=cos(theta);float randZ=sin(phi)*sin(theta);newPosition=(radius-(radius*radiusRange*randoms2.z))*vec3(randX,abs(randY),randZ);newDirection=newPosition+directionRandomizer*randoms3;
  140. #elif defined(SPHEREEMITTER)
  141. vec3 randoms2=getRandomVec3(seed.y);vec3 randoms3=getRandomVec3(seed.z);float phi=2.0*PI*randoms2.x;float theta=acos(2.0*randoms2.y-1.0);float randX=cos(phi)*sin(theta);float randY=cos(theta);float randZ=sin(phi)*sin(theta);newPosition=(radius-(radius*radiusRange*randoms2.z))*vec3(randX,randY,randZ);
  142. #ifdef DIRECTEDSPHEREEMITTER
  143. newDirection=normalize(direction1+(direction2-direction1)*randoms3);
  144. #else
  145. newDirection=normalize(newPosition+directionRandomizer*randoms3);
  146. #endif
  147. #elif defined(CYLINDEREMITTER)
  148. vec3 randoms2=getRandomVec3(seed.y);vec3 randoms3=getRandomVec3(seed.z);float yPos=(randoms2.x-0.5)*height;float angle=randoms2.y*PI*2.;float inverseRadiusRangeSquared=((1.-radiusRange)*(1.-radiusRange));float positionRadius=radius*sqrt(inverseRadiusRangeSquared+(randoms2.z*(1.-inverseRadiusRangeSquared)));float xPos=positionRadius*cos(angle);float zPos=positionRadius*sin(angle);newPosition=vec3(xPos,yPos,zPos);
  149. #ifdef DIRECTEDCYLINDEREMITTER
  150. newDirection=direction1+(direction2-direction1)*randoms3;
  151. #else
  152. angle=angle+((randoms3.x-0.5)*PI)*directionRandomizer;newDirection=vec3(cos(angle),(randoms3.y-0.5)*directionRandomizer,sin(angle));newDirection=normalize(newDirection);
  153. #endif
  154. #elif defined(CONEEMITTER)
  155. vec3 randoms2=getRandomVec3(seed.y);float s=2.0*PI*randoms2.x;
  156. #ifdef CONEEMITTERSPAWNPOINT
  157. float h=0.0001;
  158. #else
  159. float h=randoms2.y*height.y;h=1.-h*h;
  160. #endif
  161. float lRadius=radius.x-radius.x*randoms2.z*radius.y;lRadius=lRadius*h;float randX=lRadius*sin(s);float randZ=lRadius*cos(s);float randY=h *height.x;newPosition=vec3(randX,randY,randZ);
  162. if (abs(cos(coneAngle))==1.0) {newDirection=vec3(0.,1.0,0.);} else {vec3 randoms3=getRandomVec3(seed.z);newDirection=normalize(newPosition+directionRandomizer*randoms3); }
  163. #elif defined(CUSTOMEMITTER)
  164. newPosition=initialPosition;outInitialPosition=initialPosition;
  165. #else
  166. newPosition=vec3(0.,0.,0.);newDirection=2.0*(getRandomVec3(seed.w)-vec3(0.5,0.5,0.5));
  167. #endif
  168. float power=emitPower.x+(emitPower.y-emitPower.x)*randoms.a;
  169. #ifdef LOCAL
  170. outPosition=newPosition;
  171. #else
  172. outPosition=(emitterWM*vec4(newPosition,1.)).xyz;
  173. #endif
  174. #ifdef CUSTOMEMITTER
  175. outDirection=direction;
  176. #ifndef BILLBOARD
  177. outInitialDirection=direction;
  178. #endif
  179. #else
  180. #ifdef LOCAL
  181. vec3 initial=newDirection;
  182. #else
  183. vec3 initial=(emitterWM*vec4(newDirection,0.)).xyz;
  184. #endif
  185. outDirection=initial*power;
  186. #ifndef BILLBOARD
  187. outInitialDirection=initial;
  188. #endif
  189. #endif
  190. #ifdef ANIMATESHEET
  191. outCellIndex=cellInfos.x;
  192. #ifdef ANIMATESHEETRANDOMSTART
  193. outCellStartOffset=randoms.a*outLife;
  194. #endif
  195. #endif
  196. #ifdef NOISE
  197. outNoiseCoordinates1=noiseCoordinates1;outNoiseCoordinates2=noiseCoordinates2;
  198. #endif
  199. } else {float directionScale=timeDelta;outAge=newAge;float ageGradient=newAge/life;
  200. #ifdef VELOCITYGRADIENTS
  201. directionScale*=texture(velocityGradientSampler,vec2(ageGradient,0)).r;
  202. #endif
  203. #ifdef DRAGGRADIENTS
  204. directionScale*=1.0-texture(dragGradientSampler,vec2(ageGradient,0)).r;
  205. #endif
  206. #if defined(CUSTOMEMITTER)
  207. outPosition=position+(direction-position)*ageGradient;
  208. outInitialPosition=initialPosition;
  209. #else
  210. outPosition=position+direction*directionScale;
  211. #endif
  212. outLife=life;outSeed=seed;
  213. #ifndef COLORGRADIENTS
  214. outColor=color;
  215. #endif
  216. #ifdef SIZEGRADIENTS
  217. outSize.x=texture(sizeGradientSampler,vec2(ageGradient,0)).r;outSize.yz=size.yz;
  218. #else
  219. outSize=size;
  220. #endif
  221. #ifndef BILLBOARD
  222. outInitialDirection=initialDirection;
  223. #endif
  224. #ifdef CUSTOMEMITTER
  225. outDirection=direction;
  226. #else
  227. vec3 updatedDirection=direction+gravity*timeDelta;
  228. #ifdef LIMITVELOCITYGRADIENTS
  229. float limitVelocity=texture(limitVelocityGradientSampler,vec2(ageGradient,0)).r;float currentVelocity=length(updatedDirection);if (currentVelocity>limitVelocity) {updatedDirection=updatedDirection*limitVelocityDamping;}
  230. #endif
  231. outDirection=updatedDirection;
  232. #ifdef NOISE
  233. float fetchedR=texture(noiseSampler,vec2(noiseCoordinates1.x,noiseCoordinates1.y)*vec2(0.5)+vec2(0.5)).r;float fetchedG=texture(noiseSampler,vec2(noiseCoordinates1.z,noiseCoordinates2.x)*vec2(0.5)+vec2(0.5)).r;float fetchedB=texture(noiseSampler,vec2(noiseCoordinates2.y,noiseCoordinates2.z)*vec2(0.5)+vec2(0.5)).r;vec3 force=vec3(2.*fetchedR-1.,2.*fetchedG-1.,2.*fetchedB-1.)*noiseStrength;outDirection=outDirection+force*timeDelta;outNoiseCoordinates1=noiseCoordinates1;outNoiseCoordinates2=noiseCoordinates2;
  234. #endif
  235. #endif
  236. #ifdef ANGULARSPEEDGRADIENTS
  237. float angularSpeed=texture(angularSpeedGradientSampler,vec2(ageGradient,0)).r;outAngle=angle+angularSpeed*timeDelta;
  238. #else
  239. outAngle=vec2(angle.x+angle.y*timeDelta,angle.y);
  240. #endif
  241. #ifdef ANIMATESHEET
  242. float offsetAge=outAge;float dist=cellInfos.y-cellInfos.x;
  243. #ifdef ANIMATESHEETRANDOMSTART
  244. outCellStartOffset=cellStartOffset;offsetAge+=cellStartOffset;
  245. #else
  246. float cellStartOffset=0.;
  247. #endif
  248. float ratio=0.;if (cellInfos.w==1.0) {ratio=clamp(mod(cellStartOffset+cellInfos.z*offsetAge,life)/life,0.,1.0);}
  249. else {ratio=clamp(cellStartOffset+cellInfos.z*offsetAge/life,0.,1.0);}
  250. outCellIndex=float(int(cellInfos.x+ratio*dist));
  251. #endif
  252. }}`;
  253. // Sideeffect
  254. ShaderStore.ShadersStore[name] = shader;
  255. /** @internal */
  256. export const gpuUpdateParticlesVertexShader = { name, shader };
  257. //# sourceMappingURL=gpuUpdateParticles.vertex.js.map