39 lines
987 B
Plaintext
39 lines
987 B
Plaintext
#version 120
|
|
const int nLightCount = 2;
|
|
attribute vec4 in_vertex;
|
|
attribute vec3 in_normal;
|
|
attribute vec2 in_uv;
|
|
|
|
uniform vec4 wsRot;
|
|
|
|
varying vec3 npos;
|
|
varying vec3 normal;
|
|
varying vec2 uv;
|
|
varying vec3 light[nLightCount];
|
|
varying vec4 pos;
|
|
|
|
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()
|
|
{
|
|
pos = gl_ModelViewMatrix * in_vertex;
|
|
|
|
// convert view, normal and light vectors to world space and quaternion correct for model rotation
|
|
mat3 tcamrot = transpose(mat3x3(gl_ModelViewMatrix));
|
|
npos = (wsAllign(normalize(tcamrot * -pos.xyz)));
|
|
|
|
normal = (tcamrot * (gl_NormalMatrix * wsAllign(normalize(in_normal))));
|
|
for (int i = 0; i < nLightCount; i++) {
|
|
light[i] = wsAllign(normalize((tcamrot * (((gl_LightSource[i].position)).xyz - pos.xyz))));
|
|
}
|
|
|
|
uv = in_uv;
|
|
|
|
gl_Position = gl_ProjectionMatrix * pos;
|
|
}
|