visualizer-components 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (259) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +90 -0
  3. package/dist/assets/RudderIcon.d.ts +23 -0
  4. package/dist/assets/RudderIcon.d.ts.map +1 -0
  5. package/dist/assets/RudderIcon.js +23 -0
  6. package/dist/assets/RudderIcon.js.map +1 -0
  7. package/dist/assets/svgSources.d.ts +18 -0
  8. package/dist/assets/svgSources.d.ts.map +1 -0
  9. package/dist/assets/svgSources.js +18 -0
  10. package/dist/assets/svgSources.js.map +1 -0
  11. package/dist/components/Joystick.d.ts +23 -0
  12. package/dist/components/Joystick.d.ts.map +1 -0
  13. package/dist/components/Joystick.js +114 -0
  14. package/dist/components/Joystick.js.map +1 -0
  15. package/dist/components/TelemetryDashboard.d.ts +31 -0
  16. package/dist/components/TelemetryDashboard.d.ts.map +1 -0
  17. package/dist/components/TelemetryDashboard.js +127 -0
  18. package/dist/components/TelemetryDashboard.js.map +1 -0
  19. package/dist/components/controls/ControlOverlay.d.ts +64 -0
  20. package/dist/components/controls/ControlOverlay.d.ts.map +1 -0
  21. package/dist/components/controls/ControlOverlay.js +88 -0
  22. package/dist/components/controls/ControlOverlay.js.map +1 -0
  23. package/dist/components/controls/ControlsDrawer.d.ts +37 -0
  24. package/dist/components/controls/ControlsDrawer.d.ts.map +1 -0
  25. package/dist/components/controls/ControlsDrawer.js +93 -0
  26. package/dist/components/controls/ControlsDrawer.js.map +1 -0
  27. package/dist/components/controls/ForceVectorsPanel.d.ts +37 -0
  28. package/dist/components/controls/ForceVectorsPanel.d.ts.map +1 -0
  29. package/dist/components/controls/ForceVectorsPanel.js +76 -0
  30. package/dist/components/controls/ForceVectorsPanel.js.map +1 -0
  31. package/dist/components/controls/InfoPopover.d.ts +34 -0
  32. package/dist/components/controls/InfoPopover.d.ts.map +1 -0
  33. package/dist/components/controls/InfoPopover.js +41 -0
  34. package/dist/components/controls/InfoPopover.js.map +1 -0
  35. package/dist/components/controls/Legend.d.ts +29 -0
  36. package/dist/components/controls/Legend.d.ts.map +1 -0
  37. package/dist/components/controls/Legend.js +74 -0
  38. package/dist/components/controls/Legend.js.map +1 -0
  39. package/dist/components/controls/MobileBottomNav.d.ts +17 -0
  40. package/dist/components/controls/MobileBottomNav.d.ts.map +1 -0
  41. package/dist/components/controls/MobileBottomNav.js +46 -0
  42. package/dist/components/controls/MobileBottomNav.js.map +1 -0
  43. package/dist/components/hud/SceneHUD.d.ts +100 -0
  44. package/dist/components/hud/SceneHUD.d.ts.map +1 -0
  45. package/dist/components/hud/SceneHUD.js +216 -0
  46. package/dist/components/hud/SceneHUD.js.map +1 -0
  47. package/dist/components/hud/telemetry/Batteries.d.ts +40 -0
  48. package/dist/components/hud/telemetry/Batteries.d.ts.map +1 -0
  49. package/dist/components/hud/telemetry/Batteries.js +137 -0
  50. package/dist/components/hud/telemetry/Batteries.js.map +1 -0
  51. package/dist/components/hud/telemetry/Compass.d.ts +2 -0
  52. package/dist/components/hud/telemetry/Compass.d.ts.map +1 -0
  53. package/dist/components/hud/telemetry/Compass.js +147 -0
  54. package/dist/components/hud/telemetry/Compass.js.map +1 -0
  55. package/dist/components/hud/telemetry/Log.d.ts +2 -0
  56. package/dist/components/hud/telemetry/Log.d.ts.map +1 -0
  57. package/dist/components/hud/telemetry/Log.js +65 -0
  58. package/dist/components/hud/telemetry/Log.js.map +1 -0
  59. package/dist/components/hud/telemetry/Map.d.ts +4 -0
  60. package/dist/components/hud/telemetry/Map.d.ts.map +1 -0
  61. package/dist/components/hud/telemetry/Map.js +293 -0
  62. package/dist/components/hud/telemetry/Map.js.map +1 -0
  63. package/dist/components/hud/telemetry/PowerRudderPanel.d.ts +2 -0
  64. package/dist/components/hud/telemetry/PowerRudderPanel.d.ts.map +1 -0
  65. package/dist/components/hud/telemetry/PowerRudderPanel.js +115 -0
  66. package/dist/components/hud/telemetry/PowerRudderPanel.js.map +1 -0
  67. package/dist/components/hud/telemetry/RadiusVisualizer.d.ts +63 -0
  68. package/dist/components/hud/telemetry/RadiusVisualizer.d.ts.map +1 -0
  69. package/dist/components/hud/telemetry/RadiusVisualizer.js +139 -0
  70. package/dist/components/hud/telemetry/RadiusVisualizer.js.map +1 -0
  71. package/dist/components/hud/telemetry/RadiusVisualizerPanel.d.ts +31 -0
  72. package/dist/components/hud/telemetry/RadiusVisualizerPanel.d.ts.map +1 -0
  73. package/dist/components/hud/telemetry/RadiusVisualizerPanel.js +37 -0
  74. package/dist/components/hud/telemetry/RadiusVisualizerPanel.js.map +1 -0
  75. package/dist/components/hud/telemetry/ShipRudderVisualizer.d.ts +43 -0
  76. package/dist/components/hud/telemetry/ShipRudderVisualizer.d.ts.map +1 -0
  77. package/dist/components/hud/telemetry/ShipRudderVisualizer.js +121 -0
  78. package/dist/components/hud/telemetry/ShipRudderVisualizer.js.map +1 -0
  79. package/dist/components/hud/telemetry/ShipRudderVisualizerPanel.d.ts +26 -0
  80. package/dist/components/hud/telemetry/ShipRudderVisualizerPanel.d.ts.map +1 -0
  81. package/dist/components/hud/telemetry/ShipRudderVisualizerPanel.js +29 -0
  82. package/dist/components/hud/telemetry/ShipRudderVisualizerPanel.js.map +1 -0
  83. package/dist/components/hud/telemetry/SignalLog.d.ts +7 -0
  84. package/dist/components/hud/telemetry/SignalLog.d.ts.map +1 -0
  85. package/dist/components/hud/telemetry/SignalLog.js +28 -0
  86. package/dist/components/hud/telemetry/SignalLog.js.map +1 -0
  87. package/dist/components/hud/telemetry/SignalStrength.d.ts +9 -0
  88. package/dist/components/hud/telemetry/SignalStrength.d.ts.map +1 -0
  89. package/dist/components/hud/telemetry/SignalStrength.js +53 -0
  90. package/dist/components/hud/telemetry/SignalStrength.js.map +1 -0
  91. package/dist/components/hud/telemetry/Speedometer.d.ts +2 -0
  92. package/dist/components/hud/telemetry/Speedometer.d.ts.map +1 -0
  93. package/dist/components/hud/telemetry/Speedometer.js +70 -0
  94. package/dist/components/hud/telemetry/Speedometer.js.map +1 -0
  95. package/dist/components/hud/telemetry/Task.d.ts +2 -0
  96. package/dist/components/hud/telemetry/Task.d.ts.map +1 -0
  97. package/dist/components/hud/telemetry/Task.js +61 -0
  98. package/dist/components/hud/telemetry/Task.js.map +1 -0
  99. package/dist/components/hud/telemetry/TaskData.d.ts +2 -0
  100. package/dist/components/hud/telemetry/TaskData.d.ts.map +1 -0
  101. package/dist/components/hud/telemetry/TaskData.js +62 -0
  102. package/dist/components/hud/telemetry/TaskData.js.map +1 -0
  103. package/dist/components/hud/telemetry/index.d.ts +40 -0
  104. package/dist/components/hud/telemetry/index.d.ts.map +1 -0
  105. package/dist/components/hud/telemetry/index.js +40 -0
  106. package/dist/components/hud/telemetry/index.js.map +1 -0
  107. package/dist/components/hud/telemetry/powerColor.d.ts +16 -0
  108. package/dist/components/hud/telemetry/powerColor.d.ts.map +1 -0
  109. package/dist/components/hud/telemetry/powerColor.js +15 -0
  110. package/dist/components/hud/telemetry/powerColor.js.map +1 -0
  111. package/dist/components/scenes/MappingScene.d.ts +19 -0
  112. package/dist/components/scenes/MappingScene.d.ts.map +1 -0
  113. package/dist/components/scenes/MappingScene.js +353 -0
  114. package/dist/components/scenes/MappingScene.js.map +1 -0
  115. package/dist/components/scenes/SceneCanvas.d.ts +96 -0
  116. package/dist/components/scenes/SceneCanvas.d.ts.map +1 -0
  117. package/dist/components/scenes/SceneCanvas.js +151 -0
  118. package/dist/components/scenes/SceneCanvas.js.map +1 -0
  119. package/dist/components/scenes/SceneRenderer.d.ts +16 -0
  120. package/dist/components/scenes/SceneRenderer.d.ts.map +1 -0
  121. package/dist/components/scenes/SceneRenderer.js +60 -0
  122. package/dist/components/scenes/SceneRenderer.js.map +1 -0
  123. package/dist/components/scenes/TelemetryScene.d.ts +6 -0
  124. package/dist/components/scenes/TelemetryScene.d.ts.map +1 -0
  125. package/dist/components/scenes/TelemetryScene.js +6 -0
  126. package/dist/components/scenes/TelemetryScene.js.map +1 -0
  127. package/dist/components/svg/CompassRose.d.ts +129 -0
  128. package/dist/components/svg/CompassRose.d.ts.map +1 -0
  129. package/dist/components/svg/CompassRose.js +221 -0
  130. package/dist/components/svg/CompassRose.js.map +1 -0
  131. package/dist/connection/config.d.ts +41 -0
  132. package/dist/connection/config.d.ts.map +1 -0
  133. package/dist/connection/config.js +44 -0
  134. package/dist/connection/config.js.map +1 -0
  135. package/dist/contexts/SceneContext.d.ts +35 -0
  136. package/dist/contexts/SceneContext.d.ts.map +1 -0
  137. package/dist/contexts/SceneContext.js +24 -0
  138. package/dist/contexts/SceneContext.js.map +1 -0
  139. package/dist/hooks/useAutoPathAnimation.d.ts +22 -0
  140. package/dist/hooks/useAutoPathAnimation.d.ts.map +1 -0
  141. package/dist/hooks/useAutoPathAnimation.js +102 -0
  142. package/dist/hooks/useAutoPathAnimation.js.map +1 -0
  143. package/dist/hooks/useLayoutConfig.d.ts +29 -0
  144. package/dist/hooks/useLayoutConfig.d.ts.map +1 -0
  145. package/dist/hooks/useLayoutConfig.js +30 -0
  146. package/dist/hooks/useLayoutConfig.js.map +1 -0
  147. package/dist/hooks/useSceneContext.d.ts +64 -0
  148. package/dist/hooks/useSceneContext.d.ts.map +1 -0
  149. package/dist/hooks/useSceneContext.js +37 -0
  150. package/dist/hooks/useSceneContext.js.map +1 -0
  151. package/dist/index.d.ts +44 -0
  152. package/dist/index.d.ts.map +1 -0
  153. package/dist/index.js +57 -0
  154. package/dist/index.js.map +1 -0
  155. package/dist/providers/TelemetryProvider.d.ts +27 -0
  156. package/dist/providers/TelemetryProvider.d.ts.map +1 -0
  157. package/dist/providers/TelemetryProvider.js +50 -0
  158. package/dist/providers/TelemetryProvider.js.map +1 -0
  159. package/dist/providers/TelemetryThemeProvider.d.ts +25 -0
  160. package/dist/providers/TelemetryThemeProvider.d.ts.map +1 -0
  161. package/dist/providers/TelemetryThemeProvider.js +54 -0
  162. package/dist/providers/TelemetryThemeProvider.js.map +1 -0
  163. package/dist/store/actions/connectionActions.d.ts +39 -0
  164. package/dist/store/actions/connectionActions.d.ts.map +1 -0
  165. package/dist/store/actions/connectionActions.js +162 -0
  166. package/dist/store/actions/connectionActions.js.map +1 -0
  167. package/dist/store/actions/fetchTelemetry.d.ts +51 -0
  168. package/dist/store/actions/fetchTelemetry.d.ts.map +1 -0
  169. package/dist/store/actions/fetchTelemetry.js +135 -0
  170. package/dist/store/actions/fetchTelemetry.js.map +1 -0
  171. package/dist/store/index.d.ts +23 -0
  172. package/dist/store/index.d.ts.map +1 -0
  173. package/dist/store/index.js +22 -0
  174. package/dist/store/index.js.map +1 -0
  175. package/dist/store/slices/connectionSlice.d.ts +15 -0
  176. package/dist/store/slices/connectionSlice.d.ts.map +1 -0
  177. package/dist/store/slices/connectionSlice.js +39 -0
  178. package/dist/store/slices/connectionSlice.js.map +1 -0
  179. package/dist/store/slices/discoveredGridSlice.d.ts +168 -0
  180. package/dist/store/slices/discoveredGridSlice.d.ts.map +1 -0
  181. package/dist/store/slices/discoveredGridSlice.js +146 -0
  182. package/dist/store/slices/discoveredGridSlice.js.map +1 -0
  183. package/dist/store/slices/sceneSlice.d.ts +185 -0
  184. package/dist/store/slices/sceneSlice.d.ts.map +1 -0
  185. package/dist/store/slices/sceneSlice.js +95 -0
  186. package/dist/store/slices/sceneSlice.js.map +1 -0
  187. package/dist/store/slices/simulationSlice.d.ts +87 -0
  188. package/dist/store/slices/simulationSlice.d.ts.map +1 -0
  189. package/dist/store/slices/simulationSlice.js +55 -0
  190. package/dist/store/slices/simulationSlice.js.map +1 -0
  191. package/dist/store/slices/telemetrySlice.d.ts +10 -0
  192. package/dist/store/slices/telemetrySlice.d.ts.map +1 -0
  193. package/dist/store/slices/telemetrySlice.js +88 -0
  194. package/dist/store/slices/telemetrySlice.js.map +1 -0
  195. package/dist/store/slices/videoSlice.d.ts +12 -0
  196. package/dist/store/slices/videoSlice.d.ts.map +1 -0
  197. package/dist/store/slices/videoSlice.js +27 -0
  198. package/dist/store/slices/videoSlice.js.map +1 -0
  199. package/dist/store/slices/visualizationSlice.d.ts +152 -0
  200. package/dist/store/slices/visualizationSlice.d.ts.map +1 -0
  201. package/dist/store/slices/visualizationSlice.js +58 -0
  202. package/dist/store/slices/visualizationSlice.js.map +1 -0
  203. package/dist/store/store.d.ts +61 -0
  204. package/dist/store/store.d.ts.map +1 -0
  205. package/dist/store/store.js +78 -0
  206. package/dist/store/store.js.map +1 -0
  207. package/dist/theme/index.d.ts +14 -0
  208. package/dist/theme/index.d.ts.map +1 -0
  209. package/dist/theme/index.js +14 -0
  210. package/dist/theme/index.js.map +1 -0
  211. package/dist/theme/lightTheme.d.ts +151 -0
  212. package/dist/theme/lightTheme.d.ts.map +1 -0
  213. package/dist/theme/lightTheme.js +194 -0
  214. package/dist/theme/lightTheme.js.map +1 -0
  215. package/dist/theme/telemetryTheme.d.ts +90 -0
  216. package/dist/theme/telemetryTheme.d.ts.map +1 -0
  217. package/dist/theme/telemetryTheme.js +157 -0
  218. package/dist/theme/telemetryTheme.js.map +1 -0
  219. package/dist/types/detectedObjectsTypes.d.ts +18 -0
  220. package/dist/types/detectedObjectsTypes.d.ts.map +1 -0
  221. package/dist/types/detectedObjectsTypes.js +8 -0
  222. package/dist/types/detectedObjectsTypes.js.map +1 -0
  223. package/dist/types/index.d.ts +16 -0
  224. package/dist/types/index.d.ts.map +1 -0
  225. package/dist/types/index.js +16 -0
  226. package/dist/types/index.js.map +1 -0
  227. package/dist/types/ros.d.ts +87 -0
  228. package/dist/types/ros.d.ts.map +1 -0
  229. package/dist/types/ros.js +17 -0
  230. package/dist/types/ros.js.map +1 -0
  231. package/dist/types/statusTypes.d.ts +81 -0
  232. package/dist/types/statusTypes.d.ts.map +1 -0
  233. package/dist/types/statusTypes.js +52 -0
  234. package/dist/types/statusTypes.js.map +1 -0
  235. package/dist/types/taskTypes.d.ts +65 -0
  236. package/dist/types/taskTypes.d.ts.map +1 -0
  237. package/dist/types/taskTypes.js +18 -0
  238. package/dist/types/taskTypes.js.map +1 -0
  239. package/dist/types/telemetryInterfaces.d.ts +81 -0
  240. package/dist/types/telemetryInterfaces.d.ts.map +1 -0
  241. package/dist/types/telemetryInterfaces.js +30 -0
  242. package/dist/types/telemetryInterfaces.js.map +1 -0
  243. package/dist/utils/basestation.d.ts +7 -0
  244. package/dist/utils/basestation.d.ts.map +1 -0
  245. package/dist/utils/basestation.js +49 -0
  246. package/dist/utils/basestation.js.map +1 -0
  247. package/dist/utils/batteryUtil.d.ts +8 -0
  248. package/dist/utils/batteryUtil.d.ts.map +1 -0
  249. package/dist/utils/batteryUtil.js +32 -0
  250. package/dist/utils/batteryUtil.js.map +1 -0
  251. package/dist/utils/telemetry/index.d.ts +13 -0
  252. package/dist/utils/telemetry/index.d.ts.map +1 -0
  253. package/dist/utils/telemetry/index.js +13 -0
  254. package/dist/utils/telemetry/index.js.map +1 -0
  255. package/dist/utils/telemetry/telemetryFactory.d.ts +48 -0
  256. package/dist/utils/telemetry/telemetryFactory.d.ts.map +1 -0
  257. package/dist/utils/telemetry/telemetryFactory.js +390 -0
  258. package/dist/utils/telemetry/telemetryFactory.js.map +1 -0
  259. package/package.json +91 -0
