private void Parse( string _block ) { m_states.m_unknownStates.Clear(); m_parms.m_unknownParms.Clear(); m_options.m_unknownOptions.Clear(); m_unknownVariables.Clear(); m_forbiddenParms.Clear(); m_isUsingVegetationParms = false; m_isUsingCloudParms = false; m_isUsingWaterParms = false; Parser P = new Parser( _block ); while ( P.OK ) { string token = P.ReadString(); if ( token == null ) break; // Done! if ( token.StartsWith( "//" ) ) { RecordSingleLineCommentVariable( token, P ); continue; } if ( token.StartsWith( "/*" ) ) { RecordCommentVariable( token, P ); continue; } if ( token.EndsWith( "{" ) ) { // Handle problematic parms without space before their values token = token.Substring( 0, token.Length-1 ); P.m_Index--; } P.SkipSpaces(); switch ( token.ToLower() ) { case "version": P.SkipSpaces(); m_version = P.ReadInteger(); break; case "state": m_states.Parse( P.ReadBlock() ); break; case "parms": m_parms.Parse( P.ReadBlock() ); break; case "options": ParseOptions( P.ReadBlock() ); break; // Programs case "mainprogram": m_programs.SetMainProgram( P.ReadString() ); break; case "zprepassprogram": m_programs.m_ZPrepass = P.ReadString(); break; case "shadowprogram": m_programs.m_shadow = P.ReadString(); break; // Textures // Layer 0 case "diffusemap": Layer0.m_diffuse = new Layer.Texture( P.ReadToEOL() ); break; case "bumpmap": Layer0.m_normal = new Layer.Texture( P.ReadToEOL() ); break; case "glossmap": Layer0.m_gloss = new Layer.Texture( P.ReadToEOL() ); break; case "metallicmap": Layer0.m_metal = new Layer.Texture( P.ReadToEOL() ); break; case "specularmap": Layer0.m_specular = new Layer.Texture( P.ReadToEOL() ); break; case "heightmap": m_height = new Layer.Texture( P.ReadToEOL() ); break; case "lightmap": m_lightMap = new Layer.Texture( P.ReadToEOL() ); break; case "occlusionmap": Layer0.m_AO = new Layer.Texture( P.ReadToEOL() ); break; case "translucencymap": Layer0.m_translucency = new Layer.Texture( P.ReadToEOL() ); break; case "emissivemap": Layer0.m_emissive = new Layer.Texture( P.ReadToEOL() ); break; case "layer0_maskmap": Layer0.m_mask = new Layer.Texture( P.ReadToEOL() ); break; case "layer0_scalebias": Layer0.ParseScaleBias( P ); break; case "layer0_maskscalebias":Layer0.ParseMaskScaleBias( P ); break; case "layer0_colorconstant":Layer0.m_colorConstant = P.ReadFloat4(); break; // Layer 1 case "layer1_diffusemap": Layer1.m_diffuse = new Layer.Texture( P.ReadToEOL() ); break; case "layer1_bumpmap": Layer1.m_normal = new Layer.Texture( P.ReadToEOL() ); break; case "layer1_glossmap": Layer1.m_gloss = new Layer.Texture( P.ReadToEOL() ); break; case "layer1_specularmap": Layer1.m_specular = new Layer.Texture( P.ReadToEOL() ); break; case "layer1_metallicmap": Layer1.m_metal = new Layer.Texture( P.ReadToEOL() ); break; case "layer1_maskmap": Layer1.m_mask = new Layer.Texture( P.ReadToEOL() ); break; case "layer1_emissivemap": throw new Exception( "Shouldn't be allowed!" );//P.SkipSpaces(); Layer1.m_emissive = new Layer.Texture( P.ReadToEOL() ); break; case "layer1_scalebias": Layer1.ParseScaleBias( P ); break; case "layer1_maskscalebias":Layer1.ParseMaskScaleBias( P ); break; case "layer1_colorconstant":Layer1.m_colorConstant = P.ReadFloat4(); break; // Layer 2 case "layer2_diffusemap": Layer2.m_diffuse = new Layer.Texture( P.ReadToEOL() ); break; case "layer2_bumpmap": Layer2.m_normal = new Layer.Texture( P.ReadToEOL() ); break; case "layer2_glossmap": Layer2.m_gloss = new Layer.Texture( P.ReadToEOL() ); break; case "layer2_specularmap": Layer2.m_specular = new Layer.Texture( P.ReadToEOL() ); break; case "layer2_metallicmap": Layer2.m_metal = new Layer.Texture( P.ReadToEOL() ); break; case "layer2_emissivemap": throw new Exception( "Shouldn't be allowed!" );//P.SkipSpaces(); Layer2.m_emissive = new Layer.Texture( P.ReadToEOL() ); break; case "layer2_maskmap": Layer2.m_mask = new Layer.Texture( P.ReadToEOL() ); break; case "layer2_scalebias": Layer2.ParseScaleBias( P ); break; case "layer2_maskscalebias":Layer2.ParseMaskScaleBias( P ); break; case "layer2_colorconstant":Layer2.m_colorConstant = P.ReadFloat4(); break; // Main variables case "m_physicsmaterial": m_physicsMaterial = P.ReadToEOL(); break; case "wardroughness": float4 roughness = P.ReadFloat4(); m_glossMinMax.x = roughness.x; m_glossMinMax.y = roughness.y; break; case "metallicminmax": float4 metal = P.ReadFloat4(); m_metallicMinMax.x = metal.x; m_metallicMinMax.y = metal.y; break; default: if ( CheckSafeTokens( token ) ) RecordUnknownVariable( token, P ); else RecordForbiddenVariable( token, P ); break; } } }
public void Read( BinaryReader R ) { m_sourceFileName = new FileInfo( R.ReadString() ); m_name = R.ReadString(); m_version = R.ReadInt32(); m_programs.Read( R ); m_parms.Read( R ); m_states.Read( R ); m_options.Read( R ); m_layers.Clear(); int layersCount = R.ReadInt32(); for ( int layerIndex=0; layerIndex < layersCount; layerIndex++ ) { m_layers.Add( new Layer( this, layerIndex, R ) ); } m_height = R.ReadBoolean() ? new Layer.Texture( R ) : null; m_lightMap = R.ReadBoolean() ? new Layer.Texture( R ) : null; m_physicsMaterial = R.ReadString(); if ( m_physicsMaterial == "" ) m_physicsMaterial = null; m_glossMinMax.x = R.ReadSingle(); m_glossMinMax.y = R.ReadSingle(); m_metallicMinMax.x = R.ReadSingle(); m_metallicMinMax.y = R.ReadSingle(); m_isUsingVegetationParms = R.ReadBoolean(); m_isUsingCloudParms = R.ReadBoolean(); m_isUsingWaterParms = R.ReadBoolean(); // Read unknown strings that should be restored as-is ReadListOfStrings( R, m_unknownVariables ); ReadListOfStrings( R, m_forbiddenParms ); // Read errors and warnings m_errorLevel = (ERROR_LEVEL) R.ReadInt32(); m_errors = R.ReadString(); if ( m_errors == string.Empty ) m_errors = null; m_warnings = R.ReadString(); if ( m_warnings == string.Empty ) m_warnings = null; }