internal static void Write(ContentWriter writer, LayerContent content)
 {
     if (content is GridLayerContent)
     {
         GridLayerContent gridLayer = content as GridLayerContent;
         writer.Write("g");
         writer.Write(gridLayer.Name);
         if (gridLayer.RectangleData != null && gridLayer.RectangleData.Count > 0)
         {
             writer.Write(gridLayer.RectangleData.Count);
             foreach (Rectangle rect in gridLayer.RectangleData)
             {
                 writer.Write(rect.X);
                 writer.Write(rect.Y);
                 writer.Write(rect.Width);
                 writer.Write(rect.Height);
             }
         }
         else if (!string.IsNullOrEmpty(gridLayer.RawData))
         {
             writer.Write(gridLayer.RawData);
         }
     }
     else if (content is TileLayerContent)
     {
         TileLayerContent tileLayer = content as TileLayerContent;
         writer.Write("t");
         writer.Write(tileLayer.Name);
         writer.Write(tileLayer.TileHeight);
         writer.Write(tileLayer.TileWidth);
         writer.Write(tileLayer.Tilesets.Count);
         if (tileLayer.Tilesets.Count > 0)
         {
             foreach (string tileset in tileLayer.Tilesets)
             {
                 writer.Write(tileset);
             }
         }
         writer.Write(tileLayer.Tiles.Count);
         if (tileLayer.Tiles.Count > 0)
         {
             foreach (TileContent tile in tileLayer.Tiles)
             {
                 writer.Write(tile.Height);
                 writer.Write(tile.Position);
                 writer.Write(tile.SourceIndex);
                 writer.Write(tile.TextureOffset);
                 writer.Write(tile.TilesetName);
                 writer.Write(tile.Width);
             }
         }
     }
     else if (content is ObjectLayerContent)
     {
         ObjectLayerContent objLayer = content as ObjectLayerContent;
         writer.Write("o");
         writer.Write(objLayer.Name);
         writer.Write(objLayer.Objects.Count);
         if (objLayer.Objects.Count > 0)
         {
             foreach (ObjectContent obj in objLayer.Objects)
             {
                 writer.Write(obj.Name);
                 writer.Write(obj.Origin);
                 writer.Write(obj.Position);
                 writer.Write(obj.Rotation);
                 writer.Write(obj.Width);
                 writer.Write(obj.Height);
                 writer.Write(obj.Source.X);
                 writer.Write(obj.Source.Y);
                 writer.Write(obj.Source.Width);
                 writer.Write(obj.Source.Height);
                 writer.Write(obj.IsTiled);
                 writer.WriteExternalReference(obj.TextureReference);
                 writer.Write(obj.Values.Count);
                 if (obj.Values.Count > 0)
                 {
                     foreach (ValueContent valueContent in obj.Values)
                     {
                         ValueContentWriter.Write(writer, valueContent);
                     }
                 }
                 writer.Write(obj.Nodes.Count);
                 if (obj.Nodes.Count > 0)
                 {
                     foreach (OgmoXNAPipelineExtensions.ContentItems.NodeContent nodeContent in obj.Nodes)
                     {
                         writer.Write(nodeContent.Position);
                     }
                 }
             }
         }
     }
 }
 public LevelContent(ProjectContent project, XmlDocument document)
 {
     this.Project = project;
     XmlNode levelNode = document["level"];
     // Level values/attributes
     foreach (ValueTemplateContent value in project.Values)
     {
         XmlNode attribute = null;
         if ((attribute = levelNode.Attributes[value.Name]) != null)
         {
             if (value is BooleanValueTemplateContent)
                 this.Values.Add(new BooleanValueContent(value.Name, bool.Parse(attribute.Value)));
             else if (value is IntegerValueTemplateContent)
                 this.Values.Add(new IntegerValueContent(value.Name, 
                     int.Parse(attribute.Value, CultureInfo.InvariantCulture)));
             else if (value is NumberValueTemplateContent)
                 this.Values.Add(new NumberValueContent(value.Name, 
                     float.Parse(attribute.Value, CultureInfo.InvariantCulture)));
             else if (value is StringValueTemplateContent)
                 this.Values.Add(new StringValueContent(value.Name, attribute.Value));
         }
     }
     // Height
     this.Height = int.Parse(levelNode.SelectSingleNode("height").InnerText, CultureInfo.InvariantCulture);
     // Width
     this.Width = int.Parse(levelNode.SelectSingleNode("width").InnerText, CultureInfo.InvariantCulture);
     // Layers
     // Here we'll construct an XPath query of all possible layer names so we can just extract the nodes all 
     // at once.
     string[] layerNames = (from x in project.LayerSettings select x.Name).ToArray<string>();
     string layerXPath = string.Join("|", layerNames);
     foreach (XmlNode layerNode in levelNode.SelectNodes(layerXPath))
     {
         // Attempt to extract the settings for this layer.
         LayerSettingsContent[] s = (from x in project.LayerSettings
                                     where x.Name.Equals(layerNode.Name)
                                     select x).ToArray<LayerSettingsContent>();
         if (!(s.Length > 0))
             continue;
         LayerSettingsContent layerSettings = s[0];
         // We have a grid layer.
         if (layerSettings is GridLayerSettingsContent)
         {
             GridLayerSettingsContent settings = layerSettings as GridLayerSettingsContent;
             GridLayerContent gridLayer = new GridLayerContent(layerNode, this, settings);
             if (gridLayer != null)
                 this.Layers.Add(gridLayer);
         }
         else if (layerSettings is TileLayerSettingsContent)
         {
             TileLayerSettingsContent settings = layerSettings as TileLayerSettingsContent;
             TileLayerContent tileLayer = new TileLayerContent(layerNode, this, settings);
             if (tileLayer != null)
                 this.Layers.Add(tileLayer);
         }
         else if (layerSettings is ObjectLayerSettingsContent)
         {
             ObjectLayerContent objectLayer = new ObjectLayerContent(layerNode, this);
             if(objectLayer != null)
                this.Layers.Add(objectLayer);
         }
     }
 }