src/ascension/camera.h

Sun, 16 Nov 2025 22:00:13 +0100

author
Mike Becker <universe@uap-core.de>
date
Sun, 16 Nov 2025 22:00:13 +0100
changeset 287
359eaf2a8bd2
parent 262
b47de42f4598
child 288
8796f03aac26
permissions
-rw-r--r--

make camera independent of the scene

37
8a8cc6725b48 add camera and render groups
Mike Becker <universe@uap-core.de>
parents:
diff changeset
1 /*
8a8cc6725b48 add camera and render groups
Mike Becker <universe@uap-core.de>
parents:
diff changeset
2 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
8a8cc6725b48 add camera and render groups
Mike Becker <universe@uap-core.de>
parents:
diff changeset
3 * Copyright 2023 Mike Becker. All rights reserved.
8a8cc6725b48 add camera and render groups
Mike Becker <universe@uap-core.de>
parents:
diff changeset
4 *
8a8cc6725b48 add camera and render groups
Mike Becker <universe@uap-core.de>
parents:
diff changeset
5 * Redistribution and use in source and binary forms, with or without
8a8cc6725b48 add camera and render groups
Mike Becker <universe@uap-core.de>
parents:
diff changeset
6 * modification, are permitted provided that the following conditions are met:
8a8cc6725b48 add camera and render groups
Mike Becker <universe@uap-core.de>
parents:
diff changeset
7 *
8a8cc6725b48 add camera and render groups
Mike Becker <universe@uap-core.de>
parents:
diff changeset
8 * 1. Redistributions of source code must retain the above copyright
8a8cc6725b48 add camera and render groups
Mike Becker <universe@uap-core.de>
parents:
diff changeset
9 * notice, this list of conditions and the following disclaimer.
8a8cc6725b48 add camera and render groups
Mike Becker <universe@uap-core.de>
parents:
diff changeset
10 *
8a8cc6725b48 add camera and render groups
Mike Becker <universe@uap-core.de>
parents:
diff changeset
11 * 2. Redistributions in binary form must reproduce the above copyright
8a8cc6725b48 add camera and render groups
Mike Becker <universe@uap-core.de>
parents:
diff changeset
12 * notice, this list of conditions and the following disclaimer in the
8a8cc6725b48 add camera and render groups
Mike Becker <universe@uap-core.de>
parents:
diff changeset
13 * documentation and/or other materials provided with the distribution.
8a8cc6725b48 add camera and render groups
Mike Becker <universe@uap-core.de>
parents:
diff changeset
14 *
8a8cc6725b48 add camera and render groups
Mike Becker <universe@uap-core.de>
parents:
diff changeset
15 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
8a8cc6725b48 add camera and render groups
Mike Becker <universe@uap-core.de>
parents:
diff changeset
16 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
8a8cc6725b48 add camera and render groups
Mike Becker <universe@uap-core.de>
parents:
diff changeset
17 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
8a8cc6725b48 add camera and render groups
Mike Becker <universe@uap-core.de>
parents:
diff changeset
18 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
8a8cc6725b48 add camera and render groups
Mike Becker <universe@uap-core.de>
parents:
diff changeset
19 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
8a8cc6725b48 add camera and render groups
Mike Becker <universe@uap-core.de>
parents:
diff changeset
20 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
8a8cc6725b48 add camera and render groups
Mike Becker <universe@uap-core.de>
parents:
diff changeset
21 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
8a8cc6725b48 add camera and render groups
Mike Becker <universe@uap-core.de>
parents:
diff changeset
22 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
8a8cc6725b48 add camera and render groups
Mike Becker <universe@uap-core.de>
parents:
diff changeset
23 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
8a8cc6725b48 add camera and render groups
Mike Becker <universe@uap-core.de>
parents:
diff changeset
24 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
8a8cc6725b48 add camera and render groups
Mike Becker <universe@uap-core.de>
parents:
diff changeset
25 * POSSIBILITY OF SUCH DAMAGE.
8a8cc6725b48 add camera and render groups
Mike Becker <universe@uap-core.de>
parents:
diff changeset
26 */
8a8cc6725b48 add camera and render groups
Mike Becker <universe@uap-core.de>
parents:
diff changeset
27
8a8cc6725b48 add camera and render groups
Mike Becker <universe@uap-core.de>
parents:
diff changeset
28 #ifndef ASCENSION_CAMERA_H
8a8cc6725b48 add camera and render groups
Mike Becker <universe@uap-core.de>
parents:
diff changeset
29 #define ASCENSION_CAMERA_H
8a8cc6725b48 add camera and render groups
Mike Becker <universe@uap-core.de>
parents:
diff changeset
30
8a8cc6725b48 add camera and render groups
Mike Becker <universe@uap-core.de>
parents:
diff changeset
31 #include "datatypes.h"
8a8cc6725b48 add camera and render groups
Mike Becker <universe@uap-core.de>
parents:
diff changeset
32
145
a3231310d66d consistent naming of structs and their typedefs
Mike Becker <universe@uap-core.de>
parents: 125
diff changeset
33 typedef struct asc_camera_s AscCamera;
99
ac143db979dc add aspect-ration independent rendering
Mike Becker <universe@uap-core.de>
parents: 47
diff changeset
34
186
e9bb4d4f88a8 rename asc_recti to just asc_rect (there won't be an asc_rectu)
Mike Becker <universe@uap-core.de>
parents: 145
diff changeset
35 typedef asc_rect(*asc_camera_viewport_update_func)(asc_vec2u window_size);
105
2b7f92ff2c15 improve datatypes
Mike Becker <universe@uap-core.de>
parents: 101
diff changeset
36 typedef void(*asc_camera_projection_update_func)(AscCamera*, asc_vec2u window_size);
37
8a8cc6725b48 add camera and render groups
Mike Becker <universe@uap-core.de>
parents:
diff changeset
37
145
a3231310d66d consistent naming of structs and their typedefs
Mike Becker <universe@uap-core.de>
parents: 125
diff changeset
38 struct asc_camera_s {
37
8a8cc6725b48 add camera and render groups
Mike Becker <universe@uap-core.de>
parents:
diff changeset
39 asc_mat4f projection;
8a8cc6725b48 add camera and render groups
Mike Becker <universe@uap-core.de>
parents:
diff changeset
40 asc_mat4f view;
287
359eaf2a8bd2 make camera independent of the scene
Mike Becker <universe@uap-core.de>
parents: 262
diff changeset
41 /**
359eaf2a8bd2 make camera independent of the scene
Mike Becker <universe@uap-core.de>
parents: 262
diff changeset
42 * Does not need to be initialized.
359eaf2a8bd2 make camera independent of the scene
Mike Becker <universe@uap-core.de>
parents: 262
diff changeset
43 * Will be updated every frame.
359eaf2a8bd2 make camera independent of the scene
Mike Becker <universe@uap-core.de>
parents: 262
diff changeset
44 */
186
e9bb4d4f88a8 rename asc_recti to just asc_rect (there won't be an asc_rectu)
Mike Becker <universe@uap-core.de>
parents: 145
diff changeset
45 asc_rect viewport;
99
ac143db979dc add aspect-ration independent rendering
Mike Becker <universe@uap-core.de>
parents: 47
diff changeset
46 /**
ac143db979dc add aspect-ration independent rendering
Mike Becker <universe@uap-core.de>
parents: 47
diff changeset
47 * Function that gets invoked whenever the window sized changed.
ac143db979dc add aspect-ration independent rendering
Mike Becker <universe@uap-core.de>
parents: 47
diff changeset
48 * Calculates the new drawing viewport.
ac143db979dc add aspect-ration independent rendering
Mike Becker <universe@uap-core.de>
parents: 47
diff changeset
49 * If @c NULL, the entire window will be used.
ac143db979dc add aspect-ration independent rendering
Mike Becker <universe@uap-core.de>
parents: 47
diff changeset
50 */
ac143db979dc add aspect-ration independent rendering
Mike Becker <universe@uap-core.de>
parents: 47
diff changeset
51 asc_camera_viewport_update_func viewport_update_func;
101
febf3dc10011 add backdrop scene
Mike Becker <universe@uap-core.de>
parents: 99
diff changeset
52 asc_camera_projection_update_func projection_update_func;
256
60014484121c remove the asc_col4i datatype in favor of a unified asc_color type
Mike Becker <universe@uap-core.de>
parents: 214
diff changeset
53 asc_color clear_color;
121
ede9a9e92ff9 add viewport_clear flag to camera settings
Mike Becker <universe@uap-core.de>
parents: 105
diff changeset
54 bool viewport_clear;
37
8a8cc6725b48 add camera and render groups
Mike Becker <universe@uap-core.de>
parents:
diff changeset
55 };
8a8cc6725b48 add camera and render groups
Mike Becker <universe@uap-core.de>
parents:
diff changeset
56
101
febf3dc10011 add backdrop scene
Mike Becker <universe@uap-core.de>
parents: 99
diff changeset
57 enum AscCameraType {
febf3dc10011 add backdrop scene
Mike Becker <universe@uap-core.de>
parents: 99
diff changeset
58 ASC_CAMERA_CUSTOM,
febf3dc10011 add backdrop scene
Mike Becker <universe@uap-core.de>
parents: 99
diff changeset
59 ASC_CAMERA_ORTHO,
febf3dc10011 add backdrop scene
Mike Becker <universe@uap-core.de>
parents: 99
diff changeset
60 ASC_CAMERA_PERSPECTIVE,
febf3dc10011 add backdrop scene
Mike Becker <universe@uap-core.de>
parents: 99
diff changeset
61 };
febf3dc10011 add backdrop scene
Mike Becker <universe@uap-core.de>
parents: 99
diff changeset
62
121
ede9a9e92ff9 add viewport_clear flag to camera settings
Mike Becker <universe@uap-core.de>
parents: 105
diff changeset
63 struct asc_camera_init_args {
101
febf3dc10011 add backdrop scene
Mike Becker <universe@uap-core.de>
parents: 99
diff changeset
64 enum AscCameraType type;
febf3dc10011 add backdrop scene
Mike Becker <universe@uap-core.de>
parents: 99
diff changeset
65 union {
febf3dc10011 add backdrop scene
Mike Becker <universe@uap-core.de>
parents: 99
diff changeset
66 struct {
186
e9bb4d4f88a8 rename asc_recti to just asc_rect (there won't be an asc_rectu)
Mike Becker <universe@uap-core.de>
parents: 145
diff changeset
67 asc_rect rect;
101
febf3dc10011 add backdrop scene
Mike Becker <universe@uap-core.de>
parents: 99
diff changeset
68 } ortho;
105
2b7f92ff2c15 improve datatypes
Mike Becker <universe@uap-core.de>
parents: 101
diff changeset
69 /*struct {
2b7f92ff2c15 improve datatypes
Mike Becker <universe@uap-core.de>
parents: 101
diff changeset
70 TODO: implement
2b7f92ff2c15 improve datatypes
Mike Becker <universe@uap-core.de>
parents: 101
diff changeset
71 } perspective;*/
101
febf3dc10011 add backdrop scene
Mike Becker <universe@uap-core.de>
parents: 99
diff changeset
72 };
febf3dc10011 add backdrop scene
Mike Becker <universe@uap-core.de>
parents: 99
diff changeset
73 asc_camera_viewport_update_func viewport_update_func;
febf3dc10011 add backdrop scene
Mike Becker <universe@uap-core.de>
parents: 99
diff changeset
74 asc_camera_projection_update_func projection_update_func;
121
ede9a9e92ff9 add viewport_clear flag to camera settings
Mike Becker <universe@uap-core.de>
parents: 105
diff changeset
75 /**
ede9a9e92ff9 add viewport_clear flag to camera settings
Mike Becker <universe@uap-core.de>
parents: 105
diff changeset
76 * Indicates whether the viewport for this camera shall be cleared before rendering.
ede9a9e92ff9 add viewport_clear flag to camera settings
Mike Becker <universe@uap-core.de>
parents: 105
diff changeset
77 * The active drawing color will be used as the clear color (can be changed in the camera struct, afterward).
ede9a9e92ff9 add viewport_clear flag to camera settings
Mike Becker <universe@uap-core.de>
parents: 105
diff changeset
78 */
256
60014484121c remove the asc_col4i datatype in favor of a unified asc_color type
Mike Becker <universe@uap-core.de>
parents: 214
diff changeset
79 asc_color clear_color;
121
ede9a9e92ff9 add viewport_clear flag to camera settings
Mike Becker <universe@uap-core.de>
parents: 105
diff changeset
80 bool viewport_clear;
ede9a9e92ff9 add viewport_clear flag to camera settings
Mike Becker <universe@uap-core.de>
parents: 105
diff changeset
81 };
101
febf3dc10011 add backdrop scene
Mike Becker <universe@uap-core.de>
parents: 99
diff changeset
82
121
ede9a9e92ff9 add viewport_clear flag to camera settings
Mike Becker <universe@uap-core.de>
parents: 105
diff changeset
83 void asc_camera_init_(AscCamera *camera, struct asc_camera_init_args args);
ede9a9e92ff9 add viewport_clear flag to camera settings
Mike Becker <universe@uap-core.de>
parents: 105
diff changeset
84
ede9a9e92ff9 add viewport_clear flag to camera settings
Mike Becker <universe@uap-core.de>
parents: 105
diff changeset
85 #define asc_camera_init(camera,...) asc_camera_init_(camera, (struct asc_camera_init_args){__VA_ARGS__})
101
febf3dc10011 add backdrop scene
Mike Becker <universe@uap-core.de>
parents: 99
diff changeset
86
186
e9bb4d4f88a8 rename asc_recti to just asc_rect (there won't be an asc_rectu)
Mike Becker <universe@uap-core.de>
parents: 145
diff changeset
87 void asc_camera_ortho(AscCamera *camera, asc_rect rect);
37
8a8cc6725b48 add camera and render groups
Mike Becker <universe@uap-core.de>
parents:
diff changeset
88
262
b47de42f4598 update viewports of cameras before executing behaviors, so that the new viewport information is available in the behavior functions
Mike Becker <universe@uap-core.de>
parents: 256
diff changeset
89
b47de42f4598 update viewports of cameras before executing behaviors, so that the new viewport information is available in the behavior functions
Mike Becker <universe@uap-core.de>
parents: 256
diff changeset
90 /**
b47de42f4598 update viewports of cameras before executing behaviors, so that the new viewport information is available in the behavior functions
Mike Becker <universe@uap-core.de>
parents: 256
diff changeset
91 * Updates the camera with the new window viewport.
b47de42f4598 update viewports of cameras before executing behaviors, so that the new viewport information is available in the behavior functions
Mike Becker <universe@uap-core.de>
parents: 256
diff changeset
92 *
b47de42f4598 update viewports of cameras before executing behaviors, so that the new viewport information is available in the behavior functions
Mike Becker <universe@uap-core.de>
parents: 256
diff changeset
93 * This is automatically called when a window resizes.
b47de42f4598 update viewports of cameras before executing behaviors, so that the new viewport information is available in the behavior functions
Mike Becker <universe@uap-core.de>
parents: 256
diff changeset
94 * It should not be necessary to call this function manually.
b47de42f4598 update viewports of cameras before executing behaviors, so that the new viewport information is available in the behavior functions
Mike Becker <universe@uap-core.de>
parents: 256
diff changeset
95 *
b47de42f4598 update viewports of cameras before executing behaviors, so that the new viewport information is available in the behavior functions
Mike Becker <universe@uap-core.de>
parents: 256
diff changeset
96 * @param camera the camera
b47de42f4598 update viewports of cameras before executing behaviors, so that the new viewport information is available in the behavior functions
Mike Becker <universe@uap-core.de>
parents: 256
diff changeset
97 * @param window_size the new window size
b47de42f4598 update viewports of cameras before executing behaviors, so that the new viewport information is available in the behavior functions
Mike Becker <universe@uap-core.de>
parents: 256
diff changeset
98 */
b47de42f4598 update viewports of cameras before executing behaviors, so that the new viewport information is available in the behavior functions
Mike Becker <universe@uap-core.de>
parents: 256
diff changeset
99 void asc_camera_update_viewport(AscCamera *camera, asc_vec2u window_size);
b47de42f4598 update viewports of cameras before executing behaviors, so that the new viewport information is available in the behavior functions
Mike Becker <universe@uap-core.de>
parents: 256
diff changeset
100
99
ac143db979dc add aspect-ration independent rendering
Mike Becker <universe@uap-core.de>
parents: 47
diff changeset
101 /**
ac143db979dc add aspect-ration independent rendering
Mike Becker <universe@uap-core.de>
parents: 47
diff changeset
102 * Shorter version of updating an orthographic camera which assumes the top right corner at (0,0).
ac143db979dc add aspect-ration independent rendering
Mike Becker <universe@uap-core.de>
parents: 47
diff changeset
103 *
ac143db979dc add aspect-ration independent rendering
Mike Becker <universe@uap-core.de>
parents: 47
diff changeset
104 * @attention The camera MUST have been initialized with asc_camera_ortho() at position (0,0).
ac143db979dc add aspect-ration independent rendering
Mike Becker <universe@uap-core.de>
parents: 47
diff changeset
105 *
101
febf3dc10011 add backdrop scene
Mike Becker <universe@uap-core.de>
parents: 99
diff changeset
106 * @note This function can be used as an asc_camera_projection_update_func to keep the orthographic projection
febf3dc10011 add backdrop scene
Mike Becker <universe@uap-core.de>
parents: 99
diff changeset
107 * aligned with the window size (useful for UIs or backdrops).
febf3dc10011 add backdrop scene
Mike Becker <universe@uap-core.de>
parents: 99
diff changeset
108 *
99
ac143db979dc add aspect-ration independent rendering
Mike Becker <universe@uap-core.de>
parents: 47
diff changeset
109 * @param camera the camera
ac143db979dc add aspect-ration independent rendering
Mike Becker <universe@uap-core.de>
parents: 47
diff changeset
110 * @param size the new size
ac143db979dc add aspect-ration independent rendering
Mike Becker <universe@uap-core.de>
parents: 47
diff changeset
111 */
105
2b7f92ff2c15 improve datatypes
Mike Becker <universe@uap-core.de>
parents: 101
diff changeset
112 void asc_camera_ortho_update_size(AscCamera *camera, asc_vec2u size);
99
ac143db979dc add aspect-ration independent rendering
Mike Becker <universe@uap-core.de>
parents: 47
diff changeset
113
37
8a8cc6725b48 add camera and render groups
Mike Becker <universe@uap-core.de>
parents:
diff changeset
114 #endif //ASCENSION_CAMERA_H

mercurial