7.3 KiB
7.3 KiB
BSPViz Projektdokumentation
1. Projektueberblick
- Zielsetzung: BSPViz ist ein Go-gestuetztes CLI-Tool zum Analysieren klassischer Doom-WAD-Dateien. Es entstand im Rahmen einer Seminararbeit, um Parsing, Geometrieverarbeitung und BSP-Heuristiken prototypisch zu untersuchen.
- Funktionsumfang: Lesen von IWAD/PWAD-Archiven, Extraktion einzelner Map-Lumps, Generieren von Geometrie-Statistiken, Aufbau und Bewertung von BSP-Baeumen sowie Export als DOT- oder Overlay-PNG.
- Technologiestack: Go 1.25, optionale Nutzung von Graphviz (dot) fuer PNG-Renderings, reine Standardbibliothek ohne externe Abhaengigkeiten.
- Artefakte im Repository: Beispiel-WAD-Dateien (
MYMAP*.wad), Einstiegspunktmain.go, modulare Pakete unterinternal/.
2. Architektur und Codeorganisation
- CLI (main.go): Verantwortlich fuer Flag-Parsing, orchestriert WAD-Laden, optionales Listing, Informationsausgabe, Lump-Export und BSP-Erstellung. Triggert Visualisierungen ueber
internal/viz. - WAD-Layer (
internal/wad): Kapselt Dateizugriff, Directory-Parsen und sichere Lump-Lesungen.Openvalidiert Header und Directory (Dateigroesse, Grenzen, Marker),LoadMapLumpsliefert selektierte Rohbytes fuer Map-spezifische Lumps. - Map-Parsing (
internal/mapfmt): Wandelt Lump-Rohdaten (VERTEXES,LINEDEFS) in typsichere Strukturen (MapData) und erzeugt Segmentlisten fuer BSP-Builds. - Geometrie (
internal/geom): Stellt Vektor-Operationen, AABB-Berechnung, Seitenklassifikation, Segment-Splitting und Line-Segment-Schnittpunkte bereit. Alle Funktionen operieren auf float64 und nutzen ein globales Epsilon (EPS). - BSP-Engine (
internal/bsp): Implementiert heuristischen Baumaufbau.Buildrekursiert ueber Segmente, waehlt Splitkandidaten per Kostenfunktion (evalCost) und liefert Knoten/Leaf-Strukturen inklusive Metriken (Measure). - Visualisierung (
internal/viz):dot.go: Serialisiert BSP-Baeume in Graphviz-DOT, optionaler Aufruf vondotfuer PNG.png.go: Rendered Map-Linien, Split-Ebenen und Leaf-Segmente in ein Overlay-Bild (RGB, Bresenham-basierte Linien).
Die Module folgen einer klaren Einbahn-Abhaengigkeit: main -> wad -> mapfmt/geom -> bsp -> viz. Tests fuer Kernpakete liegen jeweils in *_test.go.
3. Ablauf und Datenfluss
- CLI-Start: Flags validieren (
-wadPflicht, Default-MapMAP01). Bei-listerfolgt ein frueher Exit nach Directory-Ausgabe. - Map-Lesen:
wad.Openlaedt das WAD,FindMapbestimmt Marker-Bereich,LoadMapLumpsliest benoetigte Lumps in Memory. - Parsing:
mapfmt.LoadMapinterpretiert Rohbytes zuMapData(Vertices, Linedefs).LinedefsToSegserstellt Segmentreprasentationen fuer weitere Verarbeitung. - Geometrieanalyse: Je nach Flag:
-info: Zaehlt Vertex/Linedef-Anzahlen, Pruefung auf Formatabweichungen.-geomtest: Fuehrt Segment-Split-Probe inklusive Bounding-Box-Analyse aus.-extract: Schreibt gewuenschte Lumps als.lmpin Zielordner.
- BSP-Bau (
-buildbsp):bsp.Buildwaehlt Split-Ebenen anhand von Gewichtung (alphaSplits,betaBalance).- Rekursion stoppt kontrolliert via
leafmax,maxdepth. bsp.Measureliefert Kennzahlen wie Knotenzahl, Leaf-Segmente, Baumtiefe.
- Visualisierung:
-dot: Speichert DOT-Datei;-treepngruft optional Graphviz fuer Renderings.-overlay: Zeichnet Map und Splits als PNG mit zufaellig gefaerbten Leaves.
4. Kommandozeilenreferenz
| Flag | Pflicht | Beschreibung |
|---|---|---|
-wad <pfad> |
Ja | Pfad zu IWAD/PWAD-Datei. |
-map <name> |
Nein | Map-Marker (Default MAP01). |
-list |
Nein | Listet Directory und beendet. |
-info |
Nein | Zeigt Vertex-/Linedef-Statistiken nach Parsing. |
-extract <L1,L2> |
Nein | Extrahiert benannte Lumps als .lmp. Nutzt -out als Ziel (Default .). |
-geomtest |
Nein | Fuehrt Geometriediagnose (Seg-Splits, AABB) durch. |
-buildbsp |
Nein | Startet BSP-Aufbau mit Parametern -alpha, -beta, -eps, -leafmax, -maxdepth, -cands, -seed. |
-dot <pfad> |
Nein | Speichert DOT-Export (setzt -buildbsp voraus). |
-treepng <pfad> |
Nein | Erstellt PNG ueber Graphviz (benoetigt installierten dot). |
-overlay <pfad> |
Nein | Zeichnet Map+Splits als PNG ohne Graphviz-Abhaengigkeit. |
Beispiel-Workflows
- Map-Verzeichnis einsehen:
go run ./main.go -wad MYMAP.wad -list - Statistik-Aufruf:
go run ./main.go -wad MYMAP3.wad -map MAP01 -info - Lumps extrahieren:
go run ./main.go -wad MYMAP2.wad -map E1M1 -extract VERTEXES,LINEDEFS -out dumps - BSP bauen & visualisieren:
go run ./main.go -wad MYMAP.wad -map MAP01 -buildbsp -alpha 8 -beta 2 -dot tree.dot -overlay overlay.png dot -Tpng tree.dot -o tree.png # optionales Rendering
5. Implementierungsdetails
- Robustes WAD-Parsen: Integritaetschecks fuer Header, Directory-Grenzen sowie Lump-Adressen verhindern Out-of-Bounds-Zugriffe.
trimNamenormalisiert Lump-Namen auf 8 Zeichen. - Geometrie-Splitting:
geom.SplitSegklassifiziert Segmente anhand der orientierten Distanz (Side). Schnittpunkte werden nur akzeptiert, falls sie klar innerhalb des Segments liegen (EPS-Toleranz). - BSP-Heuristik:
selectSplitsampelt Segmente in regulierten Schritten (Cands). Die Kostenfunktion kombiniert Split-Anzahl und Balance; Parameter koennen zur Evaluierung verschiedener Heuristiken variiert werden. - Overlay-Rendering: Transformation
worldToScreenskaliert Doom-Koordinaten auf Bildgroesse, invertiert Y-Achse und ergaenzt Rand. Splits erscheinen als gelbe Linien, Leafs werden farblich zufaellig hervorgehoben. - Determinismus:
-seedbeeinflusst den RNG der BSP-Heuristik;seed=0wird intern auf1gesetzt, um nachvollziehbare Ergebnisse zu erhalten.
6. Entwicklungs- und Testleitfaden
- Abhaengigkeiten: Go >= 1.25, optional Graphviz (
dot) fuer DOT-zu-PNG-Konvertierung. - Build:
go build ./...erzeugt ein lokales Binary. - Direktausfuehrung:
go run ./main.go <flags>vermeidet separaten Build. - Codeformat:
gofmt -w . - Tests:
go test ./internal/...(Paketewad,mapfmt,geom,bsp,vizverfuegen ueber eigenstaendige Test-Suites). Top-Level-mainenthaelt bewusst keine Tests. - Beispieldaten: Die mitgelieferten
MYMAP*.waddienen als kleinskalige Input-Setups fuer manuelle und automatisierte Checks.
7. Grenzen und Erweiterungsideen
- Nicht abgedeckt: Parsing weiterer Lumps (SEGS, SSECTORS etc.), 3D-Features moderner Ports, automatisierte DOT->PNG-Pipeline ohne Graphviz-Installation.
- Moegliche Erweiterungen:
- Zusae tzliche Heuristiken (z.B. zufaellige Kandidatenauswahl, Hybridkosten).
- Erweiterte Statistiken (Split-Histogramme, Leaf-Flachenberechnung).
- CLI-Subcommands oder Konfigdatei-Unterstuetzung.
- Export weiterer Formate (JSON-Serialisierung der BSP-Struktur).
8. Projektressourcen
- Quellcode: Einstieg
main.go, Modulverzeichnisinternal/. - Dokumentation: Diese Datei, bestehende README.md als Schnellstart.
- Kontakt & Lizenz: Nicht im Repository hinterlegt; fuer Seminarzwecke bitte Betreuer bzw. Repository-Inhaber ansprechen.
Hinweis: Alle Beschreibungen basieren auf dem Stand der Quelldateien vom 30.09.2025. Aenderungen im Code sollten zeitnah in dieser Dokumentation nachvollzogen werden.