packages feed

lambdacube-engine-0.1.1: Graphics/LambdaCube/Technique.hs

module Graphics.LambdaCube.Technique where

import Graphics.LambdaCube.RenderSystemCapabilities
import Graphics.LambdaCube.Pass
import Graphics.LambdaCube.Texture
import Graphics.LambdaCube.GpuProgram

-- | illumination pass state type
data IlluminationPassesState
    = IPS_COMPILE_DISABLED
    | IPS_NOT_COMPILED
    | IPS_COMPILED
    deriving Eq

{-| Directive used to manually control technique support based on the
	inclusion or exclusion of some factor.
-}
data IncludeOrExclude
    = INCLUDE -- ^ Inclusive - only support if present
    | EXCLUDE -- ^ Exclusive - do not support if present
    deriving Eq

-- | Rule controlling whether technique is deemed supported based on GPU vendor
data GPUVendorRule
    = GPUVendorRule
    { gvrVendor           :: GPUVendor
    , gvrIncludeOrExclude :: IncludeOrExclude
    }
    deriving Eq

-- | Rule controlling whether technique is deemed supported based on GPU device name
data GPUDeviceNameRule
    = GPUDeviceNameRule
    { gdrDevicePattern    :: String
    , gdrIncludeOrExclude :: IncludeOrExclude
    , gdrCaseSensitive    :: Bool
    }
    deriving Eq

{-| Class representing an approach to rendering this particular Material. 
@remarks
    Ogre will attempt to use the best technique supported by the active hardware, 
    unless you specifically request a lower detail technique (say for distant
    rendering).
-}
data (Texture t, LinkedGpuProgram lp) => Technique t lp
    = Technique
    { tchPasses             :: [Pass t lp]           -- ^ List of primary passes
--    , tchIlluminationPasses :: [IlluminationPass] -- ^ List of derived passes, categorised into IlluminationStage (ordered)

--    , tchIsSupported        :: Bool
--    IlluminationPassesState mIlluminationPassesCompilationPhase;
    , tchLodIndex           :: Int              -- ^ LOD level
    {-| Scheme index, derived from scheme name but the names are held on
    	MaterialManager, for speed an index is used here.
    -}
    , tchSchemeIndex        :: Int 
    , tchName               :: String           -- ^ optional name for the technique
    
    {-| When casting shadow, if not using default Ogre shadow casting material, or 
      nor using fixed function casting, mShadowCasterMaterial let you customize per material
      shadow caster behavior
    -}
--    , tchShadowCasterMaterial :: Material
    {-| When casting shadow, if not using default Ogre shadow casting material, or 
      nor using fixed function casting, mShadowCasterMaterial let you customize per material
      shadow caster behavior.There only material name is stored so that it can be loaded once all file parsed in a resource group.
    -}
--    , tchShadowCasterMaterialName :: String
    {-| When receiving shadow, if not using default Ogre shadow receiving material, or 
      nor using fixed function texture projection receiving, mShadowReceiverMaterial let you customize per material
      shadow caster behavior
    -}
--    , tchShadowReceiverMaterial :: Material
    {-| When receiving shadow, if not using default Ogre shadow receiving material, or 
      nor using fixed function texture projection receiving, mShadowReceiverMaterial let you customize per material
      shadow caster behavior. There only material name is stored so that it can be loaded once all file parsed in a resource group.
    -}
--    , tchShadowReceiverMaterialName :: String

    , tchGPUVendorRules     :: [GPUVendorRule]
    , tchGPUDeviceNameRules :: [GPUDeviceNameRule]
    }