{-# 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 -}