@micahdb/tscon 0.0.0-stage → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +44 -2
- package/dist/canvas.d.ts +147 -0
- package/dist/canvas.js +369 -0
- package/dist/colour.d.ts +56 -0
- package/dist/colour.js +77 -0
- package/dist/cp437.d.ts +48 -0
- package/dist/cp437.js +124 -0
- package/dist/glyphs.d.ts +222 -0
- package/dist/glyphs.js +449 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.js +9 -0
- package/dist/math.d.ts +214 -0
- package/dist/math.js +499 -0
- package/dist/moderndos.d.ts +1 -0
- package/dist/moderndos.js +322 -0
- package/dist/program.d.ts +72 -0
- package/dist/program.js +127 -0
- package/dist/rect.d.ts +26 -0
- package/dist/rect.js +1 -0
- package/dist/renderer.d.ts +59 -0
- package/dist/renderer.js +172 -0
- package/dist/shaders.d.ts +5 -0
- package/dist/shaders.js +470 -0
- package/dist/terminal.d.ts +92 -0
- package/dist/terminal.js +275 -0
- package/dist/texture.d.ts +66 -0
- package/dist/texture.js +119 -0
- package/package.json +44 -5
package/dist/math.js
ADDED
|
@@ -0,0 +1,499 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A column-major 4x4 matrix stored as a 16-element `Float32Array`.
|
|
3
|
+
*
|
|
4
|
+
* `Mat4` provides static helpers for creating and operating on 4x4 matrices
|
|
5
|
+
* following the conventions of `gl-matrix`-style libraries: the `o` argument
|
|
6
|
+
* of each operation is the output buffer (which may alias an input) and the
|
|
7
|
+
* same buffer is returned to allow chaining.
|
|
8
|
+
*
|
|
9
|
+
* Matrices are stored column-major; element `m[col * 4 + row]` is row `row`,
|
|
10
|
+
* column `col`.
|
|
11
|
+
*/
|
|
12
|
+
export class Mat4 {
|
|
13
|
+
/**
|
|
14
|
+
* Create and return a new 4x4 identity matrix.
|
|
15
|
+
*
|
|
16
|
+
* @returns A 16-element `Float32Array` initialised to the identity
|
|
17
|
+
* matrix.
|
|
18
|
+
*/
|
|
19
|
+
static create() {
|
|
20
|
+
const o = new Float32Array(16);
|
|
21
|
+
o[0] = 1;
|
|
22
|
+
o[5] = 1;
|
|
23
|
+
o[10] = 1;
|
|
24
|
+
o[15] = 1;
|
|
25
|
+
return o;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Set all 16 components of matrix `o` to the given values, which are
|
|
29
|
+
* supplied in column-major order (`m00, m01, m02, m03, m10, ...`).
|
|
30
|
+
*
|
|
31
|
+
* `o` is returned for convenience.
|
|
32
|
+
*
|
|
33
|
+
* @param o The matrix to write into.
|
|
34
|
+
* @returns The same matrix `o`, with its components overwritten.
|
|
35
|
+
*/
|
|
36
|
+
static set(o, m00, m01, m02, m03, m10, m11, m12, m13, m20, m21, m22, m23, m30, m31, m32, m33) {
|
|
37
|
+
o[0] = m00;
|
|
38
|
+
o[1] = m01;
|
|
39
|
+
o[2] = m02;
|
|
40
|
+
o[3] = m03;
|
|
41
|
+
o[4] = m10;
|
|
42
|
+
o[5] = m11;
|
|
43
|
+
o[6] = m12;
|
|
44
|
+
o[7] = m13;
|
|
45
|
+
o[8] = m20;
|
|
46
|
+
o[9] = m21;
|
|
47
|
+
o[10] = m22;
|
|
48
|
+
o[11] = m23;
|
|
49
|
+
o[12] = m30;
|
|
50
|
+
o[13] = m31;
|
|
51
|
+
o[14] = m32;
|
|
52
|
+
o[15] = m33;
|
|
53
|
+
return o;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Multiply matrices `a` and `b` and store the result in `o`
|
|
57
|
+
* (`o = a * b`).
|
|
58
|
+
*
|
|
59
|
+
* `o` may be the same buffer as `a` or `b`. The result is equivalent to
|
|
60
|
+
* first applying `b` then `a` (i.e. `a * b` in standard column-vector
|
|
61
|
+
* notation), which is the order used for building model/view/projection
|
|
62
|
+
* chains.
|
|
63
|
+
*
|
|
64
|
+
* @param o Output matrix (may alias `a` or `b`).
|
|
65
|
+
* @param a Left-hand matrix.
|
|
66
|
+
* @param b Right-hand matrix.
|
|
67
|
+
* @returns The matrix `o`.
|
|
68
|
+
*/
|
|
69
|
+
static multiply(o, a, b) {
|
|
70
|
+
const a00 = a[0], a01 = a[1], a02 = a[2], a03 = a[3];
|
|
71
|
+
const a10 = a[4], a11 = a[5], a12 = a[6], a13 = a[7];
|
|
72
|
+
const a20 = a[8], a21 = a[9], a22 = a[10], a23 = a[11];
|
|
73
|
+
const a30 = a[12], a31 = a[13], a32 = a[14], a33 = a[15];
|
|
74
|
+
let b0 = b[0], b1 = b[1], b2 = b[2], b3 = b[3];
|
|
75
|
+
o[0] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30;
|
|
76
|
+
o[1] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31;
|
|
77
|
+
o[2] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32;
|
|
78
|
+
o[3] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33;
|
|
79
|
+
b0 = b[4];
|
|
80
|
+
b1 = b[5];
|
|
81
|
+
b2 = b[6];
|
|
82
|
+
b3 = b[7];
|
|
83
|
+
o[4] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30;
|
|
84
|
+
o[5] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31;
|
|
85
|
+
o[6] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32;
|
|
86
|
+
o[7] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33;
|
|
87
|
+
b0 = b[8];
|
|
88
|
+
b1 = b[9];
|
|
89
|
+
b2 = b[10];
|
|
90
|
+
b3 = b[11];
|
|
91
|
+
o[8] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30;
|
|
92
|
+
o[9] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31;
|
|
93
|
+
o[10] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32;
|
|
94
|
+
o[11] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33;
|
|
95
|
+
b0 = b[12];
|
|
96
|
+
b1 = b[13];
|
|
97
|
+
b2 = b[14];
|
|
98
|
+
b3 = b[15];
|
|
99
|
+
o[12] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30;
|
|
100
|
+
o[13] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31;
|
|
101
|
+
o[14] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32;
|
|
102
|
+
o[15] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33;
|
|
103
|
+
return o;
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Set `o` to the transpose of `a`.
|
|
107
|
+
*
|
|
108
|
+
* `o` may be the same buffer as `a`; in that case the transpose is
|
|
109
|
+
* performed in place.
|
|
110
|
+
*
|
|
111
|
+
* @param o Output matrix (may alias `a`).
|
|
112
|
+
* @param a Source matrix.
|
|
113
|
+
* @returns The matrix `o`.
|
|
114
|
+
*/
|
|
115
|
+
static transpose(o, a) {
|
|
116
|
+
if (o === a) {
|
|
117
|
+
// in-place transpose
|
|
118
|
+
const a01 = a[1], a02 = a[2], a03 = a[3];
|
|
119
|
+
const a12 = a[6], a13 = a[7];
|
|
120
|
+
const a23 = a[11];
|
|
121
|
+
o[1] = a[4];
|
|
122
|
+
o[2] = a[8];
|
|
123
|
+
o[3] = a[12];
|
|
124
|
+
o[4] = a01;
|
|
125
|
+
o[6] = a[9];
|
|
126
|
+
o[7] = a[13];
|
|
127
|
+
o[8] = a02;
|
|
128
|
+
o[9] = a12;
|
|
129
|
+
o[11] = a[14];
|
|
130
|
+
o[12] = a03;
|
|
131
|
+
o[13] = a13;
|
|
132
|
+
o[14] = a23;
|
|
133
|
+
}
|
|
134
|
+
else {
|
|
135
|
+
o[0] = a[0];
|
|
136
|
+
o[1] = a[4];
|
|
137
|
+
o[2] = a[8];
|
|
138
|
+
o[3] = a[12];
|
|
139
|
+
o[4] = a[1];
|
|
140
|
+
o[5] = a[5];
|
|
141
|
+
o[6] = a[9];
|
|
142
|
+
o[7] = a[13];
|
|
143
|
+
o[8] = a[2];
|
|
144
|
+
o[9] = a[6];
|
|
145
|
+
o[10] = a[10];
|
|
146
|
+
o[11] = a[14];
|
|
147
|
+
o[12] = a[3];
|
|
148
|
+
o[13] = a[7];
|
|
149
|
+
o[14] = a[11];
|
|
150
|
+
o[15] = a[15];
|
|
151
|
+
}
|
|
152
|
+
return o;
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Set `o` to the inverse of `a`.
|
|
156
|
+
*
|
|
157
|
+
* The determinant is computed internally; if it is zero the resulting
|
|
158
|
+
* matrix is undefined. `o` must not alias `a` (the computation
|
|
159
|
+
* reads `a` while writing `o`).
|
|
160
|
+
*
|
|
161
|
+
* @param o Output matrix (must not alias `a`).
|
|
162
|
+
* @param a Source matrix.
|
|
163
|
+
* @returns The matrix `o`.
|
|
164
|
+
*/
|
|
165
|
+
static inverse(o, a) {
|
|
166
|
+
const a00 = a[0], a01 = a[1], a02 = a[2], a03 = a[3];
|
|
167
|
+
const a10 = a[4], a11 = a[5], a12 = a[6], a13 = a[7];
|
|
168
|
+
const a20 = a[8], a21 = a[9], a22 = a[10], a23 = a[11];
|
|
169
|
+
const a30 = a[12], a31 = a[13], a32 = a[14], a33 = a[15];
|
|
170
|
+
const b00 = a00 * a11 - a01 * a10;
|
|
171
|
+
const b01 = a00 * a12 - a02 * a10;
|
|
172
|
+
const b02 = a00 * a13 - a03 * a10;
|
|
173
|
+
const b03 = a01 * a12 - a02 * a11;
|
|
174
|
+
const b04 = a01 * a13 - a03 * a11;
|
|
175
|
+
const b05 = a02 * a13 - a03 * a12;
|
|
176
|
+
const b06 = a20 * a31 - a21 * a30;
|
|
177
|
+
const b07 = a20 * a32 - a22 * a30;
|
|
178
|
+
const b08 = a20 * a33 - a23 * a30;
|
|
179
|
+
const b09 = a21 * a32 - a22 * a31;
|
|
180
|
+
const b10 = a21 * a33 - a23 * a31;
|
|
181
|
+
const b11 = a22 * a33 - a23 * a32;
|
|
182
|
+
const det = 1.0 /
|
|
183
|
+
(b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 -
|
|
184
|
+
b04 * b07 + b05 * b06);
|
|
185
|
+
o[0] = (a11 * b11 - a12 * b10 + a13 * b09) * det;
|
|
186
|
+
o[1] = (a02 * b10 - a01 * b11 - a03 * b09) * det;
|
|
187
|
+
o[2] = (a31 * b05 - a32 * b04 + a33 * b03) * det;
|
|
188
|
+
o[3] = (a22 * b04 - a21 * b05 - a23 * b03) * det;
|
|
189
|
+
o[4] = (a12 * b08 - a10 * b11 - a13 * b07) * det;
|
|
190
|
+
o[5] = (a00 * b11 - a02 * b08 + a03 * b07) * det;
|
|
191
|
+
o[6] = (a32 * b02 - a30 * b05 - a33 * b01) * det;
|
|
192
|
+
o[7] = (a20 * b05 - a22 * b02 + a23 * b01) * det;
|
|
193
|
+
o[8] = (a10 * b10 - a11 * b08 + a13 * b06) * det;
|
|
194
|
+
o[9] = (a01 * b08 - a00 * b10 - a03 * b06) * det;
|
|
195
|
+
o[10] = (a30 * b04 - a31 * b02 + a33 * b00) * det;
|
|
196
|
+
o[11] = (a21 * b02 - a20 * b04 - a23 * b00) * det;
|
|
197
|
+
o[12] = (a11 * b07 - a10 * b09 - a12 * b06) * det;
|
|
198
|
+
o[13] = (a00 * b09 - a01 * b07 + a02 * b06) * det;
|
|
199
|
+
o[14] = (a31 * b01 - a30 * b03 - a32 * b00) * det;
|
|
200
|
+
o[15] = (a20 * b03 - a21 * b01 + a22 * b00) * det;
|
|
201
|
+
return o;
|
|
202
|
+
}
|
|
203
|
+
/**
|
|
204
|
+
* Compute the upper-left 3x3 inverse-transpose of `a` and write it into
|
|
205
|
+
* the 9-element output `o`.
|
|
206
|
+
*
|
|
207
|
+
* This is the standard "normal matrix" used to transform normals in a
|
|
208
|
+
* lighting shader. `o` must be a `Float32Array` of length 9 and
|
|
209
|
+
* must not alias `a`.
|
|
210
|
+
*
|
|
211
|
+
* @example
|
|
212
|
+
* ```ts
|
|
213
|
+
* import { Mat4 } from "@micahdb/tscon";
|
|
214
|
+
*
|
|
215
|
+
* const mv = Mat4.create();
|
|
216
|
+
* Mat4.multiply(mv, view, model);
|
|
217
|
+
* const normals = new Float32Array(9);
|
|
218
|
+
* Mat4.inverseTranspose3x3(normals, mv);
|
|
219
|
+
* gl.uniformMatrix3fv(loc, false, normals);
|
|
220
|
+
* ```
|
|
221
|
+
*
|
|
222
|
+
* @param o Output 3x3 matrix (length-9 `Float32Array`).
|
|
223
|
+
* @param a Source 4x4 matrix.
|
|
224
|
+
* @returns The matrix `o`.
|
|
225
|
+
*/
|
|
226
|
+
static inverseTranspose3x3(o, a) {
|
|
227
|
+
const a00 = a[0], a01 = a[1], a02 = a[2], a03 = a[3];
|
|
228
|
+
const a10 = a[4], a11 = a[5], a12 = a[6], a13 = a[7];
|
|
229
|
+
const a20 = a[8], a21 = a[9], a22 = a[10], a23 = a[11];
|
|
230
|
+
const a30 = a[12], a31 = a[13], a32 = a[14], a33 = a[15];
|
|
231
|
+
const b00 = a00 * a11 - a01 * a10;
|
|
232
|
+
const b01 = a00 * a12 - a02 * a10;
|
|
233
|
+
const b02 = a00 * a13 - a03 * a10;
|
|
234
|
+
const b03 = a01 * a12 - a02 * a11;
|
|
235
|
+
const b04 = a01 * a13 - a03 * a11;
|
|
236
|
+
const b05 = a02 * a13 - a03 * a12;
|
|
237
|
+
const b06 = a20 * a31 - a21 * a30;
|
|
238
|
+
const b07 = a20 * a32 - a22 * a30;
|
|
239
|
+
const b08 = a20 * a33 - a23 * a30;
|
|
240
|
+
const b09 = a21 * a32 - a22 * a31;
|
|
241
|
+
const b10 = a21 * a33 - a23 * a31;
|
|
242
|
+
const b11 = a22 * a33 - a23 * a32;
|
|
243
|
+
const det = 1.0 /
|
|
244
|
+
(b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 -
|
|
245
|
+
b04 * b07 + b05 * b06);
|
|
246
|
+
o[0] = (a11 * b11 - a12 * b10 + a13 * b09) * det;
|
|
247
|
+
o[1] = (a12 * b08 - a10 * b11 - a13 * b07) * det;
|
|
248
|
+
o[2] = (a10 * b10 - a11 * b08 + a13 * b06) * det;
|
|
249
|
+
o[3] = (a02 * b10 - a01 * b11 - a03 * b09) * det;
|
|
250
|
+
o[4] = (a00 * b11 - a02 * b08 + a03 * b07) * det;
|
|
251
|
+
o[5] = (a01 * b08 - a00 * b10 - a03 * b06) * det;
|
|
252
|
+
o[6] = (a31 * b05 - a32 * b04 + a33 * b03) * det;
|
|
253
|
+
o[7] = (a32 * b02 - a30 * b05 - a33 * b01) * det;
|
|
254
|
+
o[8] = (a30 * b04 - a31 * b02 + a33 * b00) * det;
|
|
255
|
+
return o;
|
|
256
|
+
}
|
|
257
|
+
/**
|
|
258
|
+
* Set `o` to a perspective projection matrix.
|
|
259
|
+
*
|
|
260
|
+
* The matrix maps a view frustum defined by a vertical field of view
|
|
261
|
+
* `fovy` (in radians), the viewport `aspect` ratio (width /
|
|
262
|
+
* height), and the `near` and `far` clip-plane distances into clip
|
|
263
|
+
* space, with the camera looking down -Z.
|
|
264
|
+
*
|
|
265
|
+
* @param o Output matrix.
|
|
266
|
+
* @param fovy Vertical field of view, in radians.
|
|
267
|
+
* @param aspect Width / height of the viewport.
|
|
268
|
+
* @param near Distance to the near clip plane.
|
|
269
|
+
* @param far Distance to the far clip plane.
|
|
270
|
+
* @returns The matrix `o`.
|
|
271
|
+
*/
|
|
272
|
+
static perspective(o, fovy, aspect, near, far) {
|
|
273
|
+
const f = 1.0 / Math.tan(fovy / 2.0);
|
|
274
|
+
o[0] = f / aspect;
|
|
275
|
+
o[1] = 0;
|
|
276
|
+
o[2] = 0;
|
|
277
|
+
o[3] = 0;
|
|
278
|
+
o[4] = 0;
|
|
279
|
+
o[5] = f;
|
|
280
|
+
o[6] = 0;
|
|
281
|
+
o[7] = 0;
|
|
282
|
+
o[8] = 0;
|
|
283
|
+
o[9] = 0;
|
|
284
|
+
o[11] = -1;
|
|
285
|
+
o[12] = 0;
|
|
286
|
+
o[13] = 0;
|
|
287
|
+
o[15] = 0;
|
|
288
|
+
const nf = 1 / (near - far);
|
|
289
|
+
o[10] = (far + near) * nf;
|
|
290
|
+
o[14] = 2 * far * near * nf;
|
|
291
|
+
return o;
|
|
292
|
+
}
|
|
293
|
+
/**
|
|
294
|
+
* Set `o` to an orthographic projection matrix.
|
|
295
|
+
*
|
|
296
|
+
* The matrix maps the axis-aligned box with the given left/right,
|
|
297
|
+
* bottom/top, and near/far planes into clip space.
|
|
298
|
+
*
|
|
299
|
+
* @param o Output matrix.
|
|
300
|
+
* @param left Left edge of the view volume.
|
|
301
|
+
* @param right Right edge of the view volume.
|
|
302
|
+
* @param bottom Bottom edge of the view volume.
|
|
303
|
+
* @param top Top edge of the view volume.
|
|
304
|
+
* @param near Distance to the near clip plane.
|
|
305
|
+
* @param far Distance to the far clip plane.
|
|
306
|
+
* @returns The matrix `o`.
|
|
307
|
+
*/
|
|
308
|
+
static orthographic(o, left, right, bottom, top, near, far) {
|
|
309
|
+
o[0] = 2 / (right - left);
|
|
310
|
+
o[1] = 0;
|
|
311
|
+
o[2] = 0;
|
|
312
|
+
o[3] = 0;
|
|
313
|
+
o[4] = 0;
|
|
314
|
+
o[5] = 2 / (top - bottom);
|
|
315
|
+
o[6] = 0;
|
|
316
|
+
o[7] = 0;
|
|
317
|
+
o[8] = 0;
|
|
318
|
+
o[9] = 0;
|
|
319
|
+
o[10] = -2 / (far - near);
|
|
320
|
+
o[11] = 0;
|
|
321
|
+
o[12] = -(right + left) / (right - left);
|
|
322
|
+
o[13] = -(top + bottom) / (top - bottom);
|
|
323
|
+
o[14] = -(far + near) / (far - near);
|
|
324
|
+
o[15] = 1;
|
|
325
|
+
return o;
|
|
326
|
+
}
|
|
327
|
+
/**
|
|
328
|
+
* Set `o` to a "look at" view matrix.
|
|
329
|
+
*
|
|
330
|
+
* Builds a camera/view matrix placed at `eye`, oriented to look towards
|
|
331
|
+
* `center`, with the given `up` axis. The result transforms world-space
|
|
332
|
+
* coordinates into view space (camera looking down -Z).
|
|
333
|
+
*
|
|
334
|
+
* @param o Output matrix.
|
|
335
|
+
* @param eye Camera position as a length-3 array `[x, y, z]`.
|
|
336
|
+
* @param center Point the camera looks towards, `[x, y, z]`.
|
|
337
|
+
* @param up Camera up direction, `[x, y, z]`.
|
|
338
|
+
* @returns The matrix `o`.
|
|
339
|
+
*/
|
|
340
|
+
static lookAt(o, e, c, up) {
|
|
341
|
+
let x0, x1, x2, y0, y1, y2, z0, z1, z2, l;
|
|
342
|
+
z0 = e[0] - c[0];
|
|
343
|
+
z1 = e[1] - c[1];
|
|
344
|
+
z2 = e[2] - c[2];
|
|
345
|
+
l = 1 / Math.hypot(z0, z1, z2);
|
|
346
|
+
z0 *= l;
|
|
347
|
+
z1 *= l;
|
|
348
|
+
z2 *= l;
|
|
349
|
+
x0 = up[1] * z2 - up[2] * z1;
|
|
350
|
+
x1 = up[2] * z0 - up[0] * z2;
|
|
351
|
+
x2 = up[0] * z1 - up[1] * z0;
|
|
352
|
+
l = 1 / Math.hypot(x0, x1, x2);
|
|
353
|
+
x0 *= l;
|
|
354
|
+
x1 *= l;
|
|
355
|
+
x2 *= l;
|
|
356
|
+
y0 = z1 * x2 - z2 * x1;
|
|
357
|
+
y1 = z2 * x0 - z0 * x2;
|
|
358
|
+
y2 = z0 * x1 - z1 * x0;
|
|
359
|
+
l = 1 / Math.hypot(y0, y1, y2);
|
|
360
|
+
y0 *= l;
|
|
361
|
+
y1 *= l;
|
|
362
|
+
y2 *= l;
|
|
363
|
+
o[0] = x0;
|
|
364
|
+
o[1] = y0;
|
|
365
|
+
o[2] = z0;
|
|
366
|
+
o[3] = 0;
|
|
367
|
+
o[4] = x1;
|
|
368
|
+
o[5] = y1;
|
|
369
|
+
o[6] = z1;
|
|
370
|
+
o[7] = 0;
|
|
371
|
+
o[8] = x2;
|
|
372
|
+
o[9] = y2;
|
|
373
|
+
o[10] = z2;
|
|
374
|
+
o[11] = 0;
|
|
375
|
+
o[12] = -(x0 * e[0] + x1 * e[1] + x2 * e[2]);
|
|
376
|
+
o[13] = -(y0 * e[0] + y1 * e[1] + y2 * e[2]);
|
|
377
|
+
o[14] = -(z0 * e[0] + z1 * e[1] + z2 * e[2]);
|
|
378
|
+
o[15] = 1;
|
|
379
|
+
return o;
|
|
380
|
+
}
|
|
381
|
+
/**
|
|
382
|
+
* Create and return a translation matrix for the given offsets.
|
|
383
|
+
*
|
|
384
|
+
* @param tx Translation along X.
|
|
385
|
+
* @param ty Translation along Y.
|
|
386
|
+
* @param tz Translation along Z.
|
|
387
|
+
* @returns A new translation matrix.
|
|
388
|
+
*/
|
|
389
|
+
static translation(tx, ty, tz) {
|
|
390
|
+
const m = Mat4.create();
|
|
391
|
+
Mat4.set(m, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, tx, ty, tz, 1);
|
|
392
|
+
return m;
|
|
393
|
+
}
|
|
394
|
+
/**
|
|
395
|
+
* Create and return a non-uniform scale matrix.
|
|
396
|
+
*
|
|
397
|
+
* @param sx Scale factor along X.
|
|
398
|
+
* @param sy Scale factor along Y.
|
|
399
|
+
* @param sz Scale factor along Z.
|
|
400
|
+
* @returns A new scale matrix.
|
|
401
|
+
*/
|
|
402
|
+
static scale(sx, sy, sz) {
|
|
403
|
+
const m = Mat4.create();
|
|
404
|
+
Mat4.set(m, sx, 0, 0, 0, 0, sy, 0, 0, 0, 0, sz, 0, 0, 0, 0, 1);
|
|
405
|
+
return m;
|
|
406
|
+
}
|
|
407
|
+
/**
|
|
408
|
+
* Create and return a rotation matrix.
|
|
409
|
+
*
|
|
410
|
+
* The rotation is by `radians` about one of the principal axes. The
|
|
411
|
+
* returned matrix follows a right-handed convention.
|
|
412
|
+
*
|
|
413
|
+
* @param axis The axis to rotate about: `"x"`, `"y"`, or `"z"`.
|
|
414
|
+
* @param radians Rotation angle in radians.
|
|
415
|
+
* @returns A new rotation matrix, or an identity matrix if
|
|
416
|
+
* `axis` is not recognised.
|
|
417
|
+
*/
|
|
418
|
+
static rotation(axis, radians) {
|
|
419
|
+
const c = Math.cos(radians);
|
|
420
|
+
const s = Math.sin(radians);
|
|
421
|
+
const m = Mat4.create();
|
|
422
|
+
switch (axis) {
|
|
423
|
+
case "x":
|
|
424
|
+
Mat4.set(m, 1, 0, 0, 0, 0, c, s, 0, 0, -s, c, 0, 0, 0, 0, 1);
|
|
425
|
+
break;
|
|
426
|
+
case "y":
|
|
427
|
+
Mat4.set(m, c, 0, -s, 0, 0, 1, 0, 0, s, 0, c, 0, 0, 0, 0, 1);
|
|
428
|
+
break;
|
|
429
|
+
case "z":
|
|
430
|
+
Mat4.set(m, c, s, 0, 0, -s, c, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);
|
|
431
|
+
break;
|
|
432
|
+
}
|
|
433
|
+
return m;
|
|
434
|
+
}
|
|
435
|
+
}
|
|
436
|
+
/**
|
|
437
|
+
* A 4-component vector stored as a 4-element `Float32Array`.
|
|
438
|
+
*
|
|
439
|
+
* Like {@link Mat4}, `Vec4` exposes static helpers that take an output buffer
|
|
440
|
+
* `o` (returned for chaining) rather than allocating on each operation.
|
|
441
|
+
*/
|
|
442
|
+
export class Vec4 {
|
|
443
|
+
/**
|
|
444
|
+
* Create and return a new zeroed 4-component vector.
|
|
445
|
+
*
|
|
446
|
+
* @returns A length-4 `Float32Array` initialised to `[0, 0, 0, 0]`.
|
|
447
|
+
*/
|
|
448
|
+
static create() {
|
|
449
|
+
return new Float32Array(4);
|
|
450
|
+
}
|
|
451
|
+
/**
|
|
452
|
+
* Set the four components of vector `o` to the given values.
|
|
453
|
+
*
|
|
454
|
+
* @param o The vector to write into.
|
|
455
|
+
* @param x Component 0.
|
|
456
|
+
* @param y Component 1.
|
|
457
|
+
* @param z Component 2.
|
|
458
|
+
* @param w Component 3.
|
|
459
|
+
*/
|
|
460
|
+
static set(o, x, y, z, w) {
|
|
461
|
+
o[0] = x;
|
|
462
|
+
o[1] = y;
|
|
463
|
+
o[2] = z;
|
|
464
|
+
o[3] = w;
|
|
465
|
+
}
|
|
466
|
+
/**
|
|
467
|
+
* Create and return a new vector initialised to the given values.
|
|
468
|
+
*
|
|
469
|
+
* @param x Component 0.
|
|
470
|
+
* @param y Component 1.
|
|
471
|
+
* @param z Component 2.
|
|
472
|
+
* @param w Component 3.
|
|
473
|
+
* @returns A new length-4 `Float32Array`.
|
|
474
|
+
*/
|
|
475
|
+
static from(x, y, z, w) {
|
|
476
|
+
const o = Vec4.create();
|
|
477
|
+
Vec4.set(o, x, y, z, w);
|
|
478
|
+
return o;
|
|
479
|
+
}
|
|
480
|
+
/**
|
|
481
|
+
* Transform vector `a` by matrix `m` and store the result in `o`
|
|
482
|
+
* (`o = m * a`, treating `a` as a column vector).
|
|
483
|
+
*
|
|
484
|
+
* `o` may be the same buffer as `a`.
|
|
485
|
+
*
|
|
486
|
+
* @param o Output vector (may alias `a`).
|
|
487
|
+
* @param a Source vector.
|
|
488
|
+
* @param m Transformation matrix.
|
|
489
|
+
* @returns The vector `o`.
|
|
490
|
+
*/
|
|
491
|
+
static transformMat4(o, a, m) {
|
|
492
|
+
const x = a[0], y = a[1], z = a[2], w = a[3];
|
|
493
|
+
o[0] = m[0] * x + m[4] * y + m[8] * z + m[12] * w;
|
|
494
|
+
o[1] = m[1] * x + m[5] * y + m[9] * z + m[13] * w;
|
|
495
|
+
o[2] = m[2] * x + m[6] * y + m[10] * z + m[14] * w;
|
|
496
|
+
o[3] = m[3] * x + m[7] * y + m[11] * z + m[15] * w;
|
|
497
|
+
return o;
|
|
498
|
+
}
|
|
499
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function loadModernDosTexture(gl: WebGL2RenderingContext): WebGLTexture;
|