comparison mupdf-source/thirdparty/freeglut/progs/demos/shapes/glmatrix.c @ 2:b50eed0cc0ef upstream

ADD: MuPDF v1.26.7: the MuPDF source as downloaded by a default build of PyMuPDF 1.26.4. The directory name has changed: no version number in the expanded directory now.
author Franz Glasner <fzglas.hg@dom66.de>
date Mon, 15 Sep 2025 11:43:07 +0200
parents
children
comparison
equal deleted inserted replaced
1:1d09e1dec1d9 2:b50eed0cc0ef
1 #include <string.h>
2 #define _USE_MATH_DEFINES
3 #include <math.h>
4 #include "glmatrix.h"
5
6 #ifndef M_PI
7 #define M_PI 3.141592653589793
8 #endif
9
10 #define MMODE_IDX(x) ((x) - GL_MODELVIEW)
11 #define MAT_STACK_SIZE 32
12 #define MAT_IDENT {1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1}
13
14 static int mm_idx = 0;
15 static float mat_stack[3][MAT_STACK_SIZE][16] = {{MAT_IDENT}, {MAT_IDENT}, {MAT_IDENT}};
16 static int stack_top[3];
17
18 void gl_matrix_mode(int mm)
19 {
20 mm_idx = MMODE_IDX(mm);
21 }
22
23 void gl_push_matrix(void)
24 {
25 int top = stack_top[mm_idx];
26
27 memcpy(mat_stack[mm_idx][top + 1], mat_stack[mm_idx][top], 16 * sizeof(float));
28 stack_top[mm_idx]++;
29 }
30
31 void gl_pop_matrix(void)
32 {
33 stack_top[mm_idx]--;
34 }
35
36 void gl_load_identity(void)
37 {
38 static const float idmat[] = MAT_IDENT;
39 int top = stack_top[mm_idx];
40 float *mat = mat_stack[mm_idx][top];
41
42 memcpy(mat, idmat, sizeof idmat);
43 }
44
45 void gl_load_matrixf(const float *m)
46 {
47 int top = stack_top[mm_idx];
48 float *mat = mat_stack[mm_idx][top];
49
50 memcpy(mat, m, 16 * sizeof *mat);
51 }
52
53 #define M4(i, j) ((i << 2) + j)
54
55 void gl_mult_matrixf(const float *m2)
56 {
57 int i, j;
58 int top = stack_top[mm_idx];
59 float *m1 = mat_stack[mm_idx][top];
60 float res[16];
61
62 for(i=0; i<4; i++) {
63 for(j=0; j<4; j++) {
64 res[M4(i,j)] = m1[M4(i,0)] * m2[M4(0,j)] +
65 m1[M4(i,1)] * m2[M4(1,j)] +
66 m1[M4(i,2)] * m2[M4(2,j)] +
67 m1[M4(i,3)] * m2[M4(3,j)];
68 }
69 }
70
71 memcpy(m1, res, sizeof res);
72 }
73
74 void gl_translatef(float x, float y, float z)
75 {
76 float mat[] = MAT_IDENT;
77
78 mat[12] = x;
79 mat[13] = y;
80 mat[14] = z;
81
82 gl_mult_matrixf(mat);
83 }
84
85 void gl_rotatef(float angle, float x, float y, float z)
86 {
87 float mat[] = MAT_IDENT;
88
89 float angle_rad = (float)M_PI * angle / 180.f;
90 float sina = (float)sin(angle_rad);
91 float cosa = (float)cos(angle_rad);
92 float one_minus_cosa = 1.f - cosa;
93 float nxsq = x * x;
94 float nysq = y * y;
95 float nzsq = z * z;
96
97 mat[0] = nxsq + (1.f - nxsq) * cosa;
98 mat[4] = x * y * one_minus_cosa - z * sina;
99 mat[8] = x * z * one_minus_cosa + y * sina;
100 mat[1] = x * y * one_minus_cosa + z * sina;
101 mat[5] = nysq + (1.f - nysq) * cosa;
102 mat[9] = y * z * one_minus_cosa - x * sina;
103 mat[2] = x * z * one_minus_cosa - y * sina;
104 mat[6] = y * z * one_minus_cosa + x * sina;
105 mat[10] = nzsq + (1.f - nzsq) * cosa;
106
107 gl_mult_matrixf(mat);
108 }
109
110 void gl_scalef(float x, float y, float z)
111 {
112 float mat[] = MAT_IDENT;
113
114 mat[0] = x;
115 mat[5] = y;
116 mat[10] = z;
117
118 gl_mult_matrixf(mat);
119 }
120
121 void gl_ortho(float left, float right, float bottom, float top, float znear, float zfar)
122 {
123 float mat[] = MAT_IDENT;
124
125 float dx = right - left;
126 float dy = top - bottom;
127 float dz = zfar - znear;
128
129 float tx = -(right + left) / dx;
130 float ty = -(top + bottom) / dy;
131 float tz = -(zfar + znear) / dz;
132
133 float sx = 2.f / dx;
134 float sy = 2.f / dy;
135 float sz = -2.f / dz;
136
137 mat[0] = sx;
138 mat[5] = sy;
139 mat[10] = sz;
140 mat[12] = tx;
141 mat[13] = ty;
142 mat[14] = tz;
143
144 gl_mult_matrixf(mat);
145 }
146
147 void gl_frustum(float left, float right, float bottom, float top, float znear, float zfar)
148 {
149 float mat[] = MAT_IDENT;
150
151 float dx = right - left;
152 float dy = top - bottom;
153 float dz = zfar - znear;
154
155 float a = (right + left) / dx;
156 float b = (top + bottom) / dy;
157 float c = -(zfar + znear) / dz;
158 float d = -2.f * zfar * znear / dz;
159
160 mat[0] = 2.f * znear / dx;
161 mat[5] = 2.f * znear / dy;
162 mat[8] = a;
163 mat[9] = b;
164 mat[10] = c;
165 mat[11] = -1.f;
166 mat[14] = d;
167 mat[15] = 0;
168
169 gl_mult_matrixf(mat);
170 }
171
172 void glu_perspective(float vfov, float aspect, float znear, float zfar)
173 {
174 float vfov_rad = (float)M_PI * vfov / 180.f;
175 float x = znear * (float)tan(vfov_rad / 2.f);
176 gl_frustum(-aspect * x, aspect * x, -x, x, znear, zfar);
177 }
178
179 /* return the matrix (16 elements, 4x4 matrix, row-major order */
180 float* get_matrix(int mm)
181 {
182 int idx = MMODE_IDX(mm);
183 int top = stack_top[idx];
184 return mat_stack[idx][top];
185 }
186
187
188 #define M3(i, j) ((i * 3) + j)
189 static float inv_transpose_result[9];
190
191 /* return the inverse transpose of the left-upper 3x3 of a matrix
192 The returned pointer is only valid until the next time this function is
193 called, so make a deep copy when you want to keep it around.
194 */
195 float* get_inv_transpose_3x3(int mm)
196 {
197 int idx = MMODE_IDX(mm);
198 int top = stack_top[idx];
199 float *m1 = mat_stack[idx][top];
200
201
202 float determinant = +m1[M4(0,0)]*(m1[M4(1,1)]*m1[M4(2,2)]-m1[M4(2,1)]*m1[M4(1,2)])
203 -m1[M4(0,1)]*(m1[M4(1,0)]*m1[M4(2,2)]-m1[M4(1,2)]*m1[M4(2,0)])
204 +m1[M4(0,2)]*(m1[M4(1,0)]*m1[M4(2,1)]-m1[M4(1,1)]*m1[M4(2,0)]);
205
206 float invdet = 1/determinant;
207
208 inv_transpose_result[M3(0,0)] = (m1[M4(1,1)]*m1[M4(2,2)]-m1[M4(2,1)]*m1[M4(1,2)])*invdet;
209 inv_transpose_result[M3(1,0)] = -(m1[M4(0,1)]*m1[M4(2,2)]-m1[M4(0,2)]*m1[M4(2,1)])*invdet;
210 inv_transpose_result[M3(2,0)] = (m1[M4(0,1)]*m1[M4(1,2)]-m1[M4(0,2)]*m1[M4(1,1)])*invdet;
211 inv_transpose_result[M3(0,1)] = -(m1[M4(1,0)]*m1[M4(2,2)]-m1[M4(1,2)]*m1[M4(2,0)])*invdet;
212 inv_transpose_result[M3(1,1)] = (m1[M4(0,0)]*m1[M4(2,2)]-m1[M4(0,2)]*m1[M4(2,0)])*invdet;
213 inv_transpose_result[M3(2,1)] = -(m1[M4(0,0)]*m1[M4(1,2)]-m1[M4(1,0)]*m1[M4(0,2)])*invdet;
214 inv_transpose_result[M3(0,2)] = (m1[M4(1,0)]*m1[M4(2,1)]-m1[M4(2,0)]*m1[M4(1,1)])*invdet;
215 inv_transpose_result[M3(1,2)] = -(m1[M4(0,0)]*m1[M4(2,1)]-m1[M4(2,0)]*m1[M4(0,1)])*invdet;
216 inv_transpose_result[M3(2,2)] = (m1[M4(0,0)]*m1[M4(1,1)]-m1[M4(1,0)]*m1[M4(0,1)])*invdet;
217
218 return inv_transpose_result;
219 }