{-# LANGUAGE FlexibleContexts #-} module Graphics.LambdaCube.Loader.ParserUtil where -- import the the library functions from uulib import UU.Parsing import UU.Scanner import Data.Maybe import Graphics.LambdaCube.Types import Graphics.LambdaCube.Common import Graphics.LambdaCube.BlendMode import Graphics.LambdaCube.PixelFormat import Graphics.LambdaCube.RenderSystem import Graphics.LambdaCube.Technique import Graphics.LambdaCube.Pass import Graphics.LambdaCube.Light import Graphics.LambdaCube.TextureUnitState import Graphics.LambdaCube.Texture import Graphics.LambdaCube.Compositor {- parseFile pFunc tokenize file txt = let res = parseTokens pFunc (tokenize file txt) in case res of Left errs -> do mapM_ putStrLn errs return Nothing Right tree -> return (Just tree) type TokenParser a = Parser Token a parseTokens :: TokenParser a -> [Token] -> Either [String] a parseTokens p tks = if null msgs then final `seq` Right v else Left (map show msgs) where steps = parse p tks msgs = getMsgs steps (Pair v final) = evalSteps steps -} -- * Utility parser combinators infixl 4 <$=, <*= x <$= s = x <$ pKey s 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 {- -- | Parses using any of the parsers in the list 'l'. -- -- Warning: 'l' may not be an empty list. pAny :: (IsParser p s) =>(a -> p a1) -> [a] -> p a1 pAny f l = if null l then usererror "pAny: argument may not be empty list" else foldr1 (<|>) (map f l) -- | Parses any of the symbols in 'l'. pAnySym :: (IsParser p s) =>[s] -> p s pAnySym l = pAny pSym l -- used to be called pAnySym pToks :: (IsParser p s) => [s] -> p [s] pToks [] = pSucceed [] pToks (a:as) = (:) <$> pSym a <*> pToks as -} -- pEnum :: (IsParser p s) => [(s, t)] -> p t -- pEnum v = pAny (\(a,b) -> pToks a *> pSucceed b) v pEnum :: (IsParser p Token) => [(String, t)] -> p t pEnum v = pAny (\(a,b) -> pKey a *> pSucceed b) v {- pEnum v = readVal v <$> pVarid where readVal l x = head [y | (x2,y) <- l, x == x2] -} pColour a = Left <$> pRGB a <|> Left <$> pRGBA <|> Right () <$= "vertex_colour" pFloat3 = (,,) <$> pFloat <*> pFloat <*> pFloat pFloat4 = (,,,) <$> pFloat <*> pFloat <*> pFloat <*> pFloat pRGBOrRGBA a = pRGBA <|> pRGB a pRGBA :: AnaParser [Token] Pair Token (Maybe Token) (FloatType, FloatType, FloatType, FloatType) pRGBA = pFloat4 pRGB a = (,,,) <$> pFloat <*> pFloat <*> pFloat <*> pSucceed a def dv l = if null l then dv else head l -- * boolVals = [ ("true", True) , ("false", False) ] onoffVals = [ ("on", True) , ("off", False) ] ruleopVals = [ ("include",INCLUDE) , ("exclude",EXCLUDE) ] 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 = [ ("flat", SO_FLAT) , ("gouraud", SO_GOURAUD) , ("phong", SO_PHONG) ] polymodeVals = [ ("points", PM_POINTS) , ("wireframe", PM_WIREFRAME) , ("solid", PM_SOLID) ] blendopVals = [ ("add", SBO_ADD) , ("subtract", SBO_SUBTRACT) , ("reverse_subtract", SBO_REVERSE_SUBTRACT) , ("min", SBO_MIN) , ("max", SBO_MAX) ] 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 = [ ("add", SBT_ADD) , ("modulate", SBT_MODULATE) , ("colour_blend", SBT_TRANSPARENT_COLOUR) , ("alpha_blend", SBT_TRANSPARENT_ALPHA) ] illumstageVals = [ ("ambient", IS_AMBIENT) , ("per_light", IS_PER_LIGHT) , ("decal", IS_DECAL) ] cullhwVals = [ ("clockwise", CULL_CLOCKWISE) , ("anticlockwise", CULL_ANTICLOCKWISE) , ("none", CULL_NONE) ] cullswVals = [ ("back", MANUAL_CULL_BACK) , ("front", MANUAL_CULL_FRONT) , ("none", MANUAL_CULL_NONE) ] lighttypeVals = [ ("point", LT_POINT) , ("directional", LT_DIRECTIONAL) , ("spot", LT_SPOTLIGHT) ] copVals = [ ("replace", LBO_REPLACE) , ("add", LBO_ADD) , ("modulate", LBO_MODULATE) , ("alpha_blend", LBO_ALPHA_BLEND) ] btyVals = [ ("vertex", BT_VERTEX) , ("fragment", BT_FRAGMENT) ] ctyVals = [ ("named", CONTENT_NAMED) , ("shadow", CONTENT_SHADOW) ] 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 = [ ("1d", TEX_TYPE_1D) , ("2d", TEX_TYPE_2D) , ("3d", TEX_TYPE_3D) , ("cubic", TEX_TYPE_CUBE_MAP) ] texaddressVals = [ ("wrap", TAM_WRAP) , ("clamp", TAM_CLAMP) , ("mirror", TAM_MIRROR) , ("border", TAM_BORDER) ] 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 = [ ("none", FO_NONE) , ("point", FO_POINT) , ("linear", FO_LINEAR) , ("anisotropic", FO_ANISOTROPIC) ] envmapVals = [ ("off", Nothing) , ("spherical", Just ENV_CURVED) , ("planar", Just ENV_PLANAR) , ("cubic_reflection", Just ENV_REFLECTION) , ("cubic_normal", Just ENV_NORMAL) ] 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 = [ ("sine", WFT_SINE) , ("triangle", WFT_TRIANGLE) , ("square", WFT_SQUARE) , ("sawtooth", WFT_SAWTOOTH) , ("inverse_sawtooth", WFT_INVERSE_SAWTOOTH) -- , ("",WFT_PWM) ] 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 = [ ("none", FOG_NONE) , ("linear", FOG_LINEAR) , ("exp", FOG_EXP) , ("exp2", FOG_EXP2) ] 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 = [ ("src_current", LBS_CURRENT) , ("src_texture", LBS_TEXTURE) , ("src_diffuse", LBS_DIFFUSE) , ("src_specular", LBS_SPECULAR) , ("src_manual", LBS_MANUAL) ] inputVals = [ ("none", IM_NONE) , ("previous", IM_PREVIOUS) ] 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 -}