104 lines
3 KiB
JavaScript
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" )
|
|
};
|