76 lines
4.2 KiB
Markdown
76 lines
4.2 KiB
Markdown
# Bauen — eigene Häuser aus Modulteilen
|
||
|
||
Stand 25.10.2026 (Umbau). Vorlage: **Modular Builder 0.2.0** von Michel Savadim,
|
||
Godot-Erweiterung, Lizenz **CC0 1.0** (Code, Icons, Doku — siehe
|
||
`addons/modular_builder/LICENSE`). Die Demo-Szene/Demo-Texturen der Vorlage sind
|
||
nicht CC0 und liegen bewusst nicht im Repo (`ADDON_LIZENZ.txt`).
|
||
|
||
## Prinzip
|
||
|
||
Ein Bauteil ist ein **ganz normales Bibliotheks-Objekt** (`bau_*`, Kategorie
|
||
„bauteile“). Gesetzte Teile stehen in `objects`, ein Gebäude ist eine **Gruppe**
|
||
(`group` + `group_names`). Dadurch gelten ohne Sonderfälle:
|
||
|
||
* Undo/Redo, Auswahl, Verschieben, Drehen, Duplizieren, Löschen, Symmetrie
|
||
* Speichern in der `.svmap` (kein eigener Block mehr, Server-Validierung V1–V17)
|
||
* **Kollision serverkonsistent**: jedes Teil hat eine Trimesh-Datei
|
||
(`library/kollisions/bau_*.json`) — Türen, Fenster, Schießscharten sind echte
|
||
Löcher, die Treppe ist eine Stufenfläche (Stufen 20 cm). Editor-Playtest, Client
|
||
und Server lesen dieselbe Datei.
|
||
* Poly-Budget zählt wie bei jedem Objekt (`poly` = Dreiecke des Teils).
|
||
|
||
## Teile (Katalog: `core/editor/bau_katalog.gd`)
|
||
|
||
| Gruppe | Teile |
|
||
| --- | --- |
|
||
| Fundament & Boden | Fundament, Boden/Decke (2 × 2 m, 20 cm) |
|
||
| Wände (2 m breit, 3 m hoch) | Wand, Wand mit Tür (1,2 × 2,2 m), Wand mit Fenster, Wand mit Schießscharte, Brüstung (1,1 m), Eckpfeiler |
|
||
| Dach & Giebel (klein 2 m) | Giebelwand, Satteldach, Pyramidendach |
|
||
| Dach & Giebel (mittel 4 m) | Giebelwand 4 m, Satteldach 4×4, Pyramidendach 4×4 (Spitze 2 m) |
|
||
| Dach & Giebel (groß 6 m) | Giebelwand 6 m, Satteldach 6×6, Pyramidendach 6×6 (Spitze 3 m) |
|
||
| Dach aus Einzelteilen (45°) | Dachschräge 2×2 m (2 m hoch), Dachecke außen (Grat), Dachecke innen (Kehle), Dachplateau, Dachstirn — massiv, rundum geschlossen; tiefe Kante/Ecke zeigt Richtung Vorschau, R dreht |
|
||
| Treppe | Treppe 4 × 2 m, 3 m hoch (15 Stufen) |
|
||
|
||
Fertige Pack-Objekte (Container, Hangar-Tore, Betonsperren) stehen NICHT im Bauen-Tab,
|
||
sondern wie alle Objekte in der Objekt-Bibliothek unten.
|
||
|
||
## Snap (`core/editor/build_snap.gd`)
|
||
|
||
* **XZ:** Wände auf die nächste Zellkante — und zwar GANZ in die Zelle, in der die
|
||
Maus ist (Außenseite bündig mit der Kante, kein Überhang, Ecken schließen ohne
|
||
Lücke). Klick auf eine vorhandene Wand (Seite oder Oberkante) übernimmt deren Lage
|
||
exakt (ersetzen bzw. stapeln). Böden/Dächer/Fundamente in die Zellmitte, große
|
||
Dächer (4 m / 6 m) je nach Zellzahl auf Zellecke bzw. Zellmitte, Pfeiler auf die
|
||
Zellecke, Treppen auf eine 4 × 2-m-Fläche. `R` dreht die Wand um. Zellen sind
|
||
2 × 2 m, global ab (0, 0).
|
||
* **Y:** nie die Klickhöhe, sondern eine **Ebene** — Gelände (höchster Punkt unter
|
||
der Grundfläche) oder Oberkante eines tragenden Teils darunter. **Wände und
|
||
Pfeiler zählen von der Unterkante einer Decke/eines Fundaments**, die Decke selbst
|
||
liegt auf der Wandoberkante: jedes Geschoss liegt auf Vielfachen von 3 m, mit oder
|
||
ohne Decke darunter stehen die oberen Wände gleich hoch.
|
||
* **Geschoss fest:** Bild↑/Bild↓ (oder Knöpfe im Tab) wählen ein festes Geschoss
|
||
(Basis = tiefstes Teil in der Nähe, je 3 m). Der Mausstrahl trifft dann die
|
||
Geschoss-Ebene statt Wand/Boden darunter — Decken und Böden lassen sich mitten im
|
||
großen Raum setzen. Ganz unten = Automatik.
|
||
* **Kein Z-Fighting:** Wand-Außenseite steht 1 cm vor der Plattenkante.
|
||
* **Ersetzen:** gleiche Art auf demselben Platz wird ersetzt (Tür in vorhandene
|
||
Wand). Dasselbe Teil nochmal wird mit Erklärung abgelehnt.
|
||
|
||
## Dateien erzeugen
|
||
|
||
Meshes, GLBs, Kollision und Registry-Fragment kommen aus dem Katalog:
|
||
|
||
```bash
|
||
godot --headless --path . --script res://tools/gen_bauteile.gd -- \
|
||
--client ../scopedvr-client --server ../scopedvr-match-server
|
||
(cd ../scopedvr-match-server && python3 tools/merge_object_library.py)
|
||
```
|
||
|
||
Danach `library/objects.json` in Client und Editor angleichen (`tools/sync_objects.sh`).
|
||
`tests/test_bauen.gd` prüft, dass die Registry zum Katalog passt.
|
||
|
||
## Alte Maps
|
||
|
||
Die frühere Sektion `gebaeude` (Bauen-Modus vom 20.10.) wird beim Öffnen in
|
||
`bau_*`-Objekte einer Gruppe übernommen (`BauOps.migriere_gebaeude`). Wandhöhe ist
|
||
jetzt 3 m statt 2 m — alte Häuser bitte kurz prüfen und neu speichern.
|