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