diff options
author | Joe Crayne <joe@jerkface.net> | 2019-04-08 00:58:18 -0400 |
---|---|---|
committer | Joe Crayne <joe@jerkface.net> | 2019-04-08 00:58:18 -0400 |
commit | 72da18a55e7fdda733c8306398920277ad5b7985 (patch) | |
tree | a67ab3dd2a09bbc2e8ea7ef6c356611d454b85b2 /Lambda2.hs | |
parent | f7120657200b74c555966d17c8a882c15e948280 (diff) |
Lambda2 experiment.
Diffstat (limited to 'Lambda2.hs')
-rw-r--r-- | Lambda2.hs | 150 |
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 #-} | ||
3 | module Lambda2 where | ||
4 | |||
5 | import GI.Gtk.Objects (GLArea,gLAreaGetContext,widgetGetWindow) | ||
6 | import GI.Gdk.Objects.GLContext (GLContext, gLContextGetDebugEnabled, | ||
7 | gLContextGetForwardCompatible, | ||
8 | gLContextSetDebugEnabled, | ||
9 | gLContextSetForwardCompatible, | ||
10 | gLContextGetRequiredVersion, | ||
11 | gLContextSetRequiredVersion, | ||
12 | gLContextGetUseEs, | ||
13 | getGLContextWindow) | ||
14 | import GI.Gdk.Objects.Window (windowCreateGlContext,windowGetWidth,windowGetHeight) | ||
15 | |||
16 | import qualified Data.Map as Map | ||
17 | import qualified Data.Vector as V | ||
18 | |||
19 | import LambdaCube.GL as LambdaCubeGL -- renderer | ||
20 | import LambdaCube.GL.Mesh as LambdaCubeGL | ||
21 | import Codec.Picture as Juicy | ||
22 | import Data.Aeson | ||
23 | import qualified Data.ByteString as SB | ||
24 | |||
25 | data State = State | ||
26 | |||
27 | initState :: IO State | ||
28 | initState = do | ||
29 | return State | ||
30 | |||
31 | render :: State -> GLArea -> GLContext -> IO Bool | ||
32 | render 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 | ||
94 | triangleA :: LambdaCubeGL.Mesh | ||
95 | triangleA = 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 | |||
103 | triangleB :: LambdaCubeGL.Mesh | ||
104 | triangleB = 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 | |||
112 | realize :: State -> GLArea -> IO () | ||
113 | realize st glarea = do | ||
114 | putStrLn "realize!" | ||
115 | return () | ||
116 | |||
117 | unrealize :: State -> GLArea -> IO () | ||
118 | unrealize st glarea = do | ||
119 | return () | ||
120 | |||
121 | createContext :: State -> GLArea -> IO GLContext | ||
122 | createContext 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 | ||