EntityRenderer.java 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. package eu.tankernn.gameEngine.renderEngine.entities;
  2. import static eu.tankernn.gameEngine.settings.Settings.BLUE;
  3. import static eu.tankernn.gameEngine.settings.Settings.GREEN;
  4. import static eu.tankernn.gameEngine.settings.Settings.RED;
  5. import java.util.List;
  6. import java.util.Map;
  7. import org.lwjgl.opengl.GL11;
  8. import org.lwjgl.util.vector.Matrix4f;
  9. import org.lwjgl.util.vector.Vector4f;
  10. import eu.tankernn.gameEngine.entities.Entity;
  11. import eu.tankernn.gameEngine.entities.Light;
  12. import eu.tankernn.gameEngine.loader.models.TexturedModel;
  13. import eu.tankernn.gameEngine.loader.textures.ModelTexture;
  14. import eu.tankernn.gameEngine.loader.textures.Texture;
  15. import eu.tankernn.gameEngine.renderEngine.MasterRenderer;
  16. import eu.tankernn.gameEngine.util.ICamera;
  17. import eu.tankernn.gameEngine.util.Maths;
  18. /**
  19. * Renderer for entities.
  20. *
  21. * @author Frans
  22. *
  23. */
  24. public class EntityRenderer {
  25. private EntityShader shader;
  26. /**
  27. * Starts shader and loads initial values.
  28. *
  29. * @param shader
  30. * The shader to use when rendering entities
  31. * @param projectionMatrix
  32. * The projection matrix to use when rendering entities
  33. */
  34. public EntityRenderer(Matrix4f projectionMatrix) {
  35. this.shader = new EntityShader();
  36. shader.start();
  37. shader.projectionMatrix.loadMatrix(projectionMatrix);
  38. shader.connectTextureUnits();
  39. shader.stop();
  40. }
  41. /**
  42. * Renders entities to the current frame buffer.
  43. *
  44. * @param entities
  45. * The entities to render.
  46. * @param toShadowSpace
  47. * Transformation matrix to shadow space. Used for applying
  48. * shadows.
  49. */
  50. public void render(Map<TexturedModel, List<Entity>> entities, Matrix4f toShadowSpace, ICamera cam,
  51. Vector4f clipPlane, List<Light> lights, Texture environmentMap) {
  52. shader.start();
  53. shader.plane.loadVec4(clipPlane);
  54. shader.skyColor.loadVec3(RED, GREEN, BLUE);
  55. shader.loadLights(lights);
  56. shader.viewMatrix.loadCamera(cam);
  57. shader.toShadowMapSpace.loadMatrix(toShadowSpace);
  58. shader.cameraPosition.loadVec3(cam.getPosition());
  59. for (TexturedModel model : entities.keySet()) {
  60. prepareTexturedModel(model, environmentMap);
  61. List<Entity> batch = entities.get(model);
  62. for (Entity entity : batch) {
  63. prepareInstance(entity);
  64. GL11.glDrawElements(GL11.GL_TRIANGLES, model.getRawModel().getIndexCount(), GL11.GL_UNSIGNED_INT, 0);
  65. }
  66. unbindTexturedModel(model);
  67. }
  68. shader.stop();
  69. }
  70. public void cleanUp() {
  71. shader.cleanUp();
  72. }
  73. private void prepareTexturedModel(TexturedModel model, Texture environmentMap) {
  74. model.getRawModel().bind(0, 1, 2);
  75. ModelTexture texture = model.getModelTexture();
  76. shader.numberOfRows.loadFloat(texture.getNumberOfRows());
  77. if (texture.hasTransparency())
  78. MasterRenderer.disableCulling();
  79. shader.useFakeLighting.loadBoolean(texture.isUseFakeLighting());
  80. shader.shineDamper.loadFloat(texture.getShineDamper());
  81. shader.reflectivity.loadFloat(texture.getReflectivity());
  82. model.getModelTexture().getTexture().bindToUnit(0);
  83. shader.usesSpecularMap.loadBoolean(texture.hasSpecularMap());
  84. if (texture.hasSpecularMap()) {
  85. texture.getSpecularMap().bindToUnit(1);
  86. }
  87. bindEnvironmentMap(environmentMap);
  88. }
  89. private void bindEnvironmentMap(Texture environmentMap) {
  90. environmentMap.bindToUnit(10);
  91. }
  92. private void unbindTexturedModel(TexturedModel model) {
  93. MasterRenderer.enableCulling();
  94. model.getRawModel().unbind(0, 1, 2);
  95. }
  96. private void prepareInstance(Entity entity) {
  97. Matrix4f transformationMatrix = Maths.createTransformationMatrix(entity.getPosition(), entity.getRotX(),
  98. entity.getRotY(), entity.getRotZ(), entity.getScale());
  99. shader.transformationMatrix.loadMatrix(transformationMatrix);
  100. shader.offset.loadVec2(entity.getTextureXOffset(), entity.getTextureYOffset());
  101. }
  102. }