public OgmoLayer(string name, OgmoLayerType layerType, Vector2 offset, Size cellSize, int rowCount, int columnCount) { Name = name; LayerType = layerType; Offset = offset; CellSize = cellSize; RowCount = rowCount; ColumnCount = columnCount; }
protected override void Write(ContentWriter output, OgmoProcessorResult value) { // write the number of layer definitions output.Write(value.Project.Layers.Length); // Write each layer definition in sequence for (int i = 0; i < value.Project.Layers.Length; i++) { // Write the layer type output.Write(value.Project.Layers[i].LayerType.ToString()); // Write the layer name output.Write(value.Project.Layers[i].Name); } // Write the number of tilesets output.Write(value.Project.Tilesets.Length); // Write each tileset in sequence for (int tileSetIndex = 0; tileSetIndex < value.Project.Tilesets.Length; tileSetIndex++) { // Write the name of the tileset output.Write(value.Project.Tilesets[tileSetIndex].Label); // Write the image data for the tileset output.Write(value.Project.Tilesets[tileSetIndex].Image); // Write the width of each tile in the tileset output.Write(value.Project.Tilesets[tileSetIndex].TileWidth); // Write the height of each tile in the tileset output.Write(value.Project.Tilesets[tileSetIndex].TileHeight); // Write the x seperation of each tile in the tileset output.Write(value.Project.Tilesets[tileSetIndex].TileSeperationX); // Write the y seperation of each tile in the tileset output.Write(value.Project.Tilesets[tileSetIndex].TileSeperationY); } // Write the number of levels output.Write(value.Levels.Length); // Write each level in sequence for (int levelIndex = 0; levelIndex < value.Levels.Length; levelIndex++) { // Write the level name output.Write(value.Levels[levelIndex].Name); // Write the level width output.Write(value.Levels[levelIndex].Width); // Write the level Height output.Write(value.Levels[levelIndex].Height); // Write the level x-offset output.Write(value.Levels[levelIndex].OffsetX); // Write the level y-offset output.Write(value.Levels[levelIndex].OffsetY); // Write the total number of layers output.Write(value.Levels[levelIndex].Layers.Length); // Write each layer in the level in sequence for (int layerindex = 0; layerindex < value.Levels[levelIndex].Layers.Length; layerindex++) { // Get refernece to the layer to make writing code eaiser lol OgmoLayer layer = value.Levels[levelIndex].Layers[layerindex]; // Get the type of layer from the layer lookup dictionary OgmoLayerType layerType = value.LayerTypeLookup[layer.Name]; // Write the type of layer output.Write((int)layerType); // Write the name of the layer output.Write(layer.Name); // Write the x-offset of the layer output.Write(layer.OffsetX); // Write the y-offset of the layer output.Write(layer.OffsetY); // Write the grid cell width for the layer output.Write(layer.GridCellWidth); // Write the grid cell height for the layer output.Write(layer.GridCellHeight); // Write the total number of columns in the layer output.Write(layer.GridCellsX); // Write the total number of rows in the layer output.Write(layer.GridCellsY); // Write the layer type specific properties if (layerType == OgmoLayerType.Tile) { // Write the name of the tileset used by this layer output.Write(layer.Tileset); // Write the total number of elements in the layer data output.Write(layer.Data.Length); // Write each element of the layer data for (int dataIndex = 0; dataIndex < layer.Data.Length; dataIndex++) { output.Write(layer.Data[dataIndex]); } // Write the export mode output.Write(layer.ExportMode); // Writ the array mode output.Write(layer.ArrayMode); } } } }
protected override OgmoProject Read(ContentReader input, OgmoProject existinInstance) { // Initialize a new project instance. OgmoProject project = new OgmoProject(); // Read the total number of layer definitions int layerTypeCount = input.ReadInt32(); // Read each of the layer definitions for (int i = 0; i < layerTypeCount; i++) { // Read the string for what type of layer this is string layerTypeName = input.ReadString(); // Read the string for the name of the layer string layerName = input.ReadString(); // Convert the string for the type of layer into the enum OgmoLayerType layerType; if (layerTypeName.Equals("tile", StringComparison.InvariantCultureIgnoreCase)) { layerType = OgmoLayerType.Tile; } else if (layerTypeName.Equals("grid", StringComparison.InvariantCultureIgnoreCase)) { layerType = OgmoLayerType.Grid; } else if (layerTypeName.Equals("decal", StringComparison.InvariantCultureIgnoreCase)) { layerType = OgmoLayerType.Decal; } else if (layerTypeName.Equals("entity", StringComparison.InvariantCultureIgnoreCase)) { layerType = OgmoLayerType.Entity; } else { throw new Exception($"Unknown layer type: '{layerTypeName}'"); } // Add the layer definition to the lookup dictionary of the project project.LayerTypeLookup.Add(layerName, layerType); } // Read the total number of tilesets that need to be processed int tilesetCount = input.ReadInt32(); // Process each tileset for (int tileSetIndex = 0; tileSetIndex < tilesetCount; tileSetIndex++) { // Read the name of the tileset string tilesetName = input.ReadString(); // Read the image data of the tileset string tileSetImageData = input.ReadString(); // Read the size of the tiles in the tileset. Read order is width then height Size tilesetTileSize = new Size { Width = input.ReadInt32(), Height = input.ReadInt32() }; // Read the tileseperation values for the tileset. Read order is x then y. Point tilesetTileSeperation = new Point { X = input.ReadInt32(), Y = input.ReadInt32() }; // Create a new Texture2D from the image data Texture2D texture; byte[] imageData = Convert.FromBase64String(tileSetImageData); using (var stream = new MemoryStream(imageData)) { texture = Texture2D.FromStream(Engine.Graphics.Device, stream); } // Create the tileset instance OgmoTileset tileSet = new OgmoTileset(tilesetName, new VirtualTexture2D(texture), tilesetTileSize, tilesetTileSeperation); // Add the tileset to the project project.AddTileset(tileSet); } // Read the total number of levels that need to be processed int levelCount = input.ReadInt32(); // Process each level and add them to the project for (int i = 0; i < levelCount; i++) { // Read the name of the level string levelName = input.ReadString(); // Read the level size. Order of read is width then height Size levelSize = new Size() { Width = input.ReadInt32(), Height = input.ReadInt32() }; // Read the level offset. Order of read is x then y Vector2 levelOffset = new Vector2 { X = input.ReadInt32(), Y = input.ReadInt32() }; // Create a new level instance. OgmoLevel level = new OgmoLevel(levelName, levelSize, levelOffset); // Read the total number of layers for this level int layerCount = input.ReadInt32(); // Read each layer and add it to the level for (int layerIndex = 0; layerIndex < layerCount; layerIndex++) { // Read the type of layer. The value is an int and needs to be converted to enum OgmoLayerType layerType = (OgmoLayerType)input.ReadInt32(); // Read the name of the layer string layerName = input.ReadString(); // Read the x and y offset of the layer. Order of read is x and then y Vector2 layerOffset = new Vector2 { X = input.ReadInt32(), Y = input.ReadInt32() }; // Read the size of the grid cells. Order of read is width and then height Size layerCellSize = new Size { Width = input.ReadInt32(), Height = input.ReadInt32() }; // Read the column count for the layer int layerColumnCount = input.ReadInt32(); // Read the row count for the layer int layerRowCount = input.ReadInt32(); // The next values that are read are dependent on the type of layer that is being processed // in at this moment. if (layerType == OgmoLayerType.Tile) { // Read the name of the tileset used for this layer string tilesetName = input.ReadString(); // Read the total number of elements in the data array int dataLength = input.ReadInt32(); // Read each of the data elements int[] data = new int[dataLength]; for (int dataIndex = 0; dataIndex < dataLength; dataIndex++) { data[dataIndex] = input.ReadInt32(); } // Read the export mode used int exportMode = input.ReadInt32(); // Read the array mode used int arrayMode = input.ReadInt32(); // Create a new OgmoTileLayer instance OgmoTileLayer tileLayer = new OgmoTileLayer(layerName, layerOffset, layerCellSize, layerRowCount, layerColumnCount, project.GetTileset(tilesetName), data); // Add the layer to the level level.AddLayer(tileLayer); } else if (layerType == OgmoLayerType.Grid) { OgmoGridLayer gridLayer = new OgmoGridLayer(layerName, layerOffset, layerCellSize, layerRowCount, layerColumnCount); level.AddLayer(gridLayer); } else if (layerType == OgmoLayerType.Decal) { OgmoDecalLayer gridLayer = new OgmoDecalLayer(layerName, layerOffset, layerCellSize, layerRowCount, layerColumnCount); level.AddLayer(gridLayer); } else if (layerType == OgmoLayerType.Entity) { OgmoEntityLayer gridLayer = new OgmoEntityLayer(layerName, layerOffset, layerCellSize, layerRowCount, layerColumnCount); level.AddLayer(gridLayer); } else { throw new Exception($"Unsupported layer type: '{layerType.ToString()}'"); } } // Add the level to the project project.AddLevel(level); } // Return the project return(project); }