test: spot_test — 2 axes de rotation + README des exemples
spot_test : le cube tourne désormais sur les axes X et Y (quaternions composés Y*X, vitesses légèrement différentes), pour que tous les sommets passent devant le cône et que l'effet du faisceau soit visible sur les 6 faces. Ajout de lib/examples/README.md : table des exemples avec la commande de lancement de chacun + conventions. À maintenir à jour à chaque nouvel exemple.
This commit is contained in:
@@ -0,0 +1,21 @@
|
||||
# Exemples
|
||||
|
||||
Chaque fichier `.rs` de ce répertoire est un **exemple autonome** découvert automatiquement par Cargo
|
||||
(`cargo build -p wsg-lib --examples`). Pour lancer un exemple :
|
||||
|
||||
```bash
|
||||
cargo run -p wsg-lib --example <nom>
|
||||
```
|
||||
|
||||
| Exemple | Commande | Description |
|
||||
|---------|----------|-------------|
|
||||
| `simple` | `cargo run -p wsg-lib --example simple` | Quad plat unlit (workflow déclaratif minimal, `AppBuilder` + scène auto). |
|
||||
| `cube` | `cargo run -p wsg-lib --example cube` | Cube texturé (damier procédural) éclairé par une lumière directionnelle + une point + une spot. |
|
||||
| `manual` | `cargo run -p wsg-lib --example manual` | Workflow bas-niveau : `Context`, `Renderer`, `PipelineCache` et `Mesh` directement (pas de façade `App`). |
|
||||
| `spot_test` | `cargo run -p wsg-lib --example spot_test` | Isolation de la lumière spot : seule une spot est allumée (ambiant quasi nul), cube qui tourne sur deux axes pour bien voir le faisceau orienté. |
|
||||
|
||||
## Conventions
|
||||
|
||||
- Les exemples sont **autonomes** : ils ne chargent aucun asset sur disque (textures procédurales, géométries codées).
|
||||
- Ils utilisent le workflow déclaratif (`AppBuilder` + `Scene`) sauf `manual` qui contourne la façade `App`.
|
||||
- Pour ajouter un nouvel exemple : créer un fichier `.rs` dans ce répertoire, le documenter ici, et le référencer dans le README racine si pertinent.
|
||||
@@ -15,9 +15,10 @@ use wsg_lib::app::AppBuilder;
|
||||
use wsg_lib::resources::Geometry;
|
||||
use wsg_lib::utils::WsgError;
|
||||
|
||||
/// Handler de test : cube qui tourne lentement, éclairé **uniquement** par une spot.
|
||||
/// Handler de test : cube qui tourne lentement sur deux axes, éclairé **uniquement** par une spot.
|
||||
struct SpotTest {
|
||||
angle: f32,
|
||||
angle_x: f32,
|
||||
angle_y: f32,
|
||||
}
|
||||
|
||||
/// Cube unitaire centré à l'origine (mêmes 24 sommets / 36 indices que l'exemple `cube`).
|
||||
@@ -105,15 +106,22 @@ impl AppHandler for SpotTest {
|
||||
}
|
||||
|
||||
fn update(&mut self, app: &mut wsg_lib::App) {
|
||||
// Rotation lente : le cône est fixe dans l'espace monde, on voit donc une région
|
||||
// fixe du cube rester éclairée pendant que le cube tourne.
|
||||
self.angle += 0.01;
|
||||
// Rotation lente sur deux axes (X et Y) : le cône est fixe dans l'espace monde,
|
||||
// on voit donc une région fixe du cube rester éclairée pendant que le cube tourne.
|
||||
// Les deux axes permettent de voir l'effet du faisceau sur les 6 faces sans
|
||||
// orientation privilégiée (la rotation Y seule laisserait les faces +Y/-Y fixes).
|
||||
self.angle_x += 0.007;
|
||||
self.angle_y += 0.011;
|
||||
let base = *app
|
||||
.scene
|
||||
.entity_transform("cube")
|
||||
.expect("cube entity present");
|
||||
let mut transform = base;
|
||||
transform.rotation = Quat::from_rotation_y(self.angle);
|
||||
// Composition Y * X : l'axe X tourne dans le repère déjà orienté en Y,
|
||||
// ce qui donne un mouvement de précession (tous les sommets passent devant
|
||||
// le cône à tour de rôle).
|
||||
transform.rotation =
|
||||
Quat::from_rotation_y(self.angle_y) * Quat::from_rotation_x(self.angle_x);
|
||||
app.scene.set_entity_transform("cube", transform);
|
||||
}
|
||||
}
|
||||
@@ -121,5 +129,8 @@ impl AppHandler for SpotTest {
|
||||
#[pollster::main]
|
||||
async fn main() -> Result<(), WsgError> {
|
||||
let app = AppBuilder::new().title("WSG Spot Test").build().await?;
|
||||
app.run(SpotTest { angle: 0.0 })
|
||||
app.run(SpotTest {
|
||||
angle_x: 0.0,
|
||||
angle_y: 0.0,
|
||||
})
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user