@vib3code/sdk 2.0.3-canary.91a95f3 → 2.0.3-canary.b52c293
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/DOCS/AGENT_HARNESS_ARCHITECTURE.md +2 -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 +2 -0
- package/DOCS/CONTROL_REFERENCE.md +2 -0
- package/DOCS/CROSS_SITE_DESIGN_PATTERNS.md +2 -0
- package/DOCS/ENV_SETUP.md +2 -0
- package/DOCS/EPIC_SCROLL_EVENTS.md +2 -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 +2 -0
- package/DOCS/HANDOFF_SDK_DEVELOPMENT.md +2 -0
- package/DOCS/LICENSING_TIERS.md +2 -0
- package/DOCS/MASTER_PLAN_2026-01-31.md +4 -2
- package/DOCS/MULTIVIZ_CHOREOGRAPHY_PATTERNS.md +3 -1
- package/DOCS/OBS_SETUP_GUIDE.md +2 -0
- package/DOCS/OPTIMIZATION_PLAN_MATH.md +119 -0
- package/DOCS/PRODUCT_STRATEGY.md +2 -0
- package/DOCS/PROJECT_SETUP.md +2 -0
- package/DOCS/README.md +5 -3
- package/DOCS/REFERENCE_SCROLL_ANALYSIS.md +2 -0
- package/DOCS/RENDERER_LIFECYCLE.md +2 -0
- package/DOCS/REPO_MANIFEST.md +2 -0
- package/DOCS/ROADMAP.md +2 -0
- package/DOCS/SCROLL_TIMELINE_v3.md +2 -0
- package/DOCS/SITE_REFACTOR_PLAN.md +2 -0
- package/DOCS/STATUS.md +2 -0
- package/DOCS/SYSTEM_INVENTORY.md +4 -2
- package/DOCS/TELEMETRY_EXPORTS.md +2 -0
- package/DOCS/VISUAL_ANALYSIS_CLICKERSS.md +2 -0
- package/DOCS/VISUAL_ANALYSIS_FACETAD.md +2 -0
- package/DOCS/VISUAL_ANALYSIS_SIMONE.md +2 -0
- package/DOCS/VISUAL_ANALYSIS_TABLESIDE.md +2 -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 -34
- package/DOCS/archive/DEV_TRACK_ANALYSIS.md +1 -80
- package/DOCS/archive/DEV_TRACK_PLAN_2026-01-07.md +1 -42
- package/DOCS/archive/SESSION_014_PLAN.md +1 -195
- package/DOCS/archive/SESSION_LOG_2026-01-07.md +1 -56
- package/DOCS/archive/STRATEGIC_BLUEPRINT_2026-01-07.md +1 -72
- package/DOCS/archive/SYSTEM_AUDIT_2026-01-30.md +1 -741
- package/DOCS/archive/WEBGPU_STATUS_2026-02-15_STALE.md +1 -0
- package/DOCS/dev-tracks/DEV_TRACK_SESSION_2026-01-31.md +2 -0
- package/DOCS/dev-tracks/DEV_TRACK_SESSION_2026-02-06.md +2 -0
- package/DOCS/dev-tracks/DEV_TRACK_SESSION_2026-02-13.md +15 -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 +2 -0
- package/docs/webgpu-live.html +1 -1
- package/package.json +10 -1
- package/src/agent/index.js +1 -3
- package/src/agent/mcp/MCPServer.js +542 -188
- package/src/agent/mcp/index.js +1 -1
- package/src/agent/mcp/tools.js +132 -32
- package/src/cli/index.js +374 -44
- package/src/core/VIB3Engine.js +55 -3
- package/src/core/index.js +18 -0
- package/src/core/renderers/FacetedRendererAdapter.js +10 -9
- package/src/core/renderers/HolographicRendererAdapter.js +11 -7
- package/src/core/renderers/QuantumRendererAdapter.js +11 -7
- 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/index.js +11 -1
- package/src/faceted/FacetedSystem.js +27 -10
- package/src/games/glyph-war/GlyphWarVisualizer.js +641 -0
- package/src/geometry/generators/Crystal.js +2 -2
- package/src/holograms/HolographicVisualizer.js +58 -89
- package/src/holograms/RealHolographicSystem.js +126 -31
- package/src/math/Mat4x4.js +225 -36
- package/src/math/Rotor4D.js +93 -39
- package/src/math/Vec4.js +200 -103
- package/src/math/index.js +7 -7
- package/src/quantum/QuantumVisualizer.js +24 -20
- 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 +1 -1
- package/src/render/backends/WebGPUBackend.js +8 -4
- package/src/render/index.js +27 -2
- 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.wgsl +19 -6
- package/src/shaders/holographic/holographic.frag.wgsl +7 -5
- package/src/shaders/quantum/quantum.frag.wgsl +7 -5
- 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/tools/shader-sync-verify.js +6 -4
- 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/src/math/Mat4x4.js
CHANGED
|
@@ -157,24 +157,46 @@ export class Mat4x4 {
|
|
|
157
157
|
/**
|
|
158
158
|
* Multiply two matrices
|
|
159
159
|
* @param {Mat4x4} m - Right operand
|
|
160
|
+
* @param {Mat4x4} [target=null] - Optional target matrix to store result
|
|
160
161
|
* @returns {Mat4x4} New matrix = this * m
|
|
161
162
|
*/
|
|
162
|
-
multiply(m) {
|
|
163
|
+
multiply(m, target = null) {
|
|
164
|
+
const out = target || new Mat4x4();
|
|
165
|
+
const r = out.data;
|
|
163
166
|
const a = this.data;
|
|
164
167
|
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
168
|
|
|
177
|
-
|
|
169
|
+
const a00 = a[0], a01 = a[4], a02 = a[8], a03 = a[12];
|
|
170
|
+
const a10 = a[1], a11 = a[5], a12 = a[9], a13 = a[13];
|
|
171
|
+
const a20 = a[2], a21 = a[6], a22 = a[10], a23 = a[14];
|
|
172
|
+
const a30 = a[3], a31 = a[7], a32 = a[11], a33 = a[15];
|
|
173
|
+
|
|
174
|
+
const b00 = b[0], b01 = b[4], b02 = b[8], b03 = b[12];
|
|
175
|
+
const b10 = b[1], b11 = b[5], b12 = b[9], b13 = b[13];
|
|
176
|
+
const b20 = b[2], b21 = b[6], b22 = b[10], b23 = b[14];
|
|
177
|
+
const b30 = b[3], b31 = b[7], b32 = b[11], b33 = b[15];
|
|
178
|
+
|
|
179
|
+
r[0] = a00 * b00 + a01 * b10 + a02 * b20 + a03 * b30;
|
|
180
|
+
r[1] = a10 * b00 + a11 * b10 + a12 * b20 + a13 * b30;
|
|
181
|
+
r[2] = a20 * b00 + a21 * b10 + a22 * b20 + a23 * b30;
|
|
182
|
+
r[3] = a30 * b00 + a31 * b10 + a32 * b20 + a33 * b30;
|
|
183
|
+
|
|
184
|
+
r[4] = a00 * b01 + a01 * b11 + a02 * b21 + a03 * b31;
|
|
185
|
+
r[5] = a10 * b01 + a11 * b11 + a12 * b21 + a13 * b31;
|
|
186
|
+
r[6] = a20 * b01 + a21 * b11 + a22 * b21 + a23 * b31;
|
|
187
|
+
r[7] = a30 * b01 + a31 * b11 + a32 * b21 + a33 * b31;
|
|
188
|
+
|
|
189
|
+
r[8] = a00 * b02 + a01 * b12 + a02 * b22 + a03 * b32;
|
|
190
|
+
r[9] = a10 * b02 + a11 * b12 + a12 * b22 + a13 * b32;
|
|
191
|
+
r[10] = a20 * b02 + a21 * b12 + a22 * b22 + a23 * b32;
|
|
192
|
+
r[11] = a30 * b02 + a31 * b12 + a32 * b22 + a33 * b32;
|
|
193
|
+
|
|
194
|
+
r[12] = a00 * b03 + a01 * b13 + a02 * b23 + a03 * b33;
|
|
195
|
+
r[13] = a10 * b03 + a11 * b13 + a12 * b23 + a13 * b33;
|
|
196
|
+
r[14] = a20 * b03 + a21 * b13 + a22 * b23 + a23 * b33;
|
|
197
|
+
r[15] = a30 * b03 + a31 * b13 + a32 * b23 + a33 * b33;
|
|
198
|
+
|
|
199
|
+
return out;
|
|
178
200
|
}
|
|
179
201
|
|
|
180
202
|
/**
|
|
@@ -183,8 +205,44 @@ export class Mat4x4 {
|
|
|
183
205
|
* @returns {Mat4x4} this
|
|
184
206
|
*/
|
|
185
207
|
multiplyInPlace(m) {
|
|
186
|
-
const
|
|
187
|
-
|
|
208
|
+
const a = this.data;
|
|
209
|
+
const b = m.data;
|
|
210
|
+
|
|
211
|
+
// Cache values to avoid aliasing issues and repeated array access
|
|
212
|
+
const a00 = a[0], a01 = a[4], a02 = a[8], a03 = a[12];
|
|
213
|
+
const a10 = a[1], a11 = a[5], a12 = a[9], a13 = a[13];
|
|
214
|
+
const a20 = a[2], a21 = a[6], a22 = a[10], a23 = a[14];
|
|
215
|
+
const a30 = a[3], a31 = a[7], a32 = a[11], a33 = a[15];
|
|
216
|
+
|
|
217
|
+
const b00 = b[0], b01 = b[4], b02 = b[8], b03 = b[12];
|
|
218
|
+
const b10 = b[1], b11 = b[5], b12 = b[9], b13 = b[13];
|
|
219
|
+
const b20 = b[2], b21 = b[6], b22 = b[10], b23 = b[14];
|
|
220
|
+
const b30 = b[3], b31 = b[7], b32 = b[11], b33 = b[15];
|
|
221
|
+
|
|
222
|
+
// Column 0
|
|
223
|
+
a[0] = a00 * b00 + a01 * b10 + a02 * b20 + a03 * b30;
|
|
224
|
+
a[1] = a10 * b00 + a11 * b10 + a12 * b20 + a13 * b30;
|
|
225
|
+
a[2] = a20 * b00 + a21 * b10 + a22 * b20 + a23 * b30;
|
|
226
|
+
a[3] = a30 * b00 + a31 * b10 + a32 * b20 + a33 * b30;
|
|
227
|
+
|
|
228
|
+
// Column 1
|
|
229
|
+
a[4] = a00 * b01 + a01 * b11 + a02 * b21 + a03 * b31;
|
|
230
|
+
a[5] = a10 * b01 + a11 * b11 + a12 * b21 + a13 * b31;
|
|
231
|
+
a[6] = a20 * b01 + a21 * b11 + a22 * b21 + a23 * b31;
|
|
232
|
+
a[7] = a30 * b01 + a31 * b11 + a32 * b21 + a33 * b31;
|
|
233
|
+
|
|
234
|
+
// Column 2
|
|
235
|
+
a[8] = a00 * b02 + a01 * b12 + a02 * b22 + a03 * b32;
|
|
236
|
+
a[9] = a10 * b02 + a11 * b12 + a12 * b22 + a13 * b32;
|
|
237
|
+
a[10] = a20 * b02 + a21 * b12 + a22 * b22 + a23 * b32;
|
|
238
|
+
a[11] = a30 * b02 + a31 * b12 + a32 * b22 + a33 * b32;
|
|
239
|
+
|
|
240
|
+
// Column 3
|
|
241
|
+
a[12] = a00 * b03 + a01 * b13 + a02 * b23 + a03 * b33;
|
|
242
|
+
a[13] = a10 * b03 + a11 * b13 + a12 * b23 + a13 * b33;
|
|
243
|
+
a[14] = a20 * b03 + a21 * b13 + a22 * b23 + a23 * b33;
|
|
244
|
+
a[15] = a30 * b03 + a31 * b13 + a32 * b23 + a33 * b33;
|
|
245
|
+
|
|
188
246
|
return this;
|
|
189
247
|
}
|
|
190
248
|
|
|
@@ -202,16 +260,22 @@ export class Mat4x4 {
|
|
|
202
260
|
/**
|
|
203
261
|
* Transform a Vec4 by this matrix
|
|
204
262
|
* @param {Vec4} v
|
|
263
|
+
* @param {Vec4} [target=null] - Optional target vector to store result
|
|
205
264
|
* @returns {Vec4} Transformed vector
|
|
206
265
|
*/
|
|
207
|
-
multiplyVec4(v) {
|
|
266
|
+
multiplyVec4(v, target = null) {
|
|
208
267
|
const m = this.data;
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
268
|
+
const out = target || new Vec4();
|
|
269
|
+
|
|
270
|
+
// Cache components to support aliasing (target === v)
|
|
271
|
+
const x = v.x, y = v.y, z = v.z, w = v.w;
|
|
272
|
+
|
|
273
|
+
out.x = m[0] * x + m[4] * y + m[8] * z + m[12] * w;
|
|
274
|
+
out.y = m[1] * x + m[5] * y + m[9] * z + m[13] * w;
|
|
275
|
+
out.z = m[2] * x + m[6] * y + m[10] * z + m[14] * w;
|
|
276
|
+
out.w = m[3] * x + m[7] * y + m[11] * z + m[15] * w;
|
|
277
|
+
|
|
278
|
+
return out;
|
|
215
279
|
}
|
|
216
280
|
|
|
217
281
|
/**
|
|
@@ -253,27 +317,36 @@ export class Mat4x4 {
|
|
|
253
317
|
/**
|
|
254
318
|
* Add another matrix
|
|
255
319
|
* @param {Mat4x4} m
|
|
320
|
+
* @param {Mat4x4} [target=null] - Optional target matrix
|
|
256
321
|
* @returns {Mat4x4} New matrix
|
|
257
322
|
*/
|
|
258
|
-
add(m) {
|
|
259
|
-
const
|
|
323
|
+
add(m, target = null) {
|
|
324
|
+
const out = target || new Mat4x4();
|
|
325
|
+
const r = out.data;
|
|
326
|
+
const a = this.data;
|
|
327
|
+
const b = m.data;
|
|
328
|
+
|
|
260
329
|
for (let i = 0; i < 16; i++) {
|
|
261
|
-
|
|
330
|
+
r[i] = a[i] + b[i];
|
|
262
331
|
}
|
|
263
|
-
return
|
|
332
|
+
return out;
|
|
264
333
|
}
|
|
265
334
|
|
|
266
335
|
/**
|
|
267
336
|
* Multiply by scalar
|
|
268
337
|
* @param {number} s
|
|
338
|
+
* @param {Mat4x4} [target=null] - Optional target matrix
|
|
269
339
|
* @returns {Mat4x4} New matrix
|
|
270
340
|
*/
|
|
271
|
-
scale(s) {
|
|
272
|
-
const
|
|
341
|
+
scale(s, target = null) {
|
|
342
|
+
const out = target || new Mat4x4();
|
|
343
|
+
const r = out.data;
|
|
344
|
+
const a = this.data;
|
|
345
|
+
|
|
273
346
|
for (let i = 0; i < 16; i++) {
|
|
274
|
-
|
|
347
|
+
r[i] = a[i] * s;
|
|
275
348
|
}
|
|
276
|
-
return
|
|
349
|
+
return out;
|
|
277
350
|
}
|
|
278
351
|
|
|
279
352
|
/**
|
|
@@ -490,6 +563,122 @@ export class Mat4x4 {
|
|
|
490
563
|
return new Mat4x4(json.data);
|
|
491
564
|
}
|
|
492
565
|
|
|
566
|
+
// ========== IN-PLACE ROTATIONS ==========
|
|
567
|
+
|
|
568
|
+
/**
|
|
569
|
+
* Rotate in XY plane in place
|
|
570
|
+
* @param {number} angle
|
|
571
|
+
* @returns {Mat4x4} this
|
|
572
|
+
*/
|
|
573
|
+
rotateXY(angle) {
|
|
574
|
+
const c = Math.cos(angle);
|
|
575
|
+
const s = Math.sin(angle);
|
|
576
|
+
const m = this.data;
|
|
577
|
+
|
|
578
|
+
for (let i = 0; i < 4; i++) {
|
|
579
|
+
const a0 = m[i]; // Col 0
|
|
580
|
+
const a1 = m[i + 4]; // Col 1
|
|
581
|
+
m[i] = a0 * c + a1 * s;
|
|
582
|
+
m[i + 4] = -a0 * s + a1 * c;
|
|
583
|
+
}
|
|
584
|
+
return this;
|
|
585
|
+
}
|
|
586
|
+
|
|
587
|
+
/**
|
|
588
|
+
* Rotate in XZ plane in place
|
|
589
|
+
* @param {number} angle
|
|
590
|
+
* @returns {Mat4x4} this
|
|
591
|
+
*/
|
|
592
|
+
rotateXZ(angle) {
|
|
593
|
+
const c = Math.cos(angle);
|
|
594
|
+
const s = Math.sin(angle);
|
|
595
|
+
const m = this.data;
|
|
596
|
+
|
|
597
|
+
for (let i = 0; i < 4; i++) {
|
|
598
|
+
const a0 = m[i]; // Col 0
|
|
599
|
+
const a2 = m[i + 8]; // Col 2
|
|
600
|
+
m[i] = a0 * c - a2 * s;
|
|
601
|
+
m[i + 8] = a0 * s + a2 * c;
|
|
602
|
+
}
|
|
603
|
+
return this;
|
|
604
|
+
}
|
|
605
|
+
|
|
606
|
+
/**
|
|
607
|
+
* Rotate in YZ plane in place
|
|
608
|
+
* @param {number} angle
|
|
609
|
+
* @returns {Mat4x4} this
|
|
610
|
+
*/
|
|
611
|
+
rotateYZ(angle) {
|
|
612
|
+
const c = Math.cos(angle);
|
|
613
|
+
const s = Math.sin(angle);
|
|
614
|
+
const m = this.data;
|
|
615
|
+
|
|
616
|
+
for (let i = 0; i < 4; i++) {
|
|
617
|
+
const a1 = m[i + 4]; // Col 1
|
|
618
|
+
const a2 = m[i + 8]; // Col 2
|
|
619
|
+
m[i + 4] = a1 * c + a2 * s;
|
|
620
|
+
m[i + 8] = -a1 * s + a2 * c;
|
|
621
|
+
}
|
|
622
|
+
return this;
|
|
623
|
+
}
|
|
624
|
+
|
|
625
|
+
/**
|
|
626
|
+
* Rotate in XW plane in place
|
|
627
|
+
* @param {number} angle
|
|
628
|
+
* @returns {Mat4x4} this
|
|
629
|
+
*/
|
|
630
|
+
rotateXW(angle) {
|
|
631
|
+
const c = Math.cos(angle);
|
|
632
|
+
const s = Math.sin(angle);
|
|
633
|
+
const m = this.data;
|
|
634
|
+
|
|
635
|
+
for (let i = 0; i < 4; i++) {
|
|
636
|
+
const a0 = m[i]; // Col 0
|
|
637
|
+
const a3 = m[i + 12]; // Col 3
|
|
638
|
+
m[i] = a0 * c + a3 * s;
|
|
639
|
+
m[i + 12] = -a0 * s + a3 * c;
|
|
640
|
+
}
|
|
641
|
+
return this;
|
|
642
|
+
}
|
|
643
|
+
|
|
644
|
+
/**
|
|
645
|
+
* Rotate in YW plane in place
|
|
646
|
+
* @param {number} angle
|
|
647
|
+
* @returns {Mat4x4} this
|
|
648
|
+
*/
|
|
649
|
+
rotateYW(angle) {
|
|
650
|
+
const c = Math.cos(angle);
|
|
651
|
+
const s = Math.sin(angle);
|
|
652
|
+
const m = this.data;
|
|
653
|
+
|
|
654
|
+
for (let i = 0; i < 4; i++) {
|
|
655
|
+
const a1 = m[i + 4]; // Col 1
|
|
656
|
+
const a3 = m[i + 12]; // Col 3
|
|
657
|
+
m[i + 4] = a1 * c + a3 * s;
|
|
658
|
+
m[i + 12] = -a1 * s + a3 * c;
|
|
659
|
+
}
|
|
660
|
+
return this;
|
|
661
|
+
}
|
|
662
|
+
|
|
663
|
+
/**
|
|
664
|
+
* Rotate in ZW plane in place
|
|
665
|
+
* @param {number} angle
|
|
666
|
+
* @returns {Mat4x4} this
|
|
667
|
+
*/
|
|
668
|
+
rotateZW(angle) {
|
|
669
|
+
const c = Math.cos(angle);
|
|
670
|
+
const s = Math.sin(angle);
|
|
671
|
+
const m = this.data;
|
|
672
|
+
|
|
673
|
+
for (let i = 0; i < 4; i++) {
|
|
674
|
+
const a2 = m[i + 8]; // Col 2
|
|
675
|
+
const a3 = m[i + 12]; // Col 3
|
|
676
|
+
m[i + 8] = a2 * c + a3 * s;
|
|
677
|
+
m[i + 12] = -a2 * s + a3 * c;
|
|
678
|
+
}
|
|
679
|
+
return this;
|
|
680
|
+
}
|
|
681
|
+
|
|
493
682
|
// ========== ROTATION MATRICES FOR ALL 6 PLANES ==========
|
|
494
683
|
|
|
495
684
|
/**
|
|
@@ -624,12 +813,12 @@ export class Mat4x4 {
|
|
|
624
813
|
static rotationFromAngles(angles) {
|
|
625
814
|
let result = Mat4x4.identity();
|
|
626
815
|
|
|
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
|
|
816
|
+
if (angles.xy) result.rotateXY(angles.xy);
|
|
817
|
+
if (angles.xz) result.rotateXZ(angles.xz);
|
|
818
|
+
if (angles.yz) result.rotateYZ(angles.yz);
|
|
819
|
+
if (angles.xw) result.rotateXW(angles.xw);
|
|
820
|
+
if (angles.yw) result.rotateYW(angles.yw);
|
|
821
|
+
if (angles.zw) result.rotateZW(angles.zw);
|
|
633
822
|
|
|
634
823
|
return result;
|
|
635
824
|
}
|
package/src/math/Rotor4D.js
CHANGED
|
@@ -323,54 +323,108 @@ export class Rotor4D {
|
|
|
323
323
|
/**
|
|
324
324
|
* Rotate a 4D vector using sandwich product: v' = R v R†
|
|
325
325
|
*
|
|
326
|
+
* Matrix math is inlined to avoid allocating a temporary Float32Array(16).
|
|
327
|
+
* Pass an optional target Vec4 to eliminate all allocations.
|
|
328
|
+
*
|
|
326
329
|
* @param {Vec4} v - Vector to rotate
|
|
327
|
-
* @
|
|
330
|
+
* @param {Vec4} [target] - Optional pre-allocated Vec4 to write result into
|
|
331
|
+
* @returns {Vec4} Rotated vector (target if provided, otherwise new Vec4)
|
|
328
332
|
*/
|
|
329
|
-
rotate(v) {
|
|
330
|
-
// For efficiency, we expand the sandwich product directly
|
|
331
|
-
// rather than doing two rotor multiplications
|
|
332
|
-
|
|
333
|
+
rotate(v, target) {
|
|
333
334
|
const x = v.x, y = v.y, z = v.z, w = v.w;
|
|
334
335
|
|
|
335
|
-
//
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
// Then multiply by R† (reverse of rotor)
|
|
340
|
-
// Extract the vector part of the result
|
|
336
|
+
// Normalize for numerical stability (same as toMatrix)
|
|
337
|
+
const n = this.norm();
|
|
338
|
+
const invN = n > 1e-10 ? 1 / n : 1;
|
|
341
339
|
|
|
342
|
-
|
|
343
|
-
const
|
|
344
|
-
const
|
|
345
|
-
const
|
|
346
|
-
const
|
|
340
|
+
const s = this.s * invN;
|
|
341
|
+
const xy = this.xy * invN;
|
|
342
|
+
const xz = this.xz * invN;
|
|
343
|
+
const yz = this.yz * invN;
|
|
344
|
+
const xw = this.xw * invN;
|
|
345
|
+
const yw = this.yw * invN;
|
|
346
|
+
const zw = this.zw * invN;
|
|
347
|
+
const xyzw = this.xyzw * invN;
|
|
347
348
|
|
|
348
|
-
// Squared terms
|
|
349
|
+
// Squared terms
|
|
349
350
|
const s2 = s * s;
|
|
350
|
-
const xy2 = xy * xy
|
|
351
|
-
const
|
|
351
|
+
const xy2 = xy * xy;
|
|
352
|
+
const xz2 = xz * xz;
|
|
353
|
+
const yz2 = yz * yz;
|
|
354
|
+
const xw2 = xw * xw;
|
|
355
|
+
const yw2 = yw * yw;
|
|
356
|
+
const zw2 = zw * zw;
|
|
352
357
|
const xyzw2 = xyzw * xyzw;
|
|
353
358
|
|
|
354
|
-
//
|
|
355
|
-
const
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
359
|
+
// Cross terms (pre-multiplied by 2)
|
|
360
|
+
const sxy = 2 * s * xy;
|
|
361
|
+
const sxz = 2 * s * xz;
|
|
362
|
+
const syz = 2 * s * yz;
|
|
363
|
+
const sxw = 2 * s * xw;
|
|
364
|
+
const syw = 2 * s * yw;
|
|
365
|
+
const szw = 2 * s * zw;
|
|
366
|
+
|
|
367
|
+
const xzyz = 2 * xz * yz;
|
|
368
|
+
const xyyz = 2 * xy * yz;
|
|
369
|
+
const xyxz = 2 * xy * xz;
|
|
370
|
+
const xyxw = 2 * xy * xw;
|
|
371
|
+
const xyyw = 2 * xy * yw;
|
|
372
|
+
|
|
373
|
+
const xzxw = 2 * xz * xw;
|
|
374
|
+
const xzyw = 2 * xz * yw;
|
|
375
|
+
const xzzw = 2 * xz * zw;
|
|
376
|
+
|
|
377
|
+
const yzxw = 2 * yz * xw;
|
|
378
|
+
const yzyw = 2 * yz * yw;
|
|
379
|
+
const yzzw = 2 * yz * zw;
|
|
380
|
+
|
|
381
|
+
const xwyw = 2 * xw * yw;
|
|
382
|
+
const xwzw = 2 * xw * zw;
|
|
383
|
+
const ywzw = 2 * yw * zw;
|
|
384
|
+
|
|
385
|
+
const xyxyzw = 2 * xy * xyzw;
|
|
386
|
+
const xzxyzw = 2 * xz * xyzw;
|
|
387
|
+
const yzxyzw = 2 * yz * xyzw;
|
|
388
|
+
const xwxyzw = 2 * xw * xyzw;
|
|
389
|
+
const ywxyzw = 2 * yw * xyzw;
|
|
390
|
+
const zwxyzw = 2 * zw * xyzw;
|
|
391
|
+
|
|
392
|
+
// Column-major 4x4 rotation matrix entries (inlined from toMatrix)
|
|
393
|
+
// Column 0
|
|
394
|
+
const m0 = s2 - xy2 - xz2 + yz2 - xw2 + yw2 + zw2 - xyzw2;
|
|
395
|
+
const m1 = sxy + xzyz + xwyw - zwxyzw;
|
|
396
|
+
const m2 = sxz - xyyz + xwzw + ywxyzw;
|
|
397
|
+
const m3 = sxw - xyyw - xzzw - yzxyzw;
|
|
398
|
+
// Column 1
|
|
399
|
+
const m4 = -sxy + xzyz + xwyw + zwxyzw;
|
|
400
|
+
const m5 = s2 - xy2 + xz2 - yz2 + xw2 - yw2 + zw2 - xyzw2;
|
|
401
|
+
const m6 = syz + xyxz + ywzw - xwxyzw;
|
|
402
|
+
const m7 = syw + xyxw - yzzw + xzxyzw;
|
|
403
|
+
// Column 2
|
|
404
|
+
const m8 = -sxz - xyyz + xwzw - ywxyzw;
|
|
405
|
+
const m9 = -syz + xyxz + ywzw + xwxyzw;
|
|
406
|
+
const m10 = s2 + xy2 - xz2 - yz2 + xw2 + yw2 - zw2 - xyzw2;
|
|
407
|
+
const m11 = szw + xzxw + yzyw - xyxyzw;
|
|
408
|
+
// Column 3
|
|
409
|
+
const m12 = -sxw - xyyw - xzzw + yzxyzw;
|
|
410
|
+
const m13 = -syw + xyxw - yzzw - xzxyzw;
|
|
411
|
+
const m14 = -szw + xzxw + yzyw + xyxyzw;
|
|
412
|
+
const m15 = s2 + xy2 + xz2 + yz2 - xw2 - yw2 - zw2 - xyzw2;
|
|
413
|
+
|
|
414
|
+
// Matrix-vector multiply
|
|
415
|
+
const rx = m0 * x + m4 * y + m8 * z + m12 * w;
|
|
416
|
+
const ry = m1 * x + m5 * y + m9 * z + m13 * w;
|
|
417
|
+
const rz = m2 * x + m6 * y + m10 * z + m14 * w;
|
|
418
|
+
const rw = m3 * x + m7 * y + m11 * z + m15 * w;
|
|
419
|
+
|
|
420
|
+
if (target) {
|
|
421
|
+
target.x = rx;
|
|
422
|
+
target.y = ry;
|
|
423
|
+
target.z = rz;
|
|
424
|
+
target.w = rw;
|
|
425
|
+
return target;
|
|
426
|
+
}
|
|
427
|
+
return new Vec4(rx, ry, rz, rw);
|
|
374
428
|
}
|
|
375
429
|
|
|
376
430
|
/**
|