package openmods.renderer; import java.util.Queue; import java.util.concurrent.ConcurrentLinkedQueue; import java.util.concurrent.atomic.AtomicInteger; import net.minecraft.client.renderer.Tessellator; import openmods.LibConfig; import openmods.Log; public class TessellatorPool { private final Queue<Tessellator> pool = new ConcurrentLinkedQueue<Tessellator>(); private final AtomicInteger count = new AtomicInteger(); public static final TessellatorPool instance = new TessellatorPool(); private TessellatorPool() {} public static interface TessellatorUser { public void execute(Tessellator tes); } private Tessellator reserveTessellator() { Tessellator tes = pool.poll(); if (tes == null) { int id = count.incrementAndGet(); if (id > LibConfig.tessellatorPoolLimit) Log.warn("Maximum number of tessellators in use reached. Something may leak them!"); tes = new Tessellator(); } return tes; } public void startDrawing(TessellatorUser user, int primitive) { final Tessellator tes = reserveTessellator(); tes.startDrawing(primitive); user.execute(tes); tes.draw(); pool.add(tes); } public void startDrawingQuads(TessellatorUser user) { final Tessellator tes = reserveTessellator(); tes.startDrawingQuads(); user.execute(tes); tes.draw(); pool.add(tes); } }