From f6b40b2bce28d7c6e89aaa48e8181d4cd4d2ccad Mon Sep 17 00:00:00 2001 From: Paul Chote Date: Thu, 31 Dec 2020 17:46:25 +0000 Subject: [PATCH] Allow sequences to define a Scale factor. --- OpenRA.Game/Graphics/Animation.cs | 3 +++ OpenRA.Game/Graphics/SequenceProvider.cs | 1 + OpenRA.Game/Graphics/TerrainSpriteLayer.cs | 14 +++++++------- .../Graphics/DefaultSpriteSequence.cs | 3 +++ OpenRA.Mods.Common/Traits/Render/RenderSprites.cs | 2 +- OpenRA.Mods.Common/Traits/Render/WithParachute.cs | 2 +- OpenRA.Mods.Common/Traits/World/ShroudRenderer.cs | 4 ++-- OpenRA.Mods.Common/Traits/World/TerrainRenderer.cs | 2 +- .../Traits/World/BuildableTerrainLayer.cs | 2 +- 9 files changed, 20 insertions(+), 13 deletions(-) diff --git a/OpenRA.Game/Graphics/Animation.cs b/OpenRA.Game/Graphics/Animation.cs index e419a1ee9e..2391628b67 100644 --- a/OpenRA.Game/Graphics/Animation.cs +++ b/OpenRA.Game/Graphics/Animation.cs @@ -54,6 +54,7 @@ namespace OpenRA.Graphics 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 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) { + scale *= CurrentSequence.Scale; 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 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) { + scale *= CurrentSequence.Scale; var xy = wr.ScreenPxPosition(pos) + wr.ScreenPxOffset(offset); var cb = CurrentSequence.Bounds; return Rectangle.FromLTRB( diff --git a/OpenRA.Game/Graphics/SequenceProvider.cs b/OpenRA.Game/Graphics/SequenceProvider.cs index f7564d7834..63a32879f7 100644 --- a/OpenRA.Game/Graphics/SequenceProvider.cs +++ b/OpenRA.Game/Graphics/SequenceProvider.cs @@ -33,6 +33,7 @@ namespace OpenRA.Graphics int[] Frames { get; } Rectangle Bounds { get; } bool IgnoreWorldTint { get; } + float Scale { get; } Sprite GetSprite(int frame); Sprite GetSprite(int frame, WAngle facing); diff --git a/OpenRA.Game/Graphics/TerrainSpriteLayer.cs b/OpenRA.Game/Graphics/TerrainSpriteLayer.cs index 9a2ea6a637..70a7a7b152 100644 --- a/OpenRA.Game/Graphics/TerrainSpriteLayer.cs +++ b/OpenRA.Game/Graphics/TerrainSpriteLayer.cs @@ -76,24 +76,24 @@ namespace OpenRA.Graphics 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) { - 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; if (sprite != null) { 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) @@ -156,7 +156,7 @@ namespace OpenRA.Graphics 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; if (sprite != null) @@ -177,7 +177,7 @@ namespace OpenRA.Graphics return; 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; if (worldRenderer.TerrainLighting != null) diff --git a/OpenRA.Mods.Common/Graphics/DefaultSpriteSequence.cs b/OpenRA.Mods.Common/Graphics/DefaultSpriteSequence.cs index 97b56de751..09fcf32c9c 100644 --- a/OpenRA.Mods.Common/Graphics/DefaultSpriteSequence.cs +++ b/OpenRA.Mods.Common/Graphics/DefaultSpriteSequence.cs @@ -113,6 +113,7 @@ namespace OpenRA.Mods.Common.Graphics int[] ISpriteSequence.Frames { get { throw exception; } } Rectangle ISpriteSequence.Bounds { 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, 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 Rectangle Bounds { get; private set; } public bool IgnoreWorldTint { get; private set; } + public float Scale { get; private set; } public readonly uint[] EmbeddedPalette; @@ -184,6 +186,7 @@ namespace OpenRA.Mods.Common.Graphics transpose = LoadField(d, "Transpose", false); Frames = LoadField(d, "Frames", null); IgnoreWorldTint = LoadField(d, "IgnoreWorldTint", false); + Scale = LoadField(d, "Scale", 1f); var flipX = LoadField(d, "FlipX", false); var flipY = LoadField(d, "FlipY", false); diff --git a/OpenRA.Mods.Common/Traits/Render/RenderSprites.cs b/OpenRA.Mods.Common/Traits/Render/RenderSprites.cs index 5f19dd3e9b..23da96cdc0 100644 --- a/OpenRA.Mods.Common/Traits/Render/RenderSprites.cs +++ b/OpenRA.Mods.Common/Traits/Render/RenderSprites.cs @@ -280,7 +280,7 @@ namespace OpenRA.Mods.Common.Traits.Render { return anims.Where(b => b.IsVisible && 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(); } diff --git a/OpenRA.Mods.Common/Traits/Render/WithParachute.cs b/OpenRA.Mods.Common/Traits/Render/WithParachute.cs index b4b0747615..2e6437d7d4 100644 --- a/OpenRA.Mods.Common/Traits/Render/WithParachute.cs +++ b/OpenRA.Mods.Common/Traits/Render/WithParachute.cs @@ -177,7 +177,7 @@ namespace OpenRA.Mods.Common.Traits.Render var pos = self.CenterPosition - new WVec(0, 0, dat.Length); var palette = wr.Palette(info.ShadowPalette); 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 IRender.ScreenBounds(Actor self, WorldRenderer wr) diff --git a/OpenRA.Mods.Common/Traits/World/ShroudRenderer.cs b/OpenRA.Mods.Common/Traits/World/ShroudRenderer.cs index 6e22563434..84ae25f33b 100644 --- a/OpenRA.Mods.Common/Traits/World/ShroudRenderer.cs +++ b/OpenRA.Mods.Common/Traits/World/ShroudRenderer.cs @@ -294,8 +294,8 @@ namespace OpenRA.Mods.Common.Traits if (fogSprite != null) fogPos += fogSprite.Offset - 0.5f * fogSprite.Size; - shroudLayer.Update(uv, shroudSprite, shroudPaletteReference, shroudPos, true); - fogLayer.Update(uv, fogSprite, fogPaletteReference, fogPos, true); + shroudLayer.Update(uv, shroudSprite, shroudPaletteReference, shroudPos, 1f, true); + fogLayer.Update(uv, fogSprite, fogPaletteReference, fogPos, 1f, true); } anyCellDirty = false; diff --git a/OpenRA.Mods.Common/Traits/World/TerrainRenderer.cs b/OpenRA.Mods.Common/Traits/World/TerrainRenderer.cs index 42d3cc2d33..ff29f01c41 100644 --- a/OpenRA.Mods.Common/Traits/World/TerrainRenderer.cs +++ b/OpenRA.Mods.Common/Traits/World/TerrainRenderer.cs @@ -97,7 +97,7 @@ namespace OpenRA.Mods.Common.Traits var sprite = tileCache.TileSprite(tile); var paletteReference = worldRenderer.Palette(palette); - spriteLayer.Update(cell, sprite, paletteReference, false); + spriteLayer.Update(cell, sprite, paletteReference); } void IRenderTerrain.RenderTerrain(WorldRenderer wr, Viewport viewport) diff --git a/OpenRA.Mods.D2k/Traits/World/BuildableTerrainLayer.cs b/OpenRA.Mods.D2k/Traits/World/BuildableTerrainLayer.cs index f790337f32..621bca4cbd 100644 --- a/OpenRA.Mods.D2k/Traits/World/BuildableTerrainLayer.cs +++ b/OpenRA.Mods.D2k/Traits/World/BuildableTerrainLayer.cs @@ -102,7 +102,7 @@ namespace OpenRA.Mods.D2k.Traits // Terrain tiles define their origin at the topleft var s = terrainRenderer.TileSprite(tile.Value); 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 render.Clear(kv.Key);