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