module Graphics.Rendering.OpenGL.GLU.Matrix (
ortho2D, perspective, lookAt, pickMatrix,
project, unProject, unProject4
) where
import Foreign.Marshal.Alloc
import Foreign.Marshal.Array
import Foreign.Ptr
import Foreign.Storable
import Graphics.GLU
import Graphics.Rendering.OpenGL.GL.CoordTrans
import Graphics.Rendering.OpenGL.GL.GLboolean
import Graphics.Rendering.OpenGL.GL.Tensor
import Graphics.Rendering.OpenGL.GLU.ErrorsInternal
import Graphics.GL
ortho2D :: GLdouble -> GLdouble -> GLdouble -> GLdouble -> IO ()
ortho2D :: GLdouble -> GLdouble -> GLdouble -> GLdouble -> IO ()
ortho2D = GLdouble -> GLdouble -> GLdouble -> GLdouble -> IO ()
forall (m :: * -> *).
MonadIO m =>
GLdouble -> GLdouble -> GLdouble -> GLdouble -> m ()
gluOrtho2D
perspective :: GLdouble -> GLdouble -> GLdouble -> GLdouble -> IO ()
perspective :: GLdouble -> GLdouble -> GLdouble -> GLdouble -> IO ()
perspective = GLdouble -> GLdouble -> GLdouble -> GLdouble -> IO ()
forall (m :: * -> *).
MonadIO m =>
GLdouble -> GLdouble -> GLdouble -> GLdouble -> m ()
gluPerspective
lookAt :: Vertex3 GLdouble -> Vertex3 GLdouble -> Vector3 GLdouble -> IO ()
lookAt :: Vertex3 GLdouble -> Vertex3 GLdouble -> Vector3 GLdouble -> IO ()
lookAt (Vertex3 eyeX :: GLdouble
eyeX eyeY :: GLdouble
eyeY eyeZ :: GLdouble
eyeZ)
(Vertex3 centerX :: GLdouble
centerX centerY :: GLdouble
centerY centerZ :: GLdouble
centerZ)
(Vector3 upX :: GLdouble
upX upY :: GLdouble
upY upZ :: GLdouble
upZ) =
GLdouble
-> GLdouble
-> GLdouble
-> GLdouble
-> GLdouble
-> GLdouble
-> GLdouble
-> GLdouble
-> GLdouble
-> IO ()
forall (m :: * -> *).
MonadIO m =>
GLdouble
-> GLdouble
-> GLdouble
-> GLdouble
-> GLdouble
-> GLdouble
-> GLdouble
-> GLdouble
-> GLdouble
-> m ()
gluLookAt GLdouble
eyeX GLdouble
eyeY GLdouble
eyeZ GLdouble
centerX GLdouble
centerY GLdouble
centerZ GLdouble
upX GLdouble
upY GLdouble
upZ
pickMatrix ::
(GLdouble, GLdouble) -> (GLdouble, GLdouble) -> (Position, Size) -> IO ()
pickMatrix :: (GLdouble, GLdouble)
-> (GLdouble, GLdouble) -> (Position, Size) -> IO ()
pickMatrix (x :: GLdouble
x, y :: GLdouble
y) (w :: GLdouble
w, h :: GLdouble
h) viewPort :: (Position, Size)
viewPort =
(Position, Size) -> (Ptr GLint -> IO ()) -> IO ()
forall a. (Position, Size) -> (Ptr GLint -> IO a) -> IO a
withViewport (Position, Size)
viewPort ((Ptr GLint -> IO ()) -> IO ()) -> (Ptr GLint -> IO ()) -> IO ()
forall a b. (a -> b) -> a -> b
$ GLdouble -> GLdouble -> GLdouble -> GLdouble -> Ptr GLint -> IO ()
forall (m :: * -> *).
MonadIO m =>
GLdouble -> GLdouble -> GLdouble -> GLdouble -> Ptr GLint -> m ()
gluPickMatrix GLdouble
x GLdouble
y GLdouble
w GLdouble
h
project ::
Matrix m
=> Vertex3 GLdouble -> m GLdouble -> m GLdouble -> (Position, Size)
-> IO (Vertex3 GLdouble)
project :: Vertex3 GLdouble
-> m GLdouble
-> m GLdouble
-> (Position, Size)
-> IO (Vertex3 GLdouble)
project (Vertex3 objX :: GLdouble
objX objY :: GLdouble
objY objZ :: GLdouble
objZ) model :: m GLdouble
model proj :: m GLdouble
proj viewPort :: (Position, Size)
viewPort =
m GLdouble
-> (Ptr GLdouble -> IO (Vertex3 GLdouble)) -> IO (Vertex3 GLdouble)
forall (m :: * -> *) c b.
(Matrix m, MatrixComponent c) =>
m c -> (Ptr c -> IO b) -> IO b
withColumnMajor m GLdouble
model ((Ptr GLdouble -> IO (Vertex3 GLdouble)) -> IO (Vertex3 GLdouble))
-> (Ptr GLdouble -> IO (Vertex3 GLdouble)) -> IO (Vertex3 GLdouble)
forall a b. (a -> b) -> a -> b
$ \modelBuf :: Ptr GLdouble
modelBuf ->
m GLdouble
-> (Ptr GLdouble -> IO (Vertex3 GLdouble)) -> IO (Vertex3 GLdouble)
forall (m :: * -> *) c b.
(Matrix m, MatrixComponent c) =>
m c -> (Ptr c -> IO b) -> IO b
withColumnMajor m GLdouble
proj ((Ptr GLdouble -> IO (Vertex3 GLdouble)) -> IO (Vertex3 GLdouble))
-> (Ptr GLdouble -> IO (Vertex3 GLdouble)) -> IO (Vertex3 GLdouble)
forall a b. (a -> b) -> a -> b
$ \projBuf :: Ptr GLdouble
projBuf ->
(Position, Size)
-> (Ptr GLint -> IO (Vertex3 GLdouble)) -> IO (Vertex3 GLdouble)
forall a. (Position, Size) -> (Ptr GLint -> IO a) -> IO a
withViewport (Position, Size)
viewPort ((Ptr GLint -> IO (Vertex3 GLdouble)) -> IO (Vertex3 GLdouble))
-> (Ptr GLint -> IO (Vertex3 GLdouble)) -> IO (Vertex3 GLdouble)
forall a b. (a -> b) -> a -> b
$ \viewBuf :: Ptr GLint
viewBuf ->
(Ptr GLdouble -> Ptr GLdouble -> Ptr GLdouble -> IO GLint)
-> IO (Vertex3 GLdouble)
getVertex3 ((Ptr GLdouble -> Ptr GLdouble -> Ptr GLdouble -> IO GLint)
-> IO (Vertex3 GLdouble))
-> (Ptr GLdouble -> Ptr GLdouble -> Ptr GLdouble -> IO GLint)
-> IO (Vertex3 GLdouble)
forall a b. (a -> b) -> a -> b
$ GLdouble
-> GLdouble
-> GLdouble
-> Ptr GLdouble
-> Ptr GLdouble
-> Ptr GLint
-> Ptr GLdouble
-> Ptr GLdouble
-> Ptr GLdouble
-> IO GLint
forall (m :: * -> *).
MonadIO m =>
GLdouble
-> GLdouble
-> GLdouble
-> Ptr GLdouble
-> Ptr GLdouble
-> Ptr GLint
-> Ptr GLdouble
-> Ptr GLdouble
-> Ptr GLdouble
-> m GLint
gluProject GLdouble
objX GLdouble
objY GLdouble
objZ Ptr GLdouble
modelBuf Ptr GLdouble
projBuf Ptr GLint
viewBuf
unProject ::
Matrix m
=> Vertex3 GLdouble -> m GLdouble -> m GLdouble -> (Position, Size)
-> IO (Vertex3 GLdouble)
unProject :: Vertex3 GLdouble
-> m GLdouble
-> m GLdouble
-> (Position, Size)
-> IO (Vertex3 GLdouble)
unProject (Vertex3 objX :: GLdouble
objX objY :: GLdouble
objY objZ :: GLdouble
objZ) model :: m GLdouble
model proj :: m GLdouble
proj viewPort :: (Position, Size)
viewPort =
m GLdouble
-> (Ptr GLdouble -> IO (Vertex3 GLdouble)) -> IO (Vertex3 GLdouble)
forall (m :: * -> *) c b.
(Matrix m, MatrixComponent c) =>
m c -> (Ptr c -> IO b) -> IO b
withColumnMajor m GLdouble
model ((Ptr GLdouble -> IO (Vertex3 GLdouble)) -> IO (Vertex3 GLdouble))
-> (Ptr GLdouble -> IO (Vertex3 GLdouble)) -> IO (Vertex3 GLdouble)
forall a b. (a -> b) -> a -> b
$ \modelBuf :: Ptr GLdouble
modelBuf ->
m GLdouble
-> (Ptr GLdouble -> IO (Vertex3 GLdouble)) -> IO (Vertex3 GLdouble)
forall (m :: * -> *) c b.
(Matrix m, MatrixComponent c) =>
m c -> (Ptr c -> IO b) -> IO b
withColumnMajor m GLdouble
proj ((Ptr GLdouble -> IO (Vertex3 GLdouble)) -> IO (Vertex3 GLdouble))
-> (Ptr GLdouble -> IO (Vertex3 GLdouble)) -> IO (Vertex3 GLdouble)
forall a b. (a -> b) -> a -> b
$ \projBuf :: Ptr GLdouble
projBuf ->
(Position, Size)
-> (Ptr GLint -> IO (Vertex3 GLdouble)) -> IO (Vertex3 GLdouble)
forall a. (Position, Size) -> (Ptr GLint -> IO a) -> IO a
withViewport (Position, Size)
viewPort ((Ptr GLint -> IO (Vertex3 GLdouble)) -> IO (Vertex3 GLdouble))
-> (Ptr GLint -> IO (Vertex3 GLdouble)) -> IO (Vertex3 GLdouble)
forall a b. (a -> b) -> a -> b
$ \viewBuf :: Ptr GLint
viewBuf ->
(Ptr GLdouble -> Ptr GLdouble -> Ptr GLdouble -> IO GLint)
-> IO (Vertex3 GLdouble)
getVertex3 ((Ptr GLdouble -> Ptr GLdouble -> Ptr GLdouble -> IO GLint)
-> IO (Vertex3 GLdouble))
-> (Ptr GLdouble -> Ptr GLdouble -> Ptr GLdouble -> IO GLint)
-> IO (Vertex3 GLdouble)
forall a b. (a -> b) -> a -> b
$ GLdouble
-> GLdouble
-> GLdouble
-> Ptr GLdouble
-> Ptr GLdouble
-> Ptr GLint
-> Ptr GLdouble
-> Ptr GLdouble
-> Ptr GLdouble
-> IO GLint
forall (m :: * -> *).
MonadIO m =>
GLdouble
-> GLdouble
-> GLdouble
-> Ptr GLdouble
-> Ptr GLdouble
-> Ptr GLint
-> Ptr GLdouble
-> Ptr GLdouble
-> Ptr GLdouble
-> m GLint
gluUnProject GLdouble
objX GLdouble
objY GLdouble
objZ Ptr GLdouble
modelBuf Ptr GLdouble
projBuf Ptr GLint
viewBuf
unProject4 ::
Matrix m
=> Vertex4 GLdouble -> m GLdouble -> m GLdouble -> (Position, Size)
-> GLclampd -> GLclampd
-> IO (Vertex4 GLdouble)
unProject4 :: Vertex4 GLdouble
-> m GLdouble
-> m GLdouble
-> (Position, Size)
-> GLdouble
-> GLdouble
-> IO (Vertex4 GLdouble)
unProject4 (Vertex4 objX :: GLdouble
objX objY :: GLdouble
objY objZ :: GLdouble
objZ clipW :: GLdouble
clipW) model :: m GLdouble
model proj :: m GLdouble
proj viewPort :: (Position, Size)
viewPort near :: GLdouble
near far :: GLdouble
far =
m GLdouble
-> (Ptr GLdouble -> IO (Vertex4 GLdouble)) -> IO (Vertex4 GLdouble)
forall (m :: * -> *) c b.
(Matrix m, MatrixComponent c) =>
m c -> (Ptr c -> IO b) -> IO b
withColumnMajor m GLdouble
model ((Ptr GLdouble -> IO (Vertex4 GLdouble)) -> IO (Vertex4 GLdouble))
-> (Ptr GLdouble -> IO (Vertex4 GLdouble)) -> IO (Vertex4 GLdouble)
forall a b. (a -> b) -> a -> b
$ \modelBuf :: Ptr GLdouble
modelBuf ->
m GLdouble
-> (Ptr GLdouble -> IO (Vertex4 GLdouble)) -> IO (Vertex4 GLdouble)
forall (m :: * -> *) c b.
(Matrix m, MatrixComponent c) =>
m c -> (Ptr c -> IO b) -> IO b
withColumnMajor m GLdouble
proj ((Ptr GLdouble -> IO (Vertex4 GLdouble)) -> IO (Vertex4 GLdouble))
-> (Ptr GLdouble -> IO (Vertex4 GLdouble)) -> IO (Vertex4 GLdouble)
forall a b. (a -> b) -> a -> b
$ \projBuf :: Ptr GLdouble
projBuf ->
(Position, Size)
-> (Ptr GLint -> IO (Vertex4 GLdouble)) -> IO (Vertex4 GLdouble)
forall a. (Position, Size) -> (Ptr GLint -> IO a) -> IO a
withViewport (Position, Size)
viewPort ((Ptr GLint -> IO (Vertex4 GLdouble)) -> IO (Vertex4 GLdouble))
-> (Ptr GLint -> IO (Vertex4 GLdouble)) -> IO (Vertex4 GLdouble)
forall a b. (a -> b) -> a -> b
$ \viewBuf :: Ptr GLint
viewBuf ->
(Ptr GLdouble
-> Ptr GLdouble -> Ptr GLdouble -> Ptr GLdouble -> IO GLint)
-> IO (Vertex4 GLdouble)
getVertex4 ((Ptr GLdouble
-> Ptr GLdouble -> Ptr GLdouble -> Ptr GLdouble -> IO GLint)
-> IO (Vertex4 GLdouble))
-> (Ptr GLdouble
-> Ptr GLdouble -> Ptr GLdouble -> Ptr GLdouble -> IO GLint)
-> IO (Vertex4 GLdouble)
forall a b. (a -> b) -> a -> b
$
GLdouble
-> GLdouble
-> GLdouble
-> GLdouble
-> Ptr GLdouble
-> Ptr GLdouble
-> Ptr GLint
-> GLdouble
-> GLdouble
-> Ptr GLdouble
-> Ptr GLdouble
-> Ptr GLdouble
-> Ptr GLdouble
-> IO GLint
forall (m :: * -> *).
MonadIO m =>
GLdouble
-> GLdouble
-> GLdouble
-> GLdouble
-> Ptr GLdouble
-> Ptr GLdouble
-> Ptr GLint
-> GLdouble
-> GLdouble
-> Ptr GLdouble
-> Ptr GLdouble
-> Ptr GLdouble
-> Ptr GLdouble
-> m GLint
gluUnProject4 GLdouble
objX GLdouble