@@ -0,0 +1,353 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ /**
3
+ * @file MappingScene.tsx
4
+ * @description Animation orchestrator for the mapping visualizer scene.
5
+ * Renamed from MappingVisualizer.tsx. Uses useEnginePhysics and dispatches
6
+ * scene events for objective reached and map regeneration.
7
+ */
8
+ import React from 'react';
9
+ import { Box, Container, Stack, Grid, useMediaQuery, useTheme } from '@mui/material';
10
+ import { useEnginePhysics } from 'react-isometric-engine';
11
+ import { useAutoPathAnimation } from '../../hooks/useAutoPathAnimation';
12
+ import { useAppSelector, useAppDispatch } from '../../store';
13
+ import { clearCourseTrail, appendCourseTrailPoint, setASVSpeed, setASVHeading } from '../../store/slices/telemetrySlice';
14
+ import { regenerateMockTelemetry } from '../../store/actions/fetchTelemetry';
15
+ import { dispatchSceneEvent, selectActiveScene } from '../../store/slices/sceneSlice';
16
+ import { revealGlobalAroundPosition, resetDiscovery, bulkPromoteObstacles, revealAllKnownCells, } from '../../store/slices/discoveredGridSlice';
17
+ import { CellTypes, GLOBAL_GRID_SIZE, GLOBAL_CELL_SIZE, LOCAL_CELL_SIZE, LOCAL_GRID_WORLD_SIZE } from '../../types';
18
+ import { SceneCanvas } from './SceneCanvas';
19
+ import { Legend } from '../controls/Legend';
20
+ import { MobileBottomNav } from '../controls/MobileBottomNav';
21
+ import * as SceneHUD from '../hud/SceneHUD';
22
+ /**
23
+ * @component MappingScene
24
+ * @description The main mapping visualizer scene component.
25
+ * It orchestrates the animation loop, handles user input, and renders the map, ASV, and HUD.
26
+ * @remarks
27
+ * This component uses the `useEnginePhysics` hook to simulate the ASV's movement based on speed and heading.
28
+ * It dispatches scene events for objective reached and map regeneration, and manages the course trail.
29
+ *
30
+ * @returns a React element representing the mapping visualizer scene.
31
+ */
32
+ export default function MappingScene() {
33
+ const theme = useTheme();
34
+ const dispatch = useAppDispatch();
35
+ const isMobile = useMediaQuery(theme.breakpoints.down('md'));
36
+ const isLandscape = useMediaQuery('(orientation: landscape)');
37
+ const [isFullscreen, setIsFullscreen] = React.useState(false);
38
+ // Determine if the app is in desktop mode (not mobile or in fullscreen landscape)
39
+ const isDesktopMode = !isMobile || (isFullscreen && isLandscape);
40
+ // Redux state selectors
41
+ const activeSceneId = useAppSelector(selectActiveScene);
42
+ const simMode = useAppSelector((state) => state.simulation.simMode);
43
+ const showLegend = useAppSelector((state) => state.visualization.showLegend);
44
+ const { speed, heading } = useAppSelector((state) => state.telemetry.asv);
45
+ const connectionStatus = useAppSelector((state) => state.connection.status);
46
+ const isConnected = connectionStatus === 'connected';
47
+ const fineGrid = useAppSelector((state) => state.simulation.fineGrid);
48
+ const occupancyGrid = useAppSelector((state) => state.telemetry.map.occupancyGrid);
49
+ const autoSimActive = !isConnected && simMode === 'automatic';
50
+ // Joystick state — only active in manual sim mode
51
+ const VELOCITY_MAX = 2.0;
52
+ const TURN_RATE = 90; // deg/s at full x deflection
53
+ const [joyState, setJoyState] = React.useState({ x: 0, y: 0 });
54
+ const joyRef = React.useRef({ x: 0, y: 0 });
55
+ const handleJoyChange = React.useCallback((j) => {
56
+ joyRef.current = j;
57
+ setJoyState(j);
58
+ dispatch(setASVSpeed(j.y * VELOCITY_MAX));
59
+ }, [dispatch]);
60
+ const headingRef = React.useRef(heading);
61
+ const lastDispatchedHeadingRef = React.useRef(-1);
62
+ React.useEffect(() => { headingRef.current = heading; }, [heading]);
63
+ // Animation loop for heading updates based on joystick input
64
+ React.useEffect(() => {
65
+ if (isConnected || autoSimActive)
66
+ return;
67
+ let lastTime = null;
68
+ let rafId;
69
+ const loop = (now) => {
70
+ if (lastTime !== null) {
71
+ const dt = (now - lastTime) / 1000;
72
+ const x = joyRef.current.x;
73
+ if (Math.abs(x) > 0.05) {
74
+ const next = ((headingRef.current + x * TURN_RATE * dt) + 360) % 360;
75
+ headingRef.current = next;
76
+ const rounded = Math.round(next);
77
+ if (rounded !== lastDispatchedHeadingRef.current) {
78
+ lastDispatchedHeadingRef.current = rounded;
79
+ dispatch(setASVHeading(rounded));
80
+ }
81
+ }
82
+ }
83
+ lastTime = now;
84
+ rafId = requestAnimationFrame(loop);
85
+ };
86
+ rafId = requestAnimationFrame(loop);
87
+ return () => cancelAnimationFrame(rafId);
88
+ }, [isConnected, autoSimActive, dispatch]);
89
+ const joyLw = Math.max(-1, Math.min(1, joyState.y + joyState.x));
90
+ const joyRw = Math.max(-1, Math.min(1, joyState.y - joyState.x));
91
+ const mappingPaused = !isConnected && !autoSimActive && activeSceneId !== 'mapping';
92
+ const { globalX: manualX, globalY: manualY, setGlobalX, setGlobalY } = useEnginePhysics(autoSimActive ? 0 : mappingPaused ? 0 : speed, heading);
93
+ const { autoX, autoY, autoHeading } = useAutoPathAnimation(autoSimActive, 2.0);
94
+ const globalX = autoSimActive ? autoX : manualX;
95
+ const globalY = autoSimActive ? autoY : manualY;
96
+ // Sync manual position to auto position when leaving auto mode so there's no jump.
97
+ const prevAutoSimRef = React.useRef(autoSimActive);
98
+ React.useEffect(() => {
99
+ const was = prevAutoSimRef.current;
100
+ prevAutoSimRef.current = autoSimActive;
101
+ if (was && !autoSimActive) {
102
+ setGlobalX(autoX);
103
+ setGlobalY(autoY);
104
+ }
105
+ }, [autoSimActive]); // eslint-disable-line react-hooks/exhaustive-deps
106
+ const plan = useAppSelector((state) => state.telemetry.planning.plan);
107
+ const lastPointRef = React.useRef(null);
108
+ const pendingAutoClearRef = React.useRef(false);
109
+ const pendingAutoClearPosRef = React.useRef(null);
110
+ // Regenerate mock telemetry when the basestation drops mid-session.
111
+ const prevStatusRef = React.useRef(connectionStatus);
112
+ React.useEffect(() => {
113
+ const prev = prevStatusRef.current;
114
+ prevStatusRef.current = connectionStatus;
115
+ if (prev === 'connected' && connectionStatus === 'mock') {
116
+ pendingAutoClearRef.current = false;
117
+ pendingAutoClearPosRef.current = null;
118
+ lastPointRef.current = null;
119
+ dispatch(clearCourseTrail());
120
+ dispatch(regenerateMockTelemetry());
121
+ }
122
+ }, [connectionStatus, dispatch]);
123
+ // Clear the course trail when the sim mode changes (e.g., from manual to auto).
124
+ React.useEffect(() => {
125
+ pendingAutoClearRef.current = false;
126
+ pendingAutoClearPosRef.current = null;
127
+ lastPointRef.current = null;
128
+ dispatch(clearCourseTrail());
129
+ }, [dispatch, simMode]);
130
+ // Sample the vessel's position and append to the course trail when moving. Clear the trail if the vessel jumps far away.
131
+ React.useEffect(() => {
132
+ if (isConnected)
133
+ return;
134
+ if (autoSimActive && plan.length === 0)
135
+ return;
136
+ if (pendingAutoClearRef.current) {
137
+ const obj = pendingAutoClearPosRef.current;
138
+ if (Math.hypot(globalX - obj.x, globalY - obj.y) > 1.0) {
139
+ pendingAutoClearRef.current = false;
140
+ pendingAutoClearPosRef.current = null;
141
+ lastPointRef.current = { x: globalX, y: globalY };
142
+ dispatch(clearCourseTrail());
143
+ dispatch(appendCourseTrailPoint({ x: globalX, y: globalY }));
144
+ }
145
+ return;
146
+ }
147
+ const prev = lastPointRef.current;
148
+ const SAMPLE_DIST = 0.3;
149
+ const WRAP_DIST = 5.0;
150
+ const dist = prev !== null ? Math.hypot(globalX - prev.x, globalY - prev.y) : 0;
151
+ if (prev !== null && dist >= WRAP_DIST) {
152
+ lastPointRef.current = { x: globalX, y: globalY };
153
+ dispatch(clearCourseTrail());
154
+ dispatch(appendCourseTrailPoint({ x: globalX, y: globalY }));
155
+ }
156
+ else if (prev === null || dist >= SAMPLE_DIST) {
157
+ lastPointRef.current = { x: globalX, y: globalY };
158
+ dispatch(appendCourseTrailPoint({ x: globalX, y: globalY }));
159
+ }
160
+ }, [globalX, globalY]); // eslint-disable-line react-hooks/exhaustive-deps
161
+ const atObjectiveRef = React.useRef(false);
162
+ // Dispatch an OBJECTIVE_REACHED event when the vessel reaches the objective cell.
163
+ // If in auto mode, clear the course trail and regenerate mock telemetry.
164
+ React.useEffect(() => {
165
+ const objectiveCell = plan[plan.length - 1];
166
+ if (!objectiveCell)
167
+ return;
168
+ const col = Math.floor(globalX + GLOBAL_GRID_SIZE / 2);
169
+ const row = Math.floor(globalY + GLOBAL_GRID_SIZE / 2);
170
+ if (col === objectiveCell.x && row === objectiveCell.y) {
171
+ if (!atObjectiveRef.current) {
172
+ atObjectiveRef.current = true;
173
+ dispatch(dispatchSceneEvent({ type: 'OBJECTIVE_REACHED', sceneId: 'mapping', payload: { x: globalX, y: globalY } }));
174
+ if (autoSimActive) {
175
+ pendingAutoClearRef.current = true;
176
+ pendingAutoClearPosRef.current = { x: globalX, y: globalY };
177
+ }
178
+ else {
179
+ lastPointRef.current = null;
180
+ dispatch(clearCourseTrail());
181
+ dispatch(regenerateMockTelemetry());
182
+ }
183
+ }
184
+ }
185
+ else {
186
+ atObjectiveRef.current = false;
187
+ }
188
+ }, [globalX, globalY, plan]); // eslint-disable-line react-hooks/exhaustive-deps
189
+ // When the map loads or regenerates, record the vessel's current position as baseline
190
+ // WITHOUT revealing it. This prevents the default (0,0) position from uncovering the
191
+ // map center before the vessel has actually traveled there. React runs effects in
192
+ // definition order, so this fires before the reveal effect below when fineGrid changes.
193
+ const lastFogCellRef = React.useRef(null);
194
+ const fineOffset = (GLOBAL_GRID_SIZE / 2) * GLOBAL_CELL_SIZE; // 400 world units
195
+ React.useEffect(() => {
196
+ if (fineGrid.length === 0)
197
+ return;
198
+ lastFogCellRef.current = {
199
+ col: Math.floor(globalX + GLOBAL_GRID_SIZE / 2),
200
+ row: Math.floor(globalY + GLOBAL_GRID_SIZE / 2),
201
+ };
202
+ }, [fineGrid]); // eslint-disable-line react-hooks/exhaustive-deps
203
+ // Reveal global cells and promote fineGrid obstacles only when the vessel actually moves.
204
+ React.useEffect(() => {
205
+ if (fineGrid.length === 0)
206
+ return;
207
+ const gCol = Math.floor(globalX + GLOBAL_GRID_SIZE / 2);
208
+ const gRow = Math.floor(globalY + GLOBAL_GRID_SIZE / 2);
209
+ const last = lastFogCellRef.current;
210
+ // Skip if position hasn't changed (includes the initial load position captured above).
211
+ if (last === null || (last.col === gCol && last.row === gRow))
212
+ return;
213
+ lastFogCellRef.current = { col: gCol, row: gRow };
214
+ dispatch(revealGlobalAroundPosition({ col: gCol, row: gRow }));
215
+ // Promote only the global cells that overlap the LocalGrid's actual visible area.
216
+ // LocalGrid covers ±LOCAL_GRID_WORLD_SIZE/2 px from the vessel center — compute the
217
+ // exact global cell range instead of a fixed radius to avoid over-marking.
218
+ const worldCX = globalX * GLOBAL_CELL_SIZE;
219
+ const worldCY = globalY * GLOBAL_CELL_SIZE;
220
+ const half = LOCAL_GRID_WORLD_SIZE / 2; // 60 px
221
+ const cMin = Math.max(0, Math.floor((worldCX - half + fineOffset) / GLOBAL_CELL_SIZE));
222
+ const cMax = Math.min(GLOBAL_GRID_SIZE - 1, Math.floor((worldCX + half + fineOffset) / GLOBAL_CELL_SIZE));
223
+ const rMin = Math.max(0, Math.floor((worldCY - half + fineOffset) / GLOBAL_CELL_SIZE));
224
+ const rMax = Math.min(GLOBAL_GRID_SIZE - 1, Math.floor((worldCY + half + fineOffset) / GLOBAL_CELL_SIZE));
225
+ const promoteCols = [];
226
+ const promoteRows = [];
227
+ for (let nr = rMin; nr <= rMax; nr++) {
228
+ for (let nc = cMin; nc <= cMax; nc++) {
229
+ const worldXMin = (nc - GLOBAL_GRID_SIZE / 2) * GLOBAL_CELL_SIZE;
230
+ const worldYMin = (nr - GLOBAL_GRID_SIZE / 2) * GLOBAL_CELL_SIZE;
231
+ const fColStart = Math.max(0, Math.floor((worldXMin + fineOffset) / LOCAL_CELL_SIZE));
232
+ const fRowStart = Math.max(0, Math.floor((worldYMin + fineOffset) / LOCAL_CELL_SIZE));
233
+ const fColEnd = Math.min(fineGrid[0]?.length ?? 0, Math.ceil((worldXMin + GLOBAL_CELL_SIZE + fineOffset) / LOCAL_CELL_SIZE));
234
+ const fRowEnd = Math.min(fineGrid.length, Math.ceil((worldYMin + GLOBAL_CELL_SIZE + fineOffset) / LOCAL_CELL_SIZE));
235
+ let hasObstacle = false;
236
+ outer: for (let fi = fRowStart; fi < fRowEnd; fi++) {
237
+ for (let fj = fColStart; fj < fColEnd; fj++) {
238
+ if (fineGrid[fi]?.[fj]?.type === CellTypes.occupied) {
239
+ hasObstacle = true;
240
+ break outer;
241
+ }
242
+ }
243
+ }
244
+ if (hasObstacle) {
245
+ promoteCols.push(nc);
246
+ promoteRows.push(nr);
247
+ }
248
+ }
249
+ }
250
+ if (promoteCols.length > 0) {
251
+ dispatch(bulkPromoteObstacles({ cols: promoteCols, rows: promoteRows }));
252
+ }
253
+ }, [globalX, globalY, fineGrid, dispatch]); // eslint-disable-line react-hooks/exhaustive-deps
254
+ // Live mode: immediately reveal all cells the basestation knows about.
255
+ // Unknown cells (absent from occupancyGrid) remain hidden behind fog.
256
+ React.useEffect(() => {
257
+ if (!isConnected)
258
+ return;
259
+ const cols = [];
260
+ const rows = [];
261
+ occupancyGrid.forEach((gridRow, ri) => {
262
+ gridRow.forEach((cell, ci) => {
263
+ if (cell.type !== undefined && cell.type !== CellTypes.empty) {
264
+ cols.push(ci);
265
+ rows.push(ri);
266
+ }
267
+ });
268
+ });
269
+ if (cols.length > 0)
270
+ dispatch(revealAllKnownCells({ cols, rows }));
271
+ }, [occupancyGrid, isConnected, dispatch]);
272
+ /**
273
+ * @constant handleRegenerateMap
274
+ * @description Callback to regenerate the mock telemetry map.
275
+ * @remarks
276
+ * This function resets the auto-clear state, clears the course trail, and dispatches actions to regenerate the map and reset discovery.
277
+ * It also dispatches a scene event indicating that the map has been regenerated.
278
+ */
279
+ const handleRegenerateMap = React.useCallback(() => {
280
+ pendingAutoClearRef.current = false;
281
+ pendingAutoClearPosRef.current = null;
282
+ lastPointRef.current = null;
283
+ dispatch(regenerateMockTelemetry());
284
+ dispatch(clearCourseTrail());
285
+ dispatch(resetDiscovery());
286
+ dispatch(dispatchSceneEvent({ type: 'MAP_REGENERATED', sceneId: 'mapping' }));
287
+ }, [dispatch]);
288
+ // You know what this does. It exits fullscreen mode and unlocks the screen orientation if supported.
289
+ const exitFullscreen = () => {
290
+ setIsFullscreen(false);
291
+ try {
292
+ screen.orientation.unlock();
293
+ }
294
+ catch { /* not supported */ }
295
+ };
296
+ const toggleFullscreen = async () => {
297
+ if (!isFullscreen) {
298
+ setIsFullscreen(true);
299
+ // `lock` is missing from some ScreenOrientation typings (still experimental in the spec).
300
+ try {
301
+ await screen.orientation.lock?.('landscape');
302
+ }
303
+ catch { /* not supported (e.g. iOS) */ }
304
+ }
305
+ else {
306
+ exitFullscreen();
307
+ }
308
+ };
309
+ React.useEffect(() => {
310
+ document.body.style.overflow = isFullscreen ? 'hidden' : '';
311
+ return () => { document.body.style.overflow = ''; };
312
+ }, [isFullscreen]);
313
+ React.useEffect(() => {
314
+ const handler = (e) => { if (e.key === 'Escape')
315
+ exitFullscreen(); };
316
+ document.addEventListener('keydown', handler);
317
+ return () => document.removeEventListener('keydown', handler);
318
+ }, []);
319
+ const joystickProps = !isConnected && !autoSimActive ? {
320
+ joy: joyState,
321
+ lw: joyLw,
322
+ rw: joyRw,
323
+ onJoyChange: handleJoyChange,
324
+ } : undefined;
325
+ return (_jsxs(Box, { sx: {
326
+ bgcolor: theme.palette.scene.skyDark,
327
+ ...(isFullscreen ? {
328
+ position: 'fixed',
329
+ inset: 0,
330
+ zIndex: 1150,
331
+ overflow: 'hidden',
332
+ display: 'flex',
333
+ flexDirection: 'column',
334
+ pt: 'env(safe-area-inset-top)',
335
+ pb: !isDesktopMode ? 'calc(56px + env(safe-area-inset-bottom))' : 'env(safe-area-inset-bottom)',
336
+ pl: 'env(safe-area-inset-left)',
337
+ pr: 'env(safe-area-inset-right)',
338
+ } : {
339
+ minHeight: '100vh',
340
+ display: 'flex',
341
+ flexDirection: 'column',
342
+ py: { xs: 2, md: 3 },
343
+ px: { xs: 0, sm: 2, md: 4 },
344
+ pb: { xs: '56px', md: 6 },
345
+ })
346
+ }, children: [_jsx(Container, { maxWidth: false, sx: {
347
+ px: { xs: 0, sm: 4 },
348
+ maxWidth: '1800px',
349
+ flex: 1,
350
+ ...(isFullscreen && { minHeight: 0, display: 'flex', flexDirection: 'column', px: 0 }),
351
+ }, children: _jsxs(Stack, { spacing: isFullscreen ? 1 : 2, sx: isFullscreen ? { flex: 1, minHeight: 0, display: 'flex', flexDirection: 'column' } : {}, children: [_jsxs(SceneCanvas, { globalX: globalX, globalY: globalY, setGlobalX: setGlobalX, setGlobalY: setGlobalY, autoHeading: autoSimActive ? autoHeading : undefined, isDesktopMode: isDesktopMode, isFullscreen: isFullscreen, isMobile: isMobile, onToggleFullscreen: toggleFullscreen, onRegenerateMap: handleRegenerateMap, joystickProps: joystickProps, children: [_jsx(SceneHUD.Tabs, {}), _jsx(SceneHUD.StatusBadges, {}), _jsx(SceneHUD.Toolbar, {}), _jsx(SceneHUD.Title, {}), joystickProps && _jsx(SceneHUD.JoystickHUD, { ...joystickProps }), _jsx(SceneHUD.LegendPanel, {}), _jsx(SceneHUD.ConnectingOverlay, {})] }), !isFullscreen && (_jsx(Stack, { spacing: 3, sx: { px: { xs: 2, sm: 0 } }, children: _jsx(Grid, { container: true, spacing: 3, alignItems: "stretch", children: _jsx(Grid, { size: { xs: 12, md: 6, lg: 4 }, sx: { display: { xs: 'block', md: 'none' } }, children: showLegend && _jsx(Legend, { variant: activeSceneId === 'forces' ? 'forces' : 'mapping' }) }) }) }))] }) }), !isDesktopMode && (_jsx(MobileBottomNav, {}))] }));
352
+ }
353
+ //# sourceMappingURL=MappingScene.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MappingScene.js","sourceRoot":"","sources":["../../../src/components/scenes/MappingScene.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,96 @@
1
+ /**
2
+ * @file SceneCanvas.tsx
3
+ * @description Viewport container for the visualizer engine. Owns gesture handling,
4
+ * viewport state, and the SceneContext that HUD children consume.
5
+ * Renamed from MapCanvas.tsx; uses SceneProvider instead of MapCanvasProvider.
6
+ * @remarks
7
+ * This component serves as the main container for the 3D scene visualizer. It manages user interactions such as dragging, pinching, and zooming to manipulate the view of the scene.
8
+ * The component provides a context for child components to access viewport state and control functions.
9
+ * It also includes a controls drawer for additional user interactions and settings.
10
+ */
11
+ import React from 'react';
12
+ import type { JoyState } from '../Joystick';
13
+ /**
14
+ * @interface SceneCanvasProps
15
+ * @description Properties for the {@link SceneCanvas} component.
16
+ * @see {@link SceneCanvas}
17
+ * @property {number} globalX - The global X coordinate of the scene's origin.
18
+ * @property {number} globalY - The global Y coordinate of the scene's origin.
19
+ * @property {(x: number) => void} setGlobalX - Function to update the global X coordinate.
20
+ * @property {(y: number) => void} setGlobalY - Function to update the global Y coordinate.
21
+ * @property {number} [autoHeading] - Optional automatic heading angle for the scene view.
22
+ * @property {boolean} isDesktopMode - Indicates if the application is in desktop mode.
23
+ * @property {boolean} isFullscreen - Indicates if the scene is currently in fullscreen mode.
24
+ * @property {boolean} isMobile - Indicates if the application is running on a mobile device.
25
+ * @property {() => void} onToggleFullscreen - Callback function to toggle fullscreen mode.
26
+ * @property {() => void} onRegenerateMap - Callback function to regenerate the map.
27
+ * @property {object} [joystickProps] - Optional properties for the joystick control.
28
+ * @property {JoyState} joystickProps.joy - The current state of the joystick.
29
+ * @property {number} joystickProps.lw - The left wheel speed.
30
+ * @property {number} joystickProps.rw - The right wheel speed.
31
+ * @property {(j: JoyState) => void} joystickProps.onJoyChange - Callback function to handle joystick state changes.
32
+ * @property {React.ReactNode} children - Child components to be rendered within the SceneCanvas.
33
+ * @remarks
34
+ * The SceneCanvas component is responsible for rendering the 3D scene and handling user interactions. It provides a context for child components to access viewport state and control functions.
35
+ * The component supports gesture handling for dragging, pinching, and zooming, allowing users to manipulate the view of the scene.
36
+ * The controls drawer provides additional user interactions and settings for the scene.
37
+ * @see {@link SceneRenderer} for rendering the 3D scene.
38
+ * @see {@link ControlsDrawer} for additional user controls and settings.
39
+ * @see {@link SceneProvider} for context management of the scene state.
40
+ * @see {@link useLayoutConfig} for responsive layout configuration based on device type.
41
+ */
42
+ export interface SceneCanvasProps {
43
+ globalX: number;
44
+ globalY: number;
45
+ setGlobalX: (x: number) => void;
46
+ setGlobalY: (y: number) => void;
47
+ autoHeading?: number;
48
+ isDesktopMode: boolean;
49
+ isFullscreen: boolean;
50
+ isMobile: boolean;
51
+ onToggleFullscreen: () => void;
52
+ onRegenerateMap: () => void;
53
+ joystickProps?: {
54
+ joy: JoyState;
55
+ lw: number;
56
+ rw: number;
57
+ onJoyChange: (j: JoyState) => void;
58
+ };
59
+ children: React.ReactNode;
60
+ }
61
+ /**
62
+ * @component SceneCanvas
63
+ * @description Viewport container for the visualizer engine. Owns gesture handling, viewport state, and the SceneContext that HUD children consume.
64
+ * @param {SceneCanvasProps} props - Properties for the component.
65
+ * @returns {JSX.Element} A React element representing the scene canvas.
66
+ * @remarks
67
+ * The SceneCanvas component serves as the main container for the 3D scene visualizer. It manages user interactions such as dragging, pinching, and zooming to manipulate the view of the scene.
68
+ * The component provides a context for child components to access viewport state and control functions.
69
+ * It also includes a controls drawer for additional user interactions and settings.
70
+ * @see {@link SceneRenderer} for rendering the 3D scene.
71
+ * @see {@link ControlsDrawer} for additional user controls and settings.
72
+ * @see {@link SceneProvider} for context management of the scene state.
73
+ * @see {@link useLayoutConfig} for responsive layout configuration based on device type.
74
+ * @example
75
+ * <SceneCanvas
76
+ * globalX={0}
77
+ * globalY={0}
78
+ * setGlobalX={(x) => console.log('Set Global X:', x)}
79
+ * setGlobalY={(y) => console.log('Set Global Y:', y)}
80
+ * isDesktopMode={true}
81
+ * isFullscreen={false}
82
+ * isMobile={false}
83
+ * onToggleFullscreen={() => console.log('Toggle Fullscreen')}
84
+ * onRegenerateMap={() => console.log('Regenerate Map')}
85
+ * joystickProps={{
86
+ * joy: { x: 0, y: 0 },
87
+ * lw: 0,
88
+ * rw: 0,
89
+ * onJoyChange: (j) => console.log('Joystick Changed:', j),
90
+ * }}
91
+ * >
92
+ * <SomeChildComponent />
93
+ * </SceneCanvas>
94
+ */
95
+ export declare const SceneCanvas: React.FC<SceneCanvasProps>;
96
+ //# sourceMappingURL=SceneCanvas.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SceneCanvas.d.ts","sourceRoot":"","sources":["../../../src/components/scenes/SceneCanvas.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAO1B,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAM5C;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,MAAM,WAAW,gBAAgB;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IAChC,UAAU,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IAChC,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB,aAAa,EAAE,OAAO,CAAC;IACvB,YAAY,EAAE,OAAO,CAAC;IACtB,QAAQ,EAAE,OAAO,CAAC;IAClB,kBAAkB,EAAE,MAAM,IAAI,CAAC;IAE/B,eAAe,EAAE,MAAM,IAAI,CAAC;IAE5B,aAAa,CAAC,EAAE;QACZ,GAAG,EAAE,QAAQ,CAAC;QACd,EAAE,EAAE,MAAM,CAAC;QACX,EAAE,EAAE,MAAM,CAAC;QACX,WAAW,EAAE,CAAC,CAAC,EAAE,QAAQ,KAAK,IAAI,CAAC;KACtC,CAAC;IAEF,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;CAC7B;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AACH,eAAO,MAAM,WAAW,EAAE,KAAK,CAAC,EAAE,CAAC,gBAAgB,CAgJlD,CAAC"}
@@ -0,0 +1,151 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ /**
3
+ * @file SceneCanvas.tsx
4
+ * @description Viewport container for the visualizer engine. Owns gesture handling,
5
+ * viewport state, and the SceneContext that HUD children consume.
6
+ * Renamed from MapCanvas.tsx; uses SceneProvider instead of MapCanvasProvider.
7
+ * @remarks
8
+ * This component serves as the main container for the 3D scene visualizer. It manages user interactions such as dragging, pinching, and zooming to manipulate the view of the scene.
9
+ * The component provides a context for child components to access viewport state and control functions.
10
+ * It also includes a controls drawer for additional user interactions and settings.
11
+ */
12
+ import React from 'react';
13
+ import { Box, useTheme, alpha } from '@mui/material';
14
+ import { useGesture } from '@use-gesture/react';
15
+ import { SceneRenderer } from './SceneRenderer';
16
+ import { ControlsDrawer } from '../controls/ControlsDrawer';
17
+ import { SceneProvider } from '../../contexts/SceneContext';
18
+ import { useLayoutConfig } from '../../hooks/useLayoutConfig';
19
+ import { GLOBAL_CELL_SIZE } from '../../types';
20
+ const ISO_COS30 = Math.cos(Math.PI / 6);
21
+ const ISO_SIN30 = Math.sin(Math.PI / 6);
22
+ /**
23
+ * @component SceneCanvas
24
+ * @description Viewport container for the visualizer engine. Owns gesture handling, viewport state, and the SceneContext that HUD children consume.
25
+ * @param {SceneCanvasProps} props - Properties for the component.
26
+ * @returns {JSX.Element} A React element representing the scene canvas.
27
+ * @remarks
28
+ * The SceneCanvas component serves as the main container for the 3D scene visualizer. It manages user interactions such as dragging, pinching, and zooming to manipulate the view of the scene.
29
+ * The component provides a context for child components to access viewport state and control functions.
30
+ * It also includes a controls drawer for additional user interactions and settings.
31
+ * @see {@link SceneRenderer} for rendering the 3D scene.
32
+ * @see {@link ControlsDrawer} for additional user controls and settings.
33
+ * @see {@link SceneProvider} for context management of the scene state.
34
+ * @see {@link useLayoutConfig} for responsive layout configuration based on device type.
35
+ * @example
36
+ * <SceneCanvas
37
+ * globalX={0}
38
+ * globalY={0}
39
+ * setGlobalX={(x) => console.log('Set Global X:', x)}
40
+ * setGlobalY={(y) => console.log('Set Global Y:', y)}
41
+ * isDesktopMode={true}
42
+ * isFullscreen={false}
43
+ * isMobile={false}
44
+ * onToggleFullscreen={() => console.log('Toggle Fullscreen')}
45
+ * onRegenerateMap={() => console.log('Regenerate Map')}
46
+ * joystickProps={{
47
+ * joy: { x: 0, y: 0 },
48
+ * lw: 0,
49
+ * rw: 0,
50
+ * onJoyChange: (j) => console.log('Joystick Changed:', j),
51
+ * }}
52
+ * >
53
+ * <SomeChildComponent />
54
+ * </SceneCanvas>
55
+ */
56
+ export const SceneCanvas = ({ globalX, globalY, setGlobalX, setGlobalY, autoHeading, isDesktopMode, isFullscreen, isMobile, onToggleFullscreen, onRegenerateMap, joystickProps, children, }) => {
57
+ const theme = useTheme();
58
+ const layout = useLayoutConfig(isDesktopMode);
59
+ const [viewOffset, setViewOffset] = React.useState({ x: 0, y: 0 });
60
+ const [userScale, setUserScale] = React.useState(1);
61
+ const userScaleRef = React.useRef(userScale);
62
+ React.useEffect(() => { userScaleRef.current = userScale; }, [userScale]);
63
+ const [followLocalGrid, setFollowLocalGrid] = React.useState(false);
64
+ // Update view offset when following local grid and global coordinates change
65
+ React.useEffect(() => {
66
+ if (!followLocalGrid)
67
+ return;
68
+ const scale = layout.mapScale * userScale;
69
+ const wx = globalX * GLOBAL_CELL_SIZE * scale;
70
+ const wy = globalY * GLOBAL_CELL_SIZE * scale;
71
+ setViewOffset({ x: -(wx - wy) * ISO_COS30, y: -(wx + wy) * ISO_SIN30 });
72
+ }, [followLocalGrid, globalX, globalY, layout.mapScale, userScale]);
73
+ const [controlsDrawerOpen, setControlsDrawerOpen] = React.useState(false);
74
+ const containerRef = React.useRef(null);
75
+ /**
76
+ * @function useGesture
77
+ * @description Hook to handle user gestures for dragging, pinching, and zooming.
78
+ * @remarks
79
+ * This hook sets up event listeners for drag, pinch, and wheel events on the container element.
80
+ * It updates the view offset and user scale based on user interactions.
81
+ * The drag event updates the view offset unless the user is pinching.
82
+ * The pinch event adjusts the user scale within a defined range (0.1 to 10).
83
+ * The wheel event also adjusts the user scale based on the scroll direction.
84
+ */
85
+ useGesture({
86
+ onDrag: ({ delta: [dx, dy], pinching }) => {
87
+ if (pinching)
88
+ return;
89
+ setFollowLocalGrid(false);
90
+ setViewOffset(prev => ({ x: prev.x + dx, y: prev.y + dy }));
91
+ },
92
+ onPinch: ({ offset: [scale] }) => {
93
+ setUserScale(Math.max(0.1, Math.min(scale, 10)));
94
+ },
95
+ onWheel: ({ delta: [, dy] }) => {
96
+ setUserScale(prev => Math.max(0.1, Math.min(prev * (dy > 0 ? 0.9 : 1.1), 10)));
97
+ },
98
+ }, {
99
+ target: containerRef,
100
+ drag: { filterTaps: true },
101
+ pinch: { from: () => [userScaleRef.current, 0] },
102
+ wheel: { preventDefault: true },
103
+ eventOptions: { passive: false },
104
+ });
105
+ const resetView = React.useCallback(() => {
106
+ setFollowLocalGrid(false);
107
+ setViewOffset({ x: 0, y: 0 });
108
+ setUserScale(1);
109
+ }, []);
110
+ const onToggleFollowLocalGrid = React.useCallback(() => {
111
+ setFollowLocalGrid(prev => !prev);
112
+ }, []);
113
+ const ctxValue = React.useMemo(() => ({
114
+ isDesktopMode,
115
+ isFullscreen,
116
+ isMobile,
117
+ hasJoystick: !!joystickProps,
118
+ onToggleFullscreen,
119
+ onOpenControlsDrawer: () => setControlsDrawerOpen(true),
120
+ viewOffset,
121
+ userScale,
122
+ resetView,
123
+ followLocalGrid,
124
+ onToggleFollowLocalGrid,
125
+ }), [isDesktopMode, isFullscreen, isMobile, joystickProps, onToggleFullscreen, viewOffset, userScale, resetView, followLocalGrid, onToggleFollowLocalGrid]);
126
+ return (_jsxs(SceneProvider, { value: ctxValue, children: [_jsxs(Box, { ref: containerRef, onDoubleClick: resetView, sx: {
127
+ touchAction: 'none',
128
+ position: 'relative',
129
+ bgcolor: theme.palette.scene.skyMid,
130
+ borderRadius: { xs: 0, sm: 3 },
131
+ overflow: 'hidden',
132
+ boxShadow: `0 25px 50px -12px ${alpha(theme.palette.common.black, 0.5)}`,
133
+ border: isDesktopMode ? `1px solid ${alpha(theme.palette.common.white, 0.1)}` : 'none',
134
+ ...(isFullscreen ? {
135
+ flex: 1,
136
+ minHeight: 0,
137
+ maxHeight: 'none',
138
+ '& svg': { height: '100% !important' },
139
+ } : {
140
+ aspectRatio: { xs: '4/3', md: '16/9' },
141
+ maxHeight: '70vh',
142
+ }),
143
+ }, children: [_jsx(SceneRenderer, { width: layout.mapWidth, height: layout.mapHeight, scale: layout.mapScale * userScale, offset: viewOffset, preserveAspectRatio: isFullscreen ? 'xMidYMid slice' : undefined, interactionProps: {}, mappingData: {
144
+ globalX,
145
+ globalY,
146
+ setGlobalX,
147
+ setGlobalY,
148
+ localRotationOverride: autoHeading,
149
+ } }), children] }), _jsx(ControlsDrawer, { open: controlsDrawerOpen, onClose: () => setControlsDrawerOpen(false), onRegenerateMap: onRegenerateMap })] }));
150
+ };
151
+ //# sourceMappingURL=SceneCanvas.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SceneCanvas.js","sourceRoot":"","sources":["../../../src/components/scenes/SceneCanvas.tsx"],"names":[],"mappings":"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"}