module Graphics.Rendering.OpenGL.GL.Clipping (
ClipPlaneName(..), clipPlane, maxClipPlanes
) where
import Data.StateVar
import Foreign.Marshal.Alloc
import Foreign.Marshal.Utils
import Foreign.Ptr
import Graphics.Rendering.OpenGL.GL.Capability
import Graphics.Rendering.OpenGL.GL.CoordTrans
import Graphics.Rendering.OpenGL.GL.PeekPoke
import Graphics.Rendering.OpenGL.GL.QueryUtils
import Graphics.Rendering.OpenGL.GLU.ErrorsInternal
import Graphics.Rendering.OpenGL.Raw.ARB.Compatibility ( glClipPlane )
import Graphics.Rendering.OpenGL.Raw.Core31
newtype ClipPlaneName = ClipPlaneName GLsizei
deriving ( Eq, Ord, Show )
clipPlane :: ClipPlaneName -> StateVar (Maybe (Plane GLdouble))
clipPlane (ClipPlaneName i) =
makeStateVarMaybe
(return (CapClipPlane i))
(alloca $ \buf -> do
getDoublev (GetClipPlane i) (castPtr buf)
peek1 id (buf :: Ptr (Plane GLdouble)))
(\plane -> maybe recordInvalidEnum (with plane . glClipPlane_)
(clipPlaneIndexToEnum i))
glClipPlane_ :: GLenum -> Ptr (Plane GLdouble) -> IO ()
glClipPlane_ plane ptr = glClipPlane plane (castPtr ptr)
maxClipPlanes :: GettableStateVar GLsizei
maxClipPlanes = makeGettableStateVar (getSizei1 id GetMaxClipPlanes)