From 037f752b732de6a6badb89d453d762edf71fba30 Mon Sep 17 00:00:00 2001 From: MEEPofFaith <54301439+MEEPofFaith@users.noreply.github.com> Date: Fri, 23 Feb 2024 14:11:00 -0800 Subject: [PATCH] Improve ArmorPlateAbility draw (#9581) * Improve ArmorPlateAbility draw * Revert to tinting Just make a white shine sprite. Or none-white if you want some interesting visuals with the colors. * Fix not applying z when drawShine = false --- core/assets/shaders/unitarmor.frag | 4 +- .../entities/abilities/ArmorPlateAbility.java | 53 ++++++++++++++----- 2 files changed, 40 insertions(+), 17 deletions(-) diff --git a/core/assets/shaders/unitarmor.frag b/core/assets/shaders/unitarmor.frag index 10116ff3ac..1e475fda17 100644 --- a/core/assets/shaders/unitarmor.frag +++ b/core/assets/shaders/unitarmor.frag @@ -2,7 +2,6 @@ uniform sampler2D u_texture; uniform float u_time; uniform float u_progress; -uniform vec4 u_color; uniform vec2 u_uv; uniform vec2 u_uv2; uniform vec2 u_texsize; @@ -14,8 +13,7 @@ void main(){ vec2 coords = (v_texCoords - u_uv) / (u_uv2 - u_uv); vec2 v = vec2(1.0/u_texsize.x, 1.0/u_texsize.y); - vec4 c = texture2D(u_texture, v_texCoords); - + vec4 c = texture2D(u_texture, v_texCoords); c.a *= u_progress; c.a *= step(abs(sin(coords.y*3.0 + u_time)), 0.9); diff --git a/core/src/mindustry/entities/abilities/ArmorPlateAbility.java b/core/src/mindustry/entities/abilities/ArmorPlateAbility.java index bfe776d737..4c02028492 100644 --- a/core/src/mindustry/entities/abilities/ArmorPlateAbility.java +++ b/core/src/mindustry/entities/abilities/ArmorPlateAbility.java @@ -12,10 +12,20 @@ import mindustry.world.meta.*; public class ArmorPlateAbility extends Ability{ public TextureRegion plateRegion; - public Color color = Color.valueOf("d1efff"); + public TextureRegion shineRegion; + public String plateSuffix = "-armor"; + public String shineSuffix = "-shine"; + /** Color of the shine. If null, uses team color. */ + public @Nullable Color color = null; + public float shineSpeed = 1f; + public float z = -1; + + /** Whether to draw the plate region. */ + public boolean drawPlate = true; + /** Whether to draw the shine over the plate region. */ + public boolean drawShine = true; public float healthMultiplier = 0.2f; - public float z = Layer.effect; protected float warmup; @@ -34,24 +44,39 @@ public class ArmorPlateAbility extends Ability{ @Override public void draw(Unit unit){ + if(!drawPlate && !drawShine) return; + if(warmup > 0.001f){ if(plateRegion == null){ - plateRegion = Core.atlas.find(unit.type.name + "-armor", unit.type.region); + plateRegion = Core.atlas.find(unit.type.name + plateSuffix, unit.type.region); + shineRegion = Core.atlas.find(unit.type.name + shineSuffix, plateRegion); } - Draw.draw(z <= 0 ? Draw.z() : z, () -> { - Shaders.armor.region = plateRegion; - Shaders.armor.progress = warmup; - Shaders.armor.time = -Time.time / 20f; + float pz = Draw.z(); + if(z > 0) Draw.z(z); - Draw.rect(Shaders.armor.region, unit.x, unit.y, unit.rotation - 90f); - Draw.color(color); - Draw.shader(Shaders.armor); - Draw.rect(Shaders.armor.region, unit.x, unit.y, unit.rotation - 90f); - Draw.shader(); + if(drawPlate){ + Draw.alpha(warmup); + Draw.rect(plateRegion, unit.x, unit.y, unit.rotation - 90f); + Draw.alpha(1f); + } - Draw.reset(); - }); + if(drawShine){ + Draw.draw(Draw.z(), () -> { + Shaders.armor.region = shineRegion; + Shaders.armor.progress = warmup; + Shaders.armor.time = -Time.time / 20f * shineSpeed; + + Draw.color(color == null ? unit.team.color : color); + Draw.shader(Shaders.armor); + Draw.rect(shineRegion, unit.x, unit.y, unit.rotation - 90f); + Draw.shader(); + + Draw.reset(); + }); + } + + Draw.z(pz); } } }