--------------------------------------------------------------------------------
-- |
-- Module      :  Graphics.Rendering.OpenGL.GL.Fog
-- Copyright   :  (c) Sven Panne 2002-2019
-- License     :  BSD3
-- 
-- Maintainer  :  Sven Panne <svenpanne@gmail.com>
-- Stability   :  stable
-- Portability :  portable
--
-- This module corresponds to section 3.10 (Fog) of the OpenGL 2.1 specs.
--
--------------------------------------------------------------------------------

module Graphics.Rendering.OpenGL.GL.Fog (
   fog,
   FogMode(..), fogMode,
   fogColor, fogIndex,
   FogCoordSrc(..), fogCoordSrc,
   FogDistanceMode(..), fogDistanceMode
) where

import Data.StateVar
import Foreign.Marshal.Utils
import Foreign.Ptr
import Graphics.Rendering.OpenGL.GL.Capability
import Graphics.Rendering.OpenGL.GL.QueryUtils
import Graphics.Rendering.OpenGL.GL.VertexSpec
import Graphics.GL

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

fog :: StateVar Capability
fog :: StateVar Capability
fog = EnableCap -> StateVar Capability
makeCapability EnableCap
CapFog

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

data FogParameter =
     FogIndex
   | FogDensity
   | FogStart
   | FogEnd
   | FogMode
   | FogColor
   | FogCoordSrc
   | FogDistanceMode

marshalFogParameter :: FogParameter -> GLenum
marshalFogParameter :: FogParameter -> GLenum
marshalFogParameter FogParameter
x = case FogParameter
x of
   FogParameter
FogIndex -> GLenum
GL_FOG_INDEX
   FogParameter
FogDensity -> GLenum
GL_FOG_DENSITY
   FogParameter
FogStart -> GLenum
GL_FOG_START
   FogParameter
FogEnd -> GLenum
GL_FOG_END
   FogParameter
FogMode -> GLenum
GL_FOG_MODE
   FogParameter
FogColor -> GLenum
GL_FOG_COLOR
   FogParameter
FogCoordSrc -> GLenum
GL_FOG_COORD_SRC
   FogParameter
FogDistanceMode -> GLenum
GL_FOG_DISTANCE_MODE_NV

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

data FogMode' =
     Linear'
   | Exp'
   | Exp2'

marshalFogMode' :: FogMode' -> GLint
marshalFogMode' :: FogMode' -> GLint
marshalFogMode' FogMode'
x = forall a b. (Integral a, Num b) => a -> b
fromIntegral forall a b. (a -> b) -> a -> b
$ case FogMode'
x of
   FogMode'
Linear' -> GLenum
GL_LINEAR
   FogMode'
Exp' -> GLenum
GL_EXP
   FogMode'
Exp2' -> GLenum
GL_EXP2

unmarshalFogMode' :: GLint -> FogMode'
unmarshalFogMode' :: GLint -> FogMode'
unmarshalFogMode' GLint
x
   | GLenum
y forall a. Eq a => a -> a -> Bool
== GLenum
GL_LINEAR = FogMode'
Linear'
   | GLenum
y forall a. Eq a => a -> a -> Bool
== GLenum
GL_EXP = FogMode'
Exp'
   | GLenum
y forall a. Eq a => a -> a -> Bool
== GLenum
GL_EXP2 = FogMode'
Exp2'
   | Bool
otherwise = forall a. HasCallStack => [Char] -> a
error ([Char]
"unmarshalFogMode': illegal value " forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> [Char]
show GLint
x)
   where y :: GLenum
y = forall a b. (Integral a, Num b) => a -> b
fromIntegral GLint
x

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

