From 322285ef669eb079cbb6ff8b7129006ab16200a7 Mon Sep 17 00:00:00 2001 From: Paul Chote Date: Sun, 24 May 2015 17:41:08 +0100 Subject: [PATCH 1/2] Update NukePaletteEffect for premultiplied alpha. --- OpenRA.Game/Graphics/Util.cs | 12 ++++++++++++ .../Traits/PaletteEffects/NukePaletteEffect.cs | 6 ++++-- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/OpenRA.Game/Graphics/Util.cs b/OpenRA.Game/Graphics/Util.cs index 166f117cea..b61ee0f1e4 100644 --- a/OpenRA.Game/Graphics/Util.cs +++ b/OpenRA.Game/Graphics/Util.cs @@ -118,6 +118,18 @@ namespace OpenRA.Graphics return Color.FromArgb(c.A, (byte)(c.R * a + 0.5f), (byte)(c.G * a + 0.5f), (byte)(c.B * a + 0.5f)); } + public static Color PremultipliedColorLerp(float t, Color c1, Color c2) + { + // Colors must be lerped in a non-multiplied color space + var a1 = 255f / c1.A; + var a2 = 255f / c2.A; + return PremultiplyAlpha(Color.FromArgb( + (int)(t * c2.A + (1 - t) * c1.A), + (int)((byte)(t * a2 * c2.R + 0.5f) + (1 - t) * (byte)(a1 * c1.R + 0.5f)), + (int)((byte)(t * a2 * c2.G + 0.5f) + (1 - t) * (byte)(a1 * c1.G + 0.5f)), + (int)((byte)(t * a2 * c2.B + 0.5f) + (1 - t) * (byte)(a1 * c1.B + 0.5f)))); + } + public static float[] IdentityMatrix() { return Exts.MakeArray(16, j => (j % 5 == 0) ? 1.0f : 0); diff --git a/OpenRA.Mods.Common/Traits/PaletteEffects/NukePaletteEffect.cs b/OpenRA.Mods.Common/Traits/PaletteEffects/NukePaletteEffect.cs index 7dce462679..05199a1f97 100644 --- a/OpenRA.Mods.Common/Traits/PaletteEffects/NukePaletteEffect.cs +++ b/OpenRA.Mods.Common/Traits/PaletteEffects/NukePaletteEffect.cs @@ -15,6 +15,8 @@ using OpenRA.Traits; namespace OpenRA.Mods.Common.Traits { + using GUtil = OpenRA.Graphics.Util; + [Desc("Apply palette full screen rotations during atom bomb explosions. Add this to the world actor.")] class NukePaletteEffectInfo : TraitInfo { } @@ -46,8 +48,8 @@ namespace OpenRA.Mods.Common.Traits for (var x = 0; x < Palette.Size; x++) { var orig = pal.Value.GetColor(x); - var white = Color.FromArgb(orig.A, 255, 255, 255); - pal.Value.SetColor(x, Exts.ColorLerp(frac, orig, white)); + var final = GUtil.PremultipliedColorLerp(frac, orig, GUtil.PremultiplyAlpha(Color.FromArgb(orig.A, Color.White))); + pal.Value.SetColor(x, final); } } } From dae5703c71c1f54ce10973052cb820be792864bf Mon Sep 17 00:00:00 2001 From: Paul Chote Date: Sun, 24 May 2015 18:33:39 +0100 Subject: [PATCH 2/2] Add nuke flash to D2K. --- mods/d2k/rules/palettes.yaml | 6 ++++++ mods/d2k/rules/structures.yaml | 1 + mods/d2k/sequences/structures.yaml | 3 --- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/mods/d2k/rules/palettes.yaml b/mods/d2k/rules/palettes.yaml index ad95b7c2dd..b32bb54553 100644 --- a/mods/d2k/rules/palettes.yaml +++ b/mods/d2k/rules/palettes.yaml @@ -57,6 +57,11 @@ Name: effect50alpha BasePalette: effect Alpha: 0.5 + PaletteFromPaletteWithAlpha@effectAdditive: + Name: effectAdditive + BasePalette: effect + Alpha: 0 + Premultiply: false PaletteFromScaledPalette@starportlights: Name: starportlights BasePalette: d2k @@ -81,4 +86,5 @@ Alpha: 0.68 Premultiply: false PlayerHighlightPalette: + NukePaletteEffect: diff --git a/mods/d2k/rules/structures.yaml b/mods/d2k/rules/structures.yaml index 57cff88c63..89af14eb61 100644 --- a/mods/d2k/rules/structures.yaml +++ b/mods/d2k/rules/structures.yaml @@ -213,6 +213,7 @@ refinery: ordos: refinery.ordos WithDockingOverlay@SMOKE: Sequence: smoke + Palette: effectAdditive Power: Amount: -30 WithIdleOverlay@TOP: diff --git a/mods/d2k/sequences/structures.yaml b/mods/d2k/sequences/structures.yaml index f1ede858e3..3244787801 100644 --- a/mods/d2k/sequences/structures.yaml +++ b/mods/d2k/sequences/structures.yaml @@ -378,7 +378,6 @@ refinery.atreides: Length: 14 Offset: 10,-16 Tick: 200 - BlendMode: Additive silo.atreides: idle: DATA.R8 @@ -863,7 +862,6 @@ refinery.harkonnen: Length: 14 Offset: 10,-16 Tick: 200 - BlendMode: Additive silo.harkonnen: idle: DATA.R8 @@ -1257,7 +1255,6 @@ refinery.ordos: Length: 14 Offset: 10,-16 Tick: 200 - BlendMode: Additive silo.ordos: idle: DATA.R8