diff options
author | Joe Crayne <joe@jerkface.net> | 2019-06-17 03:48:09 -0400 |
---|---|---|
committer | Joe Crayne <joe@jerkface.net> | 2019-06-17 03:48:09 -0400 |
commit | de867b10f2a3645fd7f42efc6389013fa8ad62f5 (patch) | |
tree | 46bbbee7056097d3fe37ac3e01950069b6395a66 | |
parent | f9a26d4785260fef8fcb2a19bc8edcfccab94dbf (diff) |
Add material groups to masking pane.
-rw-r--r-- | MeshSketch.hs | 29 |
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 |
137 | realToFracVector v = Math.fromList $ map realToFrac $ Math.toList v | 137 | realToFracVector v = Math.fromList $ map realToFrac $ Math.toList v |
138 | 138 | ||
139 | addOBJToObjectArray :: GLStorage -> String -> [(GPUMesh, Maybe Text)] -> Map Text (ObjMaterial,TextureData) -> IO [LC.Object] | 139 | data MaskableObject = MaskableObject |
140 | { maskableObject :: LC.Object | ||
141 | , groupMasks :: Map Text [(Int32,Int32)] | ||
142 | } | ||
143 | |||
144 | addOBJToObjectArray :: GLStorage -> String -> [(GPUMesh, Maybe Text)] -> Map Text (ObjMaterial,TextureData) | ||
145 | -> IO [MaskableObject] | ||
140 | addOBJToObjectArray storage slotName objMesh mtlLib = forM objMesh $ \(mesh,mat) -> do | 146 | addOBJToObjectArray 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 | ||
150 | mkFullscreenToggle :: IsWindow a => a -> IO (IO ()) | 159 | mkFullscreenToggle :: IsWindow a => a -> IO (IO ()) |
151 | mkFullscreenToggle w = do | 160 | mkFullscreenToggle w = do |
@@ -160,15 +169,20 @@ xzPlaneVector :: Vector Float | |||
160 | xzPlaneVector = fromList [ 0,1,0 -- unit normal | 169 | xzPlaneVector = fromList [ 0,1,0 -- unit normal |
161 | , 0 ] -- distance from origin | 170 | , 0 ] -- distance from origin |
162 | 171 | ||
163 | uploadState :: IsWidget glarea => MeshData -> glarea -> GLStorage -> IO State | 172 | uploadState :: MeshData -> MeshSketch -> GLStorage -> IO State |
164 | uploadState obj glarea storage = do | 173 | uploadState 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 |