HGamer3D-Data-0.3.0: HGamer3D/Data/Operation3D.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.
-- Operation3D.hs
-- | Typeclasses for basic 3D operations
module HGamer3D.Data.Operation3D
(
-- * Types
Position3D (..),
Scale3D (..),
Direction3D (..),
Orientation3D (..),
-- * Functions
translate3D,
yaw3D,
pitch3D,
roll3D
)
where
import HGamer3D.Data.Vector
import HGamer3D.Data.Angle
-- | a type with a Position3D instance can be positioned
class Position3D t where
-- | get position function
position3D :: t -> IO Vec3
-- | set position function
positionTo3D :: t -> Vec3 -> IO ()
-- | move position function
translate3D :: Position3D t => t -> Vec3 -> IO ()
translate3D t v = do
p <- position3D t
positionTo3D t ( v &+ p )
return ()
-- | a type with a Scale3D instance can be scaled
class Scale3D t where
-- | get scale function
scale3D :: t -> IO Vec3
-- | set scale function
scaleTo3D :: t -> Vec3 -> IO ()
-- | a type with a Direction3D instance can be oriented towards a point (Camera for example)
class Direction3D t where
-- | get direction function
direction3D :: t -> IO Vec3
-- | set direction function
directionTo3D :: t -> Vec3 -> IO ()
-- | a type with an Orientation3D instance can be oriented in space
class Orientation3D t where
-- | get orientation function
orientation3D :: t -> IO UnitQuaternion
-- | set orientation function
orientationTo3D :: t -> UnitQuaternion -> IO ()
-- yaw, roll, pitch functions
-- functions, to rotate on axis, relative to object
rotRelativeToObjectAxis :: Orientation3D t => t -> Vec3 -> Float -> IO ()
rotRelativeToObjectAxis object axis val = do
qob <- orientation3D object
let odir = actU qob axis
let qrot = rotU odir val
let nrot = qrot .*. qob
orientationTo3D object nrot
return ()
-- | rotate object on own axis (yaw) by angle
yaw3D :: Orientation3D t => t -> Angle -> IO ()
yaw3D object val = rotRelativeToObjectAxis object (Vec3 0.0 1.0 0.0) (fromAngle val)
-- | rotate object on own axis (roll) by angle
roll3D :: Orientation3D t => t -> Angle -> IO ()
roll3D object val = rotRelativeToObjectAxis object (Vec3 0.0 0.0 1.0) (fromAngle val)
-- | rotate object on own axis (pitch) by angle
pitch3D :: Orientation3D t => t -> Angle -> IO ()
pitch3D object val = rotRelativeToObjectAxis object (Vec3 1.0 0.0 0.0) (fromAngle val)