packages feed

keid-render-basic 0.1.5.0 → 0.1.6.0

raw patch · 6 files changed

+135/−17 lines, 6 filesdep ~keid-corePVP: major bump suggested

API removals or changes: PVP suggests a major version bump

Dependency ranges changed: keid-core

API changes (from Hackage documentation)

- Stage.Loader.Types: [$sel:rsProjectionP:RunState] :: RunState -> ProjectionProcess
+ Render.DescSets.Sun: SunInput :: Vec4 -> Float -> Float -> Float -> Vec3 -> Float -> Float -> Float -> SunInput
+ Render.DescSets.Sun: [$sel:siAzimuth:SunInput] :: SunInput -> Float
+ Render.DescSets.Sun: [$sel:siColor:SunInput] :: SunInput -> Vec4
+ Render.DescSets.Sun: [$sel:siDepthRange:SunInput] :: SunInput -> Float
+ Render.DescSets.Sun: [$sel:siInclination:SunInput] :: SunInput -> Float
+ Render.DescSets.Sun: [$sel:siRadius:SunInput] :: SunInput -> Float
+ Render.DescSets.Sun: [$sel:siShadowIx:SunInput] :: SunInput -> Float
+ Render.DescSets.Sun: [$sel:siSize:SunInput] :: SunInput -> Float
+ Render.DescSets.Sun: [$sel:siTarget:SunInput] :: SunInput -> Vec3
+ Render.DescSets.Sun: data SunInput
+ Render.DescSets.Sun: initialSunInput :: SunInput
+ Render.DescSets.Sun: mkSun :: SunInput -> ("bounding box" ::: Transform, Sun)
+ Render.DescSets.Sun: newObserver1 :: MonadIO m => m Observer
+ Render.DescSets.Sun: observe1 :: MonadUnliftIO m => Process -> Observer -> Buffer -> m ()
+ Render.DescSets.Sun: spawn1 :: MonadUnliftIO m => SunInput -> m Process
+ Render.DescSets.Sun: type Buffer = Allocated 'Coherent Sun
+ Render.DescSets.Sun: type Observer = ObserverIO (Vector ("bounding box" ::: Transform))
+ Render.DescSets.Sun: type Process = Cell SunInput ("bounding box" ::: Transform, Sun)
- Render.DescSets.Sun: createSet0Ds :: Tagged '[Sun] DescriptorSetLayout -> ResourceT (StageRIO st) (Tagged '[Sun] (Vector DescriptorSet), Allocated 'Coherent Sun)
+ Render.DescSets.Sun: createSet0Ds :: Tagged '[Sun] DescriptorSetLayout -> ResourceT (StageRIO st) (Tagged '[Sun] (Vector DescriptorSet), Buffer)
- Stage.Loader.Scene: spawn :: (MonadUnliftIO m, HasOutput projection, GetOutput projection ~ Projection) => projection -> m Process
+ Stage.Loader.Scene: spawn :: (MonadUnliftIO m, HasOutput projection, GetOutput projection ~ Projection 'Orthographic) => projection -> m Process
- Stage.Loader.Types: RunState :: ProjectionProcess -> Process -> UI -> RunState
+ Stage.Loader.Types: RunState :: Process -> UI -> RunState

Files

ChangeLog.md view
@@ -1,5 +1,10 @@ # Changelog for keid-render-basic +## 0.1.6.0++- Updated `Loader` stage to camera changes in core.+- Import sun (directional light) functions from demos.+ ## 0.1.5.0  - Extracted deprecated `allocateRenderpass_` into `Render.Basic.allocate`.
keid-render-basic.cabal view
@@ -5,12 +5,13 @@ -- see: https://github.com/sol/hpack  name:           keid-render-basic-version:        0.1.5.0+version:        0.1.6.0 synopsis:       Basic rendering programs for Keid engine. category:       Game Engine+homepage:       https://keid.haskell-game.dev author:         IC Rainbow maintainer:     keid@aenor.ru-copyright:      2021 IC Rainbow+copyright:      2022 IC Rainbow license:        BSD3 license-file:   LICENSE build-type:     Simple@@ -142,7 +143,7 @@     , distributive     , file-embed >=0.0.10     , geomancy-    , keid-core >=0.1.5.0+    , keid-core >=0.1.6.0     , keid-geometry     , neat-interpolation     , resourcet
src/Render/DescSets/Sun.hs view
@@ -6,6 +6,19 @@   , set0    , pattern MAX_VIEWS++  , Buffer++  , SunInput(..)+  , initialSunInput++  , Process+  , spawn1+  , mkSun++  , Observer+  , newObserver1+  , observe1   ) where  import RIO@@ -16,20 +29,25 @@ import Data.Vector qualified as Vector import Data.Vector.Storable qualified as VectorS import Foreign.Storable.Generic (GStorable)-import Geomancy (Vec4, vec4)+import Geomancy (Vec3, Vec4, vec3, vec4) import Geomancy.Transform (Transform)+import Geomancy.Transform qualified as Transform+import Geomancy.Vec4 qualified as Vec4 import Vulkan.Core10 qualified as Vk import Vulkan.CStruct.Extends (SomeStruct(..))+import Vulkan.NamedType ((:::)) import Vulkan.Utils.Debug qualified as Debug import Vulkan.Zero (Zero(..)) +import Engine.Camera qualified as Camera import Engine.Types (StageRIO) import Engine.Vulkan.DescSets () import Engine.Vulkan.Types (DsBindings, HasVulkan(..))+import Engine.Worker qualified as Worker import Resource.Buffer qualified as Buffer import Resource.DescriptorSet qualified as DescriptorSet --- * Set0 data+-- * Set0 data for light projection  -- | Maximum "guaranteed" amount for multiview passes pattern MAX_VIEWS :: Int@@ -74,11 +92,13 @@  -- * Setup +type Buffer = Buffer.Allocated 'Buffer.Coherent Sun+ createSet0Ds   :: Tagged '[Sun] Vk.DescriptorSetLayout   -> ResourceT (StageRIO st)       ( Tagged '[Sun] (Vector Vk.DescriptorSet)-      , Buffer.Allocated 'Buffer.Coherent Sun+      , Buffer       ) createSet0Ds (Tagged set0layout) = do   context <- asks id@@ -163,3 +183,96 @@      writeSets =       Vector.singleton writeSet0b0++data SunInput = SunInput+  { siColor :: Vec4++  , siInclination :: Float+  , siAzimuth     :: Float+  , siRadius      :: Float+  , siTarget      :: Vec3++  , siDepthRange :: Float+  , siSize       :: Float+  , siShadowIx   :: Float+  }++initialSunInput :: SunInput+initialSunInput = SunInput+  { siColor = vec4 1 1 1 1++  , siInclination = τ/8+  , siAzimuth     = -τ/8+  , siRadius      = Camera.PROJECTION_FAR / 2+  , siTarget      = 0++  , siDepthRange = Camera.PROJECTION_FAR+  , siSize       = 512+  , siShadowIx   = -1+  }++type Process = Worker.Cell SunInput ("bounding box" ::: Transform, Sun)++spawn1 :: MonadUnliftIO m => SunInput -> m Process+spawn1 = Worker.spawnCell mkSun++mkSun :: SunInput -> ("bounding box" ::: Transform, Sun)+mkSun SunInput{..} =+  ( bbTransform+  , Sun+      { sunViewProjection = mconcat vp+      , sunShadow         = vec4 0 0 siShadowIx siSize+      , sunPosition       = Vec4.fromVec3 position 0+      , sunDirection      = Vec4.fromVec3 direction 0+      , sunColor          = siColor+      }+  )+  where+    vp =+      [ Transform.rotateY (-siAzimuth)+      , Transform.rotateX (-siInclination)++      , Transform.translate 0 0 siRadius++      -- XXX: some area beyond the near plane receives light, but not shadows+      , Transform.scale3+          (1 / siSize)+          (1 / siSize)+          (1 / siDepthRange)+      ]++    position = Transform.apply (vec3 0 0 siRadius) rotation++    direction = Transform.apply (vec3 0 0 $ -1) rotation++    bbTransform = mconcat+      [ -- XXX: orient wire box "green/near -> far/red"+        Transform.rotateX (τ/4)+        -- XXX: the rest must be matched with VP flipped+      , Transform.translate 0 0 0.5                 -- XXX: shift origin to the near face++        -- XXX: reverse light transform+      , Transform.scale3 siSize siSize siDepthRange -- XXX: size to projection volume+      , Transform.translate 0 0 (-siRadius)         -- XXX: translate near face to radius+      , rotation                                    -- XXX: apply sphere coords+      ]++    rotation = mconcat+      [ Transform.rotateX siInclination+      , Transform.rotateY siAzimuth+      ]++type Observer = Worker.ObserverIO (VectorS.Vector ("bounding box" ::: Transform))++newObserver1 :: MonadIO m => m Observer+newObserver1 = Worker.newObserverIO mempty++observe1 :: MonadUnliftIO m => Process -> Observer -> Buffer -> m ()+observe1 sunP sunOut sunData =+  Worker.observeIO_ sunP sunOut \_oldBB (bb, sun) -> do+    -- XXX: must stay the same or descsets must be updated with a new buffer+    _same <- Buffer.updateCoherent (VectorS.singleton sun) sunData+    pure $ VectorS.singleton bb++τ :: Float+τ = 2 * pi
src/Stage/Loader/Scene.hs view
@@ -5,8 +5,6 @@  import RIO -import Geomancy.Transform qualified as Transform- import Engine.Camera qualified as Camera import Engine.Worker qualified as Worker import Render.DescSets.Set0 (Scene(..), emptyScene)@@ -16,15 +14,15 @@ spawn   :: ( MonadUnliftIO m      , Worker.HasOutput projection-     , Worker.GetOutput projection ~ Camera.Projection+     , Worker.GetOutput projection ~ Camera.Projection 'Camera.Orthographic      )   => projection   -> m Process spawn = Worker.spawnMerge1 mkScene -mkScene :: Camera.Projection -> Scene+mkScene :: Camera.Projection 'Camera.Orthographic -> Scene mkScene Camera.Projection{..} =   emptyScene-    { sceneProjection    = projectionOrthoUI-    , sceneInvProjection = Transform.inverse projectionOrthoUI -- FIXME: move to cell output+    { sceneProjection    = projectionTransform+    , sceneInvProjection = projectionInverse     }
src/Stage/Loader/Setup.hs view
@@ -8,6 +8,7 @@ import RIO  import Control.Monad.Trans.Resource (ResourceT)+import Engine.Camera qualified as Camera import Engine.StageSwitch (trySwitchStage) import Engine.Types (StackStage(..), Stage(..), StageSetupRIO) import Engine.Types qualified as Engine@@ -164,7 +165,8 @@   -> StageSetupRIO (Resource.ReleaseKey, RunState) initialRunState loadAction nextStage uiSettings =   withPools \pools -> do-    rsProjectionP <- Engine.getScreenP+    (projectionKey, rsProjectionP) <- Worker.registered+      Camera.spawnOrthoPixelsCentered      (sceneUiKey, rsSceneUiP) <- Worker.registered $       Scene.spawn rsProjectionP@@ -187,7 +189,8 @@      releaseKeys <- Resource.register $       traverse_ @[] Resource.release-        [ sceneUiKey+        [ projectionKey+        , sceneUiKey         , quadKey         , screenKey         , uiKey
src/Stage/Loader/Types.hs view
@@ -6,7 +6,6 @@   , RunState(..)   ) where -import Engine.Camera qualified as Camera import Render.Basic qualified as Basic import Render.DescSets.Set0 qualified as Set0 @@ -24,8 +23,7 @@   }  data RunState = RunState-  { rsProjectionP :: Camera.ProjectionProcess-  , rsSceneUiP    :: Set0.Process+  { rsSceneUiP    :: Set0.Process    , rsUI :: UI   }