module Data.Glome.Scene (
    Camera(Camera),
    camera,
    module Data.Glome.Clr,
    module Data.Glome.Vec,
    module Data.Glome.Solid,
    module Data.Glome.Sphere,
    module Data.Glome.Triangle,
    module Data.Glome.Bih,
    module Data.Glome.Csg,
    module Data.Glome.Plane,
    module Data.Glome.Box,
    module Data.Glome.Bound,
    module Data.Glome.Cone,
    module Data.Glome.Tex) where
import Data.Glome.Clr
import Data.Glome.Vec
import Data.Glome.Solid
import Data.Glome.Sphere
import Data.Glome.Triangle
import Data.Glome.Bih
import Data.Glome.Csg
import Data.Glome.Plane
import Data.Glome.Box
import Data.Glome.Bound
import Data.Glome.Cone
import Data.Glome.Tex

-- This is the proper module to import if you want to have
-- access to all the Solid constructors and scene
-- defininition code.


-- CAMERA --
data Camera = Camera {campos, fwd, up, right :: !Vec} 
              deriving Show

-- | Construct a camera pointing in some default direction.
default_cam = (Camera (vec 0.0 0.0 (-3.0)) 
                      (vec 0.0 0.0 1.0) 
                      (vec 0.0 1.0 0.0) 
                      (vec 1.0 0.0 0.0))

-- | Construct a camera, given a position, a forward vector, 
-- a point that the camera should be pointed towards, an up vector,
-- and a right vector.  The up and right vectors don't have to be
-- normalized or perfectly orthogonal.
camera :: Vec -> Vec -> Vec -> Flt -> Camera
camera pos at up angle =
 let fwd   = vnorm $ vsub at pos
     right = vnorm $ vcross up fwd
     up_   = vnorm $ vcross fwd right
     cam_scale = tan ((pi/180)*(angle/2))
 in
  Camera pos fwd
         (vscale up_ cam_scale) 
         (vscale right cam_scale)