diff options
author | Joe Crayne <joe@jerkface.net> | 2019-04-29 22:40:53 -0400 |
---|---|---|
committer | Joe Crayne <joe@jerkface.net> | 2019-04-29 22:40:53 -0400 |
commit | c9d1da96a78c78f18ba0d995d6a0376a00452b80 (patch) | |
tree | fd31d856cdb884c011e8d302790e5a601278b7c8 | |
parent | a1cf451ede392fae4a7c594f18b699128c6875fe (diff) |
WIP: Skybox for MeshSketch rework.
-rw-r--r-- | CubeMap.hs | 34 | ||||
-rw-r--r-- | MeshSketch.hs | 25 |
2 files changed, 52 insertions, 7 deletions
@@ -1,20 +1,23 @@ | |||
1 | module CubeMap | 1 | module CubeMap |
2 | ( loadSkyboxes | 2 | ( loadSkyboxes |
3 | , Skyboxes(..) | 3 | , Skyboxes(..) |
4 | , cubeMesh | ||
4 | ) where | 5 | ) where |
5 | 6 | ||
6 | import LambdaCube.GL as LC | 7 | import LambdaCube.GL as LC |
7 | import LambdaCube.GL.Mesh as LC | ||
8 | import LambdaCube.GL.Data (uploadCubeMapToGPU) | 8 | import LambdaCube.GL.Data (uploadCubeMapToGPU) |
9 | import LambdaCube.GL.Mesh as LC | ||
9 | 10 | ||
10 | import Data.Maybe | 11 | import Codec.Archive.Zip |
12 | import Codec.Picture as Juicy | ||
11 | import Control.Monad | 13 | import Control.Monad |
14 | import qualified Data.ByteString.Lazy as Lazy | ||
12 | import Data.List | 15 | import Data.List |
16 | import qualified Data.Map as Map | ||
17 | import Data.Maybe | ||
18 | import qualified Data.Vector as V | ||
13 | import System.Directory | 19 | import System.Directory |
14 | import System.FilePath | 20 | import System.FilePath |
15 | import Codec.Archive.Zip | ||
16 | import qualified Data.ByteString.Lazy as Lazy | ||
17 | import Codec.Picture as Juicy | ||
18 | 21 | ||
19 | image_names_xyz_dir :: [String] | 22 | image_names_xyz_dir :: [String] |
20 | image_names_xyz_dir = | 23 | image_names_xyz_dir = |
@@ -70,3 +73,24 @@ loadSkyboxes = do | |||
70 | return $ sequence imgs | 73 | return $ sequence imgs |
71 | } | 74 | } |
72 | 75 | ||
76 | cubeMesh :: Mesh | ||
77 | cubeMesh = 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 | |||
30 | import LambdaCube.GL as LC | 30 | import LambdaCube.GL as LC |
31 | import LambdaCube.IR as LC | 31 | import LambdaCube.IR as LC |
32 | import LambdaCube.Gtk | 32 | import LambdaCube.Gtk |
33 | import LambdaCube.GL.Data (uploadCubeMapToGPU) | ||
33 | 34 | ||
35 | import CubeMap | ||
34 | import GLWidget (nullableContext, withCurrentGL) | 36 | import GLWidget (nullableContext, withCurrentGL) |
35 | import LambdaCube.GL.HMatrix | 37 | import LambdaCube.GL.HMatrix |
36 | import LambdaCubeWidget (loadPipeline,DynamicPipeline(..)) | 38 | import 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 | ||
50 | data Camera = Camera | 55 | data 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 |