Welt-Texturen aus der .glb statt aus assets/textures/
Der Loader zieht jetzt die baseColorTexture jedes Materials aus dem BIN-Chunk und dekodiert sie (PNG, via png-Crate) → model::Texture mit Pixeln. Die Namenskonvention "Materialname = Dateiname" und der assets/textures/-Pfad für Welt-Texturen entfallen; assets/textures/ bleibt nur noch für UI/Fonts/Platzhalter. - engine::image: neuer, geteilter RGBA8-Image-Typ (aus tga.rs gezogen) plus PNG-Decoder. tga.rs liefert weiter denselben Typ. - gltf: material -> texture -> image -> bufferView auflösen, Bild aus BIN dekodieren; fehlt ein Glied, bleibt image None (Platzhalter). KHR_texture_transform (Blenders Mapping-Node) wird beim Laden in die UVs eingebacken. - model::Model: materials: Vec<String> -> textures: Vec<Texture>. - render: die Pixel je Schlüssel aus den Modellen sammeln (erstes Vorkommen gewinnt, Schlüssel ohne Bild -> Platzhalter). 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
937fbd6ede
commit
fc3494466e
+23
-5
@@ -6,6 +6,10 @@
|
||||
//! glTF ist der einzige 3D-Pfad (die OBJ- und Map-Loader-Pfade sind
|
||||
//! Geschichte), `gltf` der einzige Produzent.
|
||||
//!
|
||||
//! Texturen kommen als Pixel mit — der Loader zieht sie aus der `.glb`
|
||||
//! (baseColorTexture, PNG-Chunk im BIN), siehe [`Texture`]. Keine externe
|
||||
//! Namenskonvention mehr.
|
||||
//!
|
||||
//! Was ein Objekt *ist*, steuern seine Blender-Custom-Properties (keine
|
||||
//! Namens-Präfixe — Namen bleiben frei für die Autorin), siehe
|
||||
//! [`apply_props`]:
|
||||
@@ -22,6 +26,8 @@
|
||||
|
||||
use std::collections::HashMap;
|
||||
|
||||
use crate::engine::image::Image;
|
||||
|
||||
/// Blender-Custom-Properties eines Objekts/Empties (glTF-`extras`),
|
||||
/// Werte zu Strings vereinheitlicht.
|
||||
pub type Props = HashMap<String, String>;
|
||||
@@ -31,10 +37,22 @@ pub struct Model {
|
||||
/// Nodes ohne Mesh (Blender-Empties) — der Entity-Kanal: Marker für
|
||||
/// Spawn-Punkte, Trigger o.Ä., Bedeutung geben künftige Konsumenten.
|
||||
pub empties: Vec<Empty>,
|
||||
/// Distinkte Materialnamen in Auftrittsreihenfolge; `Object::tri_mats`
|
||||
/// indiziert hierhin. `""` steht für „Faces ohne Material" — der
|
||||
/// Konsument wählt dafür seinen Fallback (z.B. Platzhalter-Textur).
|
||||
pub materials: Vec<String>,
|
||||
/// Distinkte Texturen in Auftrittsreihenfolge; `Object::tri_mats`
|
||||
/// indiziert hierhin.
|
||||
pub textures: Vec<Texture>,
|
||||
}
|
||||
|
||||
/// Eine baseColorTexture aus der `.glb` (bzw. ein Material ohne Bild).
|
||||
pub struct Texture {
|
||||
/// Dedup-/Log-Schlüssel: der glTF-Bildname (Blender: Name des
|
||||
/// Bild-Datablocks), sonst der Materialname, sonst `""`. Texturen mit
|
||||
/// gleichem Schlüssel — auch über mehrere `.glb` — teilen sich auf der
|
||||
/// GPU eine Textur.
|
||||
pub key: String,
|
||||
/// Dekodierte Pixel (RGBA8, Ursprung oben links). `None`: Material ohne
|
||||
/// baseColorTexture oder unlesbares Bild → der Konsument nimmt seine
|
||||
/// Platzhalter-Textur.
|
||||
pub image: Option<Image>,
|
||||
}
|
||||
|
||||
pub struct Object {
|
||||
@@ -49,7 +67,7 @@ pub struct Object {
|
||||
/// Modell, rechnet der Loader sie aus den Flächen.
|
||||
pub normals: Vec<[f32; 3]>,
|
||||
pub tris: Vec<[usize; 3]>,
|
||||
/// Material-Index je Dreieck, parallel zu `tris` (→ `Model::materials`).
|
||||
/// Textur-Index je Dreieck, parallel zu `tris` (→ `Model::textures`).
|
||||
pub tri_mats: Vec<usize>,
|
||||
pub visible: bool,
|
||||
pub collider: bool,
|
||||
|
||||
Reference in New Issue
Block a user