diff options
author | Joe Crayne <joe@jerkface.net> | 2019-05-19 17:44:28 -0400 |
---|---|---|
committer | Joe Crayne <joe@jerkface.net> | 2019-05-19 17:44:28 -0400 |
commit | 268aaced12086ed8376affdf62711abcb651277e (patch) | |
tree | 5dbba3fd4192be3579bdf359e880d6ed6c0773bc /MaskableStream.hs | |
parent | ccf714a691a95be84ba168a725b6f0187bb903ea (diff) |
Experiment: use Data.Data to generate AttributeKeys.
Diffstat (limited to 'MaskableStream.hs')
-rw-r--r-- | MaskableStream.hs | 16 |
1 files changed, 15 insertions, 1 deletions
diff --git a/MaskableStream.hs b/MaskableStream.hs index 5274d28..10f4bff 100644 --- a/MaskableStream.hs +++ b/MaskableStream.hs | |||
@@ -1,4 +1,4 @@ | |||
1 | {-# LANGUAGE LambdaCase, RecordWildCards, KindSignatures, GADTs #-} | 1 | {-# LANGUAGE LambdaCase, RecordWildCards, KindSignatures, GADTs, DeriveDataTypeable, StandaloneDeriving #-} |
2 | 2 | ||
3 | -- TODO: Formulate this module as a patch against lambdacube-gl. | 3 | -- TODO: Formulate this module as a patch against lambdacube-gl. |
4 | 4 | ||
@@ -7,6 +7,7 @@ module MaskableStream where | |||
7 | import Control.Monad | 7 | import Control.Monad |
8 | import Control.Monad.IO.Class | 8 | import Control.Monad.IO.Class |
9 | import Control.Monad.Writer | 9 | import Control.Monad.Writer |
10 | import Data.Data | ||
10 | import Data.Foldable | 11 | import Data.Foldable |
11 | import Data.Function | 12 | import Data.Function |
12 | import Data.Int | 13 | import Data.Int |
@@ -232,6 +233,8 @@ incrementalUpdateBuffer b byteoffset bytecount ptr = do | |||
232 | glBufferSubData GL_ARRAY_BUFFER byteoffset bytecount ptr | 233 | glBufferSubData GL_ARRAY_BUFFER byteoffset bytecount ptr |
233 | glBindBuffer GL_ARRAY_BUFFER 0 | 234 | glBindBuffer GL_ARRAY_BUFFER 0 |
234 | 235 | ||
236 | instance Typeable c => Data (AttributeKey c) where | ||
237 | |||
235 | data AttributeKey c = AttributeKey (TypeTag c) Buffer CPtrdiff | 238 | data AttributeKey c = AttributeKey (TypeTag c) Buffer CPtrdiff |
236 | 239 | ||
237 | attributeKey :: TypeTagable c => GPUData -> String -> Maybe (AttributeKey c) | 240 | attributeKey :: TypeTagable c => GPUData -> String -> Maybe (AttributeKey c) |
@@ -249,6 +252,17 @@ attributeKey dta name = do | |||
249 | Just $ AttributeKey typ b (fromIntegral off) | 252 | Just $ AttributeKey typ b (fromIntegral off) |
250 | _ -> Nothing | 253 | _ -> Nothing |
251 | 254 | ||
255 | lookupAttributeKey :: GPUData -> String -> Maybe (Some AttributeKey) | ||
256 | lookupAttributeKey dta name = do | ||
257 | stream <- Map.lookup name (dStreams dta) | ||
258 | case stream of | ||
259 | Stream t b i _ _ -> do | ||
260 | let a = bufArrays b ! i | ||
261 | off = arrOffset a | ||
262 | This tt <- witnessType (fromStreamType t) | ||
263 | Just $ This (AttributeKey tt b (fromIntegral off)) | ||
264 | _ -> Nothing | ||
265 | |||
252 | (@<-) :: GLData a c => AttributeKey c -> a -> Writer [DSum AttributeKey GLUniformValue] () | 266 | (@<-) :: GLData a c => AttributeKey c -> a -> Writer [DSum AttributeKey GLUniformValue] () |
253 | k @<- v = tell [k :=> GLUniformValue v] | 267 | k @<- v = tell [k :=> GLUniformValue v] |
254 | 268 | ||