src/ascension/datatypes.h

Wed, 15 Nov 2023 22:51:40 +0100

author
Mike Becker <universe@uap-core.de>
date
Wed, 15 Nov 2023 22:51:40 +0100
changeset 16
c5dde81b6fb2
parent 14
9dbfc0031887
child 19
d0e88022e209
permissions
-rw-r--r--

add text rendering and demo FPS counter

3
1efd6da2ad53 add datatypes.h
Mike Becker <universe@uap-core.de>
parents:
diff changeset
1 /*
1efd6da2ad53 add datatypes.h
Mike Becker <universe@uap-core.de>
parents:
diff changeset
2 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
1efd6da2ad53 add datatypes.h
Mike Becker <universe@uap-core.de>
parents:
diff changeset
3 * Copyright 2023 Mike Becker. All rights reserved.
1efd6da2ad53 add datatypes.h
Mike Becker <universe@uap-core.de>
parents:
diff changeset
4 *
1efd6da2ad53 add datatypes.h
Mike Becker <universe@uap-core.de>
parents:
diff changeset
5 * Redistribution and use in source and binary forms, with or without
1efd6da2ad53 add datatypes.h
Mike Becker <universe@uap-core.de>
parents:
diff changeset
6 * modification, are permitted provided that the following conditions are met:
1efd6da2ad53 add datatypes.h
Mike Becker <universe@uap-core.de>
parents:
diff changeset
7 *
1efd6da2ad53 add datatypes.h
Mike Becker <universe@uap-core.de>
parents:
diff changeset
8 * 1. Redistributions of source code must retain the above copyright
1efd6da2ad53 add datatypes.h
Mike Becker <universe@uap-core.de>
parents:
diff changeset
9 * notice, this list of conditions and the following disclaimer.
1efd6da2ad53 add datatypes.h
Mike Becker <universe@uap-core.de>
parents:
diff changeset
10 *
1efd6da2ad53 add datatypes.h
Mike Becker <universe@uap-core.de>
parents:
diff changeset
11 * 2. Redistributions in binary form must reproduce the above copyright
1efd6da2ad53 add datatypes.h
Mike Becker <universe@uap-core.de>
parents:
diff changeset
12 * notice, this list of conditions and the following disclaimer in the
1efd6da2ad53 add datatypes.h
Mike Becker <universe@uap-core.de>
parents:
diff changeset
13 * documentation and/or other materials provided with the distribution.
1efd6da2ad53 add datatypes.h
Mike Becker <universe@uap-core.de>
parents:
diff changeset
14 *
1efd6da2ad53 add datatypes.h
Mike Becker <universe@uap-core.de>
parents:
diff changeset
15 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
1efd6da2ad53 add datatypes.h
Mike Becker <universe@uap-core.de>
parents:
diff changeset
16 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
1efd6da2ad53 add datatypes.h
Mike Becker <universe@uap-core.de>
parents:
diff changeset
17 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
1efd6da2ad53 add datatypes.h
Mike Becker <universe@uap-core.de>
parents:
diff changeset
18 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
1efd6da2ad53 add datatypes.h
Mike Becker <universe@uap-core.de>
parents:
diff changeset
19 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
1efd6da2ad53 add datatypes.h
Mike Becker <universe@uap-core.de>
parents:
diff changeset
20 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
1efd6da2ad53 add datatypes.h
Mike Becker <universe@uap-core.de>
parents:
diff changeset
21 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
1efd6da2ad53 add datatypes.h
Mike Becker <universe@uap-core.de>
parents:
diff changeset
22 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
1efd6da2ad53 add datatypes.h
Mike Becker <universe@uap-core.de>
parents:
diff changeset
23 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
1efd6da2ad53 add datatypes.h
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
1efd6da2ad53 add datatypes.h
Mike Becker <universe@uap-core.de>
parents:
diff changeset
25 * POSSIBILITY OF SUCH DAMAGE.
1efd6da2ad53 add datatypes.h
Mike Becker <universe@uap-core.de>
parents:
diff changeset
26 */
1efd6da2ad53 add datatypes.h
Mike Becker <universe@uap-core.de>
parents:
diff changeset
27
1efd6da2ad53 add datatypes.h
Mike Becker <universe@uap-core.de>
parents:
diff changeset
28 #ifndef ASCENSION_DATATYPES_H
1efd6da2ad53 add datatypes.h
Mike Becker <universe@uap-core.de>
parents:
diff changeset
29 #define ASCENSION_DATATYPES_H
1efd6da2ad53 add datatypes.h
Mike Becker <universe@uap-core.de>
parents:
diff changeset
30
14
9dbfc0031887 remove C++ support
Mike Becker <universe@uap-core.de>
parents: 12
diff changeset
31 #ifdef __cplusplus
9dbfc0031887 remove C++ support
Mike Becker <universe@uap-core.de>
parents: 12
diff changeset
32 #error You cannot ascend using C++
9dbfc0031887 remove C++ support
Mike Becker <universe@uap-core.de>
parents: 12
diff changeset
33 #endif
9dbfc0031887 remove C++ support
Mike Becker <universe@uap-core.de>
parents: 12
diff changeset
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
7e1196d551ff give unions names
Mike Becker <universe@uap-core.de>
parents: 4
diff changeset
45 typedef union asc_vec2i {
3
1efd6da2ad53 add datatypes.h
Mike Becker <universe@uap-core.de>
parents:
diff changeset
46 int data[2];
1efd6da2ad53 add datatypes.h
Mike Becker <universe@uap-core.de>
parents:
diff changeset
47 struct { int x, y; };
1efd6da2ad53 add datatypes.h
Mike Becker <universe@uap-core.de>
parents:
diff changeset
48 struct { int width, height; };
1efd6da2ad53 add datatypes.h
Mike Becker <universe@uap-core.de>
parents:
diff changeset
49 } asc_vec2i;
1efd6da2ad53 add datatypes.h
Mike Becker <universe@uap-core.de>
parents:
diff changeset
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
1efd6da2ad53 add datatypes.h
Mike Becker <universe@uap-core.de>
parents:
diff changeset
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
1efd6da2ad53 add datatypes.h
Mike Becker <universe@uap-core.de>
parents:
diff changeset
128 #endif //ASCENSION_DATATYPES_H

mercurial