Kinesim/vendor/threex/THREEx.PlasmaShader.js
Amit Kumar Nandi c51788eb87 Forgejo Up
2024-10-03 06:46:07 +05:30

104 lines
3 KiB
JavaScript

// define namespaces
var THREEx = THREEx || {};
THREEx.ShaderLib = THREEx.ShaderLib || {};
THREEx.UniformsLib = THREEx.UniformsLib || {};
THREEx.UniformsLib['plasma'] = {
time : { type : "f", value: 0.0 },
scale : { type : "f", value: 1.0 },
rotation: { type : "f", value: 0.0 },
opacity : { type : "f", value: 1.0 },
c0 : { type : "f", value: 5.0 },
c1 : { type : "f", value: 3.0 },
c2 : { type : "f", value: 11.0 },
c3 : { type : "f", value: 7.0 },
c4 : { type : "f", value: 9.0 },
c5 : { type : "f", value: 3.0 }
};
THREEx.ShaderLib['plasma'] = {
vertexShader: [
"#ifdef GL_ES",
"precision highp float;",
"#endif",
"varying vec2 vUv;",
"void main(){",
"vUv = uv;",
"gl_Position = projectionMatrix * modelViewMatrix * vec4(position,1.0);",
"}"
].join( "\n" ),
fragmentShader: [
"#ifdef GL_ES",
"precision highp float;",
"#endif",
"varying vec2 vUv;",
"uniform float time;",
"uniform float scale;",
"uniform float rotation;",
"uniform float opacity;",
"uniform float c0, c1, c2, c3, c4, c5;",
// todo zoom and rotation of vec2 point
"vec2 rotoZoom(const vec2 point, const float scale, const float rotation){",
"vec2 tmp;",
"tmp.x = point.x * cos(rotation) - point.y * sin(rotation);",
"tmp.y = point.x * sin(rotation) + point.y * cos(rotation);",
"tmp = tmp * scale;",
"return tmp;",
"}",
// based on THREE.Color.setHSV()
// based on Mads Elvheim / Madsy http://code.google.com/p/opengl3-freenode/wiki/ColorSpaceConversions
"vec3 HSVtoRGB(const vec3 color){",
"float h = color.r;",
"float s = color.g;",
"float v = color.b;",
"float i = floor(h * 6.0);",
"float f = (h * 6.0) - i;",
"float p = v * (1.0 - s);",
"float q = v * (1.0 - f * s);",
"float t = v * (1.0 - (1.0 - f) * s);",
"vec3 result;",
"if( i < 1.0 ) result = vec3(v,t,p);",
"else if( i < 2.0 ) result = vec3(q,v,p);",
"else if( i < 3.0 ) result = vec3(p,v,t);",
"else if( i < 4.0 ) result = vec3(p,q,v);",
"else if( i < 5.0 ) result = vec3(t,p,v);",
"else if( i < 6.0 ) result = vec3(v,p,q);",
"else result = vec3(v,t,p);",
"return result;",
"}",
// default value
"#ifndef ROTOZOOM",
"#define ROTOZOOM 1",
"#endif",
"#ifndef USEHSV",
"#define USEHSV 1",
"#endif",
"void main(){",
"vec2 p = -1.0 + 2.0 * vUv;",
"#if ROTOZOOM",
"p = rotoZoom(p, scale, rotation);",
"#endif",
"float cossin1 = cos(p.x*c0+sin(time*1.3)) - sin(p.y*c3-cos(time)) + sin(time);",
"float cossin2 = cos(p.y*c1+cos(c1*time/c4)) * sin(p.x*c4*sin(time)) - cos(time);",
"float cossin3 = cos(p.x*c2+sin(c2*time/c5)) + sin(p.y*c5+cos(time)) + cos(time);",
//"vec3 color = vec3(abs(cossin1*sin(p.x)), cossin2*sin(p.y), cossin3*sin(p.x));",
"vec3 color = vec3(abs(cossin1*sin(p.x)), 0.6 - 0.4* abs(cossin2*sin(p.y)), 0.5 - 0.3*(cossin3*sin(p.x)));",
"#if USEHSV",
"color = HSVtoRGB(color);",
"#endif",
"gl_FragColor = vec4(color, opacity);",
//"gl_FragColor = vec4(cossin1*sin(p.x), cossin2*sin(p.y), cossin3*sin(p.x), opacity);",
"}"
].join( "\n" )
};