EntityRenderer.java 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  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.animation.model.AnimatedModel;
  11. import eu.tankernn.gameEngine.entities.Entity3D;
  12. import eu.tankernn.gameEngine.entities.Light;
  13. import eu.tankernn.gameEngine.loader.models.TexturedModel;
  14. import eu.tankernn.gameEngine.loader.textures.ModelTexture;
  15. import eu.tankernn.gameEngine.loader.textures.Texture;
  16. import eu.tankernn.gameEngine.renderEngine.MasterRenderer;
  17. import eu.tankernn.gameEngine.util.ICamera;
  18. import eu.tankernn.gameEngine.util.Maths;
  19. import eu.tankernn.gameEngine.util.OpenGlUtils;
  20. /**
  21. * Renderer for entities.
  22. *
  23. * @author Frans
  24. */
  25. public class EntityRenderer<S extends EntityShader> {
  26. protected S shader;
  27. /**
  28. * Starts shader and loads initial values.
  29. *
  30. * @param shader The shader to use when rendering entities
  31. * @param projectionMatrix The projection matrix to use when rendering
  32. * entities
  33. */
  34. @SuppressWarnings("unchecked")
  35. public EntityRenderer(Matrix4f projectionMatrix) {
  36. this((S) new EntityShader(), projectionMatrix);
  37. }
  38. protected EntityRenderer(S shader, Matrix4f projectionMatrix) {
  39. this.shader = shader;
  40. shader.start();
  41. shader.projectionMatrix.loadMatrix(projectionMatrix);
  42. shader.connectTextureUnits();
  43. shader.stop();
  44. }
  45. /**
  46. * Renders entities to the current frame buffer.
  47. *
  48. * @param entities The entities to render.
  49. * @param toShadowSpace Transformation matrix to shadow space. Used for
  50. * applying shadows.
  51. */
  52. public void render(Map<TexturedModel, List<Entity3D>> entities, Matrix4f toShadowSpace, ICamera cam, Vector4f clipPlane, List<Light> lights, Texture environmentMap) {
  53. OpenGlUtils.antialias(true);
  54. OpenGlUtils.disableBlending();
  55. OpenGlUtils.enableDepthTesting(true);
  56. shader.start();
  57. shader.plane.loadVec4(clipPlane);
  58. shader.skyColor.loadVec3(RED, GREEN, BLUE);
  59. shader.loadLights(lights, cam.getViewMatrix());
  60. shader.viewMatrix.loadCamera(cam);
  61. shader.toShadowMapSpace.loadMatrix(toShadowSpace);
  62. shader.cameraPosition.loadVec3(cam.getPosition());
  63. for (TexturedModel model: entities.keySet()) {
  64. prepareTexturedModel(model, environmentMap);
  65. List<Entity3D> batch = entities.get(model);
  66. for (Entity3D entity: batch) {
  67. prepareInstance(entity, model);
  68. GL11.glDrawElements(GL11.GL_TRIANGLES, model.getModel().getIndexCount(), GL11.GL_UNSIGNED_INT, 0);
  69. }
  70. unbindTexturedModel(model);
  71. }
  72. shader.stop();
  73. }
  74. public void finalize() {
  75. shader.finalize();
  76. }
  77. private void prepareTexturedModel(TexturedModel model, Texture environmentMap) {
  78. if (model instanceof AnimatedModel) {
  79. model.getModel().bind(0, 1, 2, 4, 5);
  80. shader.animated.loadBoolean(true);
  81. shader.jointTransforms.loadMatrixArray(((AnimatedModel) model).getJointTransforms());
  82. } else {
  83. model.getModel().bind(0, 1, 2, 3);
  84. shader.animated.loadBoolean(false);
  85. }
  86. ModelTexture texture = model.getTexture();
  87. shader.numberOfRows.loadFloat(texture.getNumberOfRows());
  88. if (texture.hasTransparency())
  89. MasterRenderer.disableCulling();
  90. shader.useFakeLighting.loadBoolean(texture.isUseFakeLighting());
  91. shader.shineDamper.loadFloat(texture.getShineDamper());
  92. shader.reflectivity.loadFloat(texture.getReflectivity());
  93. shader.refractivity.loadFloat(texture.getRefractivity());
  94. model.getTexture().getTexture().bindToUnit(0);
  95. shader.usesSpecularMap.loadBoolean(texture.hasSpecularMap());
  96. if (texture.hasSpecularMap()) {
  97. texture.getSpecularMap().bindToUnit(2);
  98. }
  99. shader.usesNormalMap.loadBoolean(texture.hasNormalMap());
  100. if (texture.hasNormalMap())
  101. texture.getNormalMap().bindToUnit(1);
  102. bindEnvironmentMap(environmentMap);
  103. }
  104. private void bindEnvironmentMap(Texture environmentMap) {
  105. environmentMap.bindToUnit(10);
  106. }
  107. private void unbindTexturedModel(TexturedModel model) {
  108. MasterRenderer.enableCulling();
  109. if (model instanceof AnimatedModel)
  110. model.getModel().unbind(0, 1, 2, 4, 5);
  111. else
  112. model.getModel().unbind(0, 1, 2, 3);
  113. }
  114. protected void prepareInstance(Entity3D entity, TexturedModel model) {
  115. Matrix4f transformationMatrix = Maths.createTransformationMatrix(entity.getPosition(), entity.getRotation(), entity.getScale());
  116. shader.transformationMatrix.loadMatrix(transformationMatrix);
  117. shader.offset.loadVec2(model.getTextureXOffset(), model.getTextureYOffset());
  118. }
  119. }