orthographic projection for fov=0, rework of order and defaults for 3d camera api

This commit is contained in:
veclavtalica
2025-01-27 02:42:36 +03:00
parent 20394eed6c
commit 791ab628ca
5 changed files with 63 additions and 22 deletions

View File

@ -413,8 +413,9 @@ void render(void) {
}
void draw_camera(Vec3 position, float fov, Vec3 up, Vec3 direction) {
if (fabsf(0.0f - fov) < 0.00001f || fov >= M_PIf)
void draw_camera(Vec3 position, Vec3 direction, Vec3 up, float fov) {
bool const orthographic = fabsf(0.0f - fov) < 0.00001f;
if (!orthographic && fov >= M_PIf)
log_warn("Invalid fov given (%f)", (double)fov);
Camera const camera = {
@ -424,14 +425,24 @@ void draw_camera(Vec3 position, float fov, Vec3 up, Vec3 direction) {
.up = up,
};
camera_projection_matrix = camera_perspective(&camera);
camera_look_at_matrix = camera_look_at(&camera);
if (!orthographic)
camera_projection_matrix = camera_perspective(&camera);
else
camera_projection_matrix = camera_orthographic(&camera);
camera_look_at_matrix = camera_look_at(&camera);
}
/* TODO: https://stackoverflow.com/questions/62493770/how-to-add-roll-in-camera-class */
DrawCameraFromPrincipalAxesResult draw_camera_from_principal_axes(Vec3 position, float fov, float roll, float pitch, float yaw) {
if (fabsf(0.0f - fov) < 0.00001f || fov >= M_PIf)
DrawCameraFromPrincipalAxesResult draw_camera_from_principal_axes(Vec3 position,
float roll,
float pitch,
float yaw,
float fov)
{
bool const orthographic = fabsf(0.0f - fov) < 0.00001f;
if (!orthographic && fov >= M_PIf)
log_warn("Invalid fov given (%f)", (double)fov);
(void)roll;
@ -451,8 +462,12 @@ DrawCameraFromPrincipalAxesResult draw_camera_from_principal_axes(Vec3 position,
.up = (Vec3){0, 1, 0},
};
camera_projection_matrix = camera_perspective(&camera);
camera_look_at_matrix = camera_look_at(&camera);
if (!orthographic)
camera_projection_matrix = camera_perspective(&camera);
else
camera_projection_matrix = camera_orthographic(&camera);
camera_look_at_matrix = camera_look_at(&camera);
return (DrawCameraFromPrincipalAxesResult) {
.direction = camera.target,

View File

@ -52,3 +52,24 @@ Matrix4 camera_perspective(const Camera *const camera) {
return result;
}
Matrix4 camera_orthographic(const Camera *const camera) {
/* from cglm */
(void)camera;
Matrix4 result = {0};
const float rl = 1.0f / (float)1;
const float tb = 1.0f / (float)1;
const float fn = -1.0f / (CAMERA_FAR_Z - CAMERA_NEAR_Z);
result.row[0].x = 2.0f * rl;
result.row[1].y = 2.0f * tb;
result.row[2].z = 2.0f * fn;
result.row[3].x = -(float)1 * rl;
result.row[3].y = -(float)1 * tb;
result.row[3].z = (CAMERA_FAR_Z + CAMERA_NEAR_Z) * fn;
result.row[3].w = 1.0f;
return result;
}

View File

@ -16,7 +16,7 @@ typedef struct Camera {
} Camera;
Matrix4 camera_look_at(const Camera *camera);
Matrix4 camera_perspective(const Camera *const camera);
Matrix4 camera_orthographic(const Camera *const camera);
#endif