-- |
-- SPDX-License-Identifier: BSD-3-Clause
--
-- Convenience functions for rendering topographical structures
module Swarm.Game.Scenario.Topography.Rasterize where

import Codec.Picture
import Data.Vector qualified as V
import Swarm.Game.Scenario.Topography.Area
import Swarm.Game.Scenario.Topography.Grid

makeImage :: Pixel px => (a -> px) -> Grid a -> Image px
makeImage :: forall px a. Pixel px => (a -> px) -> Grid a -> Image px
makeImage a -> px
computeColor Grid a
g =
  (Int -> Int -> px) -> Int -> Int -> Image px
forall px. Pixel px => (Int -> Int -> px) -> Int -> Int -> Image px
generateImage (Vector (Vector a) -> Int -> Int -> px
pixelRenderer Vector (Vector a)
vecGrid) (Int32 -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int32
w) (Int32 -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int32
h)
 where
  vecGrid :: Vector (Vector a)
vecGrid = Grid a -> Vector (Vector a)
forall a. Grid a -> Vector (Vector a)
gridToVec Grid a
g
  AreaDimensions Int32
w Int32
h = Grid a -> AreaDimensions
forall a. Grid a -> AreaDimensions
getGridDimensions Grid a
g
  pixelRenderer :: Vector (Vector a) -> Int -> Int -> px
pixelRenderer Vector (Vector a)
vg Int
x Int
y = a -> px
computeColor (a -> px) -> a -> px
forall a b. (a -> b) -> a -> b
$ (Vector (Vector a)
vg Vector (Vector a) -> Int -> Vector a
forall a. Vector a -> Int -> a
V.! Int
y) Vector a -> Int -> a
forall a. Vector a -> Int -> a
V.! Int
x