diff options
Diffstat (limited to 'src/LambdaCube/GL/Util.hs')
-rw-r--r-- | src/LambdaCube/GL/Util.hs | 67 |
1 files changed, 52 insertions, 15 deletions
diff --git a/src/LambdaCube/GL/Util.hs b/src/LambdaCube/GL/Util.hs index c5c6608..ab8350f 100644 --- a/src/LambdaCube/GL/Util.hs +++ b/src/LambdaCube/GL/Util.hs | |||
@@ -1,3 +1,4 @@ | |||
1 | {-# LANGUAGE RecordWildCards #-} | ||
1 | module LambdaCube.GL.Util ( | 2 | module LambdaCube.GL.Util ( |
2 | queryUniforms, | 3 | queryUniforms, |
3 | queryStreams, | 4 | queryStreams, |
@@ -23,6 +24,7 @@ module LambdaCube.GL.Util ( | |||
23 | glGetIntegerv1, | 24 | glGetIntegerv1, |
24 | setSampler, | 25 | setSampler, |
25 | checkFBO, | 26 | checkFBO, |
27 | compileSampler, | ||
26 | compileTexture, | 28 | compileTexture, |
27 | primitiveToFetchPrimitive, | 29 | primitiveToFetchPrimitive, |
28 | primitiveToGLType, | 30 | primitiveToGLType, |
@@ -503,21 +505,48 @@ edgeModeToGLType a = case a of | |||
503 | ClampToEdge -> GL_CLAMP_TO_EDGE | 505 | ClampToEdge -> GL_CLAMP_TO_EDGE |
504 | ClampToBorder -> GL_CLAMP_TO_BORDER | 506 | ClampToBorder -> GL_CLAMP_TO_BORDER |
505 | 507 | ||
508 | data ParameterSetup | ||
509 | = ParameterSetup | ||
510 | { setParameteri :: GLenum -> GLint -> IO () | ||
511 | , setParameterfv :: GLenum -> Ptr GLfloat -> IO () | ||
512 | , setParameterIiv :: GLenum -> Ptr GLint -> IO () | ||
513 | , setParameterIuiv :: GLenum -> Ptr GLuint -> IO () | ||
514 | , setParameterf :: GLenum -> GLfloat -> IO () | ||
515 | } | ||
516 | |||
506 | setTextureSamplerParameters :: GLenum -> SamplerDescriptor -> IO () | 517 | setTextureSamplerParameters :: GLenum -> SamplerDescriptor -> IO () |
507 | setTextureSamplerParameters t s = do | 518 | setTextureSamplerParameters target = setParameters $ ParameterSetup |
508 | glTexParameteri t GL_TEXTURE_WRAP_S $ fromIntegral $ edgeModeToGLType $ samplerWrapS s | 519 | { setParameteri = glTexParameteri target |
520 | , setParameterfv = glTexParameterfv target | ||
521 | , setParameterIiv = glTexParameterIiv target | ||
522 | , setParameterIuiv = glTexParameterIuiv target | ||
523 | , setParameterf = glTexParameterf target | ||
524 | } | ||
525 | |||
526 | setSamplerParameters :: GLuint -> SamplerDescriptor -> IO () | ||
527 | setSamplerParameters samplerObj = setParameters $ ParameterSetup | ||
528 | { setParameteri = glSamplerParameteri samplerObj | ||
529 | , setParameterfv = glSamplerParameterfv samplerObj | ||
530 | , setParameterIiv = glSamplerParameterIiv samplerObj | ||
531 | , setParameterIuiv = glSamplerParameterIuiv samplerObj | ||
532 | , setParameterf = glSamplerParameterf samplerObj | ||
533 | } | ||
534 | |||
535 | setParameters :: ParameterSetup -> SamplerDescriptor -> IO () | ||
536 | setParameters ParameterSetup{..} s = do | ||
537 | setParameteri GL_TEXTURE_WRAP_S $ fromIntegral $ edgeModeToGLType $ samplerWrapS s | ||
509 | case samplerWrapT s of | 538 | case samplerWrapT s of |
510 | Nothing -> return () | 539 | Nothing -> return () |
511 | Just a -> glTexParameteri t GL_TEXTURE_WRAP_T $ fromIntegral $ edgeModeToGLType a | 540 | Just a -> setParameteri GL_TEXTURE_WRAP_T $ fromIntegral $ edgeModeToGLType a |
512 | case samplerWrapR s of | 541 | case samplerWrapR s of |
513 | Nothing -> return () | 542 | Nothing -> return () |
514 | Just a -> glTexParameteri t GL_TEXTURE_WRAP_R $ fromIntegral $ edgeModeToGLType a | 543 | Just a -> setParameteri GL_TEXTURE_WRAP_R $ fromIntegral $ edgeModeToGLType a |
515 | glTexParameteri t GL_TEXTURE_MIN_FILTER $ fromIntegral $ filterToGLType $ samplerMinFilter s | 544 | setParameteri GL_TEXTURE_MIN_FILTER $ fromIntegral $ filterToGLType $ samplerMinFilter s |
516 | glTexParameteri t GL_TEXTURE_MAG_FILTER $ fromIntegral $ filterToGLType $ samplerMagFilter s | 545 | setParameteri GL_TEXTURE_MAG_FILTER $ fromIntegral $ filterToGLType $ samplerMagFilter s |
517 | 546 | ||
518 | let setBColorV4F a = with a $ \p -> glTexParameterfv t GL_TEXTURE_BORDER_COLOR $ castPtr p | 547 | let setBColorV4F a = with a $ \p -> setParameterfv GL_TEXTURE_BORDER_COLOR $ castPtr p |
519 | setBColorV4I a = with a $ \p -> glTexParameterIiv t GL_TEXTURE_BORDER_COLOR $ castPtr p | 548 | setBColorV4I a = with a $ \p -> setParameterIiv GL_TEXTURE_BORDER_COLOR $ castPtr p |
520 | setBColorV4U a = with a $ \p -> glTexParameterIuiv t GL_TEXTURE_BORDER_COLOR $ castPtr p | 549 | setBColorV4U a = with a $ \p -> setParameterIuiv GL_TEXTURE_BORDER_COLOR $ castPtr p |
521 | case samplerBorderColor s of | 550 | case samplerBorderColor s of |
522 | -- float, word, int, red, rg, rgb, rgba | 551 | -- float, word, int, red, rg, rgb, rgba |
523 | VFloat a -> setBColorV4F $ V4 a 0 0 0 | 552 | VFloat a -> setBColorV4F $ V4 a 0 0 0 |
@@ -538,16 +567,24 @@ setTextureSamplerParameters t s = do | |||
538 | 567 | ||
539 | case samplerMinLod s of | 568 | case samplerMinLod s of |
540 | Nothing -> return () | 569 | Nothing -> return () |
541 | Just a -> glTexParameterf t GL_TEXTURE_MIN_LOD $ realToFrac a | 570 | Just a -> setParameterf GL_TEXTURE_MIN_LOD $ realToFrac a |
542 | case samplerMaxLod s of | 571 | case samplerMaxLod s of |
543 | Nothing -> return () | 572 | Nothing -> return () |
544 | Just a -> glTexParameterf t GL_TEXTURE_MAX_LOD $ realToFrac a | 573 | Just a -> setParameterf GL_TEXTURE_MAX_LOD $ realToFrac a |
545 | glTexParameterf t GL_TEXTURE_LOD_BIAS $ realToFrac $ samplerLodBias s | 574 | setParameterf GL_TEXTURE_LOD_BIAS $ realToFrac $ samplerLodBias s |
546 | case samplerCompareFunc s of | 575 | case samplerCompareFunc s of |
547 | Nothing -> glTexParameteri t GL_TEXTURE_COMPARE_MODE $ fromIntegral GL_NONE | 576 | Nothing -> setParameteri GL_TEXTURE_COMPARE_MODE $ fromIntegral GL_NONE |
548 | Just a -> do | 577 | Just a -> do |
549 | glTexParameteri t GL_TEXTURE_COMPARE_MODE $ fromIntegral GL_COMPARE_REF_TO_TEXTURE | 578 | setParameteri GL_TEXTURE_COMPARE_MODE $ fromIntegral GL_COMPARE_REF_TO_TEXTURE |
550 | glTexParameteri t GL_TEXTURE_COMPARE_FUNC $ fromIntegral $ comparisonFunctionToGLType a | 579 | setParameteri GL_TEXTURE_COMPARE_FUNC $ fromIntegral $ comparisonFunctionToGLType a |
580 | |||
581 | compileSampler :: SamplerDescriptor -> IO GLSampler | ||
582 | compileSampler s = do | ||
583 | so <- alloca $! \po -> glGenSamplers 1 po >> peek po | ||
584 | setSamplerParameters so s | ||
585 | return $ GLSampler | ||
586 | { glSamplerObject = so | ||
587 | } | ||
551 | 588 | ||
552 | compileTexture :: TextureDescriptor -> IO GLTexture | 589 | compileTexture :: TextureDescriptor -> IO GLTexture |
553 | compileTexture txDescriptor = do | 590 | compileTexture txDescriptor = do |