@babylonjs/core
Version:
Getting started? Play directly with the Babylon.js API using our [playground](https://playground.babylonjs.com/). It also contains a lot of samples to learn how to use it.
269 lines • 10.3 kB
JavaScript
// Do not edit.
import { ShaderStore } from "../Engines/shaderStore.js";
const name = "gpuUpdateParticlesVertexShader";
const shader = `
uniform float currentCount;uniform float timeDelta;uniform float stopFactor;
uniform mat4 emitterWM;
uniform vec2 lifeTime;uniform vec2 emitPower;uniform vec2 sizeRange;uniform vec4 scaleRange;
uniform vec4 color1;uniform vec4 color2;
uniform vec3 gravity;uniform sampler2D randomSampler;uniform sampler2D randomSampler2;uniform vec4 angleRange;
uniform vec3 direction1;uniform vec3 direction2;uniform vec3 minEmitBox;uniform vec3 maxEmitBox;
uniform vec3 direction1;uniform vec3 direction2;
uniform float radius;uniform float radiusRange;uniform float directionRandomizer;
uniform float radius;uniform float radiusRange;
uniform vec3 direction1;uniform vec3 direction2;
uniform float directionRandomizer;
uniform float radius;uniform float height;uniform float radiusRange;
uniform vec3 direction1;uniform vec3 direction2;
uniform float directionRandomizer;
uniform vec2 radius;uniform float coneAngle;uniform vec2 height;
uniform vec3 direction1;uniform vec3 direction2;
uniform float directionRandomizer;
in vec3 position;
in vec3 initialPosition;
in float age;in float life;in vec4 seed;in vec3 size;
in vec4 color;
in vec3 direction;
in vec3 initialDirection;
in float angle;
in vec2 angle;
in float cellIndex;
in float cellStartOffset;
in vec3 noiseCoordinates1;in vec3 noiseCoordinates2;
out vec3 outPosition;
out vec3 outInitialPosition;
out float outAge;out float outLife;out vec4 outSeed;out vec3 outSize;
out vec4 outColor;
out vec3 outDirection;
out vec3 outInitialDirection;
out float outAngle;
out vec2 outAngle;
out float outCellIndex;
out float outCellStartOffset;
out vec3 outNoiseCoordinates1;out vec3 outNoiseCoordinates2;
uniform sampler2D sizeGradientSampler;
uniform sampler2D angularSpeedGradientSampler;
uniform sampler2D velocityGradientSampler;
uniform sampler2D limitVelocityGradientSampler;uniform float limitVelocityDamping;
uniform sampler2D dragGradientSampler;
uniform vec3 noiseStrength;uniform sampler2D noiseSampler;
uniform vec4 cellInfos;
vec3 getRandomVec3(float offset) {return texture(randomSampler2,vec2(float(gl_VertexID)*offset/currentCount,0)).rgb;}
vec4 getRandomVec4(float offset) {return texture(randomSampler,vec2(float(gl_VertexID)*offset/currentCount,0));}
void main() {float newAge=age+timeDelta;
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;
outSize.x=texture(sizeGradientSampler,vec2(0,0)).r;
outSize.x=sizeRange.x+(sizeRange.y-sizeRange.x)*randoms.g;
outSize.y=scaleRange.x+(scaleRange.y-scaleRange.x)*randoms.b;outSize.z=scaleRange.z+(scaleRange.w-scaleRange.z)*randoms.a;
outColor=color1+(color2-color1)*randoms.b;
outAngle.y=angleRange.x+(angleRange.y-angleRange.x)*randoms.a;outAngle.x=angleRange.z+(angleRange.w-angleRange.z)*randoms.r;
outAngle=angleRange.z+(angleRange.w-angleRange.z)*randoms.r;
vec3 randoms2=getRandomVec3(seed.y);vec3 randoms3=getRandomVec3(seed.z);newPosition=vec3(0,0,0);newDirection=direction1+(direction2-direction1)*randoms3;
vec3 randoms2=getRandomVec3(seed.y);vec3 randoms3=getRandomVec3(seed.z);newPosition=minEmitBox+(maxEmitBox-minEmitBox)*randoms2;newDirection=direction1+(direction2-direction1)*randoms3;
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;
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);
newDirection=normalize(direction1+(direction2-direction1)*randoms3);
newDirection=normalize(newPosition+directionRandomizer*randoms3);
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);
newDirection=direction1+(direction2-direction1)*randoms3;
angle=angle+((randoms3.x-0.5)*PI)*directionRandomizer;newDirection=vec3(cos(angle),(randoms3.y-0.5)*directionRandomizer,sin(angle));newDirection=normalize(newDirection);
vec3 randoms2=getRandomVec3(seed.y);float s=2.0*PI*randoms2.x;
float h=0.0001;
float h=randoms2.y*height.y;h=1.-h*h;
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);
vec3 randoms3=getRandomVec3(seed.z);
newDirection=direction1+(direction2-direction1)*randoms3;
if (abs(cos(coneAngle))==1.0) {newDirection=vec3(0.,1.0,0.);} else {newDirection=normalize(newPosition+directionRandomizer*randoms3); }
newPosition=initialPosition;outInitialPosition=initialPosition;
newPosition=vec3(0.,0.,0.);newDirection=2.0*(getRandomVec3(seed.w)-vec3(0.5,0.5,0.5));
float power=emitPower.x+(emitPower.y-emitPower.x)*randoms.a;
outPosition=newPosition;
outPosition=(emitterWM*vec4(newPosition,1.)).xyz;
outDirection=direction;
outInitialDirection=direction;
vec3 initial=newDirection;
vec3 initial=(emitterWM*vec4(newDirection,0.)).xyz;
outDirection=initial*power;
outInitialDirection=initial;
outCellIndex=cellInfos.x;
outCellStartOffset=randoms.a*outLife;
outNoiseCoordinates1=noiseCoordinates1;outNoiseCoordinates2=noiseCoordinates2;
} else {float directionScale=timeDelta;outAge=newAge;float ageGradient=newAge/life;
directionScale*=texture(velocityGradientSampler,vec2(ageGradient,0)).r;
directionScale*=1.0-texture(dragGradientSampler,vec2(ageGradient,0)).r;
outPosition=position+(direction-position)*ageGradient;
outInitialPosition=initialPosition;
outPosition=position+direction*directionScale;
outLife=life;outSeed=seed;
outColor=color;
outSize.x=texture(sizeGradientSampler,vec2(ageGradient,0)).r;outSize.yz=size.yz;
outSize=size;
outInitialDirection=initialDirection;
outDirection=direction;
vec3 updatedDirection=direction+gravity*timeDelta;
float limitVelocity=texture(limitVelocityGradientSampler,vec2(ageGradient,0)).r;float currentVelocity=length(updatedDirection);if (currentVelocity>limitVelocity) {updatedDirection=updatedDirection*limitVelocityDamping;}
outDirection=updatedDirection;
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;
float angularSpeed=texture(angularSpeedGradientSampler,vec2(ageGradient,0)).r;outAngle=angle+angularSpeed*timeDelta;
outAngle=vec2(angle.x+angle.y*timeDelta,angle.y);
float offsetAge=outAge;float dist=cellInfos.y-cellInfos.x;
outCellStartOffset=cellStartOffset;offsetAge+=cellStartOffset;
float cellStartOffset=0.;
float ratio=0.;if (cellInfos.w==1.0) {ratio=clamp(mod(cellStartOffset+cellInfos.z*offsetAge,life)/life,0.,1.0);}
else {ratio=clamp(cellStartOffset+cellInfos.z*offsetAge/life,0.,1.0);}
outCellIndex=float(int(cellInfos.x+ratio*dist));
}}`;
// Sideeffect
if (!ShaderStore.ShadersStore[name]) {
ShaderStore.ShadersStore[name] = shader;
}
/** @internal */
export const gpuUpdateParticlesVertexShader = { name, shader };
//# sourceMappingURL=gpuUpdateParticles.vertex.js.map