packages feed

h-raylib-4.5.2.0: examples/basic-models/src/Main.hs

{-# OPTIONS -Wall #-}

module Main where

import Control.Monad (unless)
import Raylib.Core (changeDirectory, closeWindow, getApplicationDirectory, initWindow, setTargetFPS, beginDrawing, endDrawing, windowShouldClose, clearBackground, beginMode3D, endMode3D, updateCamera, disableCursor)
import Raylib.Models (genMeshCube, loadModelFromMesh, drawModel, loadModel, drawGrid)
import Raylib.Types (Model, Camera3D (Camera3D), Vector3 (Vector3), CameraProjection (CameraPerspective), Camera, CameraMode (CameraModeFirstPerson))
import Raylib.Colors (white, orange)

modelPath :: String
modelPath = "../../../../../../../../../examples/basic-models/assets/Model.obj"

main :: IO ()
main = do
  initWindow 650 400 "raylib [models] example - basic models"
  setTargetFPS 60
  disableCursor
  _ <- getApplicationDirectory >>= changeDirectory

  mesh <- genMeshCube 2 3 4
  cubeModel <- loadModelFromMesh mesh
  customModel <- loadModel modelPath

  let camera = Camera3D (Vector3 3 2 3) (Vector3 0 0 0) (Vector3 0 1 0) 70 CameraPerspective

  gameLoop cubeModel customModel camera

  closeWindow

gameLoop :: Model -> Model -> Camera -> IO ()
gameLoop cubeModel customModel camera = do
  beginDrawing

  clearBackground white
  beginMode3D camera

  drawGrid 20 2.0
  drawModel cubeModel (Vector3 0 1.5 0) 1 orange
  drawModel customModel (Vector3 (-5) 1 0) 1 white

  endMode3D

  endDrawing

  newCamera <- updateCamera camera CameraModeFirstPerson
  shouldClose <- windowShouldClose
  unless shouldClose $ gameLoop cubeModel customModel newCamera