{-# LANGUAGE FlexibleContexts #-}
module Graphics.LambdaCube.Loader.ParserUtil where

import UU.Parsing
import UU.Scanner

import Graphics.LambdaCube.BlendMode
import Graphics.LambdaCube.Common
import Graphics.LambdaCube.Compositor
import Graphics.LambdaCube.Light
import Graphics.LambdaCube.Pass
import Graphics.LambdaCube.PixelFormat
import Graphics.LambdaCube.RenderSystem
import Graphics.LambdaCube.Technique
import Graphics.LambdaCube.Texture
import Graphics.LambdaCube.TextureUnitState
import Graphics.LambdaCube.Types

-- * Utility parser combinators

infixl 4 <$=, <*=

(<$=) :: (IsParser p Token) => b -> String -> p b
x <$= s = x <$ pKey s

(<*=) :: (IsParser p Token) => p a -> String -> p a
x <*= s = x <* pKey s

pBool :: AnaParser [Token] Pair Token (Maybe Token) Bool
pBool = pEnum boolVals

pOnOff :: AnaParser [Token] Pair Token (Maybe Token) Bool
pOnOff = pEnum onoffVals

pInt :: AnaParser [Token] Pair Token (Maybe Token) Int
pInt = read <$> pInteger10

pFloat :: AnaParser [Token] Pair Token (Maybe Token) FloatType
pFloat =  read <$> pFraction
      <|> read <$> pInteger10

pName :: AnaParser [Token] Pair Token (Maybe Token) String
pName =  pVarid
     <|> (filter (/= '"') <$> pString)
     <|> pInteger10
     <|> pFraction

pEnum :: (IsParser p Token) => [(String, t)] -> p t
pEnum v = pAny (\(a,b) -> pKey a *> pSucceed b) v

pColour :: FloatType -> AnaParser [Token] Pair Token (Maybe Token) (Either FloatType4 ())
pColour a =  Left <$> pRGB a
         <|> Left <$> pRGBA
         <|> Right () <$= "vertex_colour"

pFloat3 :: AnaParser [Token] Pair Token (Maybe Token) FloatType3
pFloat3 = (,,) <$> pFloat <*> pFloat <*> pFloat

pFloat4 :: AnaParser [Token] Pair Token (Maybe Token) FloatType4
pFloat4 = (,,,) <$> pFloat <*> pFloat <*> pFloat <*> pFloat

pRGBOrRGBA :: FloatType -> AnaParser [Token] Pair Token (Maybe Token) FloatType4
pRGBOrRGBA a = pRGBA <|> pRGB a

pRGBA :: AnaParser [Token] Pair Token (Maybe Token) FloatType4
pRGBA = pFloat4

pRGB :: FloatType -> AnaParser [Token] Pair Token (Maybe Token) FloatType4
pRGB a = (,,,) <$> pFloat <*> pFloat <*> pFloat <*> pSucceed a

def :: a -> [a] -> a
def dv l = if null l then dv else head l

boolVals :: [(String, Bool)]
boolVals =
    [ ("true",  True)
    , ("false", False)
    ]

onoffVals :: [(String, Bool)]
onoffVals =
    [ ("on",    True)
    , ("off",   False)
    ]

ruleopVals :: [(String, IncludeOrExclude)]
ruleopVals =
    [ ("include",INCLUDE)
    , ("exclude",EXCLUDE)
    ]

cmpfuncVals :: [(String, CompareFunction)]
cmpfuncVals =
    [ ("always_fail",   CMPF_ALWAYS_FAIL)
    , ("always_pass",   CMPF_ALWAYS_PASS)
    , ("less",          CMPF_LESS)
    , ("less_equal",    CMPF_LESS_EQUAL)
    , ("equal",         CMPF_EQUAL)
    , ("not_equal",     CMPF_NOT_EQUAL)
    , ("greater_equal", CMPF_GREATER_EQUAL)
    , ("greater",       CMPF_GREATER)
    ]

shadingVals :: [(String, ShadeOptions)]
shadingVals =
    [ ("flat",    SO_FLAT)
    , ("gouraud", SO_GOURAUD)
    , ("phong",   SO_PHONG)
    ]

polymodeVals :: [(String, PolygonMode)]
polymodeVals =
    [ ("points",    PM_POINTS)
    , ("wireframe", PM_WIREFRAME)
    , ("solid",     PM_SOLID)
    ]

blendopVals :: [(String, SceneBlendOperation)]
blendopVals =
    [ ("add",               SBO_ADD)
    , ("subtract",          SBO_SUBTRACT)
    , ("reverse_subtract",  SBO_REVERSE_SUBTRACT)
    , ("min",               SBO_MIN)
    , ("max",               SBO_MAX)
    ]

blendVals :: [(String, SceneBlendFactor)]
blendVals =
    [ ("one",                   SBF_ONE)
    , ("zero",                  SBF_ZERO)
    , ("dest_colour",           SBF_DEST_COLOUR)
    , ("src_colour",            SBF_SOURCE_COLOUR)
    , ("one_minus_dest_colour", SBF_ONE_MINUS_DEST_COLOUR)
    , ("one_minus_src_colour",  SBF_ONE_MINUS_SOURCE_COLOUR)
    , ("dest_alpha",            SBF_DEST_ALPHA)
    , ("src_alpha",             SBF_SOURCE_ALPHA)
    , ("one_minus_dest_alpha",  SBF_ONE_MINUS_DEST_ALPHA)
    , ("one_minus_src_alpha",   SBF_ONE_MINUS_SOURCE_ALPHA)
    ]

sceneblendVals :: [(String, SceneBlendType)]
sceneblendVals =
    [ ("add",          SBT_ADD)
    , ("modulate",     SBT_MODULATE)
    , ("colour_blend", SBT_TRANSPARENT_COLOUR)
    , ("alpha_blend",  SBT_TRANSPARENT_ALPHA)
    ]

illumstageVals :: [(String, IlluminationStage)]
illumstageVals =
    [ ("ambient",   IS_AMBIENT)
    , ("per_light", IS_PER_LIGHT)
    , ("decal",     IS_DECAL)
    ]

cullhwVals :: [(String, CullingMode)]
cullhwVals =
    [ ("clockwise",     CULL_CLOCKWISE)
    , ("anticlockwise", CULL_ANTICLOCKWISE)
    , ("none",          CULL_NONE)
    ]

cullswVals :: [(String, ManualCullingMode)]
cullswVals =
    [ ("back",  MANUAL_CULL_BACK)
    , ("front", MANUAL_CULL_FRONT)
    , ("none",  MANUAL_CULL_NONE)
    ]

lighttypeVals :: [(String, LightTypes)]
lighttypeVals =
    [ ("point",       LT_POINT)
    , ("directional", LT_DIRECTIONAL)
    , ("spot",        LT_SPOTLIGHT)
    ]

copVals :: [(String, LayerBlendOperation)]
copVals =
    [ ("replace",     LBO_REPLACE)
    , ("add",         LBO_ADD)
    , ("modulate",    LBO_MODULATE)
    , ("alpha_blend", LBO_ALPHA_BLEND)
    ]

btyVals :: [(String, BindingType)]
btyVals =
    [ ("vertex",   BT_VERTEX)
    , ("fragment", BT_FRAGMENT)
    ]

ctyVals :: [(String, ContentType)]
ctyVals =
    [ ("named",  CONTENT_NAMED)
    , ("shadow", CONTENT_SHADOW)
    ]

pixelformatVals :: [(String, PixelFormat)]
pixelformatVals =
    [ ("PF_L8",           PF_L8)
    , ("PF_L16",          PF_L16)
    , ("PF_A8",           PF_A8)
    , ("PF_A4L4",         PF_A4L4)
    , ("PF_BYTE_LA",      PF_BYTE_LA)
    , ("PF_R5G6B5",       PF_R5G6B5)
    , ("PF_B5G6R5",       PF_B5G6R5)
    , ("PF_R3G3B2",       PF_R3G3B2)
    , ("PF_A4R4G4B4",     PF_A4R4G4B4)
    , ("PF_A1R5G5B5",     PF_A1R5G5B5)
    , ("PF_R8G8B8",       PF_R8G8B8)
    , ("PF_B8G8R8",       PF_B8G8R8)
    , ("PF_A8R8G8B8",     PF_A8R8G8B8)
    , ("PF_A8B8G8R8",     PF_A8B8G8R8)
    , ("PF_B8G8R8A8",     PF_B8G8R8A8)
    , ("PF_R8G8B8A8",     PF_R8G8B8A8)
    , ("PF_X8R8G8B8",     PF_X8R8G8B8)
    , ("PF_X8B8G8R8",     PF_X8B8G8R8)
    , ("PF_A2R10G10B10",  PF_A2R10G10B10)
    , ("PF_A2B10G10R10",  PF_A2B10G10R10)
    , ("PF_FLOAT16_R",    PF_FLOAT16_R)
    , ("PF_FLOAT16_RGB",  PF_FLOAT16_RGB)
    , ("PF_FLOAT16_RGBA", PF_FLOAT16_RGBA)
    , ("PF_FLOAT32_R",    PF_FLOAT32_R)
    , ("PF_FLOAT32_RGB",  PF_FLOAT32_RGB)
    , ("PF_FLOAT32_RGBA", PF_FLOAT32_RGBA)
    , ("PF_SHORT_RGBA",   PF_SHORT_RGBA)
    ]

textypeVals :: [(String, TextureType)]
textypeVals =
    [ ("1d",    TEX_TYPE_1D)
    , ("2d",    TEX_TYPE_2D)
    , ("3d",    TEX_TYPE_3D)
    , ("cubic", TEX_TYPE_CUBE_MAP)
    ]

texaddressVals :: [(String, TextureAddressingMode)]
texaddressVals =
    [ ("wrap",   TAM_WRAP)
    , ("clamp",  TAM_CLAMP)
    , ("mirror", TAM_MIRROR)
    , ("border", TAM_BORDER)
    ]

texfilteringVals :: [(String, (FilterOptions, FilterOptions, FilterOptions))]
texfilteringVals =
    [ ("none",        (FO_POINT,FO_POINT,FO_NONE))
    , ("bilinear",    (FO_LINEAR,FO_LINEAR,FO_POINT))
    , ("trilinear",   (FO_LINEAR,FO_LINEAR,FO_LINEAR))
    , ("anisotropic", (FO_ANISOTROPIC,FO_ANISOTROPIC,FO_LINEAR))
    ]

filteringVals :: [(String, FilterOptions)]
filteringVals =
    [ ("none",        FO_NONE)
    , ("point",       FO_POINT)
    , ("linear",      FO_LINEAR)
    , ("anisotropic", FO_ANISOTROPIC)
    ]

envmapVals :: [(String, Maybe EnvMapType)]
envmapVals =
    [ ("off",              Nothing)
    , ("spherical",        Just ENV_CURVED)
    , ("planar",           Just ENV_PLANAR)
    , ("cubic_reflection", Just ENV_REFLECTION)
    , ("cubic_normal",     Just ENV_NORMAL)
    ]

xformtypeVals :: [(String, TextureTransformType)]
xformtypeVals =
    [ ("scroll_x", TT_TRANSLATE_U)
    , ("scroll_y", TT_TRANSLATE_V)
    , ("scale_x",  TT_SCALE_U)
    , ("scale_y",  TT_SCALE_V)
    , ("rotate",   TT_ROTATE)
    ]

wavetypeVals :: [(String, WaveformType)]
wavetypeVals =
    [ ("sine",              WFT_SINE)
    , ("triangle",          WFT_TRIANGLE)
    , ("square",            WFT_SQUARE)
    , ("sawtooth",          WFT_SAWTOOTH)
    , ("inverse_sawtooth",  WFT_INVERSE_SAWTOOTH)
--    , ("",WFT_PWM)
    ]

stencilopVals :: [(String, StencilOperation)]
stencilopVals =
    [ ("keep",              SOP_KEEP)
    , ("zero",              SOP_ZERO)
    , ("replace",           SOP_REPLACE)
    , ("increment",         SOP_INCREMENT)
    , ("decrement",         SOP_DECREMENT)
    , ("increment_wrap",    SOP_INCREMENT_WRAP)
    , ("decrement_wrap",    SOP_DECREMENT_WRAP)
    , ("invert",            SOP_INVERT)
    ]

fogmodeVals :: [(String, FogMode)]
fogmodeVals =
    [ ("none",      FOG_NONE)
    , ("linear",    FOG_LINEAR)
    , ("exp",       FOG_EXP)
    , ("exp2",      FOG_EXP2)
    ]

layerblendopexVals :: [(String, LayerBlendOperationEx)]
layerblendopexVals =
    [ ("source1",               LBX_SOURCE1)
    , ("source2",               LBX_SOURCE2)
    , ("modulate",              LBX_MODULATE)
    , ("modulate_x2",           LBX_MODULATE_X2)
    , ("modulate_x4",           LBX_MODULATE_X4)
    , ("add",                   LBX_ADD)
    , ("add_signed",            LBX_ADD_SIGNED)
    , ("add_smooth",            LBX_ADD_SMOOTH)
    , ("subtract",              LBX_SUBTRACT)
    , ("blend_diffuse_alpha",   LBX_BLEND_DIFFUSE_ALPHA)
    , ("blend_texture_alpha",   LBX_BLEND_TEXTURE_ALPHA)
    , ("blend_current_alpha",   LBX_BLEND_CURRENT_ALPHA)
    , ("blend_manual",          LBX_BLEND_MANUAL)
    , ("dotproduct",            LBX_DOTPRODUCT)
    , ("blend_diffuse_colour",  LBX_BLEND_DIFFUSE_COLOUR)
    ]

layerblendsrcVals :: [(String, LayerBlendSource)]
layerblendsrcVals =
    [ ("src_current",   LBS_CURRENT)
    , ("src_texture",   LBS_TEXTURE)
    , ("src_diffuse",   LBS_DIFFUSE)
    , ("src_specular",  LBS_SPECULAR)
    , ("src_manual",    LBS_MANUAL)
    ]

inputVals :: [(String, InputMode)]
inputVals =
    [ ("none",      IM_NONE)
    , ("previous",  IM_PREVIOUS)
    ]

compositorPixelFormatVals :: [(String, PixelFormat)]
compositorPixelFormatVals =
    [ ("PF_A8R8G8B8",       PF_A8R8G8B8)
    , ("PF_R8G8B8A8",       PF_R8G8B8A8)
    , ("PF_R8G8B8",         PF_R8G8B8)
    , ("PF_FLOAT16_RGBA",   PF_FLOAT16_RGBA)
    , ("PF_FLOAT16_RGB",    PF_FLOAT16_RGB)
    , ("PF_FLOAT16_R",      PF_FLOAT16_R)
    , ("PF_FLOAT32_RGBA",   PF_FLOAT32_RGBA)
    , ("PF_FLOAT32_RGB",    PF_FLOAT32_RGB)
    , ("PF_FLOAT32_R",      PF_FLOAT32_R)
    ]

--autoparamVals = [(n,v) | (v,n,_,_,_) <- autoConstantDictionary]
{-
    [ ("world_matrix",                              ACT_WORLD_MATRIX)
    , ("inverse_world_matrix",                      ACT_INVERSE_WORLD_MATRIX)
    , ("transpose_world_matrix",                    ACT_TRANSPOSE_WORLD_MATRIX)
    , ("inverse_transpose_world_matrix",            ACT_INVERSE_TRANSPOSE_WORLD_MATRIX)
    , ("world_matrix_array_3x4",                    ACT_WORLD_MATRIX_ARRAY_3x4)
    , ("view_matrix",                               ACT_VIEW_MATRIX)
    , ("inverse_view_matrix",                       ACT_INVERSE_VIEW_MATRIX)
    , ("transpose_view_matrix",                     ACT_TRANSPOSE_VIEW_MATRIX)
    , ("inverse_transpose_view_matrix",             ACT_INVERSE_TRANSPOSE_VIEW_MATRIX)
    , ("projection_matrix",                         ACT_PROJECTION_MATRIX)
    , ("inverse_projection_matrix",                 ACT_INVERSE_PROJECTION_MATRIX)
    , ("transpose_projection_matrix",               ACT_TRANSPOSE_PROJECTION_MATRIX)
    , ("inverse_transpose_projection_matrix",       ACT_INVERSE_TRANSPOSE_PROJECTION_MATRIX)
    , ("worldview_matrix",                          ACT_WORLDVIEW_MATRIX)
    , ("inverse_worldview_matrix",                  ACT_INVERSE_WORLDVIEW_MATRIX)
    , ("transpose_worldview_matrix",                ACT_TRANSPOSE_WORLDVIEW_MATRIX)
    , ("inverse_transpose_worldview_matrix",        ACT_INVERSE_TRANSPOSE_WORLDVIEW_MATRIX)
    , ("viewproj_matrix",                           ACT_VIEWPROJ_MATRIX)
    , ("inverse_viewproj_matrix",                   ACT_INVERSE_VIEWPROJ_MATRIX)
    , ("transpose_viewproj_matrix",                 ACT_TRANSPOSE_VIEWPROJ_MATRIX)
    , ("inverse_transpose_viewproj_matrix",         ACT_INVERSE_TRANSPOSE_VIEWPROJ_MATRIX)
    , ("worldviewproj_matrix",                      ACT_WORLDVIEWPROJ_MATRIX)
    , ("inverse_worldviewproj_matrix",              ACT_INVERSE_WORLDVIEWPROJ_MATRIX)
    , ("transpose_worldviewproj_matrix",            ACT_TRANSPOSE_WORLDVIEWPROJ_MATRIX)
    , ("inverse_transpose_worldviewproj_matrix",    ACT_INVERSE_TRANSPOSE_WORLDVIEWPROJ_MATRIX)
    , ("texture_matrix",                            ACT_TEXTURE_MATRIX)
    , ("render_target_flipping",                    ACT_RENDER_TARGET_FLIPPING)
    , ("light_diffuse_colour",                      ACT_LIGHT_DIFFUSE_COLOUR)
    , ("light_specular_colour",                     ACT_LIGHT_SPECULAR_COLOUR)
    , ("light_attenuation",                         ACT_LIGHT_ATTENUATION)
    , ("spotlight_params",                          ACT_SPOTLIGHT_PARAMS)
    , ("light_position",                            ACT_LIGHT_POSITION)
    , ("light_direction",                           ACT_LIGHT_DIRECTION)
    , ("light_position_object_space",               ACT_LIGHT_POSITION_OBJECT_SPACE)
    , ("light_direction_object_space",              ACT_LIGHT_DIRECTION_OBJECT_SPACE)
    , ("light_distance_object_space",               ACT_LIGHT_DISTANCE_OBJECT_SPACE)
    , ("light_position_view_space",                 ACT_LIGHT_POSITION_VIEW_SPACE)
    , ("light_direction_view_space",                ACT_LIGHT_DIRECTION_VIEW_SPACE)
    , ("light_power",                               )
    , ("light_diffuse_colour_power_scaled",         )
    , ("light_specular_colour_power_scaled",        )
    , ("light_number",                              ACT_LIGHT_NUMBER)
    , ("light_diffuse_colour_array",                ACT_LIGHT_DIFFUSE_COLOUR_ARRAY)
    , ("light_specular_colour_array",               ACT_LIGHT_SPECULAR_COLOUR_ARRAY)
    , ("light_diffuse_colour_power_scaled_array",   ACT_LIGHT_DIFFUSE_COLOUR_POWER_SCALED_ARRAY)
    , ("light_specular_colour_power_scaled_array",  ACT_LIGHT_SPECULAR_COLOUR_POWER_SCALED_ARRAY)
    , ("light_attenuation_array",                   ACT_LIGHT_ATTENUATION_ARRAY)
    , ("spotlight_params_array",                    ACT_SPOTLIGHT_PARAMS_ARRAY)
    , ("light_position_array",                      ACT_LIGHT_POSITION_ARRAY)
    , ("light_direction_array",                     ACT_LIGHT_DIRECTION_ARRAY)
    , ("light_position_object_space_array",         ACT_LIGHT_POSITION_OBJECT_SPACE_ARRAY)
    , ("light_direction_object_space_array",        ACT_LIGHT_DIRECTION_OBJECT_SPACE_ARRAY)
    , ("light_distance_object_space_array",         ACT_LIGHT_DISTANCE_OBJECT_SPACE_ARRAY)
    , ("light_position_view_space_array",           ACT_LIGHT_POSITION_VIEW_SPACE_ARRAY)
    , ("light_direction_view_space_array",          ACT_LIGHT_DIRECTION_VIEW_SPACE_ARRAY)
    , ("light_power_array",                         )
    , ("light_count",                               ACT_LIGHT_COUNT)
    , ("light_casts_shadows",                       ACT_LIGHT_CASTS_SHADOWS)
    , ("ambient_light_colour",                      ACT_AMBIENT_LIGHT_COLOUR)
    , ("surface_ambient_colour",                    ACT_SURFACE_AMBIENT_COLOUR)
    , ("surface_diffuse_colour",                    ACT_SURFACE_DIFFUSE_COLOUR)
    , ("surface_specular_colour",                   ACT_SURFACE_SPECULAR_COLOUR)
    , ("surface_emissive_colour",                   ACT_SURFACE_EMISSIVE_COLOUR)
    , ("surface_shininess",                         ACT_SURFACE_SHININESS)
    , ("derived_ambient_light_colour",              ACT_DERIVED_AMBIENT_LIGHT_COLOUR)
    , ("derived_scene_colour",                      ACT_DERIVED_SCENE_COLOUR)
    , ("derived_light_diffuse_colour",              ACT_DERIVED_LIGHT_DIFFUSE_COLOUR)
    , ("derived_light_specular_colour",             ACT_DERIVED_LIGHT_SPECULAR_COLOUR)
    , ("derived_light_diffuse_colour_array",        ACT_DERIVED_LIGHT_DIFFUSE_COLOUR_ARRAY)
    , ("derived_light_specular_colour_array",       ACT_DERIVED_LIGHT_SPECULAR_COLOUR_ARRAY)
    , ("fog_colour",                                ACT_FOG_COLOUR)
    , ("fog_params",                                ACT_FOG_PARAMS)
    , ("camera_position",                           ACT_CAMERA_POSITION)
    , ("camera_position_object_space",              ACT_CAMERA_POSITION_OBJECT_SPACE)
    , ("lod_camera_position",                       ACT_LOD_CAMERA_POSITION)
    , ("lod_camera_position_object_space",          ACT_LOD_CAMERA_POSITION_OBJECT_SPACE)
    , ("time",                                      ACT_TIME)
    , ("time_0_x",                                  ACT_TIME_0_X)
    , ("costime_0_x",                               ACT_COSTIME_0_X)
    , ("sintime_0_x",                               ACT_SINTIME_0_X)
    , ("tantime_0_x",                               ACT_TANTIME_0_X)
    , ("time_0_x_packed",                           ACT_TIME_0_X_PACKED)
    , ("time_0_1",                                  ACT_TIME_0_1)
    , ("costime_0_1",                               ACT_COSTIME_0_1)
    , ("sintime_0_1",                               ACT_SINTIME_0_1)
    , ("tantime_0_1",                               ACT_TANTIME_0_1)
    , ("time_0_1_packed",                           ACT_TIME_0_1_PACKED)
    , ("time_0_2pi",                                ACT_TIME_0_2PI)
    , ("costime_0_2pi",                             ACT_COSTIME_0_2PI)
    , ("sintime_0_2pi",                             ACT_SINTIME_0_2PI)
    , ("tantime_0_2pi",                             ACT_TANTIME_0_2PI)
    , ("time_0_2pi_packed",                         ACT_TIME_0_2PI_PACKED)
    , ("frame_time",                                ACT_FRAME_TIME)
    , ("fps",                                       ACT_FPS)
    , ("viewport_width",                            ACT_VIEWPORT_WIDTH)
    , ("viewport_height",                           ACT_VIEWPORT_HEIGHT)
    , ("inverse_viewport_width",                    ACT_INVERSE_VIEWPORT_WIDTH)
    , ("inverse_viewport_height",                   ACT_INVERSE_VIEWPORT_HEIGHT)
    , ("viewport_size",                             ACT_VIEWPORT_SIZE)
    , ("texel_offsets",                             ACT_TEXEL_OFFSETS)
    , ("view_direction",                            ACT_VIEW_DIRECTION)
    , ("view_side_vector",                          ACT_VIEW_SIDE_VECTOR)
    , ("view_up_vector",                            ACT_VIEW_UP_VECTOR)
    , ("fov",                                       ACT_FOV)
    , ("near_clip_distance",                        ACT_NEAR_CLIP_DISTANCE)
    , ("far_clip_distance",                         ACT_FAR_CLIP_DISTANCE)
    , ("texture_viewproj_matrix",                   ACT_TEXTURE_VIEWPROJ_MATRIX)
    , ("texture_viewproj_matrix_array",             ACT_TEXTURE_VIEWPROJ_MATRIX_ARRAY)
    , ("texture_worldviewproj_matrix",              ACT_TEXTURE_WORLDVIEWPROJ_MATRIX)
    , ("texture_worldviewproj_matrix_array",        ACT_TEXTURE_WORLDVIEWPROJ_MATRIX_ARRAY)
    , ("spotlight_viewproj_matrix",                 ACT_SPOTLIGHT_VIEWPROJ_MATRIX)
    , ("spotlight_worldviewproj_matrix",            ACT_SPOTLIGHT_WORLDVIEWPROJ_MATRIX)
    , ("scene_depth_range",                         ACT_SCENE_DEPTH_RANGE)
    , ("shadow_scene_depth_range",                  ACT_SHADOW_SCENE_DEPTH_RANGE)
    , ("shadow_colour",                             ACT_SHADOW_COLOUR)
    , ("shadow_extrusion_distance",                 ACT_SHADOW_EXTRUSION_DISTANCE)
    , ("texture_size",                              ACT_TEXTURE_SIZE)
    , ("inverse_texture_size",                      ACT_INVERSE_TEXTURE_SIZE)
    , ("packed_texture_size",                       ACT_PACKED_TEXTURE_SIZE)
    , ("pass_number",                               ACT_PASS_NUMBER)
    , ("pass_iteration_number",                     ACT_PASS_ITERATION_NUMBER)
    , ("animation_parametric",                      ACT_ANIMATION_PARAMETRIC)
    , ("custom ",                                   ACT_CUSTOM)
    ]
ACT_WORLD_MATRIX_ARRAY

ACT_LIGHT_POWER_SCALE
ACT_LIGHT_DIFFUSE_COLOUR_POWER_SCALED
ACT_LIGHT_SPECULAR_COLOUR_POWER_SCALED

ACT_LIGHT_POWER_SCALE_ARRAY

ACT_LIGHT_CUSTOM
-}