feat(launcher): AV-Live-Body row dans menubar

Ajoute une ProcessRow AV-Live-Body toujours visible dans le
menubar (sauf en mode bodyMesh ou la ligne est deja affichee).
L'utilisateur peut maintenant lancer la fenetre RealityKit a la
demande depuis n'importe quel mode pour acceder au panel de
reglages visuels (touche S).

Le guard 'useMultiHMR' dans startBodyApp est supprime : sans
worker Multi-HMR la fenetre affichera juste la cam et un fond
vide pour le mesh, mais le panel reste utilisable pour tester
les sliders / toggles.
This commit is contained in:
L'électron rare
2026-05-13 13:43:58 +02:00
parent 9cbcbd2025
commit a276d00bc6
2 changed files with 16 additions and 10 deletions
@@ -74,15 +74,6 @@ struct MenuBarContent: View {
.toggleStyle(.switch)
.font(.caption)
.padding(.horizontal, 4)
if processManager.bodyAppRunning {
ProcessRow(
title: "AV-Live-Body",
subtitle: "RealityKit SMPL-X mesh renderer",
isRunning: true,
start: processManager.startBodyApp,
stop: processManager.stopBodyApp
)
}
} else {
ProcessRow(
title: "Oscilloscope",
@@ -114,6 +105,19 @@ struct MenuBarContent: View {
stop: processManager.stopDataFeeds
)
// AV-Live-Body toujours disponible, lancable a la demande
// depuis n'importe quel mode (le worker Multi-HMR doit tourner
// pour qu'il recoive des vertices, sinon fenetre vide).
if processManager.mode != .bodyMesh {
ProcessRow(
title: "AV-Live-Body",
subtitle: "RealityKit mesh + cam (touche S = panel)",
isRunning: processManager.bodyAppRunning,
start: processManager.startBodyApp,
stop: processManager.stopBodyApp
)
}
if processManager.mode == .full {
HStack {
Button(action: processManager.openBrowser) {
@@ -690,7 +690,9 @@ final class ProcessManager: ObservableObject {
/// Lance l'app SwiftPM AV-Live-Body (RealityKit) qui ecoute les
/// vertices SMPL-X sur :57130. Necessite useMultiHMR=true.
func startBodyApp() {
guard useMultiHMR else { return }
// Lancable a la demande depuis n'importe quel mode. Si Multi-HMR
// n'est pas actif, la fenetre affichera juste la cam (pas de mesh)
// mais le panel S et les reglages restent fonctionnels.
guard bodyAppProc == nil else { return }
let pkgDir = URL(fileURLWithPath: metalVizDir)
.deletingLastPathComponent()