src/ascension/camera.h

Sat, 23 Aug 2025 21:01:41 +0200

author
Mike Becker <universe@uap-core.de>
date
Sat, 23 Aug 2025 21:01:41 +0200
changeset 275
2256af1440db
parent 262
b47de42f4598
permissions
-rw-r--r--

move game over text to the UI 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;
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
41 asc_rect viewport;
99
ac143db979dc add aspect-ration independent rendering
Mike Becker <universe@uap-core.de>
parents: 47
diff changeset
42 /**
ac143db979dc add aspect-ration independent rendering
Mike Becker <universe@uap-core.de>
parents: 47
diff changeset
43 * 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
44 * Calculates the new drawing viewport.
ac143db979dc add aspect-ration independent rendering
Mike Becker <universe@uap-core.de>
parents: 47
diff changeset
45 * 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
46 */
ac143db979dc add aspect-ration independent rendering
Mike Becker <universe@uap-core.de>
parents: 47
diff changeset
47 asc_camera_viewport_update_func viewport_update_func;
101
febf3dc10011 add backdrop scene
Mike Becker <universe@uap-core.de>
parents: 99
diff changeset
48 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
49 asc_color clear_color;
121
ede9a9e92ff9 add viewport_clear flag to camera settings
Mike Becker <universe@uap-core.de>
parents: 105
diff changeset
50 bool viewport_clear;
37
8a8cc6725b48 add camera and render groups
Mike Becker <universe@uap-core.de>
parents:
diff changeset
51 };
8a8cc6725b48 add camera and render groups
Mike Becker <universe@uap-core.de>
parents:
diff changeset
52
101
febf3dc10011 add backdrop scene
Mike Becker <universe@uap-core.de>
parents: 99
diff changeset
53 enum AscCameraType {
febf3dc10011 add backdrop scene
Mike Becker <universe@uap-core.de>
parents: 99
diff changeset
54 ASC_CAMERA_CUSTOM,
febf3dc10011 add backdrop scene
Mike Becker <universe@uap-core.de>
parents: 99
diff changeset
55 ASC_CAMERA_ORTHO,
febf3dc10011 add backdrop scene
Mike Becker <universe@uap-core.de>
parents: 99
diff changeset
56 ASC_CAMERA_PERSPECTIVE,
febf3dc10011 add backdrop scene
Mike Becker <universe@uap-core.de>
parents: 99
diff changeset
57 };
febf3dc10011 add backdrop scene
Mike Becker <universe@uap-core.de>
parents: 99
diff changeset
58
121
ede9a9e92ff9 add viewport_clear flag to camera settings
Mike Becker <universe@uap-core.de>
parents: 105
diff changeset
59 struct asc_camera_init_args {
101
febf3dc10011 add backdrop scene
Mike Becker <universe@uap-core.de>
parents: 99
diff changeset
60 enum AscCameraType type;
febf3dc10011 add backdrop scene
Mike Becker <universe@uap-core.de>
parents: 99
diff changeset
61 union {
febf3dc10011 add backdrop scene
Mike Becker <universe@uap-core.de>
parents: 99
diff changeset
62 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
63 asc_rect rect;
101
febf3dc10011 add backdrop scene
Mike Becker <universe@uap-core.de>
parents: 99
diff changeset
64 } ortho;
105
2b7f92ff2c15 improve datatypes
Mike Becker <universe@uap-core.de>
parents: 101
diff changeset
65 /*struct {
2b7f92ff2c15 improve datatypes
Mike Becker <universe@uap-core.de>
parents: 101
diff changeset
66 TODO: implement
2b7f92ff2c15 improve datatypes
Mike Becker <universe@uap-core.de>
parents: 101
diff changeset
67 } perspective;*/
101
febf3dc10011 add backdrop scene
Mike Becker <universe@uap-core.de>
parents: 99
diff changeset
68 };
febf3dc10011 add backdrop scene
Mike Becker <universe@uap-core.de>
parents: 99
diff changeset
69 asc_camera_viewport_update_func viewport_update_func;
febf3dc10011 add backdrop scene
Mike Becker <universe@uap-core.de>
parents: 99
diff changeset
70 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
71 /**
ede9a9e92ff9 add viewport_clear flag to camera settings
Mike Becker <universe@uap-core.de>
parents: 105
diff changeset
72 * 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
73 * 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
74 */
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
75 asc_color clear_color;
121
ede9a9e92ff9 add viewport_clear flag to camera settings
Mike Becker <universe@uap-core.de>
parents: 105
diff changeset
76 bool viewport_clear;
ede9a9e92ff9 add viewport_clear flag to camera settings
Mike Becker <universe@uap-core.de>
parents: 105
diff changeset
77 };
101
febf3dc10011 add backdrop scene
Mike Becker <universe@uap-core.de>
parents: 99
diff changeset
78
121
ede9a9e92ff9 add viewport_clear flag to camera settings
Mike Becker <universe@uap-core.de>
parents: 105
diff changeset
79 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
80
ede9a9e92ff9 add viewport_clear flag to camera settings
Mike Becker <universe@uap-core.de>
parents: 105
diff changeset
81 #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
82
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
83 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
84
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
85
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
86 /**
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
87 * 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
88 *
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 * 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
90 * 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
91 *
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 * @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
93 * @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
94 */
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 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
96
99
ac143db979dc add aspect-ration independent rendering
Mike Becker <universe@uap-core.de>
parents: 47
diff changeset
97 /**
ac143db979dc add aspect-ration independent rendering
Mike Becker <universe@uap-core.de>
parents: 47
diff changeset
98 * 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
99 *
ac143db979dc add aspect-ration independent rendering
Mike Becker <universe@uap-core.de>
parents: 47
diff changeset
100 * @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
101 *
101
febf3dc10011 add backdrop scene
Mike Becker <universe@uap-core.de>
parents: 99
diff changeset
102 * @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
103 * aligned with the window size (useful for UIs or backdrops).
febf3dc10011 add backdrop scene
Mike Becker <universe@uap-core.de>
parents: 99
diff changeset
104 *
99
ac143db979dc add aspect-ration independent rendering
Mike Becker <universe@uap-core.de>
parents: 47
diff changeset
105 * @param camera the camera
ac143db979dc add aspect-ration independent rendering
Mike Becker <universe@uap-core.de>
parents: 47
diff changeset
106 * @param size the new size
ac143db979dc add aspect-ration independent rendering
Mike Becker <universe@uap-core.de>
parents: 47
diff changeset
107 */
105
2b7f92ff2c15 improve datatypes
Mike Becker <universe@uap-core.de>
parents: 101
diff changeset
108 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
109
37
8a8cc6725b48 add camera and render groups
Mike Becker <universe@uap-core.de>
parents:
diff changeset
110 #endif //ASCENSION_CAMERA_H

mercurial