canvasOverlayRenderer.ts 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. import { type MapLayer } from '../layer/mapLayer'
  2. import { buildCamera, type MapScene } from './mapRenderer'
  3. import { type TileStore } from '../tile/tileStore'
  4. export class CanvasOverlayRenderer {
  5. canvas: any
  6. ctx: any
  7. dpr: number
  8. layers: MapLayer[]
  9. constructor(layers: MapLayer[]) {
  10. this.canvas = null
  11. this.ctx = null
  12. this.dpr = 1
  13. this.layers = layers
  14. }
  15. attachCanvas(canvasNode: any, width: number, height: number, dpr: number): void {
  16. this.canvas = canvasNode
  17. this.ctx = canvasNode.getContext('2d')
  18. this.dpr = dpr || 1
  19. canvasNode.width = Math.max(1, Math.floor(width * this.dpr))
  20. canvasNode.height = Math.max(1, Math.floor(height * this.dpr))
  21. if (typeof this.ctx.setTransform === 'function') {
  22. this.ctx.setTransform(this.dpr, 0, 0, this.dpr, 0, 0)
  23. } else {
  24. this.ctx.scale(this.dpr, this.dpr)
  25. }
  26. }
  27. clear(): void {
  28. this.canvas = null
  29. this.ctx = null
  30. }
  31. render(scene: MapScene, tileStore: TileStore, pulseFrame: number): void {
  32. if (!this.ctx) {
  33. return
  34. }
  35. const camera = buildCamera(scene)
  36. const ctx = this.ctx
  37. const previewScale = scene.previewScale || 1
  38. const previewOriginX = scene.previewOriginX || scene.viewportWidth / 2
  39. const previewOriginY = scene.previewOriginY || scene.viewportHeight / 2
  40. ctx.clearRect(0, 0, scene.viewportWidth, scene.viewportHeight)
  41. ctx.save()
  42. ctx.translate(previewOriginX, previewOriginY)
  43. ctx.scale(previewScale, previewScale)
  44. ctx.translate(-previewOriginX, -previewOriginY)
  45. for (const layer of this.layers) {
  46. layer.draw({
  47. ctx,
  48. camera,
  49. scene,
  50. pulseFrame,
  51. tileStore,
  52. })
  53. }
  54. ctx.restore()
  55. }
  56. }