package eu.tankernn.gameEngine.particles; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Map.Entry; import org.lwjgl.util.vector.Matrix4f; import org.lwjgl.util.vector.Vector2f; import org.lwjgl.util.vector.Vector3f; import eu.tankernn.gameEngine.entities.Camera; import eu.tankernn.gameEngine.loader.Loader; import eu.tankernn.gameEngine.loader.font.FontType; import eu.tankernn.gameEngine.loader.font.GUIText; import eu.tankernn.gameEngine.renderEngine.Fbo; import eu.tankernn.gameEngine.renderEngine.font.FontRenderer; import eu.tankernn.gameEngine.util.DistanceSorter; public class ParticleMaster { private Loader loader; private Map> particles = new HashMap>(); private List systems = new ArrayList(); private ParticleRenderer renderer; private FontRenderer fontRenderer; public ParticleMaster(Loader loader, Matrix4f projectionMatrix) { this.loader = loader; renderer = new ParticleRenderer(loader, projectionMatrix); fontRenderer = new FontRenderer(); } public void update(Camera camera) { for (ParticleSystem sys: systems) { for (Particle particle: sys.generateParticles()) { addParticle(particle); } } Iterator>> mapIterator = particles.entrySet().iterator(); while (mapIterator.hasNext()) { Entry> entry = mapIterator.next(); List list = entry.getValue(); Iterator iterator = list.iterator(); while (iterator.hasNext()) { Particle p = iterator.next(); boolean stillAlive = p.update(camera); if (!stillAlive) { iterator.remove(); if (list.isEmpty()) { mapIterator.remove(); } } } if (!entry.getKey().usesAdditiveBlending()) DistanceSorter.sort(list, camera); } systems.removeIf(ParticleSystem::isDead); } public void renderParticles(Camera camera) { renderer.render(particles, camera); } @Override public void finalize() { renderer.finalize(); } public void addTextParticle(String text, int fontSize, FontType font, Vector3f position) { GUIText guiText = new GUIText(text, fontSize, font, new Vector2f(0, 0), 1.0f, false).setColor(0, 1, 0); guiText.update(loader); Fbo fbo = new Fbo(100 * fontSize, 100 * fontSize, 0); fbo.bindFrameBuffer(); fontRenderer.render(guiText); fbo.unbindFrameBuffer(); addParticle(new Particle(new ParticleTexture(fbo.getColourTexture(), 1, true), position, new Vector3f(0, 0, 0), 0.1f, 4, 0, fontSize)); } public void addParticle(Particle particle) { List list = particles.get(particle.getTexture()); if (list == null) { list = new ArrayList(); particles.put(particle.getTexture(), list); } list.add(particle); } public void addSystem(ParticleSystem system) { this.systems.add(system); } }