{-# LANGUAGE RecordWildCards #-} -- | This module introduces a simple particle system to Affection module Affection.Particle ( updateParticle , drawParticles , updateParticleSystem ) where import Affection.Types import Data.Maybe (catMaybes) import qualified GEGL as G -- This function updates particles through a specified function. Particle ageing -- and death is being handled by 'updateParticles' itself and does not need to -- bother you. updateParticle :: Double -- ^ Elapsed time in seconds -> (Double -> Particle -> Particle) -- ^ Update function for a single 'Particle' -- This Function should take the elapsed time -- in seconds and the initial particle as arguments. -> Particle -- ^ 'Particle' to be processed -> Maybe Particle -- ^ resulting 'Particle' updateParticle time funct p@Particle{..} = if particleLife - time < 0 then Nothing else Just $ funct time $ p { particleLife = particleLife - time } drawParticles :: (Particle -> Affection us ()) -> [Particle] -> Affection us () drawParticles = mapM_ updateParticleSystem :: ParticleSystem -> Double -> (Double -> Particle -> Particle) -> (G.GeglBuffer -> G.GeglNode -> Particle -> Affection us ()) -> Affection us ParticleSystem updateParticleSystem sys sec upd draw = do let x = catMaybes $ map (updateParticle sec upd) (psParts sys) mapM_ (draw (psBuffer sys) (psNode sys)) x return $ sys { psParts = x }