feat(data-only): mode openpos #9 (skeleton)

Ajoute un 10e viz_mode 'openpos' dans data_only_viz pour
afficher le squelette multi-personne sur un fond minimal qui
met en valeur les corps detectes.

state.py :
- viz_mode_names complete avec 'openpos' a l'index 9
- KEYMAP_VIDEO : touche 'p' -> openpos (slot precedemment libre)

shaders/scene.metal :
- nouveau mode_openpos : fond radial sombre avec une grille
  de points discrete + pulsation legere sur ~rms. Le bg sert
  juste a faire ressortir le skel_pipeline rendu PAR-DESSUS
  par le renderer (qui beneficie deja du depth_fog + palette
  par pid + epaisseur confiance-adaptee).
- bg_fragment dispatcher : mode == 9 -> mode_openpos

web/public/control.html :
- 10e bouton 'openpos' dans la grille #vizmodes.
This commit is contained in:
L'électron rare
2026-05-13 20:19:47 +02:00
parent 9d15c74c01
commit 2a26e2dfd4
3 changed files with 23 additions and 1 deletions
+20
View File
@@ -426,6 +426,25 @@ float3 mode_hands3d(float2 p, constant SceneUniforms& U) {
return col;
}
// ---- 9 openpos : fond minimal radial pour faire ressortir le squelette ----
// Le rendu des joints + bones se fait par le skel_pipeline rendu PAR-DESSUS
// (cf renderer.py). On laisse juste un degrade radial sombre pour le contraste.
float3 mode_openpos(float2 p, constant SceneUniforms& U) {
float r = length(p);
// Centre legerement plus clair, bords sombres. Touche de couleur
// chaude au centre selon rms pour reagir a la musique.
float3 inner = float3(0.05, 0.05, 0.10) + float3(0.30, 0.12, 0.18) * U.rms;
float3 outer = float3(0.01, 0.01, 0.02);
float3 col = mix(inner, outer, smoothstep(0.0, 1.4, r));
// Grille de points discrete pour donner une ref de profondeur
float2 g = fmod(p * 12.0, 2.0) - 1.0;
float dot_grid = exp(-dot(g, g) * 6.0) * 0.04;
col += float3(dot_grid);
// Pulsation legere sur le kick / drop
col *= 1.0 + U.rms * 0.4;
return col;
}
// ===== Fragment dispatcher =========================================
fragment float4 bg_fragment(VsOut in [[stage_in]],
@@ -444,6 +463,7 @@ fragment float4 bg_fragment(VsOut in [[stage_in]],
else if (mode == 6) color = mode_starfield(p, U);
else if (mode == 7) color = mode_bars(p, U);
else if (mode == 8) color = mode_hands3d(p, U);
else if (mode == 9) color = mode_openpos(p, U);
else color = mode_storm(p, U);
// Flash global + vignette
+2 -1
View File
@@ -116,6 +116,7 @@ class State:
"storm", "tunnel", "plasma", "kaleido",
"voronoi", "metaballs", "starfield", "bars",
"hands3d", # mode 8 : voyage 3D pilote par les mains
"openpos", # mode 9 : skeleton multi-personne sur fond minimal
)
# Preset open-data actif (USGS, Blitz, Wind, Kp/Bz, X-ray, OpenSky,
# Bsky, Pose, Cosmos) — affiche dans le HUD.
@@ -153,7 +154,7 @@ KEYMAP_VIDEO: tuple[tuple[str, str], ...] = (
("u", "starfield"),
("i", "bars"),
("o", "hands3d"), # voyage 3D pilote par les mains MediaPipe
# p : libre
("p", "openpos"), # skeleton multi-personne 3D-stylise
)
KEYMAP_AUDIO: tuple[tuple[str, str], ...] = (
+1
View File
@@ -179,6 +179,7 @@
<button class="scene-btn" data-viz="6">stars</button>
<button class="scene-btn" data-viz="7">bars</button>
<button class="scene-btn" data-viz="8">hands3d</button>
<button class="scene-btn" data-viz="9">openpos</button>
</div>
<h2 style="margin-top:18px">Retour SC</h2>