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:
co-authored by
Claude Sonnet 5
parent
307b52ae1f
commit
937fbd6ede
@@ -15,3 +15,6 @@ Toolchain (Rust ≥ 1.85). Das `cargo` aus den Distributions-Paketquellen
|
|||||||
- Anwendung bauen und ausführen: `cargo run`
|
- Anwendung bauen und ausführen: `cargo run`
|
||||||
|
|
||||||
Alternativ ohne Fenster/GPU in der Konsole: `cargo run -- --cli`
|
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).
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ Start in der Konsole gemeldet (`[model]`, `[audio]`, `[tex]`, …).
|
|||||||
## 3D / Blender
|
## 3D / Blender
|
||||||
|
|
||||||
- **Format:** glTF Binary (`.glb`) nach `assets/maps/props/` — alle Dateien
|
- **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
|
- **Beim Export anhaken:** „Include → Custom Properties" (sonst kommen
|
||||||
keine der Properties unten an!).
|
keine der Properties unten an!).
|
||||||
- **Maßstab:** 1 Blender-Meter = 1 Engine-Meter. Augenhöhe 1,6 m,
|
- **Maßstab:** 1 Blender-Meter = 1 Engine-Meter. Augenhöhe 1,6 m,
|
||||||
|
|||||||
+17
-2
@@ -5,6 +5,10 @@
|
|||||||
//! darüber (Game + Dialog-Modus + Befehls-Interpreter). Beide Frontends
|
//! darüber (Game + Dialog-Modus + Befehls-Interpreter). Beide Frontends
|
||||||
//! steuern dieselbe Session: das Fenster (`render`, Default) und die
|
//! steuern dieselbe Session: das Fenster (`render`, Default) und die
|
||||||
//! Konsolen-REPL (`cli`, via `--cli`).
|
//! 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 cli;
|
||||||
mod engine;
|
mod engine;
|
||||||
@@ -15,11 +19,22 @@ use engine::assets;
|
|||||||
use session::Session;
|
use session::Session;
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
|
let args: Vec<String> = std::env::args().collect();
|
||||||
let signals_path = assets::path("assets/signals.toml");
|
let signals_path = assets::path("assets/signals.toml");
|
||||||
let session = Session::new(signals_path.clone());
|
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);
|
cli::run(session, &signals_path);
|
||||||
} else {
|
} 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
@@ -44,14 +44,19 @@ const EYE_SMOOTH_TAU: f32 = 0.06;
|
|||||||
/// Maximaler vertikaler Nachlauf der Kamera hinter den Füßen (units).
|
/// Maximaler vertikaler Nachlauf der Kamera hinter den Füßen (units).
|
||||||
const EYE_MAX_LAG: f32 = 0.6;
|
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
|
// Init-Signal feuern, bevor das Fenster steht (kann bereits einen
|
||||||
// Dialog öffnen — dann startet die Welt eben pausiert).
|
// Dialog öffnen — dann startet die Welt eben pausiert).
|
||||||
for line in session.start() { println!("{line}"); }
|
for line in session.start() { println!("{line}"); }
|
||||||
|
|
||||||
// Die Welt sind alle .glb unter assets/maps/props/. Decode (CPU) hier,
|
// Die Welt sind alle .glb unter `maps_dir` (Default DEFAULT_MAPS_DIR, per
|
||||||
// Upload (GPU) später in `Gpu` — die beiden bleiben getrennt.
|
// `--maps <dir>` überschrieben). Decode (CPU) hier, Upload (GPU) später in
|
||||||
let models = load_models(&assets::path("assets/maps/props"));
|
// `Gpu` — die beiden bleiben getrennt.
|
||||||
|
let models = load_models(maps_dir);
|
||||||
|
|
||||||
// Eine geteilte Texturliste über alle Modelle, damit ihre Meshes
|
// Eine geteilte Texturliste über alle Modelle, damit ihre Meshes
|
||||||
// denselben Index-Raum benutzen und zu einem Buffer verschmelzen können.
|
// denselben Index-Raum benutzen und zu einem Buffer verschmelzen können.
|
||||||
|
|||||||
Reference in New Issue
Block a user