package renderEngine; import java.util.List; import java.util.Map; import org.atriaSoft.etk.math.Matrix4f; import org.atriaSoft.etk.math.Vector2f; import org.lwjgl.opengl.GL11; import org.lwjgl.opengl.GL13; import org.lwjgl.opengl.GL20; import org.lwjgl.opengl.GL30; import org.lwjgl.system.windows.DISPLAY_DEVICE; import entities.Entity; import models.RawModel; import models.TexturedModel; import shaders.StaticShader; import textures.ModelTexture; import toolbox.Maths; /** * Handles the rendering of a model to the screen. * * @author Karl * */ public class EntityRenderer { private StaticShader shader; public EntityRenderer(StaticShader shader, Matrix4f projectionMatrix) { this.shader = shader; shader.start(); shader.loadProjectionMatrix(projectionMatrix); shader.stop(); } public void render(Map> entities) { for (TexturedModel model:entities.keySet()) { prepareTexturedModel(model); List batch = entities.get(model); for (Entity entity:batch) { prepareInstance(entity); GL11.glDrawElements(GL11.GL_TRIANGLES, model.getRawModel().getVertexCount(), GL11.GL_UNSIGNED_INT, 0); } unbindTexturedModel(); } } private void prepareTexturedModel(TexturedModel model) { RawModel rawModel = model.getRawModel(); GL30.glBindVertexArray(rawModel.getVaoID()); GL20.glEnableVertexAttribArray(0); GL20.glEnableVertexAttribArray(1); GL20.glEnableVertexAttribArray(2); ModelTexture texture = model.getTexture(); if (texture.isHasTransparency()) { MasterRenderer.disableCulling(); } shader.loadFakeLightingVariable(texture.isUseFakeLighting()); shader.loadShineVariable(texture.getShineDamper(), texture.getReflectivity()); GL13.glActiveTexture(GL13.GL_TEXTURE0); GL11.glBindTexture(GL11.GL_TEXTURE_2D, model.getTexture().getTexturedID()); } private void unbindTexturedModel() { MasterRenderer.enableCulling(); GL20.glDisableVertexAttribArray(0); GL20.glDisableVertexAttribArray(1); GL20.glDisableVertexAttribArray(2); GL30.glBindVertexArray(0); } private void prepareInstance(Entity entity) { Matrix4f transformationMatrix = Maths.createTransformationMatrix(entity.getPosition(), entity.getRotation(), entity.getScale()); shader.loadTransformationMatrix(transformationMatrix); } }