58 lines
1.3 KiB
C
58 lines
1.3 KiB
C
#include "vec.h"
|
|
|
|
#define DEPTH_MAX 255
|
|
|
|
M4x4f lookat(V3f eye, V3f target, V3f up) {
|
|
V3f z = V3(V3f, f32, target.x, target.y, target.z, eye.x, eye.y, eye.z);
|
|
normalise_v3(z);
|
|
V3f x = cross_product(up, z);
|
|
normalise_v3(x);
|
|
V3f y = cross_product(z, x);
|
|
normalise_v3(y);
|
|
|
|
M4x4f rotation = mat4x4_identity;
|
|
rotation.row0.x = x.x;
|
|
rotation.row0.y = x.y;
|
|
rotation.row0.z = x.z;
|
|
rotation.row1.x = y.x;
|
|
rotation.row1.y = y.y;
|
|
rotation.row1.z = y.z;
|
|
rotation.row2.x = z.x;
|
|
rotation.row2.y = z.y;
|
|
rotation.row2.z = z.z;
|
|
|
|
M4x4f translation = mat4x4_identity;
|
|
translation.row0.w = -(eye.x);
|
|
translation.row1.w = -(eye.y);
|
|
translation.row2.w = -(eye.z);
|
|
|
|
return mat4x4_mul(rotation, translation);
|
|
}
|
|
|
|
M4x4f projection(f32 coeff) {
|
|
// clang-format off
|
|
return (M4x4f){
|
|
.row0 = {1.0f, 0.0f, 0.0f, 0.0f},
|
|
.row1 = {0.0f, 1.0f, 0.0f, 0.0f},
|
|
.row2 = {0.0f, 0.0f, 1.0f, 0.0f},
|
|
.row3 = {0.0f, 0.0f, coeff, 1.0f},
|
|
};
|
|
// clang-format on
|
|
}
|
|
|
|
M4x4f viewport(f32 x, f32 y, u64 w, u64 h) {
|
|
M4x4f output = mat4x4_identity;
|
|
|
|
f32 half_width = (f32)w * 0.5f;
|
|
f32 half_height = (f32)h * 0.5f;
|
|
f32 half_depth = (f32)DEPTH_MAX * 0.5f;
|
|
|
|
output.row0.x = half_width;
|
|
output.row0.w = x + half_width;
|
|
output.row1.y = half_height;
|
|
output.row1.w = y + half_height;
|
|
output.row2.z = output.row2.w = half_depth;
|
|
|
|
return output;
|
|
}
|