module HGamer3D.Data.Angle
(
Angle (..),
asRad,
asDeg,
addA,
subA,
mulA,
divA,
sinA,
cosA,
tanA,
asinA,
acosA,
atanA,
)
where
import Data.MessagePack
import Fresco
data Angle = Rad Float | Deg Float deriving (Eq, Ord, Show)
asRad :: Angle -> Float
asRad (Rad f) = f
asRad (Deg d) = d/180*pi
asDeg :: Angle -> Float
asDeg (Deg f) = f
asDeg (Rad d) = d/pi*180
sinA :: Angle -> Float
sinA = sin . asRad
cosA :: Angle -> Float
cosA = cos . asRad
tanA :: Angle -> Float
tanA = tan . asRad
asinA :: Float -> Angle
asinA = Rad . asin
acosA :: Float -> Angle
acosA = Rad . acos
atanA :: Float -> Angle
atanA = Rad . atan
addA :: Angle -> Angle -> Angle
addA a b = Rad $ (asRad a) + (asRad b)
subA :: Angle -> Angle -> Angle
subA a b = Rad $ (asRad a) (asRad b)
mulA :: Angle -> Float -> Angle
mulA a b = Rad $ (asRad a) * b
divA :: Angle -> Float -> Angle
divA a b = Rad $ (asRad a) / b
instance ComponentClass Angle where
toObj (Rad v1) = ObjectArray [ObjectInt 0, ObjectArray [ObjectFloat v1]]
toObj (Deg v1) = ObjectArray [ObjectInt 1, ObjectArray [ObjectFloat v1]]
fromObj (ObjectArray [ObjectInt 0, ObjectArray [ObjectFloat v1]]) = Rad v1
fromObj (ObjectArray [ObjectInt 1, ObjectArray [ObjectFloat v1]]) = Deg v1