HGamer3D-Data-0.4.0: HGamer3D/Data/Transform3D.hs
-- This source file is part of HGamer3D
-- (A project to enable 3D game development in Haskell)
-- For the latest info, see http://www.hgamer3d.org
--
-- (c) 2011-2013 Peter Althainz
--
-- Licensed under the Apache License, Version 2.0 (the "License");
-- you may not use this file except in compliance with the License.
-- You may obtain a copy of the License at
--
-- http://www.apache.org/licenses/LICENSE-2.0
--
-- Unless required by applicable law or agreed to in writing, software
-- distributed under the License is distributed on an "AS IS" BASIS,
-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-- See the License for the specific language governing permissions and
-- limitations under the License.
-- Transform3D.hs
-- | Typeclasses for basic 3D transformations
module HGamer3D.Data.Transform3D
(
-- * Types
HasPosition (..),
HasSize (..),
HasOrientation (..),
-- * Functions
translate,
scale,
yaw,
pitch,
roll
)
where
import HGamer3D.Data.Vector
import HGamer3D.Data.Angle
import HGamer3D.Data.TypeSynonyms
-- | a type with a HasPosition instance has a Position
class HasPosition t where
-- | get position function
position :: t -> IO Position
-- | set position function
positionTo :: t -> Position -> IO ()
-- | a type with a HasSize instance has a Size
class HasSize t where
-- | get scale function
size :: t -> IO Size
-- | set scale function
sizeTo :: t -> Size -> IO ()
-- | a type with an HasOrientation instance has an oriented in space
class HasOrientation t where
-- | get orientation function
orientation :: t -> IO Orientation
-- | set orientation function
orientationTo :: t -> Orientation -> IO ()
-- | move the position
translate :: Position -> Position -> Position
translate = (&+)
-- | scale the size
scale :: Size -> Vec3 -> Size
scale = (&!)
-- yaw, roll, pitch functions
-- functions, to rotate on axis, relative to object
rotRelativeToObjectAxis :: Orientation -> Vec3 -> Float -> Orientation
rotRelativeToObjectAxis ori axis val = let
odir = actU ori axis
qrot = rotU odir val
nrot = qrot .*. ori
in nrot
-- | rotate object on own axis (yaw) by angle
yaw :: Orientation -> Angle -> Orientation
yaw ori val = rotRelativeToObjectAxis ori vec3Y (fromAngle val)
-- | rotate object on own axis (roll) by angle
roll :: Orientation -> Angle -> Orientation
roll ori val = rotRelativeToObjectAxis ori vec3Z (fromAngle val)
-- | rotate object on own axis (pitch) by angle
pitch :: Orientation -> Angle -> Orientation
pitch ori val = rotRelativeToObjectAxis ori vec3X (fromAngle val)