Introduce IFinalizedRenderable.ScreenBounds.
This commit is contained in:
@@ -33,6 +33,7 @@ namespace OpenRA.Graphics
|
|||||||
{
|
{
|
||||||
void Render(WorldRenderer wr);
|
void Render(WorldRenderer wr);
|
||||||
void RenderDebugGeometry(WorldRenderer wr);
|
void RenderDebugGeometry(WorldRenderer wr);
|
||||||
|
Rectangle ScreenBounds(WorldRenderer wr);
|
||||||
}
|
}
|
||||||
|
|
||||||
public struct SpriteRenderable : IRenderable, IFinalizedRenderable
|
public struct SpriteRenderable : IRenderable, IFinalizedRenderable
|
||||||
@@ -85,5 +86,11 @@ namespace OpenRA.Graphics
|
|||||||
var offset = ScreenPosition(wr) + sprite.Offset;
|
var offset = ScreenPosition(wr) + sprite.Offset;
|
||||||
Game.Renderer.WorldLineRenderer.DrawRect(offset, offset + sprite.Size, Color.Red);
|
Game.Renderer.WorldLineRenderer.DrawRect(offset, offset + sprite.Size, Color.Red);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Rectangle ScreenBounds(WorldRenderer wr)
|
||||||
|
{
|
||||||
|
var offset = ScreenPosition(wr) + sprite.Offset;
|
||||||
|
return new Rectangle((int)offset.X, (int)offset.Y, (int)sprite.Size.X, (int)sprite.Size.Y);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -153,5 +153,6 @@ namespace OpenRA.Graphics
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void RenderDebugGeometry(WorldRenderer wr) { }
|
public void RenderDebugGeometry(WorldRenderer wr) { }
|
||||||
|
public Rectangle ScreenBounds(WorldRenderer wr) { return Rectangle.Empty; }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -67,5 +67,6 @@ namespace OpenRA.Graphics
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void RenderDebugGeometry(WorldRenderer wr) { }
|
public void RenderDebugGeometry(WorldRenderer wr) { }
|
||||||
|
public Rectangle ScreenBounds(WorldRenderer wr) { return Rectangle.Empty; }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -56,5 +56,6 @@ namespace OpenRA.Graphics
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void RenderDebugGeometry(WorldRenderer wr) { }
|
public void RenderDebugGeometry(WorldRenderer wr) { }
|
||||||
|
public Rectangle ScreenBounds(WorldRenderer wr) { return Rectangle.Empty; }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -55,5 +55,11 @@ namespace OpenRA.Graphics
|
|||||||
var offset = screenPos + sprite.Offset;
|
var offset = screenPos + sprite.Offset;
|
||||||
Game.Renderer.LineRenderer.DrawRect(offset, offset + sprite.Size, Color.Red);
|
Game.Renderer.LineRenderer.DrawRect(offset, offset + sprite.Size, Color.Red);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Rectangle ScreenBounds(WorldRenderer wr)
|
||||||
|
{
|
||||||
|
var offset = screenPos + sprite.Offset;
|
||||||
|
return new Rectangle((int)offset.X, (int)offset.Y, (int)sprite.Size.X, (int)sprite.Size.Y);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -54,5 +54,6 @@ namespace OpenRA.Mods.Common.Graphics
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void RenderDebugGeometry(WorldRenderer wr) { }
|
public void RenderDebugGeometry(WorldRenderer wr) { }
|
||||||
|
public Rectangle ScreenBounds(WorldRenderer wr) { return Rectangle.Empty; }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -86,6 +86,7 @@ namespace OpenRA.Mods.Common.Graphics
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void RenderDebugGeometry(WorldRenderer wr) { }
|
public void RenderDebugGeometry(WorldRenderer wr) { }
|
||||||
|
public Rectangle ScreenBounds(WorldRenderer wr) { return Rectangle.Empty; }
|
||||||
|
|
||||||
// Array index modulo length
|
// Array index modulo length
|
||||||
int Index(int i)
|
int Index(int i)
|
||||||
|
|||||||
@@ -53,5 +53,6 @@ namespace OpenRA.Mods.Common.Graphics
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void RenderDebugGeometry(WorldRenderer wr) { }
|
public void RenderDebugGeometry(WorldRenderer wr) { }
|
||||||
|
public Rectangle ScreenBounds(WorldRenderer wr) { return Rectangle.Empty; }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -55,5 +55,7 @@ namespace OpenRA.Mods.Common.Graphics
|
|||||||
var offset = wr.ScreenPxPosition(pos) - 0.5f * size;
|
var offset = wr.ScreenPxPosition(pos) - 0.5f * size;
|
||||||
Game.Renderer.WorldLineRenderer.DrawRect(offset, offset + size, Color.Red);
|
Game.Renderer.WorldLineRenderer.DrawRect(offset, offset + size, Color.Red);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Rectangle ScreenBounds(WorldRenderer wr) { return Rectangle.Empty; }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -8,6 +8,7 @@
|
|||||||
*/
|
*/
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Drawing;
|
using System.Drawing;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
@@ -185,6 +186,41 @@ namespace OpenRA.Mods.Common.Graphics
|
|||||||
Game.Renderer.WorldLineRenderer.DrawLine(corners[2], corners[6], c, c);
|
Game.Renderer.WorldLineRenderer.DrawLine(corners[2], corners[6], c, c);
|
||||||
Game.Renderer.WorldLineRenderer.DrawLine(corners[3], corners[7], c, c);
|
Game.Renderer.WorldLineRenderer.DrawLine(corners[3], corners[7], c, c);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Rectangle ScreenBounds(WorldRenderer wr)
|
||||||
|
{
|
||||||
|
var pxOrigin = wr.ScreenPosition(voxel.pos);
|
||||||
|
var draw = voxel.voxels.Where(v => v.DisableFunc == null || !v.DisableFunc());
|
||||||
|
var scaleTransform = Util.ScaleMatrix(voxel.scale, voxel.scale, voxel.scale);
|
||||||
|
var cameraTransform = Util.MakeFloatMatrix(voxel.camera.AsMatrix());
|
||||||
|
|
||||||
|
var minX = float.MaxValue;
|
||||||
|
var minY = float.MaxValue;
|
||||||
|
var maxX = float.MinValue;
|
||||||
|
var maxY = float.MinValue;
|
||||||
|
foreach (var v in draw)
|
||||||
|
{
|
||||||
|
var bounds = v.Voxel.Bounds(v.FrameFunc());
|
||||||
|
var worldTransform = v.RotationFunc().Reverse().Aggregate(scaleTransform,
|
||||||
|
(x, y) => Util.MatrixMultiply(x, Util.MakeFloatMatrix(y.AsMatrix())));
|
||||||
|
|
||||||
|
var pxOffset = wr.ScreenVector(v.OffsetFunc());
|
||||||
|
var pxPos = pxOrigin + new float2(pxOffset[0], pxOffset[1]);
|
||||||
|
var screenTransform = Util.MatrixMultiply(cameraTransform, worldTransform);
|
||||||
|
|
||||||
|
for (var i = 0; i < 8; i++)
|
||||||
|
{
|
||||||
|
var vec = new float[] { bounds[CornerXIndex[i]], bounds[CornerYIndex[i]], bounds[CornerZIndex[i]], 1 };
|
||||||
|
var screen = Util.MatrixVectorMultiply(screenTransform, vec);
|
||||||
|
minX = Math.Min(minX, pxPos.X + screen[0]);
|
||||||
|
minY = Math.Min(minY, pxPos.Y + screen[1]);
|
||||||
|
maxX = Math.Max(maxX, pxPos.X + screen[0]);
|
||||||
|
maxY = Math.Max(maxY, pxPos.Y + screen[1]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return Rectangle.FromLTRB((int)minX, (int)minY, (int)maxX, (int)maxY);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -10,6 +10,7 @@
|
|||||||
|
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
using System.Drawing;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using OpenRA.Graphics;
|
using OpenRA.Graphics;
|
||||||
|
|
||||||
@@ -75,6 +76,8 @@ namespace OpenRA.Mods.RA.Graphics
|
|||||||
cache.Do(c => c.Render(wr));
|
cache.Do(c => c.Render(wr));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Rectangle ScreenBounds(WorldRenderer wr) { return Rectangle.Empty; }
|
||||||
|
|
||||||
public IEnumerable<IFinalizedRenderable> GenerateRenderables(WorldRenderer wr)
|
public IEnumerable<IFinalizedRenderable> GenerateRenderables(WorldRenderer wr)
|
||||||
{
|
{
|
||||||
var bright = wr.World.Map.SequenceProvider.GetSequence(image, "bright");
|
var bright = wr.World.Map.SequenceProvider.GetSequence(image, "bright");
|
||||||
|
|||||||
Reference in New Issue
Block a user