The Neural Fabric: 2.5D Projection & Hexagonal Grids
The "Neural Fabric" (Services Canvas) visualizes the Neo.mjs Application Engine as a structured, engineered lattice. It represents the "Motherboard" or "VDOM Registry" where components live, are inspected, and are mutated by intelligent agents.
While Neural Swarm deals with autonomous, organic behaviors, and Neural Timeline deals with data coordination, the Neural Fabric solves a different challenge: High-Performance 3D Visualization in a 2D Context.
When to Use This Pattern
Use the 2.5D Projection pattern when:
- ✅ You need 3D aesthetics (perspective, rotation, depth) but cannot afford the overhead of WebGL/Three.js.
- ✅ You need to visualize structured grid data (Hexagonal, Isometric).
- ✅ You require precise pixel-perfect control over lines and fills (which is harder in raw WebGL).
- ✅ You need 60fps performance on integrated graphics (mobile/laptops).
Stick with WebGL/Three.js when:
- ❌ You need real lighting, shadows, or complex materials.
- ❌ You have full 3D models (OBJ/GLTF).
- ❌ You need Z-buffering (pixels occluding each other perfectly).
The Challenge: 3D without the Weight
We wanted a "Cybernetic Motherboard" look: a 3D hexagonal grid that tilts, rotates with the mouse, and has depth (parallax).
- Problem: Loading a full 3D engine (Three.js/Babylon) adds 600KB+ to the bundle and introduces significant GPU overhead for what is essentially a line-drawing effect.
- Solution: Implement a lightweight "2.5D" manual projection engine inside a standard 2D Canvas context.
The Architecture: "The Matrix in a Loop"
The architecture relies on a Shared Worker (Physics/Render) and an App Worker (Controller), similar to other canvases. The core innovation here is the Projection Pipeline.
1. The Manual Projection Engine
Instead of a heavy matrix library, we implement a specific "Floor Perspective" projection. We only need to rotate around X (Pitch) and Y (Yaw).
The Math (Inlined for Speed):
We rotate the point (x, y, z) around the center (cx, cy) and then project it based on z depth.
// ServicesCanvas.mjs
project(x, y, z) {
let dx = x - cx, dy = y - cy, dz = z;
// 1. Rotate Yaw (Y-axis)
let x1 = dx * cosY - dz * sinY;
let z1 = dz * cosY + dx * sinY;
// 2. Rotate Pitch (X-axis)
let y2 = dy * cosX - z1 * sinX;
let z2 = z1 * cosX + dy * sinX;
// 3. Perspective Divide
let scale = fov / (fov + z2);
return {
x: x1 * scale + cx,
y: y2 * scale + cy,
scale: scale
};
}
Optimization: We re-use a single projectionPoint object to avoid creating garbage bjects every frame.
2. Hexagonal Data Structure (The Buffer)
We don't store "Hexagon Objects". We store a Structure of Arrays (SoA) in a Float32Array.
A hexagonal grid is defined by Axial Coordinates (q, r).
Buffer Layout (Stride: 8 floats per node)
| Index | Property | Description |
|---|---|---|
| 0, 1 | q, r |
Axial Coordinates (Grid Topology) |
| 2, 3 | x, y |
Screen Space Center (Pre-calculated) |
| 4 | scale |
Visual size (0-1) for open/close animations |
| 5 | energy |
Interaction state (0-1) |
| 6 | buildCharge |
Accumulator for Super Hex formation |
| 7 | colorIdx |
Palette index |
Why Axial Coordinates?
They make neighbor lookups fast. In a hex grid, every neighbor is at (q+dq, r+dr). We don't need complex graph traversal; just math.
3. Visual Logic: The "Cybernetic Loop"
The visual story is one of Cause and Effect. It's not random; it's a simulation of work.
Phase 1: The Neural Agent (Runner)
"The Work Packet" Agents travel along the grid lines. They are not particles; they are State Machines.
- State 0 (Moving): Finds a path to a target node.
- State 1 (Scanning): Orbits a node, "reading" it.
Phase 2: The Construct (Super Hex)
"The Result"
When an Agent finishes scanning, it injects BuildCharge into the node. If charge > Threshold, a Super Hex is born.
The "Implode/Upload" Effect: We use particle effects to sell the state change:
- Birth: Particles
implode(fly inward) from the radius to the center. Metaphor: Allocation. - Life: The Super Hex expands and glows.
- Death: Particles
upload(fly upward/outward) as the Hex vanishes. Metaphor: Release/Sync.
// ServicesCanvas.mjs
if (sh.state === 2 && sh.age > 30) {
// Done - Trigger Upload
me.spawnParticles(x, y, 12, 'upload'); // Fly up!
me.superHexes.splice(i, 1);
}
Visual Layers: Managing Depth in 2D
Since we are in a 2D canvas, we don't have a Z-buffer. We must manually manage draw order (Painter's Algorithm) to create depth.
- Kernel Layer (Background): A huge, slow-moving grid drawn first. Represents the "Deep Core".
- Strata Layer (Mid): Randomly placed floating clusters. Drawn with lower opacity.
- Fabric Layer (Foreground): The main interactive grid. Drawn last for sharpness.
- Agents & Particles: Drawn on top of everything.
Parallax Trick: Each layer moves at a different speed relative to the mouse, creating a compelling 2.5D "Deep Space" feel without actual 3D geometry.
// Kernel pans slowly
let panX = Math.sin(time * 0.2) * 20;
// Strata pans faster
let panX = Math.sin(time * 0.15) * 30;
Terminology Check
To align with the "Application Engine" narrative, we use specific terms:
- Neural Fabric: The grid itself.
- Constructs: The merged Super Hexes.
- Agents: The moving packets (Runners).
- Kernel: The deep background layer.
Conclusion
The Neural Fabric proves that you don't need a heavy 3D engine to build immersive, spatial interfaces. By understanding the math of Projection and the efficiency of TypedArrays, Neo.mjs delivers "Sci-Fi UI" performance on the web.