EntityRenderer.java 4.5 KB

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