src/ascension/transform.h

Thu, 28 Mar 2024 23:30:21 +0100

author
Mike Becker <universe@uap-core.de>
date
Thu, 28 Mar 2024 23:30:21 +0100
changeset 45
18de2af03531
parent 32
86468a71dd73
permissions
-rw-r--r--

simplify how transforms work

32
86468a71dd73 add transformation matrix
Mike Becker <universe@uap-core.de>
parents:
diff changeset
1 /*
86468a71dd73 add transformation matrix
Mike Becker <universe@uap-core.de>
parents:
diff changeset
2 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
86468a71dd73 add transformation matrix
Mike Becker <universe@uap-core.de>
parents:
diff changeset
3 * Copyright 2023 Mike Becker. All rights reserved.
86468a71dd73 add transformation matrix
Mike Becker <universe@uap-core.de>
parents:
diff changeset
4 *
86468a71dd73 add transformation matrix
Mike Becker <universe@uap-core.de>
parents:
diff changeset
5 * Redistribution and use in source and binary forms, with or without
86468a71dd73 add transformation matrix
Mike Becker <universe@uap-core.de>
parents:
diff changeset
6 * modification, are permitted provided that the following conditions are met:
86468a71dd73 add transformation matrix
Mike Becker <universe@uap-core.de>
parents:
diff changeset
7 *
86468a71dd73 add transformation matrix
Mike Becker <universe@uap-core.de>
parents:
diff changeset
8 * 1. Redistributions of source code must retain the above copyright
86468a71dd73 add transformation matrix
Mike Becker <universe@uap-core.de>
parents:
diff changeset
9 * notice, this list of conditions and the following disclaimer.
86468a71dd73 add transformation matrix
Mike Becker <universe@uap-core.de>
parents:
diff changeset
10 *
86468a71dd73 add transformation matrix
Mike Becker <universe@uap-core.de>
parents:
diff changeset
11 * 2. Redistributions in binary form must reproduce the above copyright
86468a71dd73 add transformation matrix
Mike Becker <universe@uap-core.de>
parents:
diff changeset
12 * notice, this list of conditions and the following disclaimer in the
86468a71dd73 add transformation matrix
Mike Becker <universe@uap-core.de>
parents:
diff changeset
13 * documentation and/or other materials provided with the distribution.
86468a71dd73 add transformation matrix
Mike Becker <universe@uap-core.de>
parents:
diff changeset
14 *
86468a71dd73 add transformation matrix
Mike Becker <universe@uap-core.de>
parents:
diff changeset
15 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
86468a71dd73 add transformation matrix
Mike Becker <universe@uap-core.de>
parents:
diff changeset
16 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
86468a71dd73 add transformation matrix
Mike Becker <universe@uap-core.de>
parents:
diff changeset
17 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
86468a71dd73 add transformation matrix
Mike Becker <universe@uap-core.de>
parents:
diff changeset
18 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
86468a71dd73 add transformation matrix
Mike Becker <universe@uap-core.de>
parents:
diff changeset
19 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
86468a71dd73 add transformation matrix
Mike Becker <universe@uap-core.de>
parents:
diff changeset
20 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
86468a71dd73 add transformation matrix
Mike Becker <universe@uap-core.de>
parents:
diff changeset
21 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
86468a71dd73 add transformation matrix
Mike Becker <universe@uap-core.de>
parents:
diff changeset
22 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
86468a71dd73 add transformation matrix
Mike Becker <universe@uap-core.de>
parents:
diff changeset
23 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
86468a71dd73 add transformation matrix
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
86468a71dd73 add transformation matrix
Mike Becker <universe@uap-core.de>
parents:
diff changeset
25 * POSSIBILITY OF SUCH DAMAGE.
86468a71dd73 add transformation matrix
Mike Becker <universe@uap-core.de>
parents:
diff changeset
26 */
86468a71dd73 add transformation matrix
Mike Becker <universe@uap-core.de>
parents:
diff changeset
27
86468a71dd73 add transformation matrix
Mike Becker <universe@uap-core.de>
parents:
diff changeset
28 #ifndef ASCENSION_TRANSFORM_H
86468a71dd73 add transformation matrix
Mike Becker <universe@uap-core.de>
parents:
diff changeset
29 #define ASCENSION_TRANSFORM_H
86468a71dd73 add transformation matrix
Mike Becker <universe@uap-core.de>
parents:
diff changeset
30
86468a71dd73 add transformation matrix
Mike Becker <universe@uap-core.de>
parents:
diff changeset
31 #include "datatypes.h"
86468a71dd73 add transformation matrix
Mike Becker <universe@uap-core.de>
parents:
diff changeset
32
86468a71dd73 add transformation matrix
Mike Becker <universe@uap-core.de>
parents:
diff changeset
33 typedef asc_mat4f asc_transform;
86468a71dd73 add transformation matrix
Mike Becker <universe@uap-core.de>
parents:
diff changeset
34
86468a71dd73 add transformation matrix
Mike Becker <universe@uap-core.de>
parents:
diff changeset
35 #define ASC_TRANSFORM_SIZE (sizeof(float)*16)
86468a71dd73 add transformation matrix
Mike Becker <universe@uap-core.de>
parents:
diff changeset
36
86468a71dd73 add transformation matrix
Mike Becker <universe@uap-core.de>
parents:
diff changeset
37 #ifdef __GNUC__
86468a71dd73 add transformation matrix
Mike Becker <universe@uap-core.de>
parents:
diff changeset
38 #define ASC_TRANFORM_FUNC_ATTRIBUTES \
86468a71dd73 add transformation matrix
Mike Becker <universe@uap-core.de>
parents:
diff changeset
39 __attribute__((__nonnull__, __always_inline__))
86468a71dd73 add transformation matrix
Mike Becker <universe@uap-core.de>
parents:
diff changeset
40 #else
86468a71dd73 add transformation matrix
Mike Becker <universe@uap-core.de>
parents:
diff changeset
41 #define ASC_TRANFORM_FUNC_ATTRIBUTES
86468a71dd73 add transformation matrix
Mike Becker <universe@uap-core.de>
parents:
diff changeset
42 #endif
86468a71dd73 add transformation matrix
Mike Becker <universe@uap-core.de>
parents:
diff changeset
43 #define ASC_TRANFORM_FUNC ASC_TRANFORM_FUNC_ATTRIBUTES static inline
86468a71dd73 add transformation matrix
Mike Becker <universe@uap-core.de>
parents:
diff changeset
44
86468a71dd73 add transformation matrix
Mike Becker <universe@uap-core.de>
parents:
diff changeset
45
86468a71dd73 add transformation matrix
Mike Becker <universe@uap-core.de>
parents:
diff changeset
46 ASC_TRANFORM_FUNC void asc_transform_identity(asc_transform transform) {
86468a71dd73 add transformation matrix
Mike Becker <universe@uap-core.de>
parents:
diff changeset
47 memset(transform, 0, ASC_TRANSFORM_SIZE);
86468a71dd73 add transformation matrix
Mike Becker <universe@uap-core.de>
parents:
diff changeset
48 transform[asc_mat4_index(0, 0)] = 1;
86468a71dd73 add transformation matrix
Mike Becker <universe@uap-core.de>
parents:
diff changeset
49 transform[asc_mat4_index(1, 1)] = 1;
86468a71dd73 add transformation matrix
Mike Becker <universe@uap-core.de>
parents:
diff changeset
50 transform[asc_mat4_index(2, 2)] = 1;
86468a71dd73 add transformation matrix
Mike Becker <universe@uap-core.de>
parents:
diff changeset
51 transform[asc_mat4_index(3, 3)] = 1;
86468a71dd73 add transformation matrix
Mike Becker <universe@uap-core.de>
parents:
diff changeset
52 }
86468a71dd73 add transformation matrix
Mike Becker <universe@uap-core.de>
parents:
diff changeset
53
86468a71dd73 add transformation matrix
Mike Becker <universe@uap-core.de>
parents:
diff changeset
54 ASC_TRANFORM_FUNC void asc_transform_copy(asc_transform dest, asc_transform src) {
86468a71dd73 add transformation matrix
Mike Becker <universe@uap-core.de>
parents:
diff changeset
55 memcpy(dest, src, ASC_TRANSFORM_SIZE);
86468a71dd73 add transformation matrix
Mike Becker <universe@uap-core.de>
parents:
diff changeset
56 }
86468a71dd73 add transformation matrix
Mike Becker <universe@uap-core.de>
parents:
diff changeset
57
86468a71dd73 add transformation matrix
Mike Becker <universe@uap-core.de>
parents:
diff changeset
58 ASC_TRANFORM_FUNC void asc_transform_translate(
86468a71dd73 add transformation matrix
Mike Becker <universe@uap-core.de>
parents:
diff changeset
59 asc_transform transform,
45
18de2af03531 simplify how transforms work
Mike Becker <universe@uap-core.de>
parents: 32
diff changeset
60 asc_vec3f vec
32
86468a71dd73 add transformation matrix
Mike Becker <universe@uap-core.de>
parents:
diff changeset
61 ) {
45
18de2af03531 simplify how transforms work
Mike Becker <universe@uap-core.de>
parents: 32
diff changeset
62 transform[asc_mat4_index(3, 0)] += vec.x;
18de2af03531 simplify how transforms work
Mike Becker <universe@uap-core.de>
parents: 32
diff changeset
63 transform[asc_mat4_index(3, 1)] += vec.y;
18de2af03531 simplify how transforms work
Mike Becker <universe@uap-core.de>
parents: 32
diff changeset
64 transform[asc_mat4_index(3, 2)] += vec.z;
32
86468a71dd73 add transformation matrix
Mike Becker <universe@uap-core.de>
parents:
diff changeset
65 }
86468a71dd73 add transformation matrix
Mike Becker <universe@uap-core.de>
parents:
diff changeset
66
86468a71dd73 add transformation matrix
Mike Becker <universe@uap-core.de>
parents:
diff changeset
67 ASC_TRANFORM_FUNC void asc_transform_scale(
86468a71dd73 add transformation matrix
Mike Becker <universe@uap-core.de>
parents:
diff changeset
68 asc_transform transform,
45
18de2af03531 simplify how transforms work
Mike Becker <universe@uap-core.de>
parents: 32
diff changeset
69 asc_vec3f vec
32
86468a71dd73 add transformation matrix
Mike Becker <universe@uap-core.de>
parents:
diff changeset
70 ) {
86468a71dd73 add transformation matrix
Mike Becker <universe@uap-core.de>
parents:
diff changeset
71 for (unsigned i = 0 ; i < 3 ; i++) {
45
18de2af03531 simplify how transforms work
Mike Becker <universe@uap-core.de>
parents: 32
diff changeset
72 transform[asc_mat4_index(0, i)] *= vec.width;
18de2af03531 simplify how transforms work
Mike Becker <universe@uap-core.de>
parents: 32
diff changeset
73 transform[asc_mat4_index(1, i)] *= vec.height;
18de2af03531 simplify how transforms work
Mike Becker <universe@uap-core.de>
parents: 32
diff changeset
74 transform[asc_mat4_index(2, i)] *= vec.depth;
32
86468a71dd73 add transformation matrix
Mike Becker <universe@uap-core.de>
parents:
diff changeset
75 }
86468a71dd73 add transformation matrix
Mike Becker <universe@uap-core.de>
parents:
diff changeset
76 }
86468a71dd73 add transformation matrix
Mike Becker <universe@uap-core.de>
parents:
diff changeset
77
45
18de2af03531 simplify how transforms work
Mike Becker <universe@uap-core.de>
parents: 32
diff changeset
78 ASC_TRANFORM_FUNC void asc_transform_rotate(
32
86468a71dd73 add transformation matrix
Mike Becker <universe@uap-core.de>
parents:
diff changeset
79 asc_transform transform,
45
18de2af03531 simplify how transforms work
Mike Becker <universe@uap-core.de>
parents: 32
diff changeset
80 asc_vec3f vec
32
86468a71dd73 add transformation matrix
Mike Becker <universe@uap-core.de>
parents:
diff changeset
81 ) {
45
18de2af03531 simplify how transforms work
Mike Becker <universe@uap-core.de>
parents: 32
diff changeset
82 // TODO: implement
18de2af03531 simplify how transforms work
Mike Becker <universe@uap-core.de>
parents: 32
diff changeset
83 }
18de2af03531 simplify how transforms work
Mike Becker <universe@uap-core.de>
parents: 32
diff changeset
84
18de2af03531 simplify how transforms work
Mike Becker <universe@uap-core.de>
parents: 32
diff changeset
85 ASC_TRANFORM_FUNC void asc_transform_from_parts(
18de2af03531 simplify how transforms work
Mike Becker <universe@uap-core.de>
parents: 32
diff changeset
86 asc_transform transform,
18de2af03531 simplify how transforms work
Mike Becker <universe@uap-core.de>
parents: 32
diff changeset
87 asc_vec3f position,
18de2af03531 simplify how transforms work
Mike Becker <universe@uap-core.de>
parents: 32
diff changeset
88 asc_vec3f scale,
18de2af03531 simplify how transforms work
Mike Becker <universe@uap-core.de>
parents: 32
diff changeset
89 asc_vec3f rotation
18de2af03531 simplify how transforms work
Mike Becker <universe@uap-core.de>
parents: 32
diff changeset
90 ) {
18de2af03531 simplify how transforms work
Mike Becker <universe@uap-core.de>
parents: 32
diff changeset
91 asc_transform_identity(transform);
18de2af03531 simplify how transforms work
Mike Becker <universe@uap-core.de>
parents: 32
diff changeset
92 asc_transform_scale(transform, scale);
18de2af03531 simplify how transforms work
Mike Becker <universe@uap-core.de>
parents: 32
diff changeset
93 asc_transform_translate(transform, position);
18de2af03531 simplify how transforms work
Mike Becker <universe@uap-core.de>
parents: 32
diff changeset
94 asc_transform_rotate(transform, rotation);
32
86468a71dd73 add transformation matrix
Mike Becker <universe@uap-core.de>
parents:
diff changeset
95 }
86468a71dd73 add transformation matrix
Mike Becker <universe@uap-core.de>
parents:
diff changeset
96
86468a71dd73 add transformation matrix
Mike Becker <universe@uap-core.de>
parents:
diff changeset
97 #endif //ASCENSION_TRANSFORM_H

mercurial