packages feed

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
      )