@vib3code/sdk 2.0.1 → 2.0.3-canary.6f35b4c

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.
Files changed (96) hide show
  1. package/CHANGELOG.md +36 -0
  2. package/DOCS/AGENT_HARNESS_ARCHITECTURE.md +243 -0
  3. package/DOCS/CLI_ONBOARDING.md +1 -1
  4. package/DOCS/CROSS_SITE_DESIGN_PATTERNS.md +117 -0
  5. package/DOCS/EPIC_SCROLL_EVENTS.md +773 -0
  6. package/DOCS/HANDOFF_LANDING_PAGE.md +154 -0
  7. package/DOCS/HANDOFF_SDK_DEVELOPMENT.md +493 -0
  8. package/DOCS/MULTIVIZ_CHOREOGRAPHY_PATTERNS.md +937 -0
  9. package/DOCS/PRODUCT_STRATEGY.md +63 -0
  10. package/DOCS/README.md +103 -0
  11. package/DOCS/REFERENCE_SCROLL_ANALYSIS.md +97 -0
  12. package/DOCS/ROADMAP.md +111 -0
  13. package/DOCS/SCROLL_TIMELINE_v3.md +269 -0
  14. package/DOCS/SITE_REFACTOR_PLAN.md +100 -0
  15. package/DOCS/STATUS.md +24 -0
  16. package/DOCS/SYSTEM_INVENTORY.md +33 -30
  17. package/DOCS/VISUAL_ANALYSIS_CLICKERSS.md +85 -0
  18. package/DOCS/VISUAL_ANALYSIS_FACETAD.md +133 -0
  19. package/DOCS/VISUAL_ANALYSIS_SIMONE.md +95 -0
  20. package/DOCS/VISUAL_ANALYSIS_TABLESIDE.md +86 -0
  21. package/DOCS/{BLUEPRINT_EXECUTION_PLAN_2026-01-07.md → archive/BLUEPRINT_EXECUTION_PLAN_2026-01-07.md} +1 -1
  22. package/DOCS/{DEV_TRACK_ANALYSIS.md → archive/DEV_TRACK_ANALYSIS.md} +3 -0
  23. package/DOCS/{SYSTEM_AUDIT_2026-01-30.md → archive/SYSTEM_AUDIT_2026-01-30.md} +3 -0
  24. package/DOCS/{DEV_TRACK_SESSION_2026-01-31.md → dev-tracks/DEV_TRACK_SESSION_2026-01-31.md} +1 -1
  25. package/DOCS/dev-tracks/DEV_TRACK_SESSION_2026-02-06.md +231 -0
  26. package/DOCS/dev-tracks/DEV_TRACK_SESSION_2026-02-13.md +127 -0
  27. package/DOCS/dev-tracks/README.md +10 -0
  28. package/README.md +26 -13
  29. package/cpp/CMakeLists.txt +236 -0
  30. package/cpp/bindings/embind.cpp +269 -0
  31. package/cpp/build.sh +129 -0
  32. package/cpp/geometry/Crystal.cpp +103 -0
  33. package/cpp/geometry/Fractal.cpp +136 -0
  34. package/cpp/geometry/GeometryGenerator.cpp +262 -0
  35. package/cpp/geometry/KleinBottle.cpp +71 -0
  36. package/cpp/geometry/Sphere.cpp +134 -0
  37. package/cpp/geometry/Tesseract.cpp +94 -0
  38. package/cpp/geometry/Tetrahedron.cpp +83 -0
  39. package/cpp/geometry/Torus.cpp +65 -0
  40. package/cpp/geometry/WarpFunctions.cpp +238 -0
  41. package/cpp/geometry/Wave.cpp +85 -0
  42. package/cpp/include/vib3_ffi.h +238 -0
  43. package/cpp/math/Mat4x4.cpp +409 -0
  44. package/cpp/math/Mat4x4.hpp +209 -0
  45. package/cpp/math/Projection.cpp +142 -0
  46. package/cpp/math/Projection.hpp +148 -0
  47. package/cpp/math/Rotor4D.cpp +322 -0
  48. package/cpp/math/Rotor4D.hpp +204 -0
  49. package/cpp/math/Vec4.cpp +303 -0
  50. package/cpp/math/Vec4.hpp +225 -0
  51. package/cpp/src/vib3_ffi.cpp +607 -0
  52. package/cpp/tests/Geometry_test.cpp +213 -0
  53. package/cpp/tests/Mat4x4_test.cpp +494 -0
  54. package/cpp/tests/Projection_test.cpp +298 -0
  55. package/cpp/tests/Rotor4D_test.cpp +423 -0
  56. package/cpp/tests/Vec4_test.cpp +489 -0
  57. package/package.json +31 -27
  58. package/src/agent/mcp/MCPServer.js +722 -0
  59. package/src/agent/mcp/stdio-server.js +264 -0
  60. package/src/agent/mcp/tools.js +367 -0
  61. package/src/cli/index.js +0 -0
  62. package/src/core/CanvasManager.js +97 -204
  63. package/src/core/ErrorReporter.js +1 -1
  64. package/src/core/Parameters.js +1 -1
  65. package/src/core/VIB3Engine.js +38 -1
  66. package/src/core/VitalitySystem.js +53 -0
  67. package/src/core/renderers/HolographicRendererAdapter.js +2 -2
  68. package/src/creative/AestheticMapper.js +628 -0
  69. package/src/creative/ChoreographyPlayer.js +481 -0
  70. package/src/export/TradingCardManager.js +3 -4
  71. package/src/faceted/FacetedSystem.js +237 -388
  72. package/src/holograms/HolographicVisualizer.js +29 -12
  73. package/src/holograms/RealHolographicSystem.js +68 -12
  74. package/src/polychora/PolychoraSystem.js +77 -0
  75. package/src/quantum/QuantumEngine.js +103 -66
  76. package/src/quantum/QuantumVisualizer.js +7 -2
  77. package/src/render/UnifiedRenderBridge.js +3 -0
  78. package/src/shaders/faceted/faceted.frag.glsl +220 -80
  79. package/src/shaders/faceted/faceted.frag.wgsl +138 -97
  80. package/src/shaders/holographic/holographic.frag.glsl +28 -9
  81. package/src/shaders/holographic/holographic.frag.wgsl +107 -38
  82. package/src/shaders/quantum/quantum.frag.glsl +1 -0
  83. package/src/shaders/quantum/quantum.frag.wgsl +1 -1
  84. package/src/viewer/index.js +1 -1
  85. package/tools/headless-renderer.js +258 -0
  86. package/tools/shader-sync-verify.js +8 -4
  87. package/tools/site-analysis/all-reports.json +32 -0
  88. package/tools/site-analysis/combined-analysis.md +50 -0
  89. package/tools/site-analyzer.mjs +779 -0
  90. package/tools/visual-catalog/capture.js +276 -0
  91. package/tools/visual-catalog/composite.js +138 -0
  92. /package/DOCS/{DEV_TRACK_PLAN_2026-01-07.md → archive/DEV_TRACK_PLAN_2026-01-07.md} +0 -0
  93. /package/DOCS/{SESSION_014_PLAN.md → archive/SESSION_014_PLAN.md} +0 -0
  94. /package/DOCS/{SESSION_LOG_2026-01-07.md → archive/SESSION_LOG_2026-01-07.md} +0 -0
  95. /package/DOCS/{STRATEGIC_BLUEPRINT_2026-01-07.md → archive/STRATEGIC_BLUEPRINT_2026-01-07.md} +0 -0
  96. /package/src/viewer/{ReactivityManager.js → ViewerInputHandler.js} +0 -0
