--------------------------------------------------------------------------------
-- |
-- Module      :  Graphics.Rendering.OpenGL.GLU.Matrix
-- Copyright   :  (c) Sven Panne 2002-2019
-- License     :  BSD3
-- 
-- Maintainer  :  Sven Panne <svenpanne@gmail.com>
-- Stability   :  stable
-- Portability :  portable
--
-- This module corresponds to chapter 4 (Matrix Manipulation) of the GLU specs.
--
--------------------------------------------------------------------------------

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

--------------------------------------------------------------------------------
-- matrix setup

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

--------------------------------------------------------------------------------
-- coordinate projection

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
objY GLdouble
objZ GLdouble
clipW Ptr GLdouble
modelBuf Ptr GLdouble
projBuf Ptr GLint
viewBuf GLdouble
near GLdouble
far

--------------------------------------------------------------------------------

withViewport :: (Position, Size) -> (Ptr GLint -> IO a ) -> IO a
withViewport :: (Position, Size) -> (Ptr GLint -> IO a) -> IO a
withViewport (Position x :: GLint
x y :: GLint
y, Size w :: GLint
w h :: GLint
h) =
   [GLint] -> (Ptr GLint -> IO a) -> IO a
forall a b. Storable a => [a] -> (Ptr a -> IO b) -> IO b
withArray [ GLint
x, GLint
y, GLint -> GLint
forall a b. (Integral a, Num b) => a -> b
fromIntegral GLint
w, GLint -> GLint
forall a b. (Integral a, Num b) => a -> b
fromIntegral GLint
h ]

withColumnMajor :: (Matrix m, MatrixComponent c) => m c -> (Ptr c -> IO b) -> IO b
withColumnMajor :: m c -> (Ptr c -> IO b) -> IO b
withColumnMajor mat :: m c
mat act :: Ptr c -> IO b
act = m c -> (MatrixOrder -> Ptr c -> IO b) -> IO b
forall (m :: * -> *) c a.
(Matrix m, MatrixComponent c) =>
m c -> (MatrixOrder -> Ptr c -> IO a) -> IO a
withMatrix m c
mat MatrixOrder -> Ptr c -> IO b
juggle
   where juggle :: MatrixOrder -> Ptr c -> IO b
juggle ColumnMajor p :: Ptr c
p = Ptr c -> IO b
act Ptr c
p
         juggle RowMajor    p :: Ptr c
p = do
            [c]
transposedElems <- (Int -> IO c) -> [Int] -> IO [c]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
mapM (Ptr c -> Int -> IO c
forall a. Storable a => Ptr a -> Int -> IO a
peekElemOff Ptr c
p) [ 0, 4,  8, 12,
                                                      1, 5,  9, 13,
                                                      2, 6, 10, 14,
                                                      3, 7, 11, 15 ]
            [c] -> (Ptr c -> IO b) -> IO b
forall a b. Storable a => [a] -> (Ptr a -> IO b) -> IO b
withArray [c]
transposedElems Ptr c -> IO b
act

getVertex3 ::
      (Ptr GLdouble -> Ptr GLdouble -> Ptr GLdouble -> IO GLint)
   -> IO (Vertex3 GLdouble)
getVertex3 :: (Ptr GLdouble -> Ptr GLdouble -> Ptr GLdouble -> IO GLint)
-> IO (Vertex3 GLdouble)
getVertex3 act :: Ptr GLdouble -> Ptr GLdouble -> Ptr GLdouble -> IO GLint
act =
   (Ptr GLdouble -> IO (Vertex3 GLdouble)) -> IO (Vertex3 GLdouble)
forall a b. Storable a => (Ptr a -> IO b) -> IO b
alloca ((Ptr GLdouble -> IO (Vertex3 GLdouble)) -> IO (Vertex3 GLdouble))
-> (Ptr GLdouble -> IO (Vertex3 GLdouble)) -> IO (Vertex3 GLdouble)
forall a b. (a -> b) -> a -> b
$ \xBuf :: Ptr GLdouble
xBuf ->
   (Ptr GLdouble -> IO (Vertex3 GLdouble)) -> IO (Vertex3 GLdouble)
forall a b. Storable a => (Ptr a -> IO b) -> IO b
alloca ((Ptr GLdouble -> IO (Vertex3 GLdouble)) -> IO (Vertex3 GLdouble))
-> (Ptr GLdouble -> IO (Vertex3 GLdouble)) -> IO (Vertex3 GLdouble)
forall a b. (a -> b) -> a -> b
$ \yBuf :: Ptr GLdouble
yBuf ->
   (Ptr GLdouble -> IO (Vertex3 GLdouble)) -> IO (Vertex3 GLdouble)
forall a b. Storable a => (Ptr a -> IO b) -> IO b
alloca ((Ptr GLdouble -> IO (Vertex3 GLdouble)) -> IO (Vertex3 GLdouble))
-> (Ptr GLdouble -> IO (Vertex3 GLdouble)) -> IO (Vertex3 GLdouble)
forall a b. (a -> b) -> a -> b
$ \zBuf :: Ptr GLdouble
zBuf -> do
   GLint
ok <- Ptr GLdouble -> Ptr GLdouble -> Ptr GLdouble -> IO GLint
act Ptr GLdouble
xBuf Ptr GLdouble
yBuf Ptr GLdouble
zBuf
   if GLint -> Bool
forall a. (Eq a, Num a) => a -> Bool
unmarshalGLboolean GLint
ok
      then do GLdouble
x <- Ptr GLdouble -> IO GLdouble
forall a. Storable a => Ptr a -> IO a
peek Ptr GLdouble
xBuf
              GLdouble
y <- Ptr GLdouble -> IO GLdouble
forall a. Storable a => Ptr a -> IO a
peek Ptr GLdouble
yBuf
              GLdouble
z <- Ptr GLdouble -> IO GLdouble
forall a. Storable a => Ptr a -> IO a
peek Ptr GLdouble
zBuf
              Vertex3 GLdouble -> IO (Vertex3 GLdouble)
forall (m :: * -> *) a. Monad m => a -> m a
return (Vertex3 GLdouble -> IO (Vertex3 GLdouble))
-> Vertex3 GLdouble -> IO (Vertex3 GLdouble)
forall a b. (a -> b) -> a -> b
$ GLdouble -> GLdouble -> GLdouble -> Vertex3 GLdouble
forall a. a -> a -> a -> Vertex3 a
Vertex3 GLdouble
x GLdouble
y GLdouble
z
      else do IO ()
recordInvalidValue
              Vertex3 GLdouble -> IO (Vertex3 GLdouble)
forall (m :: * -> *) a. Monad m => a -> m a
return (Vertex3 GLdouble -> IO (Vertex3 GLdouble))
-> Vertex3 GLdouble -> IO (Vertex3 GLdouble)
forall a b. (a -> b) -> a -> b
$ GLdouble -> GLdouble -> GLdouble -> Vertex3 GLdouble
forall a. a -> a -> a -> Vertex3 a
Vertex3 0 0 0

getVertex4 ::
      (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)
getVertex4 act :: Ptr GLdouble
-> Ptr GLdouble -> Ptr GLdouble -> Ptr GLdouble -> IO GLint
act =
   (Ptr GLdouble -> IO (Vertex4 GLdouble)) -> IO (Vertex4 GLdouble)
forall a b. Storable a => (Ptr a -> IO b) -> IO b
alloca ((Ptr GLdouble -> IO (Vertex4 GLdouble)) -> IO (Vertex4 GLdouble))
-> (Ptr GLdouble -> IO (Vertex4 GLdouble)) -> IO (Vertex4 GLdouble)
forall a b. (a -> b) -> a -> b
$ \xBuf :: Ptr GLdouble
xBuf ->
   (Ptr GLdouble -> IO (Vertex4 GLdouble)) -> IO (Vertex4 GLdouble)
forall a b. Storable a => (Ptr a -> IO b) -> IO b
alloca ((Ptr GLdouble -> IO (Vertex4 GLdouble)) -> IO (Vertex4 GLdouble))
-> (Ptr GLdouble -> IO (Vertex4 GLdouble)) -> IO (Vertex4 GLdouble)
forall a b. (a -> b) -> a -> b
$ \yBuf :: Ptr GLdouble
yBuf ->
   (Ptr GLdouble -> IO (Vertex4 GLdouble)) -> IO (Vertex4 GLdouble)
forall a b. Storable a => (Ptr a -> IO b) -> IO b
alloca ((Ptr GLdouble -> IO (Vertex4 GLdouble)) -> IO (Vertex4 GLdouble))
-> (Ptr GLdouble -> IO (Vertex4 GLdouble)) -> IO (Vertex4 GLdouble)
forall a b. (a -> b) -> a -> b
$ \zBuf :: Ptr GLdouble
zBuf ->
   (Ptr GLdouble -> IO (Vertex4 GLdouble)) -> IO (Vertex4 GLdouble)
forall a b. Storable a => (Ptr a -> IO b) -> IO b
alloca ((Ptr GLdouble -> IO (Vertex4 GLdouble)) -> IO (Vertex4 GLdouble))
-> (Ptr GLdouble -> IO (Vertex4 GLdouble)) -> IO (Vertex4 GLdouble)
forall a b. (a -> b) -> a -> b
$ \wBuf :: Ptr GLdouble
wBuf -> do
   GLint
ok <- Ptr GLdouble
-> Ptr GLdouble -> Ptr GLdouble -> Ptr GLdouble -> IO GLint
act Ptr GLdouble
xBuf Ptr GLdouble
yBuf Ptr GLdouble
zBuf Ptr GLdouble
wBuf
   if GLint -> Bool
forall a. (Eq a, Num a) => a -> Bool
unmarshalGLboolean GLint
ok
      then do GLdouble
x <- Ptr GLdouble -> IO GLdouble
forall a. Storable a => Ptr a -> IO a
peek Ptr GLdouble
xBuf
              GLdouble
y <- Ptr GLdouble -> IO GLdouble
forall a. Storable a => Ptr a -> IO a
peek Ptr GLdouble
yBuf
              GLdouble
z <- Ptr GLdouble -> IO GLdouble
forall a. Storable a => Ptr a -> IO a
peek Ptr GLdouble
zBuf
              GLdouble
w <- Ptr GLdouble -> IO GLdouble
forall a. Storable a => Ptr a -> IO a
peek Ptr GLdouble
wBuf
              Vertex4 GLdouble -> IO (Vertex4 GLdouble)
forall (m :: * -> *) a. Monad m => a -> m a
return (Vertex4 GLdouble -> IO (Vertex4 GLdouble))
-> Vertex4 GLdouble -> IO (Vertex4 GLdouble)
forall a b. (a -> b) -> a -> b
$ GLdouble -> GLdouble -> GLdouble -> GLdouble -> Vertex4 GLdouble
forall a. a -> a -> a -> a -> Vertex4 a
Vertex4 GLdouble
x GLdouble
y GLdouble
z GLdouble
w
      else do IO ()
recordInvalidValue
              Vertex4 GLdouble -> IO (Vertex4 GLdouble)
forall (m :: * -> *) a. Monad m => a -> m a
return (Vertex4 GLdouble -> IO (Vertex4 GLdouble))
-> Vertex4 GLdouble -> IO (Vertex4 GLdouble)
forall a b. (a -> b) -> a -> b
$ GLdouble -> GLdouble -> GLdouble -> GLdouble -> Vertex4 GLdouble
forall a. a -> a -> a -> a -> Vertex4 a
Vertex4 0 0 0 0