examples: fix simple.rs to compile as the 15-line declarative model
- Replace the broken App::new() (which does not exist) with AppBuilder. - Strip it down to the PLAN's ~15-line target: no explicit winit/wgpu, AppHandler render() left empty (scene rendering still on the roadmap). - Verified: builds, opens a black window and runs the update->render->present loop until closed. - Update README/PLAN wording now that the simple example compiles (it still does not draw a scene).
This commit is contained in:
@@ -145,7 +145,7 @@ pollster = "0.4" # only if you use the async AppBuilder
|
|||||||
| Run the working example | `cargo run -p wsg-lib --example manual` |
|
| Run the working example | `cargo run -p wsg-lib --example manual` |
|
||||||
| Check everything (incl. examples) | `cargo check --all-targets` |
|
| Check everything (incl. examples) | `cargo check --all-targets` |
|
||||||
|
|
||||||
The `manual` example is the reference for the working workflow. The `simple` example (App facade) is work in progress and currently does not compile.
|
The `manual` example is the reference for the working, pixel-rendering workflow. The `simple` example (App facade) now compiles and opens a window with a running update → render → present loop, but it does not draw a scene yet (see [Roadmap](#roadmap)).
|
||||||
|
|
||||||
## Documentation
|
## Documentation
|
||||||
|
|
||||||
|
|||||||
+5
-5
@@ -13,9 +13,9 @@ Ce plan définit les étapes prioritaires pour finaliser l'architecture actuelle
|
|||||||
|
|
||||||
> **Statut réel (à jour au 2026-09-14).** Ce plan couvre la phase de *consolidation* passée ; la source
|
> **Statut réel (à jour au 2026-09-14).** Ce plan couvre la phase de *consolidation* passée ; la source
|
||||||
> de vérité sur l'état actuel est **README.md** et le code. Plusieurs cases `[X]` ci-dessous ont été
|
> de vérité sur l'état actuel est **README.md** et le code. Plusieurs cases `[X]` ci-dessous ont été
|
||||||
> re-corrigées car elles ne reflétaient plus la réalité : notamment l'exemple `simple` **ne compile pas**
|
> re-corrigées car elles ne reflétaient plus la réalité : notamment le rendu de la `Scene` n'est
|
||||||
> actuellement (`App::new()` obsolète, à remplacer par `AppBuilder`) et le rendu de la `Scene` n'est
|
> **pas automatisé** (items Phase 2 et Check-list concernés). Depuis, `simple.rs` a été mis en
|
||||||
> **pas automatisé** (items Phase 2 et Check-list concernés).
|
> conformité (API `AppBuilder`, ~15 lignes, compilation sans importer `winit`/`wgpu`).
|
||||||
|
|
||||||
## Phase 1 : Finalisation et Nettoyage de l'Existant (Priorité Absolue)
|
## Phase 1 : Finalisation et Nettoyage de l'Existant (Priorité Absolue)
|
||||||
|
|
||||||
@@ -57,7 +57,7 @@ Une fois la plomberie encapsulée, nous devons rendre l'assemblage des objets co
|
|||||||
|
|
||||||
### Refonte des Exemples
|
### Refonte des Exemples
|
||||||
|
|
||||||
- [ ] `simple.rs` doit devenir le modèle : **15 lignes** de code, pas de manipulation WGPU explicite (actuellement ne compile pas — API obsolète `App::new()` → `AppBuilder`).
|
- [X] `simple.rs` doit devenir le modèle : **15 lignes** de code, pas de manipulation WGPU explicite (mis en conformité : `AppBuilder`, compile sans `winit`/`wgpu`).
|
||||||
- [X] `manual.rs` doit rester disponible en tant que tutoriel pour ceux qui veulent contourner l'abstraction App.
|
- [X] `manual.rs` doit rester disponible en tant que tutoriel pour ceux qui veulent contourner l'abstraction App.
|
||||||
|
|
||||||
### Nettoyage du Code Interne
|
### Nettoyage du Code Interne
|
||||||
@@ -74,7 +74,7 @@ Une fois les phases 1 à 3 validées, nous pourrons introduire :
|
|||||||
|
|
||||||
## Check-list de Vérification pour le LLM d'Assistance
|
## Check-list de Vérification pour le LLM d'Assistance
|
||||||
|
|
||||||
- [ ] Est-ce que `simple.rs` compile sans importer `winit` ou `wgpu` ? (ne compile pas actuellement ; `App::new()` → `AppBuilder`)
|
- [X] Est-ce que `simple.rs` compile sans importer `winit` ou `wgpu` ? (oui — modèle 15 lignes, API `AppBuilder`)
|
||||||
- [ ] Est-ce que `App::run` gère bien le cycle update → render → present ? (boucle + présentation OK, mais `render()` ne peut pas encore dessiner — vue de frame non exposée)
|
- [ ] Est-ce que `App::run` gère bien le cycle update → render → present ? (boucle + présentation OK, mais `render()` ne peut pas encore dessiner — vue de frame non exposée)
|
||||||
- [X] Les modules sont-ils bien exposés via `lib.rs` ?
|
- [X] Les modules sont-ils bien exposés via `lib.rs` ?
|
||||||
- [X] `pollster` est-il uniquement en dev-dependencies ?
|
- [X] `pollster` est-il uniquement en dev-dependencies ?
|
||||||
|
|||||||
+11
-51
@@ -1,59 +1,19 @@
|
|||||||
use wsg_lib::resources::{Material, Mesh, Vertex};
|
//! Workflow déclaratif minimal (~15 lignes), sans manipulation WGPU explicite.
|
||||||
use wsg_lib::utils;
|
//! `AppBuilder` ouvre la fenêtre, construit le `Context`/`Renderer` et fait tourner la boucle
|
||||||
|
//! update → render → present. Le rendu automatisé de la scène n'est pas encore en place
|
||||||
|
//! (README, Roadmap étape 1) : `render()` est donc vide pour l'instant.
|
||||||
|
use wsg_lib::app::AppBuilder;
|
||||||
|
use wsg_lib::utils::WsgError;
|
||||||
use wsg_lib::{App, AppHandler};
|
use wsg_lib::{App, AppHandler};
|
||||||
|
|
||||||
// 1. On définit notre "Jeu" qui implémente le comportement
|
struct MonQuad;
|
||||||
struct MonQuad {
|
|
||||||
mesh: Mesh,
|
|
||||||
material: Material,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl AppHandler for MonQuad {
|
impl AppHandler for MonQuad {
|
||||||
fn render(&mut self, app: &mut App) {}
|
fn render(&mut self, _app: &mut App) {}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[pollster::main]
|
#[pollster::main]
|
||||||
async fn main() -> Result<(), wsg_lib::utils::WsgError> {
|
async fn main() -> Result<(), WsgError> {
|
||||||
// 2. Initialisation via le Builder
|
let app = AppBuilder::new().title("WSG Simple").build().await?;
|
||||||
let mut app = App::new().await?;
|
app.run(MonQuad)
|
||||||
|
|
||||||
// 3. Setup des ressources (déclaration)
|
|
||||||
app.cache
|
|
||||||
.register_shader("basic", utils::BASIC_SHADER_PATH)
|
|
||||||
.unwrap();
|
|
||||||
|
|
||||||
let vertices: [Vertex; 4] = [
|
|
||||||
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],
|
|
||||||
},
|
|
||||||
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],
|
|
||||||
},
|
|
||||||
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],
|
|
||||||
},
|
|
||||||
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],
|
|
||||||
},
|
|
||||||
];
|
|
||||||
let indices: [u16; 6] = [0, 1, 2, 0, 2, 3];
|
|
||||||
|
|
||||||
let mesh = Mesh::new(app.context.device(), &vertices, Some(&indices));
|
|
||||||
let material = Material::new(app.renderer.format(), "basic", &mut app.cache);
|
|
||||||
|
|
||||||
// 4. Lancement de la boucle (la magie opère ici)
|
|
||||||
let handler = MonQuad { mesh, material };
|
|
||||||
app.run(handler)
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user