@vib3code/sdk 2.0.1 → 2.0.3-canary.75a3290
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 +243 -0
- package/DOCS/CLI_ONBOARDING.md +1 -1
- package/DOCS/CROSS_SITE_DESIGN_PATTERNS.md +117 -0
- package/DOCS/EPIC_SCROLL_EVENTS.md +773 -0
- package/DOCS/HANDOFF_LANDING_PAGE.md +154 -0
- package/DOCS/HANDOFF_SDK_DEVELOPMENT.md +493 -0
- package/DOCS/MULTIVIZ_CHOREOGRAPHY_PATTERNS.md +937 -0
- package/DOCS/PRODUCT_STRATEGY.md +63 -0
- package/DOCS/README.md +103 -0
- package/DOCS/REFERENCE_SCROLL_ANALYSIS.md +97 -0
- package/DOCS/ROADMAP.md +111 -0
- package/DOCS/SCROLL_TIMELINE_v3.md +269 -0
- package/DOCS/SITE_REFACTOR_PLAN.md +100 -0
- package/DOCS/STATUS.md +24 -0
- package/DOCS/SYSTEM_INVENTORY.md +33 -30
- package/DOCS/VISUAL_ANALYSIS_CLICKERSS.md +85 -0
- package/DOCS/VISUAL_ANALYSIS_FACETAD.md +133 -0
- package/DOCS/VISUAL_ANALYSIS_SIMONE.md +95 -0
- package/DOCS/VISUAL_ANALYSIS_TABLESIDE.md +86 -0
- package/DOCS/{BLUEPRINT_EXECUTION_PLAN_2026-01-07.md → archive/BLUEPRINT_EXECUTION_PLAN_2026-01-07.md} +1 -1
- package/DOCS/{DEV_TRACK_ANALYSIS.md → archive/DEV_TRACK_ANALYSIS.md} +3 -0
- package/DOCS/{SYSTEM_AUDIT_2026-01-30.md → archive/SYSTEM_AUDIT_2026-01-30.md} +3 -0
- package/DOCS/{DEV_TRACK_SESSION_2026-01-31.md → dev-tracks/DEV_TRACK_SESSION_2026-01-31.md} +1 -1
- package/DOCS/dev-tracks/DEV_TRACK_SESSION_2026-02-06.md +231 -0
- package/DOCS/dev-tracks/DEV_TRACK_SESSION_2026-02-13.md +127 -0
- package/DOCS/dev-tracks/DEV_TRACK_SESSION_2026-02-15.md +142 -0
- package/DOCS/dev-tracks/README.md +10 -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/package.json +40 -27
- package/src/agent/index.js +1 -3
- package/src/agent/mcp/MCPServer.js +918 -0
- package/src/agent/mcp/index.js +1 -1
- package/src/agent/mcp/stdio-server.js +264 -0
- package/src/agent/mcp/tools.js +454 -0
- package/src/cli/index.js +374 -44
- 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/export/TradingCardManager.js +3 -4
- package/src/export/index.js +11 -1
- package/src/faceted/FacetedSystem.js +241 -388
- package/src/holograms/HolographicVisualizer.js +29 -12
- package/src/holograms/RealHolographicSystem.js +194 -43
- 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 +7 -2
- 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/UnifiedRenderBridge.js +3 -0
- package/src/render/index.js +27 -2
- package/src/scene/index.js +4 -4
- package/src/shaders/faceted/faceted.frag.glsl +220 -80
- package/src/shaders/faceted/faceted.frag.wgsl +138 -97
- package/src/shaders/holographic/holographic.frag.glsl +28 -9
- package/src/shaders/holographic/holographic.frag.wgsl +107 -38
- package/src/shaders/quantum/quantum.frag.glsl +1 -0
- package/src/shaders/quantum/quantum.frag.wgsl +1 -1
- package/src/testing/ParallelTestFramework.js +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 +8 -4
- 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/{DEV_TRACK_PLAN_2026-01-07.md → archive/DEV_TRACK_PLAN_2026-01-07.md} +0 -0
- /package/DOCS/{SESSION_014_PLAN.md → archive/SESSION_014_PLAN.md} +0 -0
- /package/DOCS/{SESSION_LOG_2026-01-07.md → archive/SESSION_LOG_2026-01-07.md} +0 -0
- /package/DOCS/{STRATEGIC_BLUEPRINT_2026-01-07.md → archive/STRATEGIC_BLUEPRINT_2026-01-07.md} +0 -0
- /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"
|