trueno/src/shaders/shader_trile_shadow.glsl
2026-03-11 13:00:25 +02:00

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