src/ascension/transform.h

Fri, 30 May 2025 19:37:23 +0200

author
Mike Becker <universe@uap-core.de>
date
Fri, 30 May 2025 19:37:23 +0200
changeset 130
c3fce2a543ee
parent 125
0a8747b02df8
permissions
-rw-r--r--

add 2D affine transformations

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__
125
0a8747b02df8 remove GCC attributes which are rarely helpful - resolves #663
Mike Becker <universe@uap-core.de>
parents: 105
diff changeset
38 #define ASC_TRANFORM_FUNC __attribute__((__always_inline__)) static inline
32
86468a71dd73 add transformation matrix
Mike Becker <universe@uap-core.de>
parents:
diff changeset
39 #else
125
0a8747b02df8 remove GCC attributes which are rarely helpful - resolves #663
Mike Becker <universe@uap-core.de>
parents: 105
diff changeset
40 #define ASC_TRANFORM_FUNC static inline
32
86468a71dd73 add transformation matrix
Mike Becker <universe@uap-core.de>
parents:
diff changeset
41 #endif
86468a71dd73 add transformation matrix
Mike Becker <universe@uap-core.de>
parents:
diff changeset
42
86468a71dd73 add transformation matrix
Mike Becker <universe@uap-core.de>
parents:
diff changeset
43
86468a71dd73 add transformation matrix
Mike Becker <universe@uap-core.de>
parents:
diff changeset
44 ASC_TRANFORM_FUNC void asc_transform_identity(asc_transform transform) {
86468a71dd73 add transformation matrix
Mike Becker <universe@uap-core.de>
parents:
diff changeset
45 memset(transform, 0, ASC_TRANSFORM_SIZE);
86468a71dd73 add transformation matrix
Mike Becker <universe@uap-core.de>
parents:
diff changeset
46 transform[asc_mat4_index(0, 0)] = 1;
86468a71dd73 add transformation matrix
Mike Becker <universe@uap-core.de>
parents:
diff changeset
47 transform[asc_mat4_index(1, 1)] = 1;
86468a71dd73 add transformation matrix
Mike Becker <universe@uap-core.de>
parents:
diff changeset
48 transform[asc_mat4_index(2, 2)] = 1;
86468a71dd73 add transformation matrix
Mike Becker <universe@uap-core.de>
parents:
diff changeset
49 transform[asc_mat4_index(3, 3)] = 1;
86468a71dd73 add transformation matrix
Mike Becker <universe@uap-core.de>
parents:
diff changeset
50 }
86468a71dd73 add transformation matrix
Mike Becker <universe@uap-core.de>
parents:
diff changeset
51
86468a71dd73 add transformation matrix
Mike Becker <universe@uap-core.de>
parents:
diff changeset
52 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
53 memcpy(dest, src, ASC_TRANSFORM_SIZE);
86468a71dd73 add transformation matrix
Mike Becker <universe@uap-core.de>
parents:
diff changeset
54 }
86468a71dd73 add transformation matrix
Mike Becker <universe@uap-core.de>
parents:
diff changeset
55
130
c3fce2a543ee add 2D affine transformations
Mike Becker <universe@uap-core.de>
parents: 125
diff changeset
56 ASC_TRANFORM_FUNC void asc_transform_translate3f(
32
86468a71dd73 add transformation matrix
Mike Becker <universe@uap-core.de>
parents:
diff changeset
57 asc_transform transform,
45
18de2af03531 simplify how transforms work
Mike Becker <universe@uap-core.de>
parents: 32
diff changeset
58 asc_vec3f vec
32
86468a71dd73 add transformation matrix
Mike Becker <universe@uap-core.de>
parents:
diff changeset
59 ) {
45
18de2af03531 simplify how transforms work
Mike Becker <universe@uap-core.de>
parents: 32
diff changeset
60 transform[asc_mat4_index(3, 0)] += vec.x;
18de2af03531 simplify how transforms work
Mike Becker <universe@uap-core.de>
parents: 32
diff changeset
61 transform[asc_mat4_index(3, 1)] += vec.y;
18de2af03531 simplify how transforms work
Mike Becker <universe@uap-core.de>
parents: 32
diff changeset
62 transform[asc_mat4_index(3, 2)] += vec.z;
32
86468a71dd73 add transformation matrix
Mike Becker <universe@uap-core.de>
parents:
diff changeset
63 }
86468a71dd73 add transformation matrix
Mike Becker <universe@uap-core.de>
parents:
diff changeset
64
130
c3fce2a543ee add 2D affine transformations
Mike Becker <universe@uap-core.de>
parents: 125
diff changeset
65 ASC_TRANFORM_FUNC void asc_transform_scale3f(
32
86468a71dd73 add transformation matrix
Mike Becker <universe@uap-core.de>
parents:
diff changeset
66 asc_transform transform,
45
18de2af03531 simplify how transforms work
Mike Becker <universe@uap-core.de>
parents: 32
diff changeset
67 asc_vec3f vec
32
86468a71dd73 add transformation matrix
Mike Becker <universe@uap-core.de>
parents:
diff changeset
68 ) {
86468a71dd73 add transformation matrix
Mike Becker <universe@uap-core.de>
parents:
diff changeset
69 for (unsigned i = 0 ; i < 3 ; i++) {
45
18de2af03531 simplify how transforms work
Mike Becker <universe@uap-core.de>
parents: 32
diff changeset
70 transform[asc_mat4_index(0, i)] *= vec.width;
18de2af03531 simplify how transforms work
Mike Becker <universe@uap-core.de>
parents: 32
diff changeset
71 transform[asc_mat4_index(1, i)] *= vec.height;
18de2af03531 simplify how transforms work
Mike Becker <universe@uap-core.de>
parents: 32
diff changeset
72 transform[asc_mat4_index(2, i)] *= vec.depth;
32
86468a71dd73 add transformation matrix
Mike Becker <universe@uap-core.de>
parents:
diff changeset
73 }
86468a71dd73 add transformation matrix
Mike Becker <universe@uap-core.de>
parents:
diff changeset
74 }
86468a71dd73 add transformation matrix
Mike Becker <universe@uap-core.de>
parents:
diff changeset
75
130
c3fce2a543ee add 2D affine transformations
Mike Becker <universe@uap-core.de>
parents: 125
diff changeset
76 ASC_TRANFORM_FUNC void asc_transform_rotate_euler3f(
105
2b7f92ff2c15 improve datatypes
Mike Becker <universe@uap-core.de>
parents: 45
diff changeset
77 __attribute__((__unused__)) asc_transform transform,
2b7f92ff2c15 improve datatypes
Mike Becker <universe@uap-core.de>
parents: 45
diff changeset
78 __attribute__((__unused__)) asc_vec3f vec
32
86468a71dd73 add transformation matrix
Mike Becker <universe@uap-core.de>
parents:
diff changeset
79 ) {
45
18de2af03531 simplify how transforms work
Mike Becker <universe@uap-core.de>
parents: 32
diff changeset
80 // TODO: implement
18de2af03531 simplify how transforms work
Mike Becker <universe@uap-core.de>
parents: 32
diff changeset
81 }
18de2af03531 simplify how transforms work
Mike Becker <universe@uap-core.de>
parents: 32
diff changeset
82
130
c3fce2a543ee add 2D affine transformations
Mike Becker <universe@uap-core.de>
parents: 125
diff changeset
83 ASC_TRANFORM_FUNC void asc_transform_from_vec3f(
45
18de2af03531 simplify how transforms work
Mike Becker <universe@uap-core.de>
parents: 32
diff changeset
84 asc_transform transform,
18de2af03531 simplify how transforms work
Mike Becker <universe@uap-core.de>
parents: 32
diff changeset
85 asc_vec3f position,
18de2af03531 simplify how transforms work
Mike Becker <universe@uap-core.de>
parents: 32
diff changeset
86 asc_vec3f scale,
18de2af03531 simplify how transforms work
Mike Becker <universe@uap-core.de>
parents: 32
diff changeset
87 asc_vec3f rotation
18de2af03531 simplify how transforms work
Mike Becker <universe@uap-core.de>
parents: 32
diff changeset
88 ) {
18de2af03531 simplify how transforms work
Mike Becker <universe@uap-core.de>
parents: 32
diff changeset
89 asc_transform_identity(transform);
130
c3fce2a543ee add 2D affine transformations
Mike Becker <universe@uap-core.de>
parents: 125
diff changeset
90 asc_transform_scale3f(transform, scale);
c3fce2a543ee add 2D affine transformations
Mike Becker <universe@uap-core.de>
parents: 125
diff changeset
91 asc_transform_translate3f(transform, position);
c3fce2a543ee add 2D affine transformations
Mike Becker <universe@uap-core.de>
parents: 125
diff changeset
92 asc_transform_rotate_euler3f(transform, rotation);
c3fce2a543ee add 2D affine transformations
Mike Becker <universe@uap-core.de>
parents: 125
diff changeset
93 }
c3fce2a543ee add 2D affine transformations
Mike Becker <universe@uap-core.de>
parents: 125
diff changeset
94
c3fce2a543ee add 2D affine transformations
Mike Becker <universe@uap-core.de>
parents: 125
diff changeset
95 ASC_TRANFORM_FUNC void asc_transform_translate2f(
c3fce2a543ee add 2D affine transformations
Mike Becker <universe@uap-core.de>
parents: 125
diff changeset
96 asc_transform transform,
c3fce2a543ee add 2D affine transformations
Mike Becker <universe@uap-core.de>
parents: 125
diff changeset
97 asc_vec2f vec
c3fce2a543ee add 2D affine transformations
Mike Becker <universe@uap-core.de>
parents: 125
diff changeset
98 ) {
c3fce2a543ee add 2D affine transformations
Mike Becker <universe@uap-core.de>
parents: 125
diff changeset
99 transform[asc_mat4_index(3, 0)] += vec.x;
c3fce2a543ee add 2D affine transformations
Mike Becker <universe@uap-core.de>
parents: 125
diff changeset
100 transform[asc_mat4_index(3, 1)] += vec.y;
c3fce2a543ee add 2D affine transformations
Mike Becker <universe@uap-core.de>
parents: 125
diff changeset
101 }
c3fce2a543ee add 2D affine transformations
Mike Becker <universe@uap-core.de>
parents: 125
diff changeset
102
c3fce2a543ee add 2D affine transformations
Mike Becker <universe@uap-core.de>
parents: 125
diff changeset
103 ASC_TRANFORM_FUNC void asc_transform_scale2f(
c3fce2a543ee add 2D affine transformations
Mike Becker <universe@uap-core.de>
parents: 125
diff changeset
104 asc_transform transform,
c3fce2a543ee add 2D affine transformations
Mike Becker <universe@uap-core.de>
parents: 125
diff changeset
105 asc_vec2f vec
c3fce2a543ee add 2D affine transformations
Mike Becker <universe@uap-core.de>
parents: 125
diff changeset
106 ) {
c3fce2a543ee add 2D affine transformations
Mike Becker <universe@uap-core.de>
parents: 125
diff changeset
107 for (unsigned i = 0 ; i < 3 ; i++) {
c3fce2a543ee add 2D affine transformations
Mike Becker <universe@uap-core.de>
parents: 125
diff changeset
108 transform[asc_mat4_index(0, i)] *= vec.width;
c3fce2a543ee add 2D affine transformations
Mike Becker <universe@uap-core.de>
parents: 125
diff changeset
109 transform[asc_mat4_index(1, i)] *= vec.height;
c3fce2a543ee add 2D affine transformations
Mike Becker <universe@uap-core.de>
parents: 125
diff changeset
110 }
c3fce2a543ee add 2D affine transformations
Mike Becker <universe@uap-core.de>
parents: 125
diff changeset
111 }
c3fce2a543ee add 2D affine transformations
Mike Becker <universe@uap-core.de>
parents: 125
diff changeset
112
c3fce2a543ee add 2D affine transformations
Mike Becker <universe@uap-core.de>
parents: 125
diff changeset
113 ASC_TRANFORM_FUNC void asc_transform_rotate_euler2f(
c3fce2a543ee add 2D affine transformations
Mike Becker <universe@uap-core.de>
parents: 125
diff changeset
114 __attribute__((__unused__)) asc_transform transform,
c3fce2a543ee add 2D affine transformations
Mike Becker <universe@uap-core.de>
parents: 125
diff changeset
115 __attribute__((__unused__)) asc_vec2f vec
c3fce2a543ee add 2D affine transformations
Mike Becker <universe@uap-core.de>
parents: 125
diff changeset
116 ) {
c3fce2a543ee add 2D affine transformations
Mike Becker <universe@uap-core.de>
parents: 125
diff changeset
117 // TODO: implement
c3fce2a543ee add 2D affine transformations
Mike Becker <universe@uap-core.de>
parents: 125
diff changeset
118 }
c3fce2a543ee add 2D affine transformations
Mike Becker <universe@uap-core.de>
parents: 125
diff changeset
119
c3fce2a543ee add 2D affine transformations
Mike Becker <universe@uap-core.de>
parents: 125
diff changeset
120 ASC_TRANFORM_FUNC void asc_transform_from_vec2f(
c3fce2a543ee add 2D affine transformations
Mike Becker <universe@uap-core.de>
parents: 125
diff changeset
121 asc_transform transform,
c3fce2a543ee add 2D affine transformations
Mike Becker <universe@uap-core.de>
parents: 125
diff changeset
122 asc_vec2f position,
c3fce2a543ee add 2D affine transformations
Mike Becker <universe@uap-core.de>
parents: 125
diff changeset
123 asc_vec2f scale,
c3fce2a543ee add 2D affine transformations
Mike Becker <universe@uap-core.de>
parents: 125
diff changeset
124 asc_vec2f rotation
c3fce2a543ee add 2D affine transformations
Mike Becker <universe@uap-core.de>
parents: 125
diff changeset
125 ) {
c3fce2a543ee add 2D affine transformations
Mike Becker <universe@uap-core.de>
parents: 125
diff changeset
126 asc_transform_identity(transform);
c3fce2a543ee add 2D affine transformations
Mike Becker <universe@uap-core.de>
parents: 125
diff changeset
127 asc_transform_scale2f(transform, scale);
c3fce2a543ee add 2D affine transformations
Mike Becker <universe@uap-core.de>
parents: 125
diff changeset
128 asc_transform_translate2f(transform, position);
c3fce2a543ee add 2D affine transformations
Mike Becker <universe@uap-core.de>
parents: 125
diff changeset
129 asc_transform_rotate_euler2f(transform, rotation);
32
86468a71dd73 add transformation matrix
Mike Becker <universe@uap-core.de>
parents:
diff changeset
130 }
86468a71dd73 add transformation matrix
Mike Becker <universe@uap-core.de>
parents:
diff changeset
131
86468a71dd73 add transformation matrix
Mike Becker <universe@uap-core.de>
parents:
diff changeset
132 #endif //ASCENSION_TRANSFORM_H

mercurial