diff --git a/OpenRA.Game/Graphics/AnimationWithOffset.cs b/OpenRA.Game/Graphics/AnimationWithOffset.cs index becc5ae3d6..513ac8160e 100644 --- a/OpenRA.Game/Graphics/AnimationWithOffset.cs +++ b/OpenRA.Game/Graphics/AnimationWithOffset.cs @@ -40,10 +40,11 @@ namespace OpenRA.Graphics public Renderable Image(Actor self, WorldRenderer wr, PaletteReference pal, float scale) { var p = self.CenterLocation; - var loc = p.ToFloat2() - 0.5f * scale * Animation.Image.size - + (OffsetFunc != null ? OffsetFunc(wr) : float2.Zero); + var offset = p.ToFloat2(); + if (OffsetFunc != null) + offset += OffsetFunc(wr); - return new Renderable(Animation.Image, loc, pal, p.Y, ZOffset, scale); + return new Renderable(Animation.Image, offset, pal, p.Y, ZOffset, scale); } public static implicit operator AnimationWithOffset(Animation a) diff --git a/OpenRA.Game/Graphics/Renderable.cs b/OpenRA.Game/Graphics/Renderable.cs index b75d501435..23def6dae1 100644 --- a/OpenRA.Game/Graphics/Renderable.cs +++ b/OpenRA.Game/Graphics/Renderable.cs @@ -56,7 +56,7 @@ namespace OpenRA.Graphics public void Render(WorldRenderer wr) { - Sprite.DrawAt(Pos, Palette.Index, Scale); + Sprite.DrawAt(Pos - 0.5f*Scale*Sprite.size, Palette.Index, Scale); } public Size Size diff --git a/OpenRA.Game/Traits/Render/RenderSimple.cs b/OpenRA.Game/Traits/Render/RenderSimple.cs index f52a4fd4e9..f5dcfb07a8 100755 --- a/OpenRA.Game/Traits/Render/RenderSimple.cs +++ b/OpenRA.Game/Traits/Render/RenderSimple.cs @@ -30,15 +30,16 @@ namespace OpenRA.Traits [Desc("Number of facings for gameplay calculations. -1 indiciates auto-detection from sequence")] public readonly int QuantizedFacings = -1; + [Desc("Camera pitch the sprite was rendered with. Used to determine rotation ellipses")] public readonly WAngle CameraPitch = WAngle.FromDegrees(40); public virtual object Create(ActorInitializer init) { return new RenderSimple(init.self); } - public virtual IEnumerable RenderPreview(ActorInfo building, PaletteReference pr) + public virtual IEnumerable RenderPreview(ActorInfo ai, PaletteReference pr) { - var anim = new Animation(RenderSimple.GetImage(building), () => 0); + var anim = new Animation(RenderSimple.GetImage(ai), () => 0); anim.PlayRepeating("idle"); - yield return new Renderable(anim.Image, 0.5f * anim.Image.size * (1 - Scale), pr, 0, Scale); + yield return new Renderable(anim.Image, 0.5f*anim.Image.size, pr, 0, Scale); } } diff --git a/OpenRA.Mods.Cnc/Effects/IonCannon.cs b/OpenRA.Mods.Cnc/Effects/IonCannon.cs index df9ae17f00..aa9121a455 100644 --- a/OpenRA.Mods.Cnc/Effects/IonCannon.cs +++ b/OpenRA.Mods.Cnc/Effects/IonCannon.cs @@ -35,7 +35,7 @@ namespace OpenRA.Mods.Cnc.Effects public IEnumerable Render(WorldRenderer wr) { yield return new Renderable(anim.Image, - target.CenterLocation.ToFloat2() - new float2(.5f * anim.Image.size.X, anim.Image.size.Y - Game.CellSize), + target.CenterLocation.ToFloat2() - new float2(0, 0.5f*anim.Image.size.Y - Game.CellSize), wr.Palette("effect"), (int)target.CenterLocation.Y); } diff --git a/OpenRA.Mods.RA/Bridge.cs b/OpenRA.Mods.RA/Bridge.cs index d7fda56878..8119bfa00a 100644 --- a/OpenRA.Mods.RA/Bridge.cs +++ b/OpenRA.Mods.RA/Bridge.cs @@ -151,7 +151,7 @@ namespace OpenRA.Mods.RA } foreach (var t in TileSprites[currentTemplate]) - yield return new Renderable(t.Value, t.Key.ToPPos().ToFloat2(), terrainPalette, Game.CellSize * t.Key.Y); + yield return new Renderable(t.Value, Traits.Util.CenterOfCell(t.Key).ToFloat2(), terrainPalette, Game.CellSize * t.Key.Y); } void KillUnitsOnBridge() diff --git a/OpenRA.Mods.RA/Effects/Bullet.cs b/OpenRA.Mods.RA/Effects/Bullet.cs index 0850180d61..de99316eea 100755 --- a/OpenRA.Mods.RA/Effects/Bullet.cs +++ b/OpenRA.Mods.RA/Effects/Bullet.cs @@ -166,14 +166,14 @@ namespace OpenRA.Mods.RA.Effects if (Info.High || Info.Angle > 0) { if (Info.Shadow) - yield return new Renderable(anim.Image, pos - .5f * anim.Image.size, wr.Palette("shadow"), (int)pos.Y); + yield return new Renderable(anim.Image, pos, wr.Palette("shadow"), (int)pos.Y); var highPos = pos - new float2(0, GetAltitude()); - yield return new Renderable(anim.Image, highPos - .5f * anim.Image.size, wr.Palette("effect"), (int)pos.Y); + yield return new Renderable(anim.Image, highPos, wr.Palette("effect"), (int)pos.Y); } else - yield return new Renderable(anim.Image, pos - .5f * anim.Image.size, + yield return new Renderable(anim.Image, pos, wr.Palette(Args.weapon.Underwater ? "shadow" : "effect"), (int)pos.Y); } } diff --git a/OpenRA.Mods.RA/Effects/Corpse.cs b/OpenRA.Mods.RA/Effects/Corpse.cs index 383cc5dd26..7922fc2b50 100644 --- a/OpenRA.Mods.RA/Effects/Corpse.cs +++ b/OpenRA.Mods.RA/Effects/Corpse.cs @@ -33,7 +33,7 @@ namespace OpenRA.Mods.RA.Effects public IEnumerable Render(WorldRenderer wr) { - yield return new Renderable(anim.Image, pos - .5f * anim.Image.size, wr.Palette(paletteName), (int)pos.Y); + yield return new Renderable(anim.Image, pos, wr.Palette(paletteName), (int)pos.Y); } } } diff --git a/OpenRA.Mods.RA/Effects/CrateEffect.cs b/OpenRA.Mods.RA/Effects/CrateEffect.cs index 61b70dd326..f0a26a6794 100644 --- a/OpenRA.Mods.RA/Effects/CrateEffect.cs +++ b/OpenRA.Mods.RA/Effects/CrateEffect.cs @@ -43,7 +43,7 @@ namespace OpenRA.Mods.RA.Effects { if (a.IsInWorld) yield return new Renderable(anim.Image, - a.CenterLocation.ToFloat2() - .5f * anim.Image.size + offset, + a.CenterLocation.ToFloat2() + offset, wr.Palette("effect"), (int)a.CenterLocation.Y); } } diff --git a/OpenRA.Mods.RA/Effects/Explosion.cs b/OpenRA.Mods.RA/Effects/Explosion.cs index 942abb9a0a..937be75390 100644 --- a/OpenRA.Mods.RA/Effects/Explosion.cs +++ b/OpenRA.Mods.RA/Effects/Explosion.cs @@ -34,9 +34,8 @@ namespace OpenRA.Mods.RA.Effects public IEnumerable Render(WorldRenderer wr) { - yield return new Renderable(anim.Image, - pos.ToFloat2() - .5f * anim.Image.size - new int2(0,altitude), - wr.Palette("effect"), (int)pos.Y - altitude); + var p = pos.ToInt2() - new int2(0, altitude); + yield return new Renderable(anim.Image, p, wr.Palette("effect"), p.Y); } public Player Owner { get { return null; } } diff --git a/OpenRA.Mods.RA/Effects/GpsDot.cs b/OpenRA.Mods.RA/Effects/GpsDot.cs index f3cd8360bd..25b51a04ce 100644 --- a/OpenRA.Mods.RA/Effects/GpsDot.cs +++ b/OpenRA.Mods.RA/Effects/GpsDot.cs @@ -84,7 +84,7 @@ namespace OpenRA.Mods.RA.Effects var p = self.CenterLocation; var palette = wr.Palette(info.IndicatorPalettePrefix+self.Owner.InternalName); - yield return new Renderable(anim.Image, p.ToFloat2() - 0.5f * anim.Image.size, palette, p.Y) + yield return new Renderable(anim.Image, p.ToFloat2(), palette, p.Y) .WithScale(1.5f); } } diff --git a/OpenRA.Mods.RA/Effects/GpsSatellite.cs b/OpenRA.Mods.RA/Effects/GpsSatellite.cs index be28c34cc5..40af4efdd7 100644 --- a/OpenRA.Mods.RA/Effects/GpsSatellite.cs +++ b/OpenRA.Mods.RA/Effects/GpsSatellite.cs @@ -38,7 +38,7 @@ namespace OpenRA.Mods.RA.Effects public IEnumerable Render(WorldRenderer wr) { - yield return new Renderable(anim.Image,offset, wr.Palette("effect"), (int)offset.Y); + yield return new Renderable(anim.Image, offset, wr.Palette("effect"), (int)offset.Y); } } } diff --git a/OpenRA.Mods.RA/Effects/LaserZap.cs b/OpenRA.Mods.RA/Effects/LaserZap.cs index 6b515fd21c..f1391fedc0 100755 --- a/OpenRA.Mods.RA/Effects/LaserZap.cs +++ b/OpenRA.Mods.RA/Effects/LaserZap.cs @@ -79,7 +79,7 @@ namespace OpenRA.Mods.RA.Effects public IEnumerable Render(WorldRenderer wr) { if (explosion != null) - yield return new Renderable(explosion.Image, args.dest.ToFloat2() - .5f * explosion.Image.size, + yield return new Renderable(explosion.Image, args.dest.ToFloat2(), wr.Palette("effect"), (int)args.dest.Y); if (ticks >= info.BeamDuration) diff --git a/OpenRA.Mods.RA/Effects/Missile.cs b/OpenRA.Mods.RA/Effects/Missile.cs index 82af5b8151..6058482daf 100755 --- a/OpenRA.Mods.RA/Effects/Missile.cs +++ b/OpenRA.Mods.RA/Effects/Missile.cs @@ -177,7 +177,7 @@ namespace OpenRA.Mods.RA.Effects public IEnumerable Render(WorldRenderer wr) { if (!Args.firedBy.World.FogObscures(PxPosition.ToCPos())) - yield return new Renderable(anim.Image, PxPosition.ToFloat2() - 0.5f * anim.Image.size - new float2(0, Altitude), + yield return new Renderable(anim.Image, PxPosition.ToFloat2() - new float2(0, Altitude), wr.Palette(Args.weapon.Underwater ? "shadow" : "effect"), PxPosition.Y); if (Trail != null) diff --git a/OpenRA.Mods.RA/Effects/NukeLaunch.cs b/OpenRA.Mods.RA/Effects/NukeLaunch.cs index 8b52557bca..efee4114fe 100755 --- a/OpenRA.Mods.RA/Effects/NukeLaunch.cs +++ b/OpenRA.Mods.RA/Effects/NukeLaunch.cs @@ -79,7 +79,7 @@ namespace OpenRA.Mods.RA.Effects public IEnumerable Render(WorldRenderer wr) { - yield return new Renderable(anim.Image, pos.ToFloat2() - 0.5f * anim.Image.size - new float2(0, altitude), + yield return new Renderable(anim.Image, pos.ToFloat2() - new float2(0, altitude), wr.Palette("effect"), (int)pos.Y); } } diff --git a/OpenRA.Mods.RA/Effects/Parachute.cs b/OpenRA.Mods.RA/Effects/Parachute.cs index 27cb28a268..de3dd20ed5 100644 --- a/OpenRA.Mods.RA/Effects/Parachute.cs +++ b/OpenRA.Mods.RA/Effects/Parachute.cs @@ -79,7 +79,7 @@ namespace OpenRA.Mods.RA.Effects } var pos = location.ToFloat2() - new float2(0, altitude); - yield return new Renderable(paraAnim.Image, pos - .5f * paraAnim.Image.size + offset, rc.First().Palette, 3); + yield return new Renderable(paraAnim.Image, pos + offset, rc.First().Palette, 3); } } } diff --git a/OpenRA.Mods.RA/Effects/PowerdownIndicator.cs b/OpenRA.Mods.RA/Effects/PowerdownIndicator.cs index 832062d681..b7861027a0 100644 --- a/OpenRA.Mods.RA/Effects/PowerdownIndicator.cs +++ b/OpenRA.Mods.RA/Effects/PowerdownIndicator.cs @@ -37,7 +37,7 @@ namespace OpenRA.Mods.RA.Effects public IEnumerable Render(WorldRenderer wr) { if (!a.Destroyed && a.Owner.IsAlliedWith(a.World.RenderPlayer)) - yield return new Renderable(anim.Image, a.CenterLocation.ToFloat2() - .5f * anim.Image.size, + yield return new Renderable(anim.Image, a.CenterLocation.ToFloat2(), wr.Palette("chrome"), (int)a.CenterLocation.Y); } } diff --git a/OpenRA.Mods.RA/Effects/RepairIndicator.cs b/OpenRA.Mods.RA/Effects/RepairIndicator.cs index 302e07f991..3757bb493d 100755 --- a/OpenRA.Mods.RA/Effects/RepairIndicator.cs +++ b/OpenRA.Mods.RA/Effects/RepairIndicator.cs @@ -47,7 +47,7 @@ namespace OpenRA.Mods.RA.Effects if (!building.Destroyed) { yield return new Renderable(anim.Image, - building.CenterLocation.ToFloat2() - .5f * anim.Image.size, + building.CenterLocation.ToFloat2(), wr.Palette(palettePrefix+player.InternalName), (int)building.CenterLocation.Y); } } diff --git a/OpenRA.Mods.RA/Effects/SatelliteLaunch.cs b/OpenRA.Mods.RA/Effects/SatelliteLaunch.cs index 047f27e5ba..cfcb8d0873 100644 --- a/OpenRA.Mods.RA/Effects/SatelliteLaunch.cs +++ b/OpenRA.Mods.RA/Effects/SatelliteLaunch.cs @@ -27,7 +27,7 @@ namespace OpenRA.Mods.RA.Effects doors.PlayThen("active", () => a.World.AddFrameEndTask(w => w.Remove(this))); - pos = a.CenterLocation.ToFloat2() - .5f * doors.Image.size + doorOffset; + pos = a.CenterLocation.ToFloat2() + doorOffset; } public void Tick( World world ) diff --git a/OpenRA.Mods.RA/Effects/Smoke.cs b/OpenRA.Mods.RA/Effects/Smoke.cs index f82f963296..4406536795 100644 --- a/OpenRA.Mods.RA/Effects/Smoke.cs +++ b/OpenRA.Mods.RA/Effects/Smoke.cs @@ -35,7 +35,7 @@ namespace OpenRA.Mods.RA.Effects public IEnumerable Render(WorldRenderer wr) { - yield return new Renderable(anim.Image, pos.ToFloat2() - .5f * anim.Image.size, + yield return new Renderable(anim.Image, pos.ToFloat2(), wr.Palette("effect"), (int)pos.Y); } } diff --git a/OpenRA.Mods.RA/Effects/TeslaZap.cs b/OpenRA.Mods.RA/Effects/TeslaZap.cs index 4df7ca777f..74e0fd1707 100755 --- a/OpenRA.Mods.RA/Effects/TeslaZap.cs +++ b/OpenRA.Mods.RA/Effects/TeslaZap.cs @@ -137,14 +137,14 @@ namespace OpenRA.Mods.RA.Effects static int[][] steps = new [] { - new int[] { 8, 8, -8, -8, 0 }, - new int[] { -8, -8, -16, -16, 0 }, - new int[] { 8, 0, -8, -8, 1 }, - new int[] { -8, 0, -16, -8, 1 }, - new int[] { 0, 8, -8, -8, 2 }, - new int[] { 0, -8, -8, -16, 2 }, - new int[] { -8, 8, -16, -8, 3 }, - new int[] { 8, -8, -8, -16, 3 } + new int[] { 8, 8, 4, 4, 0 }, + new int[] { -8, -8, -4, -4, 0 }, + new int[] { 8, 0, 4, 4, 1 }, + new int[] { -8, 0, -4, 4, 1 }, + new int[] { 0, 8, 4, 4, 2 }, + new int[] { 0, -8, 4, -4, 2 }, + new int[] { -8, 8, -4, 4, 3 }, + new int[] { 8, -8, 4, -4, 3 } }; } } diff --git a/OpenRA.Mods.RA/GainsExperience.cs b/OpenRA.Mods.RA/GainsExperience.cs index cf9be1c4ec..a646756f6c 100644 --- a/OpenRA.Mods.RA/GainsExperience.cs +++ b/OpenRA.Mods.RA/GainsExperience.cs @@ -118,8 +118,8 @@ namespace OpenRA.Mods.RA yield break; var bounds = self.Bounds.Value; - yield return new Renderable(RankAnim.Image, new float2(bounds.Right - 6, bounds.Bottom - 8), - wr.Palette("effect"), self.CenterLocation.Y); + var pos = new float2(bounds.Right, bounds.Bottom - 2); + yield return new Renderable(RankAnim.Image, pos, wr.Palette("effect"), self.CenterLocation.Y); } } diff --git a/OpenRA.Mods.RA/Render/RenderBuilding.cs b/OpenRA.Mods.RA/Render/RenderBuilding.cs index e45ea9b3b5..c11119508e 100755 --- a/OpenRA.Mods.RA/Render/RenderBuilding.cs +++ b/OpenRA.Mods.RA/Render/RenderBuilding.cs @@ -27,8 +27,8 @@ namespace OpenRA.Mods.RA.Render public override IEnumerable RenderPreview(ActorInfo building, PaletteReference pr) { - return base.RenderPreview(building, pr) - .Select(a => a.WithPxOffset(building.Traits.Get().Origin)); + var origin = building.Traits.Get().Origin; + return base.RenderPreview(building, pr).Select(a => a.WithPxOffset(origin)); } public void Render(WorldRenderer wr, World w, ActorInfo ai, PPos centerLocation) diff --git a/OpenRA.Mods.RA/Render/RenderBuildingWarFactory.cs b/OpenRA.Mods.RA/Render/RenderBuildingWarFactory.cs index aba2eb45cb..808814c5f8 100755 --- a/OpenRA.Mods.RA/Render/RenderBuildingWarFactory.cs +++ b/OpenRA.Mods.RA/Render/RenderBuildingWarFactory.cs @@ -34,8 +34,7 @@ namespace OpenRA.Mods.RA.Render var anim = new Animation(RenderSimple.GetImage(building), () => 0); anim.PlayRepeating("idle-top"); var rb = building.Traits.Get(); - yield return new Renderable(anim.Image, rb.Origin + 0.5f*anim.Image.size*(1 - Scale), - pr, 0, Scale); + yield return new Renderable(anim.Image, 0.5f*anim.Image.size + rb.Origin, pr, 0, Scale); } }