{-# OPTIONS_GHC -Wall #-}
----------------------------------------------------------------------
-- |
-- Module      :  Graphics.FieldTrip.Render
-- Copyright   :  (c) Conal Elliott 2008
-- License     :  BSD3
-- 
-- Maintainer  :  conal@conal.net
-- Stability   :  experimental
-- 
-- Misc rendering-related
----------------------------------------------------------------------

module Graphics.FieldTrip.Render
  (
    ErrorBound, MaterialTrans
  , GContext(..), defaultGC, onErr
  , enableNormals
  , Renderer
  ) where


import Graphics.FieldTrip.Misc (R,Unop)
import Graphics.FieldTrip.Material (Material)
import Graphics.FieldTrip.Color (Col)

-- | For use in dynamically approximating curved surfaces
type ErrorBound = R

-- | A transformation on materials.  Accumulated during rendering.
type MaterialTrans = Unop Material

-- | Rendering context for geometry
data GContext = GC { gcErr        :: ErrorBound
		   , gcMaterialTrans :: MaterialTrans 
		   , gcNormals    :: Maybe Col
		   }

-- | Default graphics context
defaultGC :: GContext
defaultGC = GC { gcErr = 0.01, gcMaterialTrans = id, gcNormals = Nothing }

-- | Modify the error-bound in a 'GContext'
onErr :: Unop ErrorBound -> Unop GContext
onErr f gc = gc { gcErr = f (gcErr gc) }


-- | Turn on visible normals.
enableNormals :: Col -> GContext -> GContext
enableNormals col gc = gc { gcNormals = Just col }

-- | renderer
type Renderer = GContext -> IO ()