map.Offset is no long necessary in so many places. (removed BS where world-coords != map-coords)
This commit is contained in:
@@ -73,7 +73,7 @@ namespace OpenRa.Game.Graphics
|
||||
{
|
||||
var location = new int2(x, y);
|
||||
spriteRenderer.DrawSprite(smudgeSprites[tr.smudge - 1],
|
||||
Game.CellSize * (float2)(location - map.Offset), 0);
|
||||
Game.CellSize * (float2)location, 0);
|
||||
}
|
||||
|
||||
var o = tr.overlay;
|
||||
@@ -86,7 +86,7 @@ namespace OpenRa.Game.Graphics
|
||||
else if (overlayIsOre[o]) spriteIndex = 11;
|
||||
else if (overlayIsGems[o]) spriteIndex = 2;
|
||||
spriteRenderer.DrawSprite(sprites[spriteIndex],
|
||||
Game.CellSize * (float2)(location - map.Offset), 0);
|
||||
Game.CellSize * (float2)location, 0);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1,89 +1,89 @@
|
||||
using System.Drawing;
|
||||
using System.Windows.Forms;
|
||||
using Ijw.DirectX;
|
||||
using IjwFramework.Collections;
|
||||
using OpenRa.FileFormats;
|
||||
|
||||
namespace OpenRa.Game.Graphics
|
||||
{
|
||||
class TerrainRenderer
|
||||
{
|
||||
FvfVertexBuffer<Vertex> vertexBuffer;
|
||||
IndexBuffer indexBuffer;
|
||||
Sheet terrainSheet;
|
||||
public TileSet tileSet;
|
||||
Region region;
|
||||
|
||||
Renderer renderer;
|
||||
Map map;
|
||||
Viewport viewport;
|
||||
OverlayRenderer overlayRenderer;
|
||||
|
||||
public TerrainRenderer(Renderer renderer, Map map, Viewport viewport)
|
||||
{
|
||||
this.renderer = renderer;
|
||||
this.viewport = viewport;
|
||||
region = Region.Create(viewport, DockStyle.Left, viewport.Width - 128, Draw, null );
|
||||
viewport.AddRegion(region);
|
||||
this.map = map;
|
||||
using System.Drawing;
|
||||
using System.Windows.Forms;
|
||||
using Ijw.DirectX;
|
||||
using IjwFramework.Collections;
|
||||
using OpenRa.FileFormats;
|
||||
|
||||
namespace OpenRa.Game.Graphics
|
||||
{
|
||||
class TerrainRenderer
|
||||
{
|
||||
FvfVertexBuffer<Vertex> vertexBuffer;
|
||||
IndexBuffer indexBuffer;
|
||||
Sheet terrainSheet;
|
||||
public TileSet tileSet;
|
||||
Region region;
|
||||
|
||||
Renderer renderer;
|
||||
Map map;
|
||||
Viewport viewport;
|
||||
OverlayRenderer overlayRenderer;
|
||||
|
||||
public TerrainRenderer(Renderer renderer, Map map, Viewport viewport)
|
||||
{
|
||||
this.renderer = renderer;
|
||||
this.viewport = viewport;
|
||||
region = Region.Create(viewport, DockStyle.Left, viewport.Width - 128, Draw, null );
|
||||
viewport.AddRegion(region);
|
||||
this.map = map;
|
||||
overlayRenderer = new OverlayRenderer( renderer, map );
|
||||
|
||||
tileSet = new TileSet( map.TileSuffix );
|
||||
|
||||
Size tileSize = new Size( Game.CellSize, Game.CellSize );
|
||||
|
||||
SheetBuilder.ForceNewSheet();
|
||||
|
||||
var tileMapping = new Cache<TileReference, Sprite>(
|
||||
x => SheetBuilder.Add(tileSet.GetBytes(x), tileSize));
|
||||
|
||||
Vertex[] vertices = new Vertex[4 * map.Height * map.Width];
|
||||
ushort[] indices = new ushort[6 * map.Height * map.Width];
|
||||
|
||||
int nv = 0;
|
||||
int ni = 0;
|
||||
for( int j = 0 ; j < map.Height ; j++ )
|
||||
for (int i = 0; i < map.Width; i++)
|
||||
{
|
||||
Sprite tile = tileMapping[map.MapTiles[i + map.XOffset, j + map.YOffset]];
|
||||
Util.FastCreateQuad(vertices, indices, Game.CellSize * new float2(i, j), tile, 0, nv, ni);
|
||||
nv += 4;
|
||||
ni += 6;
|
||||
}
|
||||
|
||||
terrainSheet = tileMapping[map.MapTiles[map.XOffset, map.YOffset]].sheet;
|
||||
|
||||
vertexBuffer = new FvfVertexBuffer<Vertex>( renderer.Device, vertices.Length, Vertex.Format );
|
||||
vertexBuffer.SetData( vertices );
|
||||
|
||||
indexBuffer = new IndexBuffer( renderer.Device, indices.Length );
|
||||
indexBuffer.SetData( indices );
|
||||
}
|
||||
|
||||
void Draw()
|
||||
{
|
||||
int indicesPerRow = map.Width * 6;
|
||||
int verticesPerRow = map.Width * 4;
|
||||
|
||||
|
||||
tileSet = new TileSet( map.TileSuffix );
|
||||
|
||||
Size tileSize = new Size( Game.CellSize, Game.CellSize );
|
||||
|
||||
SheetBuilder.ForceNewSheet();
|
||||
|
||||
var tileMapping = new Cache<TileReference, Sprite>(
|
||||
x => SheetBuilder.Add(tileSet.GetBytes(x), tileSize));
|
||||
|
||||
Vertex[] vertices = new Vertex[4 * map.Height * map.Width];
|
||||
ushort[] indices = new ushort[6 * map.Height * map.Width];
|
||||
|
||||
int nv = 0;
|
||||
int ni = 0;
|
||||
for( int j = map.YOffset ; j < map.YOffset + map.Height ; j++ )
|
||||
for( int i = map.XOffset ; i < map.XOffset + map.Width; i++ )
|
||||
{
|
||||
Sprite tile = tileMapping[map.MapTiles[i, j]];
|
||||
Util.FastCreateQuad(vertices, indices, Game.CellSize * new float2(i, j), tile, 0, nv, ni);
|
||||
nv += 4;
|
||||
ni += 6;
|
||||
}
|
||||
|
||||
terrainSheet = tileMapping[map.MapTiles[map.XOffset, map.YOffset]].sheet;
|
||||
|
||||
vertexBuffer = new FvfVertexBuffer<Vertex>( renderer.Device, vertices.Length, Vertex.Format );
|
||||
vertexBuffer.SetData( vertices );
|
||||
|
||||
indexBuffer = new IndexBuffer( renderer.Device, indices.Length );
|
||||
indexBuffer.SetData( indices );
|
||||
}
|
||||
|
||||
void Draw()
|
||||
{
|
||||
int indicesPerRow = map.Width * 6;
|
||||
int verticesPerRow = map.Width * 4;
|
||||
|
||||
int visibleRows = (int)(region.Size.Y / 24.0f + 2);
|
||||
|
||||
int firstRow = (int)((region.Position.Y + viewport.Location.Y) / 24.0f);
|
||||
int lastRow = firstRow + visibleRows;
|
||||
|
||||
if (lastRow < 0 || firstRow > map.Height)
|
||||
return;
|
||||
|
||||
if (firstRow < 0) firstRow = 0;
|
||||
if (lastRow > map.Height) lastRow = map.Height;
|
||||
|
||||
renderer.SpriteShader.Quality = ShaderQuality.Low;
|
||||
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));
|
||||
|
||||
overlayRenderer.Draw();
|
||||
}
|
||||
}
|
||||
}
|
||||
int firstRow = 0;// (int)( ( region.Position.Y + viewport.Location.Y ) / 24.0f );
|
||||
int lastRow = 128;// firstRow + visibleRows;
|
||||
|
||||
if (lastRow < 0 || firstRow > map.Height)
|
||||
return;
|
||||
|
||||
if (firstRow < 0) firstRow = 0;
|
||||
if (lastRow > map.Height) lastRow = map.Height;
|
||||
|
||||
renderer.SpriteShader.Quality = ShaderQuality.Low;
|
||||
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));
|
||||
|
||||
overlayRenderer.Draw();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -6,35 +6,36 @@ namespace OpenRa.Game.Graphics
|
||||
{
|
||||
class Viewport
|
||||
{
|
||||
readonly float2 size;
|
||||
readonly float2 mapSize;
|
||||
readonly float2 screenSize;
|
||||
float2 scrollPosition;
|
||||
readonly Renderer renderer;
|
||||
|
||||
public float2 Location { get { return scrollPosition; } }
|
||||
public float2 Size { get { return size; } }
|
||||
|
||||
public int Width { get { return (int)size.X; } }
|
||||
public int Height { get { return (int)size.Y; } }
|
||||
public int Width { get { return (int)screenSize.X; } }
|
||||
public int Height { get { return (int)screenSize.Y; } }
|
||||
|
||||
public Cursor cursor = Cursor.Move;
|
||||
SpriteRenderer cursorRenderer;
|
||||
int2 mousePos;
|
||||
float cursorFrame = 0f;
|
||||
|
||||
readonly float2 scrollLowBounds, scrollHighBounds;
|
||||
|
||||
public void Scroll(float2 delta)
|
||||
{
|
||||
scrollPosition = ( scrollPosition + delta ).Constrain( float2.Zero, mapSize );
|
||||
scrollPosition = ( scrollPosition + delta ).Constrain( scrollLowBounds, scrollHighBounds );
|
||||
}
|
||||
|
||||
public Viewport(float2 size, float2 mapSize, Renderer renderer)
|
||||
public Viewport(float2 screenSize, int2 mapStart, int2 mapEnd, Renderer renderer)
|
||||
{
|
||||
this.size = size;
|
||||
this.mapSize = Game.CellSize * mapSize - size + new float2(128, 0);
|
||||
if( this.mapSize.X < 0 ) this.mapSize.X = 0;
|
||||
if( this.mapSize.Y < 0 ) this.mapSize.Y = 0;
|
||||
this.screenSize = screenSize;
|
||||
this.scrollLowBounds = Game.CellSize * mapStart;
|
||||
this.scrollHighBounds = float2.Max( scrollLowBounds, Game.CellSize * mapEnd - ( screenSize - new float2( 128, 0 ) ) );
|
||||
this.renderer = renderer;
|
||||
cursorRenderer = new SpriteRenderer(renderer, true);
|
||||
|
||||
this.scrollPosition = scrollLowBounds;
|
||||
}
|
||||
|
||||
List<Region> regions = new List<Region>();
|
||||
@@ -43,7 +44,7 @@ namespace OpenRa.Game.Graphics
|
||||
|
||||
public void DrawRegions()
|
||||
{
|
||||
float2 r1 = new float2(2, -2) / Size;
|
||||
float2 r1 = new float2(2, -2) / screenSize;
|
||||
float2 r2 = new float2(-1, 1);
|
||||
|
||||
renderer.BeginFrame(r1, r2, scrollPosition);
|
||||
|
||||
Reference in New Issue
Block a user