Wed, 15 Nov 2023 22:51:40 +0100
add text rendering and demo FPS counter
3 | 1 | /* |
2 | * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. | |
3 | * Copyright 2023 Mike Becker. All rights reserved. | |
4 | * | |
5 | * Redistribution and use in source and binary forms, with or without | |
6 | * modification, are permitted provided that the following conditions are met: | |
7 | * | |
8 | * 1. Redistributions of source code must retain the above copyright | |
9 | * notice, this list of conditions and the following disclaimer. | |
10 | * | |
11 | * 2. Redistributions in binary form must reproduce the above copyright | |
12 | * notice, this list of conditions and the following disclaimer in the | |
13 | * documentation and/or other materials provided with the distribution. | |
14 | * | |
15 | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | |
16 | * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | |
17 | * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | |
18 | * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE | |
19 | * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | |
20 | * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | |
21 | * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS | |
22 | * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN | |
23 | * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | |
24 | * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | |
25 | * POSSIBILITY OF SUCH DAMAGE. | |
26 | */ | |
27 | ||
28 | #ifndef ASCENSION_DATATYPES_H | |
29 | #define ASCENSION_DATATYPES_H | |
30 | ||
14 | 31 | #ifdef __cplusplus |
32 | #error You cannot ascend using C++ | |
33 | #endif | |
34 | ||
6
302971e8599b
move window related stuff to its own unit
Mike Becker <universe@uap-core.de>
parents:
5
diff
changeset
|
35 | #include <stdbool.h> |
16
c5dde81b6fb2
add text rendering and demo FPS counter
Mike Becker <universe@uap-core.de>
parents:
14
diff
changeset
|
36 | #include <string.h> |
4
b7acda6a4476
add simple color data types
Mike Becker <universe@uap-core.de>
parents:
3
diff
changeset
|
37 | |
12
d89e0ebc76d2
add projection matrix to AscWindow
Mike Becker <universe@uap-core.de>
parents:
6
diff
changeset
|
38 | // -------------------------------------------------------------------------- |
d89e0ebc76d2
add projection matrix to AscWindow
Mike Becker <universe@uap-core.de>
parents:
6
diff
changeset
|
39 | // Datatype Definitions |
d89e0ebc76d2
add projection matrix to AscWindow
Mike Becker <universe@uap-core.de>
parents:
6
diff
changeset
|
40 | // -------------------------------------------------------------------------- |
d89e0ebc76d2
add projection matrix to AscWindow
Mike Becker <universe@uap-core.de>
parents:
6
diff
changeset
|
41 | |
4
b7acda6a4476
add simple color data types
Mike Becker <universe@uap-core.de>
parents:
3
diff
changeset
|
42 | typedef unsigned char asc_ubyte; |
b7acda6a4476
add simple color data types
Mike Becker <universe@uap-core.de>
parents:
3
diff
changeset
|
43 | typedef signed char asc_sbyte; |
b7acda6a4476
add simple color data types
Mike Becker <universe@uap-core.de>
parents:
3
diff
changeset
|
44 | |
5 | 45 | typedef union asc_vec2i { |
3 | 46 | int data[2]; |
47 | struct { int x, y; }; | |
48 | struct { int width, height; }; | |
49 | } asc_vec2i; | |
50 | ||
16
c5dde81b6fb2
add text rendering and demo FPS counter
Mike Becker <universe@uap-core.de>
parents:
14
diff
changeset
|
51 | typedef struct asc_col4i { |
c5dde81b6fb2
add text rendering and demo FPS counter
Mike Becker <universe@uap-core.de>
parents:
14
diff
changeset
|
52 | asc_ubyte red, green, blue, alpha; |
4
b7acda6a4476
add simple color data types
Mike Becker <universe@uap-core.de>
parents:
3
diff
changeset
|
53 | } asc_col4i; |
b7acda6a4476
add simple color data types
Mike Becker <universe@uap-core.de>
parents:
3
diff
changeset
|
54 | |
16
c5dde81b6fb2
add text rendering and demo FPS counter
Mike Becker <universe@uap-core.de>
parents:
14
diff
changeset
|
55 | typedef struct asc_col4f { |
c5dde81b6fb2
add text rendering and demo FPS counter
Mike Becker <universe@uap-core.de>
parents:
14
diff
changeset
|
56 | float red, green, blue, alpha; |
4
b7acda6a4476
add simple color data types
Mike Becker <universe@uap-core.de>
parents:
3
diff
changeset
|
57 | } asc_col4f; |
b7acda6a4476
add simple color data types
Mike Becker <universe@uap-core.de>
parents:
3
diff
changeset
|
58 | |
16
c5dde81b6fb2
add text rendering and demo FPS counter
Mike Becker <universe@uap-core.de>
parents:
14
diff
changeset
|
59 | typedef float asc_mat4f[16]; |
12
d89e0ebc76d2
add projection matrix to AscWindow
Mike Becker <universe@uap-core.de>
parents:
6
diff
changeset
|
60 | |
d89e0ebc76d2
add projection matrix to AscWindow
Mike Becker <universe@uap-core.de>
parents:
6
diff
changeset
|
61 | // -------------------------------------------------------------------------- |
d89e0ebc76d2
add projection matrix to AscWindow
Mike Becker <universe@uap-core.de>
parents:
6
diff
changeset
|
62 | // General Utility Functions |
d89e0ebc76d2
add projection matrix to AscWindow
Mike Becker <universe@uap-core.de>
parents:
6
diff
changeset
|
63 | // -------------------------------------------------------------------------- |
d89e0ebc76d2
add projection matrix to AscWindow
Mike Becker <universe@uap-core.de>
parents:
6
diff
changeset
|
64 | |
4
b7acda6a4476
add simple color data types
Mike Becker <universe@uap-core.de>
parents:
3
diff
changeset
|
65 | static inline int asc_clamp_i(int v, int min, int max) { |
b7acda6a4476
add simple color data types
Mike Becker <universe@uap-core.de>
parents:
3
diff
changeset
|
66 | if (v < min) return min; |
b7acda6a4476
add simple color data types
Mike Becker <universe@uap-core.de>
parents:
3
diff
changeset
|
67 | if (v > max) return max; |
b7acda6a4476
add simple color data types
Mike Becker <universe@uap-core.de>
parents:
3
diff
changeset
|
68 | return v; |
b7acda6a4476
add simple color data types
Mike Becker <universe@uap-core.de>
parents:
3
diff
changeset
|
69 | } |
b7acda6a4476
add simple color data types
Mike Becker <universe@uap-core.de>
parents:
3
diff
changeset
|
70 | |
b7acda6a4476
add simple color data types
Mike Becker <universe@uap-core.de>
parents:
3
diff
changeset
|
71 | /** |
b7acda6a4476
add simple color data types
Mike Becker <universe@uap-core.de>
parents:
3
diff
changeset
|
72 | * Converts a float color (0.0f to 1.0f) to an int color (0 to 255). |
b7acda6a4476
add simple color data types
Mike Becker <universe@uap-core.de>
parents:
3
diff
changeset
|
73 | * |
b7acda6a4476
add simple color data types
Mike Becker <universe@uap-core.de>
parents:
3
diff
changeset
|
74 | * This operation is quite expensive. When you need to use it often, it's |
b7acda6a4476
add simple color data types
Mike Becker <universe@uap-core.de>
parents:
3
diff
changeset
|
75 | * quite obvious that you should change the data type. |
b7acda6a4476
add simple color data types
Mike Becker <universe@uap-core.de>
parents:
3
diff
changeset
|
76 | * |
b7acda6a4476
add simple color data types
Mike Becker <universe@uap-core.de>
parents:
3
diff
changeset
|
77 | * @param c the color using floats |
b7acda6a4476
add simple color data types
Mike Becker <universe@uap-core.de>
parents:
3
diff
changeset
|
78 | * @return the same color using ints |
b7acda6a4476
add simple color data types
Mike Becker <universe@uap-core.de>
parents:
3
diff
changeset
|
79 | */ |
b7acda6a4476
add simple color data types
Mike Becker <universe@uap-core.de>
parents:
3
diff
changeset
|
80 | static inline asc_col4i asc_col_ftoi(asc_col4f c) { |
b7acda6a4476
add simple color data types
Mike Becker <universe@uap-core.de>
parents:
3
diff
changeset
|
81 | int red = (int)(255*c.red); |
b7acda6a4476
add simple color data types
Mike Becker <universe@uap-core.de>
parents:
3
diff
changeset
|
82 | int green = (int)(255*c.green); |
b7acda6a4476
add simple color data types
Mike Becker <universe@uap-core.de>
parents:
3
diff
changeset
|
83 | int blue = (int)(255*c.blue); |
b7acda6a4476
add simple color data types
Mike Becker <universe@uap-core.de>
parents:
3
diff
changeset
|
84 | int alpha = (int)(255*c.alpha); |
b7acda6a4476
add simple color data types
Mike Becker <universe@uap-core.de>
parents:
3
diff
changeset
|
85 | asc_col4i r; |
b7acda6a4476
add simple color data types
Mike Becker <universe@uap-core.de>
parents:
3
diff
changeset
|
86 | r.red = (asc_ubyte)asc_clamp_i(red, 0, 255); |
b7acda6a4476
add simple color data types
Mike Becker <universe@uap-core.de>
parents:
3
diff
changeset
|
87 | r.green = (asc_ubyte)asc_clamp_i(green, 0, 255); |
b7acda6a4476
add simple color data types
Mike Becker <universe@uap-core.de>
parents:
3
diff
changeset
|
88 | r.blue = (asc_ubyte)asc_clamp_i(blue, 0, 255); |
b7acda6a4476
add simple color data types
Mike Becker <universe@uap-core.de>
parents:
3
diff
changeset
|
89 | r.alpha = (asc_ubyte)asc_clamp_i(alpha, 0, 255); |
b7acda6a4476
add simple color data types
Mike Becker <universe@uap-core.de>
parents:
3
diff
changeset
|
90 | return r; |
b7acda6a4476
add simple color data types
Mike Becker <universe@uap-core.de>
parents:
3
diff
changeset
|
91 | } |
3 | 92 | |
12
d89e0ebc76d2
add projection matrix to AscWindow
Mike Becker <universe@uap-core.de>
parents:
6
diff
changeset
|
93 | // -------------------------------------------------------------------------- |
d89e0ebc76d2
add projection matrix to AscWindow
Mike Becker <universe@uap-core.de>
parents:
6
diff
changeset
|
94 | // Matrix Functions |
d89e0ebc76d2
add projection matrix to AscWindow
Mike Becker <universe@uap-core.de>
parents:
6
diff
changeset
|
95 | // -------------------------------------------------------------------------- |
d89e0ebc76d2
add projection matrix to AscWindow
Mike Becker <universe@uap-core.de>
parents:
6
diff
changeset
|
96 | |
16
c5dde81b6fb2
add text rendering and demo FPS counter
Mike Becker <universe@uap-core.de>
parents:
14
diff
changeset
|
97 | /** |
c5dde81b6fb2
add text rendering and demo FPS counter
Mike Becker <universe@uap-core.de>
parents:
14
diff
changeset
|
98 | * Computes a matrix index in column-major order. |
c5dde81b6fb2
add text rendering and demo FPS counter
Mike Becker <universe@uap-core.de>
parents:
14
diff
changeset
|
99 | * @param col the column |
c5dde81b6fb2
add text rendering and demo FPS counter
Mike Becker <universe@uap-core.de>
parents:
14
diff
changeset
|
100 | * @param row the row |
c5dde81b6fb2
add text rendering and demo FPS counter
Mike Becker <universe@uap-core.de>
parents:
14
diff
changeset
|
101 | * @param rows the number of rows |
c5dde81b6fb2
add text rendering and demo FPS counter
Mike Becker <universe@uap-core.de>
parents:
14
diff
changeset
|
102 | */ |
c5dde81b6fb2
add text rendering and demo FPS counter
Mike Becker <universe@uap-core.de>
parents:
14
diff
changeset
|
103 | #define asc_mat_index(col, row, rows) ((row) + (col) * (rows)) |
c5dde81b6fb2
add text rendering and demo FPS counter
Mike Becker <universe@uap-core.de>
parents:
14
diff
changeset
|
104 | |
c5dde81b6fb2
add text rendering and demo FPS counter
Mike Becker <universe@uap-core.de>
parents:
14
diff
changeset
|
105 | /** |
c5dde81b6fb2
add text rendering and demo FPS counter
Mike Becker <universe@uap-core.de>
parents:
14
diff
changeset
|
106 | * Computes a 4x4 matrix index in column-major order. |
c5dde81b6fb2
add text rendering and demo FPS counter
Mike Becker <universe@uap-core.de>
parents:
14
diff
changeset
|
107 | * @param col the column |
c5dde81b6fb2
add text rendering and demo FPS counter
Mike Becker <universe@uap-core.de>
parents:
14
diff
changeset
|
108 | * @param row the row |
c5dde81b6fb2
add text rendering and demo FPS counter
Mike Becker <universe@uap-core.de>
parents:
14
diff
changeset
|
109 | */ |
c5dde81b6fb2
add text rendering and demo FPS counter
Mike Becker <universe@uap-core.de>
parents:
14
diff
changeset
|
110 | #define asc_mat4_index(col, row) asc_mat_index(col, row, 4) |
c5dde81b6fb2
add text rendering and demo FPS counter
Mike Becker <universe@uap-core.de>
parents:
14
diff
changeset
|
111 | |
12
d89e0ebc76d2
add projection matrix to AscWindow
Mike Becker <universe@uap-core.de>
parents:
6
diff
changeset
|
112 | static inline void asc_mat4f_ortho( |
d89e0ebc76d2
add projection matrix to AscWindow
Mike Becker <universe@uap-core.de>
parents:
6
diff
changeset
|
113 | asc_mat4f mat, |
d89e0ebc76d2
add projection matrix to AscWindow
Mike Becker <universe@uap-core.de>
parents:
6
diff
changeset
|
114 | float left, |
d89e0ebc76d2
add projection matrix to AscWindow
Mike Becker <universe@uap-core.de>
parents:
6
diff
changeset
|
115 | float right, |
d89e0ebc76d2
add projection matrix to AscWindow
Mike Becker <universe@uap-core.de>
parents:
6
diff
changeset
|
116 | float bottom, |
d89e0ebc76d2
add projection matrix to AscWindow
Mike Becker <universe@uap-core.de>
parents:
6
diff
changeset
|
117 | float top |
d89e0ebc76d2
add projection matrix to AscWindow
Mike Becker <universe@uap-core.de>
parents:
6
diff
changeset
|
118 | ) { |
d89e0ebc76d2
add projection matrix to AscWindow
Mike Becker <universe@uap-core.de>
parents:
6
diff
changeset
|
119 | memset(mat, 0, sizeof(float) * 16); |
16
c5dde81b6fb2
add text rendering and demo FPS counter
Mike Becker <universe@uap-core.de>
parents:
14
diff
changeset
|
120 | mat[asc_mat4_index(0,0)] = 2.f / (right - left); |
c5dde81b6fb2
add text rendering and demo FPS counter
Mike Becker <universe@uap-core.de>
parents:
14
diff
changeset
|
121 | mat[asc_mat4_index(1,1)] = 2.f / (top - bottom); |
c5dde81b6fb2
add text rendering and demo FPS counter
Mike Becker <universe@uap-core.de>
parents:
14
diff
changeset
|
122 | mat[asc_mat4_index(2,2)] = -1; |
c5dde81b6fb2
add text rendering and demo FPS counter
Mike Becker <universe@uap-core.de>
parents:
14
diff
changeset
|
123 | mat[asc_mat4_index(3,0)] = -(right + left) / (right - left); |
c5dde81b6fb2
add text rendering and demo FPS counter
Mike Becker <universe@uap-core.de>
parents:
14
diff
changeset
|
124 | mat[asc_mat4_index(3,1)] = -(top + bottom) / (top - bottom); |
c5dde81b6fb2
add text rendering and demo FPS counter
Mike Becker <universe@uap-core.de>
parents:
14
diff
changeset
|
125 | mat[asc_mat4_index(3,3)] = 1; |
12
d89e0ebc76d2
add projection matrix to AscWindow
Mike Becker <universe@uap-core.de>
parents:
6
diff
changeset
|
126 | } |
d89e0ebc76d2
add projection matrix to AscWindow
Mike Becker <universe@uap-core.de>
parents:
6
diff
changeset
|
127 | |
3 | 128 | #endif //ASCENSION_DATATYPES_H |