示例#1
0
        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);
                }
            }
        }
示例#2
0
        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++;
                }
            }
        }