49 lines
1.0 KiB
Haskell
49 lines
1.0 KiB
Haskell
module Tile
|
|
where
|
|
import Data.Tile
|
|
import Geometry
|
|
import Geometry.Data
|
|
import Picture.Data
|
|
|
|
tToRender :: Tile -> [RenderType]
|
|
tToRender t = map Render3x3 $ polyToTris $ zip ps3 coords3
|
|
where
|
|
ps = _tilePoly t
|
|
coords = map (calcTexCoord (_tileCenter t) (_tileX t) (_tileY t)) ps
|
|
ps3 = map (mkTrip 0.9) ps
|
|
coords3 = map (mkTrip (_tileZ t)) coords
|
|
|
|
mkTrip :: c -> (a,b) -> (a,b,c)
|
|
mkTrip z (x,y) = (x,y,z)
|
|
|
|
calcTexCoord
|
|
:: Point2 -- ^ tile (0,0)
|
|
-> Point2 -- ^ tile (1,0)
|
|
-> Point2 -- ^ tile (0,1)
|
|
-> Point2 -- ^ world point
|
|
-> Point2
|
|
calcTexCoord cen x' y' p =
|
|
( magV (projV (p -.- cen) x) / magV x
|
|
, magV (projV (p -.- cen) y) / magV y
|
|
)
|
|
where
|
|
x = x' -.- cen
|
|
y = y' -.- cen
|
|
|
|
oTile
|
|
:: [Point2]
|
|
-> Float
|
|
-> Tile
|
|
oTile poly z = Tile
|
|
{ _tilePoly = poly
|
|
, _tileCenter = c
|
|
, _tileX = x
|
|
, _tileY = y
|
|
, _tileZ = z
|
|
}
|
|
where
|
|
c = head poly
|
|
xdir = 50 *.* normalizeV (poly !! 1 -.- c)
|
|
x = c +.+ xdir
|
|
y = c +.+ vNormal xdir
|