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

