# IvyGenerator — WMM Playground 04

Eigenständiger prozeduraler 3D-Efeugenerator mit drei fotografischen Efeublättern aus ambientCG LeafSet017 (Fotogrammetrie, CC0), verzweigten Ranken und unabhängigem Grüntint je Blatt. Kein Build-Schritt und keine externen Requests zur Laufzeit.

## Starten

Im Projektstamm `python3 -m http.server 8766` starten und `/playground/ivygenerator/` öffnen. Die ES-Module benötigen HTTP(S). Im öffentlichen WMM-Playground wird der Ordner mit `project.json` und `img/preview.webp` automatisch in der Übersicht erkannt.

## Steuerung

- **Kletternd**, **Hängend**, **Bodendecker**: positive bzw. negative Wuchshöhe oder Ausbreitung entlang des Bodens.
- 1–10 Hauptranken, 0–5 Seitentriebe je Hauptranke, 8–60 Blätter je Hauptranke. Seitentriebe bekommen proportional zu ihrer Länge zusätzliche Blätter; die Gesamtzahl steht in der Vorschau.
- Rankenlänge 1–5 m im illustrativen Modellmassstab; Blattgrösse 50–160 %.
- Ausbreitung und Unregelmässigkeit verändern die räumlichen Kurven, Blattorientierung und Abstände.
- **Grüntönung 0–15 %**: unabhängige Variation pro Blatt. Kein Braun-/Ockertint. Die Farbwahl ändert keine Ranken- oder Blattpositionen.
- Gleicher Seed und gleiche Parameter ergeben dieselbe Pflanze. „Neue Ranken wachsen lassen“ ändert nur den Seed.
- Ziehen zum Drehen, Scrollen zum Zoomen. Tastatur bei fokussierter Vorschau: Pfeile, +/− und Home.
- Transparenter PNG-Export der aktuellen Ansicht, ohne UI und Hintergrund, in der Vorschauauflösung (maximal Pixeldichte 2).

## API

```js
await IvyGenerator.ready;
IvyGenerator.setParameters({mode: 'hang', stems: 6, branches: 3, tint: 10, seed: 1234});
IvyGenerator.getParameters();
IvyGenerator.randomize();
IvyGenerator.resetView();
const blob = await IvyGenerator.exportPNG();
```

Modes: `climb`, `hang`, `ground`. Bereiche stehen in `generator.js`. Unbekannte Parameter und ungültige Zahlen werden abgewiesen; Zahlen ausserhalb der Bereiche werden begrenzt. UI-Änderungen werden bis zum nächsten Animationsframe zusammengefasst. Ereignisse: `ivygenerator:ready`, `ivygenerator:change` (Parameter in `event.detail`).

## Aufbau und Grenzen

Die Haupt- und Seitentriebe sind räumliche Catmull-Rom-Kurven mit verjüngter polygonaler Röhrengeometrie. Seitentriebe beginnen exakt an Knoten der Hauptranken. Blattstiele verbinden wechselständig angeordnete, leicht gebogene, doppelseitige Alpha-Flächen mit den Trieben. Drei Instanzgruppen teilen sich Geometrie und Texturen; die Ranken und Blattstiele werden zu einem Mesh zusammengefasst.

Die Wuchsrichtungen sind gestalterische Modelle. Es gibt noch keine automatische Haftung an importierten Wänden/Felsen und keine botanische Wachstumssimulation. Eine konkrete Art oder Sorte des fotografierten Ausgangsmaterials wird nicht behauptet. Detailherkunft: `assets/SOURCES.md`.


Sanfter Wind ist beim Start aktiv (ausgenommen bei Systemeinstellung „Bewegung reduzieren“). Der Schalter stoppt die Blattbewegung. Über die API: `IvyGenerator.setWind(false)` und `IvyGenerator.getWind()`. Die Blattstiele bleiben bei der Bewegung an ihren Ranken verankert.
