LibGame  v0.4.0
The LG Game Engine - Copyright (C) 2024-2025 ETMSoftware
lg_camera.h
1 /*
2  * LibGame - Copyright (C) Emmanuel Thomas-Maurin 2011-2025
3  * All rights reserved
4  */
5 
6 #ifndef LG_CAMERA_H
7 #define LG_CAMERA_H
8 
9 /* Global default camera values */
10 
11 #define LG_CAMERA_ORIGIN 0.0, 0.0, 0.0 /* Initial camera or "eye" position */
12 #define LG_CAMERA_TARGET 0.0, 0.0, -1.0
13 #define LG_CAMERA_UP 0.0, 1.0, 0.0
14 
15 #define LG_V_FOV 45
16 #define LG_Z_NEAR 0.1 /* Usually in range [0.1, 1.0] */
17 #define LG_Z_FAR 1000.0 /* Usually >= 100.0 */
18 
19 /*
20  * Forward vec3 = normalized(target - position)
21  */
22 typedef struct {
23  vec3_t position; /* Or "eye" position in world coords */
24  LG_Quat orientation; /* Must update target after setting/changing orientation */
25  vec3_t target; /* Target position in world coords - SHOULD ALWAYS ONLY BE UPDATED FROM ORIENTATION QUAT */
26  vec3_t up; /* Must be normalized */
27  float v_fov; /* Vertical field of view in deg */
28  float z_near; /* Clipping plane along the Z axis, always > 0 */
29  float z_far; /* Clipping plane along the Z axis, always > 0 */
30  mat4_t view_m; /* View/proj matrices - must be updated when position or orientation changes */
31  mat4_t proj_m;
32  mat4_t view_proj_m;
33  zboolean new_view; /* Dirty flag */
34  zboolean new_proj;
35  LG_InputState input_state; /* To capture user input */
36 } LG_Camera;
37 
38 typedef struct {
39  float a, b, c, d;
40 } LG_Plane;
41 
42 typedef struct {
43  LG_Plane left;
44  LG_Plane right;
45  LG_Plane bottom;
46  LG_Plane top;
47  LG_Plane near;
48  LG_Plane far;
49 } LG_Frustum;
50 
52 
54 
55 int lg_camera_set_all(LG_Camera *, vec3_t, vec3_t, vec3_t, float, float, float);
56 
58 
60 
62 
64 
66 
68 
69 int lg_camera_rotate_by_eu(LG_Camera *, LG_EulerAng, const char *);
70 
72 
73 int lg_camera_set_rot_by_eu(LG_Camera *, LG_EulerAng, const char *);
74 
76 
78 
79 zboolean is_in_frustum(vec3_t *, LG_Frustum *);
80 
81 zboolean lg_cuboid_is_in_frustum(LG_Cuboid *, LG_Frustum *, zboolean);
82 
83 zboolean lg_mesh_is_in_frustum(LG_Mesh *, LG_Frustum *, zboolean);
84 
85 void lg_camera_override_znear(LG_Camera *, float);
86 
87 void lg_camera_override_zfar(LG_Camera *, float);
88 
89 void lg_camera_orbit_around(LG_Camera *, vec3_t, float, float);
90 
92 
94 
96 
98 
100 
101 #endif /* LG_CAMERA_H */
LG_Mesh
Definition: lg_mesh.h:73
lg_point_to_norm_plane_distance
float lg_point_to_norm_plane_distance(vec3_t *v, LG_Plane *p)
Definition: lg_camera.c:671
lg_camera_override_zfar
void lg_camera_override_zfar(LG_Camera *cam, float z_far)
Definition: lg_camera.c:573
is_in_frustum
zboolean is_in_frustum(vec3_t *v, LG_Frustum *frustum)
Definition: lg_camera.c:493
lg_camera_init
int lg_camera_init(LG_Camera *cam)
Definition: lg_camera.c:144
LG_Cuboid
Definition: lg_3d_primitives.h:64
lg_update_all_cam_m
void lg_update_all_cam_m(LG_Camera *cam)
Definition: lg_camera.c:275
LG_Quat
Definition: lg_quaternions.h:29
lg_camera_set_all
int lg_camera_set_all(LG_Camera *cam, vec3_t position, vec3_t target, vec3_t up, float v_fov, float z_near, float z_far)
Definition: lg_camera.c:182
lg_camera_rotate_by_quat
int lg_camera_rotate_by_quat(LG_Camera *cam, LG_Quat q)
Definition: lg_camera.c:342
LG_InputState
Definition: lg_ui.h:55
LG_EulerAng
Definition: lg_quaternions.h:16
lg_camera_compute_proj_matrix_RH
mat4_t lg_camera_compute_proj_matrix_RH(LG_Camera *cam)
Definition: lg_camera.c:247
lg_camera_get_frustum
void lg_camera_get_frustum(LG_Camera *cam, LG_Frustum *frustum)
Definition: lg_camera.c:421
lg_camera
LG_Camera lg_camera()
Definition: lg_camera.c:117
lg_cuboid_is_in_frustum
zboolean lg_cuboid_is_in_frustum(LG_Cuboid *cuboid, LG_Frustum *frustum, zboolean fully)
Definition: lg_camera.c:515
lg_camera_set_rot_by_eu
int lg_camera_set_rot_by_eu(LG_Camera *cam, LG_EulerAng ang, const char *rot_order)
Definition: lg_camera.c:375
lg_camera_orbit_around
void lg_camera_orbit_around(LG_Camera *cam, vec3_t center, float yaw, float pitch)
Definition: lg_camera.c:591
LG_Frustum
Definition: lg_camera.h:42
lg_frustum_info
void lg_frustum_info(LG_Frustum *frustum)
Definition: lg_camera.c:710
lg_mesh_is_in_frustum
zboolean lg_mesh_is_in_frustum(LG_Mesh *mesh, LG_Frustum *frustum, zboolean fully)
Definition: lg_camera.c:544
lg_plane_normalize
int lg_plane_normalize(LG_Plane *p)
Definition: lg_camera.c:630
vec3_t
Definition: math_3d.h:128
LG_Camera
Definition: lg_camera.h:22
lg_camera_reset
int lg_camera_reset(LG_Camera *cam)
Definition: lg_camera.c:220
lg_camera_compute_view_proj_matrix_RH
mat4_t lg_camera_compute_view_proj_matrix_RH(LG_Camera *cam)
Definition: lg_camera.c:262
lg_camera_info
void lg_camera_info(LG_Camera *cam)
Definition: lg_camera.c:681
lg_camera_compute_view_matrix_RH
mat4_t lg_camera_compute_view_matrix_RH(LG_Camera *cam)
Definition: lg_camera.c:233
lg_camera_override_znear
void lg_camera_override_znear(LG_Camera *cam, float z_near)
Definition: lg_camera.c:557
lg_point_to_plane_distance
float lg_point_to_plane_distance(vec3_t *v, LG_Plane *p)
Definition: lg_camera.c:658
lg_camera_move_to
int lg_camera_move_to(LG_Camera *cam, vec3_t transl)
Definition: lg_camera.c:298
lg_camera_set_rot_by_quat
int lg_camera_set_rot_by_quat(LG_Camera *cam, LG_Quat q)
Definition: lg_camera.c:389
lg_camera_rotate_by_eu
int lg_camera_rotate_by_eu(LG_Camera *cam, LG_EulerAng ang, const char *rot_order)
Definition: lg_camera.c:328
LG_Plane
Definition: lg_camera.h:38
mat4_t
Definition: math_3d.h:184