1package com.fs.starfarer.api.impl.combat;
4import java.util.ArrayList;
5import java.util.EnumSet;
8import org.lwjgl.opengl.GL14;
9import org.lwjgl.util.vector.Vector2f;
11import com.fs.starfarer.api.Global;
12import com.fs.starfarer.api.combat.BaseCombatLayeredRenderingPlugin;
13import com.fs.starfarer.api.combat.CombatEngineLayers;
14import com.fs.starfarer.api.combat.CombatEntityAPI;
15import com.fs.starfarer.api.combat.DamagingProjectileAPI;
16import com.fs.starfarer.api.combat.ViewportAPI;
17import com.fs.starfarer.api.graphics.SpriteAPI;
18import com.fs.starfarer.api.util.FaderUtil;
19import com.fs.starfarer.api.util.Misc;
23 public static class ParticleData {
25 public Vector2f offset =
new Vector2f();
26 public Vector2f vel =
new Vector2f();
27 public float scale = 1f;
28 public float scaleIncreaseRate = 1f;
29 public float turnDir = 1f;
30 public float angle = 1f;
34 public float elapsed = 0f;
35 public float baseSize;
36 protected Color color;
38 public ParticleData(
float baseSize,
float durIn,
float durOut,
float endSizeMult,
float maxDriftVel,
float maxAngVel, Color color, String
spriteSheetKey) {
53 angle = (float) Math.random() * 360f;
55 this.maxDur = durIn + durOut;
56 scaleIncreaseRate = endSizeMult / maxDur;
57 if (endSizeMult < 1f) {
58 scaleIncreaseRate = -1f * endSizeMult;
62 this.baseSize = baseSize;
63 turnDir = Math.signum((
float) Math.random() - 0.5f) * maxAngVel * (float) Math.random();
66 float driftDir = (float) Math.random() * 360f;
69 vel.scale(maxDriftVel * (0.5f + (
float) Math.random() * 0.5f));
77 public void advance(
float amount) {
78 scale += scaleIncreaseRate * amount;
80 offset.x += vel.x * amount;
81 offset.y += vel.y * amount;
83 angle += turnDir * amount;
93 protected List<ParticleData>
particles =
new ArrayList<ParticleData>();
94 protected List<ParticleData>
darkParticles =
new ArrayList<ParticleData>();
134 public ParticleData
addParticle(
float baseSize,
float durIn,
float durOut,
float endSizeMult,
float maxDriftVel,
float maxAngVel, Color color) {
135 ParticleData p =
new ParticleData(baseSize, durIn, durOut, endSizeMult, maxDriftVel, maxAngVel, color,
spriteSheetKey);
140 public ParticleData
addDarkParticle(
float baseSize,
float durIn,
float durOut,
float endSizeMult,
float maxDriftVel,
float maxAngVel, Color color) {
141 ParticleData p =
new ParticleData(baseSize, durIn, durOut, endSizeMult, maxDriftVel, maxAngVel, color,
darkSpriteSheetKey);
149 prev.offset.set(loc);
155 List<ParticleData>
remove =
new ArrayList<ParticleData>();
158 if (p.elapsed >= p.maxDur) {
164 remove =
new ArrayList<ParticleData>();
167 if (p.elapsed >= p.maxDur) {
200 float size = p.baseSize * p.scale;
202 Vector2f offset = p.offset;
206 if (Math.abs(diff) > 0.1f) {
210 Vector2f loc =
new Vector2f(x + offset.x, y + offset.y);
214 p.sprite.setAngle(p.angle);
215 p.sprite.setSize(size, size);
216 p.sprite.setAlphaMult(b * alphaMult * p.fader.getBrightness());
217 p.sprite.setColor(p.color);
218 p.sprite.renderAtCenter(loc.x, loc.y);
221 GL14.glBlendEquation(GL14.GL_FUNC_REVERSE_SUBTRACT);
225 float size = p.baseSize * p.scale;
227 Vector2f offset = p.offset;
231 if (Math.abs(diff) > 0.1f) {
235 Vector2f loc =
new Vector2f(x + offset.x, y + offset.y);
239 p.sprite.setAngle(p.angle);
240 p.sprite.setSize(size, size);
241 p.sprite.setAlphaMult(b * alphaMult * p.fader.getBrightness());
242 p.sprite.setColor(p.color);
243 p.sprite.renderAtCenter(loc.x, loc.y);
246 GL14.glBlendEquation(GL14.GL_FUNC_ADD);
static SettingsAPI getSettings()
static CombatEngineAPI getCombatEngine()
String getSpriteSheetKey()
CombatEngineLayers normalLayer
List< ParticleData > particles
String getDarkSpriteSheetKey()
CombatEntityPluginWithParticles()
void render(CombatEngineLayers layer, ViewportAPI viewport, DamagingProjectileAPI proj)
void advance(float amount)
CombatEntityPluginWithParticles(CombatEngineLayers normalLayer, CombatEngineLayers darkLayer)
ParticleData addDarkParticle(float baseSize, float durIn, float durOut, float endSizeMult, float maxDriftVel, float maxAngVel, Color color)
void setDarkSpriteSheetKey(String darkSpriteSheetKey)
void render(CombatEngineLayers layer, ViewportAPI viewport)
EnumSet< CombatEngineLayers > getActiveLayers()
CombatEngineLayers darkLayer
ParticleData addParticle(float baseSize, float durIn, float durOut, float endSizeMult, float maxDriftVel, float maxAngVel, Color color)
void init(CombatEntityAPI entity)
void randomizePrevParticleLocation(float maxOffset)
EnumSet< CombatEngineLayers > layers
void setSpriteSheetKey(String spriteSheetKey)
List< ParticleData > darkParticles
float getGlobalAlphaMult()
String darkSpriteSheetKey
void advance(float amount)
void setBounceDown(boolean bounceDown)
static Vector2f getUnitVectorAtDegreeAngle(float degrees)
static Vector2f rotateAroundOrigin(Vector2f v, float angle)
static float getAngleDiff(float from, float to)
static Vector2f getPointWithinRadius(Vector2f from, float r)
ABOVE_SHIPS_AND_MISSILES_LAYER
SpriteAPI getSprite(String filename)
void setTexWidth(float texWidth)
void setTexHeight(float texHeight)