module Raylib.Core.Camera (updateCamera, updateCameraPro) where

import Foreign (Storable (peek))
import GHC.IO (unsafePerformIO)
import Raylib.ForeignUtil (withFreeable)
import Raylib.Native (c'updateCamera, c'updateCameraPro)
import Raylib.Types (Camera3D, CameraMode, Vector3)

updateCamera :: Camera3D -> CameraMode -> IO Camera3D
updateCamera :: Camera3D -> CameraMode -> IO Camera3D
updateCamera Camera3D
camera CameraMode
mode =
  forall a b.
(Freeable a, Storable a) =>
a -> (Ptr a -> IO b) -> IO b
withFreeable
    Camera3D
camera
    ( \Ptr Camera3D
c -> do
        Ptr Camera3D -> CInt -> IO ()
c'updateCamera Ptr Camera3D
c (forall a b. (Integral a, Num b) => a -> b
fromIntegral forall a b. (a -> b) -> a -> b
$ forall a. Enum a => a -> Int
fromEnum CameraMode
mode)
        forall a. Storable a => Ptr a -> IO a
peek Ptr Camera3D
c
    )

updateCameraPro :: Camera3D -> Vector3 -> Vector3 -> Float -> Camera3D
updateCameraPro :: Camera3D -> Vector3 -> Vector3 -> Float -> Camera3D
updateCameraPro Camera3D
camera Vector3
movement Vector3
rotation Float
zoom =
  forall a. IO a -> a
unsafePerformIO forall a b. (a -> b) -> a -> b
$
    forall a b.
(Freeable a, Storable a) =>
a -> (Ptr a -> IO b) -> IO b
withFreeable
      Camera3D
camera
      ( \Ptr Camera3D
c -> do
          forall a b.
(Freeable a, Storable a) =>
a -> (Ptr a -> IO b) -> IO b
withFreeable Vector3
movement (\Ptr Vector3
m -> forall a b.
(Freeable a, Storable a) =>
a -> (Ptr a -> IO b) -> IO b
withFreeable Vector3
rotation (\Ptr Vector3
r -> Ptr Camera3D -> Ptr Vector3 -> Ptr Vector3 -> CFloat -> IO ()
c'updateCameraPro Ptr Camera3D
c Ptr Vector3
m Ptr Vector3
r (forall a b. (Real a, Fractional b) => a -> b
realToFrac Float
zoom)))
          forall a. Storable a => Ptr a -> IO a
peek Ptr Camera3D
c
      )