data FogMode =
     Linear GLfloat GLfloat
   | Exp GLfloat
   | Exp2 GLfloat
   deriving ( FogMode -> FogMode -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: FogMode -> FogMode -> Bool
$c/= :: FogMode -> FogMode -> Bool
== :: FogMode -> FogMode -> Bool
$c== :: FogMode -> FogMode -> Bool
Eq, Eq FogMode
FogMode -> FogMode -> Bool
FogMode -> FogMode -> Ordering
FogMode -> FogMode -> FogMode
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: FogMode -> FogMode -> FogMode
$cmin :: FogMode -> FogMode -> FogMode
max :: FogMode -> FogMode -> FogMode
$cmax :: FogMode -> FogMode -> FogMode
>= :: FogMode -> FogMode -> Bool
$c>= :: FogMode -> FogMode -> Bool
> :: FogMode -> FogMode -> Bool
$c> :: FogMode -> FogMode -> Bool
<= :: FogMode -> FogMode -> Bool
$c<= :: FogMode -> FogMode -> Bool
< :: FogMode -> FogMode -> Bool
$c< :: FogMode -> FogMode -> Bool
compare :: FogMode -> FogMode -> Ordering
$ccompare :: FogMode -> FogMode -> Ordering
Ord, Int -> FogMode -> ShowS
[FogMode] -> ShowS
FogMode -> [Char]
forall a.
(Int -> a -> ShowS) -> (a -> [Char]) -> ([a] -> ShowS) -> Show a
showList :: [FogMode] -> ShowS
$cshowList :: [FogMode] -> ShowS
show :: FogMode -> [Char]
$cshow :: FogMode -> [Char]
showsPrec :: Int -> FogMode -> ShowS
$cshowsPrec :: Int -> FogMode -> ShowS
Show )

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

fogMode :: StateVar FogMode
fogMode :: StateVar FogMode
fogMode = forall a. IO a -> (a -> IO ()) -> StateVar a
makeStateVar IO FogMode
getFogMode FogMode -> IO ()
setFogMode

getFogMode :: IO FogMode
getFogMode :: IO FogMode
getFogMode = do
   FogMode'
mode <- forall p a. GetPName1I p => (GLint -> a) -> p -> IO a
getInteger1 GLint -> FogMode'
unmarshalFogMode' PName1I
GetFogMode
   case FogMode'
mode of
      FogMode'
Linear' -> do
         GLclampf
start <- forall p a. GetPName1F p => (GLclampf -> a) -> p -> IO a
getFloat1 forall a. a -> a
id PName1F
GetFogStart
         GLclampf
end <- forall p a. GetPName1F p => (GLclampf -> a) -> p -> IO a
getFloat1 forall a. a -> a
id PName1F
GetFogEnd
         forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ GLclampf -> GLclampf -> FogMode
Linear GLclampf
start GLclampf
end
      FogMode'
Exp' -> forall p a. GetPName1F p => (GLclampf -> a) -> p -> IO a
getFloat1 GLclampf -> FogMode
Exp PName1F
GetFogDensity
      FogMode'
Exp2' -> forall p a. GetPName1F p => (GLclampf -> a) -> p -> IO a
getFloat1 GLclampf -> FogMode
Exp2 PName1F
GetFogDensity

setFogMode :: FogMode -> IO ()
setFogMode :: FogMode -> IO ()
setFogMode (Linear GLclampf
start GLclampf
end) = do
   FogParameter -> GLint -> IO ()
