@carbonenginejs/core-math 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/src/pool.js ADDED
@@ -0,0 +1,160 @@
1
+ import {
2
+ GL_BYTE,
3
+ GL_UNSIGNED_BYTE,
4
+ GL_SHORT,
5
+ GL_UNSIGNED_SHORT,
6
+ GL_INT,
7
+ GL_UNSIGNED_INT,
8
+ GL_FLOAT
9
+ } from "./constants.js";
10
+
11
+
12
+ function loop(n, f)
13
+ {
14
+ const result = Array(n);
15
+ for (let i = 0; i < n; ++i) result[i] = f(i);
16
+ return result;
17
+ }
18
+
19
+ function nextPow16(v)
20
+ {
21
+ for (let i = 16; i <= (1 << 28); i *= 16)
22
+ {
23
+ if (v <= i) return i;
24
+ }
25
+ return 0;
26
+ }
27
+
28
+ function log2(v)
29
+ {
30
+ let r, shift;
31
+ r = (v > 0xFFFF) << 4;
32
+ v >>>= r;
33
+ shift = (v > 0xFF) << 3;
34
+ v >>>= shift;
35
+ r |= shift;
36
+ shift = (v > 0xF) << 2;
37
+ v >>>= shift;
38
+ r |= shift;
39
+ shift = (v > 0x3) << 1;
40
+ v >>>= shift;
41
+ r |= shift;
42
+ return r | (v >> 1);
43
+ }
44
+
45
+ export function createPool()
46
+ {
47
+
48
+ const bufferPool = loop(8, function ()
49
+ {
50
+ return [];
51
+ });
52
+
53
+ function free(buf)
54
+ {
55
+ bufferPool[log2(buf.byteLength) >> 2].push(buf);
56
+ }
57
+
58
+ function alloc(n)
59
+ {
60
+ let sz = nextPow16(n),
61
+ bin = bufferPool[log2(sz) >> 2];
62
+
63
+ if (bin.length > 0) return bin.pop();
64
+
65
+ return new ArrayBuffer(sz);
66
+ }
67
+
68
+ /**
69
+ * Shortcut to allocating a float 32 array
70
+ * @param {Number} length
71
+ * @returns {Float32Array}
72
+ */
73
+ function allocF32(length)
74
+ {
75
+ const result = new Float32Array(alloc(4 * length), 0, length);
76
+ return result.length !== length ? result.subarray(0, length) : result;
77
+ }
78
+
79
+ /**
80
+ * Allocated a typed array of a given size
81
+ * @param {Number|Function}type
82
+ * @param {Number} n
83
+ * @returns {Int8Array|Uint8Array|Int16Array|Uint16Array|Int32Array|Uint32Array|Float32Array|null}
84
+ */
85
+ function allocType(type, n)
86
+ {
87
+ let result = null;
88
+ switch (type)
89
+ {
90
+ case GL_BYTE:
91
+ case Int8Array:
92
+ result = new Int8Array(alloc(n), 0, n);
93
+ break;
94
+
95
+ case GL_UNSIGNED_BYTE:
96
+ case Uint8Array:
97
+ result = new Uint8Array(alloc(n), 0, n);
98
+ break;
99
+
100
+ case GL_SHORT:
101
+ case Int16Array:
102
+ result = new Int16Array(alloc(2 * n), 0, n);
103
+ break;
104
+
105
+ case GL_UNSIGNED_SHORT:
106
+ case Uint16Array:
107
+ result = new Uint16Array(alloc(2 * n), 0, n);
108
+ break;
109
+
110
+ case GL_INT:
111
+ case Int32Array:
112
+ result = new Int32Array(alloc(4 * n), 0, n);
113
+ break;
114
+
115
+ case GL_UNSIGNED_INT:
116
+ case Uint32Array:
117
+ result = new Uint32Array(alloc(4 * n), 0, n);
118
+ break;
119
+
120
+ case GL_FLOAT:
121
+ case Float32Array:
122
+ result = new Float32Array(alloc(4 * n), 0, n);
123
+ break;
124
+
125
+ default:
126
+ return null;
127
+ }
128
+
129
+ if (result.length !== n)
130
+ {
131
+ return result.subarray(0, n);
132
+ }
133
+
134
+ return result;
135
+ }
136
+
137
+ function freeType(array)
138
+ {
139
+ free(array.buffer);
140
+ }
141
+
142
+ return {
143
+ allocF32,
144
+ allocType,
145
+ unalloc: freeType,
146
+ freeType,
147
+ free
148
+ };
149
+
150
+ }
151
+
152
+ export const pool = createPool();
153
+
154
+ export const {
155
+ allocF32,
156
+ allocType,
157
+ unalloc,
158
+ freeType,
159
+ free
160
+ } = pool;
package/src/quat.js ADDED
@@ -0,0 +1,110 @@
1
+ import { quat as glQuat } from "gl-matrix";
2
+ import { vec3 } from "./vec3.js";
3
+ import { num } from "./num.js";
4
+ import { pool } from "./pool.js";
5
+
6
+ const quat = { ...glQuat };
7
+
8
+ export { quat };
9
+
10
+ /**
11
+ * Allocates a pooled vec4
12
+ * @returns {Float32Array|quat}
13
+ */
14
+ quat.alloc = function()
15
+ {
16
+ return pool.allocF32(4);
17
+ };
18
+
19
+ /**
20
+ * Unallocates a pooled vec4
21
+ * @param {Float32Array|quat} a
22
+ */
23
+ quat.unalloc = function(a)
24
+ {
25
+ pool.freeType(a);
26
+ };
27
+
28
+ /**
29
+ * Creates a quat from unit vectors
30
+ *
31
+ * @param {quat} out
32
+ * @param {vec3} from
33
+ * @param {vec3} to
34
+ * @returns {quat}
35
+ */
36
+ quat.fromUnitVectors = function(out, from, to)
37
+ {
38
+ let r = vec3.dot(from, to) + 1;
39
+ if (r < num.EPSILON)
40
+ {
41
+ r = 0;
42
+ if (Math.abs(from[0]) > Math.abs(from[2]))
43
+ {
44
+ out[0] = -from[1];
45
+ out[1] = from[0];
46
+ out[2] = 0;
47
+ out[3] = r;
48
+ }
49
+ else
50
+ {
51
+ out[0] = 0;
52
+ out[1] = - from[2];
53
+ out[2] = from[1];
54
+ out[3] = r;
55
+ }
56
+ }
57
+ else
58
+ {
59
+ out[0] = from[1] * to[2] - from[2] * to[1];
60
+ out[1] = from[2] * to[0] - from[0] * to[2];
61
+ out[2] = from[0] * to[1] - from[1] * to[0];
62
+ out[3] = r;
63
+ }
64
+ return quat.normalize(out, out);
65
+ };
66
+
67
+ export const {
68
+ add,
69
+ calculateW,
70
+ clone,
71
+ conjugate,
72
+ copy,
73
+ create,
74
+ dot,
75
+ equals,
76
+ exactEquals,
77
+ exp,
78
+ fromEuler,
79
+ fromMat3,
80
+ fromValues,
81
+ getAngle,
82
+ getAxisAngle,
83
+ identity,
84
+ invert,
85
+ len,
86
+ length,
87
+ lerp,
88
+ ln,
89
+ mul,
90
+ multiply,
91
+ normalize,
92
+ pow,
93
+ random,
94
+ rotateX,
95
+ rotateY,
96
+ rotateZ,
97
+ rotationTo,
98
+ scale,
99
+ set,
100
+ setAxes,
101
+ setAxisAngle,
102
+ slerp,
103
+ sqlerp,
104
+ sqrLen,
105
+ squaredLength,
106
+ str,
107
+ alloc,
108
+ unalloc,
109
+ fromUnitVectors
110
+ } = quat;