lambdacube-engine-0.2.1: Graphics/LambdaCube/Loader/ParserUtil.hs
{-# 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
-}