package com.lyeeedar.Graphics.ParticleEffects; import java.io.Serializable; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import com.badlogic.gdx.graphics.Camera; import com.badlogic.gdx.math.Vector3; import com.badlogic.gdx.utils.Json; import com.badlogic.gdx.utils.ObjectMap.Entry; import com.badlogic.gdx.utils.OrderedMap; import com.lyeeedar.Roguelike3D.Graphics.Lights.LightManager; import com.lyeeedar.Utils.Bag; public class ParticleEffect implements Serializable { private static final long serialVersionUID = -5746609278217754852L; public final String UID; public final Bag<Emitter> emitters = new Bag<Emitter>(); public float x, y, z; public float radius; public ParticleEffect() { this.UID = this.toString()+this.hashCode()+System.currentTimeMillis()+System.nanoTime(); } public ParticleEffect(float radius) { this.UID = this.toString()+this.hashCode()+System.currentTimeMillis()+System.nanoTime(); this.radius = radius; } public void setPosition(Vector3 pos) { this.x = pos.x; this.y = pos.y; this.z = pos.z; for (Emitter e : emitters) { e.emitter.setPosition(x+e.x, y+e.y, z+e.z); } } public void setPosition(float x, float y, float z) { this.x = x; this.y = y; this.z = z; for (Emitter e : emitters) { e.emitter.setPosition(x+e.x, y+e.y, z+e.z); } } public void deleteEmitter(int index) { Emitter emitter = emitters.remove(index); emitter.emitter.dispose(); } public void deleteEmitter(String name) { Iterator<Emitter> itr = emitters.iterator(); while (itr.hasNext()) { Emitter e = itr.next(); if (e.emitter.name.equals(name)) { itr.remove(); e.emitter.dispose(); } } } public ParticleEmitter getEmitter(int index) { return emitters.get(index).emitter; } public ParticleEmitter getEmitter(String name) { for (Emitter e : emitters) if (e.emitter.name.equals(name)) return e.emitter; return null; } public void getEmitters(List<ParticleEmitter> list) { for (Emitter e : emitters) list.add(e.emitter); } public ParticleEmitter getFirstEmitter() { return emitters.get(0).emitter; } public void addEmitter(ParticleEmitter emitter, float x, float y, float z) { Emitter e = new Emitter(emitter, x, y, z); emitters.add(e); } public void update(float delta, Camera cam) { for (Emitter e : emitters) { e.emitter.update(delta, cam); } } public Vector3 getEmitterPosition(int index, Vector3 position) { Emitter e = emitters.get(index); return position.set(e.x, e.y, e.z); } public void setEmitterPosition(int index, Vector3 position) { Emitter e = emitters.get(index); e.x = position.x; e.y = position.y; e.z = position.z; setPosition(x, y, z); } public void getVisibleEmitters(ArrayList<ParticleEmitter> visibleEmitters, Camera cam) { for (Emitter e : emitters) { if (!cam.frustum.sphereInFrustum(e.emitter.getPosition(), e.emitter.getRadius()*2)) continue; e.emitter.distance = cam.position.dst2(e.emitter.getPosition()); visibleEmitters.add(e.emitter); } } public void render() { for (Emitter e : emitters) { e.emitter.render(); } } public void getLight(LightManager lightManager) { for (Emitter e : emitters) { e.emitter.getLight(lightManager); } } public void create() { for (Emitter e : emitters) { e.emitter.create(); } } public void dispose() { for (Emitter e : emitters) { e.emitter.dispose(); } } public void delete() { Iterator<Emitter> itr = emitters.iterator(); while(itr.hasNext()) { Emitter e = itr.next(); e.emitter.dispose(); itr.remove(); } } public ParticleEffect copy() { ParticleEffect effect = new ParticleEffect(radius); for (Emitter e : emitters) { effect.addEmitter(e.emitter.copy(), e.x, e.y, e.z); } return effect; } private static class Emitter implements Serializable, Json.Serializable { private static final long serialVersionUID = 7076203259415104530L; ParticleEmitter emitter; float x; float y; float z; @SuppressWarnings("unused") public Emitter(){} public Emitter(ParticleEmitter emitter, float x, float y, float z) { this.emitter = emitter; this.x = x; this.y = y; this.z = z; } @Override public void write(Json json) { ParticleEmitter.getJson(json); json.writeValue("emitter", emitter); json.writeValue("x", x); json.writeValue("y", y); json.writeValue("z", z); } @Override public void read(Json json, OrderedMap<String, Object> jsonData) { ParticleEmitter.getJson(json); Iterator<Entry<String, Object>> itr = jsonData.entries().iterator(); while (itr.hasNext()) { Entry<String, Object> entry = itr.next(); if (entry.key.equals("emitter")) { emitter = json.readValue(ParticleEmitter.class, entry.value); } else if (entry.key.equals("x")) { x = (Float) entry.value; } else if (entry.key.equals("y")) { y = (Float) entry.value; } else if (entry.key.equals("z")) { z = (Float) entry.value; } } } } public int getActiveParticles() { int active = 0; for (Emitter e : emitters) active += e.emitter.getActiveParticles(); return active; } }