4acf1d821d
- AppHandler::render now receives the current &Frame; its default implementation renders the whole scene automatically via app.render_scene(frame.view()) (Option A). Users can simply not implement render for full auto-rendering. - Add Renderer::render_scene: batch-renders every scene entity in a single render pass. Factored per-mesh draw logic into a private draw_entity helper shared with Renderer::render. - Add App::render_scene(view) delegating to the Renderer. - Fill simple.rs with a real quad (mesh/material/entity) without importing wgpu; the scene now auto-renders via the trait default.
67 lines
2.3 KiB
Rust
67 lines
2.3 KiB
Rust
//! Workflow déclaratif minimal, sans manipulation WGPU explicite dans ce fichier.
|
|
//! `AppBuilder` ouvre la fenêtre, construit le `Context`/`Renderer` et fait tourner la boucle
|
|
//! update → render → present. La scène se rend automatiquement : la méthode `render()` par défaut
|
|
//! du trait `AppHandler` appelle `app.render_scene(frame.view())`, donc l'utilisateur n'implémente
|
|
//! même pas `render` ici — il ne fait que remplir `app.scene` avec un mesh, un matériau et une entité.
|
|
use std::sync::Arc;
|
|
use wsg_lib::AppHandler;
|
|
use wsg_lib::app::AppBuilder;
|
|
use wsg_lib::resources::{Material, Mesh, Vertex};
|
|
use wsg_lib::utils::WsgError;
|
|
|
|
struct MonQuad;
|
|
|
|
impl AppHandler for MonQuad {}
|
|
|
|
#[pollster::main]
|
|
async fn main() -> Result<(), WsgError> {
|
|
let mut app = AppBuilder::new().title("WSG Simple").build().await?;
|
|
|
|
// Enregistrement du shader, création du matériau et du mesh du quad (sans importer wgpu).
|
|
app.cache
|
|
.register_shader("basic", wsg_lib::utils::BASIC_SHADER_PATH)
|
|
.unwrap();
|
|
let vertices = [
|
|
Vertex {
|
|
position: [-0.5, 0.5, 0.0],
|
|
normal: [0.0, 0.0, 1.0],
|
|
uv: [0.0, 0.0],
|
|
color: [1.0, 0.0, 0.0, 1.0],
|
|
}, // Haut-Gauche (Rouge)
|
|
Vertex {
|
|
position: [0.5, 0.5, 0.0],
|
|
normal: [0.0, 0.0, 1.0],
|
|
uv: [1.0, 0.0],
|
|
color: [0.0, 1.0, 0.0, 1.0],
|
|
}, // Haut-Droite (Vert)
|
|
Vertex {
|
|
position: [0.5, -0.5, 0.0],
|
|
normal: [0.0, 0.0, 1.0],
|
|
uv: [1.0, 1.0],
|
|
color: [0.0, 0.0, 1.0, 1.0],
|
|
}, // Bas-Droite (Bleu)
|
|
Vertex {
|
|
position: [-0.5, -0.5, 0.0],
|
|
normal: [0.0, 0.0, 1.0],
|
|
uv: [0.0, 1.0],
|
|
color: [1.0, 1.0, 0.0, 1.0],
|
|
}, // Bas-Gauche (Jaune)
|
|
];
|
|
let indices: [u16; 6] = [0, 1, 2, 0, 2, 3];
|
|
|
|
let mesh = Arc::new(Mesh::new(app.renderer.device(), &vertices, Some(&indices)));
|
|
let material = Arc::new(Material::new(
|
|
app.renderer.format(),
|
|
"basic",
|
|
&mut app.cache,
|
|
));
|
|
|
|
app.scene.add_mesh("quad_mesh", mesh).unwrap();
|
|
app.scene.add_material("basic_material", material).unwrap();
|
|
app.scene
|
|
.add_entity("quad", "quad_mesh", "basic_material")
|
|
.unwrap();
|
|
|
|
app.run(MonQuad)
|
|
}
|