4a94ad4ac1
- geometry: ajoute le champ optionnel colors + constructeur new() et builder fluent (.with_normals/.with_uvs/.with_colors/.with_indices) + validate() et GeometryError (longueurs des tableaux optionnels + bornes des indices). - geometry: ajoute to_vertices()/try_into_vertices() -> Vec<Vertex> (zip avec défauts : normale [0,0,1], UV [0,0], couleur blanche) (D6). - mesh: remplace new()/with_material() par from_geometry(device, Arc<Geometry>, material); garde geometry: Arc<Geometry> (rétention CPU+GPU, D5) + nouveaux accesseurs geometry()/material()/set_material() (D4). - scene: create_mesh(id, Geometry, Option<&str>) déclare un mesh depuis une Geometry; expose Geometry via math (D2) et un ré-export de convenance resources. - exemples (cube/simple/manual) réécrits pour construire une Geometry.
54 lines
2.6 KiB
Rust
54 lines
2.6 KiB
Rust
//! Workflow déclaratif minimal, sans manipulation WGPU explicite dans ce fichier.
|
|
//! `AppBuilder` crée l'event loop puis `App::run` ouvre la fenêtre, construit le `Context`/`Renderer`
|
|
//! et fait tourner la boucle update → render → present. Depuis la migration winit 0.30, le GPU n'existe
|
|
//! qu'après `resumed` : c'est pourquoi l'enregistrement shader + la création mesh/matériau/entité vivent
|
|
//! dans le hook `AppHandler::setup`, appelé une fois le contexte prêt. Depuis l'Étape 7 le PipelineCache
|
|
//! vit dans la scène (`Scene::init_gpu`, appelé dans `resumed`) : on passe par `register_shader` +
|
|
//! `add_material_shader` + `create_mesh` + `add_entity`, le matériau étant lié au mesh. Depuis l'Étape 8
|
|
//! (DRAFT 8.4/8.5) le mesh est déclaré à partir d'une **`Geometry`** : positions + couleurs par sommet
|
|
//! pour le quad unlit. La scène se rend automatiquement : la méthode `render()` par défaut appelle
|
|
//! `app.render_scene(frame.view())`.
|
|
use wsg_lib::AppHandler;
|
|
use wsg_lib::app::AppBuilder;
|
|
use wsg_lib::resources::Geometry;
|
|
use wsg_lib::utils::WsgError;
|
|
|
|
struct MonQuad;
|
|
|
|
impl AppHandler for MonQuad {
|
|
fn setup(&mut self, app: &mut wsg_lib::App) {
|
|
// Exemple 2D plat : le shader `standard` en mode **unlit** (options.x = 1) renvoie la couleur
|
|
// du vertex telle quelle. Ainsi le 2D est un cas particulier du 3D — un seul pipeline pour tous.
|
|
app.renderer_mut().set_unlit(true);
|
|
app.scene
|
|
.register_shader("standard", wsg_lib::utils::STANDARD_SHADER_PATH)
|
|
.unwrap();
|
|
|
|
let geometry = Geometry::new(vec![
|
|
[-0.5, 0.5, 0.0], // Haut-Gauche
|
|
[0.5, 0.5, 0.0], // Haut-Droite
|
|
[0.5, -0.5, 0.0], // Bas-Droite
|
|
[-0.5, -0.5, 0.0], // Bas-Gauche
|
|
])
|
|
.with_normals(vec![[0.0, 0.0, 1.0]; 4])
|
|
.with_colors(vec![
|
|
[1.0, 0.0, 0.0, 1.0], // Haut-Gauche (Rouge)
|
|
[0.0, 1.0, 0.0, 1.0], // Haut-Droite (Vert)
|
|
[0.0, 0.0, 1.0, 1.0], // Bas-Droite (Bleu)
|
|
[1.0, 1.0, 0.0, 1.0], // Bas-Gauche (Jaune)
|
|
])
|
|
.with_indices(vec![0, 1, 2, 0, 2, 3]);
|
|
|
|
// Material par défaut : `None` laisse la Scene injecter son `standard` au rendu
|
|
// (`Scene::default_material`, DRAFT Étape 7.3.5) — on vérifie le chemin par défaut.
|
|
app.scene.create_mesh("quad_mesh", geometry, None).unwrap();
|
|
app.scene.add_entity("quad", "quad_mesh").unwrap();
|
|
}
|
|
}
|
|
|
|
#[pollster::main]
|
|
async fn main() -> Result<(), WsgError> {
|
|
let app = AppBuilder::new().title("WSG Simple").build().await?;
|
|
app.run(MonQuad)
|
|
}
|