57 lines
1.6 KiB
Plaintext
57 lines
1.6 KiB
Plaintext
#version 120
|
|
attribute vec4 in_vertex;
|
|
attribute vec3 in_normal;
|
|
attribute vec2 in_uv;
|
|
|
|
uniform float temperature;
|
|
uniform vec4 wsRot;
|
|
uniform float cycles[5]; // 971, 977, 983 high primes
|
|
uniform vec3 halfCycle;
|
|
uniform float nodeScale;
|
|
|
|
varying float distortion;
|
|
varying vec2 uvA, uvB;
|
|
varying vec3 normal, origo;
|
|
varying vec3 v, tempSpeed;
|
|
varying float tempScale;
|
|
|
|
vec2 rotator(vec2 rotate, float rate)
|
|
{
|
|
return vec2(dot(rotate, vec2(cos(rate), -sin(rate))), dot(rotate, vec2(sin(rate), cos(rate))));
|
|
}
|
|
|
|
vec3 toLinear(vec3 x) {
|
|
return pow(x, vec3(2.2));
|
|
}
|
|
|
|
float square(float x){
|
|
return x*x;
|
|
}
|
|
|
|
vec3 wsAllign(vec3 x){
|
|
return x + 2.0 * cross(wsRot.xyz, cross(wsRot.xyz, x) + wsRot.w * x);
|
|
}
|
|
|
|
void main() {
|
|
distortion = abs(in_uv.y-0.5) * 2.0;
|
|
|
|
// world space for the better parallax
|
|
tempScale = pow(1.0 - min(1.0, temperature / 29800.0), 1.0);
|
|
tempSpeed = (1.0 - tempScale) * abs(vec3(cycles[0], cycles[1], cycles[2]) - halfCycle) * 0.1;
|
|
vec4 pos = gl_ModelViewMatrix * in_vertex;
|
|
origo = in_vertex.xyz;
|
|
|
|
// convert view, normal and light vectors to world space and quaternion correct for model rotation
|
|
mat3 tcamrot = transpose(mat3x3(gl_ModelViewMatrix));
|
|
v = normalize(wsAllign(normalize(tcamrot * -pos.xyz)));
|
|
|
|
// normals are needed for the parallax and fresnel
|
|
normal = normalize(tcamrot * (gl_NormalMatrix * wsAllign(normalize(in_normal))));
|
|
// approximate pole uv scale from origo in relation to nodescale
|
|
uvA = origo.xz / nodeScale * 24.0;
|
|
uvA.x *= 0.5;
|
|
uvB = in_uv;
|
|
|
|
gl_Position = gl_ProjectionMatrix * pos;
|
|
}
|