@@ -0,0 +1,298 @@
1
+ /**
2
+ * Projection_test.cpp - Unit tests for 4D to 3D projection functions
3
+ *
4
+ * Tests perspective, stereographic, orthographic, oblique, and slice projections.
5
+ */
6
+
7
+ #include <gtest/gtest.h>
8
+ #include "math/Projection.hpp"
9
+ #include "math/Vec4.hpp"
10
+ #include <cmath>
11
+
12
+ using namespace vib3;
13
+
14
+ static constexpr float kEpsilon = 1e-5f;
15
+
16
+ // ============================================================================
17
+ // Perspective Projection
18
+ // ============================================================================
19
+
20
+ TEST(Projection, PerspectiveOriginStaysAtOrigin) {
21
+ Vec4 v(0.0f, 0.0f, 0.0f, 0.0f);
22
+ Projection3D p = projectPerspective(v, 2.0f);
23
+ EXPECT_NEAR(p.x, 0.0f, kEpsilon);
24
+ EXPECT_NEAR(p.y, 0.0f, kEpsilon);
25
+ EXPECT_NEAR(p.z, 0.0f, kEpsilon);
26
+ }
27
+
28
+ TEST(Projection, PerspectiveUnitXAtWZero) {
29
+ // P = x * d / (d - w) = 1 * 2 / (2 - 0) = 1
30
+ Vec4 v(1.0f, 0.0f, 0.0f, 0.0f);
31
+ Projection3D p = projectPerspective(v, 2.0f);
32
+ EXPECT_NEAR(p.x, 1.0f, kEpsilon);
33
+ EXPECT_NEAR(p.y, 0.0f, kEpsilon);
34
+ EXPECT_NEAR(p.z, 0.0f, kEpsilon);
35
+ }
36
+
37
+ TEST(Projection, PerspectiveScalesWithW) {
38
+ // Point with w=1, d=2: factor = 2/(2-1) = 2
39
+ Vec4 v(1.0f, 1.0f, 1.0f, 1.0f);
40
+ Projection3D p = projectPerspective(v, 2.0f);
41
+ EXPECT_NEAR(p.x, 2.0f, kEpsilon);
42
+ EXPECT_NEAR(p.y, 2.0f, kEpsilon);
43
+ EXPECT_NEAR(p.z, 2.0f, kEpsilon);
44
+ }
45
+
46
+ TEST(Projection, PerspectiveWithNegativeW) {
47
+ // Point with w=-1, d=2: factor = 2/(2-(-1)) = 2/3
48
+ Vec4 v(3.0f, 0.0f, 0.0f, -1.0f);
49
+ Projection3D p = projectPerspective(v, 2.0f);
50
+ EXPECT_NEAR(p.x, 2.0f, kEpsilon);
51
+ EXPECT_NEAR(p.y, 0.0f, kEpsilon);
52
+ EXPECT_NEAR(p.z, 0.0f, kEpsilon);
53
+ }
54
+
55
+ TEST(Projection, PerspectiveDefaultDistance) {
56
+ // Default distance is 2.0
57
+ Vec4 v(1.0f, 0.0f, 0.0f, 0.0f);
58
+ Projection3D p = projectPerspective(v);
59
+ EXPECT_NEAR(p.x, 1.0f, kEpsilon);
60
+ }
61
+
62
+ // ============================================================================
63
+ // Stereographic Projection
64
+ // ============================================================================
65
+
66
+ TEST(Projection, StereographicOriginStaysAtOrigin) {
67
+ Vec4 v(0.0f, 0.0f, 0.0f, 0.0f);
68
+ Projection3D p = projectStereographic(v);
69
+ EXPECT_NEAR(p.x, 0.0f, kEpsilon);
70
+ EXPECT_NEAR(p.y, 0.0f, kEpsilon);
71
+ EXPECT_NEAR(p.z, 0.0f, kEpsilon);
72
+ }
73
+
74
+ TEST(Projection, StereographicUnitXAtWZero) {
75
+ // P = x / (1 - w) = 1 / (1 - 0) = 1
76
+ Vec4 v(1.0f, 0.0f, 0.0f, 0.0f);
77
+ Projection3D p = projectStereographic(v);
78
+ EXPECT_NEAR(p.x, 1.0f, kEpsilon);
79
+ EXPECT_NEAR(p.y, 0.0f, kEpsilon);
80
+ EXPECT_NEAR(p.z, 0.0f, kEpsilon);
81
+ }
82
+
83
+ TEST(Projection, StereographicWithNegativeW) {
84
+ // P = x / (1 - w) = 1 / (1 - (-1)) = 1/2 = 0.5
85
+ Vec4 v(1.0f, 0.0f, 0.0f, -1.0f);
86
+ Projection3D p = projectStereographic(v);
87
+ EXPECT_NEAR(p.x, 0.5f, kEpsilon);
88
+ EXPECT_NEAR(p.y, 0.0f, kEpsilon);
89
+ }
90
+
91
+ TEST(Projection, StereographicAllComponents) {
92
+ // P = xyz / (1 - w) = (2, 4, 6) / (1 - 0.5) = (4, 8, 12)
93
+ Vec4 v(2.0f, 4.0f, 6.0f, 0.5f);
94
+ Projection3D p = projectStereographic(v);
95
+ EXPECT_NEAR(p.x, 4.0f, kEpsilon);
96
+ EXPECT_NEAR(p.y, 8.0f, kEpsilon);
97
+ EXPECT_NEAR(p.z, 12.0f, kEpsilon);
98
+ }
99
+
100
+ // ============================================================================
101
+ // Orthographic Projection
102
+ // ============================================================================
103
+
104
+ TEST(Projection, OrthographicDropsW) {
105
+ Vec4 v(1.0f, 2.0f, 3.0f, 99.0f);
106
+ Projection3D p = projectOrthographic(v);
107
+ EXPECT_NEAR(p.x, 1.0f, kEpsilon);
108
+ EXPECT_NEAR(p.y, 2.0f, kEpsilon);
109
+ EXPECT_NEAR(p.z, 3.0f, kEpsilon);
110
+ }
111
+
112
+ TEST(Projection, OrthographicOriginStaysAtOrigin) {
113
+ Vec4 v(0.0f, 0.0f, 0.0f, 0.0f);
114
+ Projection3D p = projectOrthographic(v);
115
+ EXPECT_NEAR(p.x, 0.0f, kEpsilon);
116
+ EXPECT_NEAR(p.y, 0.0f, kEpsilon);
117
+ EXPECT_NEAR(p.z, 0.0f, kEpsilon);
118
+ }
119
+
120
+ TEST(Projection, OrthographicIgnoresW) {
121
+ // Two points differing only in W should project to the same 3D point
122
+ Vec4 v1(5.0f, 6.0f, 7.0f, 0.0f);
123
+ Vec4 v2(5.0f, 6.0f, 7.0f, 100.0f);
124
+ Projection3D p1 = projectOrthographic(v1);
125
+ Projection3D p2 = projectOrthographic(v2);
126
+ EXPECT_NEAR(p1.x, p2.x, kEpsilon);
127
+ EXPECT_NEAR(p1.y, p2.y, kEpsilon);
128
+ EXPECT_NEAR(p1.z, p2.z, kEpsilon);
129
+ }
130
+
131
+ TEST(Projection, OrthographicNegativeValues) {
132
+ Vec4 v(-3.0f, -4.0f, -5.0f, 10.0f);
133
+ Projection3D p = projectOrthographic(v);
134
+ EXPECT_NEAR(p.x, -3.0f, kEpsilon);
135
+ EXPECT_NEAR(p.y, -4.0f, kEpsilon);
136
+ EXPECT_NEAR(p.z, -5.0f, kEpsilon);
137
+ }
138
+
139
+ // ============================================================================
140
+ // Oblique Projection
141
+ // ============================================================================
142
+
143
+ TEST(Projection, ObliqueOriginStaysAtOrigin) {
144
+ Vec4 v(0.0f, 0.0f, 0.0f, 0.0f);
145
+ Projection3D p = projectOblique(v);
146
+ EXPECT_NEAR(p.x, 0.0f, kEpsilon);
147
+ EXPECT_NEAR(p.y, 0.0f, kEpsilon);
148
+ EXPECT_NEAR(p.z, 0.0f, kEpsilon);
149
+ }
150
+
151
+ TEST(Projection, ObliqueWithWZeroMatchesOrthographic) {
152
+ Vec4 v(1.0f, 2.0f, 3.0f, 0.0f);
153
+ Projection3D pObl = projectOblique(v);
154
+ Projection3D pOrt = projectOrthographic(v);
155
+ EXPECT_NEAR(pObl.x, pOrt.x, kEpsilon);
156
+ EXPECT_NEAR(pObl.y, pOrt.y, kEpsilon);
157
+ EXPECT_NEAR(pObl.z, pOrt.z, kEpsilon);
158
+ }
159
+
160
+ TEST(Projection, ObliqueAddsShear) {
161
+ // With default shear (0.5, 0.5, 0.0), w=2:
162
+ // x' = x + shearX*w = 1 + 0.5*2 = 2
163
+ // y' = y + shearY*w = 0 + 0.5*2 = 1
164
+ // z' = z + shearZ*w = 0 + 0.0*2 = 0
165
+ Vec4 v(1.0f, 0.0f, 0.0f, 2.0f);
166
+ Projection3D p = projectOblique(v, 0.5f, 0.5f, 0.0f);
167
+ EXPECT_NEAR(p.x, 2.0f, kEpsilon);
168
+ EXPECT_NEAR(p.y, 1.0f, kEpsilon);
169
+ EXPECT_NEAR(p.z, 0.0f, kEpsilon);
170
+ }
171
+
172
+ // ============================================================================
173
+ // Slice Projection
174
+ // ============================================================================
175
+
176
+ TEST(Projection, SliceAtOriginValidForWZero) {
177
+ Vec4 v(1.0f, 2.0f, 3.0f, 0.0f);
178
+ SliceResult sr = projectSlice(v, 0.0f, 0.1f, true);
179
+ EXPECT_TRUE(sr.valid);
180
+ EXPECT_NEAR(sr.point.x, 1.0f, kEpsilon);
181
+ EXPECT_NEAR(sr.point.y, 2.0f, kEpsilon);
182
+ EXPECT_NEAR(sr.point.z, 3.0f, kEpsilon);
183
+ EXPECT_NEAR(sr.alpha, 1.0f, kEpsilon); // At center of slice
184
+ }
185
+
186
+ TEST(Projection, SliceOutsideThicknessIsInvalid) {
187
+ Vec4 v(1.0f, 2.0f, 3.0f, 5.0f);
188
+ SliceResult sr = projectSlice(v, 0.0f, 0.1f, true);
189
+ EXPECT_FALSE(sr.valid);
190
+ }
191
+
192
+ TEST(Projection, SliceAtEdgeHasLowAlpha) {
193
+ // Point at sliceW + thickness should have alpha near 0
194
+ float sliceW = 0.0f;
195
+ float thickness = 1.0f;
196
+ Vec4 v(1.0f, 0.0f, 0.0f, 0.9f); // Near the edge
197
+ SliceResult sr = projectSlice(v, sliceW, thickness, true);
198
+ if (sr.valid) {
199
+ EXPECT_LT(sr.alpha, 0.5f);
200
+ }
201
+ }
202
+
203
+ // ============================================================================
204
+ // Projection3D Helper
205
+ // ============================================================================
206
+
207
+ TEST(Projection, Projection3DDefaultConstructor) {
208
+ Projection3D p;
209
+ EXPECT_FLOAT_EQ(p.x, 0.0f);
210
+ EXPECT_FLOAT_EQ(p.y, 0.0f);
211
+ EXPECT_FLOAT_EQ(p.z, 0.0f);
212
+ }
213
+
214
+ TEST(Projection, Projection3DToArray) {
215
+ Projection3D p(1.0f, 2.0f, 3.0f);
216
+ auto arr = p.toArray();
217
+ EXPECT_FLOAT_EQ(arr[0], 1.0f);
218
+ EXPECT_FLOAT_EQ(arr[1], 2.0f);
219
+ EXPECT_FLOAT_EQ(arr[2], 3.0f);
220
+ }
221
+
222
+ // ============================================================================
223
+ // Batch Projections
224
+ // ============================================================================
225
+
226
+ TEST(Projection, BatchPerspectiveEmpty) {
227
+ std::vector<Vec4> empty;
228
+ auto result = projectPerspectiveBatch(empty, 2.0f);
229
+ EXPECT_TRUE(result.empty());
230
+ }
231
+
232
+ TEST(Projection, BatchPerspectiveSinglePoint) {
233
+ std::vector<Vec4> points = {Vec4(1.0f, 0.0f, 0.0f, 0.0f)};
234
+ auto result = projectPerspectiveBatch(points, 2.0f);
235
+ EXPECT_EQ(result.size(), 1u);
236
+ EXPECT_NEAR(result[0].x, 1.0f, kEpsilon);
237
+ }
238
+
239
+ TEST(Projection, BatchPerspectiveMultiplePoints) {
240
+ std::vector<Vec4> points = {
241
+ Vec4(0.0f, 0.0f, 0.0f, 0.0f),
242
+ Vec4(1.0f, 0.0f, 0.0f, 0.0f),
243
+ Vec4(0.0f, 1.0f, 0.0f, 0.0f)
244
+ };
245
+ auto result = projectPerspectiveBatch(points, 2.0f);
246
+ EXPECT_EQ(result.size(), 3u);
247
+ }
248
+
249
+ TEST(Projection, BatchStereographic) {
250
+ std::vector<Vec4> points = {Vec4(1.0f, 0.0f, 0.0f, 0.0f)};
251
+ auto result = projectStereographicBatch(points);
252
+ EXPECT_EQ(result.size(), 1u);
253
+ EXPECT_NEAR(result[0].x, 1.0f, kEpsilon);
254
+ }
255
+
256
+ TEST(Projection, BatchOrthographic) {
257
+ std::vector<Vec4> points = {Vec4(1.0f, 2.0f, 3.0f, 99.0f)};
258
+ auto result = projectOrthographicBatch(points);
259
+ EXPECT_EQ(result.size(), 1u);
260
+ EXPECT_NEAR(result[0].x, 1.0f, kEpsilon);
261
+ EXPECT_NEAR(result[0].y, 2.0f, kEpsilon);
262
+ EXPECT_NEAR(result[0].z, 3.0f, kEpsilon);
263
+ }
264
+
265
+ TEST(Projection, ProjectToFloatArray) {
266
+ std::vector<Vec4> points = {
267
+ Vec4(1.0f, 2.0f, 3.0f, 0.0f),
268
+ Vec4(4.0f, 5.0f, 6.0f, 0.0f)
269
+ };
270
+ auto result = projectToFloatArray(points, 2.0f);
271
+ // 2 points * 3 floats each = 6
272
+ EXPECT_EQ(result.size(), 6u);
273
+ EXPECT_NEAR(result[0], 1.0f, kEpsilon); // first point x
274
+ EXPECT_NEAR(result[1], 2.0f, kEpsilon); // first point y
275
+ EXPECT_NEAR(result[2], 3.0f, kEpsilon); // first point z
276
+ }
277
+
278
+ // ============================================================================
279
+ // ProjectionParams defaults
280
+ // ============================================================================
281
+
282
+ TEST(Projection, ProjectionParamsDefaults) {
283
+ auto params = ProjectionParams::defaults();
284
+ EXPECT_FLOAT_EQ(params.distance, 2.0f);
285
+ EXPECT_FLOAT_EQ(params.viewerW, 0.0f);
286
+ EXPECT_FLOAT_EQ(params.sliceW, 0.0f);
287
+ EXPECT_FLOAT_EQ(params.sliceThickness, 0.1f);
288
+ }
289
+
290
+ // ============================================================================
291
+ // SliceResult::invalid
292
+ // ============================================================================
293
+
294
+ TEST(Projection, SliceResultInvalid) {
295
+ auto sr = SliceResult::invalid();
296
+ EXPECT_FALSE(sr.valid);
297
+ EXPECT_FLOAT_EQ(sr.alpha, 0.0f);
298
+ }