packages feed

h-raylib-5.5.2.1: examples/first-person-camera/src/Main.hs

{-# LANGUAGE PatternSynonyms #-}
{-# LANGUAGE TemplateHaskell #-}

module Main where

import Raylib.Core (initWindowUnmanaged, setTargetFPS, windowShouldClose, closeWindow, clearBackground, disableCursor)
import Raylib.Core.Camera (updateCamera)
import Raylib.Core.Models (drawCircle3D, drawCubeWiresV, drawLine3D)
import Raylib.Core.Text (drawFPS)
import Raylib.Types (Camera3D (Camera3D), CameraMode (CameraModeFirstPerson), CameraProjection (CameraPerspective), pattern Vector3)
import Raylib.Util (drawing, mode3D, raylibApplication)
import Raylib.Util.Colors (black, white)

startup :: IO Camera3D
startup = do
  initWindowUnmanaged 600 450 "raylib [core] example - first person camera"
  setTargetFPS 60
  disableCursor

  return $ Camera3D (Vector3 0 0 0) (Vector3 2 0 1) (Vector3 0 1 0) 70 CameraPerspective

mainLoop :: Camera3D -> IO Camera3D
mainLoop camera =
  drawing
    ( do
        clearBackground black
        drawFPS 10 20

        mode3D
          camera
          ( do
              drawCircle3D (Vector3 2 0 1) 2 (Vector3 0 0 0) 0 white
              drawLine3D (Vector3 3 (-1) 1) (Vector3 1 1 1) white
              drawLine3D (Vector3 4 2 2) (Vector3 1 (-1) 1) white
              drawCubeWiresV (Vector3 (-2) 0 0) (Vector3 1 1 1) white
          )
    )
    >> updateCamera camera CameraModeFirstPerson

shouldClose :: Camera3D -> IO Bool
shouldClose _ = windowShouldClose

teardown :: Camera3D -> IO ()
teardown _ = closeWindow Nothing

raylibApplication 'startup 'mainLoop 'shouldClose 'teardown