Files
2018-07-17 14:15:37 +02:00

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;
}