summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoe Crayne <joe@jerkface.net>2019-06-17 03:48:09 -0400
committerJoe Crayne <joe@jerkface.net>2019-06-17 03:48:09 -0400
commitde867b10f2a3645fd7f42efc6389013fa8ad62f5 (patch)
tree46bbbee7056097d3fe37ac3e01950069b6395a66
parentf9a26d4785260fef8fcb2a19bc8edcfccab94dbf (diff)
Add material groups to masking pane.
-rw-r--r--MeshSketch.hs29
1 files changed, 21 insertions, 8 deletions
diff --git a/MeshSketch.hs b/MeshSketch.hs
index a153f5e..7ab0d7a 100644
--- a/MeshSketch.hs
+++ b/MeshSketch.hs
@@ -136,7 +136,13 @@ realToFracVector :: ( Real a
136 ) => Vector a -> Vector b 136 ) => Vector a -> Vector b
137realToFracVector v = Math.fromList $ map realToFrac $ Math.toList v 137realToFracVector v = Math.fromList $ map realToFrac $ Math.toList v
138 138
139addOBJToObjectArray :: GLStorage -> String -> [(GPUMesh, Maybe Text)] -> Map Text (ObjMaterial,TextureData) -> IO [LC.Object] 139data MaskableObject = MaskableObject
140 { maskableObject :: LC.Object
141 , groupMasks :: Map Text [(Int32,Int32)]
142 }
143
144addOBJToObjectArray :: GLStorage -> String -> [(GPUMesh, Maybe Text)] -> Map Text (ObjMaterial,TextureData)
145 -> IO [MaskableObject]
140addOBJToObjectArray storage slotName objMesh mtlLib = forM objMesh $ \(mesh,mat) -> do 146addOBJToObjectArray storage slotName objMesh mtlLib = forM objMesh $ \(mesh,mat) -> do
141 obj <- LC.addMeshToObjectArray storage slotName ["diffuseTexture","diffuseColor"] mesh 147 obj <- LC.addMeshToObjectArray storage slotName ["diffuseTexture","diffuseColor"] mesh
142 -- diffuseTexture and diffuseColor values can change on each model 148 -- diffuseTexture and diffuseColor values can change on each model
@@ -145,7 +151,10 @@ addOBJToObjectArray storage slotName objMesh mtlLib = forM objMesh $ \(mesh,mat)
145 Just (ObjMaterial{..},t) -> LC.updateObjectUniforms obj $ do 151 Just (ObjMaterial{..},t) -> LC.updateObjectUniforms obj $ do
146 "diffuseTexture" @= return t -- set model's diffuse texture 152 "diffuseTexture" @= return t -- set model's diffuse texture
147 "diffuseColor" @= let (r,g,b) = mtl_Kd in return (V4 r g b mtl_Tr) 153 "diffuseColor" @= let (r,g,b) = mtl_Kd in return (V4 r g b mtl_Tr)
148 return obj 154 let len = case Map.elems (objAttributes obj) of
155 Stream { streamLength = x }:_ -> x
156 _ -> 1
157 return $ MaskableObject obj $ maybe Map.empty (`Map.singleton` [(0,1)]) mat
149 158
150mkFullscreenToggle :: IsWindow a => a -> IO (IO ()) 159mkFullscreenToggle :: IsWindow a => a -> IO (IO ())
151mkFullscreenToggle w = do 160mkFullscreenToggle w = do
@@ -160,15 +169,20 @@ xzPlaneVector :: Vector Float
160xzPlaneVector = fromList [ 0,1,0 -- unit normal 169xzPlaneVector = fromList [ 0,1,0 -- unit normal
161 , 0 ] -- distance from origin 170 , 0 ] -- distance from origin
162 171
163uploadState :: IsWidget glarea => MeshData -> glarea -> GLStorage -> IO State 172uploadState :: MeshData -> MeshSketch -> GLStorage -> IO State
164uploadState obj glarea storage = do 173uploadState obj mm storage = do
174 let glarea = mmWidget mm
165 -- load OBJ geometry and material descriptions 175 -- load OBJ geometry and material descriptions
166 let workarea = BoundingBox (-1.5) (1.5) (-1.5) 1.5 (-1.5) (1.5) 176 let workarea = BoundingBox (-1.5) (1.5) (-1.5) 1.5 (-1.5) (1.5)
167 ((objMesh,mtlLib),objscale) <- uploadOBJToGPU (Just workarea) obj 177 ((objMesh,mtlLib),objscale) <- uploadOBJToGPU (Just workarea) obj
168 -- load materials textures 178 -- load materials textures
169 gpuMtlLib <- uploadMtlLib mtlLib 179 gpuMtlLib <- uploadMtlLib mtlLib
170 -- add OBJ to pipeline input 180 -- add OBJ to pipeline input
171 addOBJToObjectArray storage "objects" objMesh gpuMtlLib 181 bufs <- addOBJToObjectArray storage "objects" objMesh gpuMtlLib
182 let gs = Map.keys $ foldr (\a ms -> Map.union (groupMasks a) ms) Map.empty bufs
183 forM_ gs $ \groupname -> do
184 addToGroupsPane (mmListStore mm) True groupname
185
172 -- grid plane 186 -- grid plane
173 uploadMeshToGPU xzplane >>= addMeshToObjectArray storage "plane" [] 187 uploadMeshToGPU xzplane >>= addMeshToObjectArray storage "plane" []
174 188
@@ -385,7 +399,7 @@ newGroupsListWidget = do
385 return groupc 399 return groupc
386 one <- treeViewAppendColumn treeView togc 400 one <- treeViewAppendColumn treeView togc
387 two <- treeViewAppendColumn treeView groupc 401 two <- treeViewAppendColumn treeView groupc
388 addToGroupsPane liststore False "sample text" 402 -- addToGroupsPane liststore False "sample text"
389 return (treeView,liststore) 403 return (treeView,liststore)
390 404
391 405
@@ -413,7 +427,7 @@ onRealize mesh pipeline schema mm = do
413 renderer <- LC.allocRenderer pipeline 427 renderer <- LC.allocRenderer pipeline
414 compat <- LC.setStorage renderer storage -- check schema compatibility 428 compat <- LC.setStorage renderer storage -- check schema compatibility
415 -- putStrLn $ "setStorage compat = " ++ show compat 429 -- putStrLn $ "setStorage compat = " ++ show compat
416 x <- uploadState mesh (mmWidget mm) storage 430 x <- uploadState mesh mm storage
417 let r = Realized 431 let r = Realized
418 { stStorage = storage 432 { stStorage = storage
419 , stRenderer = renderer 433 , stRenderer = renderer
@@ -748,7 +762,6 @@ onEvent mm realized ev = do
748 762
749 EventTypeButtonPress -> do 763 EventTypeButtonPress -> do
750 widgetGrabFocus w 764 widgetGrabFocus w
751 addToGroupsPane (mmListStore mm) True "clicked"
752 bev <- get ev #button 765 bev <- get ev #button
753 h <- get bev #x 766 h <- get bev #x
754 k <- get bev #y 767 k <- get bev #y