{-# OPTIONS -Wall #-}
{-# LANGUAGE CPP #-}
module Raylib.Util (WindowResources, cameraDirectionRay, whileWindowOpen, whileWindowOpen_, whileWindowOpen0, setMaterialShader, inGHCi, Freeable (..)) where
import Control.Monad (void)
import Raylib.Core (windowShouldClose)
import Raylib.ForeignUtil (Freeable (..))
import Raylib.Internal (WindowResources)
import Raylib.Types
( Camera3D (camera3D'position, camera3D'target),
Material (material'shader),
Model (model'materials),
Ray (Ray),
Shader,
)
import Raylib.Util.Math (Vector (vectorNormalize, (|-|)))
cameraDirectionRay :: Camera3D -> Ray
cameraDirectionRay :: Camera3D -> Ray
cameraDirectionRay Camera3D
camera = Vector3 -> Vector3 -> Ray
Ray (Camera3D -> Vector3
camera3D'position Camera3D
camera) (forall a. Vector a => a -> a
vectorNormalize forall a b. (a -> b) -> a -> b
$ Camera3D -> Vector3
camera3D'target Camera3D
camera forall a. Vector a => a -> a -> a
|-| Camera3D -> Vector3
camera3D'position Camera3D
camera)
whileWindowOpen ::
(a -> IO a) ->
a ->
IO a
whileWindowOpen :: forall a. (a -> IO a) -> a -> IO a
whileWindowOpen a -> IO a
f a
state = do
a
newState <- a -> IO a
f a
state
Bool
shouldClose <- IO Bool
windowShouldClose
if Bool
shouldClose
then forall (m :: * -> *) a. Monad m => a -> m a
return a
newState
else forall a. (a -> IO a) -> a -> IO a
whileWindowOpen a -> IO a
f a
newState
whileWindowOpen_ ::
(a -> IO a) ->
a ->
IO ()
whileWindowOpen_ :: forall a. (a -> IO a) -> a -> IO ()
whileWindowOpen_ a -> IO a
f a
state = forall (f :: * -> *) a. Functor f => f a -> f ()
void (forall a. (a -> IO a) -> a -> IO a
whileWindowOpen a -> IO a
f a
state)
whileWindowOpen0 ::
IO () ->
IO ()
whileWindowOpen0 :: IO () -> IO ()
whileWindowOpen0 IO ()
f = forall a. (a -> IO a) -> a -> IO a
whileWindowOpen (forall a b. a -> b -> a
const IO ()
f) ()
setMaterialShader ::
Model ->
Int ->
Shader ->
Model
setMaterialShader :: Model -> Int -> Shader -> Model
setMaterialShader Model
model Int
matIdx Shader
shader = Model
model {model'materials :: [Material]
model'materials = forall {a}. [a] -> Int -> a -> [a]
setIdx [Material]
mats Int
matIdx Material
newMat}
where
mats :: [Material]
mats = Model -> [Material]
model'materials Model
model
newMat :: Material
newMat = ([Material]
mats forall a. [a] -> Int -> a
!! Int
matIdx) {material'shader :: Shader
material'shader = Shader
shader}
setIdx :: [a] -> Int -> a -> [a]
setIdx [a]
l Int
i a
v = forall a. Int -> [a] -> [a]
take Int
i [a]
l forall a. [a] -> [a] -> [a]
++ [a
v] forall a. [a] -> [a] -> [a]
++ forall a. Int -> [a] -> [a]
drop (Int
i forall a. Num a => a -> a -> a
+ Int
1) [a]
l
inGHCi :: Bool
#ifdef GHCI
inGHCi = True
#else
inGHCi :: Bool
inGHCi = Bool
False
#endif