Allow sequences to define a Scale factor.
This commit is contained in:
@@ -54,6 +54,7 @@ namespace OpenRA.Graphics
|
|||||||
|
|
||||||
public IRenderable[] Render(WPos pos, WVec offset, int zOffset, PaletteReference palette, float scale)
|
public IRenderable[] Render(WPos pos, WVec offset, int zOffset, PaletteReference palette, float scale)
|
||||||
{
|
{
|
||||||
|
scale *= CurrentSequence.Scale;
|
||||||
var tintModifiers = CurrentSequence.IgnoreWorldTint ? TintModifiers.IgnoreWorldTint : TintModifiers.None;
|
var tintModifiers = CurrentSequence.IgnoreWorldTint ? TintModifiers.IgnoreWorldTint : TintModifiers.None;
|
||||||
var imageRenderable = new SpriteRenderable(Image, pos, offset, CurrentSequence.ZOffset + zOffset, palette, scale, IsDecoration, tintModifiers);
|
var imageRenderable = new SpriteRenderable(Image, pos, offset, CurrentSequence.ZOffset + zOffset, palette, scale, IsDecoration, tintModifiers);
|
||||||
|
|
||||||
@@ -69,6 +70,7 @@ namespace OpenRA.Graphics
|
|||||||
|
|
||||||
public IRenderable[] RenderUI(WorldRenderer wr, int2 pos, WVec offset, int zOffset, PaletteReference palette, float scale)
|
public IRenderable[] RenderUI(WorldRenderer wr, int2 pos, WVec offset, int zOffset, PaletteReference palette, float scale)
|
||||||
{
|
{
|
||||||
|
scale *= CurrentSequence.Scale;
|
||||||
var screenOffset = (scale * wr.ScreenVectorComponents(offset)).XY.ToInt2();
|
var screenOffset = (scale * wr.ScreenVectorComponents(offset)).XY.ToInt2();
|
||||||
var imagePos = pos + screenOffset - new int2((int)(scale * Image.Size.X / 2), (int)(scale * Image.Size.Y / 2));
|
var imagePos = pos + screenOffset - new int2((int)(scale * Image.Size.X / 2), (int)(scale * Image.Size.Y / 2));
|
||||||
var imageRenderable = new UISpriteRenderable(Image, WPos.Zero + offset, imagePos, CurrentSequence.ZOffset + zOffset, palette, scale);
|
var imageRenderable = new UISpriteRenderable(Image, WPos.Zero + offset, imagePos, CurrentSequence.ZOffset + zOffset, palette, scale);
|
||||||
@@ -86,6 +88,7 @@ namespace OpenRA.Graphics
|
|||||||
|
|
||||||
public Rectangle ScreenBounds(WorldRenderer wr, WPos pos, WVec offset, float scale)
|
public Rectangle ScreenBounds(WorldRenderer wr, WPos pos, WVec offset, float scale)
|
||||||
{
|
{
|
||||||
|
scale *= CurrentSequence.Scale;
|
||||||
var xy = wr.ScreenPxPosition(pos) + wr.ScreenPxOffset(offset);
|
var xy = wr.ScreenPxPosition(pos) + wr.ScreenPxOffset(offset);
|
||||||
var cb = CurrentSequence.Bounds;
|
var cb = CurrentSequence.Bounds;
|
||||||
return Rectangle.FromLTRB(
|
return Rectangle.FromLTRB(
|
||||||
|
|||||||
@@ -33,6 +33,7 @@ namespace OpenRA.Graphics
|
|||||||
int[] Frames { get; }
|
int[] Frames { get; }
|
||||||
Rectangle Bounds { get; }
|
Rectangle Bounds { get; }
|
||||||
bool IgnoreWorldTint { get; }
|
bool IgnoreWorldTint { get; }
|
||||||
|
float Scale { get; }
|
||||||
|
|
||||||
Sprite GetSprite(int frame);
|
Sprite GetSprite(int frame);
|
||||||
Sprite GetSprite(int frame, WAngle facing);
|
Sprite GetSprite(int frame, WAngle facing);
|
||||||
|
|||||||
@@ -76,24 +76,24 @@ namespace OpenRA.Graphics
|
|||||||
|
|
||||||
public void Clear(CPos cell)
|
public void Clear(CPos cell)
|
||||||
{
|
{
|
||||||
Update(cell, null, null, true);
|
Update(cell, null, null, 1f, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Update(CPos cell, ISpriteSequence sequence, PaletteReference palette, int frame)
|
public void Update(CPos cell, ISpriteSequence sequence, PaletteReference palette, int frame)
|
||||||
{
|
{
|
||||||
Update(cell, sequence.GetSprite(frame), palette, sequence.IgnoreWorldTint);
|
Update(cell, sequence.GetSprite(frame), palette, sequence.Scale, sequence.IgnoreWorldTint);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Update(CPos cell, Sprite sprite, PaletteReference palette, bool ignoreTint)
|
public void Update(CPos cell, Sprite sprite, PaletteReference palette, float scale = 1f, bool ignoreTint = false)
|
||||||
{
|
{
|
||||||
var xyz = float3.Zero;
|
var xyz = float3.Zero;
|
||||||
if (sprite != null)
|
if (sprite != null)
|
||||||
{
|
{
|
||||||
var cellOrigin = map.CenterOfCell(cell) - new WVec(0, 0, map.Grid.Ramps[map.Ramp[cell]].CenterHeightOffset);
|
var cellOrigin = map.CenterOfCell(cell) - new WVec(0, 0, map.Grid.Ramps[map.Ramp[cell]].CenterHeightOffset);
|
||||||
xyz = worldRenderer.Screen3DPosition(cellOrigin) + sprite.Offset - 0.5f * sprite.Size;
|
xyz = worldRenderer.Screen3DPosition(cellOrigin) + scale * (sprite.Offset - 0.5f * sprite.Size);
|
||||||
}
|
}
|
||||||
|
|
||||||
Update(cell.ToMPos(map.Grid.Type), sprite, palette, xyz, ignoreTint);
|
Update(cell.ToMPos(map.Grid.Type), sprite, palette, xyz, scale, ignoreTint);
|
||||||
}
|
}
|
||||||
|
|
||||||
void UpdateTint(MPos uv)
|
void UpdateTint(MPos uv)
|
||||||
@@ -156,7 +156,7 @@ namespace OpenRA.Graphics
|
|||||||
throw new InvalidDataException("Sheet overflow");
|
throw new InvalidDataException("Sheet overflow");
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Update(MPos uv, Sprite sprite, PaletteReference palette, in float3 pos, bool ignoreTint)
|
public void Update(MPos uv, Sprite sprite, PaletteReference palette, in float3 pos, float scale, bool ignoreTint)
|
||||||
{
|
{
|
||||||
int2 samplers;
|
int2 samplers;
|
||||||
if (sprite != null)
|
if (sprite != null)
|
||||||
@@ -177,7 +177,7 @@ namespace OpenRA.Graphics
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
var offset = rowStride * uv.V + 6 * uv.U;
|
var offset = rowStride * uv.V + 6 * uv.U;
|
||||||
Util.FastCreateQuad(vertices, pos, sprite, samplers, palette?.TextureIndex ?? 0, offset, sprite.Size, float3.Ones, 1f);
|
Util.FastCreateQuad(vertices, pos, sprite, samplers, palette?.TextureIndex ?? 0, offset, scale * sprite.Size, float3.Ones, 1f);
|
||||||
palettes[uv.V * map.MapSize.X + uv.U] = palette;
|
palettes[uv.V * map.MapSize.X + uv.U] = palette;
|
||||||
|
|
||||||
if (worldRenderer.TerrainLighting != null)
|
if (worldRenderer.TerrainLighting != null)
|
||||||
|
|||||||
@@ -113,6 +113,7 @@ namespace OpenRA.Mods.Common.Graphics
|
|||||||
int[] ISpriteSequence.Frames { get { throw exception; } }
|
int[] ISpriteSequence.Frames { get { throw exception; } }
|
||||||
Rectangle ISpriteSequence.Bounds { get { throw exception; } }
|
Rectangle ISpriteSequence.Bounds { get { throw exception; } }
|
||||||
bool ISpriteSequence.IgnoreWorldTint { get { throw exception; } }
|
bool ISpriteSequence.IgnoreWorldTint { get { throw exception; } }
|
||||||
|
float ISpriteSequence.Scale { get { throw exception; } }
|
||||||
Sprite ISpriteSequence.GetSprite(int frame) { throw exception; }
|
Sprite ISpriteSequence.GetSprite(int frame) { throw exception; }
|
||||||
Sprite ISpriteSequence.GetSprite(int frame, WAngle facing) { throw exception; }
|
Sprite ISpriteSequence.GetSprite(int frame, WAngle facing) { throw exception; }
|
||||||
Sprite ISpriteSequence.GetShadow(int frame, WAngle facing) { throw exception; }
|
Sprite ISpriteSequence.GetShadow(int frame, WAngle facing) { throw exception; }
|
||||||
@@ -140,6 +141,7 @@ namespace OpenRA.Mods.Common.Graphics
|
|||||||
public int[] Frames { get; private set; }
|
public int[] Frames { get; private set; }
|
||||||
public Rectangle Bounds { get; private set; }
|
public Rectangle Bounds { get; private set; }
|
||||||
public bool IgnoreWorldTint { get; private set; }
|
public bool IgnoreWorldTint { get; private set; }
|
||||||
|
public float Scale { get; private set; }
|
||||||
|
|
||||||
public readonly uint[] EmbeddedPalette;
|
public readonly uint[] EmbeddedPalette;
|
||||||
|
|
||||||
@@ -184,6 +186,7 @@ namespace OpenRA.Mods.Common.Graphics
|
|||||||
transpose = LoadField(d, "Transpose", false);
|
transpose = LoadField(d, "Transpose", false);
|
||||||
Frames = LoadField<int[]>(d, "Frames", null);
|
Frames = LoadField<int[]>(d, "Frames", null);
|
||||||
IgnoreWorldTint = LoadField(d, "IgnoreWorldTint", false);
|
IgnoreWorldTint = LoadField(d, "IgnoreWorldTint", false);
|
||||||
|
Scale = LoadField(d, "Scale", 1f);
|
||||||
|
|
||||||
var flipX = LoadField(d, "FlipX", false);
|
var flipX = LoadField(d, "FlipX", false);
|
||||||
var flipY = LoadField(d, "FlipY", false);
|
var flipY = LoadField(d, "FlipY", false);
|
||||||
|
|||||||
@@ -280,7 +280,7 @@ namespace OpenRA.Mods.Common.Traits.Render
|
|||||||
{
|
{
|
||||||
return anims.Where(b => b.IsVisible
|
return anims.Where(b => b.IsVisible
|
||||||
&& b.Animation.Animation.CurrentSequence != null)
|
&& b.Animation.Animation.CurrentSequence != null)
|
||||||
.Select(a => (a.Animation.Animation.Image.Size.XY * Info.Scale).ToInt2())
|
.Select(a => (a.Animation.Animation.Image.Size.XY * a.Animation.Animation.CurrentSequence.Scale * Info.Scale).ToInt2())
|
||||||
.FirstOrDefault();
|
.FirstOrDefault();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -177,7 +177,7 @@ namespace OpenRA.Mods.Common.Traits.Render
|
|||||||
var pos = self.CenterPosition - new WVec(0, 0, dat.Length);
|
var pos = self.CenterPosition - new WVec(0, 0, dat.Length);
|
||||||
var palette = wr.Palette(info.ShadowPalette);
|
var palette = wr.Palette(info.ShadowPalette);
|
||||||
var tintModifiers = shadow.CurrentSequence.IgnoreWorldTint ? TintModifiers.IgnoreWorldTint : TintModifiers.None;
|
var tintModifiers = shadow.CurrentSequence.IgnoreWorldTint ? TintModifiers.IgnoreWorldTint : TintModifiers.None;
|
||||||
return new IRenderable[] { new SpriteRenderable(shadow.Image, pos, info.ShadowOffset, info.ShadowZOffset, palette, 1, true, tintModifiers) };
|
return new IRenderable[] { new SpriteRenderable(shadow.Image, pos, info.ShadowOffset, info.ShadowZOffset, palette, shadow.CurrentSequence.Scale, true, tintModifiers) };
|
||||||
}
|
}
|
||||||
|
|
||||||
IEnumerable<Rectangle> IRender.ScreenBounds(Actor self, WorldRenderer wr)
|
IEnumerable<Rectangle> IRender.ScreenBounds(Actor self, WorldRenderer wr)
|
||||||
|
|||||||
@@ -294,8 +294,8 @@ namespace OpenRA.Mods.Common.Traits
|
|||||||
if (fogSprite != null)
|
if (fogSprite != null)
|
||||||
fogPos += fogSprite.Offset - 0.5f * fogSprite.Size;
|
fogPos += fogSprite.Offset - 0.5f * fogSprite.Size;
|
||||||
|
|
||||||
shroudLayer.Update(uv, shroudSprite, shroudPaletteReference, shroudPos, true);
|
shroudLayer.Update(uv, shroudSprite, shroudPaletteReference, shroudPos, 1f, true);
|
||||||
fogLayer.Update(uv, fogSprite, fogPaletteReference, fogPos, true);
|
fogLayer.Update(uv, fogSprite, fogPaletteReference, fogPos, 1f, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
anyCellDirty = false;
|
anyCellDirty = false;
|
||||||
|
|||||||
@@ -97,7 +97,7 @@ namespace OpenRA.Mods.Common.Traits
|
|||||||
|
|
||||||
var sprite = tileCache.TileSprite(tile);
|
var sprite = tileCache.TileSprite(tile);
|
||||||
var paletteReference = worldRenderer.Palette(palette);
|
var paletteReference = worldRenderer.Palette(palette);
|
||||||
spriteLayer.Update(cell, sprite, paletteReference, false);
|
spriteLayer.Update(cell, sprite, paletteReference);
|
||||||
}
|
}
|
||||||
|
|
||||||
void IRenderTerrain.RenderTerrain(WorldRenderer wr, Viewport viewport)
|
void IRenderTerrain.RenderTerrain(WorldRenderer wr, Viewport viewport)
|
||||||
|
|||||||
@@ -102,7 +102,7 @@ namespace OpenRA.Mods.D2k.Traits
|
|||||||
// Terrain tiles define their origin at the topleft
|
// Terrain tiles define their origin at the topleft
|
||||||
var s = terrainRenderer.TileSprite(tile.Value);
|
var s = terrainRenderer.TileSprite(tile.Value);
|
||||||
var ss = new Sprite(s.Sheet, s.Bounds, s.ZRamp, float2.Zero, s.Channel, s.BlendMode);
|
var ss = new Sprite(s.Sheet, s.Bounds, s.ZRamp, float2.Zero, s.Channel, s.BlendMode);
|
||||||
render.Update(kv.Key, ss, paletteReference, false);
|
render.Update(kv.Key, ss, paletteReference);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
render.Clear(kv.Key);
|
render.Clear(kv.Key);
|
||||||
|
|||||||
Reference in New Issue
Block a user