packages feed

accelerate-examples-1.0.0.0: examples/ray/Gloss/Event.hs

{-# LANGUAGE PatternGuards #-}

module Gloss.Event
  where

-- friends
import Common.Type
import Scene.State

-- library
import Data.Char
import Data.Label
import Graphics.Gloss.Interface.Pure.Game                       as G


handleEvent :: Event -> State -> State
handleEvent event state
  = case event of
      EventKey (Char c) s _ _           -> char (toLower c) s state
      EventKey (SpecialKey c) s _ _     -> special c s state
      EventKey (MouseButton b) s _ l    -> click b l s state
      EventMotion p                     -> motion p
      _                                 -> state
  where
    toggle f x Down     = set f (Just x)
    toggle f _ Up       = set f Nothing

    char 'w'            = toggle stateEyeVert Fwd
    char ','            = toggle stateEyeVert Fwd
    char 's'            = toggle stateEyeVert Rev
    char 'o'            = toggle stateEyeVert Rev
    char 'a'            = toggle stateEyeHoriz Rev
    char 'd'            = toggle stateEyeHoriz Fwd
    char 'e'            = toggle stateEyeHoriz Fwd
    char _              = const id

    click LeftButton    = toggle stateLeftClick
    click _             = const (const id)

    special KeyUp       = toggle stateLightVert Fwd
    special KeyDown     = toggle stateLightVert Rev
    special KeyRight    = toggle stateLightHoriz Fwd
    special KeyLeft     = toggle stateLightHoriz Rev
    special _           = const id

    motion (x,y)
      | Just (oX, oY)           <- get stateLeftClick state
      , V3 eyeX eyeY eyeZ       <- get stateEyeDelta  state
      = let eyeX'       = eyeX + (x - oX)
            eyeY'       = eyeY
            eyeZ'       = eyeZ + (y - oY)
        in
        set stateEyeDelta (V3 eyeX' eyeY' eyeZ')
          $ set stateLeftClick  (Just (x, y))
          $ state

    motion _
      = state