fogi FogParameter
FogMode (FogMode' -> GLint
marshalFogMode' FogMode'
Linear')
   FogParameter -> GLclampf -> IO ()
fogf FogParameter
FogStart GLclampf
start
   FogParameter -> GLclampf -> IO ()
fogf FogParameter
FogEnd GLclampf
end
setFogMode (Exp GLclampf
density) = do
   FogParameter -> GLint -> IO ()
fogi FogParameter
FogMode (FogMode' -> GLint
marshalFogMode' FogMode'
Exp')
   FogParameter -> GLclampf -> IO ()
fogf FogParameter
FogDensity GLclampf
density
setFogMode (Exp2 GLclampf
density) = do
   FogParameter -> GLint -> IO ()
fogi FogParameter
FogMode (FogMode' -> GLint
marshalFogMode' FogMode'
Exp2')
   FogParameter -> GLclampf -> IO ()
fogf FogParameter
FogDensity GLclampf
density

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

fogi :: FogParameter -> GLint -> IO ()
fogi :: FogParameter -> GLint -> IO ()
fogi = forall (m :: * -> *). MonadIO m => GLenum -> GLint -> m ()
glFogi forall b c a. (b -> c) -> (a -> b) -> a -> c
. FogParameter -> GLenum
marshalFogParameter

fogf :: FogParameter -> GLfloat -> IO ()
fogf :: FogParameter -> GLclampf -> IO ()
fogf = forall (m :: * -> *). MonadIO m => GLenum -> GLclampf -> m ()
glFogf forall b c a. (b -> c) -> (a -> b) -> a -> c
. FogParameter -> GLenum
marshalFogParameter

fogfv :: FogParameter -> Ptr (Color4 GLfloat) -> IO ()
fogfv :: FogParameter -> Ptr (Color4 GLclampf) -> IO ()
fogfv FogParameter
param Ptr (Color4 GLclampf)
ptr = forall (m :: * -> *). MonadIO m => GLenum -> Ptr GLclampf -> m ()
glFogfv (FogParameter -> GLenum
marshalFogParameter FogParameter
param) (forall a b. Ptr a -> Ptr b
castPtr Ptr (Color4 GLclampf)
ptr)

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

fogColor :: StateVar (Color4 GLclampf)
fogColor :: StateVar (Color4 GLclampf)
fogColor =
   forall a. IO a -> (a -> IO ()) -> StateVar a
makeStateVar
      (forall p a.
GetPName4F p =>
(GLclampf -> GLclampf -> GLclampf -> GLclampf -> a) -> p -> IO a
getClampf4 forall a. a -> a -> a -> a -> Color4 a
Color4 PName4F
GetFogColor)
      (\Color4 GLclampf
c -> forall a b. Storable a => a -> (Ptr a -> IO b) -> IO b
with Color4 GLclampf
c forall a b. (a -> b) -> a -> b
$ (FogParameter -> Ptr (Color4 GLclampf) -> IO ()
fogfv FogParameter
FogColor forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a b. Ptr a -> Ptr b
castPtr))

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

fogIndex :: StateVar (Index1 GLint)
fogIndex :: StateVar (Index1 GLint)
fogIndex =
   forall a. IO a -> (a -> IO ()) -> StateVar a
makeStateVar
      (forall p a. GetPName1I p => (GLint -> a) -> p -> IO a
getInteger1 forall a. a -> Index1 a
Index1 PName1I
GetFogIndex)
      (\(Index1 GLint
i) -> FogParameter -> GLint -> IO ()
fogi FogParameter
FogIndex GLint
i)

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

data FogCoordSrc =
     FogCoord
   | FragmentDepth
   deriving ( FogCoordSrc -> FogCoordSrc -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: FogCoordSrc -> FogCoordSrc -> Bool
$c/= :: FogCoordSrc -> FogCoordSrc -> Bool
== :: FogCoordSrc -> FogCoordSrc -> Bool
$c== :: FogCoordSrc -> FogCoordSrc -> Bool
Eq, Eq FogCoordSrc
FogCoordSrc -> FogCoordSrc -> Bool
FogCoordSrc -> FogCoordSrc -> Ordering
FogCoordSrc -> FogCoordSrc -> FogCoordSrc
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: FogCoordSrc -> FogCoordSrc -> FogCoordSrc
$cmin :: FogCoordSrc -> FogCoordSrc -> FogCoordSrc
max :: FogCoordSrc -> FogCoordSrc -> FogCoordSrc
$cmax :: FogCoordSrc -> FogCoordSrc -> FogCoordSrc
>= :: FogCoordSrc -> FogCoordSrc -> Bool
$c>= :: FogCoordSrc -> FogCoordSrc -> Bool
> :: FogCoordSrc -> FogCoordSrc -> Bool
$c> :: FogCoordSrc -> FogCoordSrc -> Bool
<= :: FogCoordSrc -> FogCoordSrc -> Bool
$c<= :: FogCoordSrc -> FogCoordSrc -> Bool
< :: FogCoordSrc -> FogCoordSrc -> Bool
$c< :: FogCoordSrc -> FogCoordSrc -> Bool
compare :: FogCoordSrc -> FogCoordSrc -> Ordering
$ccompare :: FogCoordSrc -> FogCoordSrc -> Ordering
Ord, Int -> FogCoordSrc -> ShowS
[FogCoordSrc] -> ShowS
FogCoordSrc -> [Char]
forall a.
(Int -> a -> ShowS) -> (a -> [Char]) -> ([a] -> ShowS) -> Show a
showList :: [FogCoordSrc] -> ShowS
$cshowList :: [FogCoordSrc] -> ShowS
show :: FogCoordSrc -> [Char]
$cshow :: FogCoordSrc -> [Char]
showsPrec :: Int -> FogCoordSrc -> ShowS
$cshowsPrec :: Int -> FogCoordSrc -> ShowS
Show )

marshalFogCoordSrc :: FogCoordSrc -> GLint
marshalFogCoordSrc :: FogCoordSrc -> GLint
marshalFogCoordSrc FogCoordSrc
x = forall a b. (Integral a, Num b) => a -> b
fromIntegral forall a b. (a -> b) -> a -> b
$ case FogCoordSrc
x of
   FogCoordSrc
FogCoord -> GLenum
GL_FOG_COORD
   FogCoordSrc
FragmentDepth -> GLenum
GL_FRAGMENT_DEPTH

unmarshalFogCoordSrc :: GLint -> FogCoordSrc
unmarshalFogCoordSrc :: GLint -> FogCoordSrc
unmarshalFogCoordSrc GLint
x
   | GLenum
y forall a. Eq a => a -> a -> Bool
== GLenum
GL_FOG_COORD = FogCoordSrc
FogCoord
   | GLenum
y forall a. Eq a => a -> a -> Bool
== GLenum
GL_FRAGMENT_DEPTH = FogCoordSrc
FragmentDepth
   | Bool
otherwise = forall a. HasCallStack => [Char] -> a
error ([Char]
"unmarshalFogCoordSrc: illegal value " forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> [Char]
show GLint
x)
   where y :: GLenum
y = forall a b. (Integral a, Num b) => a -> b
fromIntegral GLint
x

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

fogCoordSrc :: StateVar FogCoordSrc
fogCoordSrc :: StateVar FogCoordSrc
fogCoordSrc =
   forall a. IO a -> (a -> IO ()) -> StateVar a
makeStateVar
      (forall p a. GetPName1I p => (GLint -> a) -> p -> IO a
getInteger1 GLint -> FogCoordSrc
unmarshalFogCoordSrc PName1I
GetFogCoordSrc)
      (FogParameter -> GLint -> IO ()
fogi FogParameter
FogCoordSrc forall b c a. (b -> c) -> (a -> b) -> a -> c
. FogCoordSrc -> GLint
marshalFogCoordSrc)

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

data FogDistanceMode =
     EyeRadial
   | EyePlaneSigned
   | EyePlaneAbsolute
   deriving ( FogDistanceMode -> FogDistanceMode -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: FogDistanceMode -> FogDistanceMode -> Bool
$c/= :: FogDistanceMode -> FogDistanceMode -> Bool
== :: FogDistanceMode -> FogDistanceMode -> Bool
$c== :: FogDistanceMode -> FogDistanceMode -> Bool
Eq, Eq FogDistanceMode
FogDistanceMode -> FogDistanceMode -> Bool
FogDistanceMode -> FogDistanceMode -> Ordering
FogDistanceMode -> FogDistanceMode -> FogDistanceMode
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: FogDistanceMode -> FogDistanceMode -> FogDistanceMode
$cmin :: FogDistanceMode -> FogDistanceMode -> FogDistanceMode
max :: FogDistanceMode -> FogDistanceMode -> FogDistanceMode
$cmax :: FogDistanceMode -> FogDistanceMode -> FogDistanceMode
>= :: FogDistanceMode -> FogDistanceMode -> Bool
$c>= :: FogDistanceMode -> FogDistanceMode -> Bool
> :: FogDistanceMode -> FogDistanceMode -> Bool
$c> :: FogDistanceMode -> FogDistanceMode -> Bool
<= :: FogDistanceMode -> FogDistanceMode -> Bool
$c<= :: FogDistanceMode -> FogDistanceMode -> Bool
< :: FogDistanceMode -> FogDistanceMode -> Bool
$c< :: FogDistanceMode -> FogDistanceMode -> Bool
compare :: FogDistanceMode -> FogDistanceMode -> Ordering
$ccompare :: FogDistanceMode -> FogDistanceMode -> Ordering
Ord, Int -> FogDistanceMode -> ShowS
[FogDistanceMode] -> ShowS
FogDistanceMode -> [Char]
forall a.
(Int -> a -> ShowS) -> (a -> [Char]) -> ([a] -> ShowS) -> Show a
showList :: [FogDistanceMode] -> ShowS
$cshowList :: [FogDistanceMode] -> ShowS
show :: FogDistanceMode -> [Char]
$cshow :: FogDistanceMode -> [Char]
showsPrec :: Int -> FogDistanceMode -> ShowS
$cshowsPrec :: Int -> FogDistanceMode -> ShowS
Show )

marshalFogDistanceMode :: FogDistanceMode -> GLint
marshalFogDistanceMode :: FogDistanceMode -> GLint
marshalFogDistanceMode FogDistanceMode
x = forall a b. (Integral a, Num b) => a -> b
fromIntegral forall a b. (a -> b) -> a -> b
$ case FogDistanceMode
x of
   FogDistanceMode
EyeRadial -> GLenum
GL_EYE_RADIAL_NV
   FogDistanceMode
EyePlaneSigned -> GLenum
GL_EYE_PLANE
   FogDistanceMode
EyePlaneAbsolute -> GLenum
GL_EYE_PLANE_ABSOLUTE_NV

unmarshalFogDistanceMode :: GLint -> FogDistanceMode
unmarshalFogDistanceMode :: GLint -> FogDistanceMode
unmarshalFogDistanceMode GLint
x
   | GLenum
y forall a. Eq a => a -> a -> Bool
== GLenum
GL_EYE_RADIAL_NV = FogDistanceMode
EyeRadial
   | GLenum
y forall a. Eq a => a -> a -> Bool
== GLenum
GL_EYE_PLANE = FogDistanceMode
EyePlaneSigned
   | GLenum
y forall a. Eq a => a -> a -> Bool
== GLenum
GL_EYE_PLANE_ABSOLUTE_NV = FogDistanceMode
EyePlaneAbsolute
   | Bool
otherwise = forall a. HasCallStack => [Char] -> a
error ([Char]
"unmarshalFogDistanceMode: illegal value " forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> [Char]
show GLint
x)
   where y :: GLenum
y = forall a b. (Integral a, Num b) => a -> b
fromIntegral GLint
x

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

fogDistanceMode :: StateVar FogDistanceMode
fogDistanceMode :: StateVar FogDistanceMode
fogDistanceMode =
   forall a. IO a -> (a -> IO ()) -> StateVar a
makeStateVar
      (forall p a. GetPName1I p => (GLint -> a) -> p -> IO a
getInteger1 GLint -> FogDistanceMode
unmarshalFogDistanceMode PName1I
GetFogDistanceMode)
      (FogParameter -> GLint -> IO ()
fogi FogParameter
FogDistanceMode forall b c a. (b -> c) -> (a -> b) -> a -> c
. FogDistanceMode -> GLint
marshalFogDistanceMode)