From 00a0aac7a3cbc773a5e59979e38c0ad001c5d342 Mon Sep 17 00:00:00 2001 From: Paul Chote Date: Sat, 27 Nov 2010 13:30:08 +1300 Subject: [PATCH] Scale is now set via a field on Render* and interacts properly with chronoshift and building previews. --- OpenRA.Game/Actor.cs | 13 ++---- OpenRA.Game/OpenRA.Game.csproj | 1 - OpenRA.Game/Traits/Render/RenderSimple.cs | 12 +++++- OpenRA.Game/Traits/Scale.cs | 40 ------------------- OpenRA.Game/Traits/TraitsInterfaces.cs | 15 ++----- OpenRA.Game/Traits/Util.cs | 7 +--- .../Orders/PlaceBuildingOrderGenerator.cs | 4 +- OpenRA.Mods.RA/Render/RenderBuilding.cs | 2 +- .../Render/RenderBuildingWarFactory.cs | 2 +- .../SupportPowers/ChronoshiftPower.cs | 5 ++- 10 files changed, 25 insertions(+), 76 deletions(-) delete mode 100644 OpenRA.Game/Traits/Scale.cs diff --git a/OpenRA.Game/Actor.cs b/OpenRA.Game/Actor.cs index 8efaaa4fc0..2abb53100f 100755 --- a/OpenRA.Game/Actor.cs +++ b/OpenRA.Game/Actor.cs @@ -91,17 +91,10 @@ namespace OpenRA public RectangleF GetBounds(bool useAltitude) { - var si = Info.Traits.GetOrDefault(); - - var size = Size.Value; - - /* apply scaling */ - var scale = this.TraitOrDefault(); - if (scale != null && scale.Info.Value != 1) - size = size*scale.Info.Value; - - var loc = CenterLocation - 0.5f * size; + var size = Size.Value; + var loc = CenterLocation - 0.5f * size; + var si = Info.Traits.GetOrDefault(); if (si != null && si.Bounds != null && si.Bounds.Length > 2) loc += new float2(si.Bounds[2], si.Bounds[3]); diff --git a/OpenRA.Game/OpenRA.Game.csproj b/OpenRA.Game/OpenRA.Game.csproj index b6794acf34..9bb1d91a3b 100755 --- a/OpenRA.Game/OpenRA.Game.csproj +++ b/OpenRA.Game/OpenRA.Game.csproj @@ -199,7 +199,6 @@ - diff --git a/OpenRA.Game/Traits/Render/RenderSimple.cs b/OpenRA.Game/Traits/Render/RenderSimple.cs index f7cd9c9a79..4c7bb0267b 100755 --- a/OpenRA.Game/Traits/Render/RenderSimple.cs +++ b/OpenRA.Game/Traits/Render/RenderSimple.cs @@ -20,6 +20,7 @@ namespace OpenRA.Traits public readonly string[] OverrideTileset = null; public readonly string[] OverrideImage = null; public readonly string Palette = null; + public readonly float Scale = 1f; public abstract object Create(ActorInitializer init); } @@ -48,17 +49,24 @@ namespace OpenRA.Traits return cachedImage = GetImage(self.Info, self.World.Map.Tileset); } + RenderSimpleInfo Info; public RenderSimple(Actor self, Func baseFacing) { anims.Add( "", new Animation( GetImage(self), baseFacing ) ); + Info = self.Info.Traits.Get(); } public virtual IEnumerable Render( Actor self ) { - var palette = self.Info.Traits.Get().Palette; + foreach( var a in anims.Values ) if( a.DisableFunc == null || !a.DisableFunc() ) - yield return ( palette == null ) ? a.Image( self ) : a.Image( self ).WithPalette(palette); + { + Renderable ret = a.Image( self ); + if (Info.Scale != 1f) + ret = ret.WithScale(Info.Scale).WithPos(ret.Pos + 0.5f*ret.Sprite.size*(1 - Info.Scale)); + yield return ( Info.Palette == null ) ? ret : ret.WithPalette(Info.Palette); + } } public virtual void Tick(Actor self) diff --git a/OpenRA.Game/Traits/Scale.cs b/OpenRA.Game/Traits/Scale.cs deleted file mode 100644 index 94c25bd4b8..0000000000 --- a/OpenRA.Game/Traits/Scale.cs +++ /dev/null @@ -1,40 +0,0 @@ -using System.Collections.Generic; - -namespace OpenRA.Traits -{ - public class ScaleInfo : ITraitInfo - { - public readonly float Value = 1f; /* default */ - - public ScaleInfo() { } /* only because we have other ctors */ - - public object Create(ActorInitializer init) { return new Scale(this); } - } - - public class Scale : IRenderModifier - { - public ScaleInfo Info { get; protected set; } - - public Scale(ScaleInfo info) - { - this.Info = info; - } - - public IEnumerable ModifyRender(Actor self, IEnumerable r) - { - var r2 = new List(r); - var r3 = new List(); - - for (int i = 0; i < r2.Count;i++) - { - var renderable = r2[i]; - - renderable.Scale = Info.Value; - r3.Add(renderable); - // yield return renderable; - } - - return r3; - } - } -} diff --git a/OpenRA.Game/Traits/TraitsInterfaces.cs b/OpenRA.Game/Traits/TraitsInterfaces.cs index c6f8769867..587470d951 100755 --- a/OpenRA.Game/Traits/TraitsInterfaces.cs +++ b/OpenRA.Game/Traits/TraitsInterfaces.cs @@ -151,15 +151,6 @@ namespace OpenRA.Traits public readonly int ZOffset; public float Scale; - public Renderable(Sprite sprite, float2 pos, string palette, int z, int zOffset) - { - Sprite = sprite; - Pos = pos; - Palette = palette; - Z = z; - ZOffset = zOffset; - Scale = 1f; /* default */ - } public Renderable(Sprite sprite, float2 pos, string palette, int z, int zOffset, float scale) { Sprite = sprite; @@ -171,12 +162,12 @@ namespace OpenRA.Traits } public Renderable(Sprite sprite, float2 pos, string palette, int z) - : this(sprite, pos, palette, z, 0) { } - + : this(sprite, pos, palette, z, 0, 1f) { } public Renderable(Sprite sprite, float2 pos, string palette, int z, float scale) : this(sprite, pos, palette, z, 0, scale) { } - + + public Renderable WithScale(float newScale) { return new Renderable(Sprite, Pos, Palette, Z, ZOffset, newScale); } public Renderable WithPalette(string newPalette) { return new Renderable(Sprite, Pos, newPalette, Z, ZOffset, Scale); } public Renderable WithZOffset(int newOffset) { return new Renderable(Sprite, Pos, Palette, Z, newOffset, Scale); } public Renderable WithPos(float2 newPos) { return new Renderable(Sprite, newPos, Palette, Z, ZOffset, Scale); } diff --git a/OpenRA.Game/Traits/Util.cs b/OpenRA.Game/Traits/Util.cs index 004477ec4a..109ea19a5b 100755 --- a/OpenRA.Game/Traits/Util.cs +++ b/OpenRA.Game/Traits/Util.cs @@ -100,12 +100,7 @@ namespace OpenRA.Traits public static Renderable Centered(Actor self, Sprite s, float2 location) { var pal = self.Owner == null ? "player0" : self.Owner.Palette; - var scale = self.TraitOrDefault(); - var scaleModifier = 1f; - if (scale != null) - scaleModifier = scale.Info.Value; - - var loc = location - 0.5f * s.size * scaleModifier; + var loc = location - 0.5f * s.size; return new Renderable(s, loc.Round(), pal, (int)self.CenterLocation.Y); } diff --git a/OpenRA.Mods.RA/Orders/PlaceBuildingOrderGenerator.cs b/OpenRA.Mods.RA/Orders/PlaceBuildingOrderGenerator.cs index 6dbbf68077..9973424e37 100755 --- a/OpenRA.Mods.RA/Orders/PlaceBuildingOrderGenerator.cs +++ b/OpenRA.Mods.RA/Orders/PlaceBuildingOrderGenerator.cs @@ -82,7 +82,9 @@ namespace OpenRA.Mods.RA.Orders else { foreach (var r in Preview) - r.Sprite.DrawAt(wr,Game.CellSize*topLeft + r.Pos, r.Palette ?? world.LocalPlayer.Palette); + r.Sprite.DrawAt(Game.CellSize*topLeft + r.Pos, + wr.GetPaletteIndex(r.Palette ?? world.LocalPlayer.Palette), + r.Scale*r.Sprite.size); var res = world.WorldActor.Trait(); var isCloseEnough = BuildingInfo.IsCloseEnoughToBase(world, world.LocalPlayer, Building, topLeft); diff --git a/OpenRA.Mods.RA/Render/RenderBuilding.cs b/OpenRA.Mods.RA/Render/RenderBuilding.cs index 36e7162035..e2f944853f 100755 --- a/OpenRA.Mods.RA/Render/RenderBuilding.cs +++ b/OpenRA.Mods.RA/Render/RenderBuilding.cs @@ -29,7 +29,7 @@ namespace OpenRA.Mods.RA.Render var anim = new Animation(RenderSimple.GetImage(building, Tileset), () => 0); anim.PlayRepeating("idle"); var rb = building.Traits.Get(); - yield return new Renderable(anim.Image,rb.Origin,rb.Palette,0); + yield return new Renderable(anim.Image, rb.Origin + 0.5f*anim.Image.size*(1 - Scale), rb.Palette, 0, Scale); } } diff --git a/OpenRA.Mods.RA/Render/RenderBuildingWarFactory.cs b/OpenRA.Mods.RA/Render/RenderBuildingWarFactory.cs index cf86dc8bd1..9b850fe40a 100755 --- a/OpenRA.Mods.RA/Render/RenderBuildingWarFactory.cs +++ b/OpenRA.Mods.RA/Render/RenderBuildingWarFactory.cs @@ -27,7 +27,7 @@ namespace OpenRA.Mods.RA.Render var anim = new Animation(RenderSimple.GetImage(building, Tileset), () => 0); anim.PlayRepeating("idle-top"); var rb = building.Traits.Get(); - yield return new Renderable(anim.Image,rb.Origin,rb.Palette,0); + yield return new Renderable(anim.Image, rb.Origin + 0.5f*anim.Image.size*(1 - Scale), rb.Palette, 0, Scale); } } diff --git a/OpenRA.Mods.RA/SupportPowers/ChronoshiftPower.cs b/OpenRA.Mods.RA/SupportPowers/ChronoshiftPower.cs index 4c6130db3a..63dcc0d9c1 100755 --- a/OpenRA.Mods.RA/SupportPowers/ChronoshiftPower.cs +++ b/OpenRA.Mods.RA/SupportPowers/ChronoshiftPower.cs @@ -214,8 +214,9 @@ namespace OpenRA.Mods.RA { var targetCell = unit.Location + xy - sourceLocation; foreach (var r in unit.Render()) - r.Sprite.DrawAt(wr, r.Pos - Traits.Util.CenterOfCell(unit.Location) + Traits.Util.CenterOfCell(targetCell), - r.Palette ?? unit.Owner.Palette); + r.Sprite.DrawAt(r.Pos - Traits.Util.CenterOfCell(unit.Location) + Traits.Util.CenterOfCell(targetCell), + wr.GetPaletteIndex(r.Palette ?? unit.Owner.Palette), + r.Scale*r.Sprite.size); } // Unit tiles