summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoe Crayne <joe@jerkface.net>2019-04-29 22:40:53 -0400
committerJoe Crayne <joe@jerkface.net>2019-04-29 22:40:53 -0400
commitc9d1da96a78c78f18ba0d995d6a0376a00452b80 (patch)
treefd31d856cdb884c011e8d302790e5a601278b7c8
parenta1cf451ede392fae4a7c594f18b699128c6875fe (diff)
WIP: Skybox for MeshSketch rework.
-rw-r--r--CubeMap.hs34
-rw-r--r--MeshSketch.hs25
2 files changed, 52 insertions, 7 deletions
diff --git a/CubeMap.hs b/CubeMap.hs
index 337881f..10ba9e0 100644
--- a/CubeMap.hs
+++ b/CubeMap.hs
@@ -1,20 +1,23 @@
1module CubeMap 1module CubeMap
2 ( loadSkyboxes 2 ( loadSkyboxes
3 , Skyboxes(..) 3 , Skyboxes(..)
4 , cubeMesh
4 ) where 5 ) where
5 6
6import LambdaCube.GL as LC 7import LambdaCube.GL as LC
7import LambdaCube.GL.Mesh as LC
8import LambdaCube.GL.Data (uploadCubeMapToGPU) 8import LambdaCube.GL.Data (uploadCubeMapToGPU)
9import LambdaCube.GL.Mesh as LC
9 10
10import Data.Maybe 11import Codec.Archive.Zip
12import Codec.Picture as Juicy
11import Control.Monad 13import Control.Monad
14import qualified Data.ByteString.Lazy as Lazy
12import Data.List 15import Data.List
16import qualified Data.Map as Map
17import Data.Maybe
18import qualified Data.Vector as V
13import System.Directory 19import System.Directory
14import System.FilePath 20import System.FilePath
15import Codec.Archive.Zip
16import qualified Data.ByteString.Lazy as Lazy
17import Codec.Picture as Juicy
18 21
19image_names_xyz_dir :: [String] 22image_names_xyz_dir :: [String]
20image_names_xyz_dir = 23image_names_xyz_dir =
@@ -70,3 +73,24 @@ loadSkyboxes = do
70 return $ sequence imgs 73 return $ sequence imgs
71 } 74 }
72 75
76cubeMesh :: Mesh
77cubeMesh = Mesh
78 { mAttributes = Map.singleton "position" $ A_V3F $ V.fromList
79 [ V3 1 (-1) (-1) -- 0
80 , V3 1 (-1) 1 -- 1
81 , V3 1 1 1 -- 2
82 , V3 1 1 (-1) -- 3
83 , V3 (-1) (-1) 1 -- 4
84 , V3 (-1) (-1) (-1) -- 5
85 , V3 (-1) 1 (-1) -- 6
86 , V3 (-1) 1 1 -- 7
87 ]
88 , mPrimitive = P_TrianglesI $ V.fromList
89 [ 0, 1, 2, 2, 3, 0 -- posx
90 , 4, 5, 6, 6, 7, 4 -- negx
91 , 6, 3, 2, 2, 7, 6 -- posy
92 , 4, 1, 0, 0, 5, 4 -- negy
93 , 1, 4, 7, 7, 2, 1 -- posz
94 , 5, 0, 3, 3, 6, 5 -- negz
95 ]
96 }
diff --git a/MeshSketch.hs b/MeshSketch.hs
index 1408710..288488b 100644
--- a/MeshSketch.hs
+++ b/MeshSketch.hs
@@ -30,7 +30,9 @@ import Control.Exception
30import LambdaCube.GL as LC 30import LambdaCube.GL as LC
31import LambdaCube.IR as LC 31import LambdaCube.IR as LC
32import LambdaCube.Gtk 32import LambdaCube.Gtk
33import LambdaCube.GL.Data (uploadCubeMapToGPU)
33 34
35import CubeMap
34import GLWidget (nullableContext, withCurrentGL) 36import GLWidget (nullableContext, withCurrentGL)
35import LambdaCube.GL.HMatrix 37import LambdaCube.GL.HMatrix
36import LambdaCubeWidget (loadPipeline,DynamicPipeline(..)) 38import LambdaCubeWidget (loadPipeline,DynamicPipeline(..))
@@ -45,6 +47,9 @@ data State = State
45 { stAnimator :: Animator 47 { stAnimator :: Animator
46 , stCamera :: IORef Camera 48 , stCamera :: IORef Camera
47 , stFullscreen :: IO () 49 , stFullscreen :: IO ()
50 , stSkyboxes :: Skyboxes
51 , stSkybox :: IORef Int
52 , stSkyTexture :: IORef TextureData
48 } 53 }
49 54
50data Camera = Camera 55data Camera = Camera
@@ -122,11 +127,23 @@ uploadState obj glarea storage = do
122 Just pwidget <- get w #parent 127 Just pwidget <- get w #parent
123 Just parent <- get pwidget #window 128 Just parent <- get pwidget #window
124 toggle <- mkFullscreenToggle parent 129 toggle <- mkFullscreenToggle parent
130 skyboxes <- loadSkyboxes
131 skybox <- newIORef 0
132 Right ts <- skyboxLoad skyboxes 0
133 skybox_id <- uploadCubeMapToGPU ts
134 -- LC.updateUniforms storage $ do
135 -- "CubeMap" @= return skybox_id
136 skytex <- newIORef skybox_id
137 mi <- LC.uploadMeshToGPU cubeMesh
138 -- LC.addMeshToObjectArray storage "SkyCube" [] mi -- TODO
125 139
126 let st = State 140 let st = State
127 { stAnimator = tm 141 { stAnimator = tm
128 , stCamera = cam 142 , stCamera = cam
129 , stFullscreen = toggle 143 , stFullscreen = toggle
144 , stSkyboxes = skyboxes
145 , stSkybox = skybox
146 , stSkyTexture = skytex
130 } 147 }
131 _ <- addAnimation tm (whirlingCamera st) 148 _ <- addAnimation tm (whirlingCamera st)
132 149
@@ -291,13 +308,17 @@ onEvent w realized ev = do
291 kev <- get ev #key 308 kev <- get ev #key
292 val <- get kev #keyval <&> \k -> if k > 0x5A then k - 0x20 else k 309 val <- get kev #keyval <&> \k -> if k > 0x5A then k - 0x20 else k
293 case val of 310 case val of
294 {-
295 KEY_N -> do 311 KEY_N -> do
296 modifyIORef' (stSkybox st) $ \n -> (n + 1) `mod` (skyboxCount $ stSkyboxes st) 312 modifyIORef' (stSkybox st) $ \n -> (n + 1) `mod` (skyboxCount $ stSkyboxes st)
297 idx <- readIORef (stSkybox st) 313 idx <- readIORef (stSkybox st)
314 Right ts <- skyboxLoad (stSkyboxes st) idx
315 disposeTexture =<< readIORef (stSkyTexture st)
316 skybox_id <- uploadCubeMapToGPU ts
317 -- LC.updateUniforms storage $ do
318 -- "CubeMap" @= return skybox_id
319 writeIORef (stSkyTexture st) skybox_id
298 put (skyboxNames (stSkyboxes st) !! idx) 320 put (skyboxNames (stSkyboxes st) !! idx)
299 return () 321 return ()
300 -}
301 KEY_F -> do 322 KEY_F -> do
302 put 'F' 323 put 'F'
303 stFullscreen st 324 stFullscreen st