diff --git a/OpenRA.Mods.Common/Graphics/ContrailRenderable.cs b/OpenRA.Mods.Common/Graphics/ContrailRenderable.cs index a397ef9e8e..b4ee1ecdb1 100644 --- a/OpenRA.Mods.Common/Graphics/ContrailRenderable.cs +++ b/OpenRA.Mods.Common/Graphics/ContrailRenderable.cs @@ -21,9 +21,12 @@ namespace OpenRA.Mods.Common.Graphics public int Length => trail.Length; + readonly Actor owner; readonly World world; - readonly Color startcolor; - readonly Color endcolor; + readonly Color startColor; + readonly bool usePlayerStartColor; + readonly Color endColor; + readonly bool usePlayerEndColor; // Store trail positions in a circular buffer readonly WPos[] trail; @@ -33,20 +36,23 @@ namespace OpenRA.Mods.Common.Graphics int length; readonly int skip; - public ContrailRenderable(World world, Color startcolor, Color endcolor, WDist startWidth, WDist endWidth, int length, int skip, int zOffset) - : this(world, new WPos[length], startWidth, endWidth, 0, 0, skip, startcolor, endcolor, zOffset) { } + public ContrailRenderable(World world, Actor owner, Color startcolor, bool usePlayerStartColor, Color endcolor, bool usePlayerEndColor, WDist startWidth, WDist endWidth, int length, int skip, int zOffset) + : this(world, owner, new WPos[length], startWidth, endWidth, 0, 0, skip, startcolor, usePlayerStartColor, endcolor, usePlayerEndColor, zOffset) { } - ContrailRenderable(World world, WPos[] trail, WDist startWidth, WDist endWidth, int next, int length, int skip, Color startcolor, Color endcolor, int zOffset) + ContrailRenderable(World world, Actor owner, WPos[] trail, WDist startWidth, WDist endWidth, int next, int length, int skip, Color startColor, bool usePlayerStartColor, Color endColor, bool usePlayerEndColor, int zOffset) { this.world = world; + this.owner = owner; this.trail = trail; this.startWidth = startWidth; this.endWidth = endWidth; this.next = next; this.length = length; this.skip = skip; - this.startcolor = startcolor; - this.endcolor = endcolor; + this.startColor = startColor; + this.usePlayerStartColor = usePlayerStartColor; + this.usePlayerEndColor = usePlayerEndColor; + this.endColor = endColor; ZOffset = zOffset; } @@ -54,12 +60,12 @@ namespace OpenRA.Mods.Common.Graphics public int ZOffset { get; } public bool IsDecoration => true; - public IRenderable WithZOffset(int newOffset) { return new ContrailRenderable(world, (WPos[])trail.Clone(), startWidth, endWidth, next, length, skip, startcolor, endcolor, newOffset); } + public IRenderable WithZOffset(int newOffset) { return new ContrailRenderable(world, owner, (WPos[])trail.Clone(), startWidth, endWidth, next, length, skip, startColor, usePlayerStartColor, endColor, usePlayerEndColor, newOffset); } public IRenderable OffsetBy(in WVec vec) { // Lambdas can't use 'in' variables, so capture a copy for later var offset = vec; - return new ContrailRenderable(world, trail.Select(pos => pos + offset).ToArray(), startWidth, endWidth, next, length, skip, startcolor, endcolor, ZOffset); + return new ContrailRenderable(world, owner, trail.Select(pos => pos + offset).ToArray(), startWidth, endWidth, next, length, skip, startColor, usePlayerStartColor, endColor, usePlayerEndColor, ZOffset); } public IRenderable AsDecoration() { return this; } @@ -68,7 +74,7 @@ namespace OpenRA.Mods.Common.Graphics public void Render(WorldRenderer wr) { // Note: The length of contrail is now actually the number of the points to draw the contrail - // and we require at least two points to draw a tail + // and we require at least two points to draw a tail. var renderLength = length - skip; if (renderLength <= 1) return; @@ -76,14 +82,22 @@ namespace OpenRA.Mods.Common.Graphics var screenWidth = wr.ScreenVector(new WVec(1, 0, 0))[0]; var wcr = Game.Renderer.WorldRgbaColorRenderer; + var startColor = this.startColor; + if (usePlayerStartColor) + startColor = Color.FromArgb(this.startColor.A, owner.OwnerColor()); + + var endColor = this.endColor; + if (usePlayerEndColor) + endColor = Color.FromArgb(this.endColor.A, owner.OwnerColor()); + // Start of the first line segment is the tail of the list - don't smooth it. var curPos = trail[Index(next - skip - 1)]; - var curColor = startcolor; + var curColor = startColor; for (var i = 1; i < renderLength; i++) { var j = next - skip - 1 - i; - var nextColor = Exts.ColorLerp(i / (renderLength - 1f), startcolor, endcolor); + var nextColor = Exts.ColorLerp(i / (renderLength - 1f), startColor, endColor); var nextX = 0L; var nextY = 0L; diff --git a/OpenRA.Mods.Common/Projectiles/Bullet.cs b/OpenRA.Mods.Common/Projectiles/Bullet.cs index 8cb1ccdd9b..643d5e4e69 100644 --- a/OpenRA.Mods.Common/Projectiles/Bullet.cs +++ b/OpenRA.Mods.Common/Projectiles/Bullet.cs @@ -201,9 +201,14 @@ namespace OpenRA.Mods.Common.Projectiles if (info.ContrailLength > 0) { - var startcolor = info.ContrailStartColorUsePlayerColor ? Color.FromArgb(info.ContrailStartColorAlpha, Player.ActorColor(args.SourceActor)) : Color.FromArgb(info.ContrailStartColorAlpha, info.ContrailStartColor); - var endcolor = info.ContrailEndColorUsePlayerColor ? Color.FromArgb(info.ContrailEndColorAlpha, Player.ActorColor(args.SourceActor)) : Color.FromArgb(info.ContrailEndColorAlpha, info.ContrailEndColor ?? startcolor); - contrail = new ContrailRenderable(world, startcolor, endcolor, info.ContrailStartWidth, info.ContrailEndWidth ?? info.ContrailStartWidth, info.ContrailLength, info.ContrailDelay, info.ContrailZOffset); + var startcolor = Color.FromArgb(info.ContrailStartColorAlpha, info.ContrailStartColor); + var endcolor = Color.FromArgb(info.ContrailEndColorAlpha, info.ContrailEndColor ?? startcolor); + contrail = new ContrailRenderable(world, args.SourceActor, + startcolor, info.ContrailStartColorUsePlayerColor, + endcolor, info.ContrailEndColor == null ? info.ContrailStartColorUsePlayerColor : info.ContrailEndColorUsePlayerColor, + info.ContrailStartWidth, + info.ContrailEndWidth ?? info.ContrailStartWidth, + info.ContrailLength, info.ContrailDelay, info.ContrailZOffset); } trailPalette = info.TrailPalette; diff --git a/OpenRA.Mods.Common/Projectiles/Missile.cs b/OpenRA.Mods.Common/Projectiles/Missile.cs index 894cd3914f..1655688097 100644 --- a/OpenRA.Mods.Common/Projectiles/Missile.cs +++ b/OpenRA.Mods.Common/Projectiles/Missile.cs @@ -285,9 +285,14 @@ namespace OpenRA.Mods.Common.Projectiles if (info.ContrailLength > 0) { - var startcolor = info.ContrailStartColorUsePlayerColor ? Color.FromArgb(info.ContrailStartColorAlpha, Player.ActorColor(args.SourceActor)) : Color.FromArgb(info.ContrailStartColorAlpha, info.ContrailStartColor); - var endcolor = info.ContrailEndColorUsePlayerColor ? Color.FromArgb(info.ContrailEndColorAlpha, Player.ActorColor(args.SourceActor)) : Color.FromArgb(info.ContrailEndColorAlpha, info.ContrailEndColor ?? startcolor); - contrail = new ContrailRenderable(world, startcolor, endcolor, info.ContrailStartWidth, info.ContrailEndWidth ?? info.ContrailStartWidth, info.ContrailLength, info.ContrailDelay, info.ContrailZOffset); + var startcolor = Color.FromArgb(info.ContrailStartColorAlpha, info.ContrailStartColor); + var endcolor = Color.FromArgb(info.ContrailEndColorAlpha, info.ContrailEndColor ?? startcolor); + contrail = new ContrailRenderable(world, args.SourceActor, + startcolor, info.ContrailStartColorUsePlayerColor, + endcolor, info.ContrailEndColor == null ? info.ContrailStartColorUsePlayerColor : info.ContrailEndColorUsePlayerColor, + info.ContrailStartWidth, + info.ContrailEndWidth ?? info.ContrailStartWidth, + info.ContrailLength, info.ContrailDelay, info.ContrailZOffset); } trailPalette = info.TrailPalette; diff --git a/OpenRA.Mods.Common/Traits/Render/Contrail.cs b/OpenRA.Mods.Common/Traits/Render/Contrail.cs index 465d7ae09a..5332b79b33 100644 --- a/OpenRA.Mods.Common/Traits/Render/Contrail.cs +++ b/OpenRA.Mods.Common/Traits/Render/Contrail.cs @@ -75,9 +75,14 @@ namespace OpenRA.Mods.Common.Traits { this.info = info; - startcolor = info.StartColorUsePlayerColor ? Color.FromArgb(info.StartColorAlpha, Player.ActorColor(self)) : Color.FromArgb(info.StartColorAlpha, info.StartColor); - endcolor = info.EndColorUsePlayerColor ? Color.FromArgb(info.EndColorAlpha, Player.ActorColor(self)) : Color.FromArgb(info.EndColorAlpha, info.EndColor ?? startcolor); - trail = new ContrailRenderable(self.World, startcolor, endcolor, info.StartWidth, info.EndWidth ?? info.StartWidth, info.TrailLength, info.TrailDelay, info.ZOffset); + startcolor = Color.FromArgb(info.StartColorAlpha, info.StartColor); + endcolor = Color.FromArgb(info.EndColorAlpha, info.EndColor ?? startcolor); + trail = new ContrailRenderable(self.World, self, + startcolor, info.StartColorUsePlayerColor, + endcolor, info.EndColor == null ? info.StartColorUsePlayerColor : info.EndColorUsePlayerColor, + info.StartWidth, + info.EndWidth ?? info.StartWidth, + info.TrailLength, info.TrailDelay, info.ZOffset); body = self.Trait(); } @@ -106,7 +111,12 @@ namespace OpenRA.Mods.Common.Traits void INotifyAddedToWorld.AddedToWorld(Actor self) { - trail = new ContrailRenderable(self.World, startcolor, endcolor, info.StartWidth, info.EndWidth ?? info.StartWidth, info.TrailLength, info.TrailDelay, info.ZOffset); + trail = new ContrailRenderable(self.World, self, + startcolor, info.StartColorUsePlayerColor, + endcolor, info.EndColor == null ? info.StartColorUsePlayerColor : info.EndColorUsePlayerColor, + info.StartWidth, + info.EndWidth ?? info.StartWidth, + info.TrailLength, info.TrailDelay, info.ZOffset); } } } diff --git a/OpenRA.Mods.Common/Traits/Render/RenderDebugState.cs b/OpenRA.Mods.Common/Traits/Render/RenderDebugState.cs index 4721c335d0..3b02feaea1 100644 --- a/OpenRA.Mods.Common/Traits/Render/RenderDebugState.cs +++ b/OpenRA.Mods.Common/Traits/Render/RenderDebugState.cs @@ -13,7 +13,6 @@ using System.Collections.Generic; using System.Linq; using OpenRA.Graphics; using OpenRA.Mods.Common.Graphics; -using OpenRA.Primitives; using OpenRA.Traits; namespace OpenRA.Mods.Common.Traits.Render @@ -26,14 +25,13 @@ namespace OpenRA.Mods.Common.Traits.Render public override object Create(ActorInitializer init) { return new RenderDebugState(init.Self, this); } } - sealed class RenderDebugState : INotifyAddedToWorld, INotifyOwnerChanged, INotifyCreated, IRenderAnnotationsWhenSelected + sealed class RenderDebugState : INotifyAddedToWorld, INotifyCreated, IRenderAnnotationsWhenSelected { readonly DebugVisualizations debugVis; readonly SpriteFont font; readonly WVec offset; SquadManagerBotModule[] squadManagerModules; - Color color; string tagString; public RenderDebugState(Actor self, RenderDebugStateInfo info) @@ -42,7 +40,6 @@ namespace OpenRA.Mods.Common.Traits.Render var yOffset = buildingInfo?.Dimensions.Y ?? 1; offset = new WVec(0, 512 * yOffset, 0); - color = self.OwnerColor(); font = Game.Renderer.Fonts[info.Font]; debugVis = self.World.WorldActor.TraitOrDefault(); @@ -58,13 +55,12 @@ namespace OpenRA.Mods.Common.Traits.Render tagString = self.ToString(); } - void INotifyOwnerChanged.OnOwnerChanged(Actor self, Player oldOwner, Player newOwner) => color = self.OwnerColor(); - IEnumerable IRenderAnnotationsWhenSelected.RenderAnnotations(Actor self, WorldRenderer wr) { if (debugVis == null || !debugVis.ActorTags) yield break; + var color = self.OwnerColor(); yield return new TextAnnotationRenderable(font, self.CenterPosition - offset, 0, color, tagString); // Get the actor's activity. diff --git a/OpenRA.Mods.Common/Traits/Render/WithNameTagDecoration.cs b/OpenRA.Mods.Common/Traits/Render/WithNameTagDecoration.cs index 0738d5c6c0..6574d82121 100644 --- a/OpenRA.Mods.Common/Traits/Render/WithNameTagDecoration.cs +++ b/OpenRA.Mods.Common/Traits/Render/WithNameTagDecoration.cs @@ -45,14 +45,14 @@ namespace OpenRA.Mods.Common.Traits.Render public class WithNameTagDecoration : WithDecorationBase, INotifyOwnerChanged { readonly SpriteFont font; + readonly WithNameTagDecorationInfo info; string name; - Color color; public WithNameTagDecoration(Actor self, WithNameTagDecorationInfo info) : base(self, info) { font = Game.Renderer.Fonts[info.Font]; - color = info.UsePlayerColor ? self.OwnerColor() : info.Color; + this.info = info; name = self.Owner.PlayerName; if (name.Length > info.MaxLength) @@ -67,15 +67,12 @@ namespace OpenRA.Mods.Common.Traits.Render var size = font.Measure(name); return new IRenderable[] { - new UITextRenderable(font, self.CenterPosition, screenPos - size / 2, 0, color, name) + new UITextRenderable(font, self.CenterPosition, screenPos - size / 2, 0, info.UsePlayerColor ? self.OwnerColor() : info.Color, name) }; } void INotifyOwnerChanged.OnOwnerChanged(Actor self, Player oldOwner, Player newOwner) { - if (Info.UsePlayerColor) - color = self.OwnerColor(); - name = self.Owner.PlayerName; if (name.Length > Info.MaxLength) name = name[..Info.MaxLength]; diff --git a/OpenRA.Mods.Common/Traits/Render/WithTextControlGroupDecoration.cs b/OpenRA.Mods.Common/Traits/Render/WithTextControlGroupDecoration.cs index 4e47a9f4b8..a1255a862b 100644 --- a/OpenRA.Mods.Common/Traits/Render/WithTextControlGroupDecoration.cs +++ b/OpenRA.Mods.Common/Traits/Render/WithTextControlGroupDecoration.cs @@ -45,20 +45,16 @@ namespace OpenRA.Mods.Common.Traits.Render public override object Create(ActorInitializer init) { return new WithTextControlGroupDecoration(init.Self, this); } } - public class WithTextControlGroupDecoration : IDecoration, INotifyOwnerChanged + public class WithTextControlGroupDecoration : IDecoration { readonly WithTextControlGroupDecorationInfo info; readonly SpriteFont font; readonly CachedTransform label; - Color color; - public WithTextControlGroupDecoration(Actor self, WithTextControlGroupDecorationInfo info) { this.info = info; font = Game.Renderer.Fonts[info.Font]; - color = info.UsePlayerColor ? self.OwnerColor() : info.Color; - label = new CachedTransform(g => self.World.ControlGroups.Groups[g]); } @@ -74,14 +70,8 @@ namespace OpenRA.Mods.Common.Traits.Render var screenPos = container.GetDecorationOrigin(self, wr, info.Position, info.Margin); return new IRenderable[] { - new UITextRenderable(font, self.CenterPosition, screenPos, 0, color, text) + new UITextRenderable(font, self.CenterPosition, screenPos, 0, info.UsePlayerColor ? self.OwnerColor() : info.Color, text) }; } - - void INotifyOwnerChanged.OnOwnerChanged(Actor self, Player oldOwner, Player newOwner) - { - if (info.UsePlayerColor) - color = self.OwnerColor(); - } } }