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
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)
]
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)
]