-----------------------------------------------------------------------------
--
-- Module      :  Graphics.GPipe.Stream.Fragment
-- Copyright   :  Tobias Bexelius
-- License     :  BSD3
--
-- Maintainer  :  Tobias Bexelius
-- Stability   :  Experimental
-- Portability :  Portable
--
-- | 'FragmentStream's implement the 'Functor' class, which provides the
-- 'fmap' method that you can use to manipulate those streams. This corresponds to writing and using
-- fragment shaders, but in a much more modular way. You may for instance apply 'fmap'
-- several times in a sequence, effectively creating complex shaders.
--
-- Instances are also provided for the 'Monoid' class, so several streams (of the same type) can be
-- concatenated. The order is preserved, meaning that the fragments in stream @a@ in @a `mappend` b@ will be
-- drawn before the fragments in @b@.
--
-- All atomic values except textures in fragment streams uses the 'Fragment' type constructor.
-- Composite types are created by composing the atomic 'Fragment' types, rather than wrapping the
-- composite type in the 'Fragment' type constructors.
--
-- 'Fragment' instances for are provided for most of Prelude's numerical classes. Since 'Eq', 'Ord'
-- and 'Show' are prerequisites for these classes, instances are provided for them too, even though
-- their methods all will generate errors if used (except 'min' and 'max'). Use the instances of
-- 'EqB', 'OrdB' and 'IfB' from the Boolean package if you want to compare 'Fragment' values.
-- Hyperbolic trigonometrical functions aren't provided either.
--
-- Rewrite rule specializations are provided for the Vec package functions 'norm', 'normalize',
-- 'dot' and 'cross' on vectors of 'Fragment' 'Float', so the use of these functions (and others
-- from that package that is defined in terms of them) are highly encouraged.

-----------------------------------------------------------------------------

module Graphics.GPipe.Stream.Fragment (
    -- * Data types
    FragmentStream(),
    Fragment(),

    -- * Various fragment functions
    dFdx,
    dFdy,
    fwidth,
    filterFragments,

    -- * Creating fragment streams
    VertexOutput(..),
    Rasterizer(),
    VertexPosition,
    -- | When using the @rasterize@ functions, give the vertices positions in canonical view space, i.e. where @x@, @y@ and @z@
    -- is in the interval @[-1, 1]@. These aren't interpolated back to the fragments by default, so you
    -- must duplicate these positions into the vertices interpolated values if you need them in the fragments (which is very unusual).
    rasterizeFront,
    rasterizeBack,
    rasterizeFrontAndBack,
) where

import Shader
import GPUStream
import Rasterizer