From 2a26e2dfd4be82ec05367e48589a381771c17556 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=27=C3=A9lectron=20rare?= <108685187+electron-rare@users.noreply.github.com> Date: Wed, 13 May 2026 20:19:47 +0200 Subject: [PATCH] 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. --- data_only_viz/shaders/scene.metal | 20 ++++++++++++++++++++ data_only_viz/state.py | 3 ++- data_only_viz/web/public/control.html | 1 + 3 files changed, 23 insertions(+), 1 deletion(-) diff --git a/data_only_viz/shaders/scene.metal b/data_only_viz/shaders/scene.metal index 2f3b514..675fdf4 100644 --- a/data_only_viz/shaders/scene.metal +++ b/data_only_viz/shaders/scene.metal @@ -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 diff --git a/data_only_viz/state.py b/data_only_viz/state.py index 23440de..e921f78 100644 --- a/data_only_viz/state.py +++ b/data_only_viz/state.py @@ -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], ...] = ( diff --git a/data_only_viz/web/public/control.html b/data_only_viz/web/public/control.html index 6e6a868..2e19fc8 100644 --- a/data_only_viz/web/public/control.html +++ b/data_only_viz/web/public/control.html @@ -179,6 +179,7 @@ +