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 GLdouble
eyeX GLdouble
eyeY GLdouble
eyeZ)
(Vertex3 GLdouble
centerX GLdouble
centerY GLdouble
centerZ)
(Vector3 GLdouble
upX GLdouble
upY 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 (GLdouble
x, GLdouble
y) (GLdouble
w, GLdouble
h) (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 :: forall (m :: * -> *).
Matrix m =>
Vertex3 GLdouble
-> m GLdouble
-> m GLdouble
-> (Position, Size)
-> IO (Vertex3 GLdouble)
project (Vertex3 GLdouble
objX GLdouble
objY GLdouble
objZ) m GLdouble
model m GLdouble
proj (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
$ \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
$ \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
$ \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 :: forall (m :: * -> *).
Matrix m =>
Vertex3 GLdouble
-> m GLdouble
-> m GLdouble
-> (Position, Size)
-> IO (Vertex3 GLdouble)
unProject (Vertex3 GLdouble
objX GLdouble
objY GLdouble
objZ) m GLdouble
model m GLdouble
proj (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
$ \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
$ \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
$ \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 :: forall (m :: * -> *).
Matrix m =>
Vertex4 GLdouble
-> m GLdouble
-> m GLdouble
-> (Position, Size)
-> GLdouble
-> GLdouble
-> IO (Vertex4 GLdouble)
unProject4 (Vertex4 GLdouble
objX GLdouble
objY GLdouble
objZ GLdouble
clipW) m GLdouble
model m GLdouble
proj (Position, Size)
viewPort GLdouble
near 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
$ \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
$ \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
$ \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 :: forall a. (Position, Size) -> (Ptr GLint -> IO a) -> IO a
withViewport (Position GLint
x GLint
y, Size GLint
w 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 :: forall (m :: * -> *) c b.
(Matrix m, MatrixComponent c) =>
m c -> (Ptr c -> IO b) -> IO b
withColumnMajor m c
mat 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 MatrixOrder
ColumnMajor Ptr c
p = Ptr c -> IO b
act Ptr c
p
juggle MatrixOrder
RowMajor 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) [ Int
0, Int
4, Int
8, Int
12,
Int
1, Int
5, Int
9, Int
13,
Int
2, Int
6, Int
10, Int
14,
Int
3, Int
7, Int
11, Int
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 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
$ \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
$ \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
$ \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 GLdouble
0 GLdouble
0 GLdouble
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 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
$ \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
$ \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
$ \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
$ \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 GLdouble
0 GLdouble
0 GLdouble
0 GLdouble
0