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:
Jérôme Bousquié
2026-09-18 21:06:44 +02:00
parent 2582b6f571
commit cc26080ed0
2 changed files with 39 additions and 7 deletions
+18 -7
View File
@@ -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,
})
}