@vib3code/sdk 2.0.1
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 +118 -0
- package/DOCS/BLUEPRINT_EXECUTION_PLAN_2026-01-07.md +34 -0
- package/DOCS/CI_TESTING.md +38 -0
- package/DOCS/CLI_ONBOARDING.md +75 -0
- package/DOCS/CONTROL_REFERENCE.md +64 -0
- package/DOCS/DEV_TRACK_ANALYSIS.md +77 -0
- package/DOCS/DEV_TRACK_PLAN_2026-01-07.md +42 -0
- package/DOCS/DEV_TRACK_SESSION_2026-01-31.md +220 -0
- package/DOCS/ENV_SETUP.md +189 -0
- package/DOCS/EXPORT_FORMATS.md +417 -0
- package/DOCS/GPU_DISPOSAL_GUIDE.md +21 -0
- package/DOCS/LICENSING_TIERS.md +275 -0
- package/DOCS/MASTER_PLAN_2026-01-31.md +570 -0
- package/DOCS/OBS_SETUP_GUIDE.md +98 -0
- package/DOCS/PROJECT_SETUP.md +66 -0
- package/DOCS/RENDERER_LIFECYCLE.md +40 -0
- package/DOCS/REPO_MANIFEST.md +121 -0
- package/DOCS/SESSION_014_PLAN.md +195 -0
- package/DOCS/SESSION_LOG_2026-01-07.md +56 -0
- package/DOCS/STRATEGIC_BLUEPRINT_2026-01-07.md +72 -0
- package/DOCS/SYSTEM_AUDIT_2026-01-30.md +738 -0
- package/DOCS/SYSTEM_INVENTORY.md +520 -0
- package/DOCS/TELEMETRY_EXPORTS.md +34 -0
- package/DOCS/WEBGPU_STATUS.md +38 -0
- package/DOCS/XR_BENCHMARKS.md +608 -0
- package/LICENSE +21 -0
- package/README.md +426 -0
- package/docs/.nojekyll +0 -0
- package/docs/01-dissolution_of_euclidean_hegemony.html +346 -0
- package/docs/02-hyperspatial_ego_death.html +346 -0
- package/docs/03-post_cartesian_sublime.html +346 -0
- package/docs/04-crystalline_void_meditation.html +346 -0
- package/docs/05-quantum_decoherence_ballet.html +346 -0
- package/docs/06-dissolution_of_euclidean_hegemony.html +346 -0
- package/docs/07-hyperspatial_ego_death.html +346 -0
- package/docs/08-post_cartesian_sublime.html +346 -0
- package/docs/09-crystalline_void_meditation.html +346 -0
- package/docs/10-quantum_decoherence_ballet.html +346 -0
- package/docs/11-dissolution_of_euclidean_hegemony.html +346 -0
- package/docs/12-hyperspatial_ego_death.html +346 -0
- package/docs/13-post_cartesian_sublime.html +346 -0
- package/docs/index.html +794 -0
- package/docs/test-hub.html +441 -0
- package/docs/url-state.js +102 -0
- package/docs/vib3-exports/01-quantum-quantum-tetrahedron-lattice.html +489 -0
- package/docs/vib3-exports/02-quantum-quantum-hypersphere-matrix.html +489 -0
- package/docs/vib3-exports/03-quantum-quantum-hypertetra-fractal.html +489 -0
- package/docs/vib3-exports/04-faceted-faceted-crystal-structure.html +407 -0
- package/docs/vib3-exports/05-faceted-faceted-klein-bottle.html +407 -0
- package/docs/vib3-exports/06-faceted-faceted-hypertetra-torus.html +407 -0
- package/docs/vib3-exports/07-holographic-holographic-wave-field.html +457 -0
- package/docs/vib3-exports/08-holographic-holographic-hypersphere-sphere.html +457 -0
- package/docs/vib3-exports/09-holographic-holographic-hypertetra-crystal.html +457 -0
- package/docs/vib3-exports/index.html +238 -0
- package/docs/webgpu-live.html +702 -0
- package/package.json +367 -0
- package/src/advanced/AIPresetGenerator.js +777 -0
- package/src/advanced/MIDIController.js +703 -0
- package/src/advanced/OffscreenWorker.js +1051 -0
- package/src/advanced/WebGPUCompute.js +1051 -0
- package/src/advanced/WebXRRenderer.js +680 -0
- package/src/agent/cli/AgentCLI.js +615 -0
- package/src/agent/cli/index.js +14 -0
- package/src/agent/index.js +73 -0
- package/src/agent/mcp/MCPServer.js +950 -0
- package/src/agent/mcp/index.js +9 -0
- package/src/agent/mcp/tools.js +548 -0
- package/src/agent/telemetry/EventStream.js +669 -0
- package/src/agent/telemetry/Instrumentation.js +618 -0
- package/src/agent/telemetry/TelemetryExporters.js +427 -0
- package/src/agent/telemetry/TelemetryService.js +464 -0
- package/src/agent/telemetry/index.js +52 -0
- package/src/benchmarks/BenchmarkRunner.js +381 -0
- package/src/benchmarks/MetricsCollector.js +299 -0
- package/src/benchmarks/index.js +9 -0
- package/src/benchmarks/scenes.js +259 -0
- package/src/cli/index.js +675 -0
- package/src/config/ApiConfig.js +88 -0
- package/src/core/CanvasManager.js +217 -0
- package/src/core/ErrorReporter.js +117 -0
- package/src/core/ParameterMapper.js +333 -0
- package/src/core/Parameters.js +396 -0
- package/src/core/RendererContracts.js +200 -0
- package/src/core/UnifiedResourceManager.js +370 -0
- package/src/core/VIB3Engine.js +636 -0
- package/src/core/renderers/FacetedRendererAdapter.js +32 -0
- package/src/core/renderers/HolographicRendererAdapter.js +29 -0
- package/src/core/renderers/QuantumRendererAdapter.js +29 -0
- package/src/core/renderers/RendererLifecycleManager.js +63 -0
- package/src/creative/ColorPresetsSystem.js +980 -0
- package/src/creative/ParameterTimeline.js +1061 -0
- package/src/creative/PostProcessingPipeline.js +1113 -0
- package/src/creative/TransitionAnimator.js +683 -0
- package/src/export/CSSExporter.js +226 -0
- package/src/export/CardGeneratorBase.js +279 -0
- package/src/export/ExportManager.js +580 -0
- package/src/export/FacetedCardGenerator.js +279 -0
- package/src/export/HolographicCardGenerator.js +543 -0
- package/src/export/LottieExporter.js +552 -0
- package/src/export/QuantumCardGenerator.js +315 -0
- package/src/export/SVGExporter.js +519 -0
- package/src/export/ShaderExporter.js +903 -0
- package/src/export/TradingCardGenerator.js +3055 -0
- package/src/export/TradingCardManager.js +181 -0
- package/src/export/VIB3PackageExporter.js +559 -0
- package/src/export/index.js +14 -0
- package/src/export/systems/TradingCardSystemFaceted.js +494 -0
- package/src/export/systems/TradingCardSystemHolographic.js +452 -0
- package/src/export/systems/TradingCardSystemQuantum.js +411 -0
- package/src/faceted/FacetedSystem.js +963 -0
- package/src/features/CollectionManager.js +433 -0
- package/src/gallery/CollectionManager.js +240 -0
- package/src/gallery/GallerySystem.js +485 -0
- package/src/geometry/GeometryFactory.js +314 -0
- package/src/geometry/GeometryLibrary.js +72 -0
- package/src/geometry/buffers/BufferBuilder.js +338 -0
- package/src/geometry/buffers/index.js +18 -0
- package/src/geometry/generators/Crystal.js +420 -0
- package/src/geometry/generators/Fractal.js +298 -0
- package/src/geometry/generators/KleinBottle.js +197 -0
- package/src/geometry/generators/Sphere.js +192 -0
- package/src/geometry/generators/Tesseract.js +160 -0
- package/src/geometry/generators/Tetrahedron.js +225 -0
- package/src/geometry/generators/Torus.js +304 -0
- package/src/geometry/generators/Wave.js +341 -0
- package/src/geometry/index.js +142 -0
- package/src/geometry/warp/HypersphereCore.js +211 -0
- package/src/geometry/warp/HypertetraCore.js +386 -0
- package/src/geometry/warp/index.js +57 -0
- package/src/holograms/HolographicVisualizer.js +1073 -0
- package/src/holograms/RealHolographicSystem.js +966 -0
- package/src/holograms/variantRegistry.js +69 -0
- package/src/integrations/FigmaPlugin.js +854 -0
- package/src/integrations/OBSMode.js +754 -0
- package/src/integrations/ThreeJsPackage.js +660 -0
- package/src/integrations/TouchDesignerExport.js +552 -0
- package/src/integrations/frameworks/Vib3React.js +591 -0
- package/src/integrations/frameworks/Vib3Svelte.js +654 -0
- package/src/integrations/frameworks/Vib3Vue.js +628 -0
- package/src/llm/LLMParameterInterface.js +240 -0
- package/src/llm/LLMParameterUI.js +577 -0
- package/src/math/Mat4x4.js +708 -0
- package/src/math/Projection.js +341 -0
- package/src/math/Rotor4D.js +637 -0
- package/src/math/Vec4.js +476 -0
- package/src/math/constants.js +164 -0
- package/src/math/index.js +68 -0
- package/src/math/projections.js +54 -0
- package/src/math/rotations.js +196 -0
- package/src/quantum/QuantumEngine.js +906 -0
- package/src/quantum/QuantumVisualizer.js +1103 -0
- package/src/reactivity/ReactivityConfig.js +499 -0
- package/src/reactivity/ReactivityManager.js +586 -0
- package/src/reactivity/SpatialInputSystem.js +1783 -0
- package/src/reactivity/index.js +93 -0
- package/src/render/CommandBuffer.js +465 -0
- package/src/render/MultiCanvasBridge.js +340 -0
- package/src/render/RenderCommand.js +514 -0
- package/src/render/RenderResourceRegistry.js +523 -0
- package/src/render/RenderState.js +552 -0
- package/src/render/RenderTarget.js +512 -0
- package/src/render/ShaderLoader.js +253 -0
- package/src/render/ShaderProgram.js +599 -0
- package/src/render/UnifiedRenderBridge.js +496 -0
- package/src/render/backends/WebGLBackend.js +1108 -0
- package/src/render/backends/WebGPUBackend.js +1409 -0
- package/src/render/commands/CommandBufferExecutor.js +607 -0
- package/src/render/commands/RenderCommandBuffer.js +661 -0
- package/src/render/commands/index.js +17 -0
- package/src/render/index.js +367 -0
- package/src/scene/Disposable.js +498 -0
- package/src/scene/MemoryPool.js +618 -0
- package/src/scene/Node4D.js +697 -0
- package/src/scene/ResourceManager.js +599 -0
- package/src/scene/Scene4D.js +540 -0
- package/src/scene/index.js +98 -0
- package/src/schemas/error.schema.json +84 -0
- package/src/schemas/extension.schema.json +88 -0
- package/src/schemas/index.js +214 -0
- package/src/schemas/parameters.schema.json +142 -0
- package/src/schemas/tool-pack.schema.json +44 -0
- package/src/schemas/tool-response.schema.json +127 -0
- package/src/shaders/common/fullscreen.vert.glsl +5 -0
- package/src/shaders/common/fullscreen.vert.wgsl +17 -0
- package/src/shaders/common/geometry24.glsl +65 -0
- package/src/shaders/common/geometry24.wgsl +54 -0
- package/src/shaders/common/rotation4d.glsl +85 -0
- package/src/shaders/common/rotation4d.wgsl +86 -0
- package/src/shaders/common/uniforms.glsl +44 -0
- package/src/shaders/common/uniforms.wgsl +48 -0
- package/src/shaders/faceted/faceted.frag.glsl +129 -0
- package/src/shaders/faceted/faceted.frag.wgsl +164 -0
- package/src/shaders/holographic/holographic.frag.glsl +406 -0
- package/src/shaders/holographic/holographic.frag.wgsl +185 -0
- package/src/shaders/quantum/quantum.frag.glsl +513 -0
- package/src/shaders/quantum/quantum.frag.wgsl +361 -0
- package/src/testing/ParallelTestFramework.js +519 -0
- package/src/testing/__snapshots__/exportFormats.test.js.snap +24 -0
- package/src/testing/exportFormats.test.js +8 -0
- package/src/testing/projections.test.js +14 -0
- package/src/testing/rotations.test.js +37 -0
- package/src/ui/InteractivityMenu.js +516 -0
- package/src/ui/StatusManager.js +96 -0
- package/src/ui/adaptive/renderers/webgpu/BufferLayout.ts +252 -0
- package/src/ui/adaptive/renderers/webgpu/PolytopeInstanceBuffer.ts +144 -0
- package/src/ui/adaptive/renderers/webgpu/TripleBufferedUniform.ts +170 -0
- package/src/ui/adaptive/renderers/webgpu/WebGPURenderer.ts +735 -0
- package/src/ui/adaptive/renderers/webgpu/index.ts +112 -0
- package/src/variations/VariationManager.js +431 -0
- package/src/viewer/AudioReactivity.js +505 -0
- package/src/viewer/CardBending.js +481 -0
- package/src/viewer/GalleryUI.js +832 -0
- package/src/viewer/ReactivityManager.js +590 -0
- package/src/viewer/TradingCardExporter.js +600 -0
- package/src/viewer/ViewerPortal.js +374 -0
- package/src/viewer/index.js +12 -0
- package/src/wasm/WasmLoader.js +296 -0
- package/src/wasm/index.js +132 -0
- package/tools/agentic/mcpTools.js +88 -0
- package/tools/cli/agent-cli.js +92 -0
- package/tools/export/formats.js +24 -0
- package/tools/math/rotation-baseline.mjs +64 -0
- package/tools/shader-sync-verify.js +937 -0
- package/tools/telemetry/manifestPipeline.js +141 -0
- package/tools/telemetry/telemetryEvents.js +35 -0
- package/types/adaptive-sdk.d.ts +185 -0
- package/types/advanced/AIPresetGenerator.d.ts +81 -0
- package/types/advanced/MIDIController.d.ts +100 -0
- package/types/advanced/OffscreenWorker.d.ts +82 -0
- package/types/advanced/WebGPUCompute.d.ts +52 -0
- package/types/advanced/WebXRRenderer.d.ts +77 -0
- package/types/advanced/index.d.ts +46 -0
- package/types/core/ErrorReporter.d.ts +50 -0
- package/types/core/VIB3Engine.d.ts +204 -0
- package/types/creative/ColorPresetsSystem.d.ts +91 -0
- package/types/creative/ParameterTimeline.d.ts +74 -0
- package/types/creative/PostProcessingPipeline.d.ts +109 -0
- package/types/creative/TransitionAnimator.d.ts +71 -0
- package/types/creative/index.d.ts +35 -0
- package/types/integrations/FigmaPlugin.d.ts +46 -0
- package/types/integrations/OBSMode.d.ts +74 -0
- package/types/integrations/ThreeJsPackage.d.ts +62 -0
- package/types/integrations/TouchDesignerExport.d.ts +36 -0
- package/types/integrations/Vib3React.d.ts +74 -0
- package/types/integrations/Vib3Svelte.d.ts +63 -0
- package/types/integrations/Vib3Vue.d.ts +55 -0
- package/types/integrations/index.d.ts +52 -0
- package/types/reactivity/SpatialInputSystem.d.ts +173 -0
- package/types/reactivity/index.d.ts +394 -0
- package/types/render/CommandBuffer.d.ts +169 -0
- package/types/render/RenderCommand.d.ts +312 -0
- package/types/render/RenderState.d.ts +279 -0
- package/types/render/RenderTarget.d.ts +254 -0
- package/types/render/ShaderProgram.d.ts +277 -0
- package/types/render/UnifiedRenderBridge.d.ts +143 -0
- package/types/render/WebGLBackend.d.ts +168 -0
- package/types/render/WebGPUBackend.d.ts +186 -0
- package/types/render/index.d.ts +141 -0
|
@@ -0,0 +1,338 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Buffer Builder
|
|
3
|
+
*
|
|
4
|
+
* Converts geometry data into WebGL-compatible typed arrays.
|
|
5
|
+
* Handles vertex buffers, index buffers, and interleaved formats.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Build a Float32Array vertex buffer from Vec4 vertices
|
|
10
|
+
* @param {Vec4[]} vertices - Array of Vec4 vertices
|
|
11
|
+
* @param {string} format - 'xyzw' (4 floats) or 'xyz' (3 floats, drops w)
|
|
12
|
+
* @returns {Float32Array}
|
|
13
|
+
*/
|
|
14
|
+
export function buildVertexBuffer(vertices, format = 'xyzw') {
|
|
15
|
+
const componentsPerVertex = format === 'xyz' ? 3 : 4;
|
|
16
|
+
const buffer = new Float32Array(vertices.length * componentsPerVertex);
|
|
17
|
+
|
|
18
|
+
for (let i = 0; i < vertices.length; i++) {
|
|
19
|
+
const v = vertices[i];
|
|
20
|
+
const offset = i * componentsPerVertex;
|
|
21
|
+
|
|
22
|
+
buffer[offset] = v.x;
|
|
23
|
+
buffer[offset + 1] = v.y;
|
|
24
|
+
buffer[offset + 2] = v.z;
|
|
25
|
+
|
|
26
|
+
if (format === 'xyzw') {
|
|
27
|
+
buffer[offset + 3] = v.w;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
return buffer;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* Build a Uint16Array or Uint32Array index buffer from edges
|
|
36
|
+
* @param {number[][]} edges - Array of [start, end] index pairs
|
|
37
|
+
* @param {boolean} use32Bit - Use Uint32Array instead of Uint16Array
|
|
38
|
+
* @returns {Uint16Array|Uint32Array}
|
|
39
|
+
*/
|
|
40
|
+
export function buildEdgeIndexBuffer(edges, use32Bit = false) {
|
|
41
|
+
const ArrayType = use32Bit ? Uint32Array : Uint16Array;
|
|
42
|
+
const buffer = new ArrayType(edges.length * 2);
|
|
43
|
+
|
|
44
|
+
for (let i = 0; i < edges.length; i++) {
|
|
45
|
+
buffer[i * 2] = edges[i][0];
|
|
46
|
+
buffer[i * 2 + 1] = edges[i][1];
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
return buffer;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* Build triangle index buffer from faces
|
|
54
|
+
* @param {number[][]} faces - Array of face vertex indices (triangles or quads)
|
|
55
|
+
* @param {boolean} use32Bit - Use Uint32Array
|
|
56
|
+
* @returns {Uint16Array|Uint32Array}
|
|
57
|
+
*/
|
|
58
|
+
export function buildFaceIndexBuffer(faces, use32Bit = false) {
|
|
59
|
+
const triangles = [];
|
|
60
|
+
|
|
61
|
+
for (const face of faces) {
|
|
62
|
+
if (face.length === 3) {
|
|
63
|
+
// Triangle
|
|
64
|
+
triangles.push(face[0], face[1], face[2]);
|
|
65
|
+
} else if (face.length === 4) {
|
|
66
|
+
// Quad - split into 2 triangles
|
|
67
|
+
triangles.push(face[0], face[1], face[2]);
|
|
68
|
+
triangles.push(face[0], face[2], face[3]);
|
|
69
|
+
} else if (face.length > 4) {
|
|
70
|
+
// Polygon - fan triangulation
|
|
71
|
+
for (let i = 1; i < face.length - 1; i++) {
|
|
72
|
+
triangles.push(face[0], face[i], face[i + 1]);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
const ArrayType = use32Bit ? Uint32Array : Uint16Array;
|
|
78
|
+
return new ArrayType(triangles);
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* Build interleaved vertex buffer with position and color
|
|
83
|
+
* @param {Vec4[]} vertices - Vertex positions
|
|
84
|
+
* @param {number[][]} colors - RGBA colors per vertex (or single color)
|
|
85
|
+
* @param {string} format - Position format ('xyzw' or 'xyz')
|
|
86
|
+
* @returns {Float32Array}
|
|
87
|
+
*/
|
|
88
|
+
export function buildInterleavedBuffer(vertices, colors, format = 'xyzw') {
|
|
89
|
+
const posComponents = format === 'xyz' ? 3 : 4;
|
|
90
|
+
const colorComponents = 4; // RGBA
|
|
91
|
+
const stride = posComponents + colorComponents;
|
|
92
|
+
const buffer = new Float32Array(vertices.length * stride);
|
|
93
|
+
|
|
94
|
+
const singleColor = colors.length === 1 || colors.length === 4;
|
|
95
|
+
|
|
96
|
+
for (let i = 0; i < vertices.length; i++) {
|
|
97
|
+
const v = vertices[i];
|
|
98
|
+
const offset = i * stride;
|
|
99
|
+
|
|
100
|
+
// Position
|
|
101
|
+
buffer[offset] = v.x;
|
|
102
|
+
buffer[offset + 1] = v.y;
|
|
103
|
+
buffer[offset + 2] = v.z;
|
|
104
|
+
if (posComponents === 4) {
|
|
105
|
+
buffer[offset + 3] = v.w;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
// Color
|
|
109
|
+
const colorOffset = offset + posComponents;
|
|
110
|
+
if (singleColor) {
|
|
111
|
+
const c = colors.length === 4 ? colors : colors[0];
|
|
112
|
+
buffer[colorOffset] = c[0];
|
|
113
|
+
buffer[colorOffset + 1] = c[1];
|
|
114
|
+
buffer[colorOffset + 2] = c[2];
|
|
115
|
+
buffer[colorOffset + 3] = c[3];
|
|
116
|
+
} else {
|
|
117
|
+
const c = colors[i] || [1, 1, 1, 1];
|
|
118
|
+
buffer[colorOffset] = c[0];
|
|
119
|
+
buffer[colorOffset + 1] = c[1];
|
|
120
|
+
buffer[colorOffset + 2] = c[2];
|
|
121
|
+
buffer[colorOffset + 3] = c[3];
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
return buffer;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
/**
|
|
129
|
+
* Build normal vectors from vertex data (for lighting)
|
|
130
|
+
* @param {Vec4[]} vertices - Vertex positions
|
|
131
|
+
* @param {number[][]} faces - Face indices
|
|
132
|
+
* @returns {Float32Array} Normal vectors (x, y, z per vertex)
|
|
133
|
+
*/
|
|
134
|
+
export function buildNormalBuffer(vertices, faces) {
|
|
135
|
+
// Initialize normals to zero
|
|
136
|
+
const normals = new Float32Array(vertices.length * 3);
|
|
137
|
+
|
|
138
|
+
// Accumulate face normals to vertices
|
|
139
|
+
for (const face of faces) {
|
|
140
|
+
if (face.length < 3) continue;
|
|
141
|
+
|
|
142
|
+
const v0 = vertices[face[0]];
|
|
143
|
+
const v1 = vertices[face[1]];
|
|
144
|
+
const v2 = vertices[face[2]];
|
|
145
|
+
|
|
146
|
+
// Compute face normal (cross product of edges)
|
|
147
|
+
const e1x = v1.x - v0.x;
|
|
148
|
+
const e1y = v1.y - v0.y;
|
|
149
|
+
const e1z = v1.z - v0.z;
|
|
150
|
+
|
|
151
|
+
const e2x = v2.x - v0.x;
|
|
152
|
+
const e2y = v2.y - v0.y;
|
|
153
|
+
const e2z = v2.z - v0.z;
|
|
154
|
+
|
|
155
|
+
const nx = e1y * e2z - e1z * e2y;
|
|
156
|
+
const ny = e1z * e2x - e1x * e2z;
|
|
157
|
+
const nz = e1x * e2y - e1y * e2x;
|
|
158
|
+
|
|
159
|
+
// Add to all vertices of face
|
|
160
|
+
for (const idx of face) {
|
|
161
|
+
normals[idx * 3] += nx;
|
|
162
|
+
normals[idx * 3 + 1] += ny;
|
|
163
|
+
normals[idx * 3 + 2] += nz;
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
// Normalize all normals
|
|
168
|
+
for (let i = 0; i < vertices.length; i++) {
|
|
169
|
+
const offset = i * 3;
|
|
170
|
+
const len = Math.sqrt(
|
|
171
|
+
normals[offset] * normals[offset] +
|
|
172
|
+
normals[offset + 1] * normals[offset + 1] +
|
|
173
|
+
normals[offset + 2] * normals[offset + 2]
|
|
174
|
+
);
|
|
175
|
+
|
|
176
|
+
if (len > 0.0001) {
|
|
177
|
+
normals[offset] /= len;
|
|
178
|
+
normals[offset + 1] /= len;
|
|
179
|
+
normals[offset + 2] /= len;
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
return normals;
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
/**
|
|
187
|
+
* Generate colors based on W coordinate (4D depth)
|
|
188
|
+
* @param {Vec4[]} vertices - Vertex positions
|
|
189
|
+
* @param {object} colorMap - Color mapping options
|
|
190
|
+
* @returns {number[][]} RGBA colors per vertex
|
|
191
|
+
*/
|
|
192
|
+
export function generateWDepthColors(vertices, colorMap = {}) {
|
|
193
|
+
const {
|
|
194
|
+
nearColor = [1, 0.2, 0.2, 1], // Red for w > 0
|
|
195
|
+
farColor = [0.2, 0.2, 1, 1], // Blue for w < 0
|
|
196
|
+
midColor = [0.2, 1, 0.2, 1], // Green for w = 0
|
|
197
|
+
range = 2
|
|
198
|
+
} = colorMap;
|
|
199
|
+
|
|
200
|
+
return vertices.map(v => {
|
|
201
|
+
const t = (v.w / range + 1) / 2; // Normalize to 0-1
|
|
202
|
+
|
|
203
|
+
if (t > 0.5) {
|
|
204
|
+
// Blend mid to near
|
|
205
|
+
const blend = (t - 0.5) * 2;
|
|
206
|
+
return [
|
|
207
|
+
midColor[0] + (nearColor[0] - midColor[0]) * blend,
|
|
208
|
+
midColor[1] + (nearColor[1] - midColor[1]) * blend,
|
|
209
|
+
midColor[2] + (nearColor[2] - midColor[2]) * blend,
|
|
210
|
+
1
|
|
211
|
+
];
|
|
212
|
+
} else {
|
|
213
|
+
// Blend far to mid
|
|
214
|
+
const blend = t * 2;
|
|
215
|
+
return [
|
|
216
|
+
farColor[0] + (midColor[0] - farColor[0]) * blend,
|
|
217
|
+
farColor[1] + (midColor[1] - farColor[1]) * blend,
|
|
218
|
+
farColor[2] + (midColor[2] - farColor[2]) * blend,
|
|
219
|
+
1
|
|
220
|
+
];
|
|
221
|
+
}
|
|
222
|
+
});
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
/**
|
|
226
|
+
* Generate colors based on vertex index (rainbow)
|
|
227
|
+
* @param {number} vertexCount - Number of vertices
|
|
228
|
+
* @param {number} saturation - Color saturation (0-1)
|
|
229
|
+
* @param {number} lightness - Color lightness (0-1)
|
|
230
|
+
* @returns {number[][]} RGBA colors per vertex
|
|
231
|
+
*/
|
|
232
|
+
export function generateRainbowColors(vertexCount, saturation = 1, lightness = 0.5) {
|
|
233
|
+
const colors = [];
|
|
234
|
+
|
|
235
|
+
for (let i = 0; i < vertexCount; i++) {
|
|
236
|
+
const hue = (i / vertexCount) * 360;
|
|
237
|
+
const rgb = hslToRgb(hue, saturation, lightness);
|
|
238
|
+
colors.push([rgb[0], rgb[1], rgb[2], 1]);
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
return colors;
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
/**
|
|
245
|
+
* HSL to RGB conversion
|
|
246
|
+
* @param {number} h - Hue (0-360)
|
|
247
|
+
* @param {number} s - Saturation (0-1)
|
|
248
|
+
* @param {number} l - Lightness (0-1)
|
|
249
|
+
* @returns {number[]} RGB values (0-1)
|
|
250
|
+
*/
|
|
251
|
+
function hslToRgb(h, s, l) {
|
|
252
|
+
const c = (1 - Math.abs(2 * l - 1)) * s;
|
|
253
|
+
const x = c * (1 - Math.abs((h / 60) % 2 - 1));
|
|
254
|
+
const m = l - c / 2;
|
|
255
|
+
|
|
256
|
+
let r, g, b;
|
|
257
|
+
|
|
258
|
+
if (h < 60) { r = c; g = x; b = 0; }
|
|
259
|
+
else if (h < 120) { r = x; g = c; b = 0; }
|
|
260
|
+
else if (h < 180) { r = 0; g = c; b = x; }
|
|
261
|
+
else if (h < 240) { r = 0; g = x; b = c; }
|
|
262
|
+
else if (h < 300) { r = x; g = 0; b = c; }
|
|
263
|
+
else { r = c; g = 0; b = x; }
|
|
264
|
+
|
|
265
|
+
return [r + m, g + m, b + m];
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
/**
|
|
269
|
+
* Build complete WebGL-ready geometry buffers
|
|
270
|
+
* @param {object} geometry - Geometry with vertices, edges, faces
|
|
271
|
+
* @param {object} options - Buffer options
|
|
272
|
+
* @returns {object} WebGL buffer data
|
|
273
|
+
*/
|
|
274
|
+
export function buildGeometryBuffers(geometry, options = {}) {
|
|
275
|
+
const {
|
|
276
|
+
format = 'xyzw',
|
|
277
|
+
includeNormals = false,
|
|
278
|
+
includeColors = true,
|
|
279
|
+
colorMode = 'wDepth', // 'wDepth', 'rainbow', 'uniform'
|
|
280
|
+
uniformColor = [1, 1, 1, 1],
|
|
281
|
+
use32BitIndices = false
|
|
282
|
+
} = options;
|
|
283
|
+
|
|
284
|
+
const result = {
|
|
285
|
+
vertices: buildVertexBuffer(geometry.vertices, format),
|
|
286
|
+
vertexCount: geometry.vertices.length,
|
|
287
|
+
stride: format === 'xyz' ? 3 : 4
|
|
288
|
+
};
|
|
289
|
+
|
|
290
|
+
// Edge indices
|
|
291
|
+
if (geometry.edges && geometry.edges.length > 0) {
|
|
292
|
+
result.edgeIndices = buildEdgeIndexBuffer(geometry.edges, use32BitIndices);
|
|
293
|
+
result.edgeCount = geometry.edges.length;
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
// Face indices
|
|
297
|
+
if (geometry.faces && geometry.faces.length > 0) {
|
|
298
|
+
result.faceIndices = buildFaceIndexBuffer(geometry.faces, use32BitIndices);
|
|
299
|
+
result.faceCount = geometry.faces.length;
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
// Normals
|
|
303
|
+
if (includeNormals && geometry.faces) {
|
|
304
|
+
result.normals = buildNormalBuffer(geometry.vertices, geometry.faces);
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
// Colors
|
|
308
|
+
if (includeColors) {
|
|
309
|
+
let colors;
|
|
310
|
+
switch (colorMode) {
|
|
311
|
+
case 'wDepth':
|
|
312
|
+
colors = generateWDepthColors(geometry.vertices);
|
|
313
|
+
break;
|
|
314
|
+
case 'rainbow':
|
|
315
|
+
colors = generateRainbowColors(geometry.vertices.length);
|
|
316
|
+
break;
|
|
317
|
+
case 'uniform':
|
|
318
|
+
default:
|
|
319
|
+
colors = [uniformColor];
|
|
320
|
+
break;
|
|
321
|
+
}
|
|
322
|
+
|
|
323
|
+
result.colors = new Float32Array(geometry.vertices.length * 4);
|
|
324
|
+
const singleColor = colors.length === 1;
|
|
325
|
+
|
|
326
|
+
for (let i = 0; i < geometry.vertices.length; i++) {
|
|
327
|
+
const c = singleColor ? colors[0] : colors[i];
|
|
328
|
+
result.colors[i * 4] = c[0];
|
|
329
|
+
result.colors[i * 4 + 1] = c[1];
|
|
330
|
+
result.colors[i * 4 + 2] = c[2];
|
|
331
|
+
result.colors[i * 4 + 3] = c[3];
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
return result;
|
|
336
|
+
}
|
|
337
|
+
|
|
338
|
+
export default buildGeometryBuffers;
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Buffer Utilities Index
|
|
3
|
+
*
|
|
4
|
+
* WebGL buffer generation for geometry rendering.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
export {
|
|
8
|
+
buildVertexBuffer,
|
|
9
|
+
buildEdgeIndexBuffer,
|
|
10
|
+
buildFaceIndexBuffer,
|
|
11
|
+
buildInterleavedBuffer,
|
|
12
|
+
buildNormalBuffer,
|
|
13
|
+
generateWDepthColors,
|
|
14
|
+
generateRainbowColors,
|
|
15
|
+
buildGeometryBuffers
|
|
16
|
+
} from './BufferBuilder.js';
|
|
17
|
+
|
|
18
|
+
export { default as buildGeometryBuffers } from './BufferBuilder.js';
|