{- Camera Datatype HGamer3D Library (A project to enable 3D game development in Haskell) Copyright 2011-2015 Peter Althainz Distributed under the Apache License, Version 2.0 (See attached file LICENSE or copy at http://www.apache.org/licenses/LICENSE-2.0) file: HGamer3D/Graphics3D/Camera.hs -} -- | Module providing the Camera type module HGamer3D.Graphics3D.Camera ( Camera (..), ctCamera, Frustum (..), ctFrustum ) where import Fresco import Data.Binary.Serialise.CBOR import Data.Binary.Serialise.CBOR.Encoding import Data.Binary.Serialise.CBOR.Decoding import Data.Text import Data.Monoid import Control.Applicative import HGamer3D.Data.Angle import HGamer3D.Data.ScreenRect data Camera = FullViewCamera | OverlayCamera ScreenRect Float deriving (Eq, Read, Show) ctCamera :: ComponentType Camera ctCamera = ComponentType 0xd3b0d455ab1f4716 data Frustum = Frustum { frustumNearDistance::Float, frustumFarDistance::Float, frustumFieldOfViewHorizontal::Angle } deriving (Eq, Read, Show) ctFrustum :: ComponentType Frustum ctFrustum = ComponentType 0xf3ce3235d4f8e73d instance Serialise Camera where encode (FullViewCamera) = encodeListLen 1 <> encode (0::Int) encode (OverlayCamera v1 v2) = encodeListLen 3 <> encode (1::Int) <> encode v1<> encode v2 decode = do decodeListLen i <- decode :: Decoder s Int case i of 0 -> (pure FullViewCamera) 1 -> (OverlayCamera <$> decode <*> decode) instance Serialise Frustum where encode (Frustum v1 v2 v3) = encodeListLen 3 <> encode v1 <> encode v2 <> encode v3 decode = decodeListLenOf 3 >> Frustum <$> decode <*> decode <*> decode