From ec5dad0999ca2b56422f4e3442a5aeee5672cb87 Mon Sep 17 00:00:00 2001 From: Joe Crayne Date: Fri, 26 Apr 2019 13:29:32 -0400 Subject: MeshSketch: skybox toggle. --- MeshSketch.hs | 38 ++++++++++++++++++++++++++++++-------- 1 file changed, 30 insertions(+), 8 deletions(-) (limited to 'MeshSketch.hs') diff --git a/MeshSketch.hs b/MeshSketch.hs index e23820c..0040359 100644 --- a/MeshSketch.hs +++ b/MeshSketch.hs @@ -1,5 +1,6 @@ {-# LANGUAGE LambdaCase #-} {-# LANGUAGE OverloadedLabels #-} +{-# LANGUAGE PatternSynonyms #-} module MeshSketch where import Control.Monad @@ -11,6 +12,8 @@ import GI.GObject.Functions import GI.Gtk import Numeric.LinearAlgebra +import CubeMap + data MeshMaker = MeshMaker { mmWidget :: GLArea , mmRealized :: IORef (Maybe State) @@ -28,7 +31,9 @@ data Camera = Camera } data State = State - { stCamera :: IORef Camera + { stCamera :: IORef Camera + , stSkyboxes :: Skyboxes + , stSkybox :: IORef Int } initCamera = Camera @@ -59,18 +64,26 @@ onRealize mm@(MeshMaker w ref) = do readIORef ref >>= \case Just st -> onUnrealize mm -- Shouldn't happen. Nothing -> return () + set w [ #canFocus := True ] -- For keyboard events. widgetAddEvents w [ EventMaskPointerMotionMask , EventMaskButtonPressMask , EventMaskButtonReleaseMask , EventMaskTouchMask , EventMaskScrollMask + , EventMaskKeyPressMask -- , EventMaskKeyReleaseMask ] - _ <- on w #event $ onEvent mm cam <- newIORef initCamera - writeIORef ref $ Just State - { stCamera = cam - } + skyboxes <- loadSkyboxes + skybox <- newIORef 0 + let st = State + { stCamera = cam + , stSkyboxes = skyboxes + , stSkybox = skybox + } + + _ <- on w #event $ onEvent w st + writeIORef ref $ Just st onUnrealize :: MeshMaker -> IO () onUnrealize (MeshMaker w ref) = do @@ -86,8 +99,7 @@ onRender :: MeshMaker -> GLContext -> IO Bool onRender (MeshMaker w ref) gl = do return True - -onEvent mm@(MeshMaker w ref) ev = do +onEvent w st ev = do msrc <- eventGetSourceDevice ev inputSource <- forM msrc $ \src -> do src <- get src #inputSource @@ -110,6 +122,16 @@ onEvent mm@(MeshMaker w ref) ev = do put d return () - _ -> return () + EventTypeKeyPress -> do + kev <- get ev #key + val <- get kev #keyval + when (val `elem` [KEY_N,KEY_n]) $ do + modifyIORef' (stSkybox st) $ \n -> (n + 1) `mod` (skyboxCount $ stSkyboxes st) + idx <- readIORef (stSkybox st) + put (skyboxNames (stSkyboxes st) !! idx) + return () + return () + + e -> return () return False -- cgit v1.2.3