private void ParseOptions( string _options )
{
try {
Parser P = new Parser( _options );
while ( P.OK ) {
string token = P.ReadString();
if ( token == null )
break; // Done!
if ( token.StartsWith( "//" ) ) {
RecordSingleLineCommentOption( token, P );
continue;
}
if ( token.StartsWith( "/*" ) ) {
RecordCommentOption( token, P );
continue;
}
P.SkipSpaces();
if ( !P.IsNumeric() )
continue; // Ill-formed option?
int value = P.ReadInteger();
switch ( token.ToLower() ) {
case "glossindiffusealpha": m_options.m_glossInDiffuseAlpha = value != 0; break;
case "alphatest": m_options.m_isAlphaTest = value != 0; break;
case "ismasking": m_options.m_isMasking = value != 0; break;
case "hasbumpmap": m_options.m_hasNormal = value != 0; break;
case "hasspecularmap": m_options.m_hasSpecular = value != 0; break;
case "hasocclusionmap": m_options.m_hasOcclusionMap = value != 0; break;
case "hasglossmap": m_options.m_hasGloss = value != 0; break;
case "hasmetallicmap": m_options.m_hasMetal = value != 0; break;
case "hasemissivemap": m_options.m_hasEmissive = value != 0; break;
case "translucency/enable": m_options.m_translucencyEnabled = value != 0; break;
case "translucencyusevertexcolor": m_options.m_translucencyUseVertexColor = value != 0; break;
case "extralayer":
switch ( value ) {
case 0: Layer0.m_mask = null; m_options.m_extraLayers = 0; break;
case 1: Layer1.m_mask = null; m_options.m_extraLayers = 1; break;
case 2: Layer2.m_mask = null; m_options.m_extraLayers = 2; break;
default: throw new Exception( "Unsupported amount of extra layers!" );
}
break;
// LAYER 0
case "use_layer0_colorconstant": Layer0.m_useColorConstant = value != 0; break;
case "layer0_uvset":
switch ( value ) {
case 0: Layer0.m_UVSet = Layer.UV_SET.UV0; break;
case 1: Layer0.m_UVSet = Layer.UV_SET.UV1; break;
default: throw new Exception( "Unsupported UV set!" );
}
break;
case "layer0_mask_uvset":
switch ( value ) {
case 0: Layer0.m_maskUVSet = Layer.UV_SET.UV0; break;
case 1: Layer0.m_maskUVSet = Layer.UV_SET.UV1; break;
default: throw new Exception( "Unsupported UV set!" );
}
break;
case "layer0_maskmode":
switch ( value ) {
case 0: Layer0.m_maskingMode = Layer.MASKING_MODE.VERTEX_COLOR; break;
case 1: Layer0.m_maskingMode = Layer.MASKING_MODE.MASK_MAP; break;
case 2: Layer0.m_maskingMode = Layer.MASKING_MODE.MASK_MAP_AND_VERTEX_COLOR; break;
default: throw new Exception( "Unsupported UV set!" );
}
break;
// LAYER 1
case "use_layer1_colorconstant": Layer1.m_useColorConstant = value != 0; break;
case "layer1_uvset":
switch ( value ) {
case 0: Layer1.m_UVSet = Layer.UV_SET.UV0; break;
case 1: Layer1.m_UVSet = Layer.UV_SET.UV1; break;
default: throw new Exception( "Unsupported UV set!" );
}
break;
case "layer1_mask_uvset":
switch ( value ) {
case 0: Layer1.m_maskUVSet = Layer.UV_SET.UV0; break;
case 1: Layer1.m_maskUVSet = Layer.UV_SET.UV1; break;
default: throw new Exception( "Unsupported UV set!" );
}
break;
case "layer1_maskmode":
switch ( value ) {
case 0: Layer1.m_maskingMode = Layer.MASKING_MODE.VERTEX_COLOR; break;
case 1: Layer1.m_maskingMode = Layer.MASKING_MODE.MASK_MAP; break;
case 2: Layer1.m_maskingMode = Layer.MASKING_MODE.MASK_MAP_AND_VERTEX_COLOR; break;
default: throw new Exception( "Unsupported UV set!" );
}
break;
case "layer1_diffusereuselayer":
switch ( value ) {
case 0: Layer1.m_diffuseReUse = Layer.REUSE_MODE.DONT_REUSE; break;
case 1: Layer1.m_diffuseReUse = Layer.REUSE_MODE.REUSE_LAYER0; break;
default: throw new Exception( "Unsupported re-use mode!" );
}
break;
case "layer1_bumpreuselayer":
switch ( value ) {
case 0: Layer1.m_normalReUse = Layer.REUSE_MODE.DONT_REUSE; break;
case 1: Layer1.m_normalReUse = Layer.REUSE_MODE.REUSE_LAYER0; break;
default: throw new Exception( "Unsupported re-use mode!" );
}
break;
case "layer1_glossreuselayer":
switch ( value ) {
case 0: Layer1.m_glossReUse = Layer.REUSE_MODE.DONT_REUSE; break;
case 1: Layer1.m_glossReUse = Layer.REUSE_MODE.REUSE_LAYER0; break;
default: throw new Exception( "Unsupported re-use mode!" );
}
break;
case "layer1_specularreuselayer":
switch ( value ) {
case 0: Layer1.m_specularReUse = Layer.REUSE_MODE.DONT_REUSE; break;
case 1: Layer1.m_specularReUse = Layer.REUSE_MODE.REUSE_LAYER0; break;
default: throw new Exception( "Unsupported re-use mode!" );
}
break;
case "layer1_metallicreuselayer":
switch ( value ) {
case 0: Layer1.m_metalReUse = Layer.REUSE_MODE.DONT_REUSE; break;
case 1: Layer1.m_metalReUse = Layer.REUSE_MODE.REUSE_LAYER0; break;
default: throw new Exception( "Unsupported re-use mode!" );
}
break;
case "layer1_maskreuselayer":
switch ( value ) {
case 0: Layer1.m_maskReUse = Layer.REUSE_MODE.DONT_REUSE; break;
case 1: Layer1.m_maskReUse = Layer.REUSE_MODE.REUSE_LAYER0; break;
default: throw new Exception( "Unsupported re-use mode!" );
}
break;
// LAYER 2
case "use_layer2_colorconstant": Layer2.m_useColorConstant = value != 0; break;
case "layer2_uvset":
switch ( value ) {
case 0: Layer2.m_UVSet = Layer.UV_SET.UV0; break;
case 1: Layer2.m_UVSet = Layer.UV_SET.UV1; break;
default: throw new Exception( "Unsupported UV set!" );
}
break;
case "layer2_mask_uvset":
switch ( value ) {
case 0: Layer2.m_maskUVSet = Layer.UV_SET.UV0; break;
case 1: Layer2.m_maskUVSet = Layer.UV_SET.UV1; break;
default: throw new Exception( "Unsupported UV set!" );
}
break;
case "layer2_maskmode":
switch ( value ) {
case 0: Layer2.m_maskingMode = Layer.MASKING_MODE.VERTEX_COLOR; break;
case 1: Layer2.m_maskingMode = Layer.MASKING_MODE.MASK_MAP; break;
case 2: Layer2.m_maskingMode = Layer.MASKING_MODE.MASK_MAP_AND_VERTEX_COLOR; break;
default: throw new Exception( "Unsupported UV set!" );
}
break;
case "layer2_diffusereuselayer":
switch ( value ) {
case 0: Layer2.m_diffuseReUse = Layer.REUSE_MODE.DONT_REUSE; break;
case 1: Layer2.m_diffuseReUse = Layer.REUSE_MODE.REUSE_LAYER0; break;
case 2: Layer2.m_diffuseReUse = Layer.REUSE_MODE.REUSE_LAYER1; break;
default: throw new Exception( "Unsupported re-use mode!" );
}
break;
case "layer2_bumpreuselayer":
switch ( value ) {
case 0: Layer2.m_normalReUse = Layer.REUSE_MODE.DONT_REUSE; break;
case 1: Layer2.m_normalReUse = Layer.REUSE_MODE.REUSE_LAYER0; break;
case 2: Layer2.m_normalReUse = Layer.REUSE_MODE.REUSE_LAYER1; break;
default: throw new Exception( "Unsupported re-use mode!" );
}
break;
case "layer2_glossreuselayer":
switch ( value ) {
case 0: Layer2.m_glossReUse = Layer.REUSE_MODE.DONT_REUSE; break;
case 1: Layer2.m_glossReUse = Layer.REUSE_MODE.REUSE_LAYER0; break;
case 2: Layer2.m_glossReUse = Layer.REUSE_MODE.REUSE_LAYER1; break;
default: throw new Exception( "Unsupported re-use mode!" );
}
break;
case "layer2_specularreuselayer":
switch ( value ) {
case 0: Layer2.m_specularReUse = Layer.REUSE_MODE.DONT_REUSE; break;
case 1: Layer2.m_specularReUse = Layer.REUSE_MODE.REUSE_LAYER0; break;
case 2: Layer2.m_specularReUse = Layer.REUSE_MODE.REUSE_LAYER1; break;
default: throw new Exception( "Unsupported re-use mode!" );
}
break;
case "layer2_metallicreuselayer":
switch ( value ) {
case 0: Layer2.m_metalReUse = Layer.REUSE_MODE.DONT_REUSE; break;
case 1: Layer2.m_metalReUse = Layer.REUSE_MODE.REUSE_LAYER0; break;
case 2: Layer2.m_metalReUse = Layer.REUSE_MODE.REUSE_LAYER1; break;
default: throw new Exception( "Unsupported re-use mode!" );
}
break;
case "layer2_maskreuselayer":
switch ( value ) {
case 0: Layer2.m_maskReUse = Layer.REUSE_MODE.DONT_REUSE; break;
case 1: Layer2.m_maskReUse = Layer.REUSE_MODE.REUSE_LAYER0; break;
case 2: Layer2.m_maskReUse = Layer.REUSE_MODE.REUSE_LAYER1; break;
default: throw new Exception( "Unsupported re-use mode!" );
}
break;
default:
CheckSafeOptionsTokens( token, value );
RecordUnknownOption( token, value, P );
break;
}
}
} catch ( Exception _e ) {
throw new Exception( "Failed parsing options block!", _e );
}
}