@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
|
@@ -0,0 +1,409 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Mat4x4.cpp - 4x4 Matrix Implementation
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
#include "Mat4x4.hpp"
|
|
6
|
+
#include <cmath>
|
|
7
|
+
#include <algorithm>
|
|
8
|
+
|
|
9
|
+
namespace vib3 {
|
|
10
|
+
|
|
11
|
+
// Constructors
|
|
12
|
+
|
|
13
|
+
Mat4x4::Mat4x4() noexcept : data{} {
|
|
14
|
+
// Zero-initialized
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
Mat4x4::Mat4x4(float diagonal) noexcept : data{} {
|
|
18
|
+
data[0] = diagonal;
|
|
19
|
+
data[5] = diagonal;
|
|
20
|
+
data[10] = diagonal;
|
|
21
|
+
data[15] = diagonal;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
Mat4x4::Mat4x4(const std::array<float, 16>& elements) noexcept : data(elements) {}
|
|
25
|
+
|
|
26
|
+
Mat4x4::Mat4x4(const Vec4& col0, const Vec4& col1, const Vec4& col2, const Vec4& col3) noexcept {
|
|
27
|
+
setColumn(0, col0);
|
|
28
|
+
setColumn(1, col1);
|
|
29
|
+
setColumn(2, col2);
|
|
30
|
+
setColumn(3, col3);
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
// Static factories
|
|
34
|
+
|
|
35
|
+
Mat4x4 Mat4x4::identity() noexcept {
|
|
36
|
+
return Mat4x4(1.0f);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
Mat4x4 Mat4x4::zero() noexcept {
|
|
40
|
+
return Mat4x4();
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
// Rotation matrices
|
|
44
|
+
|
|
45
|
+
Mat4x4 Mat4x4::rotationXY(float angle) noexcept {
|
|
46
|
+
float c = std::cos(angle);
|
|
47
|
+
float s = std::sin(angle);
|
|
48
|
+
|
|
49
|
+
Mat4x4 m = identity();
|
|
50
|
+
m.at(0, 0) = c;
|
|
51
|
+
m.at(0, 1) = -s;
|
|
52
|
+
m.at(1, 0) = s;
|
|
53
|
+
m.at(1, 1) = c;
|
|
54
|
+
return m;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
Mat4x4 Mat4x4::rotationXZ(float angle) noexcept {
|
|
58
|
+
float c = std::cos(angle);
|
|
59
|
+
float s = std::sin(angle);
|
|
60
|
+
|
|
61
|
+
Mat4x4 m = identity();
|
|
62
|
+
m.at(0, 0) = c;
|
|
63
|
+
m.at(0, 2) = -s;
|
|
64
|
+
m.at(2, 0) = s;
|
|
65
|
+
m.at(2, 2) = c;
|
|
66
|
+
return m;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
Mat4x4 Mat4x4::rotationYZ(float angle) noexcept {
|
|
70
|
+
float c = std::cos(angle);
|
|
71
|
+
float s = std::sin(angle);
|
|
72
|
+
|
|
73
|
+
Mat4x4 m = identity();
|
|
74
|
+
m.at(1, 1) = c;
|
|
75
|
+
m.at(1, 2) = -s;
|
|
76
|
+
m.at(2, 1) = s;
|
|
77
|
+
m.at(2, 2) = c;
|
|
78
|
+
return m;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
Mat4x4 Mat4x4::rotationXW(float angle) noexcept {
|
|
82
|
+
float c = std::cos(angle);
|
|
83
|
+
float s = std::sin(angle);
|
|
84
|
+
|
|
85
|
+
Mat4x4 m = identity();
|
|
86
|
+
m.at(0, 0) = c;
|
|
87
|
+
m.at(0, 3) = -s;
|
|
88
|
+
m.at(3, 0) = s;
|
|
89
|
+
m.at(3, 3) = c;
|
|
90
|
+
return m;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
Mat4x4 Mat4x4::rotationYW(float angle) noexcept {
|
|
94
|
+
float c = std::cos(angle);
|
|
95
|
+
float s = std::sin(angle);
|
|
96
|
+
|
|
97
|
+
Mat4x4 m = identity();
|
|
98
|
+
m.at(1, 1) = c;
|
|
99
|
+
m.at(1, 3) = -s;
|
|
100
|
+
m.at(3, 1) = s;
|
|
101
|
+
m.at(3, 3) = c;
|
|
102
|
+
return m;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
Mat4x4 Mat4x4::rotationZW(float angle) noexcept {
|
|
106
|
+
float c = std::cos(angle);
|
|
107
|
+
float s = std::sin(angle);
|
|
108
|
+
|
|
109
|
+
Mat4x4 m = identity();
|
|
110
|
+
m.at(2, 2) = c;
|
|
111
|
+
m.at(2, 3) = -s;
|
|
112
|
+
m.at(3, 2) = s;
|
|
113
|
+
m.at(3, 3) = c;
|
|
114
|
+
return m;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
Mat4x4 Mat4x4::rotationFromAngles(float xy, float xz, float yz,
|
|
118
|
+
float xw, float yw, float zw) noexcept {
|
|
119
|
+
// Compose rotations: XY * XZ * YZ * XW * YW * ZW
|
|
120
|
+
Mat4x4 result = identity();
|
|
121
|
+
|
|
122
|
+
if (std::abs(xy) > 1e-8f) result *= rotationXY(xy);
|
|
123
|
+
if (std::abs(xz) > 1e-8f) result *= rotationXZ(xz);
|
|
124
|
+
if (std::abs(yz) > 1e-8f) result *= rotationYZ(yz);
|
|
125
|
+
if (std::abs(xw) > 1e-8f) result *= rotationXW(xw);
|
|
126
|
+
if (std::abs(yw) > 1e-8f) result *= rotationYW(yw);
|
|
127
|
+
if (std::abs(zw) > 1e-8f) result *= rotationZW(zw);
|
|
128
|
+
|
|
129
|
+
return result;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
Mat4x4 Mat4x4::rotationFromAngles(const std::array<float, 6>& angles) noexcept {
|
|
133
|
+
return rotationFromAngles(angles[0], angles[1], angles[2],
|
|
134
|
+
angles[3], angles[4], angles[5]);
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
// Scale matrices
|
|
138
|
+
|
|
139
|
+
Mat4x4 Mat4x4::scale(float sx, float sy, float sz, float sw) noexcept {
|
|
140
|
+
Mat4x4 m;
|
|
141
|
+
m.at(0, 0) = sx;
|
|
142
|
+
m.at(1, 1) = sy;
|
|
143
|
+
m.at(2, 2) = sz;
|
|
144
|
+
m.at(3, 3) = sw;
|
|
145
|
+
return m;
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
Mat4x4 Mat4x4::scale(float uniform) noexcept {
|
|
149
|
+
return scale(uniform, uniform, uniform, uniform);
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
Mat4x4 Mat4x4::scale(const Vec4& s) noexcept {
|
|
153
|
+
return scale(s.x, s.y, s.z, s.w);
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
// Translation (homogeneous coordinates style)
|
|
157
|
+
|
|
158
|
+
Mat4x4 Mat4x4::translation(float tx, float ty, float tz, float tw) noexcept {
|
|
159
|
+
Mat4x4 m = identity();
|
|
160
|
+
m.at(0, 3) = tx;
|
|
161
|
+
m.at(1, 3) = ty;
|
|
162
|
+
m.at(2, 3) = tz;
|
|
163
|
+
m.at(3, 3) = 1.0f + tw;
|
|
164
|
+
return m;
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
Mat4x4 Mat4x4::translation(const Vec4& t) noexcept {
|
|
168
|
+
return translation(t.x, t.y, t.z, t.w);
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
// Element access
|
|
172
|
+
|
|
173
|
+
float& Mat4x4::at(size_t row, size_t col) noexcept {
|
|
174
|
+
return data[col * 4 + row]; // Column-major
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
const float& Mat4x4::at(size_t row, size_t col) const noexcept {
|
|
178
|
+
return data[col * 4 + row];
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
Vec4 Mat4x4::column(size_t col) const noexcept {
|
|
182
|
+
size_t base = col * 4;
|
|
183
|
+
return Vec4(data[base], data[base + 1], data[base + 2], data[base + 3]);
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
void Mat4x4::setColumn(size_t col, const Vec4& v) noexcept {
|
|
187
|
+
size_t base = col * 4;
|
|
188
|
+
data[base] = v.x;
|
|
189
|
+
data[base + 1] = v.y;
|
|
190
|
+
data[base + 2] = v.z;
|
|
191
|
+
data[base + 3] = v.w;
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
Vec4 Mat4x4::row(size_t r) const noexcept {
|
|
195
|
+
return Vec4(at(r, 0), at(r, 1), at(r, 2), at(r, 3));
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
void Mat4x4::setRow(size_t r, const Vec4& v) noexcept {
|
|
199
|
+
at(r, 0) = v.x;
|
|
200
|
+
at(r, 1) = v.y;
|
|
201
|
+
at(r, 2) = v.z;
|
|
202
|
+
at(r, 3) = v.w;
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
// Matrix operations
|
|
206
|
+
|
|
207
|
+
Mat4x4 Mat4x4::operator*(const Mat4x4& other) const noexcept {
|
|
208
|
+
Mat4x4 result;
|
|
209
|
+
|
|
210
|
+
for (size_t col = 0; col < 4; ++col) {
|
|
211
|
+
Vec4 c = other.column(col);
|
|
212
|
+
result.setColumn(col, *this * c);
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
return result;
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
Mat4x4& Mat4x4::operator*=(const Mat4x4& other) noexcept {
|
|
219
|
+
*this = *this * other;
|
|
220
|
+
return *this;
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
Vec4 Mat4x4::operator*(const Vec4& v) const noexcept {
|
|
224
|
+
return Vec4(
|
|
225
|
+
at(0, 0) * v.x + at(0, 1) * v.y + at(0, 2) * v.z + at(0, 3) * v.w,
|
|
226
|
+
at(1, 0) * v.x + at(1, 1) * v.y + at(1, 2) * v.z + at(1, 3) * v.w,
|
|
227
|
+
at(2, 0) * v.x + at(2, 1) * v.y + at(2, 2) * v.z + at(2, 3) * v.w,
|
|
228
|
+
at(3, 0) * v.x + at(3, 1) * v.y + at(3, 2) * v.z + at(3, 3) * v.w
|
|
229
|
+
);
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
Vec4 Mat4x4::multiplyVec4(const Vec4& v) const noexcept {
|
|
233
|
+
return *this * v;
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
Mat4x4 Mat4x4::operator*(float scalar) const noexcept {
|
|
237
|
+
Mat4x4 result;
|
|
238
|
+
for (size_t i = 0; i < 16; ++i) {
|
|
239
|
+
result.data[i] = data[i] * scalar;
|
|
240
|
+
}
|
|
241
|
+
return result;
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
Mat4x4& Mat4x4::operator*=(float scalar) noexcept {
|
|
245
|
+
for (float& elem : data) {
|
|
246
|
+
elem *= scalar;
|
|
247
|
+
}
|
|
248
|
+
return *this;
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
Mat4x4 Mat4x4::operator+(const Mat4x4& other) const noexcept {
|
|
252
|
+
Mat4x4 result;
|
|
253
|
+
for (size_t i = 0; i < 16; ++i) {
|
|
254
|
+
result.data[i] = data[i] + other.data[i];
|
|
255
|
+
}
|
|
256
|
+
return result;
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
Mat4x4& Mat4x4::operator+=(const Mat4x4& other) noexcept {
|
|
260
|
+
for (size_t i = 0; i < 16; ++i) {
|
|
261
|
+
data[i] += other.data[i];
|
|
262
|
+
}
|
|
263
|
+
return *this;
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
Mat4x4 Mat4x4::operator-(const Mat4x4& other) const noexcept {
|
|
267
|
+
Mat4x4 result;
|
|
268
|
+
for (size_t i = 0; i < 16; ++i) {
|
|
269
|
+
result.data[i] = data[i] - other.data[i];
|
|
270
|
+
}
|
|
271
|
+
return result;
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
Mat4x4& Mat4x4::operator-=(const Mat4x4& other) noexcept {
|
|
275
|
+
for (size_t i = 0; i < 16; ++i) {
|
|
276
|
+
data[i] -= other.data[i];
|
|
277
|
+
}
|
|
278
|
+
return *this;
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
Mat4x4 Mat4x4::transposed() const noexcept {
|
|
282
|
+
Mat4x4 result;
|
|
283
|
+
for (size_t r = 0; r < 4; ++r) {
|
|
284
|
+
for (size_t c = 0; c < 4; ++c) {
|
|
285
|
+
result.at(c, r) = at(r, c);
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
return result;
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
void Mat4x4::transpose() noexcept {
|
|
292
|
+
std::swap(at(0, 1), at(1, 0));
|
|
293
|
+
std::swap(at(0, 2), at(2, 0));
|
|
294
|
+
std::swap(at(0, 3), at(3, 0));
|
|
295
|
+
std::swap(at(1, 2), at(2, 1));
|
|
296
|
+
std::swap(at(1, 3), at(3, 1));
|
|
297
|
+
std::swap(at(2, 3), at(3, 2));
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
// Determinant using cofactor expansion
|
|
301
|
+
|
|
302
|
+
float Mat4x4::determinant() const noexcept {
|
|
303
|
+
float a00 = at(0, 0), a01 = at(0, 1), a02 = at(0, 2), a03 = at(0, 3);
|
|
304
|
+
float a10 = at(1, 0), a11 = at(1, 1), a12 = at(1, 2), a13 = at(1, 3);
|
|
305
|
+
float a20 = at(2, 0), a21 = at(2, 1), a22 = at(2, 2), a23 = at(2, 3);
|
|
306
|
+
float a30 = at(3, 0), a31 = at(3, 1), a32 = at(3, 2), a33 = at(3, 3);
|
|
307
|
+
|
|
308
|
+
float b00 = a00 * a11 - a01 * a10;
|
|
309
|
+
float b01 = a00 * a12 - a02 * a10;
|
|
310
|
+
float b02 = a00 * a13 - a03 * a10;
|
|
311
|
+
float b03 = a01 * a12 - a02 * a11;
|
|
312
|
+
float b04 = a01 * a13 - a03 * a11;
|
|
313
|
+
float b05 = a02 * a13 - a03 * a12;
|
|
314
|
+
float b06 = a20 * a31 - a21 * a30;
|
|
315
|
+
float b07 = a20 * a32 - a22 * a30;
|
|
316
|
+
float b08 = a20 * a33 - a23 * a30;
|
|
317
|
+
float b09 = a21 * a32 - a22 * a31;
|
|
318
|
+
float b10 = a21 * a33 - a23 * a31;
|
|
319
|
+
float b11 = a22 * a33 - a23 * a32;
|
|
320
|
+
|
|
321
|
+
return b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06;
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
// Inverse using adjugate method
|
|
325
|
+
|
|
326
|
+
Mat4x4 Mat4x4::inverse() const noexcept {
|
|
327
|
+
float a00 = at(0, 0), a01 = at(0, 1), a02 = at(0, 2), a03 = at(0, 3);
|
|
328
|
+
float a10 = at(1, 0), a11 = at(1, 1), a12 = at(1, 2), a13 = at(1, 3);
|
|
329
|
+
float a20 = at(2, 0), a21 = at(2, 1), a22 = at(2, 2), a23 = at(2, 3);
|
|
330
|
+
float a30 = at(3, 0), a31 = at(3, 1), a32 = at(3, 2), a33 = at(3, 3);
|
|
331
|
+
|
|
332
|
+
float b00 = a00 * a11 - a01 * a10;
|
|
333
|
+
float b01 = a00 * a12 - a02 * a10;
|
|
334
|
+
float b02 = a00 * a13 - a03 * a10;
|
|
335
|
+
float b03 = a01 * a12 - a02 * a11;
|
|
336
|
+
float b04 = a01 * a13 - a03 * a11;
|
|
337
|
+
float b05 = a02 * a13 - a03 * a12;
|
|
338
|
+
float b06 = a20 * a31 - a21 * a30;
|
|
339
|
+
float b07 = a20 * a32 - a22 * a30;
|
|
340
|
+
float b08 = a20 * a33 - a23 * a30;
|
|
341
|
+
float b09 = a21 * a32 - a22 * a31;
|
|
342
|
+
float b10 = a21 * a33 - a23 * a31;
|
|
343
|
+
float b11 = a22 * a33 - a23 * a32;
|
|
344
|
+
|
|
345
|
+
float det = b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06;
|
|
346
|
+
|
|
347
|
+
if (std::abs(det) < 1e-10f) {
|
|
348
|
+
return identity(); // Singular matrix
|
|
349
|
+
}
|
|
350
|
+
|
|
351
|
+
float invDet = 1.0f / det;
|
|
352
|
+
|
|
353
|
+
Mat4x4 result;
|
|
354
|
+
result.at(0, 0) = (a11 * b11 - a12 * b10 + a13 * b09) * invDet;
|
|
355
|
+
result.at(0, 1) = (-a01 * b11 + a02 * b10 - a03 * b09) * invDet;
|
|
356
|
+
result.at(0, 2) = (a31 * b05 - a32 * b04 + a33 * b03) * invDet;
|
|
357
|
+
result.at(0, 3) = (-a21 * b05 + a22 * b04 - a23 * b03) * invDet;
|
|
358
|
+
result.at(1, 0) = (-a10 * b11 + a12 * b08 - a13 * b07) * invDet;
|
|
359
|
+
result.at(1, 1) = (a00 * b11 - a02 * b08 + a03 * b07) * invDet;
|
|
360
|
+
result.at(1, 2) = (-a30 * b05 + a32 * b02 - a33 * b01) * invDet;
|
|
361
|
+
result.at(1, 3) = (a20 * b05 - a22 * b02 + a23 * b01) * invDet;
|
|
362
|
+
result.at(2, 0) = (a10 * b10 - a11 * b08 + a13 * b06) * invDet;
|
|
363
|
+
result.at(2, 1) = (-a00 * b10 + a01 * b08 - a03 * b06) * invDet;
|
|
364
|
+
result.at(2, 2) = (a30 * b04 - a31 * b02 + a33 * b00) * invDet;
|
|
365
|
+
result.at(2, 3) = (-a20 * b04 + a21 * b02 - a23 * b00) * invDet;
|
|
366
|
+
result.at(3, 0) = (-a10 * b09 + a11 * b07 - a12 * b06) * invDet;
|
|
367
|
+
result.at(3, 1) = (a00 * b09 - a01 * b07 + a02 * b06) * invDet;
|
|
368
|
+
result.at(3, 2) = (-a30 * b03 + a31 * b01 - a32 * b00) * invDet;
|
|
369
|
+
result.at(3, 3) = (a20 * b03 - a21 * b01 + a22 * b00) * invDet;
|
|
370
|
+
|
|
371
|
+
return result;
|
|
372
|
+
}
|
|
373
|
+
|
|
374
|
+
bool Mat4x4::isOrthogonal(float epsilon) const noexcept {
|
|
375
|
+
// Check if M * M^T = I
|
|
376
|
+
Mat4x4 product = *this * transposed();
|
|
377
|
+
|
|
378
|
+
for (size_t i = 0; i < 4; ++i) {
|
|
379
|
+
for (size_t j = 0; j < 4; ++j) {
|
|
380
|
+
float expected = (i == j) ? 1.0f : 0.0f;
|
|
381
|
+
if (std::abs(product.at(i, j) - expected) > epsilon) {
|
|
382
|
+
return false;
|
|
383
|
+
}
|
|
384
|
+
}
|
|
385
|
+
}
|
|
386
|
+
return true;
|
|
387
|
+
}
|
|
388
|
+
|
|
389
|
+
bool Mat4x4::isIdentity(float epsilon) const noexcept {
|
|
390
|
+
for (size_t i = 0; i < 4; ++i) {
|
|
391
|
+
for (size_t j = 0; j < 4; ++j) {
|
|
392
|
+
float expected = (i == j) ? 1.0f : 0.0f;
|
|
393
|
+
if (std::abs(at(i, j) - expected) > epsilon) {
|
|
394
|
+
return false;
|
|
395
|
+
}
|
|
396
|
+
}
|
|
397
|
+
}
|
|
398
|
+
return true;
|
|
399
|
+
}
|
|
400
|
+
|
|
401
|
+
bool Mat4x4::operator==(const Mat4x4& other) const noexcept {
|
|
402
|
+
return data == other.data;
|
|
403
|
+
}
|
|
404
|
+
|
|
405
|
+
bool Mat4x4::operator!=(const Mat4x4& other) const noexcept {
|
|
406
|
+
return !(*this == other);
|
|
407
|
+
}
|
|
408
|
+
|
|
409
|
+
} // namespace vib3
|
|
@@ -0,0 +1,209 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Mat4x4.hpp - 4x4 Matrix for VIB3+ SDK
|
|
3
|
+
*
|
|
4
|
+
* Column-major layout for direct GPU upload.
|
|
5
|
+
* All 6 rotation plane matrices for 4D rotation.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
#pragma once
|
|
9
|
+
|
|
10
|
+
#include "Vec4.hpp"
|
|
11
|
+
#include <array>
|
|
12
|
+
|
|
13
|
+
namespace vib3 {
|
|
14
|
+
|
|
15
|
+
// Forward declaration
|
|
16
|
+
class Rotor4D;
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* 4x4 Matrix class (column-major)
|
|
20
|
+
*
|
|
21
|
+
* Layout: [col0, col1, col2, col3] where each column is Vec4
|
|
22
|
+
* Element access: m[col][row] or m.at(row, col)
|
|
23
|
+
*/
|
|
24
|
+
class alignas(64) Mat4x4 {
|
|
25
|
+
public:
|
|
26
|
+
std::array<float, 16> data;
|
|
27
|
+
|
|
28
|
+
// Constructors
|
|
29
|
+
Mat4x4() noexcept;
|
|
30
|
+
explicit Mat4x4(float diagonal) noexcept;
|
|
31
|
+
Mat4x4(const std::array<float, 16>& elements) noexcept;
|
|
32
|
+
Mat4x4(const Vec4& col0, const Vec4& col1, const Vec4& col2, const Vec4& col3) noexcept;
|
|
33
|
+
|
|
34
|
+
// Static factories
|
|
35
|
+
static Mat4x4 identity() noexcept;
|
|
36
|
+
static Mat4x4 zero() noexcept;
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Create rotation matrix for XY plane (around Z axis in 3D)
|
|
40
|
+
*/
|
|
41
|
+
static Mat4x4 rotationXY(float angle) noexcept;
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* Create rotation matrix for XZ plane (around Y axis in 3D)
|
|
45
|
+
*/
|
|
46
|
+
static Mat4x4 rotationXZ(float angle) noexcept;
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* Create rotation matrix for YZ plane (around X axis in 3D)
|
|
50
|
+
*/
|
|
51
|
+
static Mat4x4 rotationYZ(float angle) noexcept;
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* Create rotation matrix for XW plane (4D rotation)
|
|
55
|
+
*/
|
|
56
|
+
static Mat4x4 rotationXW(float angle) noexcept;
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* Create rotation matrix for YW plane (4D rotation)
|
|
60
|
+
*/
|
|
61
|
+
static Mat4x4 rotationYW(float angle) noexcept;
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* Create rotation matrix for ZW plane (4D rotation)
|
|
65
|
+
*/
|
|
66
|
+
static Mat4x4 rotationZW(float angle) noexcept;
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* Create combined rotation from all 6 angles
|
|
70
|
+
* Order: XY * XZ * YZ * XW * YW * ZW
|
|
71
|
+
*/
|
|
72
|
+
static Mat4x4 rotationFromAngles(float xy, float xz, float yz,
|
|
73
|
+
float xw, float yw, float zw) noexcept;
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* Create combined rotation from angle array
|
|
77
|
+
*/
|
|
78
|
+
static Mat4x4 rotationFromAngles(const std::array<float, 6>& angles) noexcept;
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* Create scale matrix
|
|
82
|
+
*/
|
|
83
|
+
static Mat4x4 scale(float sx, float sy, float sz, float sw) noexcept;
|
|
84
|
+
static Mat4x4 scale(float uniform) noexcept;
|
|
85
|
+
static Mat4x4 scale(const Vec4& s) noexcept;
|
|
86
|
+
|
|
87
|
+
/**
|
|
88
|
+
* Create translation matrix (in homogeneous coordinates)
|
|
89
|
+
* Note: Standard 4D doesn't use translation matrices the same way
|
|
90
|
+
*/
|
|
91
|
+
static Mat4x4 translation(float tx, float ty, float tz, float tw = 0) noexcept;
|
|
92
|
+
static Mat4x4 translation(const Vec4& t) noexcept;
|
|
93
|
+
|
|
94
|
+
// Element access
|
|
95
|
+
|
|
96
|
+
/**
|
|
97
|
+
* Access element (row, col) - note: stored column-major
|
|
98
|
+
*/
|
|
99
|
+
float& at(size_t row, size_t col) noexcept;
|
|
100
|
+
const float& at(size_t row, size_t col) const noexcept;
|
|
101
|
+
|
|
102
|
+
/**
|
|
103
|
+
* Get column as Vec4
|
|
104
|
+
*/
|
|
105
|
+
Vec4 column(size_t col) const noexcept;
|
|
106
|
+
|
|
107
|
+
/**
|
|
108
|
+
* Set column from Vec4
|
|
109
|
+
*/
|
|
110
|
+
void setColumn(size_t col, const Vec4& v) noexcept;
|
|
111
|
+
|
|
112
|
+
/**
|
|
113
|
+
* Get row as Vec4
|
|
114
|
+
*/
|
|
115
|
+
Vec4 row(size_t row) const noexcept;
|
|
116
|
+
|
|
117
|
+
/**
|
|
118
|
+
* Set row from Vec4
|
|
119
|
+
*/
|
|
120
|
+
void setRow(size_t row, const Vec4& v) noexcept;
|
|
121
|
+
|
|
122
|
+
// Matrix operations
|
|
123
|
+
|
|
124
|
+
/**
|
|
125
|
+
* Matrix multiplication
|
|
126
|
+
*/
|
|
127
|
+
Mat4x4 operator*(const Mat4x4& other) const noexcept;
|
|
128
|
+
|
|
129
|
+
/**
|
|
130
|
+
* Compound multiplication
|
|
131
|
+
*/
|
|
132
|
+
Mat4x4& operator*=(const Mat4x4& other) noexcept;
|
|
133
|
+
|
|
134
|
+
/**
|
|
135
|
+
* Transform a Vec4
|
|
136
|
+
*/
|
|
137
|
+
Vec4 operator*(const Vec4& v) const noexcept;
|
|
138
|
+
|
|
139
|
+
/**
|
|
140
|
+
* Scalar multiplication
|
|
141
|
+
*/
|
|
142
|
+
Mat4x4 operator*(float scalar) const noexcept;
|
|
143
|
+
Mat4x4& operator*=(float scalar) noexcept;
|
|
144
|
+
|
|
145
|
+
/**
|
|
146
|
+
* Matrix addition
|
|
147
|
+
*/
|
|
148
|
+
Mat4x4 operator+(const Mat4x4& other) const noexcept;
|
|
149
|
+
Mat4x4& operator+=(const Mat4x4& other) noexcept;
|
|
150
|
+
|
|
151
|
+
/**
|
|
152
|
+
* Matrix subtraction
|
|
153
|
+
*/
|
|
154
|
+
Mat4x4 operator-(const Mat4x4& other) const noexcept;
|
|
155
|
+
Mat4x4& operator-=(const Mat4x4& other) noexcept;
|
|
156
|
+
|
|
157
|
+
/**
|
|
158
|
+
* Transpose
|
|
159
|
+
*/
|
|
160
|
+
Mat4x4 transposed() const noexcept;
|
|
161
|
+
|
|
162
|
+
/**
|
|
163
|
+
* Transpose in place
|
|
164
|
+
*/
|
|
165
|
+
void transpose() noexcept;
|
|
166
|
+
|
|
167
|
+
/**
|
|
168
|
+
* Determinant
|
|
169
|
+
*/
|
|
170
|
+
float determinant() const noexcept;
|
|
171
|
+
|
|
172
|
+
/**
|
|
173
|
+
* Inverse (returns identity if singular)
|
|
174
|
+
*/
|
|
175
|
+
Mat4x4 inverse() const noexcept;
|
|
176
|
+
|
|
177
|
+
/**
|
|
178
|
+
* Check if orthogonal (columns are orthonormal)
|
|
179
|
+
*/
|
|
180
|
+
bool isOrthogonal(float epsilon = 1e-5f) const noexcept;
|
|
181
|
+
|
|
182
|
+
/**
|
|
183
|
+
* Check if identity matrix
|
|
184
|
+
*/
|
|
185
|
+
bool isIdentity(float epsilon = 1e-5f) const noexcept;
|
|
186
|
+
|
|
187
|
+
// Comparison
|
|
188
|
+
|
|
189
|
+
bool operator==(const Mat4x4& other) const noexcept;
|
|
190
|
+
bool operator!=(const Mat4x4& other) const noexcept;
|
|
191
|
+
|
|
192
|
+
/**
|
|
193
|
+
* Get pointer to data for GPU upload
|
|
194
|
+
*/
|
|
195
|
+
const float* ptr() const noexcept { return data.data(); }
|
|
196
|
+
float* ptr() noexcept { return data.data(); }
|
|
197
|
+
|
|
198
|
+
/**
|
|
199
|
+
* Transform Vec4 (same as operator*)
|
|
200
|
+
*/
|
|
201
|
+
Vec4 multiplyVec4(const Vec4& v) const noexcept;
|
|
202
|
+
};
|
|
203
|
+
|
|
204
|
+
// Free function operators
|
|
205
|
+
inline Mat4x4 operator*(float scalar, const Mat4x4& m) noexcept {
|
|
206
|
+
return m * scalar;
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
} // namespace vib3
|