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