diff --git a/OpenRA.Mods.Common/Graphics/SpriteActorPreview.cs b/OpenRA.Mods.Common/Graphics/SpriteActorPreview.cs index 87887eb1c6..36e2f87653 100644 --- a/OpenRA.Mods.Common/Graphics/SpriteActorPreview.cs +++ b/OpenRA.Mods.Common/Graphics/SpriteActorPreview.cs @@ -9,6 +9,7 @@ */ #endregion +using System; using System.Collections.Generic; using OpenRA.Graphics; @@ -17,12 +18,12 @@ namespace OpenRA.Mods.Common.Graphics public class SpriteActorPreview : IActorPreview { readonly Animation animation; - readonly WVec offset; - readonly int zOffset; + readonly Func offset; + readonly Func zOffset; readonly PaletteReference pr; readonly float scale; - public SpriteActorPreview(Animation animation, WVec offset, int zOffset, PaletteReference pr, float scale) + public SpriteActorPreview(Animation animation, Func offset, Func zOffset, PaletteReference pr, float scale) { this.animation = animation; this.offset = offset; @@ -35,7 +36,7 @@ namespace OpenRA.Mods.Common.Graphics public IEnumerable Render(WorldRenderer wr, WPos pos) { - return animation.Render(pos, offset, zOffset, pr, scale); + return animation.Render(pos, offset(), zOffset(), pr, scale); } } } diff --git a/OpenRA.Mods.Common/Traits/Buildings/Bib.cs b/OpenRA.Mods.Common/Traits/Buildings/Bib.cs index 18b8009680..12adfbb4e2 100644 --- a/OpenRA.Mods.Common/Traits/Buildings/Bib.cs +++ b/OpenRA.Mods.Common/Traits/Buildings/Bib.cs @@ -61,7 +61,7 @@ namespace OpenRA.Mods.Common.Traits // Z-order is one set to the top of the footprint var offset = map.CenterOfCell(cell) - map.CenterOfCell(location) - centerOffset; - yield return new SpriteActorPreview(anim, offset, -(offset.Y + centerOffset.Y + 512), p, rs.Scale); + yield return new SpriteActorPreview(anim, () => offset, () => -(offset.Y + centerOffset.Y + 512), p, rs.Scale); } } } diff --git a/OpenRA.Mods.Common/Traits/Render/RenderVoxels.cs b/OpenRA.Mods.Common/Traits/Render/RenderVoxels.cs index b427ec0d70..99d316fd6b 100644 --- a/OpenRA.Mods.Common/Traits/Render/RenderVoxels.cs +++ b/OpenRA.Mods.Common/Traits/Render/RenderVoxels.cs @@ -9,6 +9,7 @@ */ #endregion +using System; using System.Collections.Generic; using System.Linq; using OpenRA.Graphics; @@ -20,7 +21,7 @@ namespace OpenRA.Mods.Common.Traits.Render public interface IRenderActorPreviewVoxelsInfo : ITraitInfo { IEnumerable RenderPreviewVoxels( - ActorPreviewInitializer init, RenderVoxelsInfo rv, string image, WRot orientation, int facings, PaletteReference p); + ActorPreviewInitializer init, RenderVoxelsInfo rv, string image, Func orientation, int facings, PaletteReference p); } public class RenderVoxelsInfo : ITraitInfo, IRenderActorPreviewInfo, Requires @@ -62,7 +63,7 @@ namespace OpenRA.Mods.Common.Traits.Render var facing = ifacing != null ? init.Contains() ? init.Get() : ifacing.GetInitialFacing() : 0; var orientation = WRot.FromFacing(facing); var components = init.Actor.TraitInfos() - .SelectMany(rvpi => rvpi.RenderPreviewVoxels(init, this, image, orientation, facings, palette)) + .SelectMany(rvpi => rvpi.RenderPreviewVoxels(init, this, image, () => orientation, facings, palette)) .ToArray(); yield return new VoxelPreview(components, WVec.Zero, 0, Scale, LightPitch, diff --git a/OpenRA.Mods.Common/Traits/Render/WithCrateBody.cs b/OpenRA.Mods.Common/Traits/Render/WithCrateBody.cs index 2e3907eefc..9d91c3bcea 100644 --- a/OpenRA.Mods.Common/Traits/Render/WithCrateBody.cs +++ b/OpenRA.Mods.Common/Traits/Render/WithCrateBody.cs @@ -34,7 +34,7 @@ namespace OpenRA.Mods.Common.Traits.Render { var anim = new Animation(init.World, rs.Image, () => 0); anim.PlayRepeating(RenderSprites.NormalizeSequence(anim, init.GetDamageState(), IdleSequence)); - yield return new SpriteActorPreview(anim, WVec.Zero, 0, p, rs.Scale); + yield return new SpriteActorPreview(anim, () => WVec.Zero, () => 0, p, rs.Scale); } } diff --git a/OpenRA.Mods.Common/Traits/Render/WithFacingSpriteBody.cs b/OpenRA.Mods.Common/Traits/Render/WithFacingSpriteBody.cs index 822c6826a0..4e1153704f 100644 --- a/OpenRA.Mods.Common/Traits/Render/WithFacingSpriteBody.cs +++ b/OpenRA.Mods.Common/Traits/Render/WithFacingSpriteBody.cs @@ -28,7 +28,7 @@ namespace OpenRA.Mods.Common.Traits.Render var anim = new Animation(init.World, image, () => facing); anim.PlayRepeating(RenderSprites.NormalizeSequence(anim, init.GetDamageState(), Sequence)); - yield return new SpriteActorPreview(anim, WVec.Zero, 0, p, rs.Scale); + yield return new SpriteActorPreview(anim, () => WVec.Zero, () => 0, p, rs.Scale); } } diff --git a/OpenRA.Mods.Common/Traits/Render/WithGateSpriteBody.cs b/OpenRA.Mods.Common/Traits/Render/WithGateSpriteBody.cs index c790acbf71..46ef57395e 100644 --- a/OpenRA.Mods.Common/Traits/Render/WithGateSpriteBody.cs +++ b/OpenRA.Mods.Common/Traits/Render/WithGateSpriteBody.cs @@ -33,7 +33,7 @@ namespace OpenRA.Mods.Common.Traits.Render var anim = new Animation(init.World, image); anim.PlayFetchIndex(RenderSprites.NormalizeSequence(anim, init.GetDamageState(), Sequence), () => 0); - yield return new SpriteActorPreview(anim, WVec.Zero, 0, p, rs.Scale); + yield return new SpriteActorPreview(anim, () => WVec.Zero, () => 0, p, rs.Scale); } string IWallConnectorInfo.GetWallConnectionType() diff --git a/OpenRA.Mods.Common/Traits/Render/WithIdleOverlay.cs b/OpenRA.Mods.Common/Traits/Render/WithIdleOverlay.cs index 7a7c4399a2..d891528424 100644 --- a/OpenRA.Mods.Common/Traits/Render/WithIdleOverlay.cs +++ b/OpenRA.Mods.Common/Traits/Render/WithIdleOverlay.cs @@ -51,9 +51,10 @@ namespace OpenRA.Mods.Common.Traits.Render var anim = new Animation(init.World, image, () => facing); anim.PlayRepeating(RenderSprites.NormalizeSequence(anim, init.GetDamageState(), Sequence)); - var orientation = body.QuantizeOrientation(new WRot(WAngle.Zero, WAngle.Zero, WAngle.FromFacing(facing)), facings); + var orientation = body.QuantizeOrientation(WRot.FromFacing(facing), facings); var offset = body.LocalToWorld(Offset.Rotate(orientation)); - yield return new SpriteActorPreview(anim, offset, offset.Y + offset.Z + 1, p, rs.Scale); + var zOffset = offset.Y + offset.Z + 1; + yield return new SpriteActorPreview(anim, () => offset, () => zOffset, p, rs.Scale); } } diff --git a/OpenRA.Mods.Common/Traits/Render/WithInfantryBody.cs b/OpenRA.Mods.Common/Traits/Render/WithInfantryBody.cs index 09f83940eb..aefaceff6b 100644 --- a/OpenRA.Mods.Common/Traits/Render/WithInfantryBody.cs +++ b/OpenRA.Mods.Common/Traits/Render/WithInfantryBody.cs @@ -38,7 +38,7 @@ namespace OpenRA.Mods.Common.Traits.Render var anim = new Animation(init.World, image, () => facing); anim.PlayRepeating(RenderSprites.NormalizeSequence(anim, init.GetDamageState(), StandSequences.First())); - yield return new SpriteActorPreview(anim, WVec.Zero, 0, p, rs.Scale); + yield return new SpriteActorPreview(anim, () => WVec.Zero, () => 0, p, rs.Scale); } } diff --git a/OpenRA.Mods.Common/Traits/Render/WithParachute.cs b/OpenRA.Mods.Common/Traits/Render/WithParachute.cs index b72335e36d..fdc8a3547c 100644 --- a/OpenRA.Mods.Common/Traits/Render/WithParachute.cs +++ b/OpenRA.Mods.Common/Traits/Render/WithParachute.cs @@ -73,9 +73,10 @@ namespace OpenRA.Mods.Common.Traits.Render var body = init.Actor.TraitInfo(); var facing = init.Contains() ? init.Get() : 0; - var orientation = body.QuantizeOrientation(new WRot(WAngle.Zero, WAngle.Zero, WAngle.FromFacing(facing)), facings); + var orientation = body.QuantizeOrientation(WRot.FromFacing(facing), facings); var offset = body.LocalToWorld(Offset.Rotate(orientation)); - yield return new SpriteActorPreview(anim, offset, offset.Y + offset.Z + 1, p, rs.Scale); + var zOffset = offset.Y + offset.Z + 1; + yield return new SpriteActorPreview(anim, () => offset, () => zOffset, p, rs.Scale); } } diff --git a/OpenRA.Mods.Common/Traits/Render/WithProductionDoorOverlay.cs b/OpenRA.Mods.Common/Traits/Render/WithProductionDoorOverlay.cs index 85f5d1525c..057caa2981 100644 --- a/OpenRA.Mods.Common/Traits/Render/WithProductionDoorOverlay.cs +++ b/OpenRA.Mods.Common/Traits/Render/WithProductionDoorOverlay.cs @@ -31,7 +31,7 @@ namespace OpenRA.Mods.Common.Traits.Render var bi = init.Actor.TraitInfo(); var offset = FootprintUtils.CenterOffset(init.World, bi).Y + 512; // Additional 512 units move from center -> top of cell - yield return new SpriteActorPreview(anim, WVec.Zero, offset, p, rs.Scale); + yield return new SpriteActorPreview(anim, () => WVec.Zero, () => offset, p, rs.Scale); } } diff --git a/OpenRA.Mods.Common/Traits/Render/WithSpriteBarrel.cs b/OpenRA.Mods.Common/Traits/Render/WithSpriteBarrel.cs index 846adb5895..f3d2eee845 100644 --- a/OpenRA.Mods.Common/Traits/Render/WithSpriteBarrel.cs +++ b/OpenRA.Mods.Common/Traits/Render/WithSpriteBarrel.cs @@ -9,6 +9,7 @@ */ #endregion +using System; using System.Collections.Generic; using System.Linq; using OpenRA.Graphics; @@ -46,10 +47,15 @@ namespace OpenRA.Mods.Common.Traits.Render var anim = new Animation(init.World, image, () => t.InitialFacing); anim.Play(RenderSprites.NormalizeSequence(anim, init.GetDamageState(), Sequence)); - var turretOrientation = body.QuantizeOrientation(new WRot(WAngle.Zero, WAngle.Zero, WAngle.FromFacing(t.InitialFacing)), facings); - var turretOffset = body.LocalToWorld(t.Offset.Rotate(turretOrientation)); + var turretOrientation = body.QuantizeOrientation(WRot.FromFacing(t.InitialFacing), facings); + Func turretOffset = () => body.LocalToWorld(t.Offset.Rotate(turretOrientation)); + Func zOffset = () => + { + var tmpOffset = turretOffset(); + return tmpOffset.Y + tmpOffset.Z; + }; - yield return new SpriteActorPreview(anim, turretOffset, turretOffset.Y + turretOffset.Z, p, rs.Scale); + yield return new SpriteActorPreview(anim, turretOffset, zOffset, p, rs.Scale); } } diff --git a/OpenRA.Mods.Common/Traits/Render/WithSpriteBody.cs b/OpenRA.Mods.Common/Traits/Render/WithSpriteBody.cs index 29c15c93b0..4fc235c0bc 100644 --- a/OpenRA.Mods.Common/Traits/Render/WithSpriteBody.cs +++ b/OpenRA.Mods.Common/Traits/Render/WithSpriteBody.cs @@ -39,7 +39,7 @@ namespace OpenRA.Mods.Common.Traits.Render var anim = new Animation(init.World, image); anim.PlayRepeating(RenderSprites.NormalizeSequence(anim, init.GetDamageState(), Sequence)); - yield return new SpriteActorPreview(anim, WVec.Zero, 0, p, rs.Scale); + yield return new SpriteActorPreview(anim, () => WVec.Zero, () => 0, p, rs.Scale); } } diff --git a/OpenRA.Mods.Common/Traits/Render/WithSpriteTurret.cs b/OpenRA.Mods.Common/Traits/Render/WithSpriteTurret.cs index 5bab25f9cf..5158f0cb4f 100644 --- a/OpenRA.Mods.Common/Traits/Render/WithSpriteTurret.cs +++ b/OpenRA.Mods.Common/Traits/Render/WithSpriteTurret.cs @@ -51,9 +51,10 @@ namespace OpenRA.Mods.Common.Traits.Render var anim = new Animation(init.World, image, () => turretFacing); anim.Play(RenderSprites.NormalizeSequence(anim, init.GetDamageState(), Sequence)); - var orientation = body.QuantizeOrientation(new WRot(WAngle.Zero, WAngle.Zero, WAngle.FromFacing(bodyFacing)), facings); + var orientation = body.QuantizeOrientation(WRot.FromFacing(bodyFacing), facings); var offset = body.LocalToWorld(t.Offset.Rotate(orientation)); - yield return new SpriteActorPreview(anim, offset, -(offset.Y + offset.Z) + 1, p, rs.Scale); + var zOffset = -(offset.Y + offset.Z) + 1; + yield return new SpriteActorPreview(anim, () => offset, () => zOffset, p, rs.Scale); } } diff --git a/OpenRA.Mods.Common/Traits/Render/WithTurretedSpriteBody.cs b/OpenRA.Mods.Common/Traits/Render/WithTurretedSpriteBody.cs index d77eaef1d6..2c90b53b6d 100644 --- a/OpenRA.Mods.Common/Traits/Render/WithTurretedSpriteBody.cs +++ b/OpenRA.Mods.Common/Traits/Render/WithTurretedSpriteBody.cs @@ -32,7 +32,7 @@ namespace OpenRA.Mods.Common.Traits.Render var anim = new Animation(init.World, image, () => t.InitialFacing); anim.PlayRepeating(RenderSprites.NormalizeSequence(anim, init.GetDamageState(), wsb.Sequence)); - yield return new SpriteActorPreview(anim, WVec.Zero, 0, p, rs.Scale); + yield return new SpriteActorPreview(anim, () => WVec.Zero, () => 0, p, rs.Scale); } } diff --git a/OpenRA.Mods.Common/Traits/Render/WithVoxelBarrel.cs b/OpenRA.Mods.Common/Traits/Render/WithVoxelBarrel.cs index fc2593d944..73059f38cb 100644 --- a/OpenRA.Mods.Common/Traits/Render/WithVoxelBarrel.cs +++ b/OpenRA.Mods.Common/Traits/Render/WithVoxelBarrel.cs @@ -9,6 +9,7 @@ */ #endregion +using System; using System.Collections.Generic; using System.Linq; using OpenRA.Graphics; @@ -30,7 +31,8 @@ namespace OpenRA.Mods.Common.Traits.Render public override object Create(ActorInitializer init) { return new WithVoxelBarrel(init.Self, this); } - public IEnumerable RenderPreviewVoxels(ActorPreviewInitializer init, RenderVoxelsInfo rv, string image, WRot orientation, int facings, PaletteReference p) + public IEnumerable RenderPreviewVoxels( + ActorPreviewInitializer init, RenderVoxelsInfo rv, string image, Func orientation, int facings, PaletteReference p) { if (UpgradeMinEnabledLevel > 0) yield break; @@ -44,13 +46,13 @@ namespace OpenRA.Mods.Common.Traits.Render var voxel = VoxelProvider.GetVoxel(image, Sequence); var turretFacing = Turreted.GetInitialTurretFacing(init, t.InitialFacing, t.Turret); - var turretOrientation = body.QuantizeOrientation(new WRot(WAngle.Zero, WAngle.Zero, WAngle.FromFacing(turretFacing) - orientation.Yaw), facings); + Func turretOrientation = () => body.QuantizeOrientation(WRot.FromYaw(WAngle.FromFacing(turretFacing) - orientation().Yaw), facings); - var quantizedTurret = body.QuantizeOrientation(turretOrientation, facings); - var quantizedBody = body.QuantizeOrientation(orientation, facings); - var barrelOffset = body.LocalToWorld((t.Offset + LocalOffset.Rotate(quantizedTurret)).Rotate(quantizedBody)); + Func quantizedTurret = () => body.QuantizeOrientation(turretOrientation(), facings); + Func quantizedBody = () => body.QuantizeOrientation(orientation(), facings); + Func barrelOffset = () => body.LocalToWorld((t.Offset + LocalOffset.Rotate(quantizedTurret())).Rotate(quantizedBody())); - yield return new VoxelAnimation(voxel, () => barrelOffset, () => new[] { turretOrientation, orientation }, + yield return new VoxelAnimation(voxel, barrelOffset, () => new[] { turretOrientation(), orientation() }, () => false, () => 0); } } diff --git a/OpenRA.Mods.Common/Traits/Render/WithVoxelBody.cs b/OpenRA.Mods.Common/Traits/Render/WithVoxelBody.cs index 39969a9ccf..7150204052 100644 --- a/OpenRA.Mods.Common/Traits/Render/WithVoxelBody.cs +++ b/OpenRA.Mods.Common/Traits/Render/WithVoxelBody.cs @@ -25,13 +25,13 @@ namespace OpenRA.Mods.Common.Traits.Render public override object Create(ActorInitializer init) { return new WithVoxelBody(init.Self, this); } - public IEnumerable RenderPreviewVoxels(ActorPreviewInitializer init, RenderVoxelsInfo rv, string image, WRot orientation, int facings, PaletteReference p) + public IEnumerable RenderPreviewVoxels( + ActorPreviewInitializer init, RenderVoxelsInfo rv, string image, Func orientation, int facings, PaletteReference p) { var body = init.Actor.TraitInfo(); var voxel = VoxelProvider.GetVoxel(image, "idle"); - var bodyOrientation = new[] { body.QuantizeOrientation(orientation, facings) }; yield return new VoxelAnimation(voxel, () => WVec.Zero, - () => bodyOrientation, + () => new[] { body.QuantizeOrientation(orientation(), facings) }, () => false, () => 0); } } diff --git a/OpenRA.Mods.Common/Traits/Render/WithVoxelTurret.cs b/OpenRA.Mods.Common/Traits/Render/WithVoxelTurret.cs index 4aacaeeab4..b645aa01f5 100644 --- a/OpenRA.Mods.Common/Traits/Render/WithVoxelTurret.cs +++ b/OpenRA.Mods.Common/Traits/Render/WithVoxelTurret.cs @@ -9,6 +9,7 @@ */ #endregion +using System; using System.Collections.Generic; using System.Linq; using OpenRA.Graphics; @@ -27,7 +28,8 @@ namespace OpenRA.Mods.Common.Traits.Render public override object Create(ActorInitializer init) { return new WithVoxelTurret(init.Self, this); } - public IEnumerable RenderPreviewVoxels(ActorPreviewInitializer init, RenderVoxelsInfo rv, string image, WRot orientation, int facings, PaletteReference p) + public IEnumerable RenderPreviewVoxels( + ActorPreviewInitializer init, RenderVoxelsInfo rv, string image, Func orientation, int facings, PaletteReference p) { if (UpgradeMinEnabledLevel > 0) yield break; @@ -37,12 +39,12 @@ namespace OpenRA.Mods.Common.Traits.Render .First(tt => tt.Turret == Turret); var voxel = VoxelProvider.GetVoxel(image, Sequence); - var turretOffset = body.LocalToWorld(t.Offset.Rotate(orientation)); + Func turretOffset = () => body.LocalToWorld(t.Offset.Rotate(orientation())); var turretFacing = Turreted.GetInitialTurretFacing(init, t.InitialFacing, Turret); - var turretBodyOrientation = new WRot(WAngle.Zero, WAngle.Zero, WAngle.FromFacing(turretFacing) - orientation.Yaw); - var turretOrientation = new[] { turretBodyOrientation, body.QuantizeOrientation(orientation, facings) }; - yield return new VoxelAnimation(voxel, () => turretOffset, () => turretOrientation, () => false, () => 0); + Func turretBodyOrientation = () => WRot.FromYaw(WAngle.FromFacing(turretFacing) - orientation().Yaw); + yield return new VoxelAnimation(voxel, turretOffset, + () => new[] { turretBodyOrientation(), body.QuantizeOrientation(orientation(), facings) }, () => false, () => 0); } } diff --git a/OpenRA.Mods.Common/Traits/Render/WithWallSpriteBody.cs b/OpenRA.Mods.Common/Traits/Render/WithWallSpriteBody.cs index 380f616a0e..891e0dcecd 100644 --- a/OpenRA.Mods.Common/Traits/Render/WithWallSpriteBody.cs +++ b/OpenRA.Mods.Common/Traits/Render/WithWallSpriteBody.cs @@ -72,7 +72,7 @@ namespace OpenRA.Mods.Common.Traits.Render var anim = new Animation(init.World, image, () => 0); anim.PlayFetchIndex(RenderSprites.NormalizeSequence(anim, init.GetDamageState(), Sequence), () => adjacent); - yield return new SpriteActorPreview(anim, WVec.Zero, 0, p, rs.Scale); + yield return new SpriteActorPreview(anim, () => WVec.Zero, () => 0, p, rs.Scale); } string IWallConnectorInfo.GetWallConnectionType() diff --git a/OpenRA.Mods.D2k/Traits/SpiceBloom.cs b/OpenRA.Mods.D2k/Traits/SpiceBloom.cs index 1b19a44741..f6ab56f095 100644 --- a/OpenRA.Mods.D2k/Traits/SpiceBloom.cs +++ b/OpenRA.Mods.D2k/Traits/SpiceBloom.cs @@ -60,7 +60,7 @@ namespace OpenRA.Mods.D2k.Traits var anim = new Animation(init.World, image); anim.PlayRepeating(RenderSprites.NormalizeSequence(anim, init.GetDamageState(), GrowthSequences[0])); - yield return new SpriteActorPreview(anim, WVec.Zero, 0, p, rs.Scale); + yield return new SpriteActorPreview(anim, () => WVec.Zero, () => 0, p, rs.Scale); } } diff --git a/OpenRA.Mods.TS/Traits/Render/WithVoxelUnloadBody.cs b/OpenRA.Mods.TS/Traits/Render/WithVoxelUnloadBody.cs index d262896f87..1599672a3e 100644 --- a/OpenRA.Mods.TS/Traits/Render/WithVoxelUnloadBody.cs +++ b/OpenRA.Mods.TS/Traits/Render/WithVoxelUnloadBody.cs @@ -30,12 +30,13 @@ namespace OpenRA.Mods.TS.Traits.Render public object Create(ActorInitializer init) { return new WithVoxelUnloadBody(init.Self, this); } - public IEnumerable RenderPreviewVoxels(ActorPreviewInitializer init, RenderVoxelsInfo rv, string image, WRot orientation, int facings, PaletteReference p) + public IEnumerable RenderPreviewVoxels( + ActorPreviewInitializer init, RenderVoxelsInfo rv, string image, Func orientation, int facings, PaletteReference p) { var body = init.Actor.TraitInfo(); var voxel = VoxelProvider.GetVoxel(image, "idle"); yield return new VoxelAnimation(voxel, () => WVec.Zero, - () => new[] { body.QuantizeOrientation(orientation, facings) }, + () => new[] { body.QuantizeOrientation(orientation(), facings) }, () => false, () => 0); } }