From 805b4b6258072afc4599b033897b42a10e2aa00f Mon Sep 17 00:00:00 2001 From: Paul Chote Date: Sat, 3 Aug 2013 11:16:52 +1200 Subject: [PATCH 1/2] Change IRenderable.WithPos -> OffsetBy. This is more appropriate for the actual use cases. Fixes #3621. --- OpenRA.Game/Graphics/BeamRenderable.cs | 2 +- OpenRA.Game/Graphics/ContrailRenderable.cs | 3 ++- OpenRA.Game/Graphics/Renderable.cs | 5 +++-- OpenRA.Game/Graphics/TextRenderable.cs | 2 +- OpenRA.Game/Graphics/VoxelRenderable.cs | 4 ++-- OpenRA.Mods.Cnc/WithCargo.cs | 2 +- OpenRA.Mods.RA/Effects/Parachute.cs | 2 +- OpenRA.Mods.RA/Orders/PlaceBuildingOrderGenerator.cs | 2 +- OpenRA.Mods.RA/Render/WithShadow.cs | 5 +++-- OpenRA.Mods.RA/SupportPowers/ChronoshiftPower.cs | 2 +- OpenRA.Mods.RA/TeslaZapRenderable.cs | 4 ++-- 11 files changed, 18 insertions(+), 15 deletions(-) diff --git a/OpenRA.Game/Graphics/BeamRenderable.cs b/OpenRA.Game/Graphics/BeamRenderable.cs index 49bf882792..7aa3c23955 100644 --- a/OpenRA.Game/Graphics/BeamRenderable.cs +++ b/OpenRA.Game/Graphics/BeamRenderable.cs @@ -38,7 +38,7 @@ namespace OpenRA.Graphics public IRenderable WithScale(float newScale) { return new BeamRenderable(pos, zOffset, length, width, color); } public IRenderable WithPalette(PaletteReference newPalette) { return new BeamRenderable(pos, zOffset, length, width, color); } public IRenderable WithZOffset(int newOffset) { return new BeamRenderable(pos, zOffset, length, width, color); } - public IRenderable WithPos(WPos pos) { return new BeamRenderable(pos, zOffset, length, width, color); } + public IRenderable OffsetBy(WVec vec) { return new BeamRenderable(pos + vec, zOffset, length, width, color); } public void BeforeRender(WorldRenderer wr) {} public void Render(WorldRenderer wr) diff --git a/OpenRA.Game/Graphics/ContrailRenderable.cs b/OpenRA.Game/Graphics/ContrailRenderable.cs index a33cedd6b2..2569433f74 100644 --- a/OpenRA.Game/Graphics/ContrailRenderable.cs +++ b/OpenRA.Game/Graphics/ContrailRenderable.cs @@ -11,6 +11,7 @@ using System; using System.Collections.Generic; using System.Drawing; +using System.Linq; namespace OpenRA.Graphics { @@ -49,7 +50,7 @@ namespace OpenRA.Graphics public IRenderable WithScale(float newScale) { return new ContrailRenderable(world, (WPos[])trail.Clone(), next, length, skip, color, zOffset); } public IRenderable WithPalette(PaletteReference newPalette) { return new ContrailRenderable(world, (WPos[])trail.Clone(), next, length, skip, color, zOffset); } public IRenderable WithZOffset(int newOffset) { return new ContrailRenderable(world, (WPos[])trail.Clone(), next, length, skip, color, newOffset); } - public IRenderable WithPos(WPos pos) { return new ContrailRenderable(world, (WPos[])trail.Clone(), next, length, skip, color, zOffset); } + public IRenderable OffsetBy(WVec vec) { return new ContrailRenderable(world, trail.Select(pos => pos + vec).ToArray(), next, length, skip, color, zOffset); } public void BeforeRender(WorldRenderer wr) {} public void Render(WorldRenderer wr) diff --git a/OpenRA.Game/Graphics/Renderable.cs b/OpenRA.Game/Graphics/Renderable.cs index 13e48737e2..d656312883 100644 --- a/OpenRA.Game/Graphics/Renderable.cs +++ b/OpenRA.Game/Graphics/Renderable.cs @@ -40,7 +40,7 @@ namespace OpenRA.Graphics IRenderable WithScale(float newScale); IRenderable WithPalette(PaletteReference newPalette); IRenderable WithZOffset(int newOffset); - IRenderable WithPos(WPos pos); + IRenderable OffsetBy(WVec offset); void BeforeRender(WorldRenderer wr); void Render(WorldRenderer wr); void RenderDebugGeometry(WorldRenderer wr); @@ -75,6 +75,7 @@ namespace OpenRA.Graphics : this(sprite, new PPos((int)pos.X, (int)pos.Y).ToWPos(0), z, palette, 1f) { } public WPos Pos { get { return pos + offset; } } + public WVec Offset { get { return offset; } } public float Scale { get { return scale; } } public PaletteReference Palette { get { return palette; } } public int ZOffset { get { return zOffset; } } @@ -82,7 +83,7 @@ namespace OpenRA.Graphics public IRenderable WithScale(float newScale) { return new SpriteRenderable(sprite, pos, offset, zOffset, palette, newScale); } public IRenderable WithPalette(PaletteReference newPalette) { return new SpriteRenderable(sprite, pos, offset, zOffset, newPalette, scale); } public IRenderable WithZOffset(int newOffset) { return new SpriteRenderable(sprite, pos, offset, newOffset, palette, scale); } - public IRenderable WithPos(WPos pos) { return new SpriteRenderable(sprite, pos, offset, zOffset, palette, scale); } + public IRenderable OffsetBy(WVec vec) { return new SpriteRenderable(sprite, pos + vec, offset, zOffset, palette, scale); } float2 ScreenPosition(WorldRenderer wr) { diff --git a/OpenRA.Game/Graphics/TextRenderable.cs b/OpenRA.Game/Graphics/TextRenderable.cs index aca97cba9f..3c169d4a69 100644 --- a/OpenRA.Game/Graphics/TextRenderable.cs +++ b/OpenRA.Game/Graphics/TextRenderable.cs @@ -39,7 +39,7 @@ namespace OpenRA.Graphics public IRenderable WithScale(float newScale) { return new TextRenderable(font, pos, zOffset, color, text); } public IRenderable WithPalette(PaletteReference newPalette) { return new TextRenderable(font, pos, zOffset, color, text); } public IRenderable WithZOffset(int newOffset) { return new TextRenderable(font, pos, zOffset, color, text); } - public IRenderable WithPos(WPos pos) { return new TextRenderable(font, pos, zOffset, color, text); } + public IRenderable OffsetBy(WVec vec) { return new TextRenderable(font, pos + vec, zOffset, color, text); } public void BeforeRender(WorldRenderer wr) {} public void Render(WorldRenderer wr) diff --git a/OpenRA.Game/Graphics/VoxelRenderable.cs b/OpenRA.Game/Graphics/VoxelRenderable.cs index 525b7161c3..70d0635ba1 100644 --- a/OpenRA.Game/Graphics/VoxelRenderable.cs +++ b/OpenRA.Game/Graphics/VoxelRenderable.cs @@ -76,9 +76,9 @@ namespace OpenRA.Graphics palette, normalsPalette, shadowPalette); } - public IRenderable WithPos(WPos newPos) + public IRenderable OffsetBy(WVec vec) { - return new VoxelRenderable(voxels, newPos, zOffset, camera, scale, + return new VoxelRenderable(voxels, pos + vec, zOffset, camera, scale, lightSource, lightAmbientColor, lightDiffuseColor, palette, normalsPalette, shadowPalette); } diff --git a/OpenRA.Mods.Cnc/WithCargo.cs b/OpenRA.Mods.Cnc/WithCargo.cs index 9fdd3258ba..2379fd057b 100644 --- a/OpenRA.Mods.Cnc/WithCargo.cs +++ b/OpenRA.Mods.Cnc/WithCargo.cs @@ -70,7 +70,7 @@ namespace OpenRA.Mods.Cnc { var offset = pos - c.CenterPosition + body.LocalToWorld(positions[i++ % positions.Length].Rotate(bodyOrientation)); foreach (var cr in c.Render(wr)) - yield return cr.WithPos(cr.Pos + offset).WithZOffset(1); + yield return cr.OffsetBy(offset).WithZOffset(1); } } } diff --git a/OpenRA.Mods.RA/Effects/Parachute.cs b/OpenRA.Mods.RA/Effects/Parachute.cs index e705d939e5..2a94bf07d8 100644 --- a/OpenRA.Mods.RA/Effects/Parachute.cs +++ b/OpenRA.Mods.RA/Effects/Parachute.cs @@ -73,7 +73,7 @@ namespace OpenRA.Mods.RA.Effects foreach (var c in rc) { yield return c.WithPalette(shadow).WithZOffset(-1); - yield return c.WithPos(pos); + yield return c.OffsetBy(pos - c.Pos); } foreach (var r in paraAnim.Render(pos, parachuteOffset, 1, rc.First().Palette, 1f)) diff --git a/OpenRA.Mods.RA/Orders/PlaceBuildingOrderGenerator.cs b/OpenRA.Mods.RA/Orders/PlaceBuildingOrderGenerator.cs index 2f967da253..2954df5ce7 100755 --- a/OpenRA.Mods.RA/Orders/PlaceBuildingOrderGenerator.cs +++ b/OpenRA.Mods.RA/Orders/PlaceBuildingOrderGenerator.cs @@ -100,7 +100,7 @@ namespace OpenRA.Mods.RA.Orders var offset = topLeft.CenterPosition + FootprintUtils.CenterOffset(BuildingInfo) - WPos.Zero; foreach (var r in preview) - r.WithPos(r.Pos + offset).Render(wr); + r.OffsetBy(offset).Render(wr); var res = world.WorldActor.Trait(); var isCloseEnough = BuildingInfo.IsCloseEnoughToBase(world, world.LocalPlayer, Building, topLeft); diff --git a/OpenRA.Mods.RA/Render/WithShadow.cs b/OpenRA.Mods.RA/Render/WithShadow.cs index 6cde2c7c3c..a0b4c77920 100644 --- a/OpenRA.Mods.RA/Render/WithShadow.cs +++ b/OpenRA.Mods.RA/Render/WithShadow.cs @@ -31,10 +31,11 @@ namespace OpenRA.Mods.RA.Render ? (int)Math.Abs((self.ActorID + Game.LocalTick) / 5 % 4 - 1) - 1 : 0; var shadowSprites = r.Select(a => a.WithPalette(wr.Palette("shadow")) - .WithPos(a.Pos - new WVec(0, 0, a.Pos.Z)).WithZOffset(a.ZOffset + a.Pos.Z)); + .OffsetBy(new WVec(0, 0, -a.Pos.Z)).WithZOffset(a.ZOffset + a.Pos.Z)); + var worldVisualOffset = new WVec(0,0,-43*visualOffset); var flyingSprites = !flying ? r : - r.Select(a => a.WithPos(a.Pos - new WVec(0,0,43*visualOffset))); + r.Select(a => a.OffsetBy(worldVisualOffset)); return shadowSprites.Concat(flyingSprites); } diff --git a/OpenRA.Mods.RA/SupportPowers/ChronoshiftPower.cs b/OpenRA.Mods.RA/SupportPowers/ChronoshiftPower.cs index 7b63802360..22e74e5be5 100755 --- a/OpenRA.Mods.RA/SupportPowers/ChronoshiftPower.cs +++ b/OpenRA.Mods.RA/SupportPowers/ChronoshiftPower.cs @@ -247,7 +247,7 @@ namespace OpenRA.Mods.RA var offset = (xy - sourceLocation).ToWVec(); if (manager.self.Owner.Shroud.IsTargetable(unit)) foreach (var r in unit.Render(wr)) - r.WithPos(r.Pos + offset).Render(wr); + r.OffsetBy(offset).Render(wr); } // Unit tiles diff --git a/OpenRA.Mods.RA/TeslaZapRenderable.cs b/OpenRA.Mods.RA/TeslaZapRenderable.cs index 0e6d883147..27c0bb04f1 100755 --- a/OpenRA.Mods.RA/TeslaZapRenderable.cs +++ b/OpenRA.Mods.RA/TeslaZapRenderable.cs @@ -64,8 +64,8 @@ namespace OpenRA.Mods.RA public IRenderable WithScale(float newScale) { return new TeslaZapRenderable(pos, zOffset, length, image, brightZaps, dimZaps); } public IRenderable WithPalette(PaletteReference newPalette) { return new TeslaZapRenderable(pos, zOffset, length, image, brightZaps, dimZaps); } public IRenderable WithZOffset(int newOffset) { return new TeslaZapRenderable(pos, zOffset, length, image, brightZaps, dimZaps); } - public IRenderable WithPos(WPos pos) { return new TeslaZapRenderable(pos, zOffset, length, image, brightZaps, dimZaps); } - + public IRenderable OffsetBy(WVec vec) { return new TeslaZapRenderable(pos + vec, zOffset, length, image, brightZaps, dimZaps); } + public void BeforeRender(WorldRenderer wr) { } public void RenderDebugGeometry(WorldRenderer wr) { } public void Render(WorldRenderer wr) From a5452594543f5d72ce8847d58435621faf5f1a69 Mon Sep 17 00:00:00 2001 From: Paul Chote Date: Sat, 3 Aug 2013 11:20:26 +1200 Subject: [PATCH 2/2] Don't render contrail shadows. --- OpenRA.Mods.RA/Render/WithShadow.cs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/OpenRA.Mods.RA/Render/WithShadow.cs b/OpenRA.Mods.RA/Render/WithShadow.cs index a0b4c77920..96b6ee3d9e 100644 --- a/OpenRA.Mods.RA/Render/WithShadow.cs +++ b/OpenRA.Mods.RA/Render/WithShadow.cs @@ -30,7 +30,9 @@ namespace OpenRA.Mods.RA.Render var visualOffset = (ios is Helicopter && flying) ? (int)Math.Abs((self.ActorID + Game.LocalTick) / 5 % 4 - 1) - 1 : 0; - var shadowSprites = r.Select(a => a.WithPalette(wr.Palette("shadow")) + // Contrails shouldn't cast shadows + var shadowSprites = r.Where(s => !(s is ContrailRenderable)) + .Select(a => a.WithPalette(wr.Palette("shadow")) .OffsetBy(new WVec(0, 0, -a.Pos.Z)).WithZOffset(a.ZOffset + a.Pos.Z)); var worldVisualOffset = new WVec(0,0,-43*visualOffset);