module Graphics.Rendering.Rect.Backgrounds(Backgrounds(..), renderBackgrounds) where import Graphics.Rendering.Rect.CSS.Backgrounds import Graphics.Rendering.Rect.Types import Graphics.Rendering.Rect.Image (Texture) import qualified Data.ByteString.Char8 as B8 import Linear (M44) import Control.Monad.IO.Class (MonadIO(..)) import Data.Maybe (fromMaybe, listToMaybe) import Control.Monad (forM) baseFragmentShader = B8.pack $ unlines [ "#version 330 core", "out vec4 fcolour;", "uniform vec4 colour;", "void main() { fcolour = colour; }" ] imageFragmentShader = B8.pack $ unlines [ "#version 330 core", "in vec2 coord;", "out vec4 fcolour;", "uniform sampler2D image;", "void main() { fcolour = texture(image, coord/textureSize(image, 0)); }" ] renderBackgrounds :: (MonadIO m, MonadIO n) => n (Backgrounds Texture -> Rects -> M44 Float -> m ()) renderBackgrounds = do base <- renderRectWith baseFragmentShader ["colour"] layer <- renderRectWith imageFragmentShader [] return $ \self a b -> do base [] [c $ background self] (headDef borderBox $ clip self) a b let layers = image self `zip` (clip self ++ repeat borderBox) forM layers $ \(img0, clip0) -> layer [img0] [] clip0 a b return () headDef def = fromMaybe def . listToMaybe