{-# OPTIONS -Wall #-} {-# LANGUAGE ForeignFunctionInterface #-} module Raylib.Internal (unloadShaders, unloadTextures, unloadFrameBuffers, unloadVaoIds, unloadVboIds, unloadCtxData, unloadAudioBuffers, addShaderId, addTextureId, addFrameBuffer, addVaoId, addVboIds, addCtxData, addAudioBuffer, c'rlGetShaderIdDefault, getPixelDataSize) where import Control.Monad (forM_, unless, when) import Data.IORef (IORef, modifyIORef, newIORef, readIORef) import Foreign (Ptr) import Foreign.C (CInt (..), CUInt (..)) import GHC.IO (unsafePerformIO) shaderIds :: IO (IORef [CUInt]) shaderIds :: IO (IORef [CUInt]) shaderIds = forall a. a -> IO (IORef a) newIORef [] textureIds :: IO (IORef [CUInt]) textureIds :: IO (IORef [CUInt]) textureIds = forall a. a -> IO (IORef a) newIORef [] frameBuffers :: IO (IORef [CUInt]) frameBuffers :: IO (IORef [CUInt]) frameBuffers = forall a. a -> IO (IORef a) newIORef [] vaoIds :: IO (IORef [CUInt]) vaoIds :: IO (IORef [CUInt]) vaoIds = forall a. a -> IO (IORef a) newIORef [] vboIds :: IO (IORef [CUInt]) vboIds :: IO (IORef [CUInt]) vboIds = forall a. a -> IO (IORef a) newIORef [] ctxDataPtrs :: IO (IORef [(CInt, Ptr ())]) ctxDataPtrs :: IO (IORef [(CInt, Ptr ())]) ctxDataPtrs = forall a. a -> IO (IORef a) newIORef [] audioBuffers :: IO (IORef [Ptr ()]) audioBuffers :: IO (IORef [Ptr ()]) audioBuffers = forall a. a -> IO (IORef a) newIORef [] unloadShaders :: IO () unloadShaders :: IO () unloadShaders = do CUInt shaderIdDefault <- IO CUInt c'rlGetShaderIdDefault IORef [CUInt] shaderIds' <- IO (IORef [CUInt]) shaderIds [CUInt] vals <- forall a. IORef a -> IO a readIORef IORef [CUInt] shaderIds' forall (t :: * -> *) (m :: * -> *) a b. (Foldable t, Monad m) => t a -> (a -> m b) -> m () forM_ [CUInt] vals (\CUInt sId -> forall (f :: * -> *). Applicative f => Bool -> f () -> f () unless (CUInt sId forall a. Eq a => a -> a -> Bool == CUInt shaderIdDefault) (CUInt -> IO () c'rlUnloadShaderProgram CUInt sId)) String -> IO () putStrLn String "INFO: SHADER: h-raylib successfully auto-unloaded shaders" unloadTextures :: IO () unloadTextures :: IO () unloadTextures = do IORef [CUInt] textureIds' <- IO (IORef [CUInt]) textureIds [CUInt] vals <- forall a. IORef a -> IO a readIORef IORef [CUInt] textureIds' forall (t :: * -> *) (m :: * -> *) a b. (Foldable t, Monad m) => t a -> (a -> m b) -> m () forM_ [CUInt] vals (\CUInt tId -> forall (f :: * -> *). Applicative f => Bool -> f () -> f () when (CUInt tId forall a. Ord a => a -> a -> Bool > CUInt 0) (CUInt -> IO () c'rlUnloadTexture CUInt tId)) String -> IO () putStrLn String "INFO: TEXTURE: h-raylib successfully auto-unloaded textures" unloadFrameBuffers :: IO () unloadFrameBuffers :: IO () unloadFrameBuffers = do IORef [CUInt] frameBuffers' <- IO (IORef [CUInt]) frameBuffers [CUInt] vals <- forall a. IORef a -> IO a readIORef IORef [CUInt] frameBuffers' forall (t :: * -> *) (m :: * -> *) a b. (Foldable t, Monad m) => t a -> (a -> m b) -> m () forM_ [CUInt] vals (\CUInt fbId -> forall (f :: * -> *). Applicative f => Bool -> f () -> f () when (CUInt fbId forall a. Ord a => a -> a -> Bool > CUInt 0) (CUInt -> IO () c'rlUnloadFramebuffer CUInt fbId)) String -> IO () putStrLn String "INFO: FBO: h-raylib successfully auto-unloaded frame buffers" unloadVaoIds :: IO () unloadVaoIds :: IO () unloadVaoIds = do IORef [CUInt] vaoIds' <- IO (IORef [CUInt]) vaoIds [CUInt] vals <- forall a. IORef a -> IO a readIORef IORef [CUInt] vaoIds' forall (t :: * -> *) (m :: * -> *) a b. (Foldable t, Monad m) => t a -> (a -> m b) -> m () forM_ [CUInt] vals CUInt -> IO () c'rlUnloadVertexArray String -> IO () putStrLn String "INFO: VAO: h-raylib successfully auto-unloaded vertex arrays" unloadVboIds :: IO () unloadVboIds :: IO () unloadVboIds = do IORef [CUInt] vboIds' <- IO (IORef [CUInt]) vboIds [CUInt] vals <- forall a. IORef a -> IO a readIORef IORef [CUInt] vboIds' forall (t :: * -> *) (m :: * -> *) a b. (Foldable t, Monad m) => t a -> (a -> m b) -> m () forM_ [CUInt] vals CUInt -> IO () c'rlUnloadVertexBuffer String -> IO () putStrLn String "INFO: VBO: h-raylib successfully auto-unloaded vertex buffers" unloadCtxData :: IO () unloadCtxData :: IO () unloadCtxData = do IORef [(CInt, Ptr ())] ctxDataPtrs' <- IO (IORef [(CInt, Ptr ())]) ctxDataPtrs [(CInt, Ptr ())] vals <- forall a. IORef a -> IO a readIORef IORef [(CInt, Ptr ())] ctxDataPtrs' forall (t :: * -> *) (m :: * -> *) a b. (Foldable t, Monad m) => t a -> (a -> m b) -> m () forM_ [(CInt, Ptr ())] vals forall a b. (a -> b) -> a -> b $ forall a b c. (a -> b -> c) -> (a, b) -> c uncurry CInt -> Ptr () -> IO () c'unloadMusicStreamData String -> IO () putStrLn String "INFO: AUDIO: h-raylib successfully auto-unloaded music data" unloadAudioBuffers :: IO () unloadAudioBuffers :: IO () unloadAudioBuffers = do IORef [Ptr ()] audioBuffers' <- IO (IORef [Ptr ()]) audioBuffers [Ptr ()] vals <- forall a. IORef a -> IO a readIORef IORef [Ptr ()] audioBuffers' forall (t :: * -> *) (m :: * -> *) a b. (Foldable t, Monad m) => t a -> (a -> m b) -> m () forM_ [Ptr ()] vals Ptr () -> IO () c'unloadAudioBuffer String -> IO () putStrLn String "INFO: AUDIO: h-raylib successfully auto-unloaded audio buffers" addShaderId :: (Integral a) => a -> IO () addShaderId :: forall a. Integral a => a -> IO () addShaderId a sId' = do IORef [CUInt] shaderIds' <- IO (IORef [CUInt]) shaderIds forall a. IORef a -> (a -> a) -> IO () modifyIORef IORef [CUInt] shaderIds' (\[CUInt] xs -> if CUInt sId forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool `elem` [CUInt] xs then [CUInt] xs else CUInt sId forall a. a -> [a] -> [a] : [CUInt] xs) where sId :: CUInt sId = forall a b. (Integral a, Num b) => a -> b fromIntegral a sId' addTextureId :: (Integral a) => a -> IO () addTextureId :: forall a. Integral a => a -> IO () addTextureId a tId' = do IORef [CUInt] textureIds' <- IO (IORef [CUInt]) textureIds forall a. IORef a -> (a -> a) -> IO () modifyIORef IORef [CUInt] textureIds' (\[CUInt] xs -> if CUInt tId forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool `elem` [CUInt] xs then [CUInt] xs else CUInt tId forall a. a -> [a] -> [a] : [CUInt] xs) where tId :: CUInt tId = forall a b. (Integral a, Num b) => a -> b fromIntegral a tId' addFrameBuffer :: (Integral a) => a -> IO () addFrameBuffer :: forall a. Integral a => a -> IO () addFrameBuffer a fbId' = do IORef [CUInt] frameBuffers' <- IO (IORef [CUInt]) frameBuffers forall a. IORef a -> (a -> a) -> IO () modifyIORef IORef [CUInt] frameBuffers' (\[CUInt] xs -> if CUInt fbId forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool `elem` [CUInt] xs then [CUInt] xs else CUInt fbId forall a. a -> [a] -> [a] : [CUInt] xs) where fbId :: CUInt fbId = forall a b. (Integral a, Num b) => a -> b fromIntegral a fbId' addVaoId :: (Integral a) => a -> IO () addVaoId :: forall a. Integral a => a -> IO () addVaoId a vaoId' = do IORef [CUInt] vaoIds' <- IO (IORef [CUInt]) vaoIds forall a. IORef a -> (a -> a) -> IO () modifyIORef IORef [CUInt] vaoIds' (\[CUInt] xs -> if CUInt vaoId forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool `elem` [CUInt] xs then [CUInt] xs else CUInt vaoId forall a. a -> [a] -> [a] : [CUInt] xs) where vaoId :: CUInt vaoId = forall a b. (Integral a, Num b) => a -> b fromIntegral a vaoId' addVboIds :: (Integral a) => Maybe [a] -> IO () addVboIds :: forall a. Integral a => Maybe [a] -> IO () addVboIds Maybe [a] Nothing = forall (m :: * -> *) a. Monad m => a -> m a return () addVboIds (Just [a] bIds') = do IORef [CUInt] vboIds' <- IO (IORef [CUInt]) vboIds forall (t :: * -> *) (m :: * -> *) a b. (Foldable t, Monad m) => t a -> (a -> m b) -> m () forM_ [CUInt] bIds (\CUInt x -> forall a. IORef a -> (a -> a) -> IO () modifyIORef IORef [CUInt] vboIds' (\[CUInt] xs -> if CUInt x forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool `elem` [CUInt] xs then [CUInt] xs else CUInt x forall a. a -> [a] -> [a] : [CUInt] xs)) where bIds :: [CUInt] bIds = forall a b. (a -> b) -> [a] -> [b] map forall a b. (Integral a, Num b) => a -> b fromIntegral [a] bIds' addCtxData :: (Integral a) => a -> Ptr () -> IO () addCtxData :: forall a. Integral a => a -> Ptr () -> IO () addCtxData a ctxType' Ptr () ctxData = do IORef [(CInt, Ptr ())] ctxDataPtrs' <- IO (IORef [(CInt, Ptr ())]) ctxDataPtrs forall a. IORef a -> (a -> a) -> IO () modifyIORef IORef [(CInt, Ptr ())] ctxDataPtrs' (\[(CInt, Ptr ())] xs -> if (CInt ctxType, Ptr () ctxData) forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool `elem` [(CInt, Ptr ())] xs then [(CInt, Ptr ())] xs else (CInt ctxType, Ptr () ctxData) forall a. a -> [a] -> [a] : [(CInt, Ptr ())] xs) where ctxType :: CInt ctxType = forall a b. (Integral a, Num b) => a -> b fromIntegral a ctxType' addAudioBuffer :: Ptr () -> IO () addAudioBuffer :: Ptr () -> IO () addAudioBuffer Ptr () buffer = do IORef [Ptr ()] audioBuffers' <- IO (IORef [Ptr ()]) audioBuffers forall a. IORef a -> (a -> a) -> IO () modifyIORef IORef [Ptr ()] audioBuffers' (\[Ptr ()] xs -> if Ptr () buffer forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool `elem` [Ptr ()] xs then [Ptr ()] xs else Ptr () buffer forall a. a -> [a] -> [a] : [Ptr ()] xs) foreign import ccall safe "rlgl.h rlGetShaderIdDefault" c'rlGetShaderIdDefault :: IO CUInt foreign import ccall safe "rlgl.h rlUnloadShaderProgram" c'rlUnloadShaderProgram :: CUInt -> IO () foreign import ccall safe "rlgl.h rlUnloadTexture" c'rlUnloadTexture :: CUInt -> IO () foreign import ccall safe "rlgl.h rlUnloadFramebuffer" c'rlUnloadFramebuffer :: CUInt -> IO () foreign import ccall safe "rlgl.h rlUnloadVertexArray" c'rlUnloadVertexArray :: CUInt -> IO () foreign import ccall safe "rlgl.h rlUnloadVertexBuffer" c'rlUnloadVertexBuffer :: CUInt -> IO () foreign import ccall safe "rl_internal.h UnloadMusicStreamData" c'unloadMusicStreamData :: CInt -> Ptr () -> IO () foreign import ccall safe "rl_internal.h UnloadAudioBuffer_" c'unloadAudioBuffer :: Ptr () -> IO () foreign import ccall safe "raylib.h GetPixelDataSize" c'getPixelDataSize :: CInt -> CInt -> CInt -> IO CInt getPixelDataSize :: Int -> Int -> Int -> Int getPixelDataSize :: Int -> Int -> Int -> Int getPixelDataSize Int width Int height Int format = forall a. IO a -> a unsafePerformIO (forall a b. (Integral a, Num b) => a -> b fromIntegral forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b <$> CInt -> CInt -> CInt -> IO CInt c'getPixelDataSize (forall a b. (Integral a, Num b) => a -> b fromIntegral Int width) (forall a b. (Integral a, Num b) => a -> b fromIntegral Int height) (forall a b. (Integral a, Num b) => a -> b fromIntegral Int format))