mischief-render-0.1.0.0: examples/postprocess/Postprocess.hs
{-# LANGUAGE OverloadedStrings #-}
module Main where
import Control.Monad (void)
import Data.Default
import Material
import Mischief.Animation (AnimationPlugin)
import Mischief.Assets
import Mischief.Assets.Image
import Mischief.ECS
import Mischief.Input (InputPlugin)
import Mischief.Materials.Fullscreen (FullscreenMaterial)
import Mischief.Materials.Sprite (SpriteMaterial)
import Mischief.Math hiding (qd)
import Mischief.Math.Transform (Transform (..))
import Mischief.Render.Camera
import Mischief.Render.Core (RenderPostprocess, RenderUpdate)
import Mischief.Render.Material (WithMaterial (WithMaterial), renderMaterial)
import Mischief.Render.Material.Definition (RenderOptions (..))
import Mischief.Render.Plugin
import Mischief.Render.Sprite.Common
import Mischief.SDL.Window
main :: IO ()
main = do
app <- newApp
setAssetSource "assets" app
addPlugin @MainPlugin app
runApp app
data MainPlugin
instance Plugin MainPlugin where
init = do
systems setup
& schedule @Startup
systems renderPostprocess
& schedule @RenderUpdate
systems renderSprites
& schedule @RenderUpdate
deps = [dep @RenderPlugin, dep @InputPlugin, dep @TimePlugin, dep @AnimationPlugin, dep @FileWatcherPlugin]
renderPostprocess :: System ()
renderPostprocess = renderMaterial @PostprocessMaterial def {nvertices = 4}
renderSprites :: System ()
renderSprites = renderMaterial @SpriteMaterial def
setup :: System ()
setup = do
image <- load @Image "characters.png"
window <- spawn (Name "Window", Window, WindowFlags [WindowResizable])
void $ spawn (Camera, Rel OutputTo window, WithMaterial @PostprocessMaterial)
void $
spawn
( Sprite {image},
def {translation = V3 0 0 0},
SpriteSlice (V2 0 387) (V2 128 128),
WithMaterial @SpriteMaterial
)