@vib3code/sdk 2.0.1 → 2.0.3-canary.0a63e71
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/CHANGELOG.md +36 -0
- package/DOCS/AGENT_HARNESS_ARCHITECTURE.md +245 -0
- package/DOCS/ANDROID_DEPLOYMENT.md +59 -0
- package/DOCS/ARCHITECTURE.md +1 -0
- package/DOCS/CI_TESTING.md +2 -0
- package/DOCS/CLI_ONBOARDING.md +3 -1
- package/DOCS/CONTROL_REFERENCE.md +2 -0
- package/DOCS/CROSS_SITE_DESIGN_PATTERNS.md +119 -0
- package/DOCS/ENV_SETUP.md +2 -0
- package/DOCS/EPIC_SCROLL_EVENTS.md +775 -0
- package/DOCS/EXPANSION_DESIGN.md +979 -0
- package/DOCS/EXPANSION_DESIGN_ULTRA.md +389 -0
- package/DOCS/EXPORT_FORMATS.md +2 -0
- package/DOCS/GPU_DISPOSAL_GUIDE.md +2 -0
- package/DOCS/HANDOFF_LANDING_PAGE.md +156 -0
- package/DOCS/HANDOFF_SDK_DEVELOPMENT.md +495 -0
- package/DOCS/LICENSING_TIERS.md +2 -0
- package/DOCS/MASTER_PLAN_2026-01-31.md +4 -2
- package/DOCS/MULTIVIZ_CHOREOGRAPHY_PATTERNS.md +939 -0
- package/DOCS/OBS_SETUP_GUIDE.md +2 -0
- package/DOCS/OPTIMIZATION_PLAN_MATH.md +119 -0
- package/DOCS/PRODUCT_STRATEGY.md +65 -0
- package/DOCS/PROJECT_SETUP.md +2 -0
- package/DOCS/README.md +105 -0
- package/DOCS/REFERENCE_SCROLL_ANALYSIS.md +99 -0
- package/DOCS/RENDERER_LIFECYCLE.md +2 -0
- package/DOCS/REPO_MANIFEST.md +2 -0
- package/DOCS/ROADMAP.md +113 -0
- package/DOCS/SCROLL_TIMELINE_v3.md +271 -0
- package/DOCS/SITE_REFACTOR_PLAN.md +102 -0
- package/DOCS/STATUS.md +26 -0
- package/DOCS/SYSTEM_INVENTORY.md +37 -32
- package/DOCS/TELEMETRY_EXPORTS.md +2 -0
- package/DOCS/VISUAL_ANALYSIS_CLICKERSS.md +87 -0
- package/DOCS/VISUAL_ANALYSIS_FACETAD.md +135 -0
- package/DOCS/VISUAL_ANALYSIS_SIMONE.md +97 -0
- package/DOCS/VISUAL_ANALYSIS_TABLESIDE.md +88 -0
- package/DOCS/WEBGPU_STATUS.md +121 -38
- package/DOCS/XR_BENCHMARKS.md +2 -0
- package/DOCS/archive/BLUEPRINT_EXECUTION_PLAN_2026-01-07.md +1 -0
- package/DOCS/archive/DEV_TRACK_ANALYSIS.md +1 -0
- package/DOCS/archive/DEV_TRACK_PLAN_2026-01-07.md +1 -0
- package/DOCS/archive/SESSION_014_PLAN.md +1 -0
- package/DOCS/archive/SESSION_LOG_2026-01-07.md +1 -0
- package/DOCS/archive/STRATEGIC_BLUEPRINT_2026-01-07.md +1 -0
- package/DOCS/archive/SYSTEM_AUDIT_2026-01-30.md +1 -0
- package/DOCS/archive/WEBGPU_STATUS_2026-02-15_STALE.md +1 -0
- package/DOCS/{DEV_TRACK_SESSION_2026-01-31.md → dev-tracks/DEV_TRACK_SESSION_2026-01-31.md} +3 -1
- package/DOCS/dev-tracks/DEV_TRACK_SESSION_2026-02-06.md +233 -0
- package/DOCS/dev-tracks/DEV_TRACK_SESSION_2026-02-13.md +129 -0
- package/DOCS/dev-tracks/DEV_TRACK_SESSION_2026-02-15.md +144 -0
- package/DOCS/dev-tracks/DEV_TRACK_SESSION_2026-02-16.md +110 -0
- package/DOCS/dev-tracks/PERF_UPGRADE_2026-02-16.md +310 -0
- package/DOCS/dev-tracks/README.md +12 -0
- package/README.md +26 -13
- package/cpp/CMakeLists.txt +236 -0
- package/cpp/bindings/embind.cpp +269 -0
- package/cpp/build.sh +129 -0
- package/cpp/geometry/Crystal.cpp +103 -0
- package/cpp/geometry/Fractal.cpp +136 -0
- package/cpp/geometry/GeometryGenerator.cpp +262 -0
- package/cpp/geometry/KleinBottle.cpp +71 -0
- package/cpp/geometry/Sphere.cpp +134 -0
- package/cpp/geometry/Tesseract.cpp +94 -0
- package/cpp/geometry/Tetrahedron.cpp +83 -0
- package/cpp/geometry/Torus.cpp +65 -0
- package/cpp/geometry/WarpFunctions.cpp +238 -0
- package/cpp/geometry/Wave.cpp +85 -0
- package/cpp/include/vib3_ffi.h +238 -0
- package/cpp/math/Mat4x4.cpp +409 -0
- package/cpp/math/Mat4x4.hpp +209 -0
- package/cpp/math/Projection.cpp +142 -0
- package/cpp/math/Projection.hpp +148 -0
- package/cpp/math/Rotor4D.cpp +322 -0
- package/cpp/math/Rotor4D.hpp +204 -0
- package/cpp/math/Vec4.cpp +303 -0
- package/cpp/math/Vec4.hpp +225 -0
- package/cpp/src/vib3_ffi.cpp +607 -0
- package/cpp/tests/Geometry_test.cpp +213 -0
- package/cpp/tests/Mat4x4_test.cpp +494 -0
- package/cpp/tests/Projection_test.cpp +298 -0
- package/cpp/tests/Rotor4D_test.cpp +423 -0
- package/cpp/tests/Vec4_test.cpp +489 -0
- package/docs/webgpu-live.html +1 -1
- package/package.json +41 -30
- package/src/agent/index.js +1 -3
- package/src/agent/mcp/MCPServer.js +1220 -144
- package/src/agent/mcp/index.js +1 -1
- package/src/agent/mcp/stdio-server.js +264 -0
- package/src/agent/mcp/tools.js +498 -31
- package/src/cli/index.js +431 -47
- package/src/core/CanvasManager.js +97 -204
- package/src/core/ErrorReporter.js +1 -1
- package/src/core/Parameters.js +1 -1
- package/src/core/VIB3Engine.js +93 -4
- package/src/core/VitalitySystem.js +53 -0
- package/src/core/index.js +18 -0
- package/src/core/renderers/FacetedRendererAdapter.js +10 -9
- package/src/core/renderers/HolographicRendererAdapter.js +13 -9
- package/src/core/renderers/QuantumRendererAdapter.js +11 -7
- package/src/creative/AestheticMapper.js +628 -0
- package/src/creative/ChoreographyPlayer.js +481 -0
- package/src/creative/index.js +11 -0
- package/src/experimental/GameLoop.js +72 -0
- package/src/experimental/LatticePhysics.js +100 -0
- package/src/experimental/LiveDirector.js +143 -0
- package/src/experimental/PlayerController4D.js +154 -0
- package/src/experimental/VIB3Actor.js +138 -0
- package/src/experimental/VIB3Compositor.js +117 -0
- package/src/experimental/VIB3Link.js +122 -0
- package/src/experimental/VIB3Orchestrator.js +146 -0
- package/src/experimental/VIB3Universe.js +109 -0
- package/src/experimental/demos/CrystalLabyrinth.js +202 -0
- package/src/export/TradingCardManager.js +3 -4
- package/src/export/index.js +11 -1
- package/src/faceted/FacetedSystem.js +260 -394
- package/src/games/glyph-war/GlyphWarVisualizer.js +641 -0
- package/src/geometry/generators/Crystal.js +2 -2
- package/src/geometry/warp/HypersphereCore.js +53 -24
- package/src/holograms/HolographicVisualizer.js +84 -98
- package/src/holograms/RealHolographicSystem.js +194 -43
- package/src/math/Mat4x4.js +308 -105
- package/src/math/Rotor4D.js +124 -40
- package/src/math/Vec4.js +200 -103
- package/src/math/index.js +7 -7
- package/src/polychora/PolychoraSystem.js +77 -0
- package/src/quantum/QuantumEngine.js +103 -66
- package/src/quantum/QuantumVisualizer.js +31 -22
- package/src/reactivity/index.js +3 -5
- package/src/render/LayerPresetManager.js +372 -0
- package/src/render/LayerReactivityBridge.js +344 -0
- package/src/render/LayerRelationshipGraph.js +610 -0
- package/src/render/MultiCanvasBridge.js +148 -25
- package/src/render/ShaderLoader.js +38 -0
- package/src/render/ShaderProgram.js +4 -4
- package/src/render/UnifiedRenderBridge.js +4 -1
- package/src/render/backends/WebGPUBackend.js +8 -4
- package/src/render/index.js +27 -2
- package/src/scene/Node4D.js +74 -24
- package/src/scene/index.js +4 -4
- package/src/shaders/common/geometry24.glsl +65 -0
- package/src/shaders/common/geometry24.wgsl +54 -0
- package/src/shaders/common/rotation4d.glsl +4 -4
- package/src/shaders/common/rotation4d.wgsl +2 -2
- package/src/shaders/common/uniforms.wgsl +15 -8
- package/src/shaders/faceted/faceted.frag.glsl +220 -80
- package/src/shaders/faceted/faceted.frag.wgsl +144 -90
- package/src/shaders/holographic/holographic.frag.glsl +28 -9
- package/src/shaders/holographic/holographic.frag.wgsl +112 -41
- package/src/shaders/quantum/quantum.frag.glsl +1 -0
- package/src/shaders/quantum/quantum.frag.wgsl +6 -4
- package/src/testing/ParallelTestFramework.js +2 -2
- package/src/ui/adaptive/renderers/webgpu/WebGPURenderer.ts +2 -2
- package/src/viewer/GalleryUI.js +17 -0
- package/src/viewer/ViewerPortal.js +2 -2
- package/src/viewer/index.js +1 -1
- package/tools/headless-renderer.js +258 -0
- package/tools/shader-sync-verify.js +14 -8
- package/tools/site-analysis/all-reports.json +32 -0
- package/tools/site-analysis/combined-analysis.md +50 -0
- package/tools/site-analyzer.mjs +779 -0
- package/tools/visual-catalog/capture.js +276 -0
- package/tools/visual-catalog/composite.js +138 -0
- package/types/adaptive-sdk.d.ts +204 -5
- package/types/agent/cli.d.ts +78 -0
- package/types/agent/index.d.ts +18 -0
- package/types/agent/mcp.d.ts +87 -0
- package/types/agent/telemetry.d.ts +190 -0
- package/types/core/VIB3Engine.d.ts +26 -0
- package/types/core/index.d.ts +261 -0
- package/types/creative/AestheticMapper.d.ts +72 -0
- package/types/creative/ChoreographyPlayer.d.ts +96 -0
- package/types/creative/index.d.ts +17 -0
- package/types/export/index.d.ts +243 -0
- package/types/geometry/index.d.ts +164 -0
- package/types/math/index.d.ts +214 -0
- package/types/render/LayerPresetManager.d.ts +78 -0
- package/types/render/LayerReactivityBridge.d.ts +85 -0
- package/types/render/LayerRelationshipGraph.d.ts +174 -0
- package/types/render/index.d.ts +3 -0
- package/types/scene/index.d.ts +204 -0
- package/types/systems/index.d.ts +244 -0
- package/types/variations/index.d.ts +62 -0
- package/types/viewer/index.d.ts +225 -0
- package/DOCS/BLUEPRINT_EXECUTION_PLAN_2026-01-07.md +0 -34
- package/DOCS/DEV_TRACK_ANALYSIS.md +0 -77
- package/DOCS/DEV_TRACK_PLAN_2026-01-07.md +0 -42
- package/DOCS/SESSION_014_PLAN.md +0 -195
- package/DOCS/SESSION_LOG_2026-01-07.md +0 -56
- package/DOCS/STRATEGIC_BLUEPRINT_2026-01-07.md +0 -72
- package/DOCS/SYSTEM_AUDIT_2026-01-30.md +0 -738
- /package/src/viewer/{ReactivityManager.js → ViewerInputHandler.js} +0 -0
package/src/math/Mat4x4.js
CHANGED
|
@@ -18,6 +18,12 @@
|
|
|
18
18
|
import { Vec4 } from './Vec4.js';
|
|
19
19
|
|
|
20
20
|
export class Mat4x4 {
|
|
21
|
+
/**
|
|
22
|
+
* Internal token to skip initialization during construction
|
|
23
|
+
* @private
|
|
24
|
+
*/
|
|
25
|
+
static UNINITIALIZED = {};
|
|
26
|
+
|
|
21
27
|
/**
|
|
22
28
|
* Create a new 4x4 matrix
|
|
23
29
|
* Default is identity matrix
|
|
@@ -26,6 +32,8 @@ export class Mat4x4 {
|
|
|
26
32
|
constructor(elements = null) {
|
|
27
33
|
this.data = new Float32Array(16);
|
|
28
34
|
|
|
35
|
+
if (elements === Mat4x4.UNINITIALIZED) return;
|
|
36
|
+
|
|
29
37
|
if (elements) {
|
|
30
38
|
if (elements.length !== 16) {
|
|
31
39
|
throw new Error('Mat4x4 requires exactly 16 elements');
|
|
@@ -45,12 +53,7 @@ export class Mat4x4 {
|
|
|
45
53
|
* @returns {Mat4x4}
|
|
46
54
|
*/
|
|
47
55
|
static identity() {
|
|
48
|
-
return new Mat4x4(
|
|
49
|
-
1, 0, 0, 0,
|
|
50
|
-
0, 1, 0, 0,
|
|
51
|
-
0, 0, 1, 0,
|
|
52
|
-
0, 0, 0, 1
|
|
53
|
-
]);
|
|
56
|
+
return new Mat4x4();
|
|
54
57
|
}
|
|
55
58
|
|
|
56
59
|
/**
|
|
@@ -58,7 +61,7 @@ export class Mat4x4 {
|
|
|
58
61
|
* @returns {Mat4x4}
|
|
59
62
|
*/
|
|
60
63
|
static zero() {
|
|
61
|
-
return new Mat4x4(
|
|
64
|
+
return new Mat4x4(Mat4x4.UNINITIALIZED);
|
|
62
65
|
}
|
|
63
66
|
|
|
64
67
|
/**
|
|
@@ -157,24 +160,46 @@ export class Mat4x4 {
|
|
|
157
160
|
/**
|
|
158
161
|
* Multiply two matrices
|
|
159
162
|
* @param {Mat4x4} m - Right operand
|
|
163
|
+
* @param {Mat4x4} [target=null] - Optional target matrix to store result
|
|
160
164
|
* @returns {Mat4x4} New matrix = this * m
|
|
161
165
|
*/
|
|
162
|
-
multiply(m) {
|
|
166
|
+
multiply(m, target = null) {
|
|
167
|
+
const out = target || new Mat4x4(Mat4x4.UNINITIALIZED);
|
|
168
|
+
const r = out.data;
|
|
163
169
|
const a = this.data;
|
|
164
170
|
const b = m.data;
|
|
165
|
-
const result = new Float32Array(16);
|
|
166
|
-
|
|
167
|
-
for (let col = 0; col < 4; col++) {
|
|
168
|
-
for (let row = 0; row < 4; row++) {
|
|
169
|
-
let sum = 0;
|
|
170
|
-
for (let k = 0; k < 4; k++) {
|
|
171
|
-
sum += a[k * 4 + row] * b[col * 4 + k];
|
|
172
|
-
}
|
|
173
|
-
result[col * 4 + row] = sum;
|
|
174
|
-
}
|
|
175
|
-
}
|
|
176
171
|
|
|
177
|
-
|
|
172
|
+
const a00 = a[0], a01 = a[4], a02 = a[8], a03 = a[12];
|
|
173
|
+
const a10 = a[1], a11 = a[5], a12 = a[9], a13 = a[13];
|
|
174
|
+
const a20 = a[2], a21 = a[6], a22 = a[10], a23 = a[14];
|
|
175
|
+
const a30 = a[3], a31 = a[7], a32 = a[11], a33 = a[15];
|
|
176
|
+
|
|
177
|
+
const b00 = b[0], b01 = b[4], b02 = b[8], b03 = b[12];
|
|
178
|
+
const b10 = b[1], b11 = b[5], b12 = b[9], b13 = b[13];
|
|
179
|
+
const b20 = b[2], b21 = b[6], b22 = b[10], b23 = b[14];
|
|
180
|
+
const b30 = b[3], b31 = b[7], b32 = b[11], b33 = b[15];
|
|
181
|
+
|
|
182
|
+
r[0] = a00 * b00 + a01 * b10 + a02 * b20 + a03 * b30;
|
|
183
|
+
r[1] = a10 * b00 + a11 * b10 + a12 * b20 + a13 * b30;
|
|
184
|
+
r[2] = a20 * b00 + a21 * b10 + a22 * b20 + a23 * b30;
|
|
185
|
+
r[3] = a30 * b00 + a31 * b10 + a32 * b20 + a33 * b30;
|
|
186
|
+
|
|
187
|
+
r[4] = a00 * b01 + a01 * b11 + a02 * b21 + a03 * b31;
|
|
188
|
+
r[5] = a10 * b01 + a11 * b11 + a12 * b21 + a13 * b31;
|
|
189
|
+
r[6] = a20 * b01 + a21 * b11 + a22 * b21 + a23 * b31;
|
|
190
|
+
r[7] = a30 * b01 + a31 * b11 + a32 * b21 + a33 * b31;
|
|
191
|
+
|
|
192
|
+
r[8] = a00 * b02 + a01 * b12 + a02 * b22 + a03 * b32;
|
|
193
|
+
r[9] = a10 * b02 + a11 * b12 + a12 * b22 + a13 * b32;
|
|
194
|
+
r[10] = a20 * b02 + a21 * b12 + a22 * b22 + a23 * b32;
|
|
195
|
+
r[11] = a30 * b02 + a31 * b12 + a32 * b22 + a33 * b32;
|
|
196
|
+
|
|
197
|
+
r[12] = a00 * b03 + a01 * b13 + a02 * b23 + a03 * b33;
|
|
198
|
+
r[13] = a10 * b03 + a11 * b13 + a12 * b23 + a13 * b33;
|
|
199
|
+
r[14] = a20 * b03 + a21 * b13 + a22 * b23 + a23 * b33;
|
|
200
|
+
r[15] = a30 * b03 + a31 * b13 + a32 * b23 + a33 * b33;
|
|
201
|
+
|
|
202
|
+
return out;
|
|
178
203
|
}
|
|
179
204
|
|
|
180
205
|
/**
|
|
@@ -183,8 +208,44 @@ export class Mat4x4 {
|
|
|
183
208
|
* @returns {Mat4x4} this
|
|
184
209
|
*/
|
|
185
210
|
multiplyInPlace(m) {
|
|
186
|
-
const
|
|
187
|
-
|
|
211
|
+
const a = this.data;
|
|
212
|
+
const b = m.data;
|
|
213
|
+
|
|
214
|
+
// Cache values to avoid aliasing issues and repeated array access
|
|
215
|
+
const a00 = a[0], a01 = a[4], a02 = a[8], a03 = a[12];
|
|
216
|
+
const a10 = a[1], a11 = a[5], a12 = a[9], a13 = a[13];
|
|
217
|
+
const a20 = a[2], a21 = a[6], a22 = a[10], a23 = a[14];
|
|
218
|
+
const a30 = a[3], a31 = a[7], a32 = a[11], a33 = a[15];
|
|
219
|
+
|
|
220
|
+
const b00 = b[0], b01 = b[4], b02 = b[8], b03 = b[12];
|
|
221
|
+
const b10 = b[1], b11 = b[5], b12 = b[9], b13 = b[13];
|
|
222
|
+
const b20 = b[2], b21 = b[6], b22 = b[10], b23 = b[14];
|
|
223
|
+
const b30 = b[3], b31 = b[7], b32 = b[11], b33 = b[15];
|
|
224
|
+
|
|
225
|
+
// Column 0
|
|
226
|
+
a[0] = a00 * b00 + a01 * b10 + a02 * b20 + a03 * b30;
|
|
227
|
+
a[1] = a10 * b00 + a11 * b10 + a12 * b20 + a13 * b30;
|
|
228
|
+
a[2] = a20 * b00 + a21 * b10 + a22 * b20 + a23 * b30;
|
|
229
|
+
a[3] = a30 * b00 + a31 * b10 + a32 * b20 + a33 * b30;
|
|
230
|
+
|
|
231
|
+
// Column 1
|
|
232
|
+
a[4] = a00 * b01 + a01 * b11 + a02 * b21 + a03 * b31;
|
|
233
|
+
a[5] = a10 * b01 + a11 * b11 + a12 * b21 + a13 * b31;
|
|
234
|
+
a[6] = a20 * b01 + a21 * b11 + a22 * b21 + a23 * b31;
|
|
235
|
+
a[7] = a30 * b01 + a31 * b11 + a32 * b21 + a33 * b31;
|
|
236
|
+
|
|
237
|
+
// Column 2
|
|
238
|
+
a[8] = a00 * b02 + a01 * b12 + a02 * b22 + a03 * b32;
|
|
239
|
+
a[9] = a10 * b02 + a11 * b12 + a12 * b22 + a13 * b32;
|
|
240
|
+
a[10] = a20 * b02 + a21 * b12 + a22 * b22 + a23 * b32;
|
|
241
|
+
a[11] = a30 * b02 + a31 * b12 + a32 * b22 + a33 * b32;
|
|
242
|
+
|
|
243
|
+
// Column 3
|
|
244
|
+
a[12] = a00 * b03 + a01 * b13 + a02 * b23 + a03 * b33;
|
|
245
|
+
a[13] = a10 * b03 + a11 * b13 + a12 * b23 + a13 * b33;
|
|
246
|
+
a[14] = a20 * b03 + a21 * b13 + a22 * b23 + a23 * b33;
|
|
247
|
+
a[15] = a30 * b03 + a31 * b13 + a32 * b23 + a33 * b33;
|
|
248
|
+
|
|
188
249
|
return this;
|
|
189
250
|
}
|
|
190
251
|
|
|
@@ -202,16 +263,22 @@ export class Mat4x4 {
|
|
|
202
263
|
/**
|
|
203
264
|
* Transform a Vec4 by this matrix
|
|
204
265
|
* @param {Vec4} v
|
|
266
|
+
* @param {Vec4} [target=null] - Optional target vector to store result
|
|
205
267
|
* @returns {Vec4} Transformed vector
|
|
206
268
|
*/
|
|
207
|
-
multiplyVec4(v) {
|
|
269
|
+
multiplyVec4(v, target = null) {
|
|
208
270
|
const m = this.data;
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
271
|
+
const out = target || new Vec4();
|
|
272
|
+
|
|
273
|
+
// Cache components to support aliasing (target === v)
|
|
274
|
+
const x = v.x, y = v.y, z = v.z, w = v.w;
|
|
275
|
+
|
|
276
|
+
out.x = m[0] * x + m[4] * y + m[8] * z + m[12] * w;
|
|
277
|
+
out.y = m[1] * x + m[5] * y + m[9] * z + m[13] * w;
|
|
278
|
+
out.z = m[2] * x + m[6] * y + m[10] * z + m[14] * w;
|
|
279
|
+
out.w = m[3] * x + m[7] * y + m[11] * z + m[15] * w;
|
|
280
|
+
|
|
281
|
+
return out;
|
|
215
282
|
}
|
|
216
283
|
|
|
217
284
|
/**
|
|
@@ -253,27 +320,36 @@ export class Mat4x4 {
|
|
|
253
320
|
/**
|
|
254
321
|
* Add another matrix
|
|
255
322
|
* @param {Mat4x4} m
|
|
323
|
+
* @param {Mat4x4} [target=null] - Optional target matrix
|
|
256
324
|
* @returns {Mat4x4} New matrix
|
|
257
325
|
*/
|
|
258
|
-
add(m) {
|
|
259
|
-
const
|
|
326
|
+
add(m, target = null) {
|
|
327
|
+
const out = target || new Mat4x4(Mat4x4.UNINITIALIZED);
|
|
328
|
+
const r = out.data;
|
|
329
|
+
const a = this.data;
|
|
330
|
+
const b = m.data;
|
|
331
|
+
|
|
260
332
|
for (let i = 0; i < 16; i++) {
|
|
261
|
-
|
|
333
|
+
r[i] = a[i] + b[i];
|
|
262
334
|
}
|
|
263
|
-
return
|
|
335
|
+
return out;
|
|
264
336
|
}
|
|
265
337
|
|
|
266
338
|
/**
|
|
267
339
|
* Multiply by scalar
|
|
268
340
|
* @param {number} s
|
|
341
|
+
* @param {Mat4x4} [target=null] - Optional target matrix
|
|
269
342
|
* @returns {Mat4x4} New matrix
|
|
270
343
|
*/
|
|
271
|
-
scale(s) {
|
|
272
|
-
const
|
|
344
|
+
scale(s, target = null) {
|
|
345
|
+
const out = target || new Mat4x4(Mat4x4.UNINITIALIZED);
|
|
346
|
+
const r = out.data;
|
|
347
|
+
const a = this.data;
|
|
348
|
+
|
|
273
349
|
for (let i = 0; i < 16; i++) {
|
|
274
|
-
|
|
350
|
+
r[i] = a[i] * s;
|
|
275
351
|
}
|
|
276
|
-
return
|
|
352
|
+
return out;
|
|
277
353
|
}
|
|
278
354
|
|
|
279
355
|
/**
|
|
@@ -282,12 +358,13 @@ export class Mat4x4 {
|
|
|
282
358
|
*/
|
|
283
359
|
transpose() {
|
|
284
360
|
const m = this.data;
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
]
|
|
361
|
+
const out = new Mat4x4(Mat4x4.UNINITIALIZED);
|
|
362
|
+
const r = out.data;
|
|
363
|
+
r[0] = m[0]; r[4] = m[1]; r[8] = m[2]; r[12] = m[3];
|
|
364
|
+
r[1] = m[4]; r[5] = m[5]; r[9] = m[6]; r[13] = m[7];
|
|
365
|
+
r[2] = m[8]; r[6] = m[9]; r[10] = m[10]; r[14] = m[11];
|
|
366
|
+
r[3] = m[12]; r[7] = m[13]; r[11] = m[14]; r[15] = m[15];
|
|
367
|
+
return out;
|
|
291
368
|
}
|
|
292
369
|
|
|
293
370
|
/**
|
|
@@ -342,7 +419,8 @@ export class Mat4x4 {
|
|
|
342
419
|
*/
|
|
343
420
|
inverse() {
|
|
344
421
|
const m = this.data;
|
|
345
|
-
const
|
|
422
|
+
const out = new Mat4x4(Mat4x4.UNINITIALIZED);
|
|
423
|
+
const inv = out.data;
|
|
346
424
|
|
|
347
425
|
inv[0] = m[5] * m[10] * m[15] - m[5] * m[11] * m[14] - m[9] * m[6] * m[15] +
|
|
348
426
|
m[9] * m[7] * m[14] + m[13] * m[6] * m[11] - m[13] * m[7] * m[10];
|
|
@@ -403,7 +481,7 @@ export class Mat4x4 {
|
|
|
403
481
|
inv[i] *= invDet;
|
|
404
482
|
}
|
|
405
483
|
|
|
406
|
-
return
|
|
484
|
+
return out;
|
|
407
485
|
}
|
|
408
486
|
|
|
409
487
|
/**
|
|
@@ -490,6 +568,122 @@ export class Mat4x4 {
|
|
|
490
568
|
return new Mat4x4(json.data);
|
|
491
569
|
}
|
|
492
570
|
|
|
571
|
+
// ========== IN-PLACE ROTATIONS ==========
|
|
572
|
+
|
|
573
|
+
/**
|
|
574
|
+
* Rotate in XY plane in place
|
|
575
|
+
* @param {number} angle
|
|
576
|
+
* @returns {Mat4x4} this
|
|
577
|
+
*/
|
|
578
|
+
rotateXY(angle) {
|
|
579
|
+
const c = Math.cos(angle);
|
|
580
|
+
const s = Math.sin(angle);
|
|
581
|
+
const m = this.data;
|
|
582
|
+
|
|
583
|
+
for (let i = 0; i < 4; i++) {
|
|
584
|
+
const a0 = m[i]; // Col 0
|
|
585
|
+
const a1 = m[i + 4]; // Col 1
|
|
586
|
+
m[i] = a0 * c + a1 * s;
|
|
587
|
+
m[i + 4] = -a0 * s + a1 * c;
|
|
588
|
+
}
|
|
589
|
+
return this;
|
|
590
|
+
}
|
|
591
|
+
|
|
592
|
+
/**
|
|
593
|
+
* Rotate in XZ plane in place
|
|
594
|
+
* @param {number} angle
|
|
595
|
+
* @returns {Mat4x4} this
|
|
596
|
+
*/
|
|
597
|
+
rotateXZ(angle) {
|
|
598
|
+
const c = Math.cos(angle);
|
|
599
|
+
const s = Math.sin(angle);
|
|
600
|
+
const m = this.data;
|
|
601
|
+
|
|
602
|
+
for (let i = 0; i < 4; i++) {
|
|
603
|
+
const a0 = m[i]; // Col 0
|
|
604
|
+
const a2 = m[i + 8]; // Col 2
|
|
605
|
+
m[i] = a0 * c - a2 * s;
|
|
606
|
+
m[i + 8] = a0 * s + a2 * c;
|
|
607
|
+
}
|
|
608
|
+
return this;
|
|
609
|
+
}
|
|
610
|
+
|
|
611
|
+
/**
|
|
612
|
+
* Rotate in YZ plane in place
|
|
613
|
+
* @param {number} angle
|
|
614
|
+
* @returns {Mat4x4} this
|
|
615
|
+
*/
|
|
616
|
+
rotateYZ(angle) {
|
|
617
|
+
const c = Math.cos(angle);
|
|
618
|
+
const s = Math.sin(angle);
|
|
619
|
+
const m = this.data;
|
|
620
|
+
|
|
621
|
+
for (let i = 0; i < 4; i++) {
|
|
622
|
+
const a1 = m[i + 4]; // Col 1
|
|
623
|
+
const a2 = m[i + 8]; // Col 2
|
|
624
|
+
m[i + 4] = a1 * c + a2 * s;
|
|
625
|
+
m[i + 8] = -a1 * s + a2 * c;
|
|
626
|
+
}
|
|
627
|
+
return this;
|
|
628
|
+
}
|
|
629
|
+
|
|
630
|
+
/**
|
|
631
|
+
* Rotate in XW plane in place
|
|
632
|
+
* @param {number} angle
|
|
633
|
+
* @returns {Mat4x4} this
|
|
634
|
+
*/
|
|
635
|
+
rotateXW(angle) {
|
|
636
|
+
const c = Math.cos(angle);
|
|
637
|
+
const s = Math.sin(angle);
|
|
638
|
+
const m = this.data;
|
|
639
|
+
|
|
640
|
+
for (let i = 0; i < 4; i++) {
|
|
641
|
+
const a0 = m[i]; // Col 0
|
|
642
|
+
const a3 = m[i + 12]; // Col 3
|
|
643
|
+
m[i] = a0 * c + a3 * s;
|
|
644
|
+
m[i + 12] = -a0 * s + a3 * c;
|
|
645
|
+
}
|
|
646
|
+
return this;
|
|
647
|
+
}
|
|
648
|
+
|
|
649
|
+
/**
|
|
650
|
+
* Rotate in YW plane in place
|
|
651
|
+
* @param {number} angle
|
|
652
|
+
* @returns {Mat4x4} this
|
|
653
|
+
*/
|
|
654
|
+
rotateYW(angle) {
|
|
655
|
+
const c = Math.cos(angle);
|
|
656
|
+
const s = Math.sin(angle);
|
|
657
|
+
const m = this.data;
|
|
658
|
+
|
|
659
|
+
for (let i = 0; i < 4; i++) {
|
|
660
|
+
const a1 = m[i + 4]; // Col 1
|
|
661
|
+
const a3 = m[i + 12]; // Col 3
|
|
662
|
+
m[i + 4] = a1 * c + a3 * s;
|
|
663
|
+
m[i + 12] = -a1 * s + a3 * c;
|
|
664
|
+
}
|
|
665
|
+
return this;
|
|
666
|
+
}
|
|
667
|
+
|
|
668
|
+
/**
|
|
669
|
+
* Rotate in ZW plane in place
|
|
670
|
+
* @param {number} angle
|
|
671
|
+
* @returns {Mat4x4} this
|
|
672
|
+
*/
|
|
673
|
+
rotateZW(angle) {
|
|
674
|
+
const c = Math.cos(angle);
|
|
675
|
+
const s = Math.sin(angle);
|
|
676
|
+
const m = this.data;
|
|
677
|
+
|
|
678
|
+
for (let i = 0; i < 4; i++) {
|
|
679
|
+
const a2 = m[i + 8]; // Col 2
|
|
680
|
+
const a3 = m[i + 12]; // Col 3
|
|
681
|
+
m[i + 8] = a2 * c + a3 * s;
|
|
682
|
+
m[i + 12] = -a2 * s + a3 * c;
|
|
683
|
+
}
|
|
684
|
+
return this;
|
|
685
|
+
}
|
|
686
|
+
|
|
493
687
|
// ========== ROTATION MATRICES FOR ALL 6 PLANES ==========
|
|
494
688
|
|
|
495
689
|
/**
|
|
@@ -500,12 +694,13 @@ export class Mat4x4 {
|
|
|
500
694
|
static rotationXY(angle) {
|
|
501
695
|
const c = Math.cos(angle);
|
|
502
696
|
const s = Math.sin(angle);
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
]
|
|
697
|
+
const out = new Mat4x4(Mat4x4.UNINITIALIZED);
|
|
698
|
+
const r = out.data;
|
|
699
|
+
r[0] = c; r[1] = s;
|
|
700
|
+
r[4] = -s; r[5] = c;
|
|
701
|
+
r[10] = 1;
|
|
702
|
+
r[15] = 1;
|
|
703
|
+
return out;
|
|
509
704
|
}
|
|
510
705
|
|
|
511
706
|
/**
|
|
@@ -516,12 +711,13 @@ export class Mat4x4 {
|
|
|
516
711
|
static rotationXZ(angle) {
|
|
517
712
|
const c = Math.cos(angle);
|
|
518
713
|
const s = Math.sin(angle);
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
]
|
|
714
|
+
const out = new Mat4x4(Mat4x4.UNINITIALIZED);
|
|
715
|
+
const r = out.data;
|
|
716
|
+
r[0] = c; r[2] = -s;
|
|
717
|
+
r[5] = 1;
|
|
718
|
+
r[8] = s; r[10] = c;
|
|
719
|
+
r[15] = 1;
|
|
720
|
+
return out;
|
|
525
721
|
}
|
|
526
722
|
|
|
527
723
|
/**
|
|
@@ -532,12 +728,13 @@ export class Mat4x4 {
|
|
|
532
728
|
static rotationYZ(angle) {
|
|
533
729
|
const c = Math.cos(angle);
|
|
534
730
|
const s = Math.sin(angle);
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
]
|
|
731
|
+
const out = new Mat4x4(Mat4x4.UNINITIALIZED);
|
|
732
|
+
const r = out.data;
|
|
733
|
+
r[0] = 1;
|
|
734
|
+
r[5] = c; r[6] = s;
|
|
735
|
+
r[9] = -s; r[10] = c;
|
|
736
|
+
r[15] = 1;
|
|
737
|
+
return out;
|
|
541
738
|
}
|
|
542
739
|
|
|
543
740
|
/**
|
|
@@ -549,12 +746,13 @@ export class Mat4x4 {
|
|
|
549
746
|
static rotationXW(angle) {
|
|
550
747
|
const c = Math.cos(angle);
|
|
551
748
|
const s = Math.sin(angle);
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
]
|
|
749
|
+
const out = new Mat4x4(Mat4x4.UNINITIALIZED);
|
|
750
|
+
const r = out.data;
|
|
751
|
+
r[0] = c; r[3] = s;
|
|
752
|
+
r[5] = 1;
|
|
753
|
+
r[10] = 1;
|
|
754
|
+
r[12] = -s; r[15] = c;
|
|
755
|
+
return out;
|
|
558
756
|
}
|
|
559
757
|
|
|
560
758
|
/**
|
|
@@ -565,12 +763,13 @@ export class Mat4x4 {
|
|
|
565
763
|
static rotationYW(angle) {
|
|
566
764
|
const c = Math.cos(angle);
|
|
567
765
|
const s = Math.sin(angle);
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
]
|
|
766
|
+
const out = new Mat4x4(Mat4x4.UNINITIALIZED);
|
|
767
|
+
const r = out.data;
|
|
768
|
+
r[0] = 1;
|
|
769
|
+
r[5] = c; r[7] = s;
|
|
770
|
+
r[10] = 1;
|
|
771
|
+
r[13] = -s; r[15] = c;
|
|
772
|
+
return out;
|
|
574
773
|
}
|
|
575
774
|
|
|
576
775
|
/**
|
|
@@ -581,12 +780,13 @@ export class Mat4x4 {
|
|
|
581
780
|
static rotationZW(angle) {
|
|
582
781
|
const c = Math.cos(angle);
|
|
583
782
|
const s = Math.sin(angle);
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
]
|
|
783
|
+
const out = new Mat4x4(Mat4x4.UNINITIALIZED);
|
|
784
|
+
const r = out.data;
|
|
785
|
+
r[0] = 1;
|
|
786
|
+
r[5] = 1;
|
|
787
|
+
r[10] = c; r[11] = s;
|
|
788
|
+
r[14] = -s; r[15] = c;
|
|
789
|
+
return out;
|
|
590
790
|
}
|
|
591
791
|
|
|
592
792
|
/**
|
|
@@ -624,12 +824,12 @@ export class Mat4x4 {
|
|
|
624
824
|
static rotationFromAngles(angles) {
|
|
625
825
|
let result = Mat4x4.identity();
|
|
626
826
|
|
|
627
|
-
if (angles.xy) result
|
|
628
|
-
if (angles.xz) result
|
|
629
|
-
if (angles.yz) result
|
|
630
|
-
if (angles.xw) result
|
|
631
|
-
if (angles.yw) result
|
|
632
|
-
if (angles.zw) result
|
|
827
|
+
if (angles.xy) result.rotateXY(angles.xy);
|
|
828
|
+
if (angles.xz) result.rotateXZ(angles.xz);
|
|
829
|
+
if (angles.yz) result.rotateYZ(angles.yz);
|
|
830
|
+
if (angles.xw) result.rotateXW(angles.xw);
|
|
831
|
+
if (angles.yw) result.rotateYW(angles.yw);
|
|
832
|
+
if (angles.zw) result.rotateZW(angles.zw);
|
|
633
833
|
|
|
634
834
|
return result;
|
|
635
835
|
}
|
|
@@ -658,12 +858,13 @@ export class Mat4x4 {
|
|
|
658
858
|
* @returns {Mat4x4}
|
|
659
859
|
*/
|
|
660
860
|
static uniformScale(s) {
|
|
661
|
-
|
|
662
|
-
|
|
663
|
-
|
|
664
|
-
|
|
665
|
-
|
|
666
|
-
]
|
|
861
|
+
const out = new Mat4x4(Mat4x4.UNINITIALIZED);
|
|
862
|
+
const r = out.data;
|
|
863
|
+
r[0] = s;
|
|
864
|
+
r[5] = s;
|
|
865
|
+
r[10] = s;
|
|
866
|
+
r[15] = s;
|
|
867
|
+
return out;
|
|
667
868
|
}
|
|
668
869
|
|
|
669
870
|
/**
|
|
@@ -675,12 +876,13 @@ export class Mat4x4 {
|
|
|
675
876
|
* @returns {Mat4x4}
|
|
676
877
|
*/
|
|
677
878
|
static scale(sx, sy, sz, sw = 1) {
|
|
678
|
-
|
|
679
|
-
|
|
680
|
-
|
|
681
|
-
|
|
682
|
-
|
|
683
|
-
]
|
|
879
|
+
const out = new Mat4x4(Mat4x4.UNINITIALIZED);
|
|
880
|
+
const r = out.data;
|
|
881
|
+
r[0] = sx;
|
|
882
|
+
r[5] = sy;
|
|
883
|
+
r[10] = sz;
|
|
884
|
+
r[15] = sw;
|
|
885
|
+
return out;
|
|
684
886
|
}
|
|
685
887
|
|
|
686
888
|
/**
|
|
@@ -696,12 +898,13 @@ export class Mat4x4 {
|
|
|
696
898
|
static translation(tx, ty, tz, tw = 0) {
|
|
697
899
|
// For true 4D translation, you need 5D homogeneous coordinates
|
|
698
900
|
// This is a placeholder that adds the translation to the W column
|
|
699
|
-
|
|
700
|
-
|
|
701
|
-
|
|
702
|
-
|
|
703
|
-
|
|
704
|
-
]
|
|
901
|
+
const out = new Mat4x4(Mat4x4.UNINITIALIZED);
|
|
902
|
+
const r = out.data;
|
|
903
|
+
r[0] = 1;
|
|
904
|
+
r[5] = 1;
|
|
905
|
+
r[10] = 1;
|
|
906
|
+
r[12] = tx; r[13] = ty; r[14] = tz; r[15] = 1 + tw;
|
|
907
|
+
return out;
|
|
705
908
|
}
|
|
706
909
|
}
|
|
707
910
|
|