60 lines
1.3 KiB
Haskell
60 lines
1.3 KiB
Haskell
module Dodge.LightSources
|
|
( tLightTimedIntensity
|
|
, tLight
|
|
, lightAt
|
|
, colorLightAt
|
|
)
|
|
where
|
|
import Dodge.Data
|
|
import Geometry.Data
|
|
|
|
import Control.Lens
|
|
|
|
colorLightAt :: Point3 -> Point3 -> Int -> LightSource
|
|
colorLightAt col pos i =
|
|
LS {_lsID = i
|
|
,_lsPos = pos
|
|
,_lsDir = 0
|
|
,_lsRad = 700
|
|
,_lsIntensity = col
|
|
}
|
|
|
|
lightAt :: Point3 -> Int -> LightSource
|
|
lightAt = colorLightAt 0.75
|
|
|
|
tLightTimedIntensity :: Int -> Float -> (Int -> Float) -> Point2 -> TempLightSource
|
|
tLightTimedIntensity t rmax intensityF (V2 x y) = TLS
|
|
{ _tlsPos = V3 x y 0
|
|
, _tlsRad = rmax
|
|
, _tlsIntensity = f $ intensityF t
|
|
, _tlsUpdate = upF
|
|
, _tlsTime = t
|
|
}
|
|
where
|
|
upF _ tls
|
|
| _tlsTime tls <= 0 = Nothing
|
|
| otherwise = Just $ tls
|
|
& tlsTime -~ 1
|
|
& tlsIntensity .~ f (intensityF (_tlsTime tls) )
|
|
f x' = V3 x' x' x'
|
|
|
|
tLight
|
|
:: Int
|
|
-> Float -- ^ maximal radius
|
|
-> Point3
|
|
-> Point3
|
|
-> TempLightSource
|
|
tLight t rmax col (V3 x y z) = TLS
|
|
{ _tlsPos = V3 x y z
|
|
, _tlsRad = rmax
|
|
, _tlsIntensity = col
|
|
, _tlsUpdate = upF
|
|
, _tlsTime = t
|
|
}
|
|
where
|
|
upF _ tls
|
|
| _tlsTime tls <= 0 = Nothing
|
|
| otherwise = Just $ tls
|
|
& tlsTime -~ 1
|
|
|