EntityRenderer.java 4.6 KB

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