public void Load(string path) { var emittersBySystem = new Dictionary <string, PartSysSpec>(); using (var file = new FileStream(path, FileMode.Open)) { var reader = new StreamReader(file, Encoding.ASCII); // Slurp in all lines, do a preliminary sorting by particle system name string line; while ((line = reader.ReadLine()) != null) { var firstTab = line.IndexOf('\t'); if (firstTab == -1) { continue; // Not a valid line } var systemName = line.Substring(0, firstTab); if (systemName.Length == 0) { continue; // Also probably not a valid line } // Trim it by removing the vertical tab at the end systemName = systemName.Replace("\v", ""); var key = systemName.ToLowerInvariant(); if (!emittersBySystem.ContainsKey(key)) { emittersBySystem[key] = new PartSysSpec { Name = systemName }; } emittersBySystem[key].Emitters.Add(EmitterSpec.Parse(line)); } } // Sort by name ascending var list = emittersBySystem.Values.ToList(); list.Sort(); Specs = new ObservableCollection <PartSysSpec>(list); }
public static EmitterSpec Parse(string line) { var result = new EmitterSpec(); var cols = line.Split('\t'); // Sanitize line parts (vertical tabs, spaces) for (var i = 0; i < cols.Length; ++i) { cols[i] = cols[i].Trim(' ', '\v'); } result.Name = cols[ColEmitterName]; result.ParticlesPerSec = float.Parse(cols[ColParticleRate], CultureInfo.InvariantCulture); result.ParticleType = ParticleTypeHelper.Parse(cols[ColParticleType]); if (cols[ColLifespan].Equals("perm", StringComparison.InvariantCultureIgnoreCase)) { result.Permanent = true; } else { result.LifespanSecs = float.Parse(cols[ColLifespan]); } if (cols[ColPartLifespan].Equals("perm", StringComparison.InvariantCultureIgnoreCase)) { result.ParticlesPermanent = true; } else { float floatVal; if (float.TryParse(cols[ColPartLifespan], out floatVal)) { result.ParticleLifespan = floatVal; } } result.Material = cols[ColMaterial]; result.Space = EmitterSpaceHelper.ParseString(cols[ColEmitterSpace]); result.NodeName = cols[ColEmitterNodeName]; result.CoordSys = CoordSysHelper.ParseString(cols[ColEmitterCoordSys]); result.OffsetCoordSys = CoordSysHelper.ParseString(cols[ColEmitterOffsetCoordSys]); result.ParticleSpace = ParticleSpaceHelper.ParseString(cols[ColParticleSpace]); result.ParticlePosCoordSys = CoordSysHelper.ParseString(cols[ColParticlePosCoordSys]); result.ParticleVelocityCoordSys = CoordSysHelper.ParseString(cols[ColParticleVelocityCoordSys]); result.BlendMode = BlendModeHelper.ParseString(cols[ColBlendMode]); result.Model = cols[ColModel]; float bbVal; if (float.TryParse(cols[ColBbLeft], out bbVal)) { result.BoundingBoxLeft = bbVal; } if (float.TryParse(cols[ColBbTop], out bbVal)) { result.BoundingBoxTop = bbVal; } if (float.TryParse(cols[ColBbRight], out bbVal)) { result.BoundingBoxRight = bbVal; } if (float.TryParse(cols[ColBbBottom], out bbVal)) { result.BoundingBoxBottom = bbVal; } int minActiveParts; if (int.TryParse(cols[ColMinParticles], out minActiveParts)) { result.MinActiveParticles = minActiveParts; } // Parse the variable parameters foreach (ParamId paramId in Enum.GetValues(typeof (ParamId))) { var col = ColFirstParam + (int) paramId; var param = new VariableParamSpec { Id = paramId, Value = cols[col] }; if (!string.IsNullOrWhiteSpace(param.Value)) { result.Params.Add(param); } } return result; }
public static EmitterSpec Parse(string line) { var result = new EmitterSpec(); var cols = line.Split('\t'); // Sanitize line parts (vertical tabs, spaces) for (var i = 0; i < cols.Length; ++i) { cols[i] = cols[i].Trim(' ', '\v'); } result.Name = cols[ColEmitterName]; result.ParticlesPerSec = float.Parse(cols[ColParticleRate], CultureInfo.InvariantCulture); result.ParticleType = ParticleTypeHelper.Parse(cols[ColParticleType]); if (cols[ColLifespan].Equals("perm", StringComparison.InvariantCultureIgnoreCase)) { result.Permanent = true; } else { result.LifespanSecs = float.Parse(cols[ColLifespan]); } if (cols[ColPartLifespan].Equals("perm", StringComparison.InvariantCultureIgnoreCase)) { result.ParticlesPermanent = true; } else { float floatVal; if (float.TryParse(cols[ColPartLifespan], out floatVal)) { result.ParticleLifespan = floatVal; } } result.Material = cols[ColMaterial]; result.Space = EmitterSpaceHelper.ParseString(cols[ColEmitterSpace]); result.NodeName = cols[ColEmitterNodeName]; result.CoordSys = CoordSysHelper.ParseString(cols[ColEmitterCoordSys]); result.OffsetCoordSys = CoordSysHelper.ParseString(cols[ColEmitterOffsetCoordSys]); result.ParticleSpace = ParticleSpaceHelper.ParseString(cols[ColParticleSpace]); result.ParticlePosCoordSys = CoordSysHelper.ParseString(cols[ColParticlePosCoordSys]); result.ParticleVelocityCoordSys = CoordSysHelper.ParseString(cols[ColParticleVelocityCoordSys]); result.BlendMode = BlendModeHelper.ParseString(cols[ColBlendMode]); result.Model = cols[ColModel]; float bbVal; if (float.TryParse(cols[ColBbLeft], out bbVal)) { result.BoundingBoxLeft = bbVal; } if (float.TryParse(cols[ColBbTop], out bbVal)) { result.BoundingBoxTop = bbVal; } if (float.TryParse(cols[ColBbRight], out bbVal)) { result.BoundingBoxRight = bbVal; } if (float.TryParse(cols[ColBbBottom], out bbVal)) { result.BoundingBoxBottom = bbVal; } int minActiveParts; if (int.TryParse(cols[ColMinParticles], out minActiveParts)) { result.MinActiveParticles = minActiveParts; } // Parse the variable parameters foreach (ParamId paramId in Enum.GetValues(typeof(ParamId))) { var col = ColFirstParam + (int)paramId; var param = new VariableParamSpec { Id = paramId, Value = cols[col] }; if (!string.IsNullOrWhiteSpace(param.Value)) { result.Params.Add(param); } } return(result); }