import type { ThreeEvent } from '@react-three/fiber'; import { Suspense } from 'react'; import { LinearFilter, NearestFilter, Vector2 } from 'three'; import type { Box3 } from 'three'; import type { Size } from '../models'; import { useAxisSystemContext } from '../shared/AxisSystemProvider'; import Tile from './Tile'; import type { TilesApi } from './api'; import { useLayerScales } from './hooks'; import type { ColorMapProps, TileArray } from './models'; import { getTileOffsets, scaleBox, sortTilesByDistanceTo } from './utils'; interface Props extends ColorMapProps { api: TilesApi; layer: number; meshSize: Size; visibleBox: Box3; onPointerMove?: (e: ThreeEvent, array: TileArray) => void; } function TiledLayer(props: Props) { const { api, layer, meshSize, visibleBox, onPointerMove, ...colorMapProps } = props; const { baseLayerIndex, numLayers, tileSize } = api; const layerSize = api.layerSizes[layer]; const { xScale, yScale } = useLayerScales(layerSize, meshSize); const { abscissaConfig, ordinateConfig } = useAxisSystemContext(); if (visibleBox.isEmpty()) { return null; } const bounds = scaleBox(visibleBox, xScale, yScale); const tileOffsets = getTileOffsets(bounds, tileSize); // Sort tiles from closest to vis center to farthest away sortTilesByDistanceTo(tileOffsets, tileSize, bounds.getCenter(new Vector2())); return ( // Transforms to use level of details layer array coordinates {tileOffsets.map((offset) => ( ))} ); } export default TiledLayer;