OpenGL-2.2.1.1: Graphics/Rendering/OpenGL/GL/Rectangles.hs
--------------------------------------------------------------------------------
-- |
-- Module : Graphics.Rendering.OpenGL.GL.Rectangles
-- Copyright : (c) Sven Panne 2002-2006
-- License : BSD-style (see the file libraries/OpenGL/LICENSE)
--
-- Maintainer : sven.panne@aedion.de
-- Stability : stable
-- Portability : portable
--
-- This module corresponds to section 2.10 (Rectangles) of the OpenGL 2.1 specs.
--
--------------------------------------------------------------------------------
module Graphics.Rendering.OpenGL.GL.Rectangles (
Rect(..)
) where
import Data.Int
import Foreign.Ptr ( Ptr )
import Graphics.Rendering.OpenGL.GL.BasicTypes (
GLshort, GLint, GLfloat, GLdouble )
import Graphics.Rendering.OpenGL.GL.VertexSpec ( Vertex2(..) )
#ifdef __HADDOCK__
import Graphics.Rendering.OpenGL.GL.BeginEnd ( PrimitiveMode(Polygon) )
#endif
--------------------------------------------------------------------------------
#include "HsOpenGLExt.h"
#include "HsOpenGLTypes.h"
--------------------------------------------------------------------------------
-- | 'rect' and 'rectv' support efficient specification of rectangles as two
-- corner points. Each rectangle command takes four arguments, organized either
-- as two consecutive pairs of (/x/, /y/) coordinates, or as two pointers to
-- arrays, each containing an (/x/, /y/) pair. The resulting rectangle is
-- defined in the /z/ = 0 plane.
--
-- @'rect' ('Vertex2' x1 y1) ('Vertex2' x2, y2)@ is exactly equivalent to the
-- following sequence:
--
-- @
-- 'Graphics.Rendering.OpenGL.GL.BeginEnd.renderPrimitive' 'Graphics.Rendering.OpenGL.GL.BeginEnd.Polygon' $ do
-- 'Graphics.Rendering.OpenGL.GL.VertexSpec.vertex' ('Vertex2' x1 y1)
-- 'Graphics.Rendering.OpenGL.GL.VertexSpec.vertex' ('Vertex2' x2 y1)
-- 'Graphics.Rendering.OpenGL.GL.VertexSpec.vertex' ('Vertex2' x2 y2)
-- 'Graphics.Rendering.OpenGL.GL.VertexSpec.vertex' ('Vertex2' x1 y2)
-- @
--
-- Note that if the second vertex is above and to the right of the first vertex,
-- the rectangle is constructed with a counterclockwise winding.
class Rect a where
rect :: Vertex2 a -> Vertex2 a -> IO ()
rectv :: Ptr a -> Ptr a -> IO ()
--------------------------------------------------------------------------------
foreign import CALLCONV unsafe "glRects" glRects ::
GLshort -> GLshort -> GLshort -> GLshort -> IO ()
foreign import CALLCONV unsafe "glRectsv" glRectsv ::
Ptr GLshort -> Ptr GLshort -> IO ()
instance Rect GLshort_ where
rect (Vertex2 x1 y1) (Vertex2 x2 y2) = glRects x1 y1 x2 y2
rectv ptr1 ptr2 = glRectsv ptr1 ptr2
--------------------------------------------------------------------------------
foreign import CALLCONV unsafe "glRecti" glRecti ::
GLint -> GLint -> GLint -> GLint -> IO ()
foreign import CALLCONV unsafe "glRectiv" glRectiv ::
Ptr GLint -> Ptr GLint -> IO ()
instance Rect GLint_ where
rect (Vertex2 x1 y1) (Vertex2 x2 y2) = glRecti x1 y1 x2 y2
rectv ptr1 ptr2 = glRectiv ptr1 ptr2
--------------------------------------------------------------------------------
foreign import CALLCONV unsafe "glRectf" glRectf ::
GLfloat -> GLfloat -> GLfloat -> GLfloat -> IO ()
foreign import CALLCONV unsafe "glRectfv" glRectfv ::
Ptr GLfloat -> Ptr GLfloat -> IO ()
instance Rect GLfloat_ where
rect (Vertex2 x1 y1) (Vertex2 x2 y2) = glRectf x1 y1 x2 y2
rectv ptr1 ptr2 = glRectfv ptr1 ptr2
--------------------------------------------------------------------------------
foreign import CALLCONV unsafe "glRectd" glRectd ::
GLdouble -> GLdouble -> GLdouble -> GLdouble -> IO ()
foreign import CALLCONV unsafe "glRectdv" glRectdv ::
Ptr GLdouble -> Ptr GLdouble -> IO ()
instance Rect GLdouble_ where
rect (Vertex2 x1 y1) (Vertex2 x2 y2) = glRectd x1 y1 x2 y2
rectv ptr1 ptr2 = glRectdv ptr1 ptr2