@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,607 @@
1
+ /**
2
+ * VIB3+ FFI Implementation
3
+ *
4
+ * C interface implementation wrapping C++ core classes.
5
+ */
6
+
7
+ #include "../include/vib3_ffi.h"
8
+ #include "../math/Vec4.hpp"
9
+ #include "../math/Rotor4D.hpp"
10
+ #include "../math/Mat4x4.hpp"
11
+ #include "../math/Projection.hpp"
12
+
13
+ #include <cstring>
14
+ #include <cmath>
15
+ #include <string>
16
+
17
+ using namespace vib3;
18
+
19
+ // Version string
20
+ static const char* VIB3_VERSION = "1.7.0";
21
+
22
+ // Geometry names
23
+ static const char* GEOMETRY_NAMES[24] = {
24
+ "tetrahedron_base", "hypercube_base", "sphere_base", "torus_base",
25
+ "klein_bottle_base", "fractal_base", "wave_base", "crystal_base",
26
+ "tetrahedron_hypersphere", "hypercube_hypersphere", "sphere_hypersphere", "torus_hypersphere",
27
+ "klein_bottle_hypersphere", "fractal_hypersphere", "wave_hypersphere", "crystal_hypersphere",
28
+ "tetrahedron_hypertetra", "hypercube_hypertetra", "sphere_hypertetra", "torus_hypertetra",
29
+ "klein_bottle_hypertetra", "fractal_hypertetra", "wave_hypertetra", "crystal_hypertetra"
30
+ };
31
+
32
+ // ============================================================================
33
+ // Vec4 Functions
34
+ // ============================================================================
35
+
36
+ extern "C" {
37
+
38
+ Vib3Vec4* vib3_vec4_create(float x, float y, float z, float w) {
39
+ Vib3Vec4* v = new Vib3Vec4();
40
+ v->x = x;
41
+ v->y = y;
42
+ v->z = z;
43
+ v->w = w;
44
+ return v;
45
+ }
46
+
47
+ void vib3_vec4_free(Vib3Vec4* v) {
48
+ delete v;
49
+ }
50
+
51
+ float vib3_vec4_dot(const Vib3Vec4* a, const Vib3Vec4* b) {
52
+ return a->x * b->x + a->y * b->y + a->z * b->z + a->w * b->w;
53
+ }
54
+
55
+ float vib3_vec4_length(const Vib3Vec4* v) {
56
+ return std::sqrt(v->x * v->x + v->y * v->y + v->z * v->z + v->w * v->w);
57
+ }
58
+
59
+ void vib3_vec4_normalize(Vib3Vec4* v) {
60
+ float len = vib3_vec4_length(v);
61
+ if (len > 1e-10f) {
62
+ float inv = 1.0f / len;
63
+ v->x *= inv;
64
+ v->y *= inv;
65
+ v->z *= inv;
66
+ v->w *= inv;
67
+ }
68
+ }
69
+
70
+ Vib3Vec4* vib3_vec4_add(const Vib3Vec4* a, const Vib3Vec4* b) {
71
+ return vib3_vec4_create(a->x + b->x, a->y + b->y, a->z + b->z, a->w + b->w);
72
+ }
73
+
74
+ Vib3Vec4* vib3_vec4_sub(const Vib3Vec4* a, const Vib3Vec4* b) {
75
+ return vib3_vec4_create(a->x - b->x, a->y - b->y, a->z - b->z, a->w - b->w);
76
+ }
77
+
78
+ Vib3Vec4* vib3_vec4_scale(const Vib3Vec4* v, float s) {
79
+ return vib3_vec4_create(v->x * s, v->y * s, v->z * s, v->w * s);
80
+ }
81
+
82
+ Vib3Vec4* vib3_vec4_lerp(const Vib3Vec4* a, const Vib3Vec4* b, float t) {
83
+ float u = 1.0f - t;
84
+ return vib3_vec4_create(
85
+ a->x * u + b->x * t,
86
+ a->y * u + b->y * t,
87
+ a->z * u + b->z * t,
88
+ a->w * u + b->w * t
89
+ );
90
+ }
91
+
92
+ // ============================================================================
93
+ // Rotor4D Functions
94
+ // ============================================================================
95
+
96
+ Vib3Rotor4D* vib3_rotor4d_identity(void) {
97
+ Vib3Rotor4D* r = new Vib3Rotor4D();
98
+ r->s = 1.0f;
99
+ r->xy = r->xz = r->yz = r->xw = r->yw = r->zw = r->xyzw = 0.0f;
100
+ return r;
101
+ }
102
+
103
+ Vib3Rotor4D* vib3_rotor4d_from_plane_angle(Vib3RotationPlane plane, float angle) {
104
+ Vib3Rotor4D* r = vib3_rotor4d_identity();
105
+
106
+ float half = angle * 0.5f;
107
+ float c = std::cos(half);
108
+ float s = std::sin(half);
109
+
110
+ r->s = c;
111
+
112
+ switch (plane) {
113
+ case VIB3_PLANE_XY: r->xy = -s; break;
114
+ case VIB3_PLANE_XZ: r->xz = -s; break;
115
+ case VIB3_PLANE_YZ: r->yz = -s; break;
116
+ case VIB3_PLANE_XW: r->xw = -s; break;
117
+ case VIB3_PLANE_YW: r->yw = -s; break;
118
+ case VIB3_PLANE_ZW: r->zw = -s; break;
119
+ }
120
+
121
+ return r;
122
+ }
123
+
124
+ Vib3Rotor4D* vib3_rotor4d_from_euler6(
125
+ float xy, float xz, float yz,
126
+ float xw, float yw, float zw
127
+ ) {
128
+ // Create individual rotors and compose
129
+ Vib3Rotor4D* rxy = vib3_rotor4d_from_plane_angle(VIB3_PLANE_XY, xy);
130
+ Vib3Rotor4D* rxz = vib3_rotor4d_from_plane_angle(VIB3_PLANE_XZ, xz);
131
+ Vib3Rotor4D* ryz = vib3_rotor4d_from_plane_angle(VIB3_PLANE_YZ, yz);
132
+ Vib3Rotor4D* rxw = vib3_rotor4d_from_plane_angle(VIB3_PLANE_XW, xw);
133
+ Vib3Rotor4D* ryw = vib3_rotor4d_from_plane_angle(VIB3_PLANE_YW, yw);
134
+ Vib3Rotor4D* rzw = vib3_rotor4d_from_plane_angle(VIB3_PLANE_ZW, zw);
135
+
136
+ // Compose: R = Rxy * Rxz * Ryz * Rxw * Ryw * Rzw
137
+ Vib3Rotor4D* r1 = vib3_rotor4d_multiply(rxy, rxz);
138
+ Vib3Rotor4D* r2 = vib3_rotor4d_multiply(r1, ryz);
139
+ Vib3Rotor4D* r3 = vib3_rotor4d_multiply(r2, rxw);
140
+ Vib3Rotor4D* r4 = vib3_rotor4d_multiply(r3, ryw);
141
+ Vib3Rotor4D* result = vib3_rotor4d_multiply(r4, rzw);
142
+
143
+ // Clean up intermediates
144
+ delete rxy; delete rxz; delete ryz;
145
+ delete rxw; delete ryw; delete rzw;
146
+ delete r1; delete r2; delete r3; delete r4;
147
+
148
+ return result;
149
+ }
150
+
151
+ void vib3_rotor4d_free(Vib3Rotor4D* r) {
152
+ delete r;
153
+ }
154
+
155
+ Vib3Rotor4D* vib3_rotor4d_multiply(const Vib3Rotor4D* a, const Vib3Rotor4D* b) {
156
+ Vib3Rotor4D* result = new Vib3Rotor4D();
157
+
158
+ // Full Clifford algebra product for Cl(4,0)
159
+ // This is the correct geometric algebra multiplication
160
+
161
+ result->s = a->s * b->s
162
+ - a->xy * b->xy - a->xz * b->xz - a->yz * b->yz
163
+ - a->xw * b->xw - a->yw * b->yw - a->zw * b->zw
164
+ - a->xyzw * b->xyzw;
165
+
166
+ result->xy = a->s * b->xy + a->xy * b->s
167
+ + a->xz * b->yz - a->yz * b->xz
168
+ + a->xw * b->yw - a->yw * b->xw
169
+ - a->zw * b->xyzw - a->xyzw * b->zw;
170
+
171
+ result->xz = a->s * b->xz + a->xz * b->s
172
+ - a->xy * b->yz + a->yz * b->xy
173
+ + a->xw * b->zw - a->zw * b->xw
174
+ + a->yw * b->xyzw + a->xyzw * b->yw;
175
+
176
+ result->yz = a->s * b->yz + a->yz * b->s
177
+ + a->xy * b->xz - a->xz * b->xy
178
+ + a->yw * b->zw - a->zw * b->yw
179
+ - a->xw * b->xyzw - a->xyzw * b->xw;
180
+
181
+ result->xw = a->s * b->xw + a->xw * b->s
182
+ - a->xy * b->yw + a->yw * b->xy
183
+ - a->xz * b->zw + a->zw * b->xz
184
+ - a->yz * b->xyzw - a->xyzw * b->yz;
185
+
186
+ result->yw = a->s * b->yw + a->yw * b->s
187
+ + a->xy * b->xw - a->xw * b->xy
188
+ - a->yz * b->zw + a->zw * b->yz
189
+ + a->xz * b->xyzw + a->xyzw * b->xz;
190
+
191
+ result->zw = a->s * b->zw + a->zw * b->s
192
+ + a->xz * b->xw - a->xw * b->xz
193
+ + a->yz * b->yw - a->yw * b->yz
194
+ - a->xy * b->xyzw - a->xyzw * b->xy;
195
+
196
+ result->xyzw = a->s * b->xyzw + a->xyzw * b->s
197
+ + a->xy * b->zw + a->zw * b->xy
198
+ - a->xz * b->yw - a->yw * b->xz
199
+ + a->yz * b->xw + a->xw * b->yz;
200
+
201
+ return result;
202
+ }
203
+
204
+ Vib3Vec4* vib3_rotor4d_rotate(const Vib3Rotor4D* r, const Vib3Vec4* v) {
205
+ // Rotation: v' = R * v * R†
206
+ // For rotors, this simplifies to a series of reflections
207
+
208
+ float x = v->x, y = v->y, z = v->z, w = v->w;
209
+
210
+ // Apply rotor using sandwich product
211
+ // Simplified form using rotor components
212
+ float s2 = r->s * r->s;
213
+ float xy2 = r->xy * r->xy;
214
+ float xz2 = r->xz * r->xz;
215
+ float yz2 = r->yz * r->yz;
216
+ float xw2 = r->xw * r->xw;
217
+ float yw2 = r->yw * r->yw;
218
+ float zw2 = r->zw * r->zw;
219
+
220
+ // Compute rotated components
221
+ float newX = x * (s2 + xy2 + xz2 + xw2 - yz2 - yw2 - zw2 - r->xyzw * r->xyzw)
222
+ + 2 * (r->s * (r->xy * y + r->xz * z + r->xw * w)
223
+ + r->xy * (r->yz * z + r->yw * w)
224
+ + r->xz * (r->zw * w - r->yz * y)
225
+ + r->xw * (-r->yw * y - r->zw * z));
226
+
227
+ float newY = y * (s2 - xy2 + yz2 + yw2 - xz2 - xw2 - zw2 - r->xyzw * r->xyzw)
228
+ + 2 * (r->s * (-r->xy * x + r->yz * z + r->yw * w)
229
+ + r->xy * (r->xz * z + r->xw * w)
230
+ + r->yz * (r->zw * w - r->xz * x)
231
+ + r->yw * (-r->xw * x - r->zw * z));
232
+
233
+ float newZ = z * (s2 - xy2 - xz2 + yz2 + zw2 - xw2 - yw2 - r->xyzw * r->xyzw)
234
+ + 2 * (r->s * (-r->xz * x - r->yz * y + r->zw * w)
235
+ + r->xz * (r->xy * y + r->xw * w)
236
+ + r->yz * (r->xy * x + r->yw * w)
237
+ + r->zw * (-r->xw * x - r->yw * y));
238
+
239
+ float newW = w * (s2 - xy2 - xz2 - yz2 - xw2 - yw2 - zw2 + r->xyzw * r->xyzw)
240
+ + 2 * (r->s * (-r->xw * x - r->yw * y - r->zw * z)
241
+ + r->xw * (r->xy * y + r->xz * z)
242
+ + r->yw * (r->xy * x + r->yz * z)
243
+ + r->zw * (r->xz * x + r->yz * y));
244
+
245
+ return vib3_vec4_create(newX, newY, newZ, newW);
246
+ }
247
+
248
+ Vib3Rotor4D* vib3_rotor4d_slerp(const Vib3Rotor4D* a, const Vib3Rotor4D* b, float t) {
249
+ // Compute dot product
250
+ float dot = a->s * b->s + a->xy * b->xy + a->xz * b->xz + a->yz * b->yz
251
+ + a->xw * b->xw + a->yw * b->yw + a->zw * b->zw + a->xyzw * b->xyzw;
252
+
253
+ // Handle sign flip for shortest path
254
+ float sign = (dot < 0) ? -1.0f : 1.0f;
255
+ dot = std::abs(dot);
256
+
257
+ float s0, s1;
258
+ if (dot > 0.9995f) {
259
+ // Linear interpolation for nearly identical rotors
260
+ s0 = 1.0f - t;
261
+ s1 = t * sign;
262
+ } else {
263
+ float theta = std::acos(dot);
264
+ float sinTheta = std::sin(theta);
265
+ s0 = std::sin((1.0f - t) * theta) / sinTheta;
266
+ s1 = std::sin(t * theta) / sinTheta * sign;
267
+ }
268
+
269
+ Vib3Rotor4D* result = new Vib3Rotor4D();
270
+ result->s = s0 * a->s + s1 * b->s;
271
+ result->xy = s0 * a->xy + s1 * b->xy;
272
+ result->xz = s0 * a->xz + s1 * b->xz;
273
+ result->yz = s0 * a->yz + s1 * b->yz;
274
+ result->xw = s0 * a->xw + s1 * b->xw;
275
+ result->yw = s0 * a->yw + s1 * b->yw;
276
+ result->zw = s0 * a->zw + s1 * b->zw;
277
+ result->xyzw = s0 * a->xyzw + s1 * b->xyzw;
278
+
279
+ vib3_rotor4d_normalize(result);
280
+ return result;
281
+ }
282
+
283
+ void vib3_rotor4d_normalize(Vib3Rotor4D* r) {
284
+ float len = std::sqrt(
285
+ r->s * r->s + r->xy * r->xy + r->xz * r->xz + r->yz * r->yz
286
+ + r->xw * r->xw + r->yw * r->yw + r->zw * r->zw + r->xyzw * r->xyzw
287
+ );
288
+
289
+ if (len > 1e-10f) {
290
+ float inv = 1.0f / len;
291
+ r->s *= inv;
292
+ r->xy *= inv;
293
+ r->xz *= inv;
294
+ r->yz *= inv;
295
+ r->xw *= inv;
296
+ r->yw *= inv;
297
+ r->zw *= inv;
298
+ r->xyzw *= inv;
299
+ }
300
+ }
301
+
302
+ Vib3Mat4x4* vib3_rotor4d_to_matrix(const Vib3Rotor4D* r) {
303
+ // Convert rotor to 4x4 rotation matrix
304
+ Vib3Mat4x4* m = vib3_mat4x4_identity();
305
+
306
+ // For each basis vector, compute rotated result and store as column
307
+ Vib3Vec4 ex = {1, 0, 0, 0};
308
+ Vib3Vec4 ey = {0, 1, 0, 0};
309
+ Vib3Vec4 ez = {0, 0, 1, 0};
310
+ Vib3Vec4 ew = {0, 0, 0, 1};
311
+
312
+ Vib3Vec4* rx = vib3_rotor4d_rotate(r, &ex);
313
+ Vib3Vec4* ry = vib3_rotor4d_rotate(r, &ey);
314
+ Vib3Vec4* rz = vib3_rotor4d_rotate(r, &ez);
315
+ Vib3Vec4* rw = vib3_rotor4d_rotate(r, &ew);
316
+
317
+ // Column-major layout
318
+ m->data[0] = rx->x; m->data[4] = ry->x; m->data[8] = rz->x; m->data[12] = rw->x;
319
+ m->data[1] = rx->y; m->data[5] = ry->y; m->data[9] = rz->y; m->data[13] = rw->y;
320
+ m->data[2] = rx->z; m->data[6] = ry->z; m->data[10] = rz->z; m->data[14] = rw->z;
321
+ m->data[3] = rx->w; m->data[7] = ry->w; m->data[11] = rz->w; m->data[15] = rw->w;
322
+
323
+ delete rx; delete ry; delete rz; delete rw;
324
+
325
+ return m;
326
+ }
327
+
328
+ // ============================================================================
329
+ // Mat4x4 Functions
330
+ // ============================================================================
331
+
332
+ Vib3Mat4x4* vib3_mat4x4_identity(void) {
333
+ Vib3Mat4x4* m = new Vib3Mat4x4();
334
+ std::memset(m->data, 0, sizeof(m->data));
335
+ m->data[0] = m->data[5] = m->data[10] = m->data[15] = 1.0f;
336
+ return m;
337
+ }
338
+
339
+ Vib3Mat4x4* vib3_mat4x4_rotation_xy(float angle) {
340
+ Vib3Mat4x4* m = vib3_mat4x4_identity();
341
+ float c = std::cos(angle);
342
+ float s = std::sin(angle);
343
+ m->data[0] = c; m->data[4] = -s;
344
+ m->data[1] = s; m->data[5] = c;
345
+ return m;
346
+ }
347
+
348
+ Vib3Mat4x4* vib3_mat4x4_rotation_xz(float angle) {
349
+ Vib3Mat4x4* m = vib3_mat4x4_identity();
350
+ float c = std::cos(angle);
351
+ float s = std::sin(angle);
352
+ m->data[0] = c; m->data[8] = -s;
353
+ m->data[2] = s; m->data[10] = c;
354
+ return m;
355
+ }
356
+
357
+ Vib3Mat4x4* vib3_mat4x4_rotation_yz(float angle) {
358
+ Vib3Mat4x4* m = vib3_mat4x4_identity();
359
+ float c = std::cos(angle);
360
+ float s = std::sin(angle);
361
+ m->data[5] = c; m->data[9] = -s;
362
+ m->data[6] = s; m->data[10] = c;
363
+ return m;
364
+ }
365
+
366
+ Vib3Mat4x4* vib3_mat4x4_rotation_xw(float angle) {
367
+ Vib3Mat4x4* m = vib3_mat4x4_identity();
368
+ float c = std::cos(angle);
369
+ float s = std::sin(angle);
370
+ m->data[0] = c; m->data[12] = -s;
371
+ m->data[3] = s; m->data[15] = c;
372
+ return m;
373
+ }
374
+
375
+ Vib3Mat4x4* vib3_mat4x4_rotation_yw(float angle) {
376
+ Vib3Mat4x4* m = vib3_mat4x4_identity();
377
+ float c = std::cos(angle);
378
+ float s = std::sin(angle);
379
+ m->data[5] = c; m->data[13] = -s;
380
+ m->data[7] = s; m->data[15] = c;
381
+ return m;
382
+ }
383
+
384
+ Vib3Mat4x4* vib3_mat4x4_rotation_zw(float angle) {
385
+ Vib3Mat4x4* m = vib3_mat4x4_identity();
386
+ float c = std::cos(angle);
387
+ float s = std::sin(angle);
388
+ m->data[10] = c; m->data[14] = -s;
389
+ m->data[11] = s; m->data[15] = c;
390
+ return m;
391
+ }
392
+
393
+ Vib3Mat4x4* vib3_mat4x4_rotation_from_angles(
394
+ float xy, float xz, float yz,
395
+ float xw, float yw, float zw
396
+ ) {
397
+ // Compose all 6 rotation matrices
398
+ Vib3Mat4x4* mxy = vib3_mat4x4_rotation_xy(xy);
399
+ Vib3Mat4x4* mxz = vib3_mat4x4_rotation_xz(xz);
400
+ Vib3Mat4x4* myz = vib3_mat4x4_rotation_yz(yz);
401
+ Vib3Mat4x4* mxw = vib3_mat4x4_rotation_xw(xw);
402
+ Vib3Mat4x4* myw = vib3_mat4x4_rotation_yw(yw);
403
+ Vib3Mat4x4* mzw = vib3_mat4x4_rotation_zw(zw);
404
+
405
+ Vib3Mat4x4* r1 = vib3_mat4x4_multiply(mxy, mxz);
406
+ Vib3Mat4x4* r2 = vib3_mat4x4_multiply(r1, myz);
407
+ Vib3Mat4x4* r3 = vib3_mat4x4_multiply(r2, mxw);
408
+ Vib3Mat4x4* r4 = vib3_mat4x4_multiply(r3, myw);
409
+ Vib3Mat4x4* result = vib3_mat4x4_multiply(r4, mzw);
410
+
411
+ delete mxy; delete mxz; delete myz;
412
+ delete mxw; delete myw; delete mzw;
413
+ delete r1; delete r2; delete r3; delete r4;
414
+
415
+ return result;
416
+ }
417
+
418
+ void vib3_mat4x4_free(Vib3Mat4x4* m) {
419
+ delete m;
420
+ }
421
+
422
+ Vib3Mat4x4* vib3_mat4x4_multiply(const Vib3Mat4x4* a, const Vib3Mat4x4* b) {
423
+ Vib3Mat4x4* result = new Vib3Mat4x4();
424
+
425
+ for (int col = 0; col < 4; col++) {
426
+ for (int row = 0; row < 4; row++) {
427
+ float sum = 0.0f;
428
+ for (int k = 0; k < 4; k++) {
429
+ sum += a->data[row + k * 4] * b->data[k + col * 4];
430
+ }
431
+ result->data[row + col * 4] = sum;
432
+ }
433
+ }
434
+
435
+ return result;
436
+ }
437
+
438
+ Vib3Vec4* vib3_mat4x4_multiply_vec4(const Vib3Mat4x4* m, const Vib3Vec4* v) {
439
+ return vib3_vec4_create(
440
+ m->data[0] * v->x + m->data[4] * v->y + m->data[8] * v->z + m->data[12] * v->w,
441
+ m->data[1] * v->x + m->data[5] * v->y + m->data[9] * v->z + m->data[13] * v->w,
442
+ m->data[2] * v->x + m->data[6] * v->y + m->data[10] * v->z + m->data[14] * v->w,
443
+ m->data[3] * v->x + m->data[7] * v->y + m->data[11] * v->z + m->data[15] * v->w
444
+ );
445
+ }
446
+
447
+ void vib3_mat4x4_get_data(const Vib3Mat4x4* m, float* out) {
448
+ std::memcpy(out, m->data, sizeof(m->data));
449
+ }
450
+
451
+ // ============================================================================
452
+ // Projection Functions
453
+ // ============================================================================
454
+
455
+ Vib3Vec4* vib3_project_perspective(const Vib3Vec4* v, float distance) {
456
+ float denom = distance - v->w;
457
+ if (std::abs(denom) < 1e-10f) {
458
+ denom = (denom >= 0) ? 1e-10f : -1e-10f;
459
+ }
460
+ float scale = distance / denom;
461
+ return vib3_vec4_create(v->x * scale, v->y * scale, v->z * scale, 0.0f);
462
+ }
463
+
464
+ Vib3Vec4* vib3_project_stereographic(const Vib3Vec4* v) {
465
+ float denom = 1.0f - v->w;
466
+ if (std::abs(denom) < 1e-10f) {
467
+ denom = (denom >= 0) ? 1e-10f : -1e-10f;
468
+ }
469
+ float scale = 1.0f / denom;
470
+ return vib3_vec4_create(v->x * scale, v->y * scale, v->z * scale, 0.0f);
471
+ }
472
+
473
+ Vib3Vec4* vib3_project_orthographic(const Vib3Vec4* v) {
474
+ return vib3_vec4_create(v->x, v->y, v->z, 0.0f);
475
+ }
476
+
477
+ Vib3Vec4* vib3_project_oblique(const Vib3Vec4* v, float shear_x, float shear_y) {
478
+ return vib3_vec4_create(
479
+ v->x + shear_x * v->w,
480
+ v->y + shear_y * v->w,
481
+ v->z,
482
+ 0.0f
483
+ );
484
+ }
485
+
486
+ int32_t vib3_project_batch(
487
+ const float* positions,
488
+ int32_t count,
489
+ Vib3ProjectionType type,
490
+ float param,
491
+ float* out
492
+ ) {
493
+ for (int32_t i = 0; i < count; i++) {
494
+ Vib3Vec4 v = {
495
+ positions[i * 4 + 0],
496
+ positions[i * 4 + 1],
497
+ positions[i * 4 + 2],
498
+ positions[i * 4 + 3]
499
+ };
500
+
501
+ Vib3Vec4* projected;
502
+ switch (type) {
503
+ case VIB3_PROJ_PERSPECTIVE:
504
+ projected = vib3_project_perspective(&v, param);
505
+ break;
506
+ case VIB3_PROJ_STEREOGRAPHIC:
507
+ projected = vib3_project_stereographic(&v);
508
+ break;
509
+ case VIB3_PROJ_ORTHOGRAPHIC:
510
+ projected = vib3_project_orthographic(&v);
511
+ break;
512
+ case VIB3_PROJ_OBLIQUE:
513
+ projected = vib3_project_oblique(&v, param, param);
514
+ break;
515
+ default:
516
+ projected = vib3_project_perspective(&v, param);
517
+ }
518
+
519
+ out[i * 3 + 0] = projected->x;
520
+ out[i * 3 + 1] = projected->y;
521
+ out[i * 3 + 2] = projected->z;
522
+
523
+ delete projected;
524
+ }
525
+
526
+ return count * 3;
527
+ }
528
+
529
+ // ============================================================================
530
+ // Command Batching
531
+ // ============================================================================
532
+
533
+ int32_t vib3_process_command_batch(
534
+ const uint8_t* commands,
535
+ uint32_t size,
536
+ uint8_t* results
537
+ ) {
538
+ // Simple command processor
539
+ // Commands are variable-length encoded:
540
+ // [type:1] [data:variable]
541
+
542
+ uint32_t offset = 0;
543
+ int32_t result_offset = 0;
544
+
545
+ while (offset < size) {
546
+ uint8_t cmd_type = commands[offset++];
547
+
548
+ switch (cmd_type) {
549
+ case 0x01: // SET_PARAMETER
550
+ // Skip param_id (4 bytes) and value (8 bytes)
551
+ offset += 12;
552
+ results[result_offset++] = 1; // Success
553
+ break;
554
+
555
+ case 0x02: // SET_GEOMETRY
556
+ // Skip geometry index (4 bytes)
557
+ offset += 4;
558
+ results[result_offset++] = 1;
559
+ break;
560
+
561
+ case 0x03: // ROTATE
562
+ // Skip plane (1 byte) and angle (8 bytes)
563
+ offset += 9;
564
+ results[result_offset++] = 1;
565
+ break;
566
+
567
+ case 0x04: // RESET_ROTATION
568
+ results[result_offset++] = 1;
569
+ break;
570
+
571
+ case 0x05: // RENDER
572
+ results[result_offset++] = 1;
573
+ break;
574
+
575
+ default:
576
+ results[result_offset++] = 0; // Unknown command
577
+ break;
578
+ }
579
+ }
580
+
581
+ return result_offset;
582
+ }
583
+
584
+ // ============================================================================
585
+ // Utility Functions
586
+ // ============================================================================
587
+
588
+ const char* vib3_version(void) {
589
+ return VIB3_VERSION;
590
+ }
591
+
592
+ const char* vib3_geometry_name(int32_t index) {
593
+ if (index < 0 || index >= 24) {
594
+ return "unknown";
595
+ }
596
+ return GEOMETRY_NAMES[index];
597
+ }
598
+
599
+ bool vib3_has_simd(void) {
600
+ #if defined(VIB3_HAS_SSE41) || defined(__EMSCRIPTEN__)
601
+ return true;
602
+ #else
603
+ return false;
604
+ #endif
605
+ }
606
+
607
+ } // extern "C"