src/camera.c

Wed, 02 Jul 2025 23:21:17 +0200

author
Mike Becker <universe@uap-core.de>
date
Wed, 02 Jul 2025 23:21:17 +0200
changeset 174
0009b982bc7d
parent 121
ede9a9e92ff9
permissions
-rw-r--r--

resolve TODOs regarding input.h

a) mouse position must be integer, because it can be negative (though rarely)
b) we should not trade "access complexity" for space in the scancodes array

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
106
895f92cff6b8 bring back error.h to reduce compile dependencies
Mike Becker <universe@uap-core.de>
parents: 105
diff changeset
28 #include "ascension/error.h"
121
ede9a9e92ff9 add viewport_clear flag to camera settings
Mike Becker <universe@uap-core.de>
parents: 106
diff changeset
29 #include "ascension/context.h"
37
8a8cc6725b48 add camera and render groups
Mike Becker <universe@uap-core.de>
parents:
diff changeset
30 #include "ascension/camera.h"
8a8cc6725b48 add camera and render groups
Mike Becker <universe@uap-core.de>
parents:
diff changeset
31
121
ede9a9e92ff9 add viewport_clear flag to camera settings
Mike Becker <universe@uap-core.de>
parents: 106
diff changeset
32 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: 106
diff changeset
33 if (args.type == ASC_CAMERA_ORTHO) {
ede9a9e92ff9 add viewport_clear flag to camera settings
Mike Becker <universe@uap-core.de>
parents: 106
diff changeset
34 asc_recti rect = args.ortho.rect;
101
febf3dc10011 add backdrop scene
Mike Becker <universe@uap-core.de>
parents: 99
diff changeset
35 if (rect.size.width <= 0 || rect.size.height <= 0) {
febf3dc10011 add backdrop scene
Mike Becker <universe@uap-core.de>
parents: 99
diff changeset
36 rect.size.width = 1;
febf3dc10011 add backdrop scene
Mike Becker <universe@uap-core.de>
parents: 99
diff changeset
37 rect.size.height = 1;
febf3dc10011 add backdrop scene
Mike Becker <universe@uap-core.de>
parents: 99
diff changeset
38 }
febf3dc10011 add backdrop scene
Mike Becker <universe@uap-core.de>
parents: 99
diff changeset
39 asc_camera_ortho(camera, rect);
121
ede9a9e92ff9 add viewport_clear flag to camera settings
Mike Becker <universe@uap-core.de>
parents: 106
diff changeset
40 } else if (args.type == ASC_CAMERA_PERSPECTIVE) {
101
febf3dc10011 add backdrop scene
Mike Becker <universe@uap-core.de>
parents: 99
diff changeset
41 // TODO: implement
febf3dc10011 add backdrop scene
Mike Becker <universe@uap-core.de>
parents: 99
diff changeset
42 asc_wprintf("Camera type PERSPECTIVE is not yet implemented.");
febf3dc10011 add backdrop scene
Mike Becker <universe@uap-core.de>
parents: 99
diff changeset
43 } else {
febf3dc10011 add backdrop scene
Mike Becker <universe@uap-core.de>
parents: 99
diff changeset
44 // at least zero all the bytes (law of the least surprise)
febf3dc10011 add backdrop scene
Mike Becker <universe@uap-core.de>
parents: 99
diff changeset
45 memset(camera, 0, sizeof(AscCamera));
febf3dc10011 add backdrop scene
Mike Becker <universe@uap-core.de>
parents: 99
diff changeset
46 }
121
ede9a9e92ff9 add viewport_clear flag to camera settings
Mike Becker <universe@uap-core.de>
parents: 106
diff changeset
47 camera->viewport_update_func = args.viewport_update_func;
ede9a9e92ff9 add viewport_clear flag to camera settings
Mike Becker <universe@uap-core.de>
parents: 106
diff changeset
48 camera->projection_update_func = args.projection_update_func;
ede9a9e92ff9 add viewport_clear flag to camera settings
Mike Becker <universe@uap-core.de>
parents: 106
diff changeset
49 camera->viewport_clear = args.viewport_clear;
ede9a9e92ff9 add viewport_clear flag to camera settings
Mike Becker <universe@uap-core.de>
parents: 106
diff changeset
50 camera->clear_color = asc_col_itof(asc_context.ink);
101
febf3dc10011 add backdrop scene
Mike Becker <universe@uap-core.de>
parents: 99
diff changeset
51 }
febf3dc10011 add backdrop scene
Mike Becker <universe@uap-core.de>
parents: 99
diff changeset
52
47
44457f6cb0a2 remove unnecessary scene container
Mike Becker <universe@uap-core.de>
parents: 41
diff changeset
53 void asc_camera_ortho(AscCamera *camera, asc_recti rect) {
44457f6cb0a2 remove unnecessary scene container
Mike Becker <universe@uap-core.de>
parents: 41
diff changeset
54 asc_mat4f_unit(camera->view);
44457f6cb0a2 remove unnecessary scene container
Mike Becker <universe@uap-core.de>
parents: 41
diff changeset
55 float left = (float) rect.pos.x;
44457f6cb0a2 remove unnecessary scene container
Mike Becker <universe@uap-core.de>
parents: 41
diff changeset
56 float right = left + (float) rect.size.width;
44457f6cb0a2 remove unnecessary scene container
Mike Becker <universe@uap-core.de>
parents: 41
diff changeset
57 float top = (float) rect.pos.y;
44457f6cb0a2 remove unnecessary scene container
Mike Becker <universe@uap-core.de>
parents: 41
diff changeset
58 float bottom = top + (float) rect.size.height;
41
df81d493716e add correct interleaving of opaque and transparent sprites
Mike Becker <universe@uap-core.de>
parents: 37
diff changeset
59 asc_mat4f_ortho(camera->projection, left, right, bottom, top, -1, 1);
37
8a8cc6725b48 add camera and render groups
Mike Becker <universe@uap-core.de>
parents:
diff changeset
60 }
99
ac143db979dc add aspect-ration independent rendering
Mike Becker <universe@uap-core.de>
parents: 47
diff changeset
61
105
2b7f92ff2c15 improve datatypes
Mike Becker <universe@uap-core.de>
parents: 101
diff changeset
62 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
63 asc_mat4f_ortho_update_size(camera->projection, (float)size.width, (float)size.height);
ac143db979dc add aspect-ration independent rendering
Mike Becker <universe@uap-core.de>
parents: 47
diff changeset
64 }

mercurial