render3d Textur-Spike: RenderStyle::Textured real (Bild-Textur auf Waenden)

- Zweiter Vertex-Pfad [pos,normal,uv] via build_walls_mesh_textured, ABGELEITET
  aus dem fertigen Mesh (Positionen/Normalen/Indizes 1:1) -> Alt-Pfad
  [pos,normal,color] bitgleich; per Regressionstest belegt.
- Prozedurale 256x256-Schachbrett-Textur (kein Asset, kein image-Crate),
  Sampler Linear/Repeat, Textur-Bind-Group group 1 (Globals bleibt group 0).
- MESH_TEXTURED_WGSL: gleiche Beleuchtung wie MESH_WGSL, Albedo aus textureSample.
  Pipeline in Depth/MSAA/Color-Target bitidentisch zur Haupt-Pipeline.
- UV planar in Metern: Mantel u=entlang Achse/v=Hoehe, Deckel u=x/v=z;
  weltraumstabil, keine Verzerrung an Gehrungen. 1 Kachel = 1 m.
- spike3d: Taste T schaltet Shaded <-> Textured zur Laufzeit (kein Re-Meshing).
- Feature-gegatet, Default-Build/-Darstellung unveraendert. cargo test 58 (default)
  / 59 (--features render, inkl. naga-Test MESH_TEXTURED_WGSL) gruen.
This commit is contained in:
2026-07-05 00:30:34 +02:00
parent ecefe61611
commit 0ca3b1dd57
6 changed files with 565 additions and 15 deletions
+27 -2
View File
@@ -13,13 +13,14 @@
use std::sync::Arc;
use render3d::gpu::Renderer;
use render3d::gpu::{RenderStyle, Renderer};
use render3d::math::orbit_eye;
use render3d::types::{Camera, Projection, WallInput};
use winit::application::ApplicationHandler;
use winit::event::{ElementState, MouseButton, MouseScrollDelta, WindowEvent};
use winit::event::{ElementState, KeyEvent, MouseButton, MouseScrollDelta, WindowEvent};
use winit::event_loop::{ActiveEventLoop, EventLoop};
use winit::keyboard::{KeyCode, PhysicalKey};
use winit::window::{Window, WindowId};
/// Demo-Szene: ein rechteckiger Raum (4 Aussenwaende) plus eine Innenwand. Achsen
@@ -196,6 +197,9 @@ struct App {
orbit: Orbit,
dragging: bool,
last_cursor: (f64, f64),
/// Darstellung: false = Shaded (Default, unveraendert), true = Textured
/// (prozedurales Schachbrett auf den Wandflaechen). Per Taste `T` umschaltbar.
textured: bool,
}
impl ApplicationHandler for App {
@@ -223,6 +227,27 @@ impl ApplicationHandler for App {
state.resize(size.width, size.height);
state.window.request_redraw();
}
WindowEvent::KeyboardInput {
event:
KeyEvent {
physical_key: PhysicalKey::Code(KeyCode::KeyT),
state: ElementState::Pressed,
repeat: false,
..
},
..
} => {
// `T` schaltet Shaded <-> Textured um (Laufzeit, kein Re-Meshing:
// der Renderer haelt beide Vertex-Puffer bereit).
self.textured = !self.textured;
let style = if self.textured {
RenderStyle::Textured
} else {
RenderStyle::Shaded
};
state.renderer.set_render_style(style);
state.window.request_redraw();
}
WindowEvent::MouseInput { state: s, button, .. } => {
if button == MouseButton::Left {
self.dragging = s == ElementState::Pressed;