maps-Verzeichnis per --maps <dir> statt hartkodiert

Das Fenster-Frontend lud die Welt-.glb aus dem festen String
"assets/maps/props". Jetzt ist das nur noch der Default
(render::DEFAULT_MAPS_DIR); `main` parst `--maps <dir>` und reicht das
Verzeichnis an render::run weiter. Der übergebene Pfad wird wie angegeben
benutzt (relativ zum CWD), der Default wie bisher relativ zum
Asset-Basisverzeichnis.

Damit lässt sich z.B. `assets/maps/inactive` ohne Neubau laden. Die CLI
lädt weiterhin keine Modelle und ignoriert das Flag.

README + artist.md ergänzt.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0196AM4UyAJEXVtPvp5DdKr8
This commit is contained in:
irrlicht
2026-09-01 23:24:17 +02:00
co-authored by Claude Sonnet 5
parent 307b52ae1f
commit 937fbd6ede
4 changed files with 30 additions and 7 deletions
+3
View File
@@ -15,3 +15,6 @@ Toolchain (Rust ≥ 1.85). Das `cargo` aus den Distributions-Paketquellen
- Anwendung bauen und ausführen: `cargo run`
Alternativ ohne Fenster/GPU in der Konsole: `cargo run -- --cli`
Ein anderes Welt-Verzeichnis laden (Default `assets/maps/props/`):
`cargo run -- --maps <ordner>` (Pfad relativ zum aktuellen Verzeichnis).
+1 -1
View File
@@ -6,7 +6,7 @@ Start in der Konsole gemeldet (`[model]`, `[audio]`, `[tex]`, …).
## 3D / Blender
- **Format:** glTF Binary (`.glb`) nach `assets/maps/props/` — alle Dateien
dort werden beim Start geladen.
dort werden beim Start geladen (anderer Ordner: `cargo run -- --maps <dir>`).
- **Beim Export anhaken:** „Include → Custom Properties" (sonst kommen
keine der Properties unten an!).
- **Maßstab:** 1 Blender-Meter = 1 Engine-Meter. Augenhöhe 1,6 m,
+17 -2
View File
@@ -5,6 +5,10 @@
//! darüber (Game + Dialog-Modus + Befehls-Interpreter). Beide Frontends
//! steuern dieselbe Session: das Fenster (`render`, Default) und die
//! Konsolen-REPL (`cli`, via `--cli`).
//!
//! Flags: `--cli` startet die Konsolen-REPL statt des Fensters; `--maps <dir>`
//! überschreibt das Verzeichnis der Welt-`.glb` (Pfad wie angegeben, also
//! relativ zum CWD).
mod cli;
mod engine;
@@ -15,11 +19,22 @@ use engine::assets;
use session::Session;
fn main() {
let args: Vec<String> = std::env::args().collect();
let signals_path = assets::path("assets/signals.toml");
let session = Session::new(signals_path.clone());
if std::env::args().any(|a| a == "--cli") {
if args.iter().any(|a| a == "--cli") {
cli::run(session, &signals_path);
} else {
render::run(session);
let maps_dir = arg_value(&args, "--maps")
.unwrap_or_else(|| assets::path(render::DEFAULT_MAPS_DIR));
render::run(session, &maps_dir);
}
}
/// Wert eines `--flag <wert>`-Paars aus `args`, falls das Flag vorkommt und
/// ein Wort folgt.
fn arg_value(args: &[String], flag: &str) -> Option<String> {
args.iter().position(|a| a == flag)
.and_then(|i| args.get(i + 1))
.cloned()
}
+9 -4
View File
@@ -44,14 +44,19 @@ const EYE_SMOOTH_TAU: f32 = 0.06;
/// Maximaler vertikaler Nachlauf der Kamera hinter den Füßen (units).
const EYE_MAX_LAG: f32 = 0.6;
pub fn run(mut session: Session) {
/// Default-Verzeichnis der Welt-`.glb` (relativ zum Asset-Basisverzeichnis).
/// `main` löst es auf und lässt `--maps <dir>` es überschreiben.
pub const DEFAULT_MAPS_DIR: &str = "assets/maps/props";
pub fn run(mut session: Session, maps_dir: &str) {
// Init-Signal feuern, bevor das Fenster steht (kann bereits einen
// Dialog öffnen — dann startet die Welt eben pausiert).
for line in session.start() { println!("{line}"); }
// Die Welt sind alle .glb unter assets/maps/props/. Decode (CPU) hier,
// Upload (GPU) später in `Gpu` — die beiden bleiben getrennt.
let models = load_models(&assets::path("assets/maps/props"));
// Die Welt sind alle .glb unter `maps_dir` (Default DEFAULT_MAPS_DIR, per
// `--maps <dir>` überschrieben). Decode (CPU) hier, Upload (GPU) später in
// `Gpu` — die beiden bleiben getrennt.
let models = load_models(maps_dir);
// Eine geteilte Texturliste über alle Modelle, damit ihre Meshes
// denselben Index-Raum benutzen und zu einem Buffer verschmelzen können.