From 3e66e311174cdc745573560038506eb61559de0a Mon Sep 17 00:00:00 2001 From: Tom Boullay Date: Tue, 2 Jun 2026 13:51:33 +0200 Subject: [PATCH 01/18] feat(graphics): add max preset (no chunk streaming, LOD@50m) Restore ultra to its original behaviour (50m chunk streaming, HD within 20m, no fog) and introduce a new max preset that disables chunk streaming entirely (loads all chunks unconditionally) and pushes the HD/LOD swap distance to 50m. Add chunkStreamingEnabled flag to GraphicsPresetConfig so the streaming gate honours the preset. The settings card label shows 'All' when streaming is off. --- src/components/ui/GameSettingsMenu.tsx | 6 +++-- src/data/world/graphicsConfig.ts | 22 ++++++++++++++++++- .../map-instancing/MapInstancingSystem.tsx | 1 + src/world/vegetation/VegetationSystem.tsx | 1 + 4 files changed, 27 insertions(+), 3 deletions(-) diff --git a/src/components/ui/GameSettingsMenu.tsx b/src/components/ui/GameSettingsMenu.tsx index abd52ce..f30c6f0 100644 --- a/src/components/ui/GameSettingsMenu.tsx +++ b/src/components/ui/GameSettingsMenu.tsx @@ -105,6 +105,9 @@ function GraphicsPresetButton({ const lodLabel = config.forceLodModels ? "LOD forcé" : `HD ${config.lodHighDetailDistance}m`; + const chunkLabel = config.chunkStreamingEnabled + ? formatChunkDistance(config.chunkLoadRadius) + : "All"; return ( ); diff --git a/src/data/world/graphicsConfig.ts b/src/data/world/graphicsConfig.ts index be5b1e9..441a2ef 100644 --- a/src/data/world/graphicsConfig.ts +++ b/src/data/world/graphicsConfig.ts @@ -1,9 +1,16 @@ -export const GRAPHICS_PRESET_KEYS = ["low", "medium", "high", "ultra"] as const; +export const GRAPHICS_PRESET_KEYS = [ + "low", + "medium", + "high", + "ultra", + "max", +] as const; export type GraphicsPreset = (typeof GRAPHICS_PRESET_KEYS)[number]; export interface GraphicsPresetConfig { chunkLoadRadius: number; + chunkStreamingEnabled: boolean; chunkUnloadRadius: number; fogEnabled: boolean; forceLodModels: boolean; @@ -16,6 +23,7 @@ export const GRAPHICS_PRESETS = { label: "Basse", chunkLoadRadius: 10, chunkUnloadRadius: 18, + chunkStreamingEnabled: true, fogEnabled: true, forceLodModels: true, lodHighDetailDistance: 0, @@ -24,6 +32,7 @@ export const GRAPHICS_PRESETS = { label: "Moyenne", chunkLoadRadius: 20, chunkUnloadRadius: 30, + chunkStreamingEnabled: true, fogEnabled: true, forceLodModels: true, lodHighDetailDistance: 0, @@ -32,6 +41,7 @@ export const GRAPHICS_PRESETS = { label: "High", chunkLoadRadius: 35, chunkUnloadRadius: 45, + chunkStreamingEnabled: true, fogEnabled: false, forceLodModels: false, lodHighDetailDistance: 10, @@ -40,10 +50,20 @@ export const GRAPHICS_PRESETS = { label: "Ultra", chunkLoadRadius: 50, chunkUnloadRadius: 65, + chunkStreamingEnabled: true, fogEnabled: false, forceLodModels: false, lodHighDetailDistance: 20, }, + max: { + label: "Max", + chunkLoadRadius: 50, + chunkUnloadRadius: 65, + chunkStreamingEnabled: false, + fogEnabled: false, + forceLodModels: false, + lodHighDetailDistance: 50, + }, } as const satisfies Record; export const GRAPHICS_DEFAULTS = { diff --git a/src/world/map-instancing/MapInstancingSystem.tsx b/src/world/map-instancing/MapInstancingSystem.tsx index c5be5e9..1cb4c10 100644 --- a/src/world/map-instancing/MapInstancingSystem.tsx +++ b/src/world/map-instancing/MapInstancingSystem.tsx @@ -149,6 +149,7 @@ export function MapInstancingSystem({ const streamingEnabled = streaming && CHUNK_CONFIG.enabled && + graphicsPresetConfig.chunkStreamingEnabled && sceneMode === "game" && cameraMode === "player"; diff --git a/src/world/vegetation/VegetationSystem.tsx b/src/world/vegetation/VegetationSystem.tsx index ef07b55..c74a931 100644 --- a/src/world/vegetation/VegetationSystem.tsx +++ b/src/world/vegetation/VegetationSystem.tsx @@ -83,6 +83,7 @@ export function VegetationSystem({ const streamingEnabled = streaming && CHUNK_CONFIG.enabled && + graphicsPreset.chunkStreamingEnabled && sceneMode === "game" && cameraMode === "player"; From a180b89ee615cdd888f0cd5e71d370e5cc801fd3 Mon Sep 17 00:00:00 2001 From: Tom Boullay Date: Tue, 2 Jun 2026 13:52:08 +0200 Subject: [PATCH 02/18] fix(pylone): convert lampe BLEND to MASK in GLTFs Switching alphaMode from BLEND to MASK with a 0.5 cutoff lets the lampe material participate in instanced shadow rendering correctly. BLEND is known to interact badly with InstancedMesh shadow casting, producing incorrect or missing shadows on the pylone lampe. --- public/models/pylone-LOD/model.gltf | 4 ++-- public/models/pylone/model.gltf | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/public/models/pylone-LOD/model.gltf b/public/models/pylone-LOD/model.gltf index e72d715..5bbcebd 100644 --- a/public/models/pylone-LOD/model.gltf +++ b/public/models/pylone-LOD/model.gltf @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:06f375b482357753b1cfb212fa4f8398e9da1aa234f8259a7b1e0df9d7572afd -size 8540 +oid sha256:6e465b84186e43c2b2bbcb89b3e40d7a9c0a0fe170434f2e9fad0cf320b67c9f +size 8561 diff --git a/public/models/pylone/model.gltf b/public/models/pylone/model.gltf index e72d715..5bbcebd 100644 --- a/public/models/pylone/model.gltf +++ b/public/models/pylone/model.gltf @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:06f375b482357753b1cfb212fa4f8398e9da1aa234f8259a7b1e0df9d7572afd -size 8540 +oid sha256:6e465b84186e43c2b2bbcb89b3e40d7a9c0a0fe170434f2e9fad0cf320b67c9f +size 8561 From 0b801888f01cda2b2043462ec9c95ff2f36e3529 Mon Sep 17 00:00:00 2001 From: Tom Boullay Date: Tue, 2 Jun 2026 14:13:55 +0200 Subject: [PATCH 03/18] update: fix name assets + add LOD --- .../UI/{pylon-mission-notification.webm => centrale.webm} | 0 .../world/UI/{ebike-mission-notification.webm => ebike.webm} | 0 .../world/UI/{farm-mission-notification.webm => laferme.webm} | 0 public/models/arbre-LOD/model.glb | 3 +++ public/models/buisson-LOD/model.glb | 3 +++ public/models/sapin-LOD/model.glb | 3 +++ 6 files changed, 9 insertions(+) rename public/assets/world/UI/{pylon-mission-notification.webm => centrale.webm} (100%) rename public/assets/world/UI/{ebike-mission-notification.webm => ebike.webm} (100%) rename public/assets/world/UI/{farm-mission-notification.webm => laferme.webm} (100%) create mode 100644 public/models/arbre-LOD/model.glb create mode 100644 public/models/buisson-LOD/model.glb create mode 100644 public/models/sapin-LOD/model.glb diff --git a/public/assets/world/UI/pylon-mission-notification.webm b/public/assets/world/UI/centrale.webm similarity index 100% rename from public/assets/world/UI/pylon-mission-notification.webm rename to public/assets/world/UI/centrale.webm diff --git a/public/assets/world/UI/ebike-mission-notification.webm b/public/assets/world/UI/ebike.webm similarity index 100% rename from public/assets/world/UI/ebike-mission-notification.webm rename to public/assets/world/UI/ebike.webm diff --git a/public/assets/world/UI/farm-mission-notification.webm b/public/assets/world/UI/laferme.webm similarity index 100% rename from public/assets/world/UI/farm-mission-notification.webm rename to public/assets/world/UI/laferme.webm diff --git a/public/models/arbre-LOD/model.glb b/public/models/arbre-LOD/model.glb new file mode 100644 index 0000000..b5246eb --- /dev/null +++ b/public/models/arbre-LOD/model.glb @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e7962823c3b07a0e8f5de35351fa45a16901198859478d07bc5389b2696c7451 +size 13900 diff --git a/public/models/buisson-LOD/model.glb b/public/models/buisson-LOD/model.glb new file mode 100644 index 0000000..3a7af71 --- /dev/null +++ b/public/models/buisson-LOD/model.glb @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:755898b6d3f2b02c0092bcc79f42bedf501e1c9e1658a839cf69127700cc8111 +size 3868 diff --git a/public/models/sapin-LOD/model.glb b/public/models/sapin-LOD/model.glb new file mode 100644 index 0000000..96ee010 --- /dev/null +++ b/public/models/sapin-LOD/model.glb @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:883871a80725f887de958d44a5e3c33deadbfdc546e307563cdf1fcac2b6a37f +size 9280 From 627c8d4eb936a277c59a3fe7e2ef2b5bf02cbe49 Mon Sep 17 00:00:00 2001 From: Tom Boullay Date: Tue, 2 Jun 2026 14:17:19 +0200 Subject: [PATCH 04/18] feat(vegetation): wire arbre/sapin/buisson into LOD system Register the three new vegetation LOD models in MAP_LOD_MODEL_PATHS and extend VegetationSystem with per-chunk distance-based LOD selection (mirroring MapInstancingSystem). Chunk model paths are re-evaluated on the existing CHUNK_CONFIG.updateInterval cadence and Suspense keys include the resolved path so a swap unmounts the previous instanced mesh cleanly. --- src/data/world/mapLodConfig.ts | 3 + src/world/vegetation/VegetationSystem.tsx | 112 +++++++++++++++++++--- 2 files changed, 100 insertions(+), 15 deletions(-) diff --git a/src/data/world/mapLodConfig.ts b/src/data/world/mapLodConfig.ts index 2bea581..b7860b9 100644 --- a/src/data/world/mapLodConfig.ts +++ b/src/data/world/mapLodConfig.ts @@ -14,6 +14,9 @@ export const MAP_LOD_MODEL_PATHS = { maison1: "/models/maison1-LOD/model.gltf", panneauaffichage: "/models/panneauaffichage-LOD/model.gltf", talkie: "/models/talkie-LOD/model.gltf", + arbre: "/models/arbre-LOD/model.glb", + buisson: "/models/buisson-LOD/model.glb", + sapin: "/models/sapin-LOD/model.glb", } as const satisfies Record; export function getMapLodModelPath(modelName: string): string | null { diff --git a/src/world/vegetation/VegetationSystem.tsx b/src/world/vegetation/VegetationSystem.tsx index c74a931..002e0f2 100644 --- a/src/world/vegetation/VegetationSystem.tsx +++ b/src/world/vegetation/VegetationSystem.tsx @@ -1,8 +1,20 @@ -import { Suspense, useMemo } from "react"; +import { + Suspense, + useCallback, + useEffect, + useMemo, + useRef, + useState, +} from "react"; +import { useFrame, useThree } from "@react-three/fiber"; import { CHUNK_CONFIG } from "@/data/world/chunkStreamingConfig"; +import { selectMapModelPathByDistance } from "@/data/world/mapLodConfig"; import { useCameraMode } from "@/hooks/debug/useCameraMode"; import { useSceneMode } from "@/hooks/debug/useSceneMode"; -import { useGraphicsPresetConfig } from "@/hooks/world/useGraphicsSettings"; +import { + useGraphicsPreset, + useGraphicsPresetConfig, +} from "@/hooks/world/useGraphicsSettings"; import { useVisibleWorldChunks } from "@/hooks/world/useVisibleWorldChunks"; import { isMapModelVisible, @@ -18,6 +30,7 @@ import { } from "@/data/world/vegetationConfig"; import { isInsideLaFabrikFootprint } from "@/data/world/laFabrikConfig"; import { createWorldInstanceChunks } from "@/utils/world/chunkInstances"; +import type { GraphicsPreset } from "@/data/world/graphicsConfig"; interface VegetationSystemProps { onlyMapName?: string | null; @@ -70,12 +83,73 @@ function removeLaFabrikVegetation( }); } +function areChunkModelPathsEqual( + a: ReadonlyMap, + b: ReadonlyMap, +): boolean { + return ( + a.size === b.size && [...a].every(([key, value]) => b.get(key) === value) + ); +} + +function useVegetationChunkModelPaths( + chunks: readonly VegetationChunk[], + preset: GraphicsPreset, +): ReadonlyMap { + const camera = useThree((state) => state.camera); + const lastUpdateRef = useRef(-CHUNK_CONFIG.updateInterval); + const modelPathsRef = useRef>(new Map()); + const [modelPaths, setModelPaths] = useState>( + () => new Map(), + ); + + const updateModelPaths = useCallback(() => { + const cameraX = camera.position.x; + const cameraZ = camera.position.z; + const next = new Map(); + + for (const chunk of chunks) { + const distance = Math.hypot( + chunk.centerX - cameraX, + chunk.centerZ - cameraZ, + ); + const modelPath = selectMapModelPathByDistance({ + distance, + modelName: VEGETATION_TYPES[chunk.type].mapName, + modelPath: chunk.modelPath, + preset, + }); + next.set(chunk.key, modelPath); + } + + if (areChunkModelPathsEqual(next, modelPathsRef.current)) return; + + modelPathsRef.current = next; + setModelPaths(next); + }, [camera, chunks, preset]); + + useEffect(() => { + updateModelPaths(); + }, [updateModelPaths]); + + useFrame(({ clock }) => { + const now = clock.elapsedTime * 1000; + if (now - lastUpdateRef.current < CHUNK_CONFIG.updateInterval) return; + lastUpdateRef.current = now; + + updateModelPaths(); + }); + + return modelPaths; +} + export function VegetationSystem({ onlyMapName = null, streaming = true, }: VegetationSystemProps): React.JSX.Element | null { const cameraMode = useCameraMode(); const sceneMode = useSceneMode(); + const graphicsPresetKey = useGraphicsPreset(); const graphicsPreset = useGraphicsPresetConfig(); const groups = useMapPerformanceStore((state) => state.groups); const models = useMapPerformanceStore((state) => state.models); @@ -113,25 +187,33 @@ export function VegetationSystem({ unloadRadius: graphicsPreset.chunkUnloadRadius, }); + const chunkModelPaths = useVegetationChunkModelPaths( + visibleChunks, + graphicsPresetKey, + ); + if (isLoading || !data) { return null; } return ( - {visibleChunks.map((chunk) => ( - - - - ))} + {visibleChunks.map((chunk) => { + const modelPath = chunkModelPaths.get(chunk.key) ?? chunk.modelPath; + return ( + + + + ); + })} ); } From 4f1b3b4ff36b5ec8b286cd7d86c082f50f0eed79 Mon Sep 17 00:00:00 2001 From: Tom Boullay Date: Tue, 2 Jun 2026 14:33:16 +0200 Subject: [PATCH 05/18] fix(graphics): tune presets, single-line ui, vegetation LOD by nearest instance - Bump high to 30m chunk / HD<20m and ultra to HD<30m so HD models persist further before swapping. - Render the 5 graphics preset cards on a single row. - Vegetation LOD selection now uses the distance to the nearest instance in each chunk instead of the chunk centre, matching MapInstancingSystem and avoiding premature LOD swaps when the camera enters a chunk. --- src/data/world/graphicsConfig.ts | 8 ++++---- src/index.css | 2 +- src/world/vegetation/VegetationSystem.tsx | 15 ++++++++++----- 3 files changed, 15 insertions(+), 10 deletions(-) diff --git a/src/data/world/graphicsConfig.ts b/src/data/world/graphicsConfig.ts index 441a2ef..43dbd19 100644 --- a/src/data/world/graphicsConfig.ts +++ b/src/data/world/graphicsConfig.ts @@ -39,12 +39,12 @@ export const GRAPHICS_PRESETS = { }, high: { label: "High", - chunkLoadRadius: 35, - chunkUnloadRadius: 45, + chunkLoadRadius: 30, + chunkUnloadRadius: 40, chunkStreamingEnabled: true, fogEnabled: false, forceLodModels: false, - lodHighDetailDistance: 10, + lodHighDetailDistance: 20, }, ultra: { label: "Ultra", @@ -53,7 +53,7 @@ export const GRAPHICS_PRESETS = { chunkStreamingEnabled: true, fogEnabled: false, forceLodModels: false, - lodHighDetailDistance: 20, + lodHighDetailDistance: 30, }, max: { label: "Max", diff --git a/src/index.css b/src/index.css index 0eb57e5..5a47469 100644 --- a/src/index.css +++ b/src/index.css @@ -1544,7 +1544,7 @@ canvas { } .game-settings-menu__choice-group--presets { - grid-template-columns: repeat(4, minmax(0, 1fr)); + grid-template-columns: repeat(5, minmax(0, 1fr)); } .game-settings-menu__choice-group button, diff --git a/src/world/vegetation/VegetationSystem.tsx b/src/world/vegetation/VegetationSystem.tsx index 002e0f2..00c9b37 100644 --- a/src/world/vegetation/VegetationSystem.tsx +++ b/src/world/vegetation/VegetationSystem.tsx @@ -109,12 +109,17 @@ function useVegetationChunkModelPaths( const next = new Map(); for (const chunk of chunks) { - const distance = Math.hypot( - chunk.centerX - cameraX, - chunk.centerZ - cameraZ, - ); + let nearestDistance = Number.POSITIVE_INFINITY; + for (const instance of chunk.instances) { + const distance = Math.hypot( + instance.position[0] - cameraX, + instance.position[2] - cameraZ, + ); + if (distance < nearestDistance) nearestDistance = distance; + } + const modelPath = selectMapModelPathByDistance({ - distance, + distance: nearestDistance, modelName: VEGETATION_TYPES[chunk.type].mapName, modelPath: chunk.modelPath, preset, From 2dabb73d3d28b989dc094a3e7afbe576cc2c54bf Mon Sep 17 00:00:00 2001 From: Tom Boullay Date: Tue, 2 Jun 2026 14:50:07 +0200 Subject: [PATCH 06/18] fix(vegetation): scale-correct sapin and buisson LOD meshes The exported sapin-LOD and buisson-LOD models do not match their full detail counterpart's baseline scale, so they appear oversized once the LOD swap kicks in. Add MAP_LOD_SCALE_MULTIPLIERS keyed by map name (sapin: 0.5, buisson: 0.8) and apply it on top of the chunk's existing scaleMultiplier whenever the resolved model path is the LOD variant. --- src/data/world/mapLodConfig.ts | 14 ++++++++++++++ src/world/vegetation/VegetationSystem.tsx | 13 +++++++++++-- 2 files changed, 25 insertions(+), 2 deletions(-) diff --git a/src/data/world/mapLodConfig.ts b/src/data/world/mapLodConfig.ts index b7860b9..d1fd006 100644 --- a/src/data/world/mapLodConfig.ts +++ b/src/data/world/mapLodConfig.ts @@ -25,6 +25,20 @@ export function getMapLodModelPath(modelName: string): string | null { ); } + +export const MAP_LOD_SCALE_MULTIPLIERS = { + sapin: 0.35, + buisson: 0.7, +} as const satisfies Partial>; + +export function getMapLodScaleMultiplier(modelName: string): number { + return ( + MAP_LOD_SCALE_MULTIPLIERS[ + modelName as keyof typeof MAP_LOD_SCALE_MULTIPLIERS + ] ?? 1 + ); +} + export function selectMapModelPathByDistance({ distance, modelName, diff --git a/src/world/vegetation/VegetationSystem.tsx b/src/world/vegetation/VegetationSystem.tsx index 00c9b37..a9f6431 100644 --- a/src/world/vegetation/VegetationSystem.tsx +++ b/src/world/vegetation/VegetationSystem.tsx @@ -8,7 +8,11 @@ import { } from "react"; import { useFrame, useThree } from "@react-three/fiber"; import { CHUNK_CONFIG } from "@/data/world/chunkStreamingConfig"; -import { selectMapModelPathByDistance } from "@/data/world/mapLodConfig"; +import { + getMapLodModelPath, + getMapLodScaleMultiplier, + selectMapModelPathByDistance, +} from "@/data/world/mapLodConfig"; import { useCameraMode } from "@/hooks/debug/useCameraMode"; import { useSceneMode } from "@/hooks/debug/useSceneMode"; import { @@ -205,12 +209,17 @@ export function VegetationSystem({ {visibleChunks.map((chunk) => { const modelPath = chunkModelPaths.get(chunk.key) ?? chunk.modelPath; + const mapName = VEGETATION_TYPES[chunk.type].mapName; + const isLod = modelPath === getMapLodModelPath(mapName); + const scaleMultiplier = + chunk.scaleMultiplier * + (isLod ? getMapLodScaleMultiplier(mapName) : 1); return ( Date: Tue, 2 Jun 2026 14:52:54 +0200 Subject: [PATCH 07/18] Update lightingConfig.ts --- src/data/world/lightingConfig.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/data/world/lightingConfig.ts b/src/data/world/lightingConfig.ts index bf91955..58a3d00 100644 --- a/src/data/world/lightingConfig.ts +++ b/src/data/world/lightingConfig.ts @@ -3,9 +3,9 @@ const SUN_LIGHT_COLOR = "#ffe2bf"; export const LIGHTING_DEFAULTS = { ambientColor: AMBIENT_LIGHT_COLOR, - ambientIntensity: 0.9, + ambientIntensity: 0.7, sunColor: SUN_LIGHT_COLOR, - sunIntensity: 2.2, + sunIntensity: 1.9, sunX: 70, sunY: 45, sunZ: 35, From 49ebacfbfb4499e324595b318e0cf9f25a128c5f Mon Sep 17 00:00:00 2001 From: Tom Boullay Date: Tue, 2 Jun 2026 15:06:44 +0200 Subject: [PATCH 08/18] chore(talkie): point full-detail talkie path at model.glb The talkie folder now ships a single binary GLB; update the four call sites (TalkieModel, gallery, two repair mission entries) to load model.glb. The talkie-LOD path is unchanged. --- src/components/ui/talkie/TalkieModel.tsx | 2 +- src/data/galleryModels.ts | 2 +- src/data/gameplay/repairMissions.ts | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/components/ui/talkie/TalkieModel.tsx b/src/components/ui/talkie/TalkieModel.tsx index 050833b..c0ec8ba 100644 --- a/src/components/ui/talkie/TalkieModel.tsx +++ b/src/components/ui/talkie/TalkieModel.tsx @@ -5,7 +5,7 @@ import * as THREE from "three"; import gsap from "gsap"; import type { Vector3Tuple } from "@/types/three/three"; -const TALKIE_MODEL_PATH = "/models/talkie/model.gltf"; +const TALKIE_MODEL_PATH = "/models/talkie/model.glb"; const TALKIE_REST_Y = -1.55; const TALKIE_ACTIVE_Y = -0.38; const TALKIE_BASE_ROTATION: Vector3Tuple = [0.08, -0.52, -0.04]; diff --git a/src/data/galleryModels.ts b/src/data/galleryModels.ts index 8ac0c36..3b38774 100644 --- a/src/data/galleryModels.ts +++ b/src/data/galleryModels.ts @@ -143,7 +143,7 @@ export const galleryModels: GalleryModel[] = [ }, { id: "sapin", name: "Sapin", path: "/models/sapin/model.gltf" }, { id: "skybox", name: "Skybox", path: "/models/skybox/skybox.gltf" }, - { id: "talkie", name: "Talkie", path: "/models/talkie/model.gltf" }, + { id: "talkie", name: "Talkie", path: "/models/talkie/model.glb" }, { id: "terrain", name: "Terrain", path: "/models/terrain/model.gltf" }, { id: "tuyauxlac", diff --git a/src/data/gameplay/repairMissions.ts b/src/data/gameplay/repairMissions.ts index 7f5f8ea..56ae18a 100644 --- a/src/data/gameplay/repairMissions.ts +++ b/src/data/gameplay/repairMissions.ts @@ -44,7 +44,7 @@ export const REPAIR_MISSIONS: Record = { { id: "ebike-radio-distractor", label: "Radio module", - modelPath: "/models/talkie/model.gltf", + modelPath: "/models/talkie/model.glb", }, { id: "ebike-glove-distractor", @@ -137,7 +137,7 @@ export const REPAIR_MISSIONS: Record = { { id: "farm-radio-distractor", label: "Radio module", - modelPath: "/models/talkie/model.gltf", + modelPath: "/models/talkie/model.glb", }, ], }, From 19a1d20a976e8c564a716d3c0c1f43b7383da36f Mon Sep 17 00:00:00 2001 From: Tom Boullay Date: Tue, 2 Jun 2026 15:27:30 +0200 Subject: [PATCH 09/18] fix(repair): remove talkie LOD + drop talkie distractor from ebike - Talkie does not need a LOD swap; remove the entry from MAP_LOD_MODEL_PATHS so the same model.glb is used at any distance. - The ebike repair distractors are meant to be other disassembled bike parts, not random props. Drop the talkie radio distractor and keep only the (thematically plausible) insulation glove alongside the correct cooling core replacement. --- src/data/gameplay/repairMissions.ts | 5 ----- src/data/world/mapLodConfig.ts | 1 - 2 files changed, 6 deletions(-) diff --git a/src/data/gameplay/repairMissions.ts b/src/data/gameplay/repairMissions.ts index 56ae18a..23ee2d3 100644 --- a/src/data/gameplay/repairMissions.ts +++ b/src/data/gameplay/repairMissions.ts @@ -41,11 +41,6 @@ export const REPAIR_MISSIONS: Record = { label: "Replacement cooling core", modelPath: "/models/refroidisseur/model.gltf", }, - { - id: "ebike-radio-distractor", - label: "Radio module", - modelPath: "/models/talkie/model.glb", - }, { id: "ebike-glove-distractor", label: "Insulation glove", diff --git a/src/data/world/mapLodConfig.ts b/src/data/world/mapLodConfig.ts index d1fd006..b1e1b71 100644 --- a/src/data/world/mapLodConfig.ts +++ b/src/data/world/mapLodConfig.ts @@ -13,7 +13,6 @@ export const MAP_LOD_MODEL_PATHS = { lafabrik: "/models/lafabrik-LOD/model.gltf", maison1: "/models/maison1-LOD/model.gltf", panneauaffichage: "/models/panneauaffichage-LOD/model.gltf", - talkie: "/models/talkie-LOD/model.gltf", arbre: "/models/arbre-LOD/model.glb", buisson: "/models/buisson-LOD/model.glb", sapin: "/models/sapin-LOD/model.glb", From def0609383c6bbdb31bea1c4c933efb5b3147f6a Mon Sep 17 00:00:00 2001 From: Tom Boullay Date: Tue, 2 Jun 2026 15:36:20 +0200 Subject: [PATCH 10/18] chore(talkie): consolidate to single GLB, remove orphan LOD assets - Replace public/models/talkie/* (PNG textures + .bin + .gltf) with single model.glb - Delete unused public/models/talkie-LOD/ folder (no longer referenced in MAP_LOD_MODEL_PATHS) - Remove farm-radio-distractor (talkie) from farm repair mission distractors --- public/models/talkie-LOD/antenne_Base_color.png | 3 --- public/models/talkie-LOD/antenne_Height.png | 3 --- public/models/talkie-LOD/antenne_Metallic.png | 3 --- public/models/talkie-LOD/antenne_Mixed_AO.png | 3 --- public/models/talkie-LOD/antenne_Roughness.png | 3 --- public/models/talkie-LOD/antenne_normal.png | 3 --- public/models/talkie-LOD/antenne_normal_opengl.png | 3 --- public/models/talkie-LOD/boutona_Base_color.png | 3 --- public/models/talkie-LOD/boutona_Height.png | 3 --- public/models/talkie-LOD/boutona_Metallic.png | 3 --- public/models/talkie-LOD/boutona_Mixed_AO.png | 3 --- public/models/talkie-LOD/boutona_Roughness.png | 3 --- public/models/talkie-LOD/boutona_normal.png | 3 --- public/models/talkie-LOD/boutona_normal_opengl.png | 3 --- public/models/talkie-LOD/boutonb_Base_color.png | 3 --- public/models/talkie-LOD/boutonb_Height.png | 3 --- public/models/talkie-LOD/boutonb_Metallic.png | 3 --- public/models/talkie-LOD/boutonb_Mixed_AO.png | 3 --- public/models/talkie-LOD/boutonb_Roughness.png | 3 --- public/models/talkie-LOD/boutonb_normal.png | 3 --- public/models/talkie-LOD/boutonb_normal_opengl.png | 3 --- public/models/talkie-LOD/cable1_Base_color.png | 3 --- public/models/talkie-LOD/cable1_Height.png | 3 --- public/models/talkie-LOD/cable1_Metallic.png | 3 --- public/models/talkie-LOD/cable1_Mixed_AO.png | 3 --- public/models/talkie-LOD/cable1_Roughness.png | 3 --- public/models/talkie-LOD/cable1_normal.png | 3 --- public/models/talkie-LOD/cable1_normal_opengl.png | 3 --- public/models/talkie-LOD/cable2_Base_color.png | 3 --- public/models/talkie-LOD/cable2_Height.png | 3 --- public/models/talkie-LOD/cable2_Metallic.png | 3 --- public/models/talkie-LOD/cable2_Mixed_AO.png | 3 --- public/models/talkie-LOD/cable2_Roughness.png | 3 --- public/models/talkie-LOD/cable2_normal.png | 3 --- public/models/talkie-LOD/cable2_normal_opengl.png | 3 --- public/models/talkie-LOD/cadre_Base_color.png | 3 --- public/models/talkie-LOD/cadre_Height.png | 3 --- public/models/talkie-LOD/cadre_Metallic.png | 3 --- public/models/talkie-LOD/cadre_Mixed_AO.png | 3 --- public/models/talkie-LOD/cadre_Roughness.png | 3 --- public/models/talkie-LOD/cadre_normal.png | 3 --- public/models/talkie-LOD/cadre_normal_opengl.png | 3 --- public/models/talkie-LOD/e_cran_base_color.png | 3 --- public/models/talkie-LOD/e_cran_height.png | 3 --- public/models/talkie-LOD/e_cran_metallic.png | 3 --- public/models/talkie-LOD/e_cran_mixed_ao.png | 3 --- public/models/talkie-LOD/e_cran_normal.png | 3 --- public/models/talkie-LOD/e_cran_normal_opengl.png | 3 --- public/models/talkie-LOD/e_cran_roughness.png | 3 --- public/models/talkie-LOD/hautparleur_Base_color.png | 3 --- public/models/talkie-LOD/hautparleur_Height.png | 3 --- public/models/talkie-LOD/hautparleur_Metallic.png | 3 --- public/models/talkie-LOD/hautparleur_Mixed_AO.png | 3 --- public/models/talkie-LOD/hautparleur_Roughness.png | 3 --- public/models/talkie-LOD/hautparleur_normal.png | 3 --- public/models/talkie-LOD/hautparleur_normal_opengl.png | 3 --- public/models/talkie-LOD/model.bin | 3 --- public/models/talkie-LOD/model.gltf | 3 --- public/models/talkie-LOD/prise_Base_color.png | 3 --- public/models/talkie-LOD/prise_Height.png | 3 --- public/models/talkie-LOD/prise_Metallic.png | 3 --- public/models/talkie-LOD/prise_Mixed_AO.png | 3 --- public/models/talkie-LOD/prise_Roughness.png | 3 --- public/models/talkie-LOD/prise_normal.png | 3 --- public/models/talkie-LOD/prise_normal_opengl.png | 3 --- public/models/talkie-LOD/talkie_Base_color.png | 3 --- public/models/talkie-LOD/talkie_Height.png | 3 --- public/models/talkie-LOD/talkie_Metallic.png | 3 --- public/models/talkie-LOD/talkie_Mixed_AO.png | 3 --- public/models/talkie-LOD/talkie_Roughness.png | 3 --- public/models/talkie-LOD/talkie_normal.png | 3 --- public/models/talkie-LOD/talkie_normal_opengl.png | 3 --- public/models/talkie-LOD/touches_Base_color.png | 3 --- public/models/talkie-LOD/touches_Height.png | 3 --- public/models/talkie-LOD/touches_Metallic.png | 3 --- public/models/talkie-LOD/touches_Mixed_AO.png | 3 --- public/models/talkie-LOD/touches_Roughness.png | 3 --- public/models/talkie-LOD/touches_normal.png | 3 --- public/models/talkie-LOD/touches_normal_opengl.png | 3 --- public/models/talkie-LOD/écran_Base_color.png | 3 --- public/models/talkie-LOD/écran_Height.png | 3 --- public/models/talkie-LOD/écran_Metallic.png | 3 --- public/models/talkie-LOD/écran_Mixed_AO.png | 3 --- public/models/talkie-LOD/écran_Normal.png | 3 --- public/models/talkie-LOD/écran_Normal_OpenGL.png | 3 --- public/models/talkie-LOD/écran_Roughness.png | 3 --- public/models/talkie/antenne_Base_color.png | 3 --- public/models/talkie/antenne_Height.png | 3 --- public/models/talkie/antenne_Metallic.png | 3 --- public/models/talkie/antenne_Mixed_AO.png | 3 --- public/models/talkie/antenne_Normal.png | 3 --- public/models/talkie/antenne_Normal_OpenGL.png | 3 --- public/models/talkie/antenne_Roughness.png | 3 --- public/models/talkie/boutona_Base_color.png | 3 --- public/models/talkie/boutona_Height.png | 3 --- public/models/talkie/boutona_Metallic.png | 3 --- public/models/talkie/boutona_Mixed_AO.png | 3 --- public/models/talkie/boutona_Normal.png | 3 --- public/models/talkie/boutona_Normal_OpenGL.png | 3 --- public/models/talkie/boutona_Roughness.png | 3 --- public/models/talkie/boutonb_Base_color.png | 3 --- public/models/talkie/boutonb_Height.png | 3 --- public/models/talkie/boutonb_Metallic.png | 3 --- public/models/talkie/boutonb_Mixed_AO.png | 3 --- public/models/talkie/boutonb_Normal.png | 3 --- public/models/talkie/boutonb_Normal_OpenGL.png | 3 --- public/models/talkie/boutonb_Roughness.png | 3 --- public/models/talkie/cable1_Base_color.png | 3 --- public/models/talkie/cable1_Height.png | 3 --- public/models/talkie/cable1_Metallic.png | 3 --- public/models/talkie/cable1_Mixed_AO.png | 3 --- public/models/talkie/cable1_Normal.png | 3 --- public/models/talkie/cable1_Normal_OpenGL.png | 3 --- public/models/talkie/cable1_Roughness.png | 3 --- public/models/talkie/cable2_Base_color.png | 3 --- public/models/talkie/cable2_Height.png | 3 --- public/models/talkie/cable2_Metallic.png | 3 --- public/models/talkie/cable2_Mixed_AO.png | 3 --- public/models/talkie/cable2_Normal.png | 3 --- public/models/talkie/cable2_Normal_OpenGL.png | 3 --- public/models/talkie/cable2_Roughness.png | 3 --- public/models/talkie/cadre_Base_color.png | 3 --- public/models/talkie/cadre_Height.png | 3 --- public/models/talkie/cadre_Metallic.png | 3 --- public/models/talkie/cadre_Mixed_AO.png | 3 --- public/models/talkie/cadre_Normal.png | 3 --- public/models/talkie/cadre_Normal_OpenGL.png | 3 --- public/models/talkie/cadre_Roughness.png | 3 --- public/models/talkie/e_cran_base_color.png | 3 --- public/models/talkie/e_cran_height.png | 3 --- public/models/talkie/e_cran_metallic.png | 3 --- public/models/talkie/e_cran_mixed_ao.png | 3 --- public/models/talkie/e_cran_normal.png | 3 --- public/models/talkie/e_cran_normal_opengl.png | 3 --- public/models/talkie/e_cran_roughness.png | 3 --- public/models/talkie/hautparleur_Base_color.png | 3 --- public/models/talkie/hautparleur_Height.png | 3 --- public/models/talkie/hautparleur_Metallic.png | 3 --- public/models/talkie/hautparleur_Mixed_AO.png | 3 --- public/models/talkie/hautparleur_Normal.png | 3 --- public/models/talkie/hautparleur_Normal_OpenGL.png | 3 --- public/models/talkie/hautparleur_Roughness.png | 3 --- public/models/talkie/model.bin | 3 --- public/models/talkie/model.glb | 3 +++ public/models/talkie/model.gltf | 3 --- public/models/talkie/prise_Base_color.png | 3 --- public/models/talkie/prise_Height.png | 3 --- public/models/talkie/prise_Metallic.png | 3 --- public/models/talkie/prise_Mixed_AO.png | 3 --- public/models/talkie/prise_Normal.png | 3 --- public/models/talkie/prise_Normal_OpenGL.png | 3 --- public/models/talkie/prise_Roughness.png | 3 --- public/models/talkie/talkie_Base_color.png | 3 --- public/models/talkie/talkie_Height.png | 3 --- public/models/talkie/talkie_Metallic.png | 3 --- public/models/talkie/talkie_Mixed_AO.png | 3 --- public/models/talkie/talkie_Normal.png | 3 --- public/models/talkie/talkie_Normal_OpenGL.png | 3 --- public/models/talkie/talkie_Roughness.png | 3 --- public/models/talkie/touches_Base_color.png | 3 --- public/models/talkie/touches_Height.png | 3 --- public/models/talkie/touches_Metallic.png | 3 --- public/models/talkie/touches_Mixed_AO.png | 3 --- public/models/talkie/touches_Normal.png | 3 --- public/models/talkie/touches_Normal_OpenGL.png | 3 --- public/models/talkie/touches_Roughness.png | 3 --- public/models/talkie/écran_Base_color.png | 3 --- public/models/talkie/écran_Height.png | 3 --- public/models/talkie/écran_Metallic.png | 3 --- public/models/talkie/écran_Mixed_AO.png | 3 --- public/models/talkie/écran_Normal.png | 3 --- public/models/talkie/écran_Normal_OpenGL.png | 3 --- public/models/talkie/écran_Roughness.png | 3 --- src/data/gameplay/repairMissions.ts | 5 ----- 174 files changed, 3 insertions(+), 521 deletions(-) delete mode 100644 public/models/talkie-LOD/antenne_Base_color.png delete mode 100644 public/models/talkie-LOD/antenne_Height.png delete mode 100644 public/models/talkie-LOD/antenne_Metallic.png delete mode 100644 public/models/talkie-LOD/antenne_Mixed_AO.png delete mode 100644 public/models/talkie-LOD/antenne_Roughness.png delete mode 100644 public/models/talkie-LOD/antenne_normal.png delete mode 100644 public/models/talkie-LOD/antenne_normal_opengl.png delete mode 100644 public/models/talkie-LOD/boutona_Base_color.png delete mode 100644 public/models/talkie-LOD/boutona_Height.png delete mode 100644 public/models/talkie-LOD/boutona_Metallic.png delete mode 100644 public/models/talkie-LOD/boutona_Mixed_AO.png delete mode 100644 public/models/talkie-LOD/boutona_Roughness.png delete mode 100644 public/models/talkie-LOD/boutona_normal.png delete mode 100644 public/models/talkie-LOD/boutona_normal_opengl.png delete mode 100644 public/models/talkie-LOD/boutonb_Base_color.png delete mode 100644 public/models/talkie-LOD/boutonb_Height.png delete mode 100644 public/models/talkie-LOD/boutonb_Metallic.png delete mode 100644 public/models/talkie-LOD/boutonb_Mixed_AO.png delete mode 100644 public/models/talkie-LOD/boutonb_Roughness.png delete mode 100644 public/models/talkie-LOD/boutonb_normal.png delete mode 100644 public/models/talkie-LOD/boutonb_normal_opengl.png delete mode 100644 public/models/talkie-LOD/cable1_Base_color.png delete mode 100644 public/models/talkie-LOD/cable1_Height.png delete mode 100644 public/models/talkie-LOD/cable1_Metallic.png delete mode 100644 public/models/talkie-LOD/cable1_Mixed_AO.png delete mode 100644 public/models/talkie-LOD/cable1_Roughness.png delete mode 100644 public/models/talkie-LOD/cable1_normal.png delete mode 100644 public/models/talkie-LOD/cable1_normal_opengl.png delete mode 100644 public/models/talkie-LOD/cable2_Base_color.png delete mode 100644 public/models/talkie-LOD/cable2_Height.png delete mode 100644 public/models/talkie-LOD/cable2_Metallic.png delete mode 100644 public/models/talkie-LOD/cable2_Mixed_AO.png delete mode 100644 public/models/talkie-LOD/cable2_Roughness.png delete mode 100644 public/models/talkie-LOD/cable2_normal.png delete mode 100644 public/models/talkie-LOD/cable2_normal_opengl.png delete mode 100644 public/models/talkie-LOD/cadre_Base_color.png delete mode 100644 public/models/talkie-LOD/cadre_Height.png delete mode 100644 public/models/talkie-LOD/cadre_Metallic.png delete mode 100644 public/models/talkie-LOD/cadre_Mixed_AO.png delete mode 100644 public/models/talkie-LOD/cadre_Roughness.png delete mode 100644 public/models/talkie-LOD/cadre_normal.png delete mode 100644 public/models/talkie-LOD/cadre_normal_opengl.png delete mode 100644 public/models/talkie-LOD/e_cran_base_color.png delete mode 100644 public/models/talkie-LOD/e_cran_height.png delete mode 100644 public/models/talkie-LOD/e_cran_metallic.png delete mode 100644 public/models/talkie-LOD/e_cran_mixed_ao.png delete mode 100644 public/models/talkie-LOD/e_cran_normal.png delete mode 100644 public/models/talkie-LOD/e_cran_normal_opengl.png delete mode 100644 public/models/talkie-LOD/e_cran_roughness.png delete mode 100644 public/models/talkie-LOD/hautparleur_Base_color.png delete mode 100644 public/models/talkie-LOD/hautparleur_Height.png delete mode 100644 public/models/talkie-LOD/hautparleur_Metallic.png delete mode 100644 public/models/talkie-LOD/hautparleur_Mixed_AO.png delete mode 100644 public/models/talkie-LOD/hautparleur_Roughness.png delete mode 100644 public/models/talkie-LOD/hautparleur_normal.png delete mode 100644 public/models/talkie-LOD/hautparleur_normal_opengl.png delete mode 100644 public/models/talkie-LOD/model.bin delete mode 100644 public/models/talkie-LOD/model.gltf delete mode 100644 public/models/talkie-LOD/prise_Base_color.png delete mode 100644 public/models/talkie-LOD/prise_Height.png delete mode 100644 public/models/talkie-LOD/prise_Metallic.png delete mode 100644 public/models/talkie-LOD/prise_Mixed_AO.png delete mode 100644 public/models/talkie-LOD/prise_Roughness.png delete mode 100644 public/models/talkie-LOD/prise_normal.png delete mode 100644 public/models/talkie-LOD/prise_normal_opengl.png delete mode 100644 public/models/talkie-LOD/talkie_Base_color.png delete mode 100644 public/models/talkie-LOD/talkie_Height.png delete mode 100644 public/models/talkie-LOD/talkie_Metallic.png delete mode 100644 public/models/talkie-LOD/talkie_Mixed_AO.png delete mode 100644 public/models/talkie-LOD/talkie_Roughness.png delete mode 100644 public/models/talkie-LOD/talkie_normal.png delete mode 100644 public/models/talkie-LOD/talkie_normal_opengl.png delete mode 100644 public/models/talkie-LOD/touches_Base_color.png delete mode 100644 public/models/talkie-LOD/touches_Height.png delete mode 100644 public/models/talkie-LOD/touches_Metallic.png delete mode 100644 public/models/talkie-LOD/touches_Mixed_AO.png delete mode 100644 public/models/talkie-LOD/touches_Roughness.png delete mode 100644 public/models/talkie-LOD/touches_normal.png delete mode 100644 public/models/talkie-LOD/touches_normal_opengl.png delete mode 100644 public/models/talkie-LOD/écran_Base_color.png delete mode 100644 public/models/talkie-LOD/écran_Height.png delete mode 100644 public/models/talkie-LOD/écran_Metallic.png delete mode 100644 public/models/talkie-LOD/écran_Mixed_AO.png delete mode 100644 public/models/talkie-LOD/écran_Normal.png delete mode 100644 public/models/talkie-LOD/écran_Normal_OpenGL.png delete mode 100644 public/models/talkie-LOD/écran_Roughness.png delete mode 100644 public/models/talkie/antenne_Base_color.png delete mode 100644 public/models/talkie/antenne_Height.png delete mode 100644 public/models/talkie/antenne_Metallic.png delete mode 100644 public/models/talkie/antenne_Mixed_AO.png delete mode 100644 public/models/talkie/antenne_Normal.png delete mode 100644 public/models/talkie/antenne_Normal_OpenGL.png delete mode 100644 public/models/talkie/antenne_Roughness.png delete mode 100644 public/models/talkie/boutona_Base_color.png delete mode 100644 public/models/talkie/boutona_Height.png delete mode 100644 public/models/talkie/boutona_Metallic.png delete mode 100644 public/models/talkie/boutona_Mixed_AO.png delete mode 100644 public/models/talkie/boutona_Normal.png delete mode 100644 public/models/talkie/boutona_Normal_OpenGL.png delete mode 100644 public/models/talkie/boutona_Roughness.png delete mode 100644 public/models/talkie/boutonb_Base_color.png delete mode 100644 public/models/talkie/boutonb_Height.png delete mode 100644 public/models/talkie/boutonb_Metallic.png delete mode 100644 public/models/talkie/boutonb_Mixed_AO.png delete mode 100644 public/models/talkie/boutonb_Normal.png delete mode 100644 public/models/talkie/boutonb_Normal_OpenGL.png delete mode 100644 public/models/talkie/boutonb_Roughness.png delete mode 100644 public/models/talkie/cable1_Base_color.png delete mode 100644 public/models/talkie/cable1_Height.png delete mode 100644 public/models/talkie/cable1_Metallic.png delete mode 100644 public/models/talkie/cable1_Mixed_AO.png delete mode 100644 public/models/talkie/cable1_Normal.png delete mode 100644 public/models/talkie/cable1_Normal_OpenGL.png delete mode 100644 public/models/talkie/cable1_Roughness.png delete mode 100644 public/models/talkie/cable2_Base_color.png delete mode 100644 public/models/talkie/cable2_Height.png delete mode 100644 public/models/talkie/cable2_Metallic.png delete mode 100644 public/models/talkie/cable2_Mixed_AO.png delete mode 100644 public/models/talkie/cable2_Normal.png delete mode 100644 public/models/talkie/cable2_Normal_OpenGL.png delete mode 100644 public/models/talkie/cable2_Roughness.png delete mode 100644 public/models/talkie/cadre_Base_color.png delete mode 100644 public/models/talkie/cadre_Height.png delete mode 100644 public/models/talkie/cadre_Metallic.png delete mode 100644 public/models/talkie/cadre_Mixed_AO.png delete mode 100644 public/models/talkie/cadre_Normal.png delete mode 100644 public/models/talkie/cadre_Normal_OpenGL.png delete mode 100644 public/models/talkie/cadre_Roughness.png delete mode 100644 public/models/talkie/e_cran_base_color.png delete mode 100644 public/models/talkie/e_cran_height.png delete mode 100644 public/models/talkie/e_cran_metallic.png delete mode 100644 public/models/talkie/e_cran_mixed_ao.png delete mode 100644 public/models/talkie/e_cran_normal.png delete mode 100644 public/models/talkie/e_cran_normal_opengl.png delete mode 100644 public/models/talkie/e_cran_roughness.png delete mode 100644 public/models/talkie/hautparleur_Base_color.png delete mode 100644 public/models/talkie/hautparleur_Height.png delete mode 100644 public/models/talkie/hautparleur_Metallic.png delete mode 100644 public/models/talkie/hautparleur_Mixed_AO.png delete mode 100644 public/models/talkie/hautparleur_Normal.png delete mode 100644 public/models/talkie/hautparleur_Normal_OpenGL.png delete mode 100644 public/models/talkie/hautparleur_Roughness.png delete mode 100644 public/models/talkie/model.bin create mode 100644 public/models/talkie/model.glb delete mode 100644 public/models/talkie/model.gltf delete mode 100644 public/models/talkie/prise_Base_color.png delete mode 100644 public/models/talkie/prise_Height.png delete mode 100644 public/models/talkie/prise_Metallic.png delete mode 100644 public/models/talkie/prise_Mixed_AO.png delete mode 100644 public/models/talkie/prise_Normal.png delete mode 100644 public/models/talkie/prise_Normal_OpenGL.png delete mode 100644 public/models/talkie/prise_Roughness.png delete mode 100644 public/models/talkie/talkie_Base_color.png delete mode 100644 public/models/talkie/talkie_Height.png delete mode 100644 public/models/talkie/talkie_Metallic.png delete mode 100644 public/models/talkie/talkie_Mixed_AO.png delete mode 100644 public/models/talkie/talkie_Normal.png delete mode 100644 public/models/talkie/talkie_Normal_OpenGL.png delete mode 100644 public/models/talkie/talkie_Roughness.png delete mode 100644 public/models/talkie/touches_Base_color.png delete mode 100644 public/models/talkie/touches_Height.png delete mode 100644 public/models/talkie/touches_Metallic.png delete mode 100644 public/models/talkie/touches_Mixed_AO.png delete mode 100644 public/models/talkie/touches_Normal.png delete mode 100644 public/models/talkie/touches_Normal_OpenGL.png delete mode 100644 public/models/talkie/touches_Roughness.png delete mode 100644 public/models/talkie/écran_Base_color.png delete mode 100644 public/models/talkie/écran_Height.png delete mode 100644 public/models/talkie/écran_Metallic.png delete mode 100644 public/models/talkie/écran_Mixed_AO.png delete mode 100644 public/models/talkie/écran_Normal.png delete mode 100644 public/models/talkie/écran_Normal_OpenGL.png delete mode 100644 public/models/talkie/écran_Roughness.png diff --git a/public/models/talkie-LOD/antenne_Base_color.png b/public/models/talkie-LOD/antenne_Base_color.png deleted file mode 100644 index db60934..0000000 --- a/public/models/talkie-LOD/antenne_Base_color.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:fc5ba4130daed3b1edae078cc73ad5a4d9955c8c464abcbc6af2a80077842f7a -size 312866 diff --git a/public/models/talkie-LOD/antenne_Height.png b/public/models/talkie-LOD/antenne_Height.png deleted file mode 100644 index 713980d..0000000 --- a/public/models/talkie-LOD/antenne_Height.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:208daeea7306a6a576fbe1098c66d59571dd984635d7fb6c017fd767cde531ed -size 3178 diff --git a/public/models/talkie-LOD/antenne_Metallic.png b/public/models/talkie-LOD/antenne_Metallic.png deleted file mode 100644 index b46e54a..0000000 --- a/public/models/talkie-LOD/antenne_Metallic.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:60041773ef2d493f3547aa1b0fbdf5b1bb548a3da39164384293ef5292b2c5b3 -size 1118 diff --git a/public/models/talkie-LOD/antenne_Mixed_AO.png b/public/models/talkie-LOD/antenne_Mixed_AO.png deleted file mode 100644 index 3ba6e13..0000000 --- a/public/models/talkie-LOD/antenne_Mixed_AO.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f3ec5ee97080be475cf3f3da71ca440dac8ccbe104510f519d1b4ee928d5b2b9 -size 187817 diff --git a/public/models/talkie-LOD/antenne_Roughness.png b/public/models/talkie-LOD/antenne_Roughness.png deleted file mode 100644 index e6233e4..0000000 --- a/public/models/talkie-LOD/antenne_Roughness.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:91c3fb77f1204027e6d0d46e59dc6b68cd13fc68099b20612b75749460a3c8b8 -size 69233 diff --git a/public/models/talkie-LOD/antenne_normal.png b/public/models/talkie-LOD/antenne_normal.png deleted file mode 100644 index bf16203..0000000 --- a/public/models/talkie-LOD/antenne_normal.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:da8e995d1260a97d5f1c099aa51ccf35123316264751c940bb5e71e3d115c133 -size 205065 diff --git a/public/models/talkie-LOD/antenne_normal_opengl.png b/public/models/talkie-LOD/antenne_normal_opengl.png deleted file mode 100644 index 7c1dc2b..0000000 --- a/public/models/talkie-LOD/antenne_normal_opengl.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c1ec8c53b5e60fb3f13da3db4b787a6dd667f51c05eb92e925902b33c5fb68f5 -size 204007 diff --git a/public/models/talkie-LOD/boutona_Base_color.png b/public/models/talkie-LOD/boutona_Base_color.png deleted file mode 100644 index f493f55..0000000 --- a/public/models/talkie-LOD/boutona_Base_color.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ef47a91bfd020de0983e75bc8bc03277b651c894da0f006dc49d5bfb91e86623 -size 473199 diff --git a/public/models/talkie-LOD/boutona_Height.png b/public/models/talkie-LOD/boutona_Height.png deleted file mode 100644 index 713980d..0000000 --- a/public/models/talkie-LOD/boutona_Height.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:208daeea7306a6a576fbe1098c66d59571dd984635d7fb6c017fd767cde531ed -size 3178 diff --git a/public/models/talkie-LOD/boutona_Metallic.png b/public/models/talkie-LOD/boutona_Metallic.png deleted file mode 100644 index b46e54a..0000000 --- a/public/models/talkie-LOD/boutona_Metallic.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:60041773ef2d493f3547aa1b0fbdf5b1bb548a3da39164384293ef5292b2c5b3 -size 1118 diff --git a/public/models/talkie-LOD/boutona_Mixed_AO.png b/public/models/talkie-LOD/boutona_Mixed_AO.png deleted file mode 100644 index d28322d..0000000 --- a/public/models/talkie-LOD/boutona_Mixed_AO.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f45671cafcc91e40f67120f22f7b58c75a9bf5289f8dd67019d7c836253e8942 -size 244343 diff --git a/public/models/talkie-LOD/boutona_Roughness.png b/public/models/talkie-LOD/boutona_Roughness.png deleted file mode 100644 index daa6677..0000000 --- a/public/models/talkie-LOD/boutona_Roughness.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:adaedf0e287c99669b47a0e3e3b99ed2c6f1f5a761e69168418e56610d7d8f9a -size 54561 diff --git a/public/models/talkie-LOD/boutona_normal.png b/public/models/talkie-LOD/boutona_normal.png deleted file mode 100644 index 4cf6138..0000000 --- a/public/models/talkie-LOD/boutona_normal.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9c0e761804d0546dc6cd9d929fdecab8f6852866a6f2025c03c76c34b2040ee0 -size 175939 diff --git a/public/models/talkie-LOD/boutona_normal_opengl.png b/public/models/talkie-LOD/boutona_normal_opengl.png deleted file mode 100644 index 80416e2..0000000 --- a/public/models/talkie-LOD/boutona_normal_opengl.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:86c390222c74160382b92a5736664c37e3861937db2e2d58699643516fc52995 -size 176366 diff --git a/public/models/talkie-LOD/boutonb_Base_color.png b/public/models/talkie-LOD/boutonb_Base_color.png deleted file mode 100644 index ed59d49..0000000 --- a/public/models/talkie-LOD/boutonb_Base_color.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:84973c1c06bf83beacd0987c5d252560ec92e09701b3ac6b73289f39392c21da -size 496575 diff --git a/public/models/talkie-LOD/boutonb_Height.png b/public/models/talkie-LOD/boutonb_Height.png deleted file mode 100644 index 713980d..0000000 --- a/public/models/talkie-LOD/boutonb_Height.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:208daeea7306a6a576fbe1098c66d59571dd984635d7fb6c017fd767cde531ed -size 3178 diff --git a/public/models/talkie-LOD/boutonb_Metallic.png b/public/models/talkie-LOD/boutonb_Metallic.png deleted file mode 100644 index b46e54a..0000000 --- a/public/models/talkie-LOD/boutonb_Metallic.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:60041773ef2d493f3547aa1b0fbdf5b1bb548a3da39164384293ef5292b2c5b3 -size 1118 diff --git a/public/models/talkie-LOD/boutonb_Mixed_AO.png b/public/models/talkie-LOD/boutonb_Mixed_AO.png deleted file mode 100644 index 8292910..0000000 --- a/public/models/talkie-LOD/boutonb_Mixed_AO.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d58e8ec5e90125edd38f279ee1b9fee863b75d8396fef6a0c22a9af6a9c0a341 -size 239658 diff --git a/public/models/talkie-LOD/boutonb_Roughness.png b/public/models/talkie-LOD/boutonb_Roughness.png deleted file mode 100644 index acba391..0000000 --- a/public/models/talkie-LOD/boutonb_Roughness.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ad833228a99505d0fea7495970bfbf47d3942a86d457aca379b99d8224d8633f -size 54522 diff --git a/public/models/talkie-LOD/boutonb_normal.png b/public/models/talkie-LOD/boutonb_normal.png deleted file mode 100644 index 943917e..0000000 --- a/public/models/talkie-LOD/boutonb_normal.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:53e5d76fcd40986674d93f289cea51c6b839d720787d98ed4112164e20558bd2 -size 176052 diff --git a/public/models/talkie-LOD/boutonb_normal_opengl.png b/public/models/talkie-LOD/boutonb_normal_opengl.png deleted file mode 100644 index 47539e6..0000000 --- a/public/models/talkie-LOD/boutonb_normal_opengl.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4a1ea79411217de422f6f7fd160c673e01a2a09ebce1d95a6b5e63c8c1e5de18 -size 176723 diff --git a/public/models/talkie-LOD/cable1_Base_color.png b/public/models/talkie-LOD/cable1_Base_color.png deleted file mode 100644 index 0aa378c..0000000 --- a/public/models/talkie-LOD/cable1_Base_color.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:967d8771fbcd5427bf0005b147ecae38ab53271c4a99980f34db1102d0cb35f0 -size 178767 diff --git a/public/models/talkie-LOD/cable1_Height.png b/public/models/talkie-LOD/cable1_Height.png deleted file mode 100644 index 713980d..0000000 --- a/public/models/talkie-LOD/cable1_Height.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:208daeea7306a6a576fbe1098c66d59571dd984635d7fb6c017fd767cde531ed -size 3178 diff --git a/public/models/talkie-LOD/cable1_Metallic.png b/public/models/talkie-LOD/cable1_Metallic.png deleted file mode 100644 index b46e54a..0000000 --- a/public/models/talkie-LOD/cable1_Metallic.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:60041773ef2d493f3547aa1b0fbdf5b1bb548a3da39164384293ef5292b2c5b3 -size 1118 diff --git a/public/models/talkie-LOD/cable1_Mixed_AO.png b/public/models/talkie-LOD/cable1_Mixed_AO.png deleted file mode 100644 index 2003ade..0000000 --- a/public/models/talkie-LOD/cable1_Mixed_AO.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:73378e05b925c39d37e3cfdb1048d891b6216927fbd9eab111a61051d9c5fadd -size 142820 diff --git a/public/models/talkie-LOD/cable1_Roughness.png b/public/models/talkie-LOD/cable1_Roughness.png deleted file mode 100644 index c1c9096..0000000 --- a/public/models/talkie-LOD/cable1_Roughness.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6a2a10008bf8a90ca1e7ef831944d8e6b2c41d5aa9b5a1f20f49d7dcc942b9f2 -size 56819 diff --git a/public/models/talkie-LOD/cable1_normal.png b/public/models/talkie-LOD/cable1_normal.png deleted file mode 100644 index 8f1338d..0000000 --- a/public/models/talkie-LOD/cable1_normal.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:cb4d0e26c8d16fcb471e2812585fb27ddfbce4500c526fce512d61f7611c5b99 -size 186292 diff --git a/public/models/talkie-LOD/cable1_normal_opengl.png b/public/models/talkie-LOD/cable1_normal_opengl.png deleted file mode 100644 index 456bcdb..0000000 --- a/public/models/talkie-LOD/cable1_normal_opengl.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8854c9b53ac97ce6113d351aa528d9a6664e90947678aee05731695e034d1c79 -size 187073 diff --git a/public/models/talkie-LOD/cable2_Base_color.png b/public/models/talkie-LOD/cable2_Base_color.png deleted file mode 100644 index ba3be72..0000000 --- a/public/models/talkie-LOD/cable2_Base_color.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4b1bdd610bf135a20471bc2b65e53f2a2333ab6e845380f55fed93d45dce1897 -size 210840 diff --git a/public/models/talkie-LOD/cable2_Height.png b/public/models/talkie-LOD/cable2_Height.png deleted file mode 100644 index 713980d..0000000 --- a/public/models/talkie-LOD/cable2_Height.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:208daeea7306a6a576fbe1098c66d59571dd984635d7fb6c017fd767cde531ed -size 3178 diff --git a/public/models/talkie-LOD/cable2_Metallic.png b/public/models/talkie-LOD/cable2_Metallic.png deleted file mode 100644 index b46e54a..0000000 --- a/public/models/talkie-LOD/cable2_Metallic.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:60041773ef2d493f3547aa1b0fbdf5b1bb548a3da39164384293ef5292b2c5b3 -size 1118 diff --git a/public/models/talkie-LOD/cable2_Mixed_AO.png b/public/models/talkie-LOD/cable2_Mixed_AO.png deleted file mode 100644 index e3a64cc..0000000 --- a/public/models/talkie-LOD/cable2_Mixed_AO.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:30e8e315f7950a91135bba6ac43d04563b1e501e83cfb4b57048320768602bc5 -size 167450 diff --git a/public/models/talkie-LOD/cable2_Roughness.png b/public/models/talkie-LOD/cable2_Roughness.png deleted file mode 100644 index a9440d4..0000000 --- a/public/models/talkie-LOD/cable2_Roughness.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0d9e3cc7a29c90c1712196c05915bea480124dddc0db47db9415f738f895660c -size 60898 diff --git a/public/models/talkie-LOD/cable2_normal.png b/public/models/talkie-LOD/cable2_normal.png deleted file mode 100644 index acc99fd..0000000 --- a/public/models/talkie-LOD/cable2_normal.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b09eae40cd4d52c348933f49347691f08dc6f25d929ddadbeddd2157444c706f -size 195384 diff --git a/public/models/talkie-LOD/cable2_normal_opengl.png b/public/models/talkie-LOD/cable2_normal_opengl.png deleted file mode 100644 index d184f94..0000000 --- a/public/models/talkie-LOD/cable2_normal_opengl.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ff1ae64895328cae7bf8816a43eb38ca4db82b7979d02db927bc307fa7ec66c6 -size 196010 diff --git a/public/models/talkie-LOD/cadre_Base_color.png b/public/models/talkie-LOD/cadre_Base_color.png deleted file mode 100644 index afbe925..0000000 --- a/public/models/talkie-LOD/cadre_Base_color.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:637e73b56419d8390e8aeb27433fdee21264c9d5b28e1caaf7e1357f6c191fd3 -size 280049 diff --git a/public/models/talkie-LOD/cadre_Height.png b/public/models/talkie-LOD/cadre_Height.png deleted file mode 100644 index 713980d..0000000 --- a/public/models/talkie-LOD/cadre_Height.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:208daeea7306a6a576fbe1098c66d59571dd984635d7fb6c017fd767cde531ed -size 3178 diff --git a/public/models/talkie-LOD/cadre_Metallic.png b/public/models/talkie-LOD/cadre_Metallic.png deleted file mode 100644 index b46e54a..0000000 --- a/public/models/talkie-LOD/cadre_Metallic.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:60041773ef2d493f3547aa1b0fbdf5b1bb548a3da39164384293ef5292b2c5b3 -size 1118 diff --git a/public/models/talkie-LOD/cadre_Mixed_AO.png b/public/models/talkie-LOD/cadre_Mixed_AO.png deleted file mode 100644 index 0151384..0000000 --- a/public/models/talkie-LOD/cadre_Mixed_AO.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e1f9912860e5f508e0e29ef1e03943101cdb287a1c34bd0278ac237824255da5 -size 157683 diff --git a/public/models/talkie-LOD/cadre_Roughness.png b/public/models/talkie-LOD/cadre_Roughness.png deleted file mode 100644 index 264a6e4..0000000 --- a/public/models/talkie-LOD/cadre_Roughness.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:afb28f17a6f419356f49088c8c5b8d12b6aaf2471ee7e35ef42e0fda3a5365f2 -size 53784 diff --git a/public/models/talkie-LOD/cadre_normal.png b/public/models/talkie-LOD/cadre_normal.png deleted file mode 100644 index 8d2a5a3..0000000 --- a/public/models/talkie-LOD/cadre_normal.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:982a042d28061ce926c80293129985733aba79bc7115e0f5b55e4f4186808f5a -size 52817 diff --git a/public/models/talkie-LOD/cadre_normal_opengl.png b/public/models/talkie-LOD/cadre_normal_opengl.png deleted file mode 100644 index 46032a3..0000000 --- a/public/models/talkie-LOD/cadre_normal_opengl.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:58d63de38e7fefca7ec94b4057b37256c477dbd2749f950f0bd373932b52cbf9 -size 52737 diff --git a/public/models/talkie-LOD/e_cran_base_color.png b/public/models/talkie-LOD/e_cran_base_color.png deleted file mode 100644 index a8c2149..0000000 --- a/public/models/talkie-LOD/e_cran_base_color.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f75363e70ffed07a182a3e61d7c301cb8fd053ac8ec784d56e9450335167dce8 -size 6502 diff --git a/public/models/talkie-LOD/e_cran_height.png b/public/models/talkie-LOD/e_cran_height.png deleted file mode 100644 index 713980d..0000000 --- a/public/models/talkie-LOD/e_cran_height.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:208daeea7306a6a576fbe1098c66d59571dd984635d7fb6c017fd767cde531ed -size 3178 diff --git a/public/models/talkie-LOD/e_cran_metallic.png b/public/models/talkie-LOD/e_cran_metallic.png deleted file mode 100644 index b46e54a..0000000 --- a/public/models/talkie-LOD/e_cran_metallic.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:60041773ef2d493f3547aa1b0fbdf5b1bb548a3da39164384293ef5292b2c5b3 -size 1118 diff --git a/public/models/talkie-LOD/e_cran_mixed_ao.png b/public/models/talkie-LOD/e_cran_mixed_ao.png deleted file mode 100644 index e91eb6e..0000000 --- a/public/models/talkie-LOD/e_cran_mixed_ao.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d4f3fd92f328f0733f9cb9865209466c251f4edf4750654eb0385b519300cf34 -size 329712 diff --git a/public/models/talkie-LOD/e_cran_normal.png b/public/models/talkie-LOD/e_cran_normal.png deleted file mode 100644 index 175152b..0000000 --- a/public/models/talkie-LOD/e_cran_normal.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a07dd2bf8fe1d37b9a74d2ca09b8a77d8a97029d41a8483e34ba30bd8e9efc04 -size 74315 diff --git a/public/models/talkie-LOD/e_cran_normal_opengl.png b/public/models/talkie-LOD/e_cran_normal_opengl.png deleted file mode 100644 index e17d9b3..0000000 --- a/public/models/talkie-LOD/e_cran_normal_opengl.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ca90a32ea8b1dadb11a5cf2e41d4d096920fd7a2ab493dec96682a479d4e7a8c -size 74316 diff --git a/public/models/talkie-LOD/e_cran_roughness.png b/public/models/talkie-LOD/e_cran_roughness.png deleted file mode 100644 index ad642fa..0000000 --- a/public/models/talkie-LOD/e_cran_roughness.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:700f97e34547f14a62a45858218e56eb3715a278380c2f1f14be9ca6feaae959 -size 72768 diff --git a/public/models/talkie-LOD/hautparleur_Base_color.png b/public/models/talkie-LOD/hautparleur_Base_color.png deleted file mode 100644 index 9e43314..0000000 --- a/public/models/talkie-LOD/hautparleur_Base_color.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:36168017b9c2d6961f869f461812a53ed4bdb49f24f350452f4604009acb6fe8 -size 658014 diff --git a/public/models/talkie-LOD/hautparleur_Height.png b/public/models/talkie-LOD/hautparleur_Height.png deleted file mode 100644 index 713980d..0000000 --- a/public/models/talkie-LOD/hautparleur_Height.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:208daeea7306a6a576fbe1098c66d59571dd984635d7fb6c017fd767cde531ed -size 3178 diff --git a/public/models/talkie-LOD/hautparleur_Metallic.png b/public/models/talkie-LOD/hautparleur_Metallic.png deleted file mode 100644 index b46e54a..0000000 --- a/public/models/talkie-LOD/hautparleur_Metallic.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:60041773ef2d493f3547aa1b0fbdf5b1bb548a3da39164384293ef5292b2c5b3 -size 1118 diff --git a/public/models/talkie-LOD/hautparleur_Mixed_AO.png b/public/models/talkie-LOD/hautparleur_Mixed_AO.png deleted file mode 100644 index f2bfd28..0000000 --- a/public/models/talkie-LOD/hautparleur_Mixed_AO.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:29ac8737a9eccff201ad351b4b403e93ed65c7a082052c1070455bc7c795bcbb -size 201135 diff --git a/public/models/talkie-LOD/hautparleur_Roughness.png b/public/models/talkie-LOD/hautparleur_Roughness.png deleted file mode 100644 index 17ac038..0000000 --- a/public/models/talkie-LOD/hautparleur_Roughness.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9f7c1e238150662981d8a4d003045021ee0cca21af14dc79a9180671c6a82621 -size 74349 diff --git a/public/models/talkie-LOD/hautparleur_normal.png b/public/models/talkie-LOD/hautparleur_normal.png deleted file mode 100644 index 5d89a1c..0000000 --- a/public/models/talkie-LOD/hautparleur_normal.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:65edaf688e31787da8deb864079aed068cc71775dbbde4c350481896c2d8a204 -size 98635 diff --git a/public/models/talkie-LOD/hautparleur_normal_opengl.png b/public/models/talkie-LOD/hautparleur_normal_opengl.png deleted file mode 100644 index 814a2b3..0000000 --- a/public/models/talkie-LOD/hautparleur_normal_opengl.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c689c9d28d984f54e5647de38423f34da442b8e8cac076052bfa5df07457fb1c -size 98768 diff --git a/public/models/talkie-LOD/model.bin b/public/models/talkie-LOD/model.bin deleted file mode 100644 index 7e13375..0000000 --- a/public/models/talkie-LOD/model.bin +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:970717ff52a7275d1e6090a8699021ae57b74127b05c016eafb6dca45158420f -size 198456 diff --git a/public/models/talkie-LOD/model.gltf b/public/models/talkie-LOD/model.gltf deleted file mode 100644 index 5caa83b..0000000 --- a/public/models/talkie-LOD/model.gltf +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:694acec3219e3cb0dbce0e9739bc3c6655dbf5360f104d50a52618e06d90c946 -size 63007 diff --git a/public/models/talkie-LOD/prise_Base_color.png b/public/models/talkie-LOD/prise_Base_color.png deleted file mode 100644 index 30d846f..0000000 --- a/public/models/talkie-LOD/prise_Base_color.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7e012c8775c6eb274a80856394fac6673f7beb754c2f78e1c51c842ac017fdd5 -size 472487 diff --git a/public/models/talkie-LOD/prise_Height.png b/public/models/talkie-LOD/prise_Height.png deleted file mode 100644 index 713980d..0000000 --- a/public/models/talkie-LOD/prise_Height.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:208daeea7306a6a576fbe1098c66d59571dd984635d7fb6c017fd767cde531ed -size 3178 diff --git a/public/models/talkie-LOD/prise_Metallic.png b/public/models/talkie-LOD/prise_Metallic.png deleted file mode 100644 index b46e54a..0000000 --- a/public/models/talkie-LOD/prise_Metallic.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:60041773ef2d493f3547aa1b0fbdf5b1bb548a3da39164384293ef5292b2c5b3 -size 1118 diff --git a/public/models/talkie-LOD/prise_Mixed_AO.png b/public/models/talkie-LOD/prise_Mixed_AO.png deleted file mode 100644 index 1ed1f71..0000000 --- a/public/models/talkie-LOD/prise_Mixed_AO.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9a7ae156409544d00bf3332fb542aaec0711d4ce4c9d39d4bd573fb4f0212051 -size 230780 diff --git a/public/models/talkie-LOD/prise_Roughness.png b/public/models/talkie-LOD/prise_Roughness.png deleted file mode 100644 index c827dba..0000000 --- a/public/models/talkie-LOD/prise_Roughness.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:161c97c6ad56619ad702cc955a26ea92203575f31bb35ebc8ca398b48aae9889 -size 100073 diff --git a/public/models/talkie-LOD/prise_normal.png b/public/models/talkie-LOD/prise_normal.png deleted file mode 100644 index 5bcffa1..0000000 --- a/public/models/talkie-LOD/prise_normal.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3c00bec06b1bbd954eb91872fa8cd817f247b275c16e6c372db52189ba6f3778 -size 212856 diff --git a/public/models/talkie-LOD/prise_normal_opengl.png b/public/models/talkie-LOD/prise_normal_opengl.png deleted file mode 100644 index 6bc3741..0000000 --- a/public/models/talkie-LOD/prise_normal_opengl.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:aa8e8d378a595f8aafc4cd34ecac65426a03847a402f955b7b0280f0383d40eb -size 224961 diff --git a/public/models/talkie-LOD/talkie_Base_color.png b/public/models/talkie-LOD/talkie_Base_color.png deleted file mode 100644 index 295b322..0000000 --- a/public/models/talkie-LOD/talkie_Base_color.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:aead25dde6c940f353fa4a53f43e37dde80cd924ccced3c4f88a45dcc5fb4751 -size 610827 diff --git a/public/models/talkie-LOD/talkie_Height.png b/public/models/talkie-LOD/talkie_Height.png deleted file mode 100644 index 713980d..0000000 --- a/public/models/talkie-LOD/talkie_Height.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:208daeea7306a6a576fbe1098c66d59571dd984635d7fb6c017fd767cde531ed -size 3178 diff --git a/public/models/talkie-LOD/talkie_Metallic.png b/public/models/talkie-LOD/talkie_Metallic.png deleted file mode 100644 index b46e54a..0000000 --- a/public/models/talkie-LOD/talkie_Metallic.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:60041773ef2d493f3547aa1b0fbdf5b1bb548a3da39164384293ef5292b2c5b3 -size 1118 diff --git a/public/models/talkie-LOD/talkie_Mixed_AO.png b/public/models/talkie-LOD/talkie_Mixed_AO.png deleted file mode 100644 index a015f96..0000000 --- a/public/models/talkie-LOD/talkie_Mixed_AO.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:78a4e5bc8affb8c7f529712ddcc4958982729d4bbc64163d93b4e3df8192f3e9 -size 229809 diff --git a/public/models/talkie-LOD/talkie_Roughness.png b/public/models/talkie-LOD/talkie_Roughness.png deleted file mode 100644 index 091f911..0000000 --- a/public/models/talkie-LOD/talkie_Roughness.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:638da789f9d21dfa546cf053c5f0c4e47fc18eef3d7ac412d39bdbdf3b3974b1 -size 134252 diff --git a/public/models/talkie-LOD/talkie_normal.png b/public/models/talkie-LOD/talkie_normal.png deleted file mode 100644 index d3e9649..0000000 --- a/public/models/talkie-LOD/talkie_normal.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3fba8c5bce232fd16f3d3da18228438443bfcfab6f1673884e2c6439a799a342 -size 285066 diff --git a/public/models/talkie-LOD/talkie_normal_opengl.png b/public/models/talkie-LOD/talkie_normal_opengl.png deleted file mode 100644 index e58b36f..0000000 --- a/public/models/talkie-LOD/talkie_normal_opengl.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:708382f0b0340e845f0cd4127b84ec5f837f5ca3a51f0c4064ba790374643c21 -size 287356 diff --git a/public/models/talkie-LOD/touches_Base_color.png b/public/models/talkie-LOD/touches_Base_color.png deleted file mode 100644 index eb7631c..0000000 --- a/public/models/talkie-LOD/touches_Base_color.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:47ef413967a461f9768b74d15a2ab1c8e3e3fe6fc9be027d8cf1e7268bb8a888 -size 126096 diff --git a/public/models/talkie-LOD/touches_Height.png b/public/models/talkie-LOD/touches_Height.png deleted file mode 100644 index 713980d..0000000 --- a/public/models/talkie-LOD/touches_Height.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:208daeea7306a6a576fbe1098c66d59571dd984635d7fb6c017fd767cde531ed -size 3178 diff --git a/public/models/talkie-LOD/touches_Metallic.png b/public/models/talkie-LOD/touches_Metallic.png deleted file mode 100644 index b46e54a..0000000 --- a/public/models/talkie-LOD/touches_Metallic.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:60041773ef2d493f3547aa1b0fbdf5b1bb548a3da39164384293ef5292b2c5b3 -size 1118 diff --git a/public/models/talkie-LOD/touches_Mixed_AO.png b/public/models/talkie-LOD/touches_Mixed_AO.png deleted file mode 100644 index 5673800..0000000 --- a/public/models/talkie-LOD/touches_Mixed_AO.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6884417f47afb4330b00f9f42fa1faf7b8bbd06d2ae9595cffe409a4d38cd461 -size 246760 diff --git a/public/models/talkie-LOD/touches_Roughness.png b/public/models/talkie-LOD/touches_Roughness.png deleted file mode 100644 index bd73a19..0000000 --- a/public/models/talkie-LOD/touches_Roughness.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5804a17a4fd8691a606cbb3e671234f2c876dfc0e88e16d2f781bd35785167cb -size 56002 diff --git a/public/models/talkie-LOD/touches_normal.png b/public/models/talkie-LOD/touches_normal.png deleted file mode 100644 index 07f83c4..0000000 --- a/public/models/talkie-LOD/touches_normal.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:09d922e17cd400c32ef51462723e9c5ee9dfbe4c668e88e6057f9e7d60c8830e -size 59216 diff --git a/public/models/talkie-LOD/touches_normal_opengl.png b/public/models/talkie-LOD/touches_normal_opengl.png deleted file mode 100644 index ec98ce7..0000000 --- a/public/models/talkie-LOD/touches_normal_opengl.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8cdadc48d7d365fa0f8e4f3b64a61a6fa95cf9bcafaf50dc83ea7cf90173f68b -size 59178 diff --git a/public/models/talkie-LOD/écran_Base_color.png b/public/models/talkie-LOD/écran_Base_color.png deleted file mode 100644 index b28a367..0000000 --- a/public/models/talkie-LOD/écran_Base_color.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:bfbf65890f6d5019bf113246dcecb83c97e31d6e10b0429d5e89df9df67a58bd -size 6498 diff --git a/public/models/talkie-LOD/écran_Height.png b/public/models/talkie-LOD/écran_Height.png deleted file mode 100644 index 713980d..0000000 --- a/public/models/talkie-LOD/écran_Height.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:208daeea7306a6a576fbe1098c66d59571dd984635d7fb6c017fd767cde531ed -size 3178 diff --git a/public/models/talkie-LOD/écran_Metallic.png b/public/models/talkie-LOD/écran_Metallic.png deleted file mode 100644 index b46e54a..0000000 --- a/public/models/talkie-LOD/écran_Metallic.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:60041773ef2d493f3547aa1b0fbdf5b1bb548a3da39164384293ef5292b2c5b3 -size 1118 diff --git a/public/models/talkie-LOD/écran_Mixed_AO.png b/public/models/talkie-LOD/écran_Mixed_AO.png deleted file mode 100644 index e91eb6e..0000000 --- a/public/models/talkie-LOD/écran_Mixed_AO.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d4f3fd92f328f0733f9cb9865209466c251f4edf4750654eb0385b519300cf34 -size 329712 diff --git a/public/models/talkie-LOD/écran_Normal.png b/public/models/talkie-LOD/écran_Normal.png deleted file mode 100644 index 175152b..0000000 --- a/public/models/talkie-LOD/écran_Normal.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a07dd2bf8fe1d37b9a74d2ca09b8a77d8a97029d41a8483e34ba30bd8e9efc04 -size 74315 diff --git a/public/models/talkie-LOD/écran_Normal_OpenGL.png b/public/models/talkie-LOD/écran_Normal_OpenGL.png deleted file mode 100644 index e17d9b3..0000000 --- a/public/models/talkie-LOD/écran_Normal_OpenGL.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ca90a32ea8b1dadb11a5cf2e41d4d096920fd7a2ab493dec96682a479d4e7a8c -size 74316 diff --git a/public/models/talkie-LOD/écran_Roughness.png b/public/models/talkie-LOD/écran_Roughness.png deleted file mode 100644 index d89bffa..0000000 --- a/public/models/talkie-LOD/écran_Roughness.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d560c80d755fdfff917c63d96d664cc4c9be963cc38ac63533418f7df1b0642c -size 72772 diff --git a/public/models/talkie/antenne_Base_color.png b/public/models/talkie/antenne_Base_color.png deleted file mode 100644 index db60934..0000000 --- a/public/models/talkie/antenne_Base_color.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:fc5ba4130daed3b1edae078cc73ad5a4d9955c8c464abcbc6af2a80077842f7a -size 312866 diff --git a/public/models/talkie/antenne_Height.png b/public/models/talkie/antenne_Height.png deleted file mode 100644 index 713980d..0000000 --- a/public/models/talkie/antenne_Height.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:208daeea7306a6a576fbe1098c66d59571dd984635d7fb6c017fd767cde531ed -size 3178 diff --git a/public/models/talkie/antenne_Metallic.png b/public/models/talkie/antenne_Metallic.png deleted file mode 100644 index b46e54a..0000000 --- a/public/models/talkie/antenne_Metallic.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:60041773ef2d493f3547aa1b0fbdf5b1bb548a3da39164384293ef5292b2c5b3 -size 1118 diff --git a/public/models/talkie/antenne_Mixed_AO.png b/public/models/talkie/antenne_Mixed_AO.png deleted file mode 100644 index 3ba6e13..0000000 --- a/public/models/talkie/antenne_Mixed_AO.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f3ec5ee97080be475cf3f3da71ca440dac8ccbe104510f519d1b4ee928d5b2b9 -size 187817 diff --git a/public/models/talkie/antenne_Normal.png b/public/models/talkie/antenne_Normal.png deleted file mode 100644 index bf16203..0000000 --- a/public/models/talkie/antenne_Normal.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:da8e995d1260a97d5f1c099aa51ccf35123316264751c940bb5e71e3d115c133 -size 205065 diff --git a/public/models/talkie/antenne_Normal_OpenGL.png b/public/models/talkie/antenne_Normal_OpenGL.png deleted file mode 100644 index 7c1dc2b..0000000 --- a/public/models/talkie/antenne_Normal_OpenGL.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c1ec8c53b5e60fb3f13da3db4b787a6dd667f51c05eb92e925902b33c5fb68f5 -size 204007 diff --git a/public/models/talkie/antenne_Roughness.png b/public/models/talkie/antenne_Roughness.png deleted file mode 100644 index e6233e4..0000000 --- a/public/models/talkie/antenne_Roughness.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:91c3fb77f1204027e6d0d46e59dc6b68cd13fc68099b20612b75749460a3c8b8 -size 69233 diff --git a/public/models/talkie/boutona_Base_color.png b/public/models/talkie/boutona_Base_color.png deleted file mode 100644 index f493f55..0000000 --- a/public/models/talkie/boutona_Base_color.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ef47a91bfd020de0983e75bc8bc03277b651c894da0f006dc49d5bfb91e86623 -size 473199 diff --git a/public/models/talkie/boutona_Height.png b/public/models/talkie/boutona_Height.png deleted file mode 100644 index 713980d..0000000 --- a/public/models/talkie/boutona_Height.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:208daeea7306a6a576fbe1098c66d59571dd984635d7fb6c017fd767cde531ed -size 3178 diff --git a/public/models/talkie/boutona_Metallic.png b/public/models/talkie/boutona_Metallic.png deleted file mode 100644 index b46e54a..0000000 --- a/public/models/talkie/boutona_Metallic.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:60041773ef2d493f3547aa1b0fbdf5b1bb548a3da39164384293ef5292b2c5b3 -size 1118 diff --git a/public/models/talkie/boutona_Mixed_AO.png b/public/models/talkie/boutona_Mixed_AO.png deleted file mode 100644 index d28322d..0000000 --- a/public/models/talkie/boutona_Mixed_AO.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f45671cafcc91e40f67120f22f7b58c75a9bf5289f8dd67019d7c836253e8942 -size 244343 diff --git a/public/models/talkie/boutona_Normal.png b/public/models/talkie/boutona_Normal.png deleted file mode 100644 index 4cf6138..0000000 --- a/public/models/talkie/boutona_Normal.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9c0e761804d0546dc6cd9d929fdecab8f6852866a6f2025c03c76c34b2040ee0 -size 175939 diff --git a/public/models/talkie/boutona_Normal_OpenGL.png b/public/models/talkie/boutona_Normal_OpenGL.png deleted file mode 100644 index 80416e2..0000000 --- a/public/models/talkie/boutona_Normal_OpenGL.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:86c390222c74160382b92a5736664c37e3861937db2e2d58699643516fc52995 -size 176366 diff --git a/public/models/talkie/boutona_Roughness.png b/public/models/talkie/boutona_Roughness.png deleted file mode 100644 index daa6677..0000000 --- a/public/models/talkie/boutona_Roughness.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:adaedf0e287c99669b47a0e3e3b99ed2c6f1f5a761e69168418e56610d7d8f9a -size 54561 diff --git a/public/models/talkie/boutonb_Base_color.png b/public/models/talkie/boutonb_Base_color.png deleted file mode 100644 index ed59d49..0000000 --- a/public/models/talkie/boutonb_Base_color.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:84973c1c06bf83beacd0987c5d252560ec92e09701b3ac6b73289f39392c21da -size 496575 diff --git a/public/models/talkie/boutonb_Height.png b/public/models/talkie/boutonb_Height.png deleted file mode 100644 index 713980d..0000000 --- a/public/models/talkie/boutonb_Height.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:208daeea7306a6a576fbe1098c66d59571dd984635d7fb6c017fd767cde531ed -size 3178 diff --git a/public/models/talkie/boutonb_Metallic.png b/public/models/talkie/boutonb_Metallic.png deleted file mode 100644 index b46e54a..0000000 --- a/public/models/talkie/boutonb_Metallic.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:60041773ef2d493f3547aa1b0fbdf5b1bb548a3da39164384293ef5292b2c5b3 -size 1118 diff --git a/public/models/talkie/boutonb_Mixed_AO.png b/public/models/talkie/boutonb_Mixed_AO.png deleted file mode 100644 index 8292910..0000000 --- a/public/models/talkie/boutonb_Mixed_AO.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d58e8ec5e90125edd38f279ee1b9fee863b75d8396fef6a0c22a9af6a9c0a341 -size 239658 diff --git a/public/models/talkie/boutonb_Normal.png b/public/models/talkie/boutonb_Normal.png deleted file mode 100644 index 943917e..0000000 --- a/public/models/talkie/boutonb_Normal.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:53e5d76fcd40986674d93f289cea51c6b839d720787d98ed4112164e20558bd2 -size 176052 diff --git a/public/models/talkie/boutonb_Normal_OpenGL.png b/public/models/talkie/boutonb_Normal_OpenGL.png deleted file mode 100644 index 47539e6..0000000 --- a/public/models/talkie/boutonb_Normal_OpenGL.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4a1ea79411217de422f6f7fd160c673e01a2a09ebce1d95a6b5e63c8c1e5de18 -size 176723 diff --git a/public/models/talkie/boutonb_Roughness.png b/public/models/talkie/boutonb_Roughness.png deleted file mode 100644 index acba391..0000000 --- a/public/models/talkie/boutonb_Roughness.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ad833228a99505d0fea7495970bfbf47d3942a86d457aca379b99d8224d8633f -size 54522 diff --git a/public/models/talkie/cable1_Base_color.png b/public/models/talkie/cable1_Base_color.png deleted file mode 100644 index 0aa378c..0000000 --- a/public/models/talkie/cable1_Base_color.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:967d8771fbcd5427bf0005b147ecae38ab53271c4a99980f34db1102d0cb35f0 -size 178767 diff --git a/public/models/talkie/cable1_Height.png b/public/models/talkie/cable1_Height.png deleted file mode 100644 index 713980d..0000000 --- a/public/models/talkie/cable1_Height.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:208daeea7306a6a576fbe1098c66d59571dd984635d7fb6c017fd767cde531ed -size 3178 diff --git a/public/models/talkie/cable1_Metallic.png b/public/models/talkie/cable1_Metallic.png deleted file mode 100644 index b46e54a..0000000 --- a/public/models/talkie/cable1_Metallic.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:60041773ef2d493f3547aa1b0fbdf5b1bb548a3da39164384293ef5292b2c5b3 -size 1118 diff --git a/public/models/talkie/cable1_Mixed_AO.png b/public/models/talkie/cable1_Mixed_AO.png deleted file mode 100644 index 2003ade..0000000 --- a/public/models/talkie/cable1_Mixed_AO.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:73378e05b925c39d37e3cfdb1048d891b6216927fbd9eab111a61051d9c5fadd -size 142820 diff --git a/public/models/talkie/cable1_Normal.png b/public/models/talkie/cable1_Normal.png deleted file mode 100644 index 8f1338d..0000000 --- a/public/models/talkie/cable1_Normal.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:cb4d0e26c8d16fcb471e2812585fb27ddfbce4500c526fce512d61f7611c5b99 -size 186292 diff --git a/public/models/talkie/cable1_Normal_OpenGL.png b/public/models/talkie/cable1_Normal_OpenGL.png deleted file mode 100644 index 456bcdb..0000000 --- a/public/models/talkie/cable1_Normal_OpenGL.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8854c9b53ac97ce6113d351aa528d9a6664e90947678aee05731695e034d1c79 -size 187073 diff --git a/public/models/talkie/cable1_Roughness.png b/public/models/talkie/cable1_Roughness.png deleted file mode 100644 index c1c9096..0000000 --- a/public/models/talkie/cable1_Roughness.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6a2a10008bf8a90ca1e7ef831944d8e6b2c41d5aa9b5a1f20f49d7dcc942b9f2 -size 56819 diff --git a/public/models/talkie/cable2_Base_color.png b/public/models/talkie/cable2_Base_color.png deleted file mode 100644 index ba3be72..0000000 --- a/public/models/talkie/cable2_Base_color.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4b1bdd610bf135a20471bc2b65e53f2a2333ab6e845380f55fed93d45dce1897 -size 210840 diff --git a/public/models/talkie/cable2_Height.png b/public/models/talkie/cable2_Height.png deleted file mode 100644 index 713980d..0000000 --- a/public/models/talkie/cable2_Height.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:208daeea7306a6a576fbe1098c66d59571dd984635d7fb6c017fd767cde531ed -size 3178 diff --git a/public/models/talkie/cable2_Metallic.png b/public/models/talkie/cable2_Metallic.png deleted file mode 100644 index b46e54a..0000000 --- a/public/models/talkie/cable2_Metallic.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:60041773ef2d493f3547aa1b0fbdf5b1bb548a3da39164384293ef5292b2c5b3 -size 1118 diff --git a/public/models/talkie/cable2_Mixed_AO.png b/public/models/talkie/cable2_Mixed_AO.png deleted file mode 100644 index e3a64cc..0000000 --- a/public/models/talkie/cable2_Mixed_AO.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:30e8e315f7950a91135bba6ac43d04563b1e501e83cfb4b57048320768602bc5 -size 167450 diff --git a/public/models/talkie/cable2_Normal.png b/public/models/talkie/cable2_Normal.png deleted file mode 100644 index acc99fd..0000000 --- a/public/models/talkie/cable2_Normal.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b09eae40cd4d52c348933f49347691f08dc6f25d929ddadbeddd2157444c706f -size 195384 diff --git a/public/models/talkie/cable2_Normal_OpenGL.png b/public/models/talkie/cable2_Normal_OpenGL.png deleted file mode 100644 index d184f94..0000000 --- a/public/models/talkie/cable2_Normal_OpenGL.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ff1ae64895328cae7bf8816a43eb38ca4db82b7979d02db927bc307fa7ec66c6 -size 196010 diff --git a/public/models/talkie/cable2_Roughness.png b/public/models/talkie/cable2_Roughness.png deleted file mode 100644 index a9440d4..0000000 --- a/public/models/talkie/cable2_Roughness.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0d9e3cc7a29c90c1712196c05915bea480124dddc0db47db9415f738f895660c -size 60898 diff --git a/public/models/talkie/cadre_Base_color.png b/public/models/talkie/cadre_Base_color.png deleted file mode 100644 index afbe925..0000000 --- a/public/models/talkie/cadre_Base_color.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:637e73b56419d8390e8aeb27433fdee21264c9d5b28e1caaf7e1357f6c191fd3 -size 280049 diff --git a/public/models/talkie/cadre_Height.png b/public/models/talkie/cadre_Height.png deleted file mode 100644 index 713980d..0000000 --- a/public/models/talkie/cadre_Height.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:208daeea7306a6a576fbe1098c66d59571dd984635d7fb6c017fd767cde531ed -size 3178 diff --git a/public/models/talkie/cadre_Metallic.png b/public/models/talkie/cadre_Metallic.png deleted file mode 100644 index b46e54a..0000000 --- a/public/models/talkie/cadre_Metallic.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:60041773ef2d493f3547aa1b0fbdf5b1bb548a3da39164384293ef5292b2c5b3 -size 1118 diff --git a/public/models/talkie/cadre_Mixed_AO.png b/public/models/talkie/cadre_Mixed_AO.png deleted file mode 100644 index 0151384..0000000 --- a/public/models/talkie/cadre_Mixed_AO.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e1f9912860e5f508e0e29ef1e03943101cdb287a1c34bd0278ac237824255da5 -size 157683 diff --git a/public/models/talkie/cadre_Normal.png b/public/models/talkie/cadre_Normal.png deleted file mode 100644 index 8d2a5a3..0000000 --- a/public/models/talkie/cadre_Normal.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:982a042d28061ce926c80293129985733aba79bc7115e0f5b55e4f4186808f5a -size 52817 diff --git a/public/models/talkie/cadre_Normal_OpenGL.png b/public/models/talkie/cadre_Normal_OpenGL.png deleted file mode 100644 index 46032a3..0000000 --- a/public/models/talkie/cadre_Normal_OpenGL.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:58d63de38e7fefca7ec94b4057b37256c477dbd2749f950f0bd373932b52cbf9 -size 52737 diff --git a/public/models/talkie/cadre_Roughness.png b/public/models/talkie/cadre_Roughness.png deleted file mode 100644 index 264a6e4..0000000 --- a/public/models/talkie/cadre_Roughness.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:afb28f17a6f419356f49088c8c5b8d12b6aaf2471ee7e35ef42e0fda3a5365f2 -size 53784 diff --git a/public/models/talkie/e_cran_base_color.png b/public/models/talkie/e_cran_base_color.png deleted file mode 100644 index a8c2149..0000000 --- a/public/models/talkie/e_cran_base_color.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f75363e70ffed07a182a3e61d7c301cb8fd053ac8ec784d56e9450335167dce8 -size 6502 diff --git a/public/models/talkie/e_cran_height.png b/public/models/talkie/e_cran_height.png deleted file mode 100644 index 713980d..0000000 --- a/public/models/talkie/e_cran_height.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:208daeea7306a6a576fbe1098c66d59571dd984635d7fb6c017fd767cde531ed -size 3178 diff --git a/public/models/talkie/e_cran_metallic.png b/public/models/talkie/e_cran_metallic.png deleted file mode 100644 index b46e54a..0000000 --- a/public/models/talkie/e_cran_metallic.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:60041773ef2d493f3547aa1b0fbdf5b1bb548a3da39164384293ef5292b2c5b3 -size 1118 diff --git a/public/models/talkie/e_cran_mixed_ao.png b/public/models/talkie/e_cran_mixed_ao.png deleted file mode 100644 index e91eb6e..0000000 --- a/public/models/talkie/e_cran_mixed_ao.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d4f3fd92f328f0733f9cb9865209466c251f4edf4750654eb0385b519300cf34 -size 329712 diff --git a/public/models/talkie/e_cran_normal.png b/public/models/talkie/e_cran_normal.png deleted file mode 100644 index 175152b..0000000 --- a/public/models/talkie/e_cran_normal.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a07dd2bf8fe1d37b9a74d2ca09b8a77d8a97029d41a8483e34ba30bd8e9efc04 -size 74315 diff --git a/public/models/talkie/e_cran_normal_opengl.png b/public/models/talkie/e_cran_normal_opengl.png deleted file mode 100644 index e17d9b3..0000000 --- a/public/models/talkie/e_cran_normal_opengl.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ca90a32ea8b1dadb11a5cf2e41d4d096920fd7a2ab493dec96682a479d4e7a8c -size 74316 diff --git a/public/models/talkie/e_cran_roughness.png b/public/models/talkie/e_cran_roughness.png deleted file mode 100644 index ad642fa..0000000 --- a/public/models/talkie/e_cran_roughness.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:700f97e34547f14a62a45858218e56eb3715a278380c2f1f14be9ca6feaae959 -size 72768 diff --git a/public/models/talkie/hautparleur_Base_color.png b/public/models/talkie/hautparleur_Base_color.png deleted file mode 100644 index 9e43314..0000000 --- a/public/models/talkie/hautparleur_Base_color.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:36168017b9c2d6961f869f461812a53ed4bdb49f24f350452f4604009acb6fe8 -size 658014 diff --git a/public/models/talkie/hautparleur_Height.png b/public/models/talkie/hautparleur_Height.png deleted file mode 100644 index 713980d..0000000 --- a/public/models/talkie/hautparleur_Height.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:208daeea7306a6a576fbe1098c66d59571dd984635d7fb6c017fd767cde531ed -size 3178 diff --git a/public/models/talkie/hautparleur_Metallic.png b/public/models/talkie/hautparleur_Metallic.png deleted file mode 100644 index b46e54a..0000000 --- a/public/models/talkie/hautparleur_Metallic.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:60041773ef2d493f3547aa1b0fbdf5b1bb548a3da39164384293ef5292b2c5b3 -size 1118 diff --git a/public/models/talkie/hautparleur_Mixed_AO.png b/public/models/talkie/hautparleur_Mixed_AO.png deleted file mode 100644 index f2bfd28..0000000 --- a/public/models/talkie/hautparleur_Mixed_AO.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:29ac8737a9eccff201ad351b4b403e93ed65c7a082052c1070455bc7c795bcbb -size 201135 diff --git a/public/models/talkie/hautparleur_Normal.png b/public/models/talkie/hautparleur_Normal.png deleted file mode 100644 index 5d89a1c..0000000 --- a/public/models/talkie/hautparleur_Normal.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:65edaf688e31787da8deb864079aed068cc71775dbbde4c350481896c2d8a204 -size 98635 diff --git a/public/models/talkie/hautparleur_Normal_OpenGL.png b/public/models/talkie/hautparleur_Normal_OpenGL.png deleted file mode 100644 index 814a2b3..0000000 --- a/public/models/talkie/hautparleur_Normal_OpenGL.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c689c9d28d984f54e5647de38423f34da442b8e8cac076052bfa5df07457fb1c -size 98768 diff --git a/public/models/talkie/hautparleur_Roughness.png b/public/models/talkie/hautparleur_Roughness.png deleted file mode 100644 index 17ac038..0000000 --- a/public/models/talkie/hautparleur_Roughness.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9f7c1e238150662981d8a4d003045021ee0cca21af14dc79a9180671c6a82621 -size 74349 diff --git a/public/models/talkie/model.bin b/public/models/talkie/model.bin deleted file mode 100644 index 7e13375..0000000 --- a/public/models/talkie/model.bin +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:970717ff52a7275d1e6090a8699021ae57b74127b05c016eafb6dca45158420f -size 198456 diff --git a/public/models/talkie/model.glb b/public/models/talkie/model.glb new file mode 100644 index 0000000..8fafee9 --- /dev/null +++ b/public/models/talkie/model.glb @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9d9e8136c7645a868ad874ee98afd508ff41d6be3f1b7220a889bb161be41af4 +size 6954256 diff --git a/public/models/talkie/model.gltf b/public/models/talkie/model.gltf deleted file mode 100644 index 5caa83b..0000000 --- a/public/models/talkie/model.gltf +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:694acec3219e3cb0dbce0e9739bc3c6655dbf5360f104d50a52618e06d90c946 -size 63007 diff --git a/public/models/talkie/prise_Base_color.png b/public/models/talkie/prise_Base_color.png deleted file mode 100644 index 30d846f..0000000 --- a/public/models/talkie/prise_Base_color.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7e012c8775c6eb274a80856394fac6673f7beb754c2f78e1c51c842ac017fdd5 -size 472487 diff --git a/public/models/talkie/prise_Height.png b/public/models/talkie/prise_Height.png deleted file mode 100644 index 713980d..0000000 --- a/public/models/talkie/prise_Height.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:208daeea7306a6a576fbe1098c66d59571dd984635d7fb6c017fd767cde531ed -size 3178 diff --git a/public/models/talkie/prise_Metallic.png b/public/models/talkie/prise_Metallic.png deleted file mode 100644 index b46e54a..0000000 --- a/public/models/talkie/prise_Metallic.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:60041773ef2d493f3547aa1b0fbdf5b1bb548a3da39164384293ef5292b2c5b3 -size 1118 diff --git a/public/models/talkie/prise_Mixed_AO.png b/public/models/talkie/prise_Mixed_AO.png deleted file mode 100644 index 1ed1f71..0000000 --- a/public/models/talkie/prise_Mixed_AO.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9a7ae156409544d00bf3332fb542aaec0711d4ce4c9d39d4bd573fb4f0212051 -size 230780 diff --git a/public/models/talkie/prise_Normal.png b/public/models/talkie/prise_Normal.png deleted file mode 100644 index 5bcffa1..0000000 --- a/public/models/talkie/prise_Normal.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3c00bec06b1bbd954eb91872fa8cd817f247b275c16e6c372db52189ba6f3778 -size 212856 diff --git a/public/models/talkie/prise_Normal_OpenGL.png b/public/models/talkie/prise_Normal_OpenGL.png deleted file mode 100644 index 6bc3741..0000000 --- a/public/models/talkie/prise_Normal_OpenGL.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:aa8e8d378a595f8aafc4cd34ecac65426a03847a402f955b7b0280f0383d40eb -size 224961 diff --git a/public/models/talkie/prise_Roughness.png b/public/models/talkie/prise_Roughness.png deleted file mode 100644 index c827dba..0000000 --- a/public/models/talkie/prise_Roughness.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:161c97c6ad56619ad702cc955a26ea92203575f31bb35ebc8ca398b48aae9889 -size 100073 diff --git a/public/models/talkie/talkie_Base_color.png b/public/models/talkie/talkie_Base_color.png deleted file mode 100644 index 295b322..0000000 --- a/public/models/talkie/talkie_Base_color.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:aead25dde6c940f353fa4a53f43e37dde80cd924ccced3c4f88a45dcc5fb4751 -size 610827 diff --git a/public/models/talkie/talkie_Height.png b/public/models/talkie/talkie_Height.png deleted file mode 100644 index 713980d..0000000 --- a/public/models/talkie/talkie_Height.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:208daeea7306a6a576fbe1098c66d59571dd984635d7fb6c017fd767cde531ed -size 3178 diff --git a/public/models/talkie/talkie_Metallic.png b/public/models/talkie/talkie_Metallic.png deleted file mode 100644 index b46e54a..0000000 --- a/public/models/talkie/talkie_Metallic.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:60041773ef2d493f3547aa1b0fbdf5b1bb548a3da39164384293ef5292b2c5b3 -size 1118 diff --git a/public/models/talkie/talkie_Mixed_AO.png b/public/models/talkie/talkie_Mixed_AO.png deleted file mode 100644 index a015f96..0000000 --- a/public/models/talkie/talkie_Mixed_AO.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:78a4e5bc8affb8c7f529712ddcc4958982729d4bbc64163d93b4e3df8192f3e9 -size 229809 diff --git a/public/models/talkie/talkie_Normal.png b/public/models/talkie/talkie_Normal.png deleted file mode 100644 index d3e9649..0000000 --- a/public/models/talkie/talkie_Normal.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3fba8c5bce232fd16f3d3da18228438443bfcfab6f1673884e2c6439a799a342 -size 285066 diff --git a/public/models/talkie/talkie_Normal_OpenGL.png b/public/models/talkie/talkie_Normal_OpenGL.png deleted file mode 100644 index e58b36f..0000000 --- a/public/models/talkie/talkie_Normal_OpenGL.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:708382f0b0340e845f0cd4127b84ec5f837f5ca3a51f0c4064ba790374643c21 -size 287356 diff --git a/public/models/talkie/talkie_Roughness.png b/public/models/talkie/talkie_Roughness.png deleted file mode 100644 index 091f911..0000000 --- a/public/models/talkie/talkie_Roughness.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:638da789f9d21dfa546cf053c5f0c4e47fc18eef3d7ac412d39bdbdf3b3974b1 -size 134252 diff --git a/public/models/talkie/touches_Base_color.png b/public/models/talkie/touches_Base_color.png deleted file mode 100644 index eb7631c..0000000 --- a/public/models/talkie/touches_Base_color.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:47ef413967a461f9768b74d15a2ab1c8e3e3fe6fc9be027d8cf1e7268bb8a888 -size 126096 diff --git a/public/models/talkie/touches_Height.png b/public/models/talkie/touches_Height.png deleted file mode 100644 index 713980d..0000000 --- a/public/models/talkie/touches_Height.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:208daeea7306a6a576fbe1098c66d59571dd984635d7fb6c017fd767cde531ed -size 3178 diff --git a/public/models/talkie/touches_Metallic.png b/public/models/talkie/touches_Metallic.png deleted file mode 100644 index b46e54a..0000000 --- a/public/models/talkie/touches_Metallic.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:60041773ef2d493f3547aa1b0fbdf5b1bb548a3da39164384293ef5292b2c5b3 -size 1118 diff --git a/public/models/talkie/touches_Mixed_AO.png b/public/models/talkie/touches_Mixed_AO.png deleted file mode 100644 index 5673800..0000000 --- a/public/models/talkie/touches_Mixed_AO.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6884417f47afb4330b00f9f42fa1faf7b8bbd06d2ae9595cffe409a4d38cd461 -size 246760 diff --git a/public/models/talkie/touches_Normal.png b/public/models/talkie/touches_Normal.png deleted file mode 100644 index 07f83c4..0000000 --- a/public/models/talkie/touches_Normal.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:09d922e17cd400c32ef51462723e9c5ee9dfbe4c668e88e6057f9e7d60c8830e -size 59216 diff --git a/public/models/talkie/touches_Normal_OpenGL.png b/public/models/talkie/touches_Normal_OpenGL.png deleted file mode 100644 index ec98ce7..0000000 --- a/public/models/talkie/touches_Normal_OpenGL.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8cdadc48d7d365fa0f8e4f3b64a61a6fa95cf9bcafaf50dc83ea7cf90173f68b -size 59178 diff --git a/public/models/talkie/touches_Roughness.png b/public/models/talkie/touches_Roughness.png deleted file mode 100644 index bd73a19..0000000 --- a/public/models/talkie/touches_Roughness.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5804a17a4fd8691a606cbb3e671234f2c876dfc0e88e16d2f781bd35785167cb -size 56002 diff --git a/public/models/talkie/écran_Base_color.png b/public/models/talkie/écran_Base_color.png deleted file mode 100644 index b28a367..0000000 --- a/public/models/talkie/écran_Base_color.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:bfbf65890f6d5019bf113246dcecb83c97e31d6e10b0429d5e89df9df67a58bd -size 6498 diff --git a/public/models/talkie/écran_Height.png b/public/models/talkie/écran_Height.png deleted file mode 100644 index 713980d..0000000 --- a/public/models/talkie/écran_Height.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:208daeea7306a6a576fbe1098c66d59571dd984635d7fb6c017fd767cde531ed -size 3178 diff --git a/public/models/talkie/écran_Metallic.png b/public/models/talkie/écran_Metallic.png deleted file mode 100644 index b46e54a..0000000 --- a/public/models/talkie/écran_Metallic.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:60041773ef2d493f3547aa1b0fbdf5b1bb548a3da39164384293ef5292b2c5b3 -size 1118 diff --git a/public/models/talkie/écran_Mixed_AO.png b/public/models/talkie/écran_Mixed_AO.png deleted file mode 100644 index e91eb6e..0000000 --- a/public/models/talkie/écran_Mixed_AO.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d4f3fd92f328f0733f9cb9865209466c251f4edf4750654eb0385b519300cf34 -size 329712 diff --git a/public/models/talkie/écran_Normal.png b/public/models/talkie/écran_Normal.png deleted file mode 100644 index 175152b..0000000 --- a/public/models/talkie/écran_Normal.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a07dd2bf8fe1d37b9a74d2ca09b8a77d8a97029d41a8483e34ba30bd8e9efc04 -size 74315 diff --git a/public/models/talkie/écran_Normal_OpenGL.png b/public/models/talkie/écran_Normal_OpenGL.png deleted file mode 100644 index e17d9b3..0000000 --- a/public/models/talkie/écran_Normal_OpenGL.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ca90a32ea8b1dadb11a5cf2e41d4d096920fd7a2ab493dec96682a479d4e7a8c -size 74316 diff --git a/public/models/talkie/écran_Roughness.png b/public/models/talkie/écran_Roughness.png deleted file mode 100644 index d89bffa..0000000 --- a/public/models/talkie/écran_Roughness.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d560c80d755fdfff917c63d96d664cc4c9be963cc38ac63533418f7df1b0642c -size 72772 diff --git a/src/data/gameplay/repairMissions.ts b/src/data/gameplay/repairMissions.ts index 23ee2d3..fb676db 100644 --- a/src/data/gameplay/repairMissions.ts +++ b/src/data/gameplay/repairMissions.ts @@ -129,11 +129,6 @@ export const REPAIR_MISSIONS: Record = { label: "Tree sensor", modelPath: "/models/sapin/model.gltf", }, - { - id: "farm-radio-distractor", - label: "Radio module", - modelPath: "/models/talkie/model.glb", - }, ], }, }; From 18dd2ae49d1befd0645e5e9e3c737895213b043e Mon Sep 17 00:00:00 2001 From: Tom Boullay Date: Tue, 2 Jun 2026 15:36:43 +0200 Subject: [PATCH 11/18] fix(electricienne): remove alphaMode BLEND + doubleSided causing face artifacts Solid character mesh does not need transparency; BLEND combined with doubleSided caused depth-sort issues rendering inside-faces over front-faces (visible as triangular orange artifacts on the face). Default OPAQUE single-sided is correct. --- public/models/electricienne-animated/model.gltf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/public/models/electricienne-animated/model.gltf b/public/models/electricienne-animated/model.gltf index 790a4a0..3586956 100644 --- a/public/models/electricienne-animated/model.gltf +++ b/public/models/electricienne-animated/model.gltf @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:91bd4603d2e76e55b0eac402935c1ef8fa80af30528d277691309ac0d539e040 -size 86432 +oid sha256:20ac103bf35040b9d8b2cce0f8c9e0812a8bce629d7430fb28f689244b52d07d +size 86385 From c61760dafd4804493371379636ab2d04d5700cb4 Mon Sep 17 00:00:00 2001 From: Tom Boullay Date: Tue, 2 Jun 2026 16:02:58 +0200 Subject: [PATCH 12/18] docs: document webgl context lost investigation Co-Authored-By: Claude Opus 4.7 (1M context) --- .../webgl-context-lost-investigation.md | 367 ++++++++++++++++++ 1 file changed, 367 insertions(+) create mode 100644 docs/technical/webgl-context-lost-investigation.md diff --git a/docs/technical/webgl-context-lost-investigation.md b/docs/technical/webgl-context-lost-investigation.md new file mode 100644 index 0000000..f6a2dd8 --- /dev/null +++ b/docs/technical/webgl-context-lost-investigation.md @@ -0,0 +1,367 @@ +# WebGL Context Lost - Investigation + +## Résumé court + +Le projet subit des pertes de contexte WebGL pendant les phases où le jeu active +ou prépare le hand tracking, les interactions physiques ou le repair game. + +Le symptôme visible côté console est : + +```txt +THREE.WebGLRenderer: Context Lost. +[ERROR] [WebGL] Context lost - attempting auto-restore +THREE.WebGLRenderer: Context Restored. +``` + +Le problème est bloquant parce que le hand tracking et le repair game sont au +coeur de l'expérience. Quand le contexte WebGL saute, la scène Three.js peut se +remonter, le joueur peut revenir au spawn, le pointer lock peut être perdu, et +les tests de gameplay deviennent instables. + +## Ce qui fonctionne aujourd'hui + +La page principale monte un `` React Three Fiber dans +`src/pages/page.tsx`. + +`src/world/World.tsx` compose ensuite : + +- la scène de jeu ou la scène de test physique ; +- le player ; +- les systèmes visuels de monde ; +- les gants de hand tracking ; +- les systèmes de debug. + +Le hand tracking est centralisé dans +`src/providers/gameplay/HandTrackingProvider.tsx`. + +Il peut utiliser deux sources : + +- `browser` : MediaPipe JS dans le navigateur ; +- `backend` : backend Python local via WebSocket. + +L'activation est déclenchée par : + +- certaines étapes du repair game ; +- les zones d'interaction qui demandent explicitement les mains ; +- la scène Physique en debug, selon les objets présents. + +## Problème observé + +Les context lost arrivent dans plusieurs situations : + +- entrée dans une zone d'interaction ; +- lancement du hand tracking ; +- lancement d'un repair game ; +- scène Physique avec `TestMap`, `Physics`, `AnimatedModel`, waypoints GPS et + objets interactifs ; +- source browser JS ; +- source backend. + +Le fait que le crash existe avec les deux sources indique que le problème n'est +probablement pas limité au backend Python ni à MediaPipe JS seul. Le hand +tracking semble être un déclencheur fort, mais il arrive au moment où plusieurs +ressources GPU et systèmes runtime se réveillent ensemble. + +## Pourquoi c'est bloquant + +Ce bug bloque la feature principale du projet : + +- le repair game dépend du hand tracking pour valider certaines actions ; +- les interactions main sont nécessaires pour tester les objets grabbables ; +- un context lost casse la continuité du gameplay ; +- le joueur peut être replacé au spawn après reconstruction ; +- le pointer lock peut être perdu ; +- les logs deviennent difficiles à lire parce que le jeu tente de restaurer la + scène en boucle ; +- le comportement n'est pas fiable pour une démo ou un déploiement. + +Tant que ce problème n'est pas stable, on ne peut pas valider correctement : + +- la mission e-bike ; +- la mission pylône ; +- la mission ferme ; +- les interactions main ; +- le switch browser/backend ; +- le comportement en build de production. + +## Hypothèses principales + +### 1. Pression GPU au lancement du hand tracking + +MediaPipe browser peut créer ses propres ressources GPU. Si Three.js charge +déjà beaucoup de géométries, textures, ombres et modèles, l'ajout du hand +tracking peut faire passer le navigateur au-dessus d'une limite GPU. + +Le stash contient une tentative de mitigation en forçant MediaPipe browser et le +backend à utiliser le CPU. + +### 2. Activation trop brusque du runtime mains + +Les logs montrent des transitions rapides : + +```txt +Browser JS runtime starting +Runtime source selected +Runtime snapshot changed +Browser JS runtime stopped +Browser JS runtime starting +``` + +Ce type de start/stop rapide peut provoquer : + +- création webcam ; +- création MediaPipe ; +- montage des gants ; +- update du state React ; +- re-render du monde ; +- stress GPU au même moment. + +### 3. Les gants 3D sont montés trop tôt + +Si les gants de hand tracking sont montés avant d'avoir de vraies mains +détectées, le jeu charge et prépare des modèles GPU sans utilité immédiate. + +Le stash contient une tentative pour ne rendre les gants que lorsqu'une main +existe réellement dans le snapshot. + +### 4. Re-upload textures / GLTF trop agressif + +`src/utils/three/optimizeGLTFScene.ts` modifie des textures GLTF. Si cette +optimisation force trop souvent `needsUpdate`, mipmaps ou anisotropy, le +navigateur peut recharger beaucoup de textures vers le GPU. + +Le stash limite cette pression en évitant de forcer les mipmaps et en abaissant +l'anisotropy. + +### 5. Permission caméra au mauvais moment + +Demander la caméra au moment exact où le joueur entre dans une interaction ou +lance le repair game ajoute un gros événement runtime au pire moment. + +Le stash contient une tentative de warmup caméra pour obtenir la permission plus +tôt et réutiliser le stream au moment où le hand tracking devient nécessaire. + +### 6. La scène Physique ajoute du bruit + +La scène Physique est une scène de test volontairement riche : + +- `Physics` Rapier ; +- `GrabbableObject` ; +- `TriggerObject` ; +- `RepairGame` ; +- `AnimatedModel` ; +- GPS preview ; +- waypoints verts ; +- player ; +- debug overlay. + +Cette richesse est normale pour une scène de test, mais elle complique +l'investigation parce qu'elle active beaucoup de systèmes à la fois. + +## Fichiers modifiés dans le stash + +Le stash `stash@{0}` contient 28 fichiers modifiés, environ `+530 / -152`. +Il ne contient pas de fichiers untracked. + +| Fichier | Rôle dans l'investigation | +| --------------------------------------------------------- | ----------------------------------------------------------------------------------------- | +| `README.md` | Note sur les commandes backend depuis la racine du repo. | +| `backend/README.md` | Documentation plus claire pour lancer le backend et réparer un `.venv` cassé. | +| `backend/hand_tracker.py` | Force le backend MediaPipe en CPU. | +| `docs/user/main-feature.md` | Ajustements de documentation utilisateur. | +| `public/sounds/dialogue/subtitles/fr/electricienne.srt` | Ajustements de sous-titres, pas central pour le context lost. | +| `public/sounds/dialogue/subtitles/fr/narrateur.srt` | Ajustements de sous-titres, pas central pour le context lost. | +| `src/components/debug/DebugPlayerModel.tsx` | Ajustements de modèle debug player. | +| `src/components/three/handTracking/HandTrackingGlove.tsx` | Retire le preload automatique des gants pour réduire la pression GPU. | +| `src/components/three/interaction/GrabbableObject.tsx` | Marque les grabbables qui nécessitent vraiment le hand tracking. | +| `src/components/three/interaction/InteractableObject.tsx` | Ajoute le flag `handTracking` aux interactables. | +| `src/data/debug/testSceneConfig.ts` | Stabilise la scène Physique : sol, GPS, hauteur des waypoints. | +| `src/data/handTrackingConfig.ts` | Ajoute délai d'activation, TTL warmup caméra, delegate CPU browser. | +| `src/data/player/playerConfig.ts` | Corrige le spawn Physique avec `PLAYER_EYE_HEIGHT`. | +| `src/hooks/debug/useSceneMode.ts` | Force `game` hors debug actif pour éviter des scènes debug en prod. | +| `src/hooks/handTracking/useBothFistsHold.ts` | Sort le hold des deux poings de `useFrame` R3F vers `requestAnimationFrame`. | +| `src/hooks/handTracking/useBrowserHandTracking.ts` | Encadre `detectForVideo`, release MediaPipe en cleanup, gère les erreurs. | +| `src/hooks/three/useTerrainHeight.ts` | Ajustements terrain, liés au snap/player. | +| `src/lib/handTracking/browserHandTracking.ts` | Force delegate CPU, garde une instance MediaPipe, ajoute `releaseBrowserHandLandmarker`. | +| `src/lib/handTracking/handTrackingSession.ts` | Ajoute warmup caméra, cache stream, timeout et consommation du stream préparé. | +| `src/managers/InteractionManager.ts` | Ajoute `handTrackingNearby` pour ne pas activer les mains sur toute interaction. | +| `src/pages/page.tsx` | Gestion WebGL context lost/restored, DPR fixe, antialias off, release MediaPipe au crash. | +| `src/providers/gameplay/HandTrackingProvider.tsx` | Ajoute activation différée, snapshot queued, warmup runtime. | +| `src/types/interaction/interaction.ts` | Ajoute `handTracking` et `handTrackingNearby` aux types interaction. | +| `src/utils/debug/Debug.ts` | Synchronise l'affichage du controller hand tracking source. | +| `src/utils/three/optimizeGLTFScene.ts` | Réduit la pression GPU des textures GLTF. | +| `src/world/World.tsx` | Ne rend les gants que si une main correspondante est détectée. | +| `src/world/debug/TestMap.tsx` | Nettoie les logs, stabilise waypoints/GPS/scène Physique. | +| `src/world/player/PlayerCamera.tsx` | Ajustements pointer lock/canvas ciblé. | + +## Fichiers actuellement modifiés dans le worktree + +Etat observé au moment de cette note : + +| Fichier | Statut | +| --------------------------------------------------------- | --------------------------------------------------------- | +| `public/models/talkie/*` | Beaucoup d'anciennes textures/fichiers `.gltf` supprimés. | +| `public/models/talkie/model.glb` | Nouveau fichier non suivi. | +| `src/components/three/handTracking/HandTrackingGlove.tsx` | Modifié. | +| `src/data/debug/testSceneConfig.ts` | Modifié. | +| `src/data/gameplay/repairMissions.ts` | Modifié. | +| `src/data/handTrackingConfig.ts` | Modifié. | +| `src/data/player/playerConfig.ts` | Modifié. | +| `src/data/world/mapLodConfig.ts` | Modifié. | +| `src/hooks/handTracking/useBrowserHandTracking.ts` | Modifié. | +| `src/hooks/handTracking/useRemoteHandTracking.ts` | Modifié. | +| `src/lib/handTracking/browserHandTracking.ts` | Modifié. | +| `src/lib/handTracking/handTrackingSession.ts` | Modifié. | +| `src/pages/page.tsx` | Modifié. | +| `src/providers/gameplay/HandTrackingProvider.tsx` | Modifié. | +| `src/utils/debug/Debug.ts` | Modifié. | +| `src/utils/three/optimizeGLTFScene.ts` | Modifié. | +| `src/world/World.tsx` | Modifié. | +| `src/world/debug/TestMap.tsx` | Modifié. | +| `src/world/player/Player.tsx` | Modifié. | +| `src/world/player/PlayerCamera.tsx` | Modifié. | +| `src/world/player/PlayerController.tsx` | Modifié. | +| `src/components/ui/RuntimeLoadingIndicator.tsx` | Nouveau fichier non suivi. | +| `src/hooks/handTracking/useHandTrackingRuntimeWarmup.ts` | Nouveau fichier non suivi. | +| `src/world/player/playerRuntimeSnapshot.ts` | Nouveau fichier non suivi. | + +Attention : les fichiers supprimés/nouveaux du talkie semblent être un sujet +séparé du context lost. Il faut les garder séparés dans les commits. + +## Fichiers directement impactés par le bug + +### Canvas et WebGL + +- `src/pages/page.tsx` +- `src/world/World.tsx` +- `src/utils/three/optimizeGLTFScene.ts` + +Ces fichiers influencent directement la charge GPU, la configuration du canvas, +les ressources GLTF et le comportement au context lost/restored. + +### Hand tracking + +- `src/providers/gameplay/HandTrackingProvider.tsx` +- `src/hooks/handTracking/useBrowserHandTracking.ts` +- `src/hooks/handTracking/useRemoteHandTracking.ts` +- `src/hooks/handTracking/useBothFistsHold.ts` +- `src/hooks/handTracking/useHandTrackingRuntimeWarmup.ts` +- `src/lib/handTracking/browserHandTracking.ts` +- `src/lib/handTracking/handTrackingSession.ts` +- `src/data/handTrackingConfig.ts` +- `src/components/three/handTracking/HandTrackingGlove.tsx` +- `backend/hand_tracker.py` + +Ces fichiers contrôlent le déclenchement, la source, la caméra, MediaPipe, le +backend et le rendu visuel des mains. + +### Interactions et repair game + +- `src/components/three/interaction/GrabbableObject.tsx` +- `src/components/three/interaction/InteractableObject.tsx` +- `src/managers/InteractionManager.ts` +- `src/types/interaction/interaction.ts` +- `src/components/three/gameplay/RepairGame.tsx` +- `src/hooks/gameplay/useRepairMissionStep.ts` +- `src/hooks/gameplay/useRepairMovementLocked.ts` + +Ces fichiers sont impactés parce que l'entrée dans une zone ou une étape repair +peut déclencher le hand tracking. + +### Player et restauration après crash + +- `src/world/player/Player.tsx` +- `src/world/player/PlayerCamera.tsx` +- `src/world/player/PlayerController.tsx` +- `src/world/player/playerRuntimeSnapshot.ts` +- `src/data/player/playerConfig.ts` + +Ces fichiers influencent le spawn, la caméra, le pointer lock, et la possibilité +de récupérer la dernière position après un context lost. + +### Scène Physique / debug + +- `src/world/debug/TestMap.tsx` +- `src/data/debug/testSceneConfig.ts` +- `src/components/debug/DebugPlayerModel.tsx` +- `src/hooks/debug/useSceneMode.ts` +- `src/utils/debug/Debug.ts` + +Ces fichiers ne sont pas forcément la cause racine, mais ils créent une scène de +stress utile pour reproduire le bug. + +## Ce que le stash essayait de corriger + +Le stash essaye de réduire le risque de context lost avec plusieurs leviers : + +1. passer MediaPipe browser/backend en CPU ; +2. libérer MediaPipe quand le runtime s'arrête ou quand WebGL saute ; +3. éviter de monter les gants sans mains détectées ; +4. retarder l'activation du hand tracking pour éviter les start/stop violents ; +5. demander la caméra plus tôt et réutiliser le stream ; +6. réduire la charge GPU du canvas avec DPR fixe et antialias off ; +7. limiter les re-uploads de textures GLTF ; +8. distinguer les interactions qui demandent vraiment le hand tracking ; +9. restaurer WebGL avec une limite pour éviter les boucles infinies ; +10. conserver la position du joueur après restauration. + +## Ce qui reste à prouver + +Il faut encore isoler le déclencheur exact : + +- crash avec hand tracking désactivé complètement ; +- crash avec source browser JS seulement ; +- crash avec source backend seulement ; +- crash avec gants 3D désactivés ; +- crash avec MediaPipe CPU ; +- crash avec `AnimatedModel` de TestMap désactivé ; +- crash avec GPS preview/waypoints désactivés ; +- crash avec shadows/antialias/DPR réduits ; +- crash en scène game réelle, pas seulement scène Physique. + +## Plan d'investigation recommandé + +1. Stabiliser le worktree et ne pas mélanger assets talkie, LOD, docs backend et + context lost dans le même commit. +2. Garder le stash tant que le fix final n'est pas validé. +3. Créer un commit ou patch isolé pour les logs context lost seulement. +4. Ajouter un switch debug qui permet de couper séparément : + - hand tracking runtime ; + - gants 3D ; + - MediaPipe browser ; + - backend ; + - GPS preview ; + - AnimatedModel de TestMap. +5. Reproduire le bug avec une matrice claire. +6. Garder les changements qui diminuent réellement les context lost. +7. Supprimer les logs temporaires une fois le diagnostic terminé. + +## Recommandation Git + +Ne pas supprimer le stash maintenant. + +Il contient du travail réel sur le context lost. Même s'il n'est pas parfait, il +sert de trace d'investigation et contient des morceaux utiles. + +Avant de le supprimer, sauvegarder le patch : + +```bash +git stash show -p stash@{0} > context-lost-stash.patch +``` + +Ensuite seulement, si tout a été repris dans des commits propres : + +```bash +git stash drop stash@{0} +``` + +## Commits logiques proposés + +Séparer en plusieurs commits pour éviter un gros commit illisible : + +1. `docs: document webgl context lost investigation` +2. `fix: reduce handtracking gpu pressure` +3. `fix: delay handtracking activation` +4. `fix: preserve player state after webgl restore` +5. `fix: stabilize physics debug scene` +6. `docs: clarify backend handtracking setup` From f708c4cd2edd8b28684baf211b9fa15514320f1c Mon Sep 17 00:00:00 2001 From: Tom Boullay Date: Tue, 2 Jun 2026 16:33:39 +0200 Subject: [PATCH 13/18] chore(debug): tune physics test scene and drop noisy waypoint logs Lower grabbable spawn, expose GPS preview position/rotation as constants, fix physics spawn to use PLAYER_EYE_HEIGHT, and silence the console.log noise around waypoint loading in TestMap. Co-Authored-By: Claude Opus 4.7 (1M context) --- src/data/debug/testSceneConfig.ts | 10 +++++++++- src/data/player/playerConfig.ts | 6 +++++- src/data/world/mapLodConfig.ts | 1 - src/world/debug/TestMap.tsx | 25 ++++++++++--------------- 4 files changed, 24 insertions(+), 18 deletions(-) diff --git a/src/data/debug/testSceneConfig.ts b/src/data/debug/testSceneConfig.ts index 2d7f49b..617fb3c 100644 --- a/src/data/debug/testSceneConfig.ts +++ b/src/data/debug/testSceneConfig.ts @@ -1,13 +1,15 @@ import type { Vector3Tuple } from "@/types/three/three"; import type { RepairMissionId } from "@/types/gameplay/repairMission"; +const DEG_TO_RAD = Math.PI / 180; + export const TEST_SCENE_FLOOR_POSITION: Vector3Tuple = [0, -0.5, 0]; export const TEST_SCENE_FLOOR_SIZE: Vector3Tuple = [200, 1, 200]; export const TEST_SCENE_FLOOR_COLLIDER_HALF_EXTENTS: Vector3Tuple = [ 100, 0.5, 100, ]; -export const TEST_SCENE_GRABBABLE_POSITION: Vector3Tuple = [0, 1, -3]; +export const TEST_SCENE_GRABBABLE_POSITION: Vector3Tuple = [0, 0.25, -3]; export const TEST_SCENE_GRABBABLE_BOX_SIZE: Vector3Tuple = [0.5, 0.5, 0.5]; export const TEST_SCENE_GRABBABLE_COLOR = "#e07b39"; export const TEST_SCENE_GRABBABLE_ROUGHNESS = 0.6; @@ -23,6 +25,12 @@ export const TEST_SCENE_TRIGGER_METALNESS = 0.5; export const TEST_SCENE_REPAIR_ZONE_MARKER_RADIUS = 1.65; export const TEST_SCENE_REPAIR_ZONE_MARKER_TUBE_RADIUS = 0.045; +export const TEST_SCENE_GPS_PREVIEW_POSITION: Vector3Tuple = [0, 5, -4.8]; +export const TEST_SCENE_GPS_PREVIEW_ROTATION: Vector3Tuple = [ + -33 * DEG_TO_RAD, + 0, + 0, +]; export const GAME_REPAIR_ZONES = [ { diff --git a/src/data/player/playerConfig.ts b/src/data/player/playerConfig.ts index 700d6d5..f2c556d 100644 --- a/src/data/player/playerConfig.ts +++ b/src/data/player/playerConfig.ts @@ -20,4 +20,8 @@ export const PLAYER_SPAWN_POSITION_GAME: Vector3Tuple = [ LA_FABRIK_PLAYER_SPAWN[1], LA_FABRIK_PLAYER_SPAWN[2] - 1, ]; -export const PLAYER_SPAWN_POSITION_PHYSICS: Vector3Tuple = [0, 3, 0]; +export const PLAYER_SPAWN_POSITION_PHYSICS: Vector3Tuple = [ + 0, + PLAYER_EYE_HEIGHT, + 0, +]; diff --git a/src/data/world/mapLodConfig.ts b/src/data/world/mapLodConfig.ts index b1e1b71..91ff213 100644 --- a/src/data/world/mapLodConfig.ts +++ b/src/data/world/mapLodConfig.ts @@ -24,7 +24,6 @@ export function getMapLodModelPath(modelName: string): string | null { ); } - export const MAP_LOD_SCALE_MULTIPLIERS = { sapin: 0.35, buisson: 0.7, diff --git a/src/world/debug/TestMap.tsx b/src/world/debug/TestMap.tsx index 0056b21..e1d74b9 100644 --- a/src/world/debug/TestMap.tsx +++ b/src/world/debug/TestMap.tsx @@ -17,6 +17,8 @@ import { TEST_SCENE_GRABBABLE_METALNESS, TEST_SCENE_GRABBABLE_POSITION, TEST_SCENE_GRABBABLE_ROUGHNESS, + TEST_SCENE_GPS_PREVIEW_POSITION, + TEST_SCENE_GPS_PREVIEW_ROTATION, GAME_REPAIR_ZONES, TEST_SCENE_REPAIR_ZONE_MARKER_RADIUS, TEST_SCENE_REPAIR_ZONE_MARKER_TUBE_RADIUS, @@ -110,24 +112,17 @@ export function TestMap({ onOctreeReady }: TestMapProps): React.JSX.Element { try { const parsed = JSON.parse(saved); if (Array.isArray(parsed) && parsed.length > 0) { - console.log( - `[TestMap] ${parsed.length} waypoints chargés depuis localStorage.`, - ); // Schedule state update to avoid synchronous setState in effect queueMicrotask(() => { if (!cancelled) setWaypoints(parsed); }); return; } - } catch (e) { - console.error("Failed to parse local storage waypoints", e); + } catch { + // Ignore parse errors — fall through to fetch fallback } } - // 2. Try public/roadNetwork.json - console.log( - "[TestMap] Tentative de chargement depuis /roadNetwork.json...", - ); fetch("/roadNetwork.json") .then((res) => { if (res.ok) return res.json(); @@ -136,14 +131,11 @@ export function TestMap({ onOctreeReady }: TestMapProps): React.JSX.Element { .then((data) => { if (cancelled) return; if (Array.isArray(data)) { - console.log( - `[TestMap] ${data.length} waypoints chargés depuis /roadNetwork.json.`, - ); setWaypoints(data); } }) - .catch((err) => { - console.log("[TestMap] Aucun point d'A* trouvé par défaut.", err); + .catch(() => { + // No A* waypoints available — silent fallback }); return () => { @@ -253,7 +245,10 @@ export function TestMap({ onOctreeReady }: TestMapProps): React.JSX.Element { {/* Dynamic Futuristic 3D GPS Dashboard Preview */} - + {/* Futuristic glowing screen frame (commented out to show true 3D transparency!) */} {/* From 72cb9f5be6fac0d276b551c3bf95a9d8ff214d2c Mon Sep 17 00:00:00 2001 From: Tom Boullay Date: Tue, 2 Jun 2026 16:33:42 +0200 Subject: [PATCH 14/18] update: ebike model --- public/models/ebike/Cable 1_occlusionRoughnessMetallic.png | 3 --- public/models/ebike/Cable2_occlusionRoughnessMetallic.png | 3 --- ...{Carroserie_baseColor.png => Carroserie_baseColor.png.png} | 0 .../{Carroserie_normal.png => Carroserie_normal.png.png} | 0 public/models/ebike/Carroserie_occlusionRoughnessMetallic.png | 3 --- public/models/ebike/Ferail_baseColor.png | 3 --- public/models/ebike/Ferail_baseColor.png.png | 3 +++ public/models/ebike/Ferail_normal.png | 4 ++-- public/models/ebike/Ferail_occlusionRoughnessMetallic.png | 3 --- public/models/ebike/Reservoir_baseColor.png | 3 --- public/models/ebike/Reservoir_baseColor.png.png | 3 +++ public/models/ebike/Reservoir_normal.png | 3 --- public/models/ebike/Reservoir_normal.png.png | 3 +++ public/models/ebike/Reservoir_occlusionRoughnessMetallic.png | 3 --- .../models/ebike/{Sac_baseColor.png => Sac_baseColor.png.png} | 0 public/models/ebike/{Sac_normal.png => Sac_normal.png.png} | 0 public/models/ebike/Sac_occlusionRoughnessMetallic.png | 3 --- .../ebike/{Siege_baseColor.png => Siege_baseColor.png.png} | 0 .../models/ebike/{Siege_normal.png => Siege_normal.png.png} | 0 public/models/ebike/Siege_occlusionRoughnessMetallic.png | 3 --- public/models/ebike/color.png | 3 --- public/models/ebike/ebike.bin | 3 --- public/models/ebike/model.bin | 4 ++-- public/models/ebike/model.gltf | 4 ++-- public/models/ebike/normal.png | 3 --- public/models/ebike/panneau_baseColor.png | 3 +++ public/models/ebike/panneau_normal.png | 3 +++ public/models/ebike/phare_baseColor.png | 3 --- public/models/ebike/phare_baseColor.png.png | 3 +++ public/models/ebike/phare_normal.png | 3 --- public/models/ebike/phare_normal.png.png | 3 +++ public/models/ebike/phare_occlusionRoughnessMetallic.png | 3 --- .../ebike/{pneu_baseColor.png => pneu_baseColor.png.png} | 0 public/models/ebike/{pneu_normal.png => pneu_normal.png.png} | 0 public/models/ebike/pneu_occlusionRoughnessMetallic.png | 3 --- ...idisseur_baseColor.png => refroidisseur_baseColor.png.png} | 0 ...{refroidisseur_normal.png => refroidisseur_normal.png.png} | 0 .../models/ebike/refroidisseur_occlusionRoughnessMetallic.png | 3 --- .../ebike/{resort_baseColor.png => resort_baseColor.png.png} | 0 .../models/ebike/{resort_normal.png => resort_normal.png.png} | 0 public/models/ebike/resort_occlusionRoughnessMetallic.png | 3 --- 41 files changed, 27 insertions(+), 63 deletions(-) delete mode 100644 public/models/ebike/Cable 1_occlusionRoughnessMetallic.png delete mode 100644 public/models/ebike/Cable2_occlusionRoughnessMetallic.png rename public/models/ebike/{Carroserie_baseColor.png => Carroserie_baseColor.png.png} (100%) rename public/models/ebike/{Carroserie_normal.png => Carroserie_normal.png.png} (100%) delete mode 100644 public/models/ebike/Carroserie_occlusionRoughnessMetallic.png delete mode 100644 public/models/ebike/Ferail_baseColor.png create mode 100644 public/models/ebike/Ferail_baseColor.png.png delete mode 100644 public/models/ebike/Ferail_occlusionRoughnessMetallic.png delete mode 100644 public/models/ebike/Reservoir_baseColor.png create mode 100644 public/models/ebike/Reservoir_baseColor.png.png delete mode 100644 public/models/ebike/Reservoir_normal.png create mode 100644 public/models/ebike/Reservoir_normal.png.png delete mode 100644 public/models/ebike/Reservoir_occlusionRoughnessMetallic.png rename public/models/ebike/{Sac_baseColor.png => Sac_baseColor.png.png} (100%) rename public/models/ebike/{Sac_normal.png => Sac_normal.png.png} (100%) delete mode 100644 public/models/ebike/Sac_occlusionRoughnessMetallic.png rename public/models/ebike/{Siege_baseColor.png => Siege_baseColor.png.png} (100%) rename public/models/ebike/{Siege_normal.png => Siege_normal.png.png} (100%) delete mode 100644 public/models/ebike/Siege_occlusionRoughnessMetallic.png delete mode 100644 public/models/ebike/color.png delete mode 100644 public/models/ebike/ebike.bin delete mode 100644 public/models/ebike/normal.png create mode 100644 public/models/ebike/panneau_baseColor.png create mode 100644 public/models/ebike/panneau_normal.png delete mode 100644 public/models/ebike/phare_baseColor.png create mode 100644 public/models/ebike/phare_baseColor.png.png delete mode 100644 public/models/ebike/phare_normal.png create mode 100644 public/models/ebike/phare_normal.png.png delete mode 100644 public/models/ebike/phare_occlusionRoughnessMetallic.png rename public/models/ebike/{pneu_baseColor.png => pneu_baseColor.png.png} (100%) rename public/models/ebike/{pneu_normal.png => pneu_normal.png.png} (100%) delete mode 100644 public/models/ebike/pneu_occlusionRoughnessMetallic.png rename public/models/ebike/{refroidisseur_baseColor.png => refroidisseur_baseColor.png.png} (100%) rename public/models/ebike/{refroidisseur_normal.png => refroidisseur_normal.png.png} (100%) delete mode 100644 public/models/ebike/refroidisseur_occlusionRoughnessMetallic.png rename public/models/ebike/{resort_baseColor.png => resort_baseColor.png.png} (100%) rename public/models/ebike/{resort_normal.png => resort_normal.png.png} (100%) delete mode 100644 public/models/ebike/resort_occlusionRoughnessMetallic.png diff --git a/public/models/ebike/Cable 1_occlusionRoughnessMetallic.png b/public/models/ebike/Cable 1_occlusionRoughnessMetallic.png deleted file mode 100644 index 8747c04..0000000 --- a/public/models/ebike/Cable 1_occlusionRoughnessMetallic.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:77cf06f5e7e08653f290c353cd4c37ff91c118602436be1256280e13e52cd173 -size 353293 diff --git a/public/models/ebike/Cable2_occlusionRoughnessMetallic.png b/public/models/ebike/Cable2_occlusionRoughnessMetallic.png deleted file mode 100644 index f0c1d5f..0000000 --- a/public/models/ebike/Cable2_occlusionRoughnessMetallic.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:937bba888a3f821daba2aec3653bbcc3f393234d51cd604dd9341d6320c92cb2 -size 355460 diff --git a/public/models/ebike/Carroserie_baseColor.png b/public/models/ebike/Carroserie_baseColor.png.png similarity index 100% rename from public/models/ebike/Carroserie_baseColor.png rename to public/models/ebike/Carroserie_baseColor.png.png diff --git a/public/models/ebike/Carroserie_normal.png b/public/models/ebike/Carroserie_normal.png.png similarity index 100% rename from public/models/ebike/Carroserie_normal.png rename to public/models/ebike/Carroserie_normal.png.png diff --git a/public/models/ebike/Carroserie_occlusionRoughnessMetallic.png b/public/models/ebike/Carroserie_occlusionRoughnessMetallic.png deleted file mode 100644 index 05ff7d9..0000000 --- a/public/models/ebike/Carroserie_occlusionRoughnessMetallic.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f6abf72de5fcfce9738ac6f49bc3352160b11f1af7680ae5da84266d5fb4aaa2 -size 261088 diff --git a/public/models/ebike/Ferail_baseColor.png b/public/models/ebike/Ferail_baseColor.png deleted file mode 100644 index b2e286e..0000000 --- a/public/models/ebike/Ferail_baseColor.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:72fc78eb3273eb8ae80c523319de0e3e69924a5f7ec15d88a6330083ccfffd8f -size 276020 diff --git a/public/models/ebike/Ferail_baseColor.png.png b/public/models/ebike/Ferail_baseColor.png.png new file mode 100644 index 0000000..27b326e --- /dev/null +++ b/public/models/ebike/Ferail_baseColor.png.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5efb9b4a437da7efde7808c52faba59d3b597ad8d455f063b929160a5ed7bf95 +size 18255 diff --git a/public/models/ebike/Ferail_normal.png b/public/models/ebike/Ferail_normal.png index 2f2b172..e602afa 100644 --- a/public/models/ebike/Ferail_normal.png +++ b/public/models/ebike/Ferail_normal.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:efb159756d206de812e300c1bc40df771b5cd2606c4d856682af5873584b7761 -size 2554815 +oid sha256:562f2ae8de216488d15f04473102bd27fda33fe83bcb53f849d03de5a773178d +size 2554401 diff --git a/public/models/ebike/Ferail_occlusionRoughnessMetallic.png b/public/models/ebike/Ferail_occlusionRoughnessMetallic.png deleted file mode 100644 index 52689a4..0000000 --- a/public/models/ebike/Ferail_occlusionRoughnessMetallic.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:25a3b05c805e06b38fd94bb27eff7c8ae72ce4bf14fbdb15e59366ac2e1f45f1 -size 349895 diff --git a/public/models/ebike/Reservoir_baseColor.png b/public/models/ebike/Reservoir_baseColor.png deleted file mode 100644 index 7ec7dac..0000000 --- a/public/models/ebike/Reservoir_baseColor.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:81cda14600b32f5ab26e00d9db40924010e1beb1939c5eed0ce6386e358d3b1d -size 53203 diff --git a/public/models/ebike/Reservoir_baseColor.png.png b/public/models/ebike/Reservoir_baseColor.png.png new file mode 100644 index 0000000..8c57503 --- /dev/null +++ b/public/models/ebike/Reservoir_baseColor.png.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9d927f0691f4e735916d778d036f8a1da4c74897eb4b67586ed38d42a066e7be +size 105520 diff --git a/public/models/ebike/Reservoir_normal.png b/public/models/ebike/Reservoir_normal.png deleted file mode 100644 index 1bfb989..0000000 --- a/public/models/ebike/Reservoir_normal.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4702cd610157f13b0bf2c4bb04dd40489e80719e90fc7cb57f1c30f6a4cc2658 -size 2272453 diff --git a/public/models/ebike/Reservoir_normal.png.png b/public/models/ebike/Reservoir_normal.png.png new file mode 100644 index 0000000..8beb150 --- /dev/null +++ b/public/models/ebike/Reservoir_normal.png.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:afa5b7b7bca7f3b1f935aaa90f9732c3e27c77ef7f6b3f149e0d6dbd97e234a8 +size 2856433 diff --git a/public/models/ebike/Reservoir_occlusionRoughnessMetallic.png b/public/models/ebike/Reservoir_occlusionRoughnessMetallic.png deleted file mode 100644 index b46ab8d..0000000 --- a/public/models/ebike/Reservoir_occlusionRoughnessMetallic.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7aec1cadb1ffd038a54e648b875609458725c1ef652959e252afa0f03a3f7f1e -size 16902 diff --git a/public/models/ebike/Sac_baseColor.png b/public/models/ebike/Sac_baseColor.png.png similarity index 100% rename from public/models/ebike/Sac_baseColor.png rename to public/models/ebike/Sac_baseColor.png.png diff --git a/public/models/ebike/Sac_normal.png b/public/models/ebike/Sac_normal.png.png similarity index 100% rename from public/models/ebike/Sac_normal.png rename to public/models/ebike/Sac_normal.png.png diff --git a/public/models/ebike/Sac_occlusionRoughnessMetallic.png b/public/models/ebike/Sac_occlusionRoughnessMetallic.png deleted file mode 100644 index 45e9c20..0000000 --- a/public/models/ebike/Sac_occlusionRoughnessMetallic.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c539f92a27e495d88074dc87f3cd463d66b96b7de73188957b5f6d361b1e7b95 -size 105767 diff --git a/public/models/ebike/Siege_baseColor.png b/public/models/ebike/Siege_baseColor.png.png similarity index 100% rename from public/models/ebike/Siege_baseColor.png rename to public/models/ebike/Siege_baseColor.png.png diff --git a/public/models/ebike/Siege_normal.png b/public/models/ebike/Siege_normal.png.png similarity index 100% rename from public/models/ebike/Siege_normal.png rename to public/models/ebike/Siege_normal.png.png diff --git a/public/models/ebike/Siege_occlusionRoughnessMetallic.png b/public/models/ebike/Siege_occlusionRoughnessMetallic.png deleted file mode 100644 index c6b768c..0000000 --- a/public/models/ebike/Siege_occlusionRoughnessMetallic.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0a11a02281f5443ef44ec0ccb93d4ab1b4972e16e673741834acda5a3b60390c -size 308036 diff --git a/public/models/ebike/color.png b/public/models/ebike/color.png deleted file mode 100644 index 45d6540..0000000 --- a/public/models/ebike/color.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0f427aa9def171588521008b42339f804d9d7e1c9865b92ac35834ac2205d441 -size 409273 diff --git a/public/models/ebike/ebike.bin b/public/models/ebike/ebike.bin deleted file mode 100644 index 30c7a57..0000000 --- a/public/models/ebike/ebike.bin +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ed6d61d76b9acb99c87b45b497dcd0214e2f0c0eb2ab7390e3a14d0debbe26b4 -size 3865056 diff --git a/public/models/ebike/model.bin b/public/models/ebike/model.bin index 4829829..20b2708 100644 --- a/public/models/ebike/model.bin +++ b/public/models/ebike/model.bin @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:7f476c9e9d1fa2437f83edf54d7702889b556520257fc0b5c3bec99aefdd5541 -size 3086528 +oid sha256:72f010b6a7fba861545141e46e154637d4bedf8625cd451d5a295526db1ceae2 +size 2134916 diff --git a/public/models/ebike/model.gltf b/public/models/ebike/model.gltf index 178b740..07eb62d 100644 --- a/public/models/ebike/model.gltf +++ b/public/models/ebike/model.gltf @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:73e93ccfb92f831905c5573f5b55f92592bf3dfffde876a678ac414416b20aa0 -size 2592 +oid sha256:3825a12bcf528d1801c904b098f536ee123af24de64fc92e55969f687da6e5de +size 103305 diff --git a/public/models/ebike/normal.png b/public/models/ebike/normal.png deleted file mode 100644 index a091c9e..0000000 --- a/public/models/ebike/normal.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e1dda1b74dd9e72a248f8ff1c9e9442801a7399f913a2e239b2edce44422916e -size 695202 diff --git a/public/models/ebike/panneau_baseColor.png b/public/models/ebike/panneau_baseColor.png new file mode 100644 index 0000000..866ba7f --- /dev/null +++ b/public/models/ebike/panneau_baseColor.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:499e858e82bb910f251386f57bb751743b0a557a70383a68e5b534a8e8e30854 +size 1138223 diff --git a/public/models/ebike/panneau_normal.png b/public/models/ebike/panneau_normal.png new file mode 100644 index 0000000..f513b6d --- /dev/null +++ b/public/models/ebike/panneau_normal.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1e7db9b77efbfb0c62ec4924b2522babb191ec4a5e51687dc4de8971f044a8f5 +size 2487930 diff --git a/public/models/ebike/phare_baseColor.png b/public/models/ebike/phare_baseColor.png deleted file mode 100644 index 05209c8..0000000 --- a/public/models/ebike/phare_baseColor.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:91c23d60933bb685bbb96bdae47672f5c7ec1a62552a56d0eeee1b22448cb66d -size 16905 diff --git a/public/models/ebike/phare_baseColor.png.png b/public/models/ebike/phare_baseColor.png.png new file mode 100644 index 0000000..3ce9bad --- /dev/null +++ b/public/models/ebike/phare_baseColor.png.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:09100598a454aea0cf44fcdbb4badf34ba047ca7b727df06fe54306975395837 +size 250457 diff --git a/public/models/ebike/phare_normal.png b/public/models/ebike/phare_normal.png deleted file mode 100644 index 7919b63..0000000 --- a/public/models/ebike/phare_normal.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4a4a1e9491ca5d182d658a29095d24616f7927b8084a68733f5e2eca638b0e7f -size 2905767 diff --git a/public/models/ebike/phare_normal.png.png b/public/models/ebike/phare_normal.png.png new file mode 100644 index 0000000..d8a9bef --- /dev/null +++ b/public/models/ebike/phare_normal.png.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:43e4e66f267dc71ccc7ed1d2c9f812c4aea0950e2044c537d87ecc8ecf0bf46c +size 2902634 diff --git a/public/models/ebike/phare_occlusionRoughnessMetallic.png b/public/models/ebike/phare_occlusionRoughnessMetallic.png deleted file mode 100644 index b0edb22..0000000 --- a/public/models/ebike/phare_occlusionRoughnessMetallic.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:808064a2e6581764a06ead7add5c07bf3d3bd33f3fefb9d76dfe96b8fd3ec3a3 -size 76759 diff --git a/public/models/ebike/pneu_baseColor.png b/public/models/ebike/pneu_baseColor.png.png similarity index 100% rename from public/models/ebike/pneu_baseColor.png rename to public/models/ebike/pneu_baseColor.png.png diff --git a/public/models/ebike/pneu_normal.png b/public/models/ebike/pneu_normal.png.png similarity index 100% rename from public/models/ebike/pneu_normal.png rename to public/models/ebike/pneu_normal.png.png diff --git a/public/models/ebike/pneu_occlusionRoughnessMetallic.png b/public/models/ebike/pneu_occlusionRoughnessMetallic.png deleted file mode 100644 index 1c9776d..0000000 --- a/public/models/ebike/pneu_occlusionRoughnessMetallic.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e148f1d006dbbc26e4e2d846b359c6099a49ceec3fca57373293aad70709257e -size 175094 diff --git a/public/models/ebike/refroidisseur_baseColor.png b/public/models/ebike/refroidisseur_baseColor.png.png similarity index 100% rename from public/models/ebike/refroidisseur_baseColor.png rename to public/models/ebike/refroidisseur_baseColor.png.png diff --git a/public/models/ebike/refroidisseur_normal.png b/public/models/ebike/refroidisseur_normal.png.png similarity index 100% rename from public/models/ebike/refroidisseur_normal.png rename to public/models/ebike/refroidisseur_normal.png.png diff --git a/public/models/ebike/refroidisseur_occlusionRoughnessMetallic.png b/public/models/ebike/refroidisseur_occlusionRoughnessMetallic.png deleted file mode 100644 index 7472735..0000000 --- a/public/models/ebike/refroidisseur_occlusionRoughnessMetallic.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:db6b826f7944bebcd541739518eb6f9c4b4fbc2039666f7e09f67c8249e4f42f -size 392559 diff --git a/public/models/ebike/resort_baseColor.png b/public/models/ebike/resort_baseColor.png.png similarity index 100% rename from public/models/ebike/resort_baseColor.png rename to public/models/ebike/resort_baseColor.png.png diff --git a/public/models/ebike/resort_normal.png b/public/models/ebike/resort_normal.png.png similarity index 100% rename from public/models/ebike/resort_normal.png rename to public/models/ebike/resort_normal.png.png diff --git a/public/models/ebike/resort_occlusionRoughnessMetallic.png b/public/models/ebike/resort_occlusionRoughnessMetallic.png deleted file mode 100644 index 106d8d6..0000000 --- a/public/models/ebike/resort_occlusionRoughnessMetallic.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1a1420af59e0ebc0d2707ca3e5148f4bb621fa73daabff45b6ed723f766836e9 -size 100634 From 3fe5b32de2ecb0d152d2aa66cd795397084faf56 Mon Sep 17 00:00:00 2001 From: Tom Boullay Date: Tue, 2 Jun 2026 16:33:54 +0200 Subject: [PATCH 15/18] fix(player): scope pointer lock and ground snap to game scene PointerLockControls now targets #game-canvas and respects the settings menu, and document.exitPointerLock() only runs when a pointer lock is actually active. The terrain ground snap in PlayerController is gated on sceneMode === "game" so it doesn't fight the physics test scene's flat floor. Co-Authored-By: Claude Opus 4.7 (1M context) --- src/world/player/PlayerCamera.tsx | 15 ++++++++++++-- src/world/player/PlayerController.tsx | 28 +++++++++++++++------------ 2 files changed, 29 insertions(+), 14 deletions(-) diff --git a/src/world/player/PlayerCamera.tsx b/src/world/player/PlayerCamera.tsx index 3a120a2..ca60af0 100644 --- a/src/world/player/PlayerCamera.tsx +++ b/src/world/player/PlayerCamera.tsx @@ -1,18 +1,29 @@ import { useEffect } from "react"; import { useThree } from "@react-three/fiber"; import { PointerLockControls } from "@react-three/drei"; +import { useSettingsStore } from "@/managers/stores/useSettingsStore"; import { setGlobalCamera } from "@/world/GameCinematics"; export function PlayerCamera(): React.JSX.Element { const camera = useThree((state) => state.camera); + const isSettingsMenuOpen = useSettingsStore( + (state) => state.isSettingsMenuOpen, + ); useEffect(() => { setGlobalCamera(camera); return () => { setGlobalCamera(null); - document.exitPointerLock(); + if (document.pointerLockElement) { + document.exitPointerLock(); + } }; }, [camera]); - return ; + return ( + + ); } diff --git a/src/world/player/PlayerController.tsx b/src/world/player/PlayerController.tsx index 563b25f..8b27a1a 100644 --- a/src/world/player/PlayerController.tsx +++ b/src/world/player/PlayerController.tsx @@ -34,6 +34,7 @@ import { EBIKE_CAMERA_TRANSFORM, EBIKE_DECELERATION_DURATION_MS, } from "@/data/ebike/ebikeConfig"; +import { useSceneMode } from "@/hooks/debug/useSceneMode"; /** Global window properties used for ebike communication */ interface EbikeGlobalState { @@ -152,6 +153,7 @@ export function PlayerController({ spawnPosition, }: PlayerControllerProps): null { const camera = useThree((state) => state.camera); + const sceneMode = useSceneMode(); const movementLocked = useRepairMovementLocked(); const terrainHeight = useTerrainHeightSampler(); const movementLockedRef = useRef(movementLocked); @@ -483,19 +485,21 @@ export function PlayerController({ } } - const groundHeight = terrainHeight.getHeight( - capsule.current.end.x, - capsule.current.end.z, - ); - if (groundHeight !== null && velocity.current.y <= 0) { - const groundOffset = getCapsuleFootY(capsule.current) - groundHeight; + if (sceneMode === "game") { + const groundHeight = terrainHeight.getHeight( + capsule.current.end.x, + capsule.current.end.z, + ); + if (groundHeight !== null && velocity.current.y <= 0) { + const groundOffset = getCapsuleFootY(capsule.current) - groundHeight; - if (groundOffset <= PLAYER_GROUND_SNAP_DISTANCE) { - capsule.current.translate( - _collisionCorrection.set(0, -groundOffset, 0), - ); - velocity.current.y = 0; - onFloor.current = true; + if (groundOffset <= PLAYER_GROUND_SNAP_DISTANCE) { + capsule.current.translate( + _collisionCorrection.set(0, -groundOffset, 0), + ); + velocity.current.y = 0; + onFloor.current = true; + } } } From 864e075b4289c80beb2a271b9d2bbd4907c7b0f5 Mon Sep 17 00:00:00 2001 From: Tom Boullay Date: Tue, 2 Jun 2026 16:34:05 +0200 Subject: [PATCH 16/18] chore(debug): keep hand tracking source controller display in sync Store the lil-gui Source controller so setHandTrackingSource() from the settings menu can refresh its display, and log the transition for traceability. Co-Authored-By: Claude Opus 4.7 (1M context) --- src/utils/debug/Debug.ts | 35 +++++++++++++++++++++++++---------- 1 file changed, 25 insertions(+), 10 deletions(-) diff --git a/src/utils/debug/Debug.ts b/src/utils/debug/Debug.ts index 7c9606b..24df6fe 100644 --- a/src/utils/debug/Debug.ts +++ b/src/utils/debug/Debug.ts @@ -1,9 +1,11 @@ import GUI from "lil-gui"; +import type { Controller } from "lil-gui"; import type { CameraMode, SceneMode } from "@/types/debug/debug"; import type { HandTrackingSource } from "@/types/handTracking/handTracking"; import { FOG_CONFIG } from "@/data/world/fogConfig"; import { EventEmitter } from "@/utils/core/EventEmitter"; import { isDebugEnabled } from "@/utils/debug/isDebugEnabled"; +import { logger } from "@/utils/core/Logger"; const DEBUG_CONTROLS_STORAGE_KEY = "la-fabrik-debug-controls"; @@ -77,6 +79,7 @@ export class Debug { private readonly events = new EventEmitter(); private readonly folders = new Map(); private readonly folderRefCounts = new Map(); + private handTrackingSourceController: Controller | null = null; private readonly controls: { cameraMode: CameraMode; fogEnabled: boolean; @@ -160,16 +163,22 @@ export class Debug { this.emit(); }); - handTrackingFolder - ?.add(this.controls, "handTrackingSource", { - "Browser JS": "browser", - Backend: "backend", - }) - .name("Source") - .onChange((value: HandTrackingSource) => { - this.controls.handTrackingSource = value; - this.saveAndEmit(); - }); + this.handTrackingSourceController = + handTrackingFolder + ?.add(this.controls, "handTrackingSource", { + "Browser JS": "browser", + Backend: "backend", + }) + .name("Source") + .onChange((value: HandTrackingSource) => { + const previousSource = this.controls.handTrackingSource; + this.controls.handTrackingSource = value; + logger.info("HandTracking", "Debug source changed", { + from: previousSource, + to: value, + }); + this.saveAndEmit(); + }) ?? null; } } @@ -254,7 +263,13 @@ export class Debug { } setHandTrackingSource(value: HandTrackingSource): void { + const previousSource = this.controls.handTrackingSource; this.controls.handTrackingSource = value; + this.handTrackingSourceController?.updateDisplay(); + logger.info("HandTracking", "Settings source changed", { + from: previousSource, + to: value, + }); this.saveAndEmit(); } From d217c3376bf59278b2abc5289cd836180060838a Mon Sep 17 00:00:00 2001 From: Tom Boullay Date: Tue, 2 Jun 2026 16:48:39 +0200 Subject: [PATCH 17/18] fix(handtracking): reduce GPU pressure on WebGL context loss MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Several mitigations against the WebGL context lost that fires when hand tracking starts on a loaded scene: - Canvas: fixed DPR [1,1], antialias off, scoped id="game-canvas", context-lost handler releases MediaPipe and logs GPU memory counters - optimizeGLTFScene: cap anisotropy at 2 and stop forcing mipmaps / needsUpdate on every pass — avoids massive texture re-uploads - MediaPipe: force CPU delegate (HAND_TRACKING_BROWSER_DELEGATE), cache the landmarker instance, and expose releaseBrowserHandLandmarker - useBrowserHandTracking / useRemoteHandTracking: idempotent cleanup guarded by a cleanedUp flag, try/catch around the detect loop, and release of the landmarker on stop - World: mount HandTrackingGlove only when the matching hand is actually present in the snapshot (status connected + hands.length > 0) - HandTrackingGlove: drop the eager useGLTF.preload that was running at startup whether or not hand tracking was used Does not yet absorb the React StrictMode double-mount — that is the follow-up commit. Co-Authored-By: Claude Opus 4.7 (1M context) --- .../three/handTracking/HandTrackingGlove.tsx | 4 -- src/data/handTrackingConfig.ts | 1 + .../handTracking/useBrowserHandTracking.ts | 53 ++++++++++++++----- .../handTracking/useRemoteHandTracking.ts | 12 +++++ src/lib/handTracking/browserHandTracking.ts | 33 +++++++++++- src/pages/page.tsx | 47 ++++++++++++++-- src/utils/three/optimizeGLTFScene.ts | 15 +++--- src/world/World.tsx | 26 +++++++-- 8 files changed, 156 insertions(+), 35 deletions(-) diff --git a/src/components/three/handTracking/HandTrackingGlove.tsx b/src/components/three/handTracking/HandTrackingGlove.tsx index 37e4518..d5c8904 100644 --- a/src/components/three/handTracking/HandTrackingGlove.tsx +++ b/src/components/three/handTracking/HandTrackingGlove.tsx @@ -1,7 +1,6 @@ import type { ReactNode } from "react"; import { Component, useEffect, useMemo, useRef } from "react"; import { useFrame, useThree } from "@react-three/fiber"; -import { useGLTF } from "@react-three/drei"; import * as THREE from "three"; import { SkeletonUtils } from "three-stdlib"; import { useHandTrackingSnapshot } from "@/hooks/handTracking/useHandTrackingSnapshot"; @@ -362,6 +361,3 @@ export function HandTrackingGlove({ ); } - -useGLTF.preload(GLOVE_CONFIGS.left.modelPath); -useGLTF.preload(GLOVE_CONFIGS.right.modelPath); diff --git a/src/data/handTrackingConfig.ts b/src/data/handTrackingConfig.ts index 0b8c773..6027d12 100644 --- a/src/data/handTrackingConfig.ts +++ b/src/data/handTrackingConfig.ts @@ -8,3 +8,4 @@ export const HAND_TRACKING_BROWSER_WASM_URL = "https://cdn.jsdelivr.net/npm/@mediapipe/tasks-vision@0.10.35/wasm"; export const HAND_TRACKING_BROWSER_MODEL_URL = "https://storage.googleapis.com/mediapipe-models/hand_landmarker/hand_landmarker/float16/1/hand_landmarker.task"; +export const HAND_TRACKING_BROWSER_DELEGATE: "CPU" | "GPU" = "CPU"; diff --git a/src/hooks/handTracking/useBrowserHandTracking.ts b/src/hooks/handTracking/useBrowserHandTracking.ts index 73064fa..7310f99 100644 --- a/src/hooks/handTracking/useBrowserHandTracking.ts +++ b/src/hooks/handTracking/useBrowserHandTracking.ts @@ -7,12 +7,14 @@ import { import { convertBrowserHandResult, getBrowserHandLandmarker, + releaseBrowserHandLandmarker, } from "@/lib/handTracking/browserHandTracking"; import { INITIAL_HAND_TRACKING_SNAPSHOT, getCameraStreamWithTimeout, } from "@/lib/handTracking/handTrackingSession"; import type { HandTrackingSnapshot } from "@/types/handTracking/handTracking"; +import { logger } from "@/utils/core/Logger"; interface UseBrowserHandTrackingOptions { enabled: boolean; @@ -34,8 +36,12 @@ export function useBrowserHandTracking({ } let cancelled = false; + let cleanedUp = false; const cleanup = (): void => { + if (cleanedUp) return; + cleanedUp = true; + if (intervalRef.current !== null) { window.clearInterval(intervalRef.current); intervalRef.current = null; @@ -44,6 +50,7 @@ export function useBrowserHandTracking({ streamRef.current?.getTracks().forEach((track) => track.stop()); streamRef.current = null; videoRef.current = null; + releaseBrowserHandLandmarker(); }; const start = async (): Promise => { @@ -111,24 +118,44 @@ export function useBrowserHandTracking({ intervalRef.current = window.setInterval(() => { if (video.readyState < HTMLMediaElement.HAVE_CURRENT_DATA) return; - const result = handLandmarker.detectForVideo( - video, - performance.now(), - ); - const hands = convertBrowserHandResult(result); + try { + const result = handLandmarker.detectForVideo( + video, + performance.now(), + ); + const hands = convertBrowserHandResult(result); - setSnapshot((current) => ({ - ...current, - hands, - usageStatus: hands.some((hand) => hand.isFist) - ? "active" - : "available", - error: null, - })); + setSnapshot((current) => ({ + ...current, + hands, + usageStatus: hands.some((hand) => hand.isFist) + ? "active" + : "available", + error: null, + })); + } catch (error) { + logger.error("HandTracking", "Browser JS runtime error", { + error: error instanceof Error ? error.message : String(error), + }); + cleanup(); + setSnapshot({ + hands: [], + status: "error", + usageStatus: "inactive", + serverStatus: "Browser JS", + error: + error instanceof Error + ? error.message + : "Browser hand tracking failed", + }); + } }, 1_000 / HAND_TRACKING_TARGET_FPS); } catch (error) { if (cancelled) return; + logger.error("HandTracking", "Browser JS runtime failed", { + error: error instanceof Error ? error.message : String(error), + }); setSnapshot({ hands: [], status: "error", diff --git a/src/hooks/handTracking/useRemoteHandTracking.ts b/src/hooks/handTracking/useRemoteHandTracking.ts index f53236d..e9dc1db 100644 --- a/src/hooks/handTracking/useRemoteHandTracking.ts +++ b/src/hooks/handTracking/useRemoteHandTracking.ts @@ -17,6 +17,7 @@ import type { HandTrackingServerMessage, HandTrackingSnapshot, } from "@/types/handTracking/handTracking"; +import { logger } from "@/utils/core/Logger"; interface UseRemoteHandTrackingOptions { enabled: boolean; @@ -100,6 +101,7 @@ export function useRemoteHandTracking({ } let cancelled = false; + let cleanedUp = false; const clearResponseTimeout = (): void => { if (responseTimeoutRef.current === null) return; @@ -108,6 +110,9 @@ export function useRemoteHandTracking({ }; const cleanup = (): void => { + if (cleanedUp) return; + cleanedUp = true; + if (sendIntervalRef.current !== null) { window.clearInterval(sendIntervalRef.current); sendIntervalRef.current = null; @@ -283,6 +288,9 @@ export function useRemoteHandTracking({ }; ws.onerror = () => { markResponseReceived(); + logger.error("HandTracking", "Backend WebSocket error", { + websocketUrl, + }); setSnapshot((current) => ({ ...current, status: "error", @@ -307,6 +315,10 @@ export function useRemoteHandTracking({ ); } catch (error) { if (cancelled) return; + logger.error("HandTracking", "Backend runtime failed", { + error: error instanceof Error ? error.message : String(error), + websocketUrl, + }); setSnapshot({ hands: [], status: "error", diff --git a/src/lib/handTracking/browserHandTracking.ts b/src/lib/handTracking/browserHandTracking.ts index 06b80b4..5daf76e 100644 --- a/src/lib/handTracking/browserHandTracking.ts +++ b/src/lib/handTracking/browserHandTracking.ts @@ -1,4 +1,5 @@ import { + HAND_TRACKING_BROWSER_DELEGATE, HAND_TRACKING_BROWSER_MODEL_URL, HAND_TRACKING_BROWSER_WASM_URL, } from "@/data/handTrackingConfig"; @@ -6,6 +7,7 @@ import type { HandTrackingHand, HandTrackingLandmark, } from "@/types/handTracking/handTracking"; +import { logger } from "@/utils/core/Logger"; type HandLandmarkerModule = typeof import("@mediapipe/tasks-vision"); type HandLandmarker = Awaited< @@ -14,6 +16,7 @@ type HandLandmarker = Awaited< type HandLandmarkerResult = ReturnType; let handLandmarkerPromise: Promise | null = null; +let handLandmarkerInstance: HandLandmarker | null = null; function averageLandmarks( landmarks: HandTrackingLandmark[], @@ -78,20 +81,46 @@ export async function getBrowserHandLandmarker(): Promise { HAND_TRACKING_BROWSER_WASM_URL, ); - return HandLandmarker.createFromOptions(vision, { + const handLandmarker = await HandLandmarker.createFromOptions(vision, { baseOptions: { modelAssetPath: HAND_TRACKING_BROWSER_MODEL_URL, - delegate: "GPU", + delegate: HAND_TRACKING_BROWSER_DELEGATE, }, numHands: 2, runningMode: "VIDEO", }); + + handLandmarkerInstance = handLandmarker; + return handLandmarker; }, ); return handLandmarkerPromise; } +export function releaseBrowserHandLandmarker(): void { + const activeLandmarker = handLandmarkerInstance; + const pendingLandmarker = handLandmarkerPromise; + + handLandmarkerInstance = null; + handLandmarkerPromise = null; + + if (activeLandmarker) { + activeLandmarker.close(); + return; + } + + void pendingLandmarker + ?.then((landmarker) => { + landmarker.close(); + }) + .catch((error: unknown) => { + logger.warn("HandTracking", "Browser JS landmarker release failed", { + error: error instanceof Error ? error.message : String(error), + }); + }); +} + export function convertBrowserHandResult( result: HandLandmarkerResult, ): HandTrackingHand[] { diff --git a/src/pages/page.tsx b/src/pages/page.tsx index 996a285..d6b42a5 100644 --- a/src/pages/page.tsx +++ b/src/pages/page.tsx @@ -15,7 +15,9 @@ import { } from "@/components/ui/intro"; import { SceneLoadingOverlay } from "@/components/ui/SceneLoadingOverlay"; import { INITIAL_SCENE_LOADING_STATE } from "@/data/world/sceneLoadingConfig"; +import { useDebugStore } from "@/hooks/debug/useDebugStore"; import { useTransientLoadingIndicator } from "@/hooks/ui/useTransientLoadingIndicator"; +import { releaseBrowserHandLandmarker } from "@/lib/handTracking/browserHandTracking"; import { AudioManager } from "@/managers/AudioManager"; import { useGameStore } from "@/managers/stores/useGameStore"; import { useWorldSettingsStore } from "@/managers/stores/useWorldSettingsStore"; @@ -26,6 +28,9 @@ import { logger } from "@/utils/core/Logger"; import { World } from "@/world/World"; const LOADING_TO_VIDEO_FADE_MS = 500; +const WEBGL_CONTEXT_RESTORE_DELAY_MS = 500; +const CANVAS_DPR: [number, number] = [1, 1]; +const registeredWebglContextCanvases = new WeakSet(); export function HomePage(): React.JSX.Element | null { const navigate = useNavigate(); @@ -38,6 +43,11 @@ export function HomePage(): React.JSX.Element | null { const graphicsPreset = useWorldSettingsStore( (state) => state.graphics.preset, ); + const cameraMode = useDebugStore((debug) => debug.getCameraMode()); + const handTrackingSource = useDebugStore((debug) => + debug.getHandTrackingSource(), + ); + const sceneMode = useDebugStore((debug) => debug.getSceneMode()); const dialogMessage = useGameStore( (state) => state.missionFlow.dialogMessage, ); @@ -48,9 +58,18 @@ export function HomePage(): React.JSX.Element | null { INITIAL_SCENE_LOADING_STATE, ); const sceneReadyRef = useRef(false); + const cameraModeRef = useRef(cameraMode); + const handTrackingSourceRef = useRef(handTrackingSource); + const sceneModeRef = useRef(sceneMode); const runtimeLoadingSignal = `${graphicsPreset}:${mainState}:${ebikeStep}:${pylonStep}:${farmStep}`; const previousRuntimeLoadingSignalRef = useRef(runtimeLoadingSignal); + useEffect(() => { + cameraModeRef.current = cameraMode; + handTrackingSourceRef.current = handTrackingSource; + sceneModeRef.current = sceneMode; + }, [cameraMode, handTrackingSource, sceneMode]); + useEffect(() => { sceneReadyRef.current = sceneLoadingState.status === "ready"; }, [sceneLoadingState.status]); @@ -138,11 +157,25 @@ export function HomePage(): React.JSX.Element | null { // page stays frozen on a black canvas until the user reloads. const loseContextExt = gl.getContext().getExtension("WEBGL_lose_context"); + if (registeredWebglContextCanvases.has(canvas)) return; + registeredWebglContextCanvases.add(canvas); + const handleContextLost = (event: Event) => { event.preventDefault(); - logger.error("WebGL", "Context lost - attempting auto-restore"); + releaseBrowserHandLandmarker(); + + logger.error("WebGL", "Context lost - attempting auto-restore", { + cameraMode: cameraModeRef.current, + geometries: gl.info.memory.geometries, + handTrackingSource: handTrackingSourceRef.current, + sceneMode: sceneModeRef.current, + textures: gl.info.memory.textures, + }); // Give the GPU a moment to free resources before asking it back. - window.setTimeout(() => loseContextExt?.restoreContext(), 500); + window.setTimeout( + () => loseContextExt?.restoreContext(), + WEBGL_CONTEXT_RESTORE_DELAY_MS, + ); }; const handleContextRestored = () => { @@ -150,7 +183,11 @@ export function HomePage(): React.JSX.Element | null { gl.shadowMap.type = THREE.PCFShadowMap; gl.shadowMap.autoUpdate = true; gl.shadowMap.needsUpdate = true; - logger.info("WebGL", "Context restored"); + logger.info("WebGL", "Context restored", { + cameraMode: cameraModeRef.current, + handTrackingSource: handTrackingSourceRef.current, + sceneMode: sceneModeRef.current, + }); }; canvas.addEventListener("webglcontextlost", handleContextLost); @@ -191,10 +228,12 @@ export function HomePage(): React.JSX.Element | null { >; const optimizedTextures = new WeakSet(); +const MAX_GLTF_TEXTURE_ANISOTROPY = 2; function optimizeTexture(texture: THREE.Texture, maxAnisotropy: number): void { if (optimizedTextures.has(texture)) return; optimizedTextures.add(texture); - texture.anisotropy = Math.min(4, Math.max(1, maxAnisotropy)); + const nextAnisotropy = Math.min( + MAX_GLTF_TEXTURE_ANISOTROPY, + Math.max(1, maxAnisotropy), + ); - if (!(texture instanceof THREE.CompressedTexture)) { - texture.generateMipmaps = true; - texture.minFilter = THREE.LinearMipmapLinearFilter; - texture.magFilter = THREE.LinearFilter; + if (texture.anisotropy > nextAnisotropy) { + texture.anisotropy = nextAnisotropy; + texture.needsUpdate = true; } - - texture.needsUpdate = true; } function optimizeMaterialTextures( diff --git a/src/world/World.tsx b/src/world/World.tsx index 0b45210..1c14e31 100644 --- a/src/world/World.tsx +++ b/src/world/World.tsx @@ -31,11 +31,20 @@ import { CharacterSystem } from "@/world/characters/CharacterSystem"; import { Player } from "@/world/player/Player"; import { TestMap } from "@/world/debug/TestMap"; import type { SceneLoadingChangeHandler } from "@/types/world/sceneLoading"; +import type { HandTrackingGloveHandedness } from "@/hooks/handTracking/useHandTrackingGloveStatus"; +import type { HandTrackingHand } from "@/types/handTracking/handTracking"; interface WorldProps { onLoadingStateChange?: SceneLoadingChangeHandler | undefined; } +function hasTrackedHand( + hands: HandTrackingHand[], + handedness: HandTrackingGloveHandedness, +): boolean { + return hands.some((hand) => hand.handedness.toLowerCase() === handedness); +} + export function World({ onLoadingStateChange }: WorldProps): React.JSX.Element { useEnvironmentDebug(); useMapPerformanceDebug(); @@ -49,7 +58,7 @@ export function World({ onLoadingStateChange }: WorldProps): React.JSX.Element { (state) => state.showPlayerModel, ); const showDebugOctree = useDebugVisualsStore((state) => state.showOctree); - const { status, usageStatus } = useHandTrackingSnapshot(); + const { hands, status, usageStatus } = useHandTrackingSnapshot(); const { octree, gameplayReady, @@ -63,8 +72,11 @@ export function World({ onLoadingStateChange }: WorldProps): React.JSX.Element { ? PLAYER_SPAWN_POSITION_GAME : PLAYER_SPAWN_POSITION_PHYSICS; const showHandTrackingGloves = - sceneMode === "physics" || - (status !== "idle" && usageStatus !== "inactive"); + status === "connected" && usageStatus !== "inactive" && hands.length > 0; + const showLeftHandTrackingGlove = + showHandTrackingGloves && hasTrackedHand(hands, "left"); + const showRightHandTrackingGlove = + showHandTrackingGloves && hasTrackedHand(hands, "right"); const spawnPlayer = cameraMode !== "debug" && (sceneMode === "game" ? gameplayReady : octree !== null); @@ -82,8 +94,12 @@ export function World({ onLoadingStateChange }: WorldProps): React.JSX.Element { ) : null} {showHandTrackingGloves ? ( - - + {showLeftHandTrackingGlove ? ( + + ) : null} + {showRightHandTrackingGlove ? ( + + ) : null} ) : null} {cameraMode === "debug" ? : null} From a30a9a2d291ad5820d99d8b4b51b4de109b003d0 Mon Sep 17 00:00:00 2001 From: Tom Boullay Date: Tue, 2 Jun 2026 16:54:28 +0200 Subject: [PATCH 18/18] fix(handtracking): absorb React StrictMode double-mount MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit In dev, intentionally mounts → unmounts → remounts each effect to surface non-idempotent code. The hand tracking hooks were calling getUserMedia and creating MediaPipe / WebSocket runtimes on every mount, which in practice ran the full start/stop/start cycle inside a few milliseconds and pushed WebGL over its limit on top of the loaded scene → context lost. Add HAND_TRACKING_RUNTIME_START_DELAY_MS (80ms) and delay the actual start() call behind a setTimeout in both useBrowserHandTracking and useRemoteHandTracking. The cleanup clears the timer, so a fast mount/unmount never reaches start(). 80ms is invisible to the user (<5 frames at 60fps) and also absorbs rapid `nearby` toggles at trigger borders. Co-Authored-By: Claude Opus 4.7 (1M context) --- src/data/handTrackingConfig.ts | 5 +++++ src/hooks/handTracking/useBrowserHandTracking.ts | 10 +++++++++- src/hooks/handTracking/useRemoteHandTracking.ts | 10 +++++++++- 3 files changed, 23 insertions(+), 2 deletions(-) diff --git a/src/data/handTrackingConfig.ts b/src/data/handTrackingConfig.ts index 6027d12..2b28dda 100644 --- a/src/data/handTrackingConfig.ts +++ b/src/data/handTrackingConfig.ts @@ -9,3 +9,8 @@ export const HAND_TRACKING_BROWSER_WASM_URL = export const HAND_TRACKING_BROWSER_MODEL_URL = "https://storage.googleapis.com/mediapipe-models/hand_landmarker/hand_landmarker/float16/1/hand_landmarker.task"; export const HAND_TRACKING_BROWSER_DELEGATE: "CPU" | "GPU" = "CPU"; + +// Delay before the runtime actually starts after `enabled` flips to true. +// Absorbs React StrictMode's mount/unmount/mount cycle in dev and rapid +// `nearby` toggles at trigger borders. Invisible to the user (~5 frames). +export const HAND_TRACKING_RUNTIME_START_DELAY_MS = 80; diff --git a/src/hooks/handTracking/useBrowserHandTracking.ts b/src/hooks/handTracking/useBrowserHandTracking.ts index 7310f99..285fa2f 100644 --- a/src/hooks/handTracking/useBrowserHandTracking.ts +++ b/src/hooks/handTracking/useBrowserHandTracking.ts @@ -2,6 +2,7 @@ import { useEffect, useRef, useState } from "react"; import { HAND_TRACKING_FRAME_HEIGHT, HAND_TRACKING_FRAME_WIDTH, + HAND_TRACKING_RUNTIME_START_DELAY_MS, HAND_TRACKING_TARGET_FPS, } from "@/data/handTrackingConfig"; import { @@ -169,10 +170,17 @@ export function useBrowserHandTracking({ } }; - void start(); + // Delay the actual start so that a StrictMode mount/unmount/mount + // cycle, or a rapid `enabled` toggle at a trigger border, does not + // spin up the camera + MediaPipe twice in a few milliseconds. + const startTimer = window.setTimeout(() => { + if (cancelled) return; + void start(); + }, HAND_TRACKING_RUNTIME_START_DELAY_MS); return () => { cancelled = true; + window.clearTimeout(startTimer); cleanup(); }; }, [enabled]); diff --git a/src/hooks/handTracking/useRemoteHandTracking.ts b/src/hooks/handTracking/useRemoteHandTracking.ts index e9dc1db..fafa568 100644 --- a/src/hooks/handTracking/useRemoteHandTracking.ts +++ b/src/hooks/handTracking/useRemoteHandTracking.ts @@ -4,6 +4,7 @@ import { HAND_TRACKING_FRAME_WIDTH, HAND_TRACKING_JPEG_QUALITY, HAND_TRACKING_RESPONSE_TIMEOUT_MS, + HAND_TRACKING_RUNTIME_START_DELAY_MS, HAND_TRACKING_TARGET_FPS, } from "@/data/handTrackingConfig"; import { getHandTrackingWsUrl } from "@/utils/handTracking/handTrackingEndpoint"; @@ -330,10 +331,17 @@ export function useRemoteHandTracking({ } }; - void start(); + // Delay the actual start so that a StrictMode mount/unmount/mount + // cycle, or a rapid `enabled` toggle at a trigger border, does not + // open the camera + WebSocket twice in a few milliseconds. + const startTimer = window.setTimeout(() => { + if (cancelled) return; + void start(); + }, HAND_TRACKING_RUNTIME_START_DELAY_MS); return () => { cancelled = true; + window.clearTimeout(startTimer); cleanup(); }; }, [enabled, websocketUrl]);