|
@@ -0,0 +1,193 @@
|
|
|
|
+import { Effect } from "babylonjs";
|
|
|
|
+
|
|
|
|
+let name = 'lavaVertexShader';
|
|
|
|
+let shader = `precision highp float;
|
|
|
|
+
|
|
|
|
+uniform float time;
|
|
|
|
+uniform float lowFrequencySpeed;
|
|
|
|
+
|
|
|
|
+varying float noise;
|
|
|
|
+
|
|
|
|
+attribute vec3 position;
|
|
|
|
+#ifdef NORMAL
|
|
|
|
+attribute vec3 normal;
|
|
|
|
+#endif
|
|
|
|
+#ifdef UV1
|
|
|
|
+attribute vec2 uv;
|
|
|
|
+#endif
|
|
|
|
+#ifdef UV2
|
|
|
|
+attribute vec2 uv2;
|
|
|
|
+#endif
|
|
|
|
+#ifdef VERTEXCOLOR
|
|
|
|
+attribute vec4 color;
|
|
|
|
+#endif
|
|
|
|
+#include<bonesDeclaration>
|
|
|
|
+
|
|
|
|
+#include<instancesDeclaration>
|
|
|
|
+uniform mat4 view;
|
|
|
|
+uniform mat4 viewProjection;
|
|
|
|
+#ifdef DIFFUSE
|
|
|
|
+varying vec2 vDiffuseUV;
|
|
|
|
+uniform mat4 diffuseMatrix;
|
|
|
|
+uniform vec2 vDiffuseInfos;
|
|
|
|
+#endif
|
|
|
|
+#ifdef POINTSIZE
|
|
|
|
+uniform float pointSize;
|
|
|
|
+#endif
|
|
|
|
+
|
|
|
|
+varying vec3 vPositionW;
|
|
|
|
+#ifdef NORMAL
|
|
|
|
+varying vec3 vNormalW;
|
|
|
|
+#endif
|
|
|
|
+#ifdef VERTEXCOLOR
|
|
|
|
+varying vec4 vColor;
|
|
|
|
+#endif
|
|
|
|
+#include<clipPlaneVertexDeclaration>
|
|
|
|
+#include<fogVertexDeclaration>
|
|
|
|
+#include<__decl__lightFragment>[0..maxSimultaneousLights]
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+vec3 mod289(vec3 x)
|
|
|
|
+{
|
|
|
|
+return x-floor(x*(1.0/289.0))*289.0;
|
|
|
|
+}
|
|
|
|
+vec4 mod289(vec4 x)
|
|
|
|
+{
|
|
|
|
+return x-floor(x*(1.0/289.0))*289.0;
|
|
|
|
+}
|
|
|
|
+vec4 permute(vec4 x)
|
|
|
|
+{
|
|
|
|
+return mod289(((x*34.0)+1.0)*x);
|
|
|
|
+}
|
|
|
|
+vec4 taylorInvSqrt(vec4 r)
|
|
|
|
+{
|
|
|
|
+return 1.79284291400159-0.85373472095314*r;
|
|
|
|
+}
|
|
|
|
+vec3 fade(vec3 t) {
|
|
|
|
+return t*t*t*(t*(t*6.0-15.0)+10.0);
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+float pnoise(vec3 P,vec3 rep)
|
|
|
|
+{
|
|
|
|
+vec3 Pi0=mod(floor(P),rep);
|
|
|
|
+vec3 Pi1=mod(Pi0+vec3(1.0),rep);
|
|
|
|
+Pi0=mod289(Pi0);
|
|
|
|
+Pi1=mod289(Pi1);
|
|
|
|
+vec3 Pf0=fract(P);
|
|
|
|
+vec3 Pf1=Pf0-vec3(1.0);
|
|
|
|
+vec4 ix=vec4(Pi0.x,Pi1.x,Pi0.x,Pi1.x);
|
|
|
|
+vec4 iy=vec4(Pi0.yy,Pi1.yy);
|
|
|
|
+vec4 iz0=Pi0.zzzz;
|
|
|
|
+vec4 iz1=Pi1.zzzz;
|
|
|
|
+vec4 ixy=permute(permute(ix)+iy);
|
|
|
|
+vec4 ixy0=permute(ixy+iz0);
|
|
|
|
+vec4 ixy1=permute(ixy+iz1);
|
|
|
|
+vec4 gx0=ixy0*(1.0/7.0);
|
|
|
|
+vec4 gy0=fract(floor(gx0)*(1.0/7.0))-0.5;
|
|
|
|
+gx0=fract(gx0);
|
|
|
|
+vec4 gz0=vec4(0.5)-abs(gx0)-abs(gy0);
|
|
|
|
+vec4 sz0=step(gz0,vec4(0.0));
|
|
|
|
+gx0-=sz0*(step(0.0,gx0)-0.5);
|
|
|
|
+gy0-=sz0*(step(0.0,gy0)-0.5);
|
|
|
|
+vec4 gx1=ixy1*(1.0/7.0);
|
|
|
|
+vec4 gy1=fract(floor(gx1)*(1.0/7.0))-0.5;
|
|
|
|
+gx1=fract(gx1);
|
|
|
|
+vec4 gz1=vec4(0.5)-abs(gx1)-abs(gy1);
|
|
|
|
+vec4 sz1=step(gz1,vec4(0.0));
|
|
|
|
+gx1-=sz1*(step(0.0,gx1)-0.5);
|
|
|
|
+gy1-=sz1*(step(0.0,gy1)-0.5);
|
|
|
|
+vec3 g000=vec3(gx0.x,gy0.x,gz0.x);
|
|
|
|
+vec3 g100=vec3(gx0.y,gy0.y,gz0.y);
|
|
|
|
+vec3 g010=vec3(gx0.z,gy0.z,gz0.z);
|
|
|
|
+vec3 g110=vec3(gx0.w,gy0.w,gz0.w);
|
|
|
|
+vec3 g001=vec3(gx1.x,gy1.x,gz1.x);
|
|
|
|
+vec3 g101=vec3(gx1.y,gy1.y,gz1.y);
|
|
|
|
+vec3 g011=vec3(gx1.z,gy1.z,gz1.z);
|
|
|
|
+vec3 g111=vec3(gx1.w,gy1.w,gz1.w);
|
|
|
|
+vec4 norm0=taylorInvSqrt(vec4(dot(g000,g000),dot(g010,g010),dot(g100,g100),dot(g110,g110)));
|
|
|
|
+g000*=norm0.x;
|
|
|
|
+g010*=norm0.y;
|
|
|
|
+g100*=norm0.z;
|
|
|
|
+g110*=norm0.w;
|
|
|
|
+vec4 norm1=taylorInvSqrt(vec4(dot(g001,g001),dot(g011,g011),dot(g101,g101),dot(g111,g111)));
|
|
|
|
+g001*=norm1.x;
|
|
|
|
+g011*=norm1.y;
|
|
|
|
+g101*=norm1.z;
|
|
|
|
+g111*=norm1.w;
|
|
|
|
+float n000=dot(g000,Pf0);
|
|
|
|
+float n100=dot(g100,vec3(Pf1.x,Pf0.yz));
|
|
|
|
+float n010=dot(g010,vec3(Pf0.x,Pf1.y,Pf0.z));
|
|
|
|
+float n110=dot(g110,vec3(Pf1.xy,Pf0.z));
|
|
|
|
+float n001=dot(g001,vec3(Pf0.xy,Pf1.z));
|
|
|
|
+float n101=dot(g101,vec3(Pf1.x,Pf0.y,Pf1.z));
|
|
|
|
+float n011=dot(g011,vec3(Pf0.x,Pf1.yz));
|
|
|
|
+float n111=dot(g111,Pf1);
|
|
|
|
+vec3 fade_xyz=fade(Pf0);
|
|
|
|
+vec4 n_z=mix(vec4(n000,n100,n010,n110),vec4(n001,n101,n011,n111),fade_xyz.z);
|
|
|
|
+vec2 n_yz=mix(n_z.xy,n_z.zw,fade_xyz.y);
|
|
|
|
+float n_xyz=mix(n_yz.x,n_yz.y,fade_xyz.x);
|
|
|
|
+return 2.2*n_xyz;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+float turbulence( vec3 p ) {
|
|
|
|
+float w=100.0;
|
|
|
|
+float t=-.5;
|
|
|
|
+for (float f=1.0 ; f<=10.0 ; f++ ){
|
|
|
|
+float power=pow( 2.0,f );
|
|
|
|
+t+=abs( pnoise( vec3( power*p ),vec3( 10.0,10.0,10.0 ) )/power );
|
|
|
|
+}
|
|
|
|
+return t;
|
|
|
|
+}
|
|
|
|
+void main(void) {
|
|
|
|
+#include<instancesVertex>
|
|
|
|
+#include<bonesVertex>
|
|
|
|
+#ifdef NORMAL
|
|
|
|
+
|
|
|
|
+noise=10.0*-.10*turbulence( .5*normal+time*1.15 );
|
|
|
|
+
|
|
|
|
+float b=lowFrequencySpeed*5.0*pnoise( 0.05*position +vec3(time*1.025),vec3( 100.0 ) );
|
|
|
|
+
|
|
|
|
+float displacement =-1.5*noise+b;
|
|
|
|
+
|
|
|
|
+vec3 newPosition=position+normal*displacement;
|
|
|
|
+gl_Position=viewProjection*finalWorld*vec4( newPosition,1.0 );
|
|
|
|
+vec4 worldPos=finalWorld*vec4(newPosition,1.0);
|
|
|
|
+vPositionW=vec3(worldPos);
|
|
|
|
+vNormalW=normalize(vec3(finalWorld*vec4(normal,0.0)));
|
|
|
|
+#endif
|
|
|
|
+
|
|
|
|
+#ifndef UV1
|
|
|
|
+vec2 uv=vec2(0.,0.);
|
|
|
|
+#endif
|
|
|
|
+#ifndef UV2
|
|
|
|
+vec2 uv2=vec2(0.,0.);
|
|
|
|
+#endif
|
|
|
|
+#ifdef DIFFUSE
|
|
|
|
+if (vDiffuseInfos.x == 0.)
|
|
|
|
+{
|
|
|
|
+vDiffuseUV=vec2(diffuseMatrix*vec4(uv,1.0,0.0));
|
|
|
|
+}
|
|
|
|
+else
|
|
|
|
+{
|
|
|
|
+vDiffuseUV=vec2(diffuseMatrix*vec4(uv2,1.0,0.0));
|
|
|
|
+}
|
|
|
|
+#endif
|
|
|
|
+
|
|
|
|
+#include<clipPlaneVertex>
|
|
|
|
+
|
|
|
|
+#include<fogVertex>
|
|
|
|
+#include<shadowsVertex>[0..maxSimultaneousLights]
|
|
|
|
+
|
|
|
|
+#ifdef VERTEXCOLOR
|
|
|
|
+vColor=color;
|
|
|
|
+#endif
|
|
|
|
+
|
|
|
|
+#ifdef POINTSIZE
|
|
|
|
+gl_PointSize=pointSize;
|
|
|
|
+#endif
|
|
|
|
+}`;
|
|
|
|
+
|
|
|
|
+Effect.ShadersStore[name] = shader;
|
|
|
|
+
|
|
|
|
+export { shader, name };
|