private GameTileBuffer[][][] mTileBuffers; //Array is layer, autotile frame, buffer index //Initialization public MapInstance(Guid id) : base(id) { mTileBuffers = new GameTileBuffer[Options.LayerCount][][]; for (var i = 0; i < Options.LayerCount; i++) { mTileBuffers[i] = new GameTileBuffer[3][]; //3 autotile frames } }
public override void DrawTileBuffer(GameTileBuffer buffer) { EndSpriteBatch(); mGraphicsDevice?.SetRenderTarget(mScreenshotRenderTarget); mGraphicsDevice.BlendState = mNormalState; mGraphicsDevice.RasterizerState = RasterizerState.CullCounterClockwise; mGraphicsDevice.SamplerStates[0] = SamplerState.LinearClamp; mGraphicsDevice.DepthStencilState = DepthStencilState.None; ((MonoTileBuffer)buffer).Draw(mBasicEffect, mCurrentView); }
private GameTileBuffer[][] DrawMapLayer(int layer, float xoffset = 0, float yoffset = 0) { var tileBuffers = new Dictionary <object, GameTileBuffer[]>(); for (var x = 0; x < Options.MapWidth; x++) { for (var y = 0; y < Options.MapHeight; y++) { var tile = Layers[layer].Tiles[x, y]; if (tile.TilesetTex == null) { continue; } var tilesetTex = (GameTexture)tile.TilesetTex; if (tile.X < 0 || tile.Y < 0) { continue; } if (tile.X * Options.TileWidth >= tilesetTex.GetWidth() || tile.Y * Options.TileHeight >= tilesetTex.GetHeight()) { continue; } var platformTex = tilesetTex.GetTexture(); GameTileBuffer[] buffers = null; if (tileBuffers.ContainsKey(platformTex)) { buffers = tileBuffers[platformTex]; } else { buffers = new GameTileBuffer[3]; for (var i = 0; i < 3; i++) { buffers[i] = Graphics.Renderer.CreateTileBuffer(); } tileBuffers.Add(platformTex, buffers); } switch (Autotiles.Autotile[x, y].Layer[layer].RenderState) { case MapAutotiles.RENDER_STATE_NORMAL: for (var i = 0; i < 3; i++) { var buffer = buffers[i]; if (!buffer.AddTile( tilesetTex, x * Options.TileWidth + xoffset, y * Options.TileHeight + yoffset, Layers[layer].Tiles[x, y].X * Options.TileWidth, Layers[layer].Tiles[x, y].Y * Options.TileHeight, Options.TileWidth, Options.TileHeight )) { throw new Exception("Failed to add VBO!"); } } break; case MapAutotiles.RENDER_STATE_AUTOTILE: for (var i = 0; i < 3; i++) { DrawAutoTile( layer, x * Options.TileWidth + xoffset, y * Options.TileHeight + yoffset, 1, x, y, i, tilesetTex, buffers[i] ); DrawAutoTile( layer, x * Options.TileWidth + Options.TileWidth / 2 + xoffset, y * Options.TileHeight + yoffset, 2, x, y, i, tilesetTex, buffers[i] ); DrawAutoTile( layer, x * Options.TileWidth + xoffset, y * Options.TileHeight + Options.TileHeight / 2 + yoffset, 3, x, y, i, tilesetTex, buffers[i] ); DrawAutoTile( layer, +x * Options.TileWidth + Options.TileWidth / 2 + xoffset, y * Options.TileHeight + Options.TileHeight / 2 + yoffset, 4, x, y, i, tilesetTex, buffers[i] ); } break; } } } var outputBuffers = new GameTileBuffer[3][]; for (var i = 0; i < 3; i++) { outputBuffers[i] = new GameTileBuffer[tileBuffers.Count]; } var valueArrays = tileBuffers.Values.ToArray(); for (var x = 0; x < valueArrays.Length; x++) { for (var i = 0; i < 3; i++) { outputBuffers[i][x] = valueArrays[x][i]; } } mTileBufferDict[layer] = tileBuffers; return(outputBuffers); }
private void DrawAutoTile( int layerNum, float destX, float destY, int quarterNum, int x, int y, int forceFrame, GameTexture tileset, GameTileBuffer buffer, bool update = false ) { int yOffset = 0, xOffset = 0; // calculate the offset switch (Layers[layerNum].Tiles[x, y].Autotile) { case MapAutotiles.AUTOTILE_WATERFALL: yOffset = (forceFrame - 1) * Options.TileHeight; break; case MapAutotiles.AUTOTILE_ANIM: xOffset = forceFrame * Options.TileWidth * 2; break; case MapAutotiles.AUTOTILE_ANIM_XP: xOffset = forceFrame * Options.TileWidth * 3; break; case MapAutotiles.AUTOTILE_CLIFF: yOffset = -Options.TileHeight; break; } if (update) { if (!buffer.UpdateTile( tileset, destX, destY, (int)Autotiles.Autotile[x, y].Layer[layerNum].QuarterTile[quarterNum].X + xOffset, (int)Autotiles.Autotile[x, y].Layer[layerNum].QuarterTile[quarterNum].Y + yOffset, Options.TileWidth / 2, Options.TileHeight / 2 )) { throw new Exception("Failed to update tile to VBO!"); } } else { if (!buffer.AddTile( tileset, destX, destY, (int)Autotiles.Autotile[x, y].Layer[layerNum].QuarterTile[quarterNum].X + xOffset, (int)Autotiles.Autotile[x, y].Layer[layerNum].QuarterTile[quarterNum].Y + yOffset, Options.TileWidth / 2, Options.TileHeight / 2 )) { throw new Exception("Failed to add tile to VBO!"); } } }