fix(debug): defer hand tracking startup
This commit is contained in:
@@ -9,6 +9,7 @@ export function SceneLoadingOverlay({
|
|||||||
}: SceneLoadingOverlayProps): React.JSX.Element | null {
|
}: SceneLoadingOverlayProps): React.JSX.Element | null {
|
||||||
const isReady = state.status === "ready";
|
const isReady = state.status === "ready";
|
||||||
const progress = Math.round(Math.max(0, Math.min(1, state.progress)) * 100);
|
const progress = Math.round(Math.max(0, Math.min(1, state.progress)) * 100);
|
||||||
|
const helperText = getLoadingHelperText(state.progress);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div
|
<div
|
||||||
@@ -17,6 +18,7 @@ export function SceneLoadingOverlay({
|
|||||||
>
|
>
|
||||||
<div className="scene-loading-overlay__content">
|
<div className="scene-loading-overlay__content">
|
||||||
<strong>{state.currentStep}</strong>
|
<strong>{state.currentStep}</strong>
|
||||||
|
<p>{helperText}</p>
|
||||||
<div className="scene-loading-overlay__track">
|
<div className="scene-loading-overlay__track">
|
||||||
<span style={{ width: `${progress}%` }} />
|
<span style={{ width: `${progress}%` }} />
|
||||||
<em>{progress}%</em>
|
<em>{progress}%</em>
|
||||||
@@ -25,3 +27,19 @@ export function SceneLoadingOverlay({
|
|||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function getLoadingHelperText(progress: number): string {
|
||||||
|
if (progress >= 0.95) {
|
||||||
|
return "Finalisation de la scène et de la première frame.";
|
||||||
|
}
|
||||||
|
|
||||||
|
if (progress >= 0.7) {
|
||||||
|
return "Préparation des collisions et du gameplay.";
|
||||||
|
}
|
||||||
|
|
||||||
|
if (progress >= 0.25) {
|
||||||
|
return "Chargement progressif de la map autour du joueur.";
|
||||||
|
}
|
||||||
|
|
||||||
|
return "Récupération des données et modèles nécessaires.";
|
||||||
|
}
|
||||||
|
|||||||
@@ -466,6 +466,16 @@ canvas {
|
|||||||
text-transform: uppercase;
|
text-transform: uppercase;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.scene-loading-overlay p {
|
||||||
|
max-width: 290px;
|
||||||
|
margin: -8px 0 0;
|
||||||
|
color: #64748b;
|
||||||
|
font-size: 12px;
|
||||||
|
font-weight: 500;
|
||||||
|
line-height: 1.45;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
.scene-loading-overlay__track {
|
.scene-loading-overlay__track {
|
||||||
position: relative;
|
position: relative;
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
|
|||||||
@@ -24,9 +24,6 @@ export function HandTrackingProvider({
|
|||||||
children: ReactNode;
|
children: ReactNode;
|
||||||
}): React.JSX.Element {
|
}): React.JSX.Element {
|
||||||
const sceneMode = useSceneMode();
|
const sceneMode = useSceneMode();
|
||||||
const handTrackingSource = useDebugStore((debug) =>
|
|
||||||
debug.getHandTrackingSource(),
|
|
||||||
);
|
|
||||||
const repairNeedsHands = useGameStore((state) => {
|
const repairNeedsHands = useGameStore((state) => {
|
||||||
switch (state.mainState) {
|
switch (state.mainState) {
|
||||||
case "bike":
|
case "bike":
|
||||||
@@ -44,20 +41,34 @@ export function HandTrackingProvider({
|
|||||||
const enabled =
|
const enabled =
|
||||||
repairNeedsHands ||
|
repairNeedsHands ||
|
||||||
(sceneMode === "physics" && (nearby || holding || handHolding));
|
(sceneMode === "physics" && (nearby || holding || handHolding));
|
||||||
const backendSnapshot = useRemoteHandTracking({
|
|
||||||
enabled: enabled && handTrackingSource === "backend",
|
|
||||||
});
|
|
||||||
const browserSnapshot = useBrowserHandTracking({
|
|
||||||
enabled: enabled && handTrackingSource === "browser",
|
|
||||||
});
|
|
||||||
const snapshot =
|
|
||||||
handTrackingSource === "browser" ? browserSnapshot : backendSnapshot;
|
|
||||||
|
|
||||||
|
if (!enabled) {
|
||||||
return (
|
return (
|
||||||
<HandTrackingContext
|
<HandTrackingContext value={HAND_TRACKING_IDLE_SNAPSHOT}>
|
||||||
value={enabled ? snapshot : HAND_TRACKING_IDLE_SNAPSHOT}
|
|
||||||
>
|
|
||||||
{children}
|
{children}
|
||||||
</HandTrackingContext>
|
</HandTrackingContext>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return <ActiveHandTrackingProvider>{children}</ActiveHandTrackingProvider>;
|
||||||
|
}
|
||||||
|
|
||||||
|
function ActiveHandTrackingProvider({
|
||||||
|
children,
|
||||||
|
}: {
|
||||||
|
children: ReactNode;
|
||||||
|
}): React.JSX.Element {
|
||||||
|
const handTrackingSource = useDebugStore((debug) =>
|
||||||
|
debug.getHandTrackingSource(),
|
||||||
|
);
|
||||||
|
const backendSnapshot = useRemoteHandTracking({
|
||||||
|
enabled: handTrackingSource === "backend",
|
||||||
|
});
|
||||||
|
const browserSnapshot = useBrowserHandTracking({
|
||||||
|
enabled: handTrackingSource === "browser",
|
||||||
|
});
|
||||||
|
const snapshot =
|
||||||
|
handTrackingSource === "browser" ? browserSnapshot : backendSnapshot;
|
||||||
|
|
||||||
|
return <HandTrackingContext value={snapshot}>{children}</HandTrackingContext>;
|
||||||
|
}
|
||||||
|
|||||||
@@ -103,7 +103,6 @@ export class Debug {
|
|||||||
|
|
||||||
if (this.gui) {
|
if (this.gui) {
|
||||||
this.gui.open();
|
this.gui.open();
|
||||||
this.createOrderedFolders();
|
|
||||||
|
|
||||||
this.gui
|
this.gui
|
||||||
.add(this.controls, "cameraMode", { Player: "player", Debug: "debug" })
|
.add(this.controls, "cameraMode", { Player: "player", Debug: "debug" })
|
||||||
@@ -137,6 +136,8 @@ export class Debug {
|
|||||||
this.emit();
|
this.emit();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
this.createOrderedFolders();
|
||||||
|
|
||||||
const handTrackingFolder = this.createFolder("Hand Tracking");
|
const handTrackingFolder = this.createFolder("Hand Tracking");
|
||||||
|
|
||||||
handTrackingFolder
|
handTrackingFolder
|
||||||
|
|||||||
Reference in New Issue
Block a user