lambdacube-engine-0.2.1: Graphics/LambdaCube/BlendMode.hs
module Graphics.LambdaCube.BlendMode where
import Graphics.LambdaCube.Types
-- | Type of texture blend mode.
data LayerBlendType
= LBT_COLOUR
| LBT_ALPHA
deriving (Eq,Ord)
-- TODO: unify blend operation types
-- | Texture blending operations.
data LayerBlendOperation
= LBO_REPLACE -- ^ replace all colour with texture with no adjustment
| LBO_ADD -- ^ add colour components together
| LBO_MODULATE -- ^ multiply colour components together
| LBO_ALPHA_BLEND -- ^ blend based on texture alpha
deriving (Eq,Ord)
-- | Extended texture blending operations.
data LayerBlendOperationEx
= LBX_SOURCE1 -- ^ use source1 without modification
| LBX_SOURCE2 -- ^ use source2 without modification
| LBX_MODULATE -- ^ multiply source1 and source2 together
| LBX_MODULATE_X2 -- ^ as LBX_MODULATE but brighten afterwards (x2)
| LBX_MODULATE_X4 -- ^ as LBX_MODULATE but brighten more afterwards (x4)
| LBX_ADD -- ^ add source1 and source2 together
| LBX_ADD_SIGNED -- ^ as LBX_ADD, but subtract 0.5 from the result
| LBX_ADD_SMOOTH -- ^ as LBX_ADD, but subtract product from the sum
| LBX_SUBTRACT -- ^ subtract source2 from source1
| LBX_BLEND_DIFFUSE_ALPHA -- ^ use interpolated alpha value from vertices to scale source1, then add source2 scaled by (1-alpha)
| LBX_BLEND_TEXTURE_ALPHA -- ^ as LBX_BLEND_DIFFUSE_ALPHA, but use alpha from texture
| LBX_BLEND_CURRENT_ALPHA -- ^ as LBX_BLEND_DIFFUSE_ALPHA, but use current alpha from previous stages
| LBX_BLEND_MANUAL -- ^ as LBX_BLEND_DIFFUSE_ALPHA but use a constant manual blend value (0.0-1.0)
| LBX_DOTPRODUCT -- ^ dot product of color1 and color2
| LBX_BLEND_DIFFUSE_COLOUR -- ^ use interpolated color values from vertices to scale source1, then add source2 scaled by (1-color)
deriving (Eq,Ord)
-- | Sources of values for blending operations.
data LayerBlendSource
= LBS_CURRENT -- ^ the colour as built up from previous stages
| LBS_TEXTURE -- ^ the colour derived from the texture assigned to this layer
| LBS_DIFFUSE -- ^ the interpolated diffuse colour from the vertices
| LBS_SPECULAR -- ^ the interpolated specular colour from the vertices
| LBS_MANUAL -- ^ a colour supplied manually as a separate argument
deriving (Eq,Ord)
data LayerBlendModeEx
= LayerBlendModeEx
{ lbBlendType :: LayerBlendType -- ^ The type of blending (colour or alpha)
, lbOperation :: LayerBlendOperationEx -- ^ The operation to be applied
, lbSource1 :: LayerBlendSource -- ^ The first source of colour/alpha
, lbSource2 :: LayerBlendSource -- ^ The second source of colour/alpha
, lbColourArg1 :: ColourValue -- ^ Manual colour value for manual source1
, lbColourArg2 :: ColourValue -- ^ Manual colour value for manual source2
, lbAlphaArg1 :: FloatType -- ^ Manual alpha value for manual source1
, lbAlphaArg2 :: FloatType -- ^ Manual alpha value for manual source2
, lbFactor :: FloatType -- ^ Manual blending factor
}
deriving (Eq,Ord)
-- | Types of blending that you can specify between an object and the
-- existing contents of the scene.
data SceneBlendType
= SBT_TRANSPARENT_ALPHA -- ^ Make the object transparent based on the final alpha values in the texture
| SBT_TRANSPARENT_COLOUR -- ^ Make the object transparent based on the colour values in the texture (brighter = more opaque)
| SBT_ADD -- ^ Add the texture values to the existing scene content
| SBT_MODULATE -- ^ Multiply the 2 colours together
| SBT_REPLACE -- ^ The default blend mode where source replaces destination
deriving (Eq,Ord)
-- | Blending factors for manually blending objects with the scene.
data SceneBlendFactor
= SBF_ONE
| SBF_ZERO
| SBF_DEST_COLOUR
| SBF_SOURCE_COLOUR
| SBF_ONE_MINUS_DEST_COLOUR
| SBF_ONE_MINUS_SOURCE_COLOUR
| SBF_DEST_ALPHA
| SBF_SOURCE_ALPHA
| SBF_ONE_MINUS_DEST_ALPHA
| SBF_ONE_MINUS_SOURCE_ALPHA
deriving (Eq,Ord)
-- | Blending operations controls how objects are blended into the scene.
data SceneBlendOperation
= SBO_ADD
| SBO_SUBTRACT
| SBO_REVERSE_SUBTRACT
| SBO_MIN
| SBO_MAX
deriving (Eq,Ord)
-- | Converts SceneBlendType to SceneBlendFactor pair
convertSBTtoSBF :: SceneBlendType -> (SceneBlendFactor,SceneBlendFactor)
convertSBTtoSBF SBT_ADD = (SBF_ONE,SBF_ONE)
convertSBTtoSBF SBT_MODULATE = (SBF_DEST_COLOUR,SBF_ZERO)
convertSBTtoSBF SBT_TRANSPARENT_COLOUR = (SBF_SOURCE_COLOUR,SBF_ONE_MINUS_SOURCE_COLOUR)
convertSBTtoSBF SBT_TRANSPARENT_ALPHA = (SBF_SOURCE_ALPHA,SBF_ONE_MINUS_SOURCE_ALPHA)
convertSBTtoSBF SBT_REPLACE = (SBF_ONE,SBF_ZERO)