diff options
author | Joshua Rahm <joshua.rahm@colorado.edu> | 2014-03-18 23:52:40 -0600 |
---|---|---|
committer | Joshua Rahm <joshua.rahm@colorado.edu> | 2014-03-18 23:52:40 -0600 |
commit | 62fa8f93990f6aedaae8242fdde6bba44e434f5f (patch) | |
tree | d4d33f3bde43ee70b5247d9f91a3a1fc2c98552b /Graphics/Glyph/Shaders.hs | |
download | earths-ring-62fa8f93990f6aedaae8242fdde6bba44e434f5f.tar.gz earths-ring-62fa8f93990f6aedaae8242fdde6bba44e434f5f.tar.bz2 earths-ring-62fa8f93990f6aedaae8242fdde6bba44e434f5f.zip |
initial commit
Diffstat (limited to 'Graphics/Glyph/Shaders.hs')
-rw-r--r-- | Graphics/Glyph/Shaders.hs | 57 |
1 files changed, 57 insertions, 0 deletions
diff --git a/Graphics/Glyph/Shaders.hs b/Graphics/Glyph/Shaders.hs new file mode 100644 index 0000000..9a85e1a --- /dev/null +++ b/Graphics/Glyph/Shaders.hs @@ -0,0 +1,57 @@ +module Graphics.Glyph.Shaders where + +import Graphics.Rendering.OpenGL +import qualified Data.ByteString as BS +import Control.Monad +import Data.Maybe + +loadShader :: ShaderType -> FilePath -> IO (String, Maybe Shader) +loadShader typ path = do + shader <- createShader typ + ( shaderSourceBS shader $= ) =<< BS.readFile path + compileShader shader + + ok <- get (compileStatus shader) + infoLog <- get (shaderInfoLog shader) + + unless ok $ + deleteObjectNames [shader] + + return ( infoLog, if not ok then Nothing else Just shader ); + + +loadShaders :: [(ShaderType,FilePath)] -> IO [(String, Maybe Shader)] +loadShaders = mapM ( uncurry loadShader ) + +workingShaders :: [(a, Maybe Shader)] -> [Shader] +workingShaders lst = map (fromJust . snd) (filter (isJust . snd) lst) + +createShaderProgram :: [Shader] -> IO (String, Maybe Program) +createShaderProgram shaders = do + p <- createProgram + mapM_ (attachShader p) shaders + linkProgram p + + ok <- get $ linkStatus p + info <- get $ programInfoLog p + + unless ok $ + deleteObjectNames [p] + + return ( info, if not ok then Nothing else Just p ) + +getUniform :: Uniform a => String -> IO (Maybe (StateVar a)) +getUniform name = + get currentProgram >>= (\pr -> case pr of + Just p -> liftM (Just . uniform) (get $ uniformLocation p name) + Nothing -> return Nothing ) + +getUniformForProgram :: Uniform a => String -> Program -> IO (StateVar a) +getUniformForProgram name prog = + liftM uniform (get $ uniformLocation prog name) + + +getUniformLocation :: String -> IO (Maybe UniformLocation) +getUniformLocation name = + get currentProgram >>= maybe (return Nothing) (\prog -> + liftM Just (get $ uniformLocation prog name) ) |