Files
bspviz/main.go
2025-09-28 13:48:56 +02:00

87 lines
2.6 KiB
Go

package main
import (
"bspviz/internal/app"
"bspviz/internal/geom"
"flag"
"fmt"
"log"
"os"
"strings"
)
func usageAndExit(msg string, code int) {
fmt.Fprintf(os.Stderr, "Fehler: %s\n\n", msg)
fmt.Fprintf(os.Stderr, "Beispiel:\n go run ./main.go -wad MYMAP.wad -map MAP01 -info\n\n")
fmt.Fprintf(os.Stderr, "Verfügbare Flags:\n")
flag.PrintDefaults()
os.Exit(code)
}
func main() {
// Flags
wadPath := flag.String("wad", "", "Pfad zur WAD (required)")
mapMarker := flag.String("map", "MAP01", "Map-Marker (z.B. MAP01, E1M1, MYMAP)")
listOnly := flag.Bool("list", false, "Nur Directory auflisten und beenden")
info := flag.Bool("info", false, "Roh-Infos zur Map (Counts von VERTEXES/LINEDEFS)")
extract := flag.String("extract", "", "Kommagetrennte Lump-Namen aus der Map extrahieren (z.B. VERTEXES,LINEDEFS)")
outdir := flag.String("out", ".", "Zielordner für -extract")
geomtest := flag.Bool("geomtest", false, "Geometrie-Check: Segmente/AABB/Probe-Split ausgeben")
buildbsp := flag.Bool("buildbsp", false, "BSP bauen und Metriken ausgeben")
alpha := flag.Float64("alpha", 10, "Kosten: Gewicht für Splits")
beta := flag.Float64("beta", 1, "Kosten: Gewicht für Balance")
eps := flag.Float64("eps", geom.EPS, "Epsilon für Geometrie")
leaf := flag.Int("leafmax", 12, "max. Segmente pro Leaf")
depth := flag.Int("maxdepth", 32, "max. Rekursionstiefe")
cands := flag.Int("cands", 16, "Anzahl Kandidaten (Subsample)")
seed := flag.Int64("seed", 0, "RNG-Seed (0 = default)")
dotOut := flag.String("dot", "", "DOT-Export-Datei (optional)")
treePNG := flag.String("treepng", "", "Graphviz-Baum als PNG (optional, benötigt -dot)")
overlay := flag.String("overlay", "", "Map-Overlay als PNG (optional)")
flag.Parse()
if strings.TrimSpace(*wadPath) == "" {
usageAndExit("Flag -wad fehlt. Bitte Pfad zu einer Doom-kompatiblen WAD-Datei angeben.", 2)
}
var extractLumps []string
if strings.TrimSpace(*extract) != "" {
want := strings.Split(*extract, ",")
extractLumps = make([]string, 0, len(want))
for _, name := range want {
n := strings.ToUpper(strings.TrimSpace(name))
if n == "" {
continue
}
extractLumps = append(extractLumps, n)
}
}
opts := app.Options{
WadPath: *wadPath,
MapMarker: *mapMarker,
ListOnly: *listOnly,
Info: *info,
Extract: extractLumps,
OutDir: *outdir,
GeomTest: *geomtest,
BuildBSP: *buildbsp,
Alpha: *alpha,
Beta: *beta,
Eps: *eps,
LeafMax: *leaf,
MaxDepth: *depth,
Cands: *cands,
Seed: *seed,
DotOut: *dotOut,
TreePNG: *treePNG,
Overlay: *overlay,
Out: os.Stdout,
}
if err := app.Run(opts); err != nil {
log.Fatal(err)
}
}