MasterRenderer.java 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218
  1. package eu.tankernn.gameEngine.renderEngine;
  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 static org.lwjgl.opengl.GL11.GL_COLOR_BUFFER_BIT;
  6. import static org.lwjgl.opengl.GL11.GL_DEPTH_BUFFER_BIT;
  7. import java.util.ArrayList;
  8. import java.util.HashMap;
  9. import java.util.List;
  10. import java.util.Map;
  11. import org.lwjgl.opengl.GL11;
  12. import org.lwjgl.opengl.GL13;
  13. import org.lwjgl.util.vector.Vector4f;
  14. import eu.tankernn.gameEngine.entities.Camera;
  15. import eu.tankernn.gameEngine.entities.Entity;
  16. import eu.tankernn.gameEngine.entities.Light;
  17. import eu.tankernn.gameEngine.loader.models.TexturedModel;
  18. import eu.tankernn.gameEngine.renderEngine.entities.EntityRenderer;
  19. import eu.tankernn.gameEngine.renderEngine.normalMap.NormalMappingRenderer;
  20. import eu.tankernn.gameEngine.renderEngine.shadows.ShadowMapMasterRenderer;
  21. import eu.tankernn.gameEngine.renderEngine.skybox.Skybox;
  22. import eu.tankernn.gameEngine.renderEngine.skybox.SkyboxRenderer;
  23. import eu.tankernn.gameEngine.renderEngine.terrain.TerrainRenderer;
  24. import eu.tankernn.gameEngine.terrains.Terrain;
  25. import eu.tankernn.gameEngine.textures.Texture;
  26. import eu.tankernn.gameEngine.util.ICamera;
  27. /**
  28. * Handles most of the rendering in the game.
  29. *
  30. * @author Frans
  31. */
  32. public class MasterRenderer {
  33. private static final Vector4f NO_CLIP = new Vector4f(0, 0, 0, 1);
  34. private EntityRenderer entityRenderer;
  35. private TerrainRenderer terrainRenderer;
  36. private SkyboxRenderer skyboxRenderer;
  37. private NormalMappingRenderer normalMapRenderer;
  38. private ShadowMapMasterRenderer shadowMapRenderer;
  39. private Map<TexturedModel, List<Entity>> entities = new HashMap<TexturedModel, List<Entity>>();
  40. private Map<TexturedModel, List<Entity>> normalMapEntities = new HashMap<TexturedModel, List<Entity>>();
  41. private List<Terrain> terrains = new ArrayList<Terrain>();
  42. /**
  43. * Sets up most other renderers for rendering.
  44. *
  45. * @param loader
  46. * The main <code>Loader</code>, used by some other renderers
  47. * @param camera
  48. * The main <code>Camera</code>
  49. */
  50. public MasterRenderer(Loader loader, Camera camera, Skybox skybox) {
  51. enableCulling();
  52. terrainRenderer = new TerrainRenderer(camera.getProjectionMatrix());
  53. normalMapRenderer = new NormalMappingRenderer(camera.getProjectionMatrix());
  54. shadowMapRenderer = new ShadowMapMasterRenderer(camera);
  55. skyboxRenderer = new SkyboxRenderer(loader, camera.getProjectionMatrix(), skybox);
  56. entityRenderer = new EntityRenderer(camera.getProjectionMatrix());
  57. }
  58. /**
  59. * Enables culling of faces facing away from the camera.
  60. */
  61. public static void enableCulling() {
  62. GL11.glEnable(GL11.GL_CULL_FACE);
  63. GL11.glCullFace(GL11.GL_BACK);
  64. }
  65. /**
  66. * Disables culling of faces facing away from the camera. Used when
  67. * rendering flat objects.
  68. */
  69. public static void disableCulling() {
  70. GL11.glDisable(GL11.GL_CULL_FACE);
  71. }
  72. /**
  73. * Renders a scene.
  74. *
  75. * @param scene
  76. * The <code>Scene</code> to render.
  77. * @param clipPlane
  78. * The clip plane.
  79. */
  80. public void renderScene(Scene scene, Vector4f clipPlane) {
  81. scene.getTerrainPack().prepareRenderTerrains(this);
  82. for (Entity e : scene.getEntities()) {
  83. processEntity(e);
  84. }
  85. for (Entity e : scene.getNormalEntities()) {
  86. processNormalMappedEntity(e);
  87. }
  88. render(scene.getLights(), scene.getCamera(), clipPlane, scene.getEnvironmentMap());
  89. }
  90. public void renderLowQualityScene(Scene scene, ICamera camera) {
  91. prepare();
  92. entityRenderer.render(entities, shadowMapRenderer.getToShadowMapSpaceMatrix(), camera, NO_CLIP, scene.getLights(), scene.getEnvironmentMap());
  93. normalMapRenderer.render(normalMapEntities, NO_CLIP, scene.getLights(), camera);
  94. terrainRenderer.render(terrains, shadowMapRenderer.getToShadowMapSpaceMatrix(), camera, NO_CLIP, scene.getLights());
  95. }
  96. /**
  97. * Renders the current scene to the current buffer.
  98. *
  99. * @param lights
  100. * List of lights in the scene.
  101. * @param camera
  102. * The main camera.
  103. * @param clipPlane
  104. * The clip plane.
  105. */
  106. public void render(List<Light> lights, ICamera camera, Vector4f clipPlane, Texture environmentMap) {
  107. prepare();
  108. entityRenderer.render(entities, shadowMapRenderer.getToShadowMapSpaceMatrix(), camera, clipPlane, lights, environmentMap);
  109. normalMapRenderer.render(normalMapEntities, clipPlane, lights, camera);
  110. terrainRenderer.render(terrains, shadowMapRenderer.getToShadowMapSpaceMatrix(), camera, clipPlane, lights);
  111. skyboxRenderer.render(camera, RED, GREEN, BLUE);
  112. entities.clear();
  113. terrains.clear();
  114. normalMapEntities.clear();
  115. }
  116. /**
  117. * Adds an entity to the list of entities.
  118. *
  119. * @param entity
  120. * Entity to add to the list
  121. */
  122. public void processEntity(Entity entity) {
  123. TexturedModel entityModel = entity.getModel();
  124. List<Entity> batch = entities.get(entityModel);
  125. if (batch != null) {
  126. batch.add(entity);
  127. } else {
  128. List<Entity> newBatch = new ArrayList<Entity>();
  129. newBatch.add(entity);
  130. entities.put(entityModel, newBatch);
  131. }
  132. }
  133. /**
  134. * Same as {@link #processEntity(Entity)}, but for normal-mapped entities.
  135. *
  136. * @param entity
  137. * Entity to add to the list
  138. */
  139. public void processNormalMappedEntity(Entity entity) {
  140. TexturedModel entityModel = entity.getModel();
  141. List<Entity> batch = normalMapEntities.get(entityModel);
  142. if (batch != null) {
  143. batch.add(entity);
  144. } else {
  145. List<Entity> newBatch = new ArrayList<Entity>();
  146. newBatch.add(entity);
  147. normalMapEntities.put(entityModel, newBatch);
  148. }
  149. }
  150. /**
  151. * Adds specified terrain to the terrain list.
  152. *
  153. * @param terrain
  154. * Terrain object to add to list
  155. */
  156. public void processTerrain(Terrain terrain) {
  157. terrains.add(terrain);
  158. }
  159. public void renderShadowMap(List<Entity> entityList, Light sun) {
  160. for (Entity e : entityList) {
  161. processEntity(e);
  162. }
  163. shadowMapRenderer.render(entities, sun);
  164. entities.clear();
  165. }
  166. /**
  167. * Gets the shadow map texture from the <code>shadowMapRenderer</code>.
  168. *
  169. * @return
  170. */
  171. public int getShadowMapTexture() {
  172. return shadowMapRenderer.getShadowMap();
  173. }
  174. /**
  175. * Runs the cleanup method for the other renderers.
  176. */
  177. public void cleanUp() {
  178. entityRenderer.cleanUp();
  179. terrainRenderer.cleanUp();
  180. normalMapRenderer.cleanUp();
  181. shadowMapRenderer.cleanUp();
  182. }
  183. /**
  184. * Prepares the current buffer for rendering.
  185. */
  186. public void prepare() {
  187. GL11.glEnable(GL11.GL_DEPTH_TEST | GL11.GL_DEPTH_BUFFER_BIT);
  188. GL11.glClearColor(RED, GREEN, BLUE, 1);
  189. GL11.glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // clear the
  190. // framebuffer
  191. GL13.glActiveTexture(GL13.GL_TEXTURE5);
  192. GL11.glBindTexture(GL11.GL_TEXTURE_2D, getShadowMapTexture());
  193. }
  194. }