2026-05-24-fractal0ne-design.md

docs/specs/2026-05-24-fractal0ne-design.md

fractal0ne — Design

Datum: 2026-05-24 Datei: fractal0ne.html (Root) Quelle / Inspiration: HackerPoet/PySpace — GLSL ray-marcher mit space-folding distance estimators (Sierpinski, Menger, Mandelbox, Sphere, Box, Plane).


Ziel

Web-Tool: beliebigen Text im Browser zu einem 3D-Fraktal falten lassen. Live editierbar (Text, Folds, Farben, Position). Steht standalone in dev.0nefinity.love/fractal0ne.html.

Architektur

HTML  ─┬─ <canvas>            (Fullscreen, WebGL2)
       ├─ Panel (controls.js) (Settings rechts oben, draggable)
       └─ <script>  ─┬─ Main-Thread: WebGL Setup, Render-Loop, UI-Wiring
                     └─ Worker (sdf-worker.js inline als Blob)
                          └─ Jump-Flood SDF aus Canvas-Text

Renderer

Text → 2D-SDF (Worker)

  1. Offscreen-Canvas, Größe konfigurierbar (default 512×512), Text mit gewähltem System-Font zentriert zeichnen (weiß auf schwarz).
  2. Binary-Mask aus ImageData (alpha threshold).
  3. Jump-Flooding-Algorithm:
    • Zwei JFA-Pässe (innere + äußere Front)
    • log2(N) Iterationen mit halbierendem step
    • Signed Distance = outside_dist − inside_dist (in Pixeln)
  4. Normalisierung auf [-1, 1] basierend auf max-extent.
  5. Übergabe Main-Thread via transferable Float32Array.
  6. Upload als RG16F-Texture (R: distance, G: reserve).

Re-Run-Trigger: Text-Änderung, Font-Änderung, Auflösungs-Änderung. Cancel-Token verwirft veraltete Worker-Outputs.

3D-SDF Pipeline (im Shader)

float DE(vec3 p) {
    // 1. User-Folds auf Welt-Punkt p (replizieren den Text)
    vec4 z = vec4(p, 1.0);
    for (int i = 0; i < ITERATIONS; i++) {
        // [PIPELINE_INJECT] — generierter GLSL aus Pipeline-Array
    }
    p = z.xyz / z.w;

    // 2. In Text-local transformieren
    p = p - uTextPos;
    p = uTextRotInv * p;
    p /= uTextScale;

    // 3. 2D-SDF sampeln + Z-extrude
    vec2 uv = p.xy * 0.5 + 0.5;
    float d2 = texture(uSdf, uv).r;
    float dz = abs(p.z) - uTextThickness;
    vec2 q = vec2(d2, dz);
    float d = min(max(q.x, q.y), 0.0) + length(max(q, 0.0));

    return d * uTextScale;
}

Fold-Pipeline (modular)

Pipeline = JS-Array [{type, params}, ...].

Type GLSL Params
sierpinski sierpinski-fold
menger menger-fold
sphere sphere-fold minR, maxR
box box-fold r (vec3)
abs abs-fold center (vec3)
plane plane-fold normal (vec3), d
rotX/rotY/rotZ rotation angle
scale uniform scale s
translate translation offset (vec3)

Bei Pipeline-Änderung: GLSL-String aus Template + Array bauen, Shader neu kompilieren, alten freigeben. Compile-Cost ~10-30ms.

Steuerung (6-DoF)

Settings-Panel

controls.js-Pattern (existing). Draggable, oben rechts. Sektionen:

  1. Text: Input-Field (live), Font-Dropdown
  2. Geometrie: Extrusion-Dicke, Scale, Iterations
  3. Position/Rotation: 6 Slider + Zentrieren
  4. Folds: Pipeline-Editor (add/remove/reorder/edit)
  5. Farben: Hintergrund, Vordergrund, Glow — via meta.css-Variablen wo möglich, sonst color-picker
  6. Performance: Resolution-Scale (1.0 / 0.75 / 0.5 / 0.25), Max-Steps (32/64/128)
  7. Presets: "klar", "kristallin", "chaotisch", "leer", "PySpace-Mandelbox"
  8. Share: "URL kopieren" Button

Persistenz

Performance-Strategie (Gurke-Kompatibel)

Mobile (Pflicht-Check)

Dark-Mode

Out-of-Bounds-Verhalten

"Text rumschieben, auch teilweise außerhalb" — natürlich gegeben durch:

Fehler-Handling

Testplan (vor "fertig"-Claim)

  1. Local: curl https://dev.0nefinity.love/fractal0ne.html → 200
  2. Visual: Browser-Aufruf, Default-State zeigt Text "0NE" mit Default-Fold-Pipeline
  3. Interaktion: Text ändern → re-render. Fold hinzufügen → re-compile + re-render. Drag → bewegt.
  4. Mobile-Sim: Chrome DevTools → iPhone → 1-finger drag, 2-finger pinch funktionieren.
  5. URL-Round-trip: Settings ändern, URL kopieren, neu öffnen → identischer State.
  6. Dark/Light: Toggle prüfen (UI Lesbarkeit, Fraktal unverändert).
  7. Performance: Auf Default-Settings stabile 60fps Desktop, ≥30fps Mobile.

Out-of-Scope (NICHT bauen)

Open Questions (entscheide ich im Trust-Mode)


Folge-Plan: Direkt Implementierung — keine separate writing-plans-Stufe (Trust-Mode + Goal "bau es jetzt"). Bei Komplikationen Stop und nachfragen.