packages feed

h-raylib-4.5.3.0: examples/camera-ray-collision/src/Main.hs

{-# OPTIONS -Wall #-}
module Main where

import Control.Monad (when)
import Raylib.Core
  ( beginDrawing,
    beginMode3D,
    clearBackground,
    closeWindow,
    disableCursor,
    endDrawing,
    endMode3D,
    initWindow,
    setTargetFPS,
    updateCamera,
  )
import Raylib.Core.Models
  ( drawBoundingBox,
    drawPoint3D,
    getRayCollisionQuad,
  )
import Raylib.Core.Text (drawFPS)
import Raylib.Types
  ( BoundingBox (BoundingBox),
    Camera3D (Camera3D),
    CameraMode (CameraModeFirstPerson),
    CameraProjection (CameraPerspective),
    RayCollision (rayCollision'hit, rayCollision'point),
    Vector3 (Vector3),
  )
import Raylib.Util (cameraDirectionRay, whileWindowOpen_)
import Raylib.Util.Colors (black, red, white)

main :: IO ()
main = do
  initWindow 600 450 "raylib [core] example - camera ray collision"
  setTargetFPS 60
  disableCursor

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

  whileWindowOpen_
    ( \c -> do
        beginDrawing

        clearBackground black
        drawFPS 10 20

        let collision = getRayCollisionQuad (cameraDirectionRay c) (Vector3 0 0 0) (Vector3 0 2 0) (Vector3 0 2 4) (Vector3 0 0 4)
        let color = if rayCollision'hit collision then red else white

        beginMode3D c

        drawBoundingBox (BoundingBox (Vector3 0 0 0) (Vector3 0 2 4)) color
        when (rayCollision'hit collision) $ drawPoint3D (rayCollision'point collision) red

        endMode3D

        endDrawing
        updateCamera c CameraModeFirstPerson
    )
    camera

  closeWindow