Installierbar als Remote-Extension via Gitea-Raw-URL, Updates per Klick. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
135 lines
5.4 KiB
Markdown
135 lines
5.4 KiB
Markdown
# Stylized Rock Generator (Blender Addon)
|
||
|
||
Batch-Generator fuer stylized Rocks in Blender, ausgelegt auf den Export nach
|
||
**Unreal Engine 5** ueber FBX.
|
||
|
||
Pipeline pro Rock: Basis-Mesh (Cube / Ico-Sphere) → Subdivision Surface →
|
||
Displace mit prozeduraler Noise-Textur (Voronoi / Clouds / Distorted Noise) →
|
||
zweistufiges Decimate → Limited Dissolve → Normalen-Reparatur →
|
||
UV0 (Smart Project) + UV1 (Lightmap) → optional Bevel/Weighted Normal, Material,
|
||
LOD-Set, randomisierte Skalierung/Rotation.
|
||
|
||
Getestet mit **Blender 5.1.2** (Minimum laut `bl_info`: 4.2).
|
||
|
||
---
|
||
|
||
## Installation
|
||
|
||
1. `stylized_rock_generator.py` herunterladen.
|
||
2. Blender → *Edit → Preferences → Add-ons → Install…* → die `.py` waehlen.
|
||
3. Haken bei **Stylized Rock Generator** setzen.
|
||
4. Panel: *View3D → Sidebar (N) → Reiter "Rock Gen"*.
|
||
|
||
Update: einfach die neue `.py` erneut installieren (gleicher Modulname) oder das
|
||
Repo lokal ziehen und den Addon-Pfad in den Preferences auf den Repo-Ordner
|
||
zeigen lassen.
|
||
|
||
## Installation als Extension (via URL, mit Auto-Update)
|
||
|
||
Ab Blender 4.2 / 5.x als **Remote-Extension-Repository** – einmal die URL
|
||
eintragen, danach gehen Updates per Klick.
|
||
|
||
1. Das Gitea-Repo muss **oeffentlich** sein (sonst kann Blender die Raw-URL nicht
|
||
ohne Login laden).
|
||
2. Blender → *Edit → Preferences → Get Extensions → oben rechts das Dropdown →
|
||
Repositories → „Add Remote Repository"*.
|
||
3. Als URL eintragen:
|
||
|
||
```
|
||
https://git.d4rkst3r.de/D4rkst3r/stylized-rock-generator/raw/branch/main/dist/index.json
|
||
```
|
||
|
||
4. „Check for Updates" aktivieren, bestaetigen. Die Extension erscheint in der
|
||
Liste → *Install*.
|
||
|
||
**Updaten (Maintainer-Seite):**
|
||
|
||
1. `version` in `blender_manifest.toml` (und `bl_info["version"]` in der `.py`) erhoehen.
|
||
2. `./build.ps1` (oder `blender --command extension build …` + `… server-generate …`).
|
||
3. `git add -A && git commit -m "vX.Y.Z" && git push`.
|
||
4. Nutzer: in Blender *Check for Updates* → *Update*.
|
||
|
||
Das gebaute Zip + `index.json` liegen in `dist/` und werden bewusst mitversioniert,
|
||
damit die Raw-URL sie ausliefert.
|
||
|
||
---
|
||
|
||
## Features
|
||
|
||
- **Basis-Formen:** Cube oder Ico-Sphere, einstellbare Subsurf-Stufen.
|
||
- **Noise/Displace:** Voronoi / Clouds / Distorted Noise, Scale + Staerke, Seed.
|
||
Seed-Variation ueber einen moderaten Welt-Offset (±25) vor dem Displace-Apply –
|
||
Blenders prozedurale Texturen haben keinen echten Seed-Parameter.
|
||
- **Cleanup:** zweistufiges Decimate + Limited Dissolve, danach
|
||
`normals_make_consistent` (verhindert eingefallene/dunkle Flaechen).
|
||
- **UV fuer Unreal:** UV0 (Smart Project) fuer Material-Texturen, UV1 (Lightmap)
|
||
als separater, nicht ueberlappender Kanal fuer Static-Mesh-Lightmaps.
|
||
- **Hard-Surface (optional):** Bevel + Weighted Normal fuer einen "clean"
|
||
Kantenlook.
|
||
- **Material (Platzhalter):** weist pro Rock ein Material zu und rotiert durch
|
||
eine kleine Palette (Granite/Basalt/Sandstone/Mossy), damit nichts materiallos
|
||
exportiert wird.
|
||
- **LOD-Set:** erzeugt LOD0–LODn als LOD-Gruppe fuer Unreal (siehe unten).
|
||
- **Presets:** eingebaute Presets (Kleiner Kiesel, Grosser Bruchfels, Lava-Rock)
|
||
plus eigene Presets als JSON (`rock_presets.json` neben dem Addon).
|
||
- **Batch:** synchron fuer kleine Mengen, ab `modal_threshold` (Default 25)
|
||
automatisch **modal mit Progress-Bar** – die UI bleibt bedienbar, ESC bricht ab.
|
||
- **Robustheit:** Faellt ein einzelner Rock aus (z. B. 0 Faces nach zu
|
||
aggressivem Decimate), wird nur dieser uebersprungen und aufgeraeumt, der Rest
|
||
des Batches bleibt erhalten. Fehler landen in der System-Konsole.
|
||
|
||
---
|
||
|
||
## LOD-Export nach Unreal
|
||
|
||
Blenders FBX-Exporter kennt **keine** eigene LOD-Option. Unreal erkennt eine
|
||
LOD-Gruppe aber, wenn das Eltern-**Empty** die Custom Property
|
||
`fbx_type = "LodGroup"` traegt und die LOD-Meshes in Reihenfolge (LOD0…LODn)
|
||
darunter geparentet sind. Genau das erzeugt der Generator.
|
||
|
||
Beim FBX-Export darauf achten:
|
||
|
||
- **Custom Properties** aktivieren (sonst geht `fbx_type` verloren).
|
||
- Nur die LOD-Gruppe (Empty + Kinder) selektieren, `use_selection` an.
|
||
|
||
Beim Import in Unreal:
|
||
|
||
- Im FBX-Import-Dialog **Import LODs** aktivieren.
|
||
|
||
Referenz:
|
||
[Importing Static Mesh LODs Using FBX (UE Docs)](https://dev.epicgames.com/documentation/en-us/unreal-engine/importing-static-mesh-lods-using-fbx-in-unreal-engine).
|
||
|
||
---
|
||
|
||
## Tests
|
||
|
||
```bash
|
||
blender --background --python tests/test_rock_gen.py
|
||
```
|
||
|
||
Erzeugt 3 Rocks, prueft je Rock: keine losen Vertices, manifold, Normalen nach
|
||
aussen (signed volume > 0), UV0 + UV1 vorhanden, und gibt eine Zusammenfassung
|
||
(Vertex-/Face-Count) aus. Exit-Code 0 = alles bestanden, 1 = Fehler.
|
||
|
||
---
|
||
|
||
## Changelog v2.0.0
|
||
|
||
Gehaertet & erweitert gegenueber v1.0.0:
|
||
|
||
- **Bugfix:** `smart_project(angle_limit=…)` ist in Blender 4.x/5.x in **Radiant**
|
||
(`[0, 1.5708]`) – der alte Wert `66.0` war ungueltig. Jetzt `radians(66°)`.
|
||
- **Bugfix:** `dissolve_limited(angle_limit=…)` erwartet **Radiant**; der
|
||
Grad-Wert wurde ungewandelt durchgereicht → uebermaessiges Dissolve. Jetzt
|
||
`radians(dissolve_angle)`.
|
||
- **Bugfix:** Der Lightmap-Kanal wurde vor `lightmap_pack` nicht als aktiver
|
||
UV-Layer gesetzt → UV0 konnte ueberschrieben werden. Jetzt explizit gesetzt,
|
||
UV0 danach wieder als Render-Kanal.
|
||
- Fehlerbehandlung um jeden `bpy.ops.*`-Aufruf; einzelne Rock-Fehler brechen den
|
||
Batch nicht mehr ab.
|
||
- Nicht-blockierender modaler Batch-Modus mit Progress-Bar.
|
||
- Bevel + Weighted Normal als Toggle.
|
||
- LOD-Set als `fbx_type=LodGroup`-Gruppe.
|
||
- Preset-System (JSON) mit Panel-Dropdown.
|
||
- Platzhalter-Material-Zuweisung.
|