public void Draw(Viewport viewport) { var cells = restrictToBounds ? viewport.VisibleCellsInsideBounds : viewport.AllVisibleCells; // Only draw the rows that are visible. var firstRow = cells.CandidateMapCoords.TopLeft.V.Clamp(0, map.MapSize.Y); var lastRow = (cells.CandidateMapCoords.BottomRight.V + 1).Clamp(firstRow, map.MapSize.Y); Game.Renderer.Flush(); // Flush any visible changes to the GPU for (var row = firstRow; row <= lastRow; row++) { if (!dirtyRows.Remove(row)) continue; var rowOffset = rowStride * row; unsafe { // The compiler / language spec won't let us calculate a pointer to // an offset inside a generic array T[], and so we are forced to // calculate the start-of-row pointer here to pass in to SetData. fixed (Vertex* vPtr = &vertices[0]) vertexBuffer.SetData((IntPtr)(vPtr + rowOffset), rowOffset, rowStride); } } Game.Renderer.WorldSpriteRenderer.DrawVertexBuffer( vertexBuffer, rowStride * firstRow, rowStride * (lastRow - firstRow), PrimitiveType.TriangleList, Sheet, BlendMode); Game.Renderer.Flush(); }
public void Draw( WorldRenderer wr, Viewport viewport ) { int verticesPerRow = map.Bounds.Width * 4; int visibleRows = (int)(viewport.Height * 1f / Game.CellSize / viewport.Zoom + 2); int firstRow = (int)(viewport.Location.Y * 1f / Game.CellSize - map.Bounds.Top); int lastRow = firstRow + visibleRows; if (lastRow < 0 || firstRow > map.Bounds.Height) return; if (firstRow < 0) firstRow = 0; if (lastRow > map.Bounds.Height) lastRow = map.Bounds.Height; if (world.RenderedPlayer != null && !world.RenderedShroud.Disabled && world.RenderedShroud.Bounds.HasValue) { var r = world.RenderedShroud.Bounds.Value; if (firstRow < r.Top - map.Bounds.Top) firstRow = r.Top - map.Bounds.Top; if (firstRow > r.Bottom - map.Bounds.Top) firstRow = r.Bottom - map.Bounds.Top; } if( lastRow < firstRow ) lastRow = firstRow; Game.Renderer.WorldSpriteRenderer.DrawVertexBuffer( vertexBuffer, verticesPerRow * firstRow, verticesPerRow * (lastRow - firstRow), PrimitiveType.QuadList, terrainSheet); foreach (var r in world.WorldActor.TraitsImplementing<IRenderOverlay>()) r.Render( wr ); }
public void Draw(WorldRenderer wr, Viewport viewport) { foreach (var kv in spriteLayers.Values) kv.Draw(wr.Viewport); foreach (var r in wr.World.WorldActor.TraitsImplementing<IRenderOverlay>()) r.Render(wr); }
public void Draw(WorldRenderer wr, Viewport viewport) { var cells = viewport.VisibleCells; // Only draw the rows that are visible. // VisibleCells is clamped to the map, so additional checks are unnecessary var firstRow = cells.TopLeft.ToMPos(map).V - map.Bounds.Top; var lastRow = cells.BottomRight.ToMPos(map).V - map.Bounds.Top + 1; Game.Renderer.WorldSpriteRenderer.DrawVertexBuffer( vertexBuffer, rowStride * firstRow, rowStride * (lastRow - firstRow), PrimitiveType.QuadList, wr.Theater.Sheet); foreach (var r in wr.World.WorldActor.TraitsImplementing<IRenderOverlay>()) r.Render(wr); }
public void Draw(WorldRenderer wr, Viewport viewport) { var verticesPerRow = 4*map.Bounds.Width; var bounds = viewport.CellBounds; var firstRow = bounds.Top - map.Bounds.Top; var lastRow = bounds.Bottom - map.Bounds.Top; if (lastRow < 0 || firstRow > map.Bounds.Height) return; Game.Renderer.WorldSpriteRenderer.DrawVertexBuffer( vertexBuffer, verticesPerRow * firstRow, verticesPerRow * (lastRow - firstRow), PrimitiveType.QuadList, wr.Theater.Sheet); foreach (var r in world.WorldActor.TraitsImplementing<IRenderOverlay>()) r.Render(wr); }
internal WorldRenderer(World world) { this.world = world; Viewport = new Viewport(this, world.Map); palette = new HardwarePalette(); palettes = new Dictionary<string, PaletteReference>(); foreach (var pal in world.traitDict.ActorsWithTrait<ILoadsPalettes>()) pal.Trait.LoadPalettes(this); palette.Initialize(); Theater = new Theater(world.TileSet); terrainRenderer = new TerrainRenderer(world, this); devTrait = Exts.Lazy(() => world.LocalPlayer != null ? world.LocalPlayer.PlayerActor.Trait<DeveloperMode>() : null); }
internal WorldRenderer(World world) { this.world = world; Viewport = new Viewport(this, world.Map); palette = new HardwarePalette(); palettes = new Cache<string, PaletteReference>(CreatePaletteReference); foreach (var pal in world.traitDict.ActorsWithTraitMultiple<IPalette>(world)) pal.Trait.InitPalette(this); palette.Initialize(); Theater = new Theater(world.TileSet); terrainRenderer = new TerrainRenderer(world, this); devTrait = Lazy.New(() => world.LocalPlayer != null ? world.LocalPlayer.PlayerActor.Trait<DeveloperMode>() : null); }
public void Draw(WorldRenderer wr, Viewport viewport) { var verticesPerRow = 4*map.Bounds.Width; var cells = viewport.VisibleCells; var shape = wr.world.Map.TileShape; // Only draw the rows that are visible. // VisibleCells is clamped to the map, so additional checks are unnecessary var firstRow = Map.CellToMap(shape, cells.TopLeft).Y - map.Bounds.Top; var lastRow = Map.CellToMap(shape, cells.BottomRight).Y - map.Bounds.Top + 1; Game.Renderer.WorldSpriteRenderer.DrawVertexBuffer( vertexBuffer, verticesPerRow * firstRow, verticesPerRow * (lastRow - firstRow), PrimitiveType.QuadList, wr.Theater.Sheet); foreach (var r in world.WorldActor.TraitsImplementing<IRenderOverlay>()) r.Render(wr); }
internal WorldRenderer(World world) { World = world; Viewport = new Viewport(this, world.Map); createPaletteReference = CreatePaletteReference; foreach (var pal in world.TraitDict.ActorsWithTrait<ILoadsPalettes>()) pal.Trait.LoadPalettes(this); foreach (var p in world.Players) UpdatePalettesForPlayer(p.InternalName, p.Color, false); palette.Initialize(); Theater = new Theater(world.TileSet); terrainRenderer = new TerrainRenderer(world, this); devTrait = Exts.Lazy(() => world.LocalPlayer != null ? world.LocalPlayer.PlayerActor.Trait<DeveloperMode>() : null); }
public void Draw( Viewport viewport ) { int indicesPerRow = map.Width * 6; int verticesPerRow = map.Width * 4; int visibleRows = (int)(viewport.Height * 1f / Game.CellSize + 2); int firstRow = (int)(viewport.Location.Y * 1f / Game.CellSize - map.YOffset); int lastRow = firstRow + visibleRows; if (lastRow < 0 || firstRow > map.Height) return; if (firstRow < 0) firstRow = 0; if (lastRow > map.Height) lastRow = map.Height; if (world.LocalPlayer != null && !world.LocalPlayer.Shroud.Disabled && world.LocalPlayer.Shroud.Bounds.HasValue) { var r = world.LocalPlayer.Shroud.Bounds.Value; if (firstRow < r.Top - map.YOffset) firstRow = r.Top - map.YOffset; if (firstRow > r.Bottom - map.YOffset) firstRow = r.Bottom - map.YOffset; } if( lastRow < firstRow ) lastRow = firstRow; Game.Renderer.SpriteShader.SetValue( "DiffuseTexture", terrainSheet.Texture ); Game.Renderer.SpriteShader.Render(() => Game.Renderer.DrawBatch(vertexBuffer, indexBuffer, new Range<int>(verticesPerRow * firstRow, verticesPerRow * lastRow), new Range<int>(indicesPerRow * firstRow, indicesPerRow * lastRow), PrimitiveType.TriangleList, Game.Renderer.SpriteShader)); foreach (var r in world.WorldActor.TraitsImplementing<IRenderOverlay>()) r.Render(); }
internal WorldRenderer(ModData modData, World world) { World = world; TileSize = World.Map.Grid.TileSize; Viewport = new Viewport(this, world.Map); createPaletteReference = CreatePaletteReference; var mapGrid = modData.Manifest.Get<MapGrid>(); enableDepthBuffer = mapGrid.EnableDepthBuffer; foreach (var pal in world.TraitDict.ActorsWithTrait<ILoadsPalettes>()) pal.Trait.LoadPalettes(this); foreach (var p in world.Players) UpdatePalettesForPlayer(p.InternalName, p.Color, false); palette.Initialize(); Theater = new Theater(world.Map.Rules.TileSet); terrainRenderer = new TerrainRenderer(world, this); devTrait = Exts.Lazy(() => world.LocalPlayer != null ? world.LocalPlayer.PlayerActor.Trait<DeveloperMode>() : null); }
public void Draw(WorldRenderer wr, Viewport viewport) { terrain.Draw(viewport); foreach (var r in wr.World.WorldActor.TraitsImplementing<IRenderOverlay>()) r.Render(wr); }
public void Draw( Viewport viewport ) { int indicesPerRow = map.Width * 6; int verticesPerRow = map.Width * 4; int visibleRows = (int)(viewport.Height / 24.0f + 2); int firstRow = (int)((viewport.Location.Y) / 24.0f - map.YOffset); int lastRow = firstRow + visibleRows; if (lastRow < 0 || firstRow > map.Height) return; if (firstRow < 0) firstRow = 0; if (lastRow > map.Height) lastRow = map.Height; if (!Game.world.LocalPlayer.Shroud.HasGPS && Game.world.LocalPlayer.Shroud.bounds.HasValue) { var r = Game.world.LocalPlayer.Shroud.bounds.Value; if (firstRow < r.Top - map.YOffset) firstRow = r.Top - map.YOffset; if (firstRow > r.Bottom - map.YOffset) firstRow = r.Bottom - map.YOffset; } if( lastRow < firstRow ) lastRow = firstRow; renderer.SpriteShader.SetValue( "DiffuseTexture", terrainSheet.Texture ); renderer.SpriteShader.Render(() => renderer.DrawBatch(vertexBuffer, indexBuffer, new Range<int>(verticesPerRow * firstRow, verticesPerRow * lastRow), new Range<int>(indicesPerRow * firstRow, indicesPerRow * lastRow), terrainSheet.Texture, PrimitiveType.TriangleList, renderer.SpriteShader)); foreach (var r in Game.world.WorldActor.traits.WithInterface<IRenderOverlay>()) r.Render(); overlayRenderer.Draw(); }