public QuakeBlock(MapObject mo) { QuakeMapObject qmo; if (mo is QuakeMapObject) { qmo = mo as QuakeMapObject; } else { throw new ArgumentException("Provided MapObject isn't actually a QuakeMapObject!"); } Saveability = qmo.Saveability; foreach (MapObject child in qmo.Children) { Children.Add(new QuakeBlock(child as QuakeMapObject)); } KeyVals.Clear(); foreach (KeyValuePair <string, Option> pair in qmo.KeyVals) { KeyVals.Add(pair.Key, pair.Value); } if (qmo.Definition != null && qmo.Definition.ClassType == ClassType.Solid) { foreach (Renderable r in qmo.Renderables) { var solid = new Solid(); foreach (Polygon p in r.Polygons) { var side = new QuakeSide { Plane = new Plane(r.Vertices[p.Indices[2]], r.Vertices[p.Indices[1]], r.Vertices[p.Indices[0]], Winding.Cw), TextureName = p.IntendedTextureName, TextureBasis = new List <Vector3>() { p.BasisS, p.BasisT }, TextureOffset = p.Offset, TextureRotation = p.Rotation, TextureScale = p.Scale }; solid.Sides.Add(side); } Solids.Add(solid); } } }
private void Parse(List <string> rawBlock) { int i = 0; while (i < rawBlock.Count) { string item = rawBlock[i]; if (item.Contains(KeyValDelimiter)) { List <KeyValuePair <string, string> > rawKeyVals = ExtractKeyVals(item); string classname = rawKeyVals.Find(s => s.Key == "classname").Value; foreach (KeyValuePair <string, string> rawKeyVal in rawKeyVals) { Option newOption; if (Definitions.ContainsKey(classname) && Definitions[classname].KeyValsTemplate.ContainsKey(rawKeyVal.Key)) { newOption = new Option(Definitions[classname].KeyValsTemplate[rawKeyVal.Key]); } else { newOption = new Option(); } newOption.Value = rawKeyVal.Value; if (!KeyVals.ContainsKey(rawKeyVal.Key)) { KeyVals.Add(rawKeyVal.Key, newOption); } else { KeyVals[rawKeyVal.Key] = newOption; } } ++i; } // An open delimiter that's the first item in the raw block is just the // start of the top level block; any others indicate children. else if (item == OpenDelimiter && i != 0) { int childOpenBraceIndex = i + 1; var childBlock = new QuakeBlock(rawBlock, childOpenBraceIndex, Definitions); Children.Add(childBlock); i = childBlock.RawStartIndex + childBlock.RawLength; } else if (item.StartsWith("(", StringComparison.OrdinalIgnoreCase)) { string solid = item; int j = i + 1; while (rawBlock[j] != CloseDelimiter) { solid += rawBlock[j]; j++; } Solids.Add(new Solid(ExtractSides(solid))); i += j; } else { i++; } } }