@@ -43,6 +43,7 @@ import Ghengin.Core.Render.Pipeline
4343import Ghengin.Core.Render.Property
4444import Ghengin.Vulkan.Renderer.Sampler
4545import Ghengin.Core.Render.Queue
46+ import Ghengin.Core.Input
4647import Ghengin.Core.Shader (StructVec3 (.. ), StructMat4 (.. ))
4748import Vulkan.Core10.FundamentalTypes (Extent2D (.. ))
4849import qualified Data.Monoid.Linear as LMon
@@ -53,6 +54,7 @@ import qualified Data.Linear.Alias as Alias
5354
5455import Ghengin.Camera
5556import Ghengin.Core.Type.Compatible
57+ import Ghengin.Core.Type.Compatible.Pixel
5658import qualified Ghengin.DearImGui.Vulkan as ImGui
5759import qualified Ghengin.DearImGui.UI as ImGui
5860
@@ -63,26 +65,50 @@ import Planet.Noise
6365import Planet.UI
6466
6567gameLoop :: Compatible '[Vec3 , Vec3 ] '[Transform ] '[MinMax , Texture2D (RGBA8 UNorm )] '[Camera " view_matrix" " proj_matrix" ] π
66- => UTCTime
68+ => CharStream
6769 -> _
68- -- -> MeshKey π _ _ _ _
6970 -> MeshKey π '[Camera " view_matrix" " proj_matrix" ] '[MinMax , Texture2D (RGBA8 UNorm )] '[Vec3 , Vec3 ] '[Transform ]
70- -> _
71- -> Alias RenderPass ⊸ RenderQueue () ⊸ Core (RenderQueue () )
72- gameLoop currentTime planet mkey rot rp rq = Linear. do
71+ -> Alias RenderPass
72+ ⊸ RenderQueue ()
73+ ⊸ Core (RenderQueue () )
74+ gameLoop charStream planet mkey rp rq = Linear. do
7375 logT " New frame"
7476 should_close <- (shouldCloseWindow ↑ )
7577 if should_close then (Alias. forget rp ↑ ) >> return rq else Linear. do
7678 (pollWindowEvents ↑ )
7779
78- Ur (newPlanet, changed) <- preparePlanetUI planet
79-
80- Ur newTime <- liftSystemIOU getCurrentTime
81-
82- -- Fix Your Timestep: A Very Hard Thing To Get Right. For now, the simplest approach:
83- -- let frameTime = diffUTCTime newTime currentTime
84- -- deltaTime = Prelude.min MAX_FRAME_TIME $ realToFrac frameTime
80+ -- Update planet mesh according to UI
81+ Ur (newPlanet, changedShape, changedColor) <- preparePlanetUI planet -- must happen before the first render
82+ rq <-
83+ if changedShape then
84+ (editAtMeshesKey mkey rq (\ pipeline mat [(msh, x)] -> Linear. do
85+ ( (pmesh, pipeline),
86+ Ur minmax ) <- newPlanetMesh pipeline newPlanet
87+ mat <- propertyAt @ 0 @ MinMax (\ (Ur _) -> pure (Ur minmax)) mat
88+ freeMesh msh
89+ return (pipeline, (mat, [(pmesh, x)]))
90+ ) ↑ )
91+ else if changedColor then
92+ -- TODO: EditAtMaterialKey (materialKeyOfMeshKey)
93+ (editAtMeshesKey mkey rq (\ pipeline mat [(msh, x)] -> Linear. do
94+ mat <- propertyAt @ 1 @ _ (\ tex -> Alias. forget tex >> planetTexture (planetColor newPlanet)) mat
95+ return (pipeline, (mat, [(msh, x)]))
96+ ) ↑ )
97+ else
98+ pure rq
8599
100+ Ur mb_in <- readCharInput charStream
101+ rq <- case mb_in of
102+ Just ch -> Linear. do
103+ let doRotate ' d' = rotateY 0.01
104+ doRotate ' a' = rotateY (- 0.01 )
105+ doRotate ' w' = rotateX (0.01 )
106+ doRotate ' s' = rotateX (- 0.01 )
107+ doRotate _ = mempty
108+ (editMeshes mkey rq (traverse' $ propertyAt @ 0 (\ (Ur tr) -> pure $ Ur $ doRotate ch <> tr)) ↑ )
109+ Nothing -> pure rq
110+
111+ -- Render!
86112 (rp, rq) <- renderWith $ Linear. do
87113
88114 (rp1, rp2) <- lift (Alias. share rp)
@@ -97,32 +123,20 @@ gameLoop currentTime planet mkey rot rp rq = Linear.do
97123
98124 return (rp2, rq)
99125
100-
101- rq <-
102- if changed then
103- (editAtMeshesKey mkey rq (\ pipeline mat [(msh, x)] -> Linear. do
104- ( (pmesh, pipeline),
105- Ur minmax ) <- newPlanetMesh pipeline newPlanet
106- mat' <- propertyAt @ 0 @ MinMax (\ (Ur _) -> pure (Ur minmax)) mat
107- freeMesh msh
108- return (pipeline, (mat', [(pmesh, x)]))
109- ) ↑ )
110- else
111- pure rq
112-
113- -- rq <- (editMeshes mkey rq (traverse' $ propertyAt @0 (\(Ur tr) -> pure $ Ur $
114- -- rotateY rot <> rotateX (-rot))) ↑)
115-
116126 -- Loop!
117- gameLoop newTime newPlanet mkey (rot+ (0.01 :: Float )) rp rq
127+ gameLoop charStream newPlanet mkey rp rq
128+
129+ dimensions :: Num a => (a , a )
130+ dimensions = (1920 , 1080 )
118131
119132main :: Prelude. IO ()
120133main = do
121- currTime <- getCurrentTime
122134 withLinearIO $
123- runCore (1280 , 720 ) Linear. do
124- sampler <- ( createSampler FILTER_NEAREST SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE ↑ )
125- tex <- ( texture " examples/planets-core/assets/planet_gradient.png" sampler ↑ )
135+ runCore dimensions Linear. do
136+ Ur charStream <- registerCharStream
137+
138+ -- sampler <- ( createSampler FILTER_NEAREST SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE ↑)
139+ -- tex <- ( texture "examples/planets-core/assets/planet_gradient.png" sampler ↑)
126140
127141 (rp1, rp2) <- (Alias. share =<< createSimpleRenderPass ↑ )
128142
@@ -133,50 +147,66 @@ main = do
133147 -- todo: minmax should be per-mesh
134148 ( (pmesh, pipeline),
135149 Ur minmax ) <- (newPlanetMesh pipeline defaultPlanet ↑ )
136- (pmat, pipeline) <- (newPlanetMaterial minmax tex pipeline ↑ )
150+ (pmat, pipeline) <- (newPlanetMaterial minmax pipeline defaultPlanet ↑ )
137151
138152 -- remember to provide helper function in ghengin to insert meshes with pipelines and mats, without needing to do this:
139153 (rq, Ur pkey) <- pure (insertPipeline pipeline LMon. mempty )
140154 (rq, Ur mkey) <- pure (insertMaterial pkey pmat rq)
141155 (rq, Ur mshkey) <- pure (insertMesh mkey pmesh rq)
142156
143- rq <- gameLoop currTime defaultPlanet mshkey 0 rp2 rq
157+ rq <- gameLoop charStream defaultPlanet mshkey rp2 rq
144158
145159 (freeRenderQueue rq ↑ )
146160 (ImGui. destroyImCtx imctx ↑ )
147161
148162 return (Ur () )
149163
150164camera :: Camera " view_matrix" " proj_matrix"
151- camera = cameraLookAt (vec3 0 0 (- 5 ){- move camera "back"-} ) (vec3 0 0 0 ) ( 1280 , 720 )
165+ camera = cameraLookAt (vec3 0 0 (- 5 ){- move camera "back"-} ) (vec3 0 0 0 ) dimensions
152166
153167defaultPlanet :: Planet
154168defaultPlanet = Planet
155- { resolution = 10
169+ { resolution = 100
156170 , planetShape = PlanetShape
157- { planetRadius = 2.50
158- , planetNoise = AddNoiseMasked
159- [ StrengthenNoise 0.12 $ MinValueNoise
160- { minNoiseVal = 1.1
171+ { planetRadius = 3
172+ , planetNoise = ImGui. Collapsible $ AddNoiseMasked
173+ [ StrengthenNoise 0.110 $ MinValueNoise
174+ { minNoiseVal = 0.930
161175 , baseNoise = LayersCoherentNoise
162- { centre = ImGui. Color $ vec3 0 0 0
163- , baseRoughness = 0.71
164- , roughness = 1.83
165- , numLayers = 5
166- , persistence = 0.54
176+ -- { centre = ImGui.WithTooltip $ ImGui.Color $ vec3 0 0 0
177+ { centre = ImGui. WithTooltip $ ImGui. Color $ vec3 255 147 0
178+ , baseRoughness = 1.5
179+ , roughness = 2.5
180+ , numLayers = 20
181+ , persistence = 0.4
167182 }
168183 }
169- , StrengthenNoise 2. 5 $ MinValueNoise
170- { minNoiseVal = 0
184+ , StrengthenNoise 5 $ MinValueNoise
185+ { minNoiseVal = 0.120
171186 , baseNoise = RidgedNoise
172- { seed = 123
173- , octaves = 5
174- , scale = 1
187+ { seed = 25
188+ , octaves = 10
189+ , scale = 0.59
175190 , frequency = 2
176- , lacunarity = 3
191+ , lacunarity = 5.2
177192 }
178193 }
179194 ]
180195 }
196+ , planetColor = PlanetColor
197+ { planetColors =
198+ Prelude. map
199+ (\ (bnd, WithVec3 rn gn bn) -> (ImGui. InRange bnd, ImGui. Color (vec3 (rn/ 255 ) (gn/ 255 ) (bn/ 255 ))))
200+ [ (1 , vec3 0 83 255 )
201+ , (2 , vec3 255 218 0 )
202+ , (5 , vec3 255 120 0 )
203+ , (10 , vec3 60 255 0 )
204+ , (20 , vec3 27 183 0 )
205+ , (30 , vec3 10 163 0 )
206+ , (40 , vec3 158 37 0 )
207+ , (85 , vec3 108 13 0 )
208+ , (100 , vec3 231 231 231 )
209+ ]
210+ }
181211 }
182212
0 commit comments