001package com.fs.starfarer.api.impl.combat; 002 003import java.util.EnumSet; 004 005import java.awt.Color; 006 007import com.fs.starfarer.api.Global; 008import com.fs.starfarer.api.combat.BaseCombatLayeredRenderingPlugin; 009import com.fs.starfarer.api.combat.CombatEngineLayers; 010import com.fs.starfarer.api.combat.CombatEntityAPI; 011import com.fs.starfarer.api.combat.ShipAPI; 012import com.fs.starfarer.api.combat.ViewportAPI; 013import com.fs.starfarer.api.graphics.SpriteAPI; 014import com.fs.starfarer.api.util.FaderUtil; 015import com.fs.starfarer.api.util.Misc; 016 017/** 018 * Used for ship explosions when there's no whiteout. 019 * 020 * @author Alex 021 * 022 * Copyright 2022 Fractal Softworks, LLC 023 */ 024public class ShipExplosionFlareVisual extends BaseCombatLayeredRenderingPlugin { 025 026 public static class ShipExplosionFlareParams implements Cloneable { 027 public CombatEntityAPI attachedTo; 028 public Color color; 029 public float flareWidth; 030 public float flareHeight; 031 public float fadeIn = 0.25f; 032 public float fadeOut = 2f; 033 034 public ShipExplosionFlareParams() { 035 } 036 037 public ShipExplosionFlareParams(CombatEntityAPI attachedTo, Color color, float flareWidth, float flareHeight) { 038 this.attachedTo = attachedTo; 039 this.color = color; 040 this.flareWidth = flareWidth; 041 this.flareHeight = flareHeight; 042 } 043 044 @Override 045 protected ShipExplosionFlareParams clone() { 046 try { 047 return (ShipExplosionFlareParams) super.clone(); 048 } catch (CloneNotSupportedException e) { 049 return null; // should never happen 050 } 051 } 052 053 } 054 055 protected ShipExplosionFlareParams p; 056 protected SpriteAPI sprite; 057 protected FaderUtil fader; 058 059 public ShipExplosionFlareVisual(ShipExplosionFlareParams p) { 060 this.p = p; 061 //fader = new FaderUtil(1f, 0f, 2f); 062 //fader.fadeOut(); 063 fader = new FaderUtil(0f, p.fadeIn, p.fadeOut); 064 fader.setBounceDown(true); 065 fader.fadeIn(); 066 sprite = Global.getSettings().getSprite("graphics/fx/starburst_glow1.png"); 067 } 068 069 public float getRenderRadius() { 070 return Math.max(p.flareWidth, p.flareHeight) + 500f; 071 } 072 073 074 @Override 075 public EnumSet<CombatEngineLayers> getActiveLayers() { 076 return EnumSet.of(CombatEngineLayers.ABOVE_PARTICLES_LOWER); 077 } 078 079 public void advance(float amount) { 080 if (Global.getCombatEngine().isPaused()) return; 081 082 fader.advance(amount); 083 084 if (entity != null && p.attachedTo != null) { 085 if (p.attachedTo instanceof ShipAPI) { 086 entity.getLocation().set(((ShipAPI)p.attachedTo).getShieldCenterEvenIfNoShield()); 087 } else { 088 entity.getLocation().set(p.attachedTo.getLocation()); 089 } 090 } 091 } 092 093 public void init(CombatEntityAPI entity) { 094 super.init(entity); 095 } 096 097 public boolean isExpired() { 098 return fader.isFadedOut(); 099 } 100 101 public void render(CombatEngineLayers layer, ViewportAPI viewport) { 102 float x = entity.getLocation().x; 103 float y = entity.getLocation().y; 104 105 float b = fader.getBrightness(); 106 if (fader.isFadingIn() && b > 0.01f) { 107 b = (float) Math.sqrt(b); 108 } else { 109 b *= b; 110 } 111 float alphaMult = viewport.getAlphaMult(); 112 113 alphaMult *= b; 114 115 float f = 0.5f + 0.5f * b; 116 f = 1f; 117 118 sprite.setColor(p.color); 119 sprite.setSize(p.flareWidth * f, p.flareHeight * f); 120 sprite.setAdditiveBlend(); 121 sprite.setAlphaMult(alphaMult); 122 sprite.renderAtCenter(x, y); 123 124 //f *= 0.75f; 125 sprite.setColor(Misc.scaleAlpha(Color.white, 1f)); 126 sprite.setSize(p.flareWidth * f, p.flareHeight * f * 0.33f); 127 sprite.setAdditiveBlend(); 128 sprite.setAlphaMult(alphaMult); 129 sprite.renderAtCenter(x, y); 130 131// f = 0.5f + 0.5f * b; 132// sprite.setColor(p.color); 133// sprite.setSize(p.flareHeight * f, p.flareWidth * f * 0.5f); 134// sprite.setAdditiveBlend(); 135// sprite.setAlphaMult(alphaMult); 136// sprite.renderAtCenter(x, y); 137 138// f *= 0.5f; 139// sprite.setColor(Misc.scaleAlpha(Color.white, b)); 140// sprite.setSize(p.flareHeight * f, p.flareWidth * f * 0.5f); 141// sprite.setAdditiveBlend(); 142// sprite.setAlphaMult(alphaMult); 143// sprite.renderAtCenter(x, y); 144 } 145 146 147 148} 149 150