mapRenderer.ts 3.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. import { type CameraState } from '../camera/camera'
  2. import { type TileStoreStats } from '../tile/tileStore'
  3. import { type LonLatPoint, type MapCalibration } from '../../utils/projection'
  4. import { type TileZoomBounds } from '../../utils/remoteMapConfig'
  5. import { type OrienteeringCourseData } from '../../utils/orienteeringCourse'
  6. import { type AnimationLevel } from '../../utils/animationLevel'
  7. import { type ControlPointStyleEntry, type CourseLegStyleEntry, type CourseStyleConfig } from '../../game/presentation/courseStyleConfig'
  8. import { type GpsMarkerStyleConfig } from '../../game/presentation/gpsMarkerStyleConfig'
  9. import { type TrackDisplayMode, type TrackVisualizationConfig } from '../../game/presentation/trackStyleConfig'
  10. export interface MapScene {
  11. tileSource: string
  12. osmTileSource: string
  13. zoom: number
  14. centerTileX: number
  15. centerTileY: number
  16. exactCenterWorldX: number
  17. exactCenterWorldY: number
  18. tileBoundsByZoom: Record<number, TileZoomBounds> | null
  19. viewportWidth: number
  20. viewportHeight: number
  21. visibleColumns: number
  22. overdraw: number
  23. translateX: number
  24. translateY: number
  25. rotationRad: number
  26. animationLevel: AnimationLevel
  27. previewScale: number
  28. previewOriginX: number
  29. previewOriginY: number
  30. trackMode: TrackDisplayMode
  31. trackStyleConfig: TrackVisualizationConfig
  32. track: LonLatPoint[]
  33. gpsPoint: LonLatPoint | null
  34. gpsMarkerStyleConfig: GpsMarkerStyleConfig
  35. gpsHeadingDeg: number | null
  36. gpsHeadingAlpha: number
  37. gpsCalibration: MapCalibration
  38. gpsCalibrationOrigin: LonLatPoint
  39. course: OrienteeringCourseData | null
  40. cpRadiusMeters: number
  41. gameMode: 'classic-sequential' | 'score-o'
  42. courseStyleConfig: CourseStyleConfig
  43. controlScoresBySequence: Record<number, number>
  44. defaultControlStyleOverride: ControlPointStyleEntry | null
  45. controlStyleOverridesBySequence: Record<number, ControlPointStyleEntry>
  46. startStyleOverrides: ControlPointStyleEntry[]
  47. finishStyleOverrides: ControlPointStyleEntry[]
  48. defaultLegStyleOverride: CourseLegStyleEntry | null
  49. legStyleOverridesByIndex: Record<number, CourseLegStyleEntry>
  50. controlVisualMode: 'single-target' | 'multi-target'
  51. showCourseLegs: boolean
  52. guidanceLegAnimationEnabled: boolean
  53. focusableControlIds: string[]
  54. focusedControlId: string | null
  55. focusedControlSequences: number[]
  56. activeControlSequences: number[]
  57. readyControlSequences: number[]
  58. activeStart: boolean
  59. completedStart: boolean
  60. activeFinish: boolean
  61. focusedFinish: boolean
  62. completedFinish: boolean
  63. revealFullCourse: boolean
  64. activeLegIndices: number[]
  65. completedLegIndices: number[]
  66. completedControlSequences: number[]
  67. skippedControlIds: string[]
  68. skippedControlSequences: number[]
  69. osmReferenceEnabled: boolean
  70. overlayOpacity: number
  71. }
  72. export type MapRendererStats = TileStoreStats
  73. export interface MapRenderer {
  74. attachCanvas(canvasNode: any, width: number, height: number, dpr: number, labelCanvasNode?: any): void
  75. updateScene(scene: MapScene): void
  76. setAnimationPaused(paused: boolean): void
  77. getGpsLogoDebugInfo?(): { status: string; url: string; resolvedSrc: string }
  78. destroy(): void
  79. }
  80. export function buildCamera(scene: MapScene): CameraState {
  81. return {
  82. centerWorldX: scene.centerTileX + 0.5,
  83. centerWorldY: scene.centerTileY + 0.5,
  84. viewportWidth: scene.viewportWidth,
  85. viewportHeight: scene.viewportHeight,
  86. visibleColumns: scene.visibleColumns,
  87. translateX: scene.translateX,
  88. translateY: scene.translateY,
  89. rotationRad: scene.rotationRad,
  90. }
  91. }