47 lines
1.4 KiB
GLSL
47 lines
1.4 KiB
GLSL
@vs vs_trile_shadow
|
|
|
|
layout(location=0) in vec4 position;
|
|
layout(location=1) in vec4 normal; // same slot as shader_trile; not used
|
|
layout(location=2) in vec4 centre; // same slot as shader_trile; not used
|
|
layout(location=3) in vec4 instance; // xyz=world_pos, w=orientation
|
|
|
|
layout(binding=0) uniform trile_shadow_vs_params {
|
|
mat4 mvp;
|
|
};
|
|
|
|
mat3 rot_x(float a) { float c=cos(a),s=sin(a); return mat3(1,0,0, 0,c,-s, 0,s,c); }
|
|
mat3 rot_z(float a) { float c=cos(a),s=sin(a); return mat3(c,-s,0, s,c,0, 0,0,1); }
|
|
mat3 rot_y(float a) { float c=cos(a),s=sin(a); return mat3(c,0,s, 0,1,0, -s,0,c); }
|
|
|
|
mat3 get_orientation_matrix(int ori) {
|
|
int face = ori / 4;
|
|
int twist = ori % 4;
|
|
float PI = 3.1415927;
|
|
mat3 base;
|
|
if (face == 0) base = mat3(1.0);
|
|
else if (face == 1) base = rot_x(PI);
|
|
else if (face == 2) base = rot_z(-PI*0.5);
|
|
else if (face == 3) base = rot_z( PI*0.5);
|
|
else if (face == 4) base = rot_x( PI*0.5);
|
|
else base = rot_x(-PI*0.5);
|
|
return base * rot_y(float(twist) * PI * 0.5);
|
|
}
|
|
|
|
void main() {
|
|
int ori = int(round(instance.w));
|
|
mat3 rot = get_orientation_matrix(ori);
|
|
vec3 local = position.xyz - 0.5;
|
|
vec3 rotated = rot * local + 0.5;
|
|
gl_Position = mvp * vec4(rotated + instance.xyz, 1.0);
|
|
}
|
|
@end
|
|
|
|
@fs fs_trile_shadow
|
|
out vec4 frag_color;
|
|
void main() {
|
|
frag_color = vec4(0.0);
|
|
}
|
|
@end
|
|
|
|
@program trile_shadow vs_trile_shadow fs_trile_shadow
|