summaryrefslogtreecommitdiff
path: root/Lambda2.hs
diff options
context:
space:
mode:
authorJoe Crayne <joe@jerkface.net>2019-04-08 00:58:18 -0400
committerJoe Crayne <joe@jerkface.net>2019-04-08 00:58:18 -0400
commit72da18a55e7fdda733c8306398920277ad5b7985 (patch)
treea67ab3dd2a09bbc2e8ea7ef6c356611d454b85b2 /Lambda2.hs
parentf7120657200b74c555966d17c8a882c15e948280 (diff)
Lambda2 experiment.
Diffstat (limited to 'Lambda2.hs')
-rw-r--r--Lambda2.hs150
1 files changed, 150 insertions, 0 deletions
diff --git a/Lambda2.hs b/Lambda2.hs
new file mode 100644
index 0000000..bedf18c
--- /dev/null
+++ b/Lambda2.hs
@@ -0,0 +1,150 @@
1{-# LANGUAGE LambdaCase #-}
2{-# LANGUAGE OverloadedStrings #-}
3module Lambda2 where
4
5import GI.Gtk.Objects (GLArea,gLAreaGetContext,widgetGetWindow)
6import GI.Gdk.Objects.GLContext (GLContext, gLContextGetDebugEnabled,
7 gLContextGetForwardCompatible,
8 gLContextSetDebugEnabled,
9 gLContextSetForwardCompatible,
10 gLContextGetRequiredVersion,
11 gLContextSetRequiredVersion,
12 gLContextGetUseEs,
13 getGLContextWindow)
14import GI.Gdk.Objects.Window (windowCreateGlContext,windowGetWidth,windowGetHeight)
15
16import qualified Data.Map as Map
17import qualified Data.Vector as V
18
19import LambdaCube.GL as LambdaCubeGL -- renderer
20import LambdaCube.GL.Mesh as LambdaCubeGL
21import Codec.Picture as Juicy
22import Data.Aeson
23import qualified Data.ByteString as SB
24
25data State = State
26
27initState :: IO State
28initState = do
29 return State
30
31render :: State -> GLArea -> GLContext -> IO Bool
32render st glarea gl = do
33 Just pipelineDesc <- decodeStrict <$> SB.readFile "hello.json"
34
35 -- win <- initWindow "LambdaCube 3D DSL Hello World" 640 640
36
37 -- setup render data
38 let inputSchema = makeSchema $ do
39 defObjectArray "objects" Triangles $ do
40 "position" @: Attribute_V2F
41 "uv" @: Attribute_V2F
42 defUniforms $ do
43 "time" @: Float
44 "diffuseTexture" @: FTexture2D
45
46 storage <- LambdaCubeGL.allocStorage inputSchema
47
48 -- upload geometry to GPU and add to pipeline input
49 LambdaCubeGL.uploadMeshToGPU triangleA >>= LambdaCubeGL.addMeshToObjectArray storage "objects" []
50 LambdaCubeGL.uploadMeshToGPU triangleB >>= LambdaCubeGL.addMeshToObjectArray storage "objects" []
51
52 -- load image and upload texture
53 Right img <- Juicy.readImage "logo.png"
54 textureData <- LambdaCubeGL.uploadTexture2DToGPU img
55
56 -- allocate GL pipeline
57 renderer <- LambdaCubeGL.allocRenderer pipelineDesc
58 LambdaCubeGL.setStorage renderer storage >>= \case -- check schema compatibility
59 Just err -> putStrLn err
60 Nothing -> loop
61 where loop = do
62 -- update graphics input
63 -- GLFW.getWindowSize win >>= \(w,h) -> LambdaCubeGL.setScreenSize storage (fromIntegral w) (fromIntegral h)
64 (wd,ht) <- do
65 Just win <- getGLContextWindow gl
66 wd <- windowGetWidth win
67 ht <- windowGetHeight win
68 print (wd,ht)
69 return (wd,ht)
70 return (wd,ht) >>= \(w,h) -> LambdaCubeGL.setScreenSize storage (fromIntegral w) (fromIntegral h)
71 LambdaCubeGL.updateUniforms storage $ do
72 "diffuseTexture" @= return textureData
73 "time" @= do
74 Just t <- return $ Just (1.0::Double) -- GLFW.getTime
75 return (realToFrac t :: Float)
76 -- render
77 putStrLn "LambdaCubeGL.renderFrame enter"
78 LambdaCubeGL.renderFrame renderer
79 putStrLn "LambdaCubeGL.renderFrame exit"
80 -- GLFW.swapBuffers win
81 -- GLFW.pollEvents
82
83 let keyIsPressed k = return True -- fmap (==KeyState'Pressed) $ GLFW.getKey win k
84 escape <- keyIsPressed () -- Key'Escape
85 if escape then return () else loop
86
87 LambdaCubeGL.disposeRenderer renderer
88 -- LambdaCubeGL.disposeStorage storage -- XXX: not implemented
89 -- GLFW.destroyWindow win
90 -- GLFW.terminate
91 return True
92
93-- geometry data: triangles
94triangleA :: LambdaCubeGL.Mesh
95triangleA = Mesh
96 { mAttributes = Map.fromList
97 [ ("position", A_V2F $ V.fromList [V2 1 1, V2 1 (-1), V2 (-1) (-1)])
98 , ("uv", A_V2F $ V.fromList [V2 1 1, V2 0 1, V2 0 0])
99 ]
100 , mPrimitive = P_Triangles
101 }
102
103triangleB :: LambdaCubeGL.Mesh
104triangleB = Mesh
105 { mAttributes = Map.fromList
106 [ ("position", A_V2F $ V.fromList [V2 1 1, V2 (-1) (-1), V2 (-1) 1])
107 , ("uv", A_V2F $ V.fromList [V2 1 1, V2 0 0, V2 1 0])
108 ]
109 , mPrimitive = P_Triangles
110 }
111
112realize :: State -> GLArea -> IO ()
113realize st glarea = do
114 putStrLn "realize!"
115 return ()
116
117unrealize :: State -> GLArea -> IO ()
118unrealize st glarea = do
119 return ()
120
121createContext :: State -> GLArea -> IO GLContext
122createContext st glarea = do
123 putStrLn "createContext!"
124 -- gl <- gLAreaGetContext glarea -- Remember to bind signal with 'after' so that this is not nullPtr.
125 Just win <- widgetGetWindow glarea
126 gl <- windowCreateGlContext win
127 (maj,min) <- gLContextGetRequiredVersion gl
128 -- (vmaj,vmin) <- gLContextGetVersion gl -- must be realized
129 -- islegacy <- gLContextIsLegacy gl -- must be realized
130 -- v_es <-gLContextGetUseEs gl
131
132 v_db <- gLContextGetDebugEnabled gl
133 v_fw <- gLContextGetForwardCompatible gl
134 v_es <- gLContextGetUseEs gl
135 putStrLn $ unwords [ "debug:",show v_db
136 , "fw:",show v_fw
137 , "es:", show v_es
138 , "ver:", show (maj,min)
139 ]
140 gLContextSetDebugEnabled gl True
141 gLContextSetForwardCompatible gl False -- True
142 gLContextSetRequiredVersion gl 3 3
143 v_db <- gLContextGetDebugEnabled gl
144 v_fw <- gLContextGetForwardCompatible gl
145 (maj,min) <- gLContextGetRequiredVersion gl
146 putStrLn $ unwords [ "debug:",show v_db
147 , "fw:",show v_fw
148 , "ver:", show (maj,min)
149 ]
150 return gl