@zendir/ui 0.2.20 → 0.3.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.
- package/CHANGELOG.md +192 -1
- package/README.md +70 -28
- package/dist/index.d.ts +1 -1
- package/dist/index.js +57 -41
- package/dist/index.js.map +1 -1
- package/dist/react/3d/CesiumCaptureSource.d.ts +119 -0
- package/dist/react/3d/CesiumCaptureSource.js +307 -0
- package/dist/react/3d/CesiumCaptureSource.js.map +1 -0
- package/dist/react/3d/ZenSpace3D.js +1253 -0
- package/dist/react/3d/ZenSpace3D.js.map +1 -0
- package/dist/react/3d/ZenSpace3DCesium.js +579 -0
- package/dist/react/3d/ZenSpace3DCesium.js.map +1 -0
- package/dist/react/3d/ZenSpace3DTypes.d.ts +28 -1
- package/dist/react/3d/ZenSpace3DUtils.d.ts +17 -173
- package/dist/react/3d/ZenSpace3DUtils.js +28 -0
- package/dist/react/3d/ZenSpace3DUtils.js.map +1 -0
- package/dist/react/3d/capturePngAnalysis.d.ts +16 -0
- package/dist/react/3d/index.d.ts +10 -12
- package/dist/react/3d/threeLoader.js +18 -0
- package/dist/react/3d/threeLoader.js.map +1 -0
- package/dist/react/astro/MonitoringIcon.js +1 -1
- package/dist/react/astro/MonitoringIcon.js.map +1 -1
- package/dist/react/astro/SimulationControls.js +2 -2
- package/dist/react/astro/SimulationControls.js.map +1 -1
- package/dist/react/astro/UnifiedTimeline.js +4 -4
- package/dist/react/astro/UnifiedTimeline.js.map +1 -1
- package/dist/react/charts/GroundTrackMap.d.ts +2 -15
- package/dist/react/charts/GroundTrackMap.js +1 -1
- package/dist/react/charts/GroundTrackMap.js.map +1 -1
- package/dist/react/charts/unified/AstroChart.js +34 -13
- package/dist/react/charts/unified/AstroChart.js.map +1 -1
- package/dist/react/chatgpt/AppCard.d.ts +0 -4
- package/dist/react/chatgpt/index.d.ts +0 -19
- package/dist/react/context/SpatialSelectionContext.d.ts +40 -0
- package/dist/react/context/SpatialSelectionContext.js +10 -0
- package/dist/react/context/SpatialSelectionContext.js.map +1 -0
- package/dist/react/context/index.d.ts +2 -0
- package/dist/react/core/{DataTable.d.ts → data/DataTable.d.ts} +1 -1
- package/dist/react/core/{DataTable.js → data/DataTable.js} +4 -4
- package/dist/react/core/data/DataTable.js.map +1 -0
- package/dist/react/core/{DataValue.d.ts → data/DataValue.d.ts} +2 -2
- package/dist/react/core/{DataValue.js → data/DataValue.js} +2 -2
- package/dist/react/core/data/DataValue.js.map +1 -0
- package/dist/react/core/{propertyConfig.d.ts → data/propertyConfig.d.ts} +2 -2
- package/dist/react/core/data/propertyConfig.js.map +1 -0
- package/dist/react/core/{AstroIcon.js → display/AstroIcon.js} +1 -1
- package/dist/react/core/display/AstroIcon.js.map +1 -0
- package/dist/react/core/{Badge.d.ts → display/Badge.d.ts} +1 -1
- package/dist/react/core/{Badge.js → display/Badge.js} +2 -2
- package/dist/react/core/display/Badge.js.map +1 -0
- package/dist/react/core/{CardHeader.d.ts → display/CardHeader.d.ts} +1 -1
- package/dist/react/core/{CardHeader.js → display/CardHeader.js} +2 -2
- package/dist/react/core/display/CardHeader.js.map +1 -0
- package/dist/react/core/{Container.d.ts → display/Container.d.ts} +1 -1
- package/dist/react/core/{Container.js → display/Container.js} +3 -3
- package/dist/react/core/display/Container.js.map +1 -0
- package/dist/react/core/{CopyButton.js → display/CopyButton.js} +1 -1
- package/dist/react/core/display/CopyButton.js.map +1 -0
- package/dist/react/core/{GlassCard.d.ts → display/GlassCard.d.ts} +1 -1
- package/dist/react/core/{GlassCard.js → display/GlassCard.js} +2 -2
- package/dist/react/core/display/GlassCard.js.map +1 -0
- package/dist/react/core/{HeaderIconWithStatus.d.ts → display/HeaderIconWithStatus.d.ts} +1 -1
- package/dist/react/core/{HeaderIconWithStatus.js → display/HeaderIconWithStatus.js} +1 -1
- package/dist/react/core/display/HeaderIconWithStatus.js.map +1 -0
- package/dist/react/core/{Icon.d.ts → display/Icon.d.ts} +1 -1
- package/dist/react/core/{Icon.js → display/Icon.js} +1 -1
- package/dist/react/core/display/Icon.js.map +1 -0
- package/dist/react/core/{Typography.d.ts → display/Typography.d.ts} +13 -4
- package/dist/react/core/{Typography.js → display/Typography.js} +1 -1
- package/dist/react/core/display/Typography.js.map +1 -0
- package/dist/react/core/{ConfirmDialog.js → feedback/ConfirmDialog.js} +1 -1
- package/dist/react/core/feedback/ConfirmDialog.js.map +1 -0
- package/dist/react/core/{Dialog.js → feedback/Dialog.js} +2 -2
- package/dist/react/core/feedback/Dialog.js.map +1 -0
- package/dist/react/core/{Toast.js → feedback/Toast.js} +3 -3
- package/dist/react/core/feedback/Toast.js.map +1 -0
- package/dist/react/core/index.d.ts +85 -83
- package/dist/react/core/{Button.js → inputs/Button.js} +2 -2
- package/dist/react/core/inputs/Button.js.map +1 -0
- package/dist/react/core/{Checkbox.js → inputs/Checkbox.js} +2 -2
- package/dist/react/core/inputs/Checkbox.js.map +1 -0
- package/dist/react/core/{Input.d.ts → inputs/Input.d.ts} +1 -1
- package/dist/react/core/{Input.js → inputs/Input.js} +3 -3
- package/dist/react/core/inputs/Input.js.map +1 -0
- package/dist/react/core/{LimitsBar.js → inputs/LimitsBar.js} +1 -1
- package/dist/react/core/inputs/LimitsBar.js.map +1 -0
- package/dist/react/core/{NumberInput.d.ts → inputs/NumberInput.d.ts} +2 -2
- package/dist/react/core/{NumberInput.js → inputs/NumberInput.js} +3 -3
- package/dist/react/core/inputs/NumberInput.js.map +1 -0
- package/dist/react/core/{PinInput.js → inputs/PinInput.js} +2 -2
- package/dist/react/core/inputs/PinInput.js.map +1 -0
- package/dist/react/core/{Select.js → inputs/Select.js} +3 -3
- package/dist/react/core/inputs/Select.js.map +1 -0
- package/dist/react/core/{Toggle.js → inputs/Toggle.js} +2 -2
- package/dist/react/core/inputs/Toggle.js.map +1 -0
- package/dist/react/core/{AppBar.d.ts → navigation/AppBar.d.ts} +1 -1
- package/dist/react/core/{AppBar.js → navigation/AppBar.js} +7 -7
- package/dist/react/core/navigation/AppBar.js.map +1 -0
- package/dist/react/core/{Pagination.js → navigation/Pagination.js} +2 -2
- package/dist/react/core/navigation/Pagination.js.map +1 -0
- package/dist/react/core/{SideNav.d.ts → navigation/SideNav.d.ts} +1 -1
- package/dist/react/core/{SideNav.js → navigation/SideNav.js} +8 -9
- package/dist/react/core/navigation/SideNav.js.map +1 -0
- package/dist/react/core/{Tabs.js → navigation/Tabs.js} +2 -2
- package/dist/react/core/navigation/Tabs.js.map +1 -0
- package/dist/react/core/{Popover.js → overlays/Popover.js} +1 -1
- package/dist/react/core/overlays/Popover.js.map +1 -0
- package/dist/react/core/{SidePanel.js → overlays/SidePanel.js} +7 -7
- package/dist/react/core/overlays/SidePanel.js.map +1 -0
- package/dist/react/core/{Tooltip.js → overlays/Tooltip.js} +2 -2
- package/dist/react/core/overlays/Tooltip.js.map +1 -0
- package/dist/react/core/{ActivityPlanner.js → widgets/ActivityPlanner.js} +1 -1
- package/dist/react/core/widgets/ActivityPlanner.js.map +1 -0
- package/dist/react/core/widgets/Capture.d.ts +140 -0
- package/dist/react/core/widgets/Capture.js +804 -0
- package/dist/react/core/widgets/Capture.js.map +1 -0
- package/dist/react/core/{ChatPanel.d.ts → widgets/ChatPanel.d.ts} +1 -1
- package/dist/react/core/{ChatPanel.js → widgets/ChatPanel.js} +5 -4
- package/dist/react/core/widgets/ChatPanel.js.map +1 -0
- package/dist/react/core/{ColorPickerPanel.d.ts → widgets/ColorPickerPanel.d.ts} +1 -1
- package/dist/react/core/{ColorPickerPanel.js → widgets/ColorPickerPanel.js} +3 -3
- package/dist/react/core/widgets/ColorPickerPanel.js.map +1 -0
- package/dist/react/core/{CommandBuilder.js → widgets/CommandBuilder.js} +1 -1
- package/dist/react/core/widgets/CommandBuilder.js.map +1 -0
- package/dist/react/core/{ConnectionForm.d.ts → widgets/ConnectionForm.d.ts} +1 -1
- package/dist/react/core/{ConnectionForm.js → widgets/ConnectionForm.js} +2 -2
- package/dist/react/core/widgets/ConnectionForm.js.map +1 -0
- package/dist/react/core/{FileExplorer.js → widgets/FileExplorer.js} +2 -2
- package/dist/react/core/widgets/FileExplorer.js.map +1 -0
- package/dist/react/core/{HexViewer.js → widgets/HexViewer.js} +1 -1
- package/dist/react/core/widgets/HexViewer.js.map +1 -0
- package/dist/react/core/{ImageGallery.d.ts → widgets/ImageGallery.d.ts} +1 -1
- package/dist/react/core/{ImageGallery.js → widgets/ImageGallery.js} +3 -3
- package/dist/react/core/widgets/ImageGallery.js.map +1 -0
- package/dist/react/core/{LogViewer.d.ts → widgets/LogViewer.d.ts} +13 -3
- package/dist/react/core/{LogViewer.js → widgets/LogViewer.js} +28 -8
- package/dist/react/core/widgets/LogViewer.js.map +1 -0
- package/dist/react/core/{MessageStream.d.ts → widgets/MessageStream.d.ts} +2 -2
- package/dist/react/core/{MessageStream.js → widgets/MessageStream.js} +4 -4
- package/dist/react/core/widgets/MessageStream.js.map +1 -0
- package/dist/react/core/{MissionCalendar.js → widgets/MissionCalendar.js} +2 -2
- package/dist/react/core/widgets/MissionCalendar.js.map +1 -0
- package/dist/react/core/{PacketViewer.js → widgets/PacketViewer.js} +1 -1
- package/dist/react/core/widgets/PacketViewer.js.map +1 -0
- package/dist/react/core/widgets/capture-placeholder.png.js +5 -0
- package/dist/react/core/widgets/capture-placeholder.png.js.map +1 -0
- package/dist/react/hooks/index.d.ts +9 -11
- package/dist/react/hooks/useAccessWindows.d.ts +15 -19
- package/dist/react/hooks/useGroundTrackHistory.d.ts +34 -0
- package/dist/react/hooks/useSimulationScene.d.ts +141 -0
- package/dist/react/hooks/useSimulationScene.js +401 -0
- package/dist/react/hooks/useSimulationScene.js.map +1 -0
- package/dist/react/hooks/useZendirSession.d.ts +44 -69
- package/dist/react/index.d.ts +10 -5
- package/dist/react/panels/LayerControlPanel.d.ts +54 -0
- package/dist/react/panels/LayerControlPanel.js +184 -0
- package/dist/react/panels/LayerControlPanel.js.map +1 -0
- package/dist/react/panels/ObjectInventoryPanel.d.ts +57 -0
- package/dist/react/panels/ObjectInventoryPanel.js +261 -0
- package/dist/react/panels/ObjectInventoryPanel.js.map +1 -0
- package/dist/react/panels/index.d.ts +15 -0
- package/dist/react/theme/ThemeProvider.d.ts +2 -0
- package/dist/react/theme/ThemeProvider.js +50 -72
- package/dist/react/theme/ThemeProvider.js.map +1 -1
- package/dist/react/types.d.ts +32 -3
- package/dist/react/types.js.map +1 -1
- package/dist/react.js +57 -41
- package/dist/react.js.map +1 -1
- package/dist/shaders/atmosphere.frag.js +5 -0
- package/dist/shaders/atmosphere.frag.js.map +1 -0
- package/dist/shaders/atmosphere.vert.js +5 -0
- package/dist/shaders/atmosphere.vert.js.map +1 -0
- package/dist/shaders/stars.frag.js +5 -0
- package/dist/shaders/stars.frag.js.map +1 -0
- package/dist/shaders/stars.vert.js +5 -0
- package/dist/shaders/stars.vert.js.map +1 -0
- package/dist/style.css +6 -4
- package/dist/tokens/css-vars.d.ts +91 -0
- package/dist/tokens/css-vars.js +228 -0
- package/dist/tokens/css-vars.js.map +1 -0
- package/dist/tokens/index.d.ts +71 -18
- package/dist/tokens/index.js +206 -97
- package/dist/tokens/index.js.map +1 -1
- package/dist/tokens/tokens.css +50 -50
- package/package.json +27 -22
- package/sdk-stub.js +10 -5
- package/dist/react/3d/EarthViewer.d.ts +0 -46
- package/dist/react/3d/SolarSystemViewer.d.ts +0 -43
- package/dist/react/chatgpt/ChatGPTCard.d.ts +0 -6
- package/dist/react/core/ActivityPlanner.js.map +0 -1
- package/dist/react/core/AppBar.js.map +0 -1
- package/dist/react/core/AstroIcon.js.map +0 -1
- package/dist/react/core/Badge.js.map +0 -1
- package/dist/react/core/Button.js.map +0 -1
- package/dist/react/core/CardHeader.js.map +0 -1
- package/dist/react/core/ChatPanel.js.map +0 -1
- package/dist/react/core/Checkbox.js.map +0 -1
- package/dist/react/core/ColorPickerPanel.js.map +0 -1
- package/dist/react/core/CommandBuilder.js.map +0 -1
- package/dist/react/core/ConfirmDialog.js.map +0 -1
- package/dist/react/core/ConnectionForm.js.map +0 -1
- package/dist/react/core/Container.js.map +0 -1
- package/dist/react/core/CopyButton.js.map +0 -1
- package/dist/react/core/DataTable.js.map +0 -1
- package/dist/react/core/DataValue.js.map +0 -1
- package/dist/react/core/Dialog.js.map +0 -1
- package/dist/react/core/FileExplorer.js.map +0 -1
- package/dist/react/core/GlassCard.js.map +0 -1
- package/dist/react/core/HeaderIconWithStatus.js.map +0 -1
- package/dist/react/core/HexViewer.js.map +0 -1
- package/dist/react/core/Icon.js.map +0 -1
- package/dist/react/core/ImageGallery.js.map +0 -1
- package/dist/react/core/Input.js.map +0 -1
- package/dist/react/core/LimitsBar.js.map +0 -1
- package/dist/react/core/LogViewer.js.map +0 -1
- package/dist/react/core/MessageStream.js.map +0 -1
- package/dist/react/core/MissionCalendar.js.map +0 -1
- package/dist/react/core/NumberInput.js.map +0 -1
- package/dist/react/core/PacketViewer.js.map +0 -1
- package/dist/react/core/Pagination.js.map +0 -1
- package/dist/react/core/PinInput.js.map +0 -1
- package/dist/react/core/Popover.js.map +0 -1
- package/dist/react/core/Select.js.map +0 -1
- package/dist/react/core/SideNav.js.map +0 -1
- package/dist/react/core/SidePanel.js.map +0 -1
- package/dist/react/core/Tabs.js.map +0 -1
- package/dist/react/core/Toast.js.map +0 -1
- package/dist/react/core/Toggle.js.map +0 -1
- package/dist/react/core/Tooltip.js.map +0 -1
- package/dist/react/core/Typography.js.map +0 -1
- package/dist/react/core/propertyConfig.js.map +0 -1
- package/dist/react/hooks/useSimulationTime.d.ts +0 -61
- package/dist/react/hooks/useSpacecraftPosition.d.ts +0 -50
- package/dist/react/hooks/useTelemetry.d.ts +0 -55
- package/dist/types.d.ts +0 -1
- package/dist/types.js +0 -2
- package/dist/types.js.map +0 -1
- /package/dist/react/core/{propertyConfig.js → data/propertyConfig.js} +0 -0
- /package/dist/react/core/{AstroIcon.d.ts → display/AstroIcon.d.ts} +0 -0
- /package/dist/react/core/{CopyButton.d.ts → display/CopyButton.d.ts} +0 -0
- /package/dist/react/core/{ConfirmDialog.d.ts → feedback/ConfirmDialog.d.ts} +0 -0
- /package/dist/react/core/{Dialog.d.ts → feedback/Dialog.d.ts} +0 -0
- /package/dist/react/core/{Toast.d.ts → feedback/Toast.d.ts} +0 -0
- /package/dist/react/core/{Button.d.ts → inputs/Button.d.ts} +0 -0
- /package/dist/react/core/{Checkbox.d.ts → inputs/Checkbox.d.ts} +0 -0
- /package/dist/react/core/{LimitsBar.d.ts → inputs/LimitsBar.d.ts} +0 -0
- /package/dist/react/core/{PinInput.d.ts → inputs/PinInput.d.ts} +0 -0
- /package/dist/react/core/{Select.d.ts → inputs/Select.d.ts} +0 -0
- /package/dist/react/core/{Toggle.d.ts → inputs/Toggle.d.ts} +0 -0
- /package/dist/react/core/{Pagination.d.ts → navigation/Pagination.d.ts} +0 -0
- /package/dist/react/core/{Tabs.d.ts → navigation/Tabs.d.ts} +0 -0
- /package/dist/react/core/{Popover.d.ts → overlays/Popover.d.ts} +0 -0
- /package/dist/react/core/{SidePanel.d.ts → overlays/SidePanel.d.ts} +0 -0
- /package/dist/react/core/{Tooltip.d.ts → overlays/Tooltip.d.ts} +0 -0
- /package/dist/react/core/{ActivityPlanner.d.ts → widgets/ActivityPlanner.d.ts} +0 -0
- /package/dist/react/core/{CommandBuilder.d.ts → widgets/CommandBuilder.d.ts} +0 -0
- /package/dist/react/core/{FileExplorer.d.ts → widgets/FileExplorer.d.ts} +0 -0
- /package/dist/react/core/{HexViewer.d.ts → widgets/HexViewer.d.ts} +0 -0
- /package/dist/react/core/{MissionCalendar.d.ts → widgets/MissionCalendar.d.ts} +0 -0
- /package/dist/react/core/{PacketViewer.d.ts → widgets/PacketViewer.d.ts} +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ZenSpace3D.js","sources":["../../../src/react/3d/ZenSpace3D.tsx"],"sourcesContent":["/**\r\n * @zendir/ui - ZenSpace3D Component (Optimized)\r\n * \r\n * Professional 3D space visualization with smooth interactions.\r\n * Optimized for performance with settings from EarthViewer.\r\n */\r\n\r\nimport React, {\r\n useRef,\r\n useEffect,\r\n useState,\r\n useCallback,\r\n useImperativeHandle,\r\n forwardRef,\r\n useMemo,\r\n} from 'react';\r\nimport { useTheme } from '../theme';\r\nimport { AstroIcon, type AstroIconName } from '../core/display/AstroIcon';\r\nimport type { GroundStation as _GroundStation } from '../types';\r\nimport type {\r\n ZenSpace3DProps,\r\n ZenSpace3DHandle,\r\n ViewMode,\r\n SpaceObject,\r\n Vector3D,\r\n CameraState,\r\n LayerVisibility,\r\n SelectionState,\r\n OverpassInfo,\r\n} from './ZenSpace3DTypes';\r\nimport {\r\n latLonAltToCartesian,\r\n SCENE_EARTH_RADIUS,\r\n KM_TO_SCENE,\r\n easeOutCubic,\r\n} from './ZenSpace3DUtils';\r\nimport { formatDuration } from '../utils';\r\n\r\n// Import shaders as raw text (like EarthViewer)\r\nimport atmosphereVertexShader from '../../shaders/atmosphere.vert?raw';\r\nimport atmosphereFragmentShader from '../../shaders/atmosphere.frag?raw';\r\nimport starsVertexShader from '../../shaders/stars.vert?raw';\r\nimport starsFragmentShader from '../../shaders/stars.frag?raw';\r\nimport { loadThree, ThreeModule } from './threeLoader';\r\nimport { ZenSpace3DCesium } from './ZenSpace3DCesium';\r\n\r\n// =============================================================================\r\n// Communication Link Types\r\n// =============================================================================\r\n\r\nexport interface CommunicationLink {\r\n id: string;\r\n fromId: string;\r\n toId: string;\r\n type: 'uplink' | 'downlink' | 'crosslink' | 'relay';\r\n status: 'active' | 'idle' | 'blocked';\r\n color?: string;\r\n bandwidth?: number;\r\n latency?: number;\r\n signalStrength?: number;\r\n}\r\n\r\n// =============================================================================\r\n// Configuration - Optimized for smooth interactions\r\n// =============================================================================\r\n\r\nconst DEFAULT_LAYERS: LayerVisibility = {\r\n planets: true,\r\n moons: true,\r\n satellites: true,\r\n debris: false,\r\n stations: true,\r\n asteroids: false,\r\n groundStations: true,\r\n orbits: true,\r\n labels: true,\r\n constellations: false,\r\n coverage: true,\r\n atmosphere: true,\r\n stars: true,\r\n grid: false,\r\n terminator: true,\r\n};\r\n\r\nconst CAMERA_TRANSITION_DURATION = 2000;\r\nconst STARS_COUNT = 5000; // Reduced from 8000\r\nconst EARTH_SEGMENTS = 64; // Reduced from 128\r\nconst EARTH_SEGMENTS_V = 32; // Reduced from 64\r\nconst SPHERICAL_SUBDIVISIONS = 16; // Subdivisions for curved edges on coverage\r\n\r\nfunction checkWebGLCapabilities(): { available: boolean; version: number } {\r\n try {\r\n const canvas = document.createElement('canvas');\r\n const gl2 = canvas.getContext('webgl2');\r\n if (gl2) return { available: true, version: 2 };\r\n const gl = canvas.getContext('webgl');\r\n if (gl) return { available: true, version: 1 };\r\n } catch { /* WebGL not available */ }\r\n return { available: false, version: 0 };\r\n}\r\n\r\n// =============================================================================\r\n// Spherical Geometry Helpers - For realistic curved coverage on sphere\r\n// =============================================================================\r\n\r\n/**\r\n * Spherical linear interpolation (SLERP) between two unit vectors\r\n * Creates smooth arc along the sphere surface\r\n */\r\nfunction slerp(v1: { x: number; y: number; z: number }, v2: { x: number; y: number; z: number }, t: number): { x: number; y: number; z: number } {\r\n // Normalize inputs\r\n const len1 = Math.sqrt(v1.x * v1.x + v1.y * v1.y + v1.z * v1.z);\r\n const len2 = Math.sqrt(v2.x * v2.x + v2.y * v2.y + v2.z * v2.z);\r\n \r\n // Handle zero-length vectors\r\n if (len1 < 0.0001 || len2 < 0.0001) {\r\n return { x: v1.x, y: v1.y, z: v1.z };\r\n }\r\n \r\n const n1 = { x: v1.x / len1, y: v1.y / len1, z: v1.z / len1 };\r\n const n2 = { x: v2.x / len2, y: v2.y / len2, z: v2.z / len2 };\r\n \r\n // Calculate angle between vectors\r\n let dot = n1.x * n2.x + n1.y * n2.y + n1.z * n2.z;\r\n dot = Math.max(-1, Math.min(1, dot)); // Clamp for numerical stability\r\n const theta = Math.acos(dot);\r\n \r\n if (theta < 0.001) {\r\n // Vectors are nearly parallel, use linear interpolation\r\n return {\r\n x: n1.x + t * (n2.x - n1.x),\r\n y: n1.y + t * (n2.y - n1.y),\r\n z: n1.z + t * (n2.z - n1.z)\r\n };\r\n }\r\n \r\n const sinTheta = Math.sin(theta);\r\n if (Math.abs(sinTheta) < 0.0001) {\r\n // Near zero sin, use linear interpolation\r\n return {\r\n x: n1.x + t * (n2.x - n1.x),\r\n y: n1.y + t * (n2.y - n1.y),\r\n z: n1.z + t * (n2.z - n1.z)\r\n };\r\n }\r\n \r\n const a = Math.sin((1 - t) * theta) / sinTheta;\r\n const b = Math.sin(t * theta) / sinTheta;\r\n \r\n return {\r\n x: a * n1.x + b * n2.x,\r\n y: a * n1.y + b * n2.y,\r\n z: a * n1.z + b * n2.z\r\n };\r\n}\r\n\r\n/**\r\n * Subdivide polygon edges along great circles for spherical rendering\r\n * Takes corner points and returns a densely sampled spherical polygon\r\n */\r\nfunction subdivideSphericalPolygon(\r\n corners: Array<{ x: number; y: number; z: number }>,\r\n subdivisions: number,\r\n radius: number\r\n): Array<{ x: number; y: number; z: number }> {\r\n if (corners.length < 3 || subdivisions < 1 || radius <= 0) {\r\n return corners; // Return as-is if invalid params\r\n }\r\n \r\n const result: Array<{ x: number; y: number; z: number }> = [];\r\n \r\n for (let i = 0; i < corners.length; i++) {\r\n const p1 = corners[i];\r\n const p2 = corners[(i + 1) % corners.length];\r\n \r\n // Validate points\r\n if (!isFinite(p1.x) || !isFinite(p1.y) || !isFinite(p1.z) ||\r\n !isFinite(p2.x) || !isFinite(p2.y) || !isFinite(p2.z)) {\r\n continue; // Skip invalid points\r\n }\r\n \r\n // Add interpolated points along the great circle arc\r\n for (let j = 0; j < subdivisions; j++) {\r\n const t = j / subdivisions;\r\n const interpolated = slerp(p1, p2, t);\r\n \r\n // Validate interpolation result\r\n if (!isFinite(interpolated.x) || !isFinite(interpolated.y) || !isFinite(interpolated.z)) {\r\n continue;\r\n }\r\n \r\n // Project onto sphere surface at given radius\r\n const len = Math.sqrt(interpolated.x ** 2 + interpolated.y ** 2 + interpolated.z ** 2);\r\n if (len < 0.0001) continue; // Skip zero-length vectors\r\n \r\n result.push({\r\n x: (interpolated.x / len) * radius,\r\n y: (interpolated.y / len) * radius,\r\n z: (interpolated.z / len) * radius\r\n });\r\n }\r\n }\r\n \r\n return result.length > 0 ? result : corners; // Fallback to original if all failed\r\n}\r\n\r\n// =============================================================================\r\n// Satellite Shape Builders (simplified for performance)\r\n// =============================================================================\r\n\r\nfunction createSatelliteShape(THREE: ThreeModule, category: string, size: number): any {\r\n const group = new THREE.Group();\r\n \r\n if (category === 'station') {\r\n // Simple station shape\r\n const geo = new THREE.BoxGeometry(size * 1.2, size * 0.6, size * 0.6);\r\n const mat = new THREE.MeshBasicMaterial({ color: 0xcccccc });\r\n group.add(new THREE.Mesh(geo, mat));\r\n \r\n // Solar panels\r\n const panelGeo = new THREE.BoxGeometry(size * 2.5, size * 0.03, size * 0.6);\r\n const panelMat = new THREE.MeshBasicMaterial({ color: 0x1a4a7a });\r\n const leftPanel = new THREE.Mesh(panelGeo, panelMat);\r\n leftPanel.position.x = -size * 1.5;\r\n group.add(leftPanel);\r\n const rightPanel = new THREE.Mesh(panelGeo, panelMat);\r\n rightPanel.position.x = size * 1.5;\r\n group.add(rightPanel);\r\n \r\n } else if (category === 'satellite') {\r\n // Simple satellite\r\n const geo = new THREE.BoxGeometry(size * 0.5, size * 0.5, size * 0.6);\r\n const mat = new THREE.MeshBasicMaterial({ color: 0xaaaaaa });\r\n group.add(new THREE.Mesh(geo, mat));\r\n \r\n const panelGeo = new THREE.BoxGeometry(size * 1.2, size * 0.02, size * 0.4);\r\n const panelMat = new THREE.MeshBasicMaterial({ color: 0x1a3a6a });\r\n const leftPanel = new THREE.Mesh(panelGeo, panelMat);\r\n leftPanel.position.x = -size * 0.7;\r\n group.add(leftPanel);\r\n const rightPanel = new THREE.Mesh(panelGeo, panelMat);\r\n rightPanel.position.x = size * 0.7;\r\n group.add(rightPanel);\r\n \r\n } else if (category === 'debris') {\r\n const geo = new THREE.IcosahedronGeometry(size * 0.3, 0);\r\n const mat = new THREE.MeshBasicMaterial({ color: 0x666666 });\r\n group.add(new THREE.Mesh(geo, mat));\r\n } else {\r\n const geo = new THREE.SphereGeometry(size * 0.4, 8, 6);\r\n const mat = new THREE.MeshBasicMaterial({ color: 0x888888 });\r\n group.add(new THREE.Mesh(geo, mat));\r\n }\r\n \r\n return group;\r\n}\r\n\r\n// =============================================================================\r\n// Component\r\n// =============================================================================\r\n\r\nexport const ZenSpace3D = forwardRef<ZenSpace3DHandle, ZenSpace3DProps>(\r\n function ZenSpace3D(props, ref) {\r\n // Prefer Cesium when available (default 3D backend); fall back to Three.js\r\n const [cesiumModule, setCesiumModule] = useState<unknown>(null);\r\n useEffect(() => {\r\n // Cesium is optional peer; fallback to Three.js when not installed\r\n import('cesium').then((m) => setCesiumModule(m)).catch(() => setCesiumModule(null));\r\n }, []);\r\n if (cesiumModule) {\r\n return <ZenSpace3DCesium ref={ref} cesium={cesiumModule} {...props} />;\r\n }\r\n return <ZenSpace3DThree ref={ref} {...props} />;\r\n }\r\n);\r\n\r\n// Three.js implementation — separate component so hook count is consistent (avoids React #300)\r\nconst ZenSpace3DThree = forwardRef<ZenSpace3DHandle, ZenSpace3DProps>(function ZenSpace3DThree(props, ref) {\r\n const {\r\n satellites = [],\r\n debris = [],\r\n stations = [],\r\n groundStations = [],\r\n customObjects = [],\r\n view = 'earth-orbit',\r\n focusedObjectId,\r\n initialCamera,\r\n sunDirection,\r\n planetPositions,\r\n visibilityCones = [],\r\n satelliteCoverages = [],\r\n overpasses: _overpasses = [],\r\n orbitPaths = [],\r\n orbitDesignArcs: _orbitDesignArcs = [],\r\n communicationLinks = [],\r\n showAxisHelper = false,\r\n layers: layerOverrides,\r\n showTools = true,\r\n showInfoPanel = true,\r\n width = '100%',\r\n height = 600,\r\n callbacks,\r\n maxObjects = 10000,\r\n className = '',\r\n style,\r\n } = props;\r\n\r\n const { tokens: _tokens } = useTheme();\r\n const [webglCapabilities] = useState(() => checkWebGLCapabilities());\r\n\r\n // Refs\r\n const containerRef = useRef<HTMLDivElement>(null);\r\n const rendererRef = useRef<any>(null);\r\n const sceneRef = useRef<any>(null);\r\n const cameraRef = useRef<any>(null);\r\n const controlsRef = useRef<any>(null);\r\n const animationRef = useRef<number | null>(null);\r\n const raycasterRef = useRef<any>(null);\r\n const mouseRef = useRef<any>(null);\r\n \r\n const earthRef = useRef<any>(null);\r\n const starsMaterialRef = useRef<any>(null);\r\n const atmosphereMaterialRef = useRef<any>(null);\r\n const objectsGroupRef = useRef<any>(null);\r\n const linksGroupRef = useRef<any>(null);\r\n const conesGroupRef = useRef<any>(null);\r\n const orbitsGroupRef = useRef<any>(null);\r\n const planetsGroupRef = useRef<any>(null);\r\n \r\n const timeRef = useRef(0);\r\n const focusTransitionRef = useRef<any>(null);\r\n const isUserInteractingRef = useRef(false);\r\n const objectMeshMapRef = useRef<Map<string, any>>(new Map());\r\n const isAnimatingRef = useRef(false); // Guard against multiple animation loops\r\n const _sceneInitializedRef = useRef(false); // Prevent duplicate initialization\r\n\r\n // State\r\n const [THREE, setTHREE] = useState<ThreeModule | null>(null);\r\n const threeRef = useRef<ThreeModule | null>(null);\r\n threeRef.current = THREE;\r\n const [OrbitControlsClass, setOrbitControlsClass] = useState<any>(null);\r\n const [isLoading, setIsLoading] = useState(true);\r\n const [error, setError] = useState<string | null>(null);\r\n \r\n const [layers, setLayers] = useState<LayerVisibility>({ ...DEFAULT_LAYERS, ...layerOverrides });\r\n const [selection, setSelection] = useState<SelectionState>({ selectedId: null, selectedObject: null, hoveredId: null });\r\n const [hoverTooltip, setHoverTooltip] = useState<{ visible: boolean; x: number; y: number; object: any }>({ visible: false, x: 0, y: 0, object: null });\r\n const [currentView, setCurrentView] = useState<ViewMode>(view);\r\n \r\n // Ref for view to prevent initScene recreation (fixes flickering on view change)\r\n const currentViewRef = useRef<ViewMode>(view);\r\n\r\n const effectiveLayers = useMemo(() => ({ ...layers, ...layerOverrides }), [layers, layerOverrides]);\r\n\r\n useEffect(() => { \r\n setCurrentView(view); \r\n currentViewRef.current = view;\r\n }, [view]);\r\n\r\n // ==========================================================================\r\n // Load Three.js\r\n // ==========================================================================\r\n \r\n useEffect(() => {\r\n if (!webglCapabilities.available) { setIsLoading(false); return; }\r\n\r\n loadThree()\r\n .then(({ THREE: threeModule, OrbitControls: controls }) => {\r\n setTHREE(threeModule);\r\n setOrbitControlsClass(() => controls);\r\n })\r\n .catch((err) => {\r\n if (import.meta.env.DEV) {\r\n console.error('Failed to load Three.js:', err);\r\n }\r\n setError('Failed to load 3D library');\r\n setIsLoading(false);\r\n });\r\n }, [webglCapabilities.available]);\r\n\r\n // ==========================================================================\r\n // Initialize Scene (Optimized like EarthViewer)\r\n // ==========================================================================\r\n \r\n const initScene = useCallback(() => {\r\n if (!THREE || !containerRef.current || !OrbitControlsClass) return;\r\n \r\n // Clean up any existing scene first (prevents duplicates)\r\n if (rendererRef.current) {\r\n isAnimatingRef.current = false;\r\n if (animationRef.current) {\r\n cancelAnimationFrame(animationRef.current);\r\n animationRef.current = null;\r\n }\r\n controlsRef.current?.dispose();\r\n rendererRef.current.dispose();\r\n if (containerRef.current?.contains(rendererRef.current.domElement)) {\r\n containerRef.current.removeChild(rendererRef.current.domElement);\r\n }\r\n }\r\n\r\n const container = containerRef.current;\r\n const rect = container.getBoundingClientRect();\r\n const w = rect.width;\r\n const h = typeof height === 'number' ? height : rect.height;\r\n\r\n // Scene\r\n const scene = new THREE.Scene();\r\n sceneRef.current = scene;\r\n\r\n // Use ref for view mode to prevent initScene recreation (fixes flickering)\r\n const viewMode = currentViewRef.current;\r\n \r\n // Camera (adjusted per view mode)\r\n const farClip = viewMode === 'solar-system' ? 1000000 : 100000;\r\n const camera = new THREE.PerspectiveCamera(45, w / h, 1, farClip);\r\n // Solar system: position to see inner planets, Earth orbit view: standard distance\r\n const initialDistance = viewMode === 'solar-system' ? 5000 : 10000;\r\n camera.position.set(0, initialDistance * 0.3, initialDistance);\r\n cameraRef.current = camera;\r\n\r\n if (initialCamera?.position) {\r\n camera.position.set(initialCamera.position.x, initialCamera.position.y, initialCamera.position.z);\r\n }\r\n\r\n // Renderer (optimized settings - preserveDrawingBuffer prevents flickering)\r\n const renderer = new THREE.WebGLRenderer({ \r\n antialias: true, \r\n alpha: true,\r\n powerPreference: 'high-performance',\r\n preserveDrawingBuffer: true, // Prevents flickering from buffer swaps\r\n });\r\n renderer.setSize(w, h);\r\n renderer.setPixelRatio(Math.min(window.devicePixelRatio, 2));\r\n container.appendChild(renderer.domElement);\r\n rendererRef.current = renderer;\r\n\r\n // Controls (smooth damping, adjusted per view)\r\n const controls = new OrbitControlsClass(camera, renderer.domElement);\r\n controls.enableDamping = true;\r\n controls.dampingFactor = 0.05;\r\n controls.rotateSpeed = 0.5;\r\n controls.minDistance = viewMode === 'solar-system' ? 500 : 3050; // Very close to Earth/objects\r\n controls.maxDistance = viewMode === 'solar-system' ? 100000 : 25000;\r\n controls.enablePan = viewMode === 'solar-system'; // Allow pan in solar system\r\n let interactionTimer: ReturnType<typeof setTimeout>;\r\n const handleControlStart = () => { isUserInteractingRef.current = true; };\r\n const handleControlEnd = () => {\r\n clearTimeout(interactionTimer);\r\n interactionTimer = setTimeout(() => { isUserInteractingRef.current = false; }, 3000);\r\n };\r\n controls.addEventListener('start', handleControlStart);\r\n controls.addEventListener('end', handleControlEnd);\r\n controlsRef.current = controls;\r\n\r\n raycasterRef.current = new THREE.Raycaster();\r\n mouseRef.current = new THREE.Vector2();\r\n\r\n // Groups\r\n objectsGroupRef.current = new THREE.Group();\r\n objectsGroupRef.current.name = 'objects';\r\n scene.add(objectsGroupRef.current);\r\n\r\n linksGroupRef.current = new THREE.Group();\r\n linksGroupRef.current.name = 'links';\r\n scene.add(linksGroupRef.current);\r\n\r\n conesGroupRef.current = new THREE.Group();\r\n conesGroupRef.current.name = 'cones';\r\n scene.add(conesGroupRef.current);\r\n\r\n orbitsGroupRef.current = new THREE.Group();\r\n orbitsGroupRef.current.name = 'orbits';\r\n scene.add(orbitsGroupRef.current);\r\n\r\n planetsGroupRef.current = new THREE.Group();\r\n planetsGroupRef.current.name = 'planets';\r\n scene.add(planetsGroupRef.current);\r\n\r\n if (viewMode === 'solar-system') {\r\n createSolarSystem(THREE, scene);\r\n } else {\r\n createEarth(THREE, scene);\r\n createAtmosphere(THREE, scene);\r\n }\r\n \r\n createStars(THREE, scene);\r\n createLighting(THREE, scene);\r\n \r\n if (showAxisHelper && viewMode !== 'solar-system') {\r\n createAxisHelper(THREE, scene);\r\n }\r\n\r\n setIsLoading(false);\r\n\r\n return () => {\r\n clearTimeout(interactionTimer);\r\n if (animationRef.current) cancelAnimationFrame(animationRef.current);\r\n controls.removeEventListener('start', handleControlStart);\r\n controls.removeEventListener('end', handleControlEnd);\r\n controls.dispose();\r\n renderer.dispose();\r\n if (container.contains(renderer.domElement)) container.removeChild(renderer.domElement);\r\n };\r\n }, [THREE, OrbitControlsClass, height, initialCamera, showAxisHelper]); // Uses currentViewRef to prevent recreation\r\n\r\n // ==========================================================================\r\n // Create Solar System (scaled for visibility)\r\n // ==========================================================================\r\n \r\n const createSolarSystem = useCallback((THREE: ThreeModule, _scene: unknown) => {\r\n const planetsGroup = planetsGroupRef.current;\r\n if (!planetsGroup) return;\r\n\r\n // Scale factor to make solar system viewable (1 unit = ~1000 km)\r\n const DISTANCE_SCALE = 0.000005;\r\n const SIZE_SCALE = 0.01;\r\n\r\n // Sun (emissive glow)\r\n const sunRadius = 696340 * SIZE_SCALE;\r\n const sunGeo = new THREE.SphereGeometry(sunRadius, 32, 24);\r\n const sunMat = new THREE.MeshBasicMaterial({ color: 0xffdd44 });\r\n const sunMesh = new THREE.Mesh(sunGeo, sunMat);\r\n sunMesh.name = 'sun';\r\n sunMesh.userData = { objectId: 'sun', planetId: 'sun', isPlanet: true, isSelectable: true };\r\n planetsGroup.add(sunMesh);\r\n\r\n // Sun glow\r\n const glowGeo = new THREE.SphereGeometry(sunRadius * 1.3, 24, 16);\r\n const glowMat = new THREE.MeshBasicMaterial({ color: 0xffaa00, transparent: true, opacity: 0.2 });\r\n planetsGroup.add(new THREE.Mesh(glowGeo, glowMat));\r\n\r\n // Planets with proper scaling\r\n const configs = [\r\n { id: 'mercury', color: 0x8c7853, radius: 2439.7, distance: 57900000 },\r\n { id: 'venus', color: 0xffc649, radius: 6051.8, distance: 108200000 },\r\n { id: 'earth', color: 0x6b93d6, radius: 6371, distance: 149600000 },\r\n { id: 'mars', color: 0xc1440e, radius: 3389.5, distance: 227900000 },\r\n { id: 'jupiter', color: 0xd8ca9d, radius: 69911, distance: 778500000 },\r\n { id: 'saturn', color: 0xf4d59e, radius: 58232, distance: 1434000000 },\r\n { id: 'uranus', color: 0xd1e7e7, radius: 25362, distance: 2871000000 },\r\n { id: 'neptune', color: 0x5b5ddf, radius: 24622, distance: 4495000000 },\r\n ];\r\n\r\n configs.forEach(c => {\r\n // Make inner planets larger for visibility\r\n const visualScale = c.distance < 300000000 ? 15 : 5;\r\n const planetRadius = c.radius * SIZE_SCALE * visualScale;\r\n const geo = new THREE.SphereGeometry(planetRadius, 24, 16);\r\n const mat = new THREE.MeshPhongMaterial({ color: c.color, shininess: 30 });\r\n const mesh = new THREE.Mesh(geo, mat);\r\n \r\n const orbitDist = c.distance * DISTANCE_SCALE;\r\n mesh.position.x = orbitDist;\r\n mesh.name = c.id;\r\n mesh.userData = { objectId: c.id, planetId: c.id, isPlanet: true, isSelectable: true, data: { id: c.id, name: c.id.charAt(0).toUpperCase() + c.id.slice(1), category: 'planet' } };\r\n planetsGroup.add(mesh);\r\n objectMeshMapRef.current.set(c.id, mesh);\r\n\r\n // Saturn's rings\r\n if (c.id === 'saturn') {\r\n const ringGeo = new THREE.RingGeometry(planetRadius * 1.4, planetRadius * 2.2, 32);\r\n const ringMat = new THREE.MeshBasicMaterial({ color: 0xc9b896, transparent: true, opacity: 0.6, side: THREE.DoubleSide });\r\n const ring = new THREE.Mesh(ringGeo, ringMat);\r\n ring.rotation.x = Math.PI / 2.5;\r\n ring.position.copy(mesh.position);\r\n planetsGroup.add(ring);\r\n }\r\n\r\n // Orbit line\r\n const points: any[] = [];\r\n for (let i = 0; i <= 64; i++) {\r\n const angle = (i / 64) * Math.PI * 2;\r\n points.push(new THREE.Vector3(orbitDist * Math.cos(angle), 0, orbitDist * Math.sin(angle)));\r\n }\r\n const orbitGeo = new THREE.BufferGeometry().setFromPoints(points);\r\n const orbitMat = new THREE.LineBasicMaterial({ color: 0x444466, transparent: true, opacity: 0.3 });\r\n planetsGroup.add(new THREE.Line(orbitGeo, orbitMat));\r\n });\r\n\r\n // Add a point light at Sun\r\n const sunLight = new THREE.PointLight(0xffffee, 2, 100000);\r\n sunLight.position.set(0, 0, 0);\r\n planetsGroup.add(sunLight);\r\n }, []);\r\n\r\n // ==========================================================================\r\n // Create Earth (optimized segments like EarthViewer)\r\n // ==========================================================================\r\n \r\n const createEarth = useCallback((THREE: ThreeModule, scene: any) => {\r\n const earthGeometry = new THREE.SphereGeometry(SCENE_EARTH_RADIUS, EARTH_SEGMENTS, EARTH_SEGMENTS_V);\r\n const earthMaterial = new THREE.MeshPhongMaterial({ color: 0x2244aa, shininess: 10 });\r\n\r\n const textureLoader = new THREE.TextureLoader();\r\n textureLoader.load('/world.topo.jpg', (texture: any) => {\r\n texture.wrapS = THREE.RepeatWrapping;\r\n texture.wrapT = THREE.ClampToEdgeWrapping;\r\n texture.minFilter = THREE.LinearFilter;\r\n texture.magFilter = THREE.LinearFilter;\r\n earthMaterial.map = texture;\r\n earthMaterial.needsUpdate = true;\r\n }, undefined, () => {});\r\n\r\n const earth = new THREE.Mesh(earthGeometry, earthMaterial);\r\n earth.rotation.y = -Math.PI / 2 + Math.PI;\r\n earth.name = 'earth';\r\n scene.add(earth);\r\n earthRef.current = earth;\r\n }, []);\r\n\r\n // ==========================================================================\r\n // Create Atmosphere (sun-reactive glow)\r\n // ==========================================================================\r\n \r\n const createAtmosphere = useCallback((THREE: ThreeModule, scene: any) => {\r\n if (!effectiveLayers.atmosphere) return;\r\n \r\n // Default sun direction (can be updated via props)\r\n const defaultSunDir = new THREE.Vector3(1, 0.3, 0.5).normalize();\r\n \r\n const atmosphereGeometry = new THREE.SphereGeometry(SCENE_EARTH_RADIUS * 1.15, 32, 16);\r\n const atmosphereMaterial = new THREE.ShaderMaterial({\r\n uniforms: {\r\n uSunDirection: { value: defaultSunDir },\r\n },\r\n vertexShader: atmosphereVertexShader,\r\n fragmentShader: atmosphereFragmentShader,\r\n blending: THREE.AdditiveBlending,\r\n side: THREE.BackSide,\r\n transparent: true,\r\n depthWrite: false,\r\n });\r\n const atmosphere = new THREE.Mesh(atmosphereGeometry, atmosphereMaterial);\r\n atmosphere.rotation.y = -Math.PI / 2;\r\n atmosphere.name = 'atmosphere';\r\n scene.add(atmosphere);\r\n \r\n // Store ref for dynamic updates\r\n atmosphereMaterialRef.current = atmosphereMaterial;\r\n }, [effectiveLayers.atmosphere]);\r\n\r\n // ==========================================================================\r\n // Create Stars (optimized like EarthViewer)\r\n // ==========================================================================\r\n \r\n const createStars = useCallback((THREE: ThreeModule, scene: any) => {\r\n const starsGeometry = new THREE.BufferGeometry();\r\n const starsDist = currentView === 'solar-system' ? 50000000000 : 50000;\r\n const positions = new Float32Array(STARS_COUNT * 3);\r\n const opacities = new Float32Array(STARS_COUNT);\r\n\r\n for (let i = 0; i < STARS_COUNT; i++) {\r\n const radius = starsDist + Math.random() * starsDist;\r\n const theta = Math.random() * Math.PI * 2;\r\n const phi = Math.acos(2 * Math.random() - 1);\r\n\r\n positions[i * 3] = radius * Math.sin(phi) * Math.cos(theta);\r\n positions[i * 3 + 1] = radius * Math.sin(phi) * Math.sin(theta);\r\n positions[i * 3 + 2] = radius * Math.cos(phi);\r\n opacities[i] = Math.random();\r\n }\r\n\r\n starsGeometry.setAttribute('position', new THREE.BufferAttribute(positions, 3));\r\n starsGeometry.setAttribute('opacity', new THREE.BufferAttribute(opacities, 1));\r\n\r\n const starsMaterial = new THREE.ShaderMaterial({\r\n uniforms: { time: { value: 0 } },\r\n vertexShader: starsVertexShader,\r\n fragmentShader: starsFragmentShader,\r\n transparent: true,\r\n depthWrite: false,\r\n blending: THREE.AdditiveBlending,\r\n });\r\n\r\n scene.add(new THREE.Points(starsGeometry, starsMaterial));\r\n starsMaterialRef.current = starsMaterial;\r\n }, [currentView]);\r\n\r\n // ==========================================================================\r\n // Create Lighting (simple like EarthViewer)\r\n // ==========================================================================\r\n \r\n const createLighting = useCallback((THREE: ThreeModule, scene: any) => {\r\n scene.add(new THREE.AmbientLight(0x404040, 0.6));\r\n const sunLight = new THREE.DirectionalLight(0xffffff, 1.2);\r\n sunLight.position.set(10000, 5000, 10000);\r\n scene.add(sunLight);\r\n }, []);\r\n\r\n // ==========================================================================\r\n // Create Axis Helper\r\n // ==========================================================================\r\n \r\n const createAxisHelper = useCallback((THREE: ThreeModule, scene: any) => {\r\n const len = SCENE_EARTH_RADIUS * 1.5;\r\n const group = new THREE.Group();\r\n \r\n [\r\n { color: 0xff3333, dir: [1, 0, 0] },\r\n { color: 0x33ff33, dir: [0, 1, 0] },\r\n { color: 0x3333ff, dir: [0, 0, 1] },\r\n ].forEach(({ color, dir }) => {\r\n const points = [new THREE.Vector3(0, 0, 0), new THREE.Vector3(dir[0] * len, dir[1] * len, dir[2] * len)];\r\n const geo = new THREE.BufferGeometry().setFromPoints(points);\r\n const mat = new THREE.LineBasicMaterial({ color });\r\n group.add(new THREE.Line(geo, mat));\r\n });\r\n \r\n scene.add(group);\r\n }, []);\r\n\r\n // ==========================================================================\r\n // Update Objects\r\n // ==========================================================================\r\n \r\n const updateObjects = useCallback(() => {\r\n if (!THREE || !objectsGroupRef.current || currentView === 'solar-system') return;\r\n\r\n const group = objectsGroupRef.current;\r\n const meshMap = objectMeshMapRef.current;\r\n\r\n // Clear\r\n while (group.children.length > 0) {\r\n const child = group.children[0];\r\n group.remove(child);\r\n }\r\n meshMap.clear();\r\n\r\n const allObjects: SpaceObject[] = [...satellites, ...debris, ...stations, ...customObjects];\r\n\r\n allObjects.slice(0, maxObjects).forEach((obj) => {\r\n const categoryLayer = obj.category === 'satellite' ? 'satellites' :\r\n obj.category === 'debris' ? 'debris' :\r\n obj.category === 'station' ? 'stations' : 'satellites';\r\n \r\n if (!effectiveLayers[categoryLayer]) return;\r\n\r\n let size = 50;\r\n if (obj.category === 'station') size = 100;\r\n else if (obj.category === 'debris') size = 25;\r\n\r\n const satelliteGroup = createSatelliteShape(THREE, obj.category, size);\r\n satelliteGroup.position.set(obj.position.x, obj.position.y, obj.position.z);\r\n satelliteGroup.lookAt(0, 0, 0);\r\n satelliteGroup.userData = { objectId: obj.id, category: obj.category, data: obj, isSelectable: true };\r\n satelliteGroup.name = obj.id;\r\n \r\n group.add(satelliteGroup);\r\n meshMap.set(obj.id, satelliteGroup);\r\n });\r\n }, [THREE, satellites, debris, stations, customObjects, maxObjects, effectiveLayers, currentView]);\r\n\r\n // ==========================================================================\r\n // Update Ground Stations\r\n // ==========================================================================\r\n \r\n const updateGroundStations = useCallback(() => {\r\n if (!THREE || !objectsGroupRef.current || currentView === 'solar-system') return;\r\n if (!effectiveLayers.groundStations) return;\r\n\r\n groundStations.forEach((gs) => {\r\n const pos = latLonAltToCartesian(gs.latitude, gs.longitude, 0);\r\n \r\n // Simple marker\r\n const geo = new THREE.SphereGeometry(35, 8, 6);\r\n const mat = new THREE.MeshBasicMaterial({ color: 0x00ffff });\r\n const marker = new THREE.Mesh(geo, mat);\r\n marker.position.set(pos.x, pos.y, pos.z);\r\n marker.userData = { objectId: gs.id, category: 'groundStation', data: gs, isSelectable: true };\r\n \r\n objectsGroupRef.current.add(marker);\r\n objectMeshMapRef.current.set(gs.id, marker);\r\n\r\n // Glow ring\r\n const ringGeo = new THREE.RingGeometry(45, 65, 16);\r\n const ringMat = new THREE.MeshBasicMaterial({ color: 0x00ffff, transparent: true, opacity: 0.4, side: THREE.DoubleSide });\r\n const ring = new THREE.Mesh(ringGeo, ringMat);\r\n ring.position.set(pos.x, pos.y, pos.z);\r\n ring.lookAt(0, 0, 0);\r\n objectsGroupRef.current.add(ring);\r\n });\r\n }, [THREE, groundStations, effectiveLayers.groundStations, currentView]);\r\n\r\n // ==========================================================================\r\n // Update Coverage (Realistic satellite-to-ground cones + legacy region cones)\r\n // ==========================================================================\r\n \r\n const updateCoverage = useCallback(() => {\r\n const T = threeRef.current;\r\n if (!T || !conesGroupRef.current || currentView === 'solar-system') return;\r\n\r\n // Clear existing\r\n while (conesGroupRef.current.children.length > 0) {\r\n conesGroupRef.current.remove(conesGroupRef.current.children[0]);\r\n }\r\n\r\n if (!effectiveLayers.coverage) return;\r\n\r\n // ========================================\r\n // Satellite Coverage Visualization (NASA-style)\r\n // Renders coverage data provided by Zendir SDK\r\n // ========================================\r\n satelliteCoverages.forEach((coverage) => {\r\n // Get satellite position\r\n let satPos: any;\r\n if (coverage.satellitePosition) {\r\n satPos = new T.Vector3(coverage.satellitePosition.x, coverage.satellitePosition.y, coverage.satellitePosition.z);\r\n } else {\r\n const satMesh = objectMeshMapRef.current.get(coverage.satelliteId);\r\n if (!satMesh) return;\r\n satPos = satMesh.position.clone();\r\n }\r\n\r\n const satDistance = satPos.length();\r\n const coneColor = new T.Color(coverage.color || '#22d3ee');\r\n const highlightColor = new T.Color(coverage.color || '#22d3ee').multiplyScalar(1.3);\r\n\r\n // ====== 1. Render footprint border only (no filled plane - it cuts through sphere) ======\r\n if (coverage.footprintPolygon && coverage.footprintPolygon.length >= 3 && coverage.showFootprint !== false) {\r\n const cornerPoints = coverage.footprintPolygon.map(pt => latLonAltToCartesian(pt.latitude, pt.longitude, 0));\r\n \r\n // Curved border (follows sphere curvature via SLERP)\r\n const borderPts = subdivideSphericalPolygon(cornerPoints, SPHERICAL_SUBDIVISIONS, SCENE_EARTH_RADIUS * 1.003)\r\n .map(pt => new T.Vector3(pt.x, pt.y, pt.z));\r\n borderPts.push(borderPts[0].clone());\r\n const borderGeo = new T.BufferGeometry().setFromPoints(borderPts);\r\n const borderMat = new T.LineBasicMaterial({ color: highlightColor, transparent: true, opacity: 0.95, linewidth: 2 });\r\n conesGroupRef.current.add(new T.Line(borderGeo, borderMat));\r\n\r\n // Outer glow (slightly larger radius for glow effect)\r\n const glowPts = subdivideSphericalPolygon(cornerPoints, SPHERICAL_SUBDIVISIONS, SCENE_EARTH_RADIUS * 1.005)\r\n .map(pt => new T.Vector3(pt.x, pt.y, pt.z));\r\n glowPts.push(glowPts[0].clone());\r\n const glowGeo = new T.BufferGeometry().setFromPoints(glowPts);\r\n const glowMat = new T.LineBasicMaterial({ color: coneColor, transparent: true, opacity: 0.4 });\r\n conesGroupRef.current.add(new T.Line(glowGeo, glowMat));\r\n\r\n // Cone lines from satellite to corners (lines only, no filled surface)\r\n if (coverage.showCone !== false) {\r\n for (const corner of cornerPoints) {\r\n const edgePt = new T.Vector3(corner.x, corner.y, corner.z).normalize().multiplyScalar(SCENE_EARTH_RADIUS);\r\n const lineGeo = new T.BufferGeometry().setFromPoints([satPos, edgePt]);\r\n const lineMat = new T.LineBasicMaterial({ color: coneColor, transparent: true, opacity: 0.4 });\r\n conesGroupRef.current.add(new T.Line(lineGeo, lineMat));\r\n }\r\n }\r\n }\r\n\r\n // ====== 2. Simple cone (when no polygon, just halfAngle) ======\r\n else if (coverage.halfAngle && coverage.showCone !== false) {\r\n const halfAngleRad = coverage.halfAngle * (Math.PI / 180);\r\n const coneHeight = satDistance - SCENE_EARTH_RADIUS * 0.98;\r\n const coneRadius = coneHeight * Math.tan(halfAngleRad);\r\n\r\n // Cone mesh\r\n const coneGeo = new T.ConeGeometry(coneRadius, coneHeight, 48, 1, true);\r\n const coneMat = new T.MeshBasicMaterial({\r\n color: coneColor,\r\n transparent: true,\r\n opacity: 0.12,\r\n side: T.DoubleSide,\r\n depthWrite: false,\r\n });\r\n const cone = new T.Mesh(coneGeo, coneMat);\r\n cone.position.copy(satPos);\r\n cone.lookAt(0, 0, 0);\r\n cone.rotateX(Math.PI / 2);\r\n cone.translateY(-coneHeight / 2);\r\n conesGroupRef.current.add(cone);\r\n\r\n // Footprint circle\r\n if (coverage.showFootprint !== false) {\r\n const nadirDir = satPos.clone().normalize();\r\n const footprintPos = nadirDir.clone().multiplyScalar(SCENE_EARTH_RADIUS * 1.003);\r\n const footprintRadius = coneRadius * (SCENE_EARTH_RADIUS / satDistance);\r\n \r\n // Filled circle\r\n const footGeo = new T.CircleGeometry(footprintRadius, 64);\r\n const footMat = new T.MeshBasicMaterial({\r\n color: coneColor, transparent: true, opacity: 0.3, side: T.DoubleSide, depthWrite: false\r\n });\r\n const footprint = new T.Mesh(footGeo, footMat);\r\n footprint.position.copy(footprintPos);\r\n footprint.lookAt(satPos);\r\n conesGroupRef.current.add(footprint);\r\n\r\n // Edge ring\r\n const ringGeo = new T.RingGeometry(footprintRadius * 0.97, footprintRadius, 64);\r\n const ringMat = new T.MeshBasicMaterial({\r\n color: highlightColor, transparent: true, opacity: 0.7, side: T.DoubleSide\r\n });\r\n const ring = new T.Mesh(ringGeo, ringMat);\r\n ring.position.copy(footprintPos);\r\n ring.lookAt(satPos);\r\n conesGroupRef.current.add(ring);\r\n }\r\n }\r\n\r\n // ====== 3. Nadir line ======\r\n if (coverage.showNadirLine !== false) {\r\n let nadirGroundPoint: any;\r\n if (coverage.nadirPoint) {\r\n const np = latLonAltToCartesian(coverage.nadirPoint.latitude, coverage.nadirPoint.longitude, 0);\r\n nadirGroundPoint = new T.Vector3(np.x, np.y, np.z);\r\n } else {\r\n nadirGroundPoint = satPos.clone().normalize().multiplyScalar(SCENE_EARTH_RADIUS);\r\n }\r\n const lineGeo = new T.BufferGeometry().setFromPoints([satPos, nadirGroundPoint]);\r\n const lineMat = new T.LineBasicMaterial({ color: highlightColor, transparent: true, opacity: 0.7 });\r\n conesGroupRef.current.add(new T.Line(lineGeo, lineMat));\r\n }\r\n });\r\n\r\n // ========================================\r\n // Legacy Region-based Visibility Cones\r\n // ========================================\r\n visibilityCones.forEach((cone) => {\r\n const pos = latLonAltToCartesian(cone.center.latitude, cone.center.longitude, 0);\r\n \r\n const coneHeight = 1000 * KM_TO_SCENE;\r\n const minElev = cone.minElevation || 10;\r\n const coneRadius = coneHeight * Math.tan((90 - minElev) * (Math.PI / 180) * 0.4);\r\n const coneColor = new T.Color(cone.color || '#22d3ee');\r\n \r\n const coneGeo = new T.ConeGeometry(coneRadius, coneHeight, 24, 1, true);\r\n const coneMat = new T.MeshBasicMaterial({\r\n color: coneColor,\r\n transparent: true,\r\n opacity: cone.opacity || 0.12,\r\n side: T.DoubleSide,\r\n depthWrite: false,\r\n });\r\n \r\n const coneMesh = new T.Mesh(coneGeo, coneMat);\r\n coneMesh.position.set(pos.x, pos.y, pos.z);\r\n coneMesh.lookAt(0, 0, 0);\r\n coneMesh.rotateX(-Math.PI / 2);\r\n coneMesh.translateY(coneHeight / 2);\r\n conesGroupRef.current.add(coneMesh);\r\n\r\n // Footprint ring\r\n const footGeo = new T.RingGeometry(coneRadius * 0.7, coneRadius * 0.9, 32);\r\n const footMat = new T.MeshBasicMaterial({\r\n color: coneColor,\r\n transparent: true,\r\n opacity: 0.3,\r\n side: T.DoubleSide,\r\n });\r\n const foot = new T.Mesh(footGeo, footMat);\r\n foot.position.set(pos.x * 1.002, pos.y * 1.002, pos.z * 1.002);\r\n foot.lookAt(0, 0, 0);\r\n conesGroupRef.current.add(foot);\r\n });\r\n }, [visibilityCones, satelliteCoverages, effectiveLayers.coverage, currentView]);\r\n\r\n // ==========================================================================\r\n // Update Communication Links\r\n // ==========================================================================\r\n \r\n const updateLinks = useCallback(() => {\r\n if (!THREE || !linksGroupRef.current || currentView === 'solar-system') return;\r\n\r\n while (linksGroupRef.current.children.length > 0) {\r\n linksGroupRef.current.remove(linksGroupRef.current.children[0]);\r\n }\r\n\r\n communicationLinks.forEach((link) => {\r\n const fromMesh = objectMeshMapRef.current.get(link.fromId);\r\n const toMesh = objectMeshMapRef.current.get(link.toId);\r\n if (!fromMesh || !toMesh) return;\r\n\r\n const color = link.color || (link.status === 'active' ? '#00ff88' : '#666666');\r\n const geo = new THREE.BufferGeometry().setFromPoints([fromMesh.position.clone(), toMesh.position.clone()]);\r\n \r\n // Dashed animated line\r\n const mat = new THREE.LineDashedMaterial({ \r\n color: new THREE.Color(color), \r\n transparent: true, \r\n opacity: link.status === 'active' ? 0.8 : 0.4,\r\n dashSize: 30,\r\n gapSize: 20,\r\n });\r\n \r\n const line = new THREE.Line(geo, mat);\r\n line.computeLineDistances(); // Required for dashed lines - must be on Line, not geometry\r\n line.userData = { isAnimatedLink: true };\r\n linksGroupRef.current.add(line);\r\n });\r\n }, [THREE, communicationLinks, currentView]);\r\n\r\n // ==========================================================================\r\n // Update Orbits\r\n // ==========================================================================\r\n \r\n const updateOrbits = useCallback(() => {\r\n if (!THREE || !orbitsGroupRef.current || currentView === 'solar-system') return;\r\n\r\n while (orbitsGroupRef.current.children.length > 0) {\r\n orbitsGroupRef.current.remove(orbitsGroupRef.current.children[0]);\r\n }\r\n\r\n if (!effectiveLayers.orbits) return;\r\n\r\n orbitPaths.forEach((path) => {\r\n if (path.points.length < 2) return;\r\n const points = path.points.map(p => new THREE.Vector3(p.x, p.y, p.z));\r\n const geo = new THREE.BufferGeometry().setFromPoints(points);\r\n const mat = new THREE.LineBasicMaterial({ color: new THREE.Color(path.color || '#888888'), transparent: true, opacity: 0.5 });\r\n orbitsGroupRef.current.add(new THREE.Line(geo, mat));\r\n });\r\n }, [THREE, orbitPaths, effectiveLayers.orbits, currentView]);\r\n\r\n // ==========================================================================\r\n // Mouse Handlers\r\n // ==========================================================================\r\n \r\n const handleMouseMove = useCallback((event: MouseEvent) => {\r\n if (!containerRef.current || !raycasterRef.current || !cameraRef.current) return;\r\n\r\n const rect = containerRef.current.getBoundingClientRect();\r\n mouseRef.current.set(\r\n ((event.clientX - rect.left) / rect.width) * 2 - 1,\r\n -((event.clientY - rect.top) / rect.height) * 2 + 1\r\n );\r\n\r\n raycasterRef.current.setFromCamera(mouseRef.current, cameraRef.current);\r\n\r\n const selectables: any[] = [];\r\n objectsGroupRef.current?.traverse((obj: any) => { if (obj.userData?.isSelectable) selectables.push(obj); });\r\n\r\n const intersects = raycasterRef.current.intersectObjects(selectables, true);\r\n\r\n if (intersects.length > 0) {\r\n let hit = intersects[0].object;\r\n while (hit && !hit.userData?.objectId) hit = hit.parent;\r\n \r\n if (hit?.userData) {\r\n setHoverTooltip({ visible: true, x: event.clientX - rect.left, y: event.clientY - rect.top, object: hit.userData.data });\r\n if (containerRef.current) containerRef.current.style.cursor = 'pointer';\r\n return;\r\n }\r\n }\r\n \r\n setHoverTooltip({ visible: false, x: 0, y: 0, object: null });\r\n if (containerRef.current) containerRef.current.style.cursor = 'grab';\r\n }, []);\r\n\r\n const handleClick = useCallback((event: MouseEvent) => {\r\n if (!containerRef.current || !raycasterRef.current || !cameraRef.current) return;\r\n\r\n const rect = containerRef.current.getBoundingClientRect();\r\n mouseRef.current.set(\r\n ((event.clientX - rect.left) / rect.width) * 2 - 1,\r\n -((event.clientY - rect.top) / rect.height) * 2 + 1\r\n );\r\n\r\n raycasterRef.current.setFromCamera(mouseRef.current, cameraRef.current);\r\n\r\n // Check objects group\r\n const selectables: any[] = [];\r\n objectsGroupRef.current?.traverse((obj: any) => { if (obj.userData?.isSelectable) selectables.push(obj); });\r\n // Also check planets group for solar system view\r\n planetsGroupRef.current?.traverse((obj: any) => { if (obj.userData?.isSelectable) selectables.push(obj); });\r\n\r\n const intersects = raycasterRef.current.intersectObjects(selectables, true);\r\n\r\n if (intersects.length > 0) {\r\n let hit = intersects[0].object;\r\n while (hit && !hit.userData?.objectId) hit = hit.parent;\r\n \r\n if (hit?.userData?.objectId) {\r\n const objectId = hit.userData.objectId;\r\n setSelection({ selectedId: objectId, selectedObject: hit.userData.data, hoveredId: null });\r\n callbacks?.onSelect?.(hit.userData.data);\r\n \r\n // Fly to the clicked object\r\n flyTo(objectId, { animate: true });\r\n return;\r\n }\r\n }\r\n \r\n setSelection({ selectedId: null, selectedObject: null, hoveredId: null });\r\n callbacks?.onSelect?.(null);\r\n }, [callbacks]);\r\n\r\n // ==========================================================================\r\n // Fly To Object (comprehensive camera navigation)\r\n // ==========================================================================\r\n \r\n const flyTo = useCallback((objectId: string, options?: { zoom?: number; animate?: boolean; distance?: number; offset?: Vector3D }) => {\r\n if (!THREE || !cameraRef.current || !controlsRef.current) return;\r\n\r\n const mesh = objectMeshMapRef.current.get(objectId);\r\n if (!mesh) {\r\n if (import.meta.env.DEV) {\r\n console.warn(`flyTo: Object \"${objectId}\" not found`);\r\n }\r\n return;\r\n }\r\n\r\n const targetPos = mesh.position.clone();\r\n const camera = cameraRef.current;\r\n const controls = controlsRef.current;\r\n const category = mesh.userData?.category;\r\n const isGroundStation = category === 'groundStation';\r\n\r\n // Determine viewing distance based on object type\r\n let viewDistance: number;\r\n if (options?.distance) {\r\n viewDistance = options.distance;\r\n } else {\r\n // Auto-calculate based on object size/type\r\n const isPlanet = mesh.userData?.isPlanet;\r\n const targetDist = targetPos.length();\r\n \r\n if (isPlanet) {\r\n // For planets, get closer based on planet size\r\n const planetRadius = mesh.geometry?.parameters?.radius || 100;\r\n viewDistance = planetRadius * 5;\r\n } else if (isGroundStation) {\r\n // Ground stations - close view from above\r\n viewDistance = 200;\r\n } else if (category === 'station') {\r\n // Space stations - extremely close side view\r\n viewDistance = 80;\r\n } else if (category === 'satellite') {\r\n // Satellites - extremely close side view\r\n viewDistance = 60;\r\n } else if (targetDist > SCENE_EARTH_RADIUS * 2) {\r\n // Far object (high orbit) - close view\r\n viewDistance = 150;\r\n } else {\r\n // Near-Earth object - very close view\r\n viewDistance = 100 * (options?.zoom || 1);\r\n }\r\n }\r\n\r\n // Calculate camera position - offset from object\r\n let cameraTargetPos: any;\r\n if (options?.offset) {\r\n cameraTargetPos = targetPos.clone().add(new THREE.Vector3(options.offset.x, options.offset.y, options.offset.z));\r\n } else if (isGroundStation) {\r\n // Ground station: view from above (radially outward from Earth center)\r\n const upDir = targetPos.clone().normalize();\r\n cameraTargetPos = targetPos.clone().add(upDir.multiplyScalar(viewDistance));\r\n } else {\r\n // Satellites/stations: view from the side\r\n const dir = targetPos.clone().normalize();\r\n const side = new THREE.Vector3(-dir.z, 0.2, dir.x).normalize();\r\n cameraTargetPos = targetPos.clone().add(side.multiplyScalar(viewDistance));\r\n }\r\n\r\n if (options?.animate !== false) {\r\n focusTransitionRef.current = {\r\n startTime: Date.now(),\r\n startPos: { x: camera.position.x, y: camera.position.y, z: camera.position.z },\r\n targetPos: { x: cameraTargetPos.x, y: cameraTargetPos.y, z: cameraTargetPos.z },\r\n startTarget: { x: controls.target.x, y: controls.target.y, z: controls.target.z },\r\n targetTarget: { x: targetPos.x, y: targetPos.y, z: targetPos.z },\r\n duration: CAMERA_TRANSITION_DURATION,\r\n isActive: true,\r\n };\r\n } else {\r\n camera.position.copy(cameraTargetPos);\r\n controls.target.copy(targetPos);\r\n controls.update();\r\n }\r\n\r\n // Fire callback\r\n callbacks?.onFocus?.(mesh.userData?.data || { id: objectId });\r\n }, [THREE, callbacks]);\r\n\r\n // Alias for backward compatibility\r\n const focusOn = flyTo;\r\n\r\n // ==========================================================================\r\n // Animation\r\n // ==========================================================================\r\n \r\n const animate = useCallback(() => {\r\n // Guard: Only one animation loop should run at a time\r\n if (!isAnimatingRef.current) return;\r\n if (!rendererRef.current || !sceneRef.current || !cameraRef.current) return;\r\n\r\n const camera = cameraRef.current;\r\n const controls = controlsRef.current;\r\n\r\n // Transition\r\n if (focusTransitionRef.current?.isActive) {\r\n const t = focusTransitionRef.current;\r\n const progress = Math.min((Date.now() - t.startTime) / t.duration, 1);\r\n const e = easeOutCubic(progress);\r\n\r\n camera.position.x = t.startPos.x + (t.targetPos.x - t.startPos.x) * e;\r\n camera.position.y = t.startPos.y + (t.targetPos.y - t.startPos.y) * e;\r\n camera.position.z = t.startPos.z + (t.targetPos.z - t.startPos.z) * e;\r\n\r\n controls.target.x = t.startTarget.x + (t.targetTarget.x - t.startTarget.x) * e;\r\n controls.target.y = t.startTarget.y + (t.targetTarget.y - t.startTarget.y) * e;\r\n controls.target.z = t.startTarget.z + (t.targetTarget.z - t.startTarget.z) * e;\r\n\r\n if (progress >= 1) t.isActive = false;\r\n }\r\n\r\n if (controls) controls.update();\r\n\r\n timeRef.current += 0.016;\r\n if (starsMaterialRef.current) starsMaterialRef.current.uniforms.time.value = timeRef.current;\r\n\r\n // Animate communication link dashes (moving dotted lines)\r\n if (linksGroupRef.current) {\r\n linksGroupRef.current.children.forEach((child: any) => {\r\n if (child.userData?.isAnimatedLink && child.material) {\r\n child.material.dashOffset -= 1.5; // Speed of animation\r\n }\r\n });\r\n }\r\n\r\n rendererRef.current.render(sceneRef.current, camera);\r\n animationRef.current = requestAnimationFrame(animate);\r\n }, []);\r\n\r\n // ==========================================================================\r\n // Imperative Handle\r\n // ==========================================================================\r\n \r\n useImperativeHandle(ref, () => ({\r\n focusOn,\r\n flyTo,\r\n setView: (mode: ViewMode) => setCurrentView(mode),\r\n setTime: () => {},\r\n setTimeScale: () => {},\r\n togglePlay: () => {},\r\n setLayerVisibility: (layer: keyof LayerVisibility, visible: boolean) => setLayers(prev => ({ ...prev, [layer]: visible })),\r\n getCameraState: (): CameraState => {\r\n if (!cameraRef.current) return { position: { x: 0, y: 0, z: 10000 }, target: { x: 0, y: 0, z: 0 }, up: { x: 0, y: 1, z: 0 }, fov: 45, near: 0.1, far: 100000 };\r\n const c = cameraRef.current;\r\n return { position: { x: c.position.x, y: c.position.y, z: c.position.z }, target: { x: controlsRef.current?.target.x || 0, y: controlsRef.current?.target.y || 0, z: controlsRef.current?.target.z || 0 }, up: { x: c.up.x, y: c.up.y, z: c.up.z }, fov: c.fov, near: c.near, far: c.far };\r\n },\r\n setCameraState: (state: Partial<CameraState>) => {\r\n if (!cameraRef.current) return;\r\n if (state.position) cameraRef.current.position.set(state.position.x, state.position.y, state.position.z);\r\n if (state.target && controlsRef.current) controlsRef.current.target.set(state.target.x, state.target.y, state.target.z);\r\n },\r\n exportImage: (format: 'png' | 'jpeg' = 'png'): string => rendererRef.current?.domElement.toDataURL(`image/${format}`) || '',\r\n exportScene: (): Blob => new Blob(),\r\n getVisibleObjects: (): SpaceObject[] => [...satellites, ...debris, ...stations, ...customObjects],\r\n findObjects: (q: string): SpaceObject[] => [...satellites, ...debris, ...stations, ...customObjects].filter(obj => obj.name.toLowerCase().includes(q.toLowerCase()) || obj.id.toLowerCase().includes(q.toLowerCase())),\r\n addObject: () => {},\r\n removeObject: () => {},\r\n updateObject: () => {},\r\n measureDistance: (_from: string | Vector3D, _to: string | Vector3D): number => 0,\r\n }), [satellites, debris, stations, customObjects, focusOn]);\r\n\r\n // ==========================================================================\r\n // Effects\r\n // ==========================================================================\r\n \r\n useEffect(() => { if (THREE && OrbitControlsClass) return initScene(); }, [THREE, OrbitControlsClass, initScene]);\r\n\r\n useEffect(() => {\r\n if (!isLoading && THREE) {\r\n // Cancel any existing animation loop first (prevents stacking)\r\n if (animationRef.current) {\r\n cancelAnimationFrame(animationRef.current);\r\n animationRef.current = null;\r\n }\r\n \r\n // Start animation loop with guard\r\n isAnimatingRef.current = true;\r\n animate();\r\n \r\n return () => {\r\n // Stop animation loop cleanly\r\n isAnimatingRef.current = false;\r\n if (animationRef.current) {\r\n cancelAnimationFrame(animationRef.current);\r\n animationRef.current = null;\r\n }\r\n };\r\n }\r\n }, [isLoading, THREE, animate]);\r\n\r\n useEffect(() => {\r\n if (THREE && !isLoading) {\r\n updateObjects();\r\n updateGroundStations();\r\n updateCoverage();\r\n updateOrbits();\r\n updateLinks();\r\n }\r\n }, [THREE, isLoading, updateObjects, updateGroundStations, updateCoverage, updateOrbits, updateLinks]);\r\n\r\n useEffect(() => {\r\n const container = containerRef.current;\r\n if (!container || isLoading) return;\r\n container.addEventListener('mousemove', handleMouseMove);\r\n container.addEventListener('click', handleClick);\r\n return () => { container.removeEventListener('mousemove', handleMouseMove); container.removeEventListener('click', handleClick); };\r\n }, [isLoading, handleMouseMove, handleClick]);\r\n\r\n useEffect(() => {\r\n const handleResize = () => {\r\n if (!containerRef.current || !rendererRef.current || !cameraRef.current) return;\r\n const rect = containerRef.current.getBoundingClientRect();\r\n const h = typeof height === 'number' ? height : rect.height;\r\n cameraRef.current.aspect = rect.width / h;\r\n cameraRef.current.updateProjectionMatrix();\r\n rendererRef.current.setSize(rect.width, h);\r\n };\r\n window.addEventListener('resize', handleResize);\r\n return () => window.removeEventListener('resize', handleResize);\r\n }, [height]);\r\n\r\n useEffect(() => { if (focusedObjectId) focusOn(focusedObjectId, { animate: true }); }, [focusedObjectId, focusOn]);\r\n\r\n // Update sun direction for atmosphere glow (from Zendir SDK)\r\n useEffect(() => {\r\n if (THREE && atmosphereMaterialRef.current && sunDirection) {\r\n const dir = new THREE.Vector3(sunDirection.x, sunDirection.y, sunDirection.z).normalize();\r\n atmosphereMaterialRef.current.uniforms.uSunDirection.value = dir;\r\n }\r\n }, [THREE, sunDirection]);\r\n\r\n // Update planet positions from Zendir SDK\r\n useEffect(() => {\r\n if (!THREE || !planetPositions || !planetsGroupRef.current) return;\r\n \r\n planetsGroupRef.current.traverse((child: any) => {\r\n if (child.userData?.planetId && planetPositions[child.userData.planetId]) {\r\n const pos = planetPositions[child.userData.planetId];\r\n child.position.set(pos.x, pos.y, pos.z);\r\n }\r\n });\r\n }, [THREE, planetPositions]);\r\n\r\n // ==========================================================================\r\n // Render\r\n // ==========================================================================\r\n \r\n if (!webglCapabilities.available) {\r\n return (\r\n <div className={`zenspace3d-fallback ${className}`} style={{ width, height: typeof height === 'number' ? height : 600, display: 'flex', flexDirection: 'column', alignItems: 'center', justifyContent: 'center', backgroundColor: '#030508', borderRadius: 8, fontFamily: 'ui-monospace, monospace', ...style }}>\r\n <div style={{ marginBottom: 16 }}>\r\n <AstroIcon name=\"public\" size=\"large\" label=\"Globe\" style={{ color: '#22d3ee', opacity: 0.5 }} />\r\n </div>\r\n <div style={{ color: '#b8bcc8' /* WCAG: improved contrast */, fontSize: 14 }}>WebGL is not available</div>\r\n </div>\r\n );\r\n }\r\n\r\n if (error) return <div style={{ width, height, display: 'flex', alignItems: 'center', justifyContent: 'center', backgroundColor: '#0a0a0f', color: '#ff4444' }}><p>Error: {error}</p></div>;\r\n\r\n return (\r\n <div className={`zenspace3d ${className}`} style={{ width, height: typeof height === 'number' ? height : '100%', position: 'relative', backgroundColor: '#000', borderRadius: 8, overflow: 'hidden', cursor: 'grab', ...style }}>\r\n <div ref={containerRef} style={{ width: '100%', height: '100%' }} />\r\n\r\n {isLoading && <div style={{ position: 'absolute', top: 0, left: 0, right: 0, bottom: 0, display: 'flex', alignItems: 'center', justifyContent: 'center', backgroundColor: 'rgba(0,0,0,0.9)' }}><div style={{ color: '#22d3ee', fontSize: 14 }}>Loading...</div></div>}\r\n\r\n {showTools && !isLoading && (\r\n <div style={{ position: 'absolute', top: 12, left: 12, display: 'flex', flexDirection: 'column', gap: 4 }}>\r\n <LayerBtn icon=\"satellite\" label=\"Satellites\" active={layers.satellites} onClick={() => setLayers(l => ({ ...l, satellites: !l.satellites }))} />\r\n <LayerBtn icon=\"home\" label=\"Stations\" active={layers.stations} onClick={() => setLayers(l => ({ ...l, stations: !l.stations }))} />\r\n <LayerBtn icon=\"antenna\" label=\"Ground\" active={layers.groundStations} onClick={() => setLayers(l => ({ ...l, groundStations: !l.groundStations }))} />\r\n <LayerBtn icon=\"timeline\" label=\"Orbits\" active={layers.orbits} onClick={() => setLayers(l => ({ ...l, orbits: !l.orbits }))} />\r\n <LayerBtn icon=\"signal-cellular-4-bar\" label=\"Coverage\" active={layers.coverage} onClick={() => setLayers(l => ({ ...l, coverage: !l.coverage }))} />\r\n </div>\r\n )}\r\n\r\n {!isLoading && (\r\n <ObjectLegend \r\n currentView={currentView}\r\n satellites={satellites}\r\n stations={stations}\r\n groundStations={groundStations}\r\n onObjectClick={(id, objectData) => {\r\n // Same behavior as clicking in 3D: select, callback, fly\r\n setSelection({ selectedId: id, selectedObject: objectData, hoveredId: null });\r\n callbacks?.onSelect?.(objectData);\r\n flyTo(id, { animate: true });\r\n }}\r\n />\r\n )}\r\n\r\n {hoverTooltip.visible && hoverTooltip.object && (\r\n <div style={{ \r\n position: 'absolute', \r\n left: hoverTooltip.x + 15, \r\n top: hoverTooltip.y - 10, \r\n backgroundColor: 'rgba(20, 25, 35, 0.95)', \r\n color: '#e4e4e7', \r\n padding: '10px 14px', \r\n borderRadius: 4, \r\n fontSize: 12, \r\n fontFamily: 'system-ui, -apple-system, sans-serif', \r\n boxShadow: '0 4px 20px rgba(0,0,0,0.5)',\r\n pointerEvents: 'none', \r\n zIndex: 100,\r\n minWidth: 140,\r\n }}>\r\n <div style={{ color: '#ffffff', fontWeight: 500, marginBottom: 4 }}>\r\n {hoverTooltip.object.name || hoverTooltip.object.targetName || 'Unknown'}\r\n </div>\r\n {hoverTooltip.object.category && (\r\n <div style={{ color: '#9ca3af', fontSize: 11 }}>{hoverTooltip.object.category}</div>\r\n )}\r\n {hoverTooltip.object.overpassTime && (\r\n <div style={{ color: '#9ca3af', fontSize: 11, marginTop: 4 }}>\r\n Overpass time: {hoverTooltip.object.overpassTime}\r\n </div>\r\n )}\r\n </div>\r\n )}\r\n\r\n {/* Overpass labels removed - now shown only on hover */}\r\n\r\n {showInfoPanel && selection.selectedObject && (\r\n <div style={{ position: 'absolute', bottom: 16, right: 12, backgroundColor: 'rgba(0,0,0,0.9)', color: '#e4e4e7', padding: '14px 18px', borderRadius: 10, fontSize: 12, fontFamily: 'ui-monospace, monospace', border: '1px solid rgba(34,211,238,0.3)', minWidth: 180 }}>\r\n <div style={{ color: '#22d3ee', fontWeight: 500, marginBottom: 8 }}>{selection.selectedObject.name}</div>\r\n <div style={{ color: '#b8bcc8' /* WCAG: improved contrast */, fontSize: 10 }}>{selection.selectedObject.category}</div>\r\n <button onClick={() => setSelection({ selectedId: null, selectedObject: null, hoveredId: null })} style={{ marginTop: 10, padding: '5px 10px', backgroundColor: 'rgba(255,255,255,0.1)', border: 'none', borderRadius: 4, color: '#a1a1aa', cursor: 'pointer', fontSize: 10, width: '100%' }}>Close</button>\r\n </div>\r\n )}\r\n\r\n {!isLoading && <div style={{ position: 'absolute', bottom: 12, left: 12, backgroundColor: 'rgba(0,0,0,0.5)', color: '#b8bcc8' /* WCAG: improved contrast */, padding: '5px 10px', borderRadius: 6, fontSize: 10 }}>Drag to rotate • Scroll to zoom</div>}\r\n </div>\r\n );\r\n }\r\n);\r\n\r\n// =============================================================================\r\n// Sub-Components\r\n// =============================================================================\r\n\r\nfunction LayerBtn({ icon, label, active, onClick }: { icon: AstroIconName; label: string; active: boolean; onClick: () => void }) {\r\n return (\r\n <button \r\n onClick={onClick} \r\n aria-label={`Toggle ${label} layer`}\r\n aria-pressed={active}\r\n style={{ \r\n display: 'flex', \r\n alignItems: 'center', \r\n gap: 6, \r\n padding: '6px 10px', \r\n backgroundColor: active ? 'rgba(34,211,238,0.15)' : 'rgba(0,0,0,0.7)', \r\n border: active ? '1px solid rgba(34,211,238,0.4)' : '1px solid rgba(255,255,255,0.1)', \r\n borderRadius: 6, \r\n cursor: 'pointer', \r\n fontSize: '0.6875rem', // 11px in rem\r\n color: active ? '#22d3ee' : '#b8bcc8', // WCAG: improved contrast from #71717a\r\n minWidth: 110,\r\n }}\r\n >\r\n <span aria-hidden=\"true\"><AstroIcon name={icon} size=\"extra-small\" label=\"\" /></span>\r\n <span>{label}</span>\r\n </button>\r\n );\r\n}\r\n\r\nfunction _OverpassLabel({ overpass, index }: { overpass: OverpassInfo; index: number }) {\r\n return (\r\n <div style={{ position: 'absolute', top: 70 + index * 60, left: '28%', backgroundColor: 'rgba(0,0,0,0.85)', color: '#e4e4e7', padding: '8px 12px', borderRadius: 6, fontSize: 11, fontFamily: 'ui-monospace, monospace', border: '1px solid rgba(34,211,238,0.3)', pointerEvents: 'none' }}>\r\n <div style={{ fontWeight: 500, marginBottom: 2 }}>{overpass.targetName}</div>\r\n <div style={{ color: '#22d3ee' }}>Overpass: {formatDuration(overpass.timeToOverpass)}</div>\r\n </div>\r\n );\r\n}\r\n\r\nfunction ObjectLegend({ currentView, satellites, stations, groundStations, onObjectClick }: {\r\n currentView: string;\r\n satellites: any[];\r\n stations: any[];\r\n groundStations: any[];\r\n onObjectClick: (id: string, objectData: any) => void;\r\n}) {\r\n const [hoveredSection, setHoveredSection] = React.useState<string | null>(null);\r\n const [pinnedSection, setPinnedSection] = React.useState<string | null>(null);\r\n\r\n // Show section if hovered OR pinned\r\n const isExpanded = (section: string) => hoveredSection === section || pinnedSection === section;\r\n\r\n // Click toggles pin state\r\n const togglePin = (section: string) => {\r\n setPinnedSection(prev => prev === section ? null : section);\r\n };\r\n\r\n const sectionStyle: React.CSSProperties = {\r\n cursor: 'pointer',\r\n padding: '4px 0',\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'space-between',\r\n transition: 'background-color 0.15s',\r\n };\r\n\r\n const itemStyle: React.CSSProperties = {\r\n padding: '3px 8px',\r\n marginLeft: 12,\r\n cursor: 'pointer',\r\n borderRadius: 4,\r\n fontSize: 10,\r\n color: '#a1a1aa',\r\n transition: 'all 0.15s',\r\n };\r\n\r\n return (\r\n <div style={{ \r\n position: 'absolute', \r\n top: 12, \r\n right: 12, \r\n backgroundColor: 'rgba(0,0,0,0.85)', \r\n color: '#e4e4e7', \r\n padding: '10px 14px', \r\n borderRadius: 8, \r\n fontSize: 11, \r\n fontFamily: 'ui-monospace, monospace',\r\n minWidth: 160,\r\n maxHeight: 400,\r\n overflowY: 'auto',\r\n }}>\r\n <div style={{ color: '#b8bcc8' /* WCAG: improved contrast */, fontSize: 10, marginBottom: 8 }}>\r\n {currentView === 'solar-system' ? 'Solar System' : 'Earth Orbit'}\r\n </div>\r\n\r\n {satellites.length > 0 && (\r\n <div\r\n onMouseEnter={() => setHoveredSection('satellites')}\r\n onMouseLeave={() => setHoveredSection(null)}\r\n >\r\n <div \r\n style={{\r\n ...sectionStyle,\r\n backgroundColor: isExpanded('satellites') ? 'rgba(255,255,255,0.05)' : 'transparent',\r\n }}\r\n onClick={() => togglePin('satellites')}\r\n >\r\n <span><span style={{ color: '#00ff88' }}>●</span> {satellites.length} Satellites</span>\r\n <span style={{ color: pinnedSection === 'satellites' ? '#00ff88' : '#666', fontSize: 9 }}>\r\n {isExpanded('satellites') ? '▼' : '▶'}{pinnedSection === 'satellites' ? <><AstroIcon name=\"bookmark\" size=\"extra-small\" label=\"\" style={{ marginLeft: 4, verticalAlign: 'middle' }} /></> : null}\r\n </span>\r\n </div>\r\n {isExpanded('satellites') && (\r\n <div style={{ marginBottom: 4, paddingBottom: 4 }}>\r\n {satellites.map(sat => (\r\n <div\r\n key={sat.id}\r\n style={itemStyle}\r\n onClick={(e) => { e.stopPropagation(); onObjectClick(sat.id, sat); }}\r\n onMouseEnter={(e) => { e.currentTarget.style.backgroundColor = 'rgba(0,255,136,0.15)'; e.currentTarget.style.color = '#00ff88'; }}\r\n onMouseLeave={(e) => { e.currentTarget.style.backgroundColor = 'transparent'; e.currentTarget.style.color = '#a1a1aa'; }}\r\n >\r\n {sat.name || sat.id}\r\n </div>\r\n ))}\r\n </div>\r\n )}\r\n </div>\r\n )}\r\n\r\n {stations.length > 0 && (\r\n <div\r\n onMouseEnter={() => setHoveredSection('stations')}\r\n onMouseLeave={() => setHoveredSection(null)}\r\n >\r\n <div \r\n style={{\r\n ...sectionStyle,\r\n backgroundColor: isExpanded('stations') ? 'rgba(255,255,255,0.05)' : 'transparent',\r\n }}\r\n onClick={() => togglePin('stations')}\r\n >\r\n <span><span style={{ color: '#ffd700' }}>●</span> {stations.length} Stations</span>\r\n <span style={{ color: pinnedSection === 'stations' ? '#ffd700' : '#666', fontSize: 9 }}>\r\n {isExpanded('stations') ? '▼' : '▶'}{pinnedSection === 'stations' ? <><AstroIcon name=\"bookmark\" size=\"extra-small\" label=\"\" style={{ marginLeft: 4, verticalAlign: 'middle' }} /></> : null}\r\n </span>\r\n </div>\r\n {isExpanded('stations') && (\r\n <div style={{ marginBottom: 4, paddingBottom: 4 }}>\r\n {stations.map(st => (\r\n <div\r\n key={st.id}\r\n style={itemStyle}\r\n onClick={(e) => { e.stopPropagation(); onObjectClick(st.id, st); }}\r\n onMouseEnter={(e) => { e.currentTarget.style.backgroundColor = 'rgba(255,215,0,0.15)'; e.currentTarget.style.color = '#ffd700'; }}\r\n onMouseLeave={(e) => { e.currentTarget.style.backgroundColor = 'transparent'; e.currentTarget.style.color = '#a1a1aa'; }}\r\n >\r\n {st.name || st.id}\r\n </div>\r\n ))}\r\n </div>\r\n )}\r\n </div>\r\n )}\r\n\r\n {groundStations.length > 0 && (\r\n <div\r\n onMouseEnter={() => setHoveredSection('groundStations')}\r\n onMouseLeave={() => setHoveredSection(null)}\r\n >\r\n <div \r\n style={{\r\n ...sectionStyle,\r\n backgroundColor: isExpanded('groundStations') ? 'rgba(255,255,255,0.05)' : 'transparent',\r\n }}\r\n onClick={() => togglePin('groundStations')}\r\n >\r\n <span><span style={{ color: '#00ffff' }}>▲</span> {groundStations.length} Ground Stations</span>\r\n <span style={{ color: pinnedSection === 'groundStations' ? '#00ffff' : '#666', fontSize: 9 }}>\r\n {isExpanded('groundStations') ? '▼' : '▶'}{pinnedSection === 'groundStations' ? <><AstroIcon name=\"bookmark\" size=\"extra-small\" label=\"\" style={{ marginLeft: 4, verticalAlign: 'middle' }} /></> : null}\r\n </span>\r\n </div>\r\n {isExpanded('groundStations') && (\r\n <div style={{ marginBottom: 4, paddingBottom: 4 }}>\r\n {groundStations.map(gs => (\r\n <div\r\n key={gs.id}\r\n style={itemStyle}\r\n onClick={(e) => { e.stopPropagation(); onObjectClick(gs.id, gs); }}\r\n onMouseEnter={(e) => { e.currentTarget.style.backgroundColor = 'rgba(0,255,255,0.15)'; e.currentTarget.style.color = '#00ffff'; }}\r\n onMouseLeave={(e) => { e.currentTarget.style.backgroundColor = 'transparent'; e.currentTarget.style.color = '#a1a1aa'; }}\r\n >\r\n {gs.name || gs.id}\r\n </div>\r\n ))}\r\n </div>\r\n )}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\nexport default ZenSpace3D;\r\n"],"names":["ZenSpace3D","ZenSpace3DThree","THREE","_a"],"mappings":"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"}
|