MainLoop.java 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244
  1. package eu.tankernn.gameEngine;
  2. import java.io.IOException;
  3. import java.util.ArrayList;
  4. import java.util.List;
  5. import java.util.Random;
  6. import org.lwjgl.input.Mouse;
  7. import org.lwjgl.opengl.Display;
  8. import org.lwjgl.opengl.GL30;
  9. import org.lwjgl.util.vector.Vector2f;
  10. import org.lwjgl.util.vector.Vector3f;
  11. import org.lwjgl.util.vector.Vector4f;
  12. import eu.tankernn.gameEngine.entities.Camera;
  13. import eu.tankernn.gameEngine.entities.Entity3D;
  14. import eu.tankernn.gameEngine.entities.Light;
  15. import eu.tankernn.gameEngine.entities.Player;
  16. import eu.tankernn.gameEngine.entities.PlayerCamera;
  17. import eu.tankernn.gameEngine.environmentMap.EnvironmentMapRenderer;
  18. import eu.tankernn.gameEngine.loader.Loader;
  19. import eu.tankernn.gameEngine.loader.font.FontType;
  20. import eu.tankernn.gameEngine.loader.font.GUIText;
  21. import eu.tankernn.gameEngine.loader.textures.TerrainTexturePack;
  22. import eu.tankernn.gameEngine.loader.textures.Texture;
  23. import eu.tankernn.gameEngine.particles.ParticleMaster;
  24. import eu.tankernn.gameEngine.particles.ParticleSystem;
  25. import eu.tankernn.gameEngine.particles.ParticleTexture;
  26. import eu.tankernn.gameEngine.postProcessing.PostProcessor;
  27. import eu.tankernn.gameEngine.renderEngine.DisplayManager;
  28. import eu.tankernn.gameEngine.renderEngine.Fbo;
  29. import eu.tankernn.gameEngine.renderEngine.MasterRenderer;
  30. import eu.tankernn.gameEngine.renderEngine.MultisampleMultitargetFbo;
  31. import eu.tankernn.gameEngine.renderEngine.Scene;
  32. import eu.tankernn.gameEngine.renderEngine.font.TextMaster;
  33. import eu.tankernn.gameEngine.renderEngine.gui.GuiRenderer;
  34. import eu.tankernn.gameEngine.renderEngine.gui.GuiTexture;
  35. import eu.tankernn.gameEngine.renderEngine.skybox.Skybox;
  36. import eu.tankernn.gameEngine.renderEngine.water.WaterMaster;
  37. import eu.tankernn.gameEngine.renderEngine.water.WaterTile;
  38. import eu.tankernn.gameEngine.settings.Settings;
  39. import eu.tankernn.gameEngine.terrains.Terrain;
  40. import eu.tankernn.gameEngine.terrains.TerrainPack;
  41. import eu.tankernn.gameEngine.util.DistanceSorter;
  42. import eu.tankernn.gameEngine.util.InternalFile;
  43. import eu.tankernn.gameEngine.util.MousePicker;
  44. public class MainLoop {
  45. private static final int SEED = 1235;
  46. // Skybox settings
  47. public static final String[] TEXTURE_FILES = { "alps_ft", "alps_bk", "alps_up", "alps_dn", "alps_rt", "alps_lf", };
  48. public static final String[] NIGHT_TEXTURE_FILES = { "midnight_ft", "midnight_bk", "midnight_up", "midnight_dn",
  49. "midnight_rt", "midnight_lf" };
  50. // Water settings
  51. public static final String DUDV_MAP = "waterDUDV.png";
  52. public static final String NORMAL_MAP = "waterNormalMap.png";
  53. public static final boolean DEBUG = true;
  54. static List<Entity3D> entities = new ArrayList<Entity3D>();
  55. static List<Light> lights = new ArrayList<Light>();
  56. public static void main(String[] args) throws IOException {
  57. DisplayManager.createDisplay("Tankernn Game Engine tester");
  58. Loader loader = new Loader();
  59. loader.readModelSpecification(new InternalFile("models.json"));
  60. // ### Terrain textures ###
  61. Texture backgroundTexture = loader.loadTexture("grassy.png");
  62. Texture rTexture = loader.loadTexture("dirt.png");
  63. Texture gTexture = loader.loadTexture("pinkFlowers.png");
  64. Texture bTexture = loader.loadTexture("path.png");
  65. TerrainTexturePack texturePack = new TerrainTexturePack(backgroundTexture, rTexture, gTexture, bTexture);
  66. Texture blendMap = loader.loadTexture("blendMap.png");
  67. TerrainPack terrainPack = new TerrainPack(loader, texturePack, blendMap, SEED);
  68. // Player
  69. Entity3D entity = new Entity3D(loader.getModel(0), new Vector3f(0, 0, 20), new Vector3f(0, 0, 0), 1, loader.getBoundingBox(0));
  70. entities.add(entity);
  71. Player player = new Player(loader.getModel(0), new Vector3f(10, 0, 50), new Vector3f(0, 0, 0), 1, loader.getBoundingBox(0),
  72. terrainPack);
  73. entities.add(player);
  74. Camera camera = new PlayerCamera(player, terrainPack);
  75. InternalFile[] dayTextures = InternalFile.fromFilenames("skybox", TEXTURE_FILES, "png"),
  76. nightTextures = InternalFile.fromFilenames("skybox", NIGHT_TEXTURE_FILES, "png");
  77. Skybox skybox = new Skybox(loader, Texture.newCubeMap(dayTextures, 200), Texture.newCubeMap(nightTextures, 200), 200);
  78. MasterRenderer renderer = new MasterRenderer(loader, camera, skybox);
  79. ParticleMaster particleMaster = new ParticleMaster(loader, camera.getProjectionMatrix());
  80. TextMaster textMaster = new TextMaster(loader);
  81. FontType font = new FontType(loader.loadTexture("arial.png"), new InternalFile("arial.fnt"));
  82. GUIText text = new GUIText("Sample text", 1, font, new Vector2f(0.5f, 0.0f), 0.5f, false).setColor(0, 1, 0);
  83. GUIText fpsText = new GUIText("FPS: ", 1, font, new Vector2f(0.0f, 0.0f), 0.5f, false).setColor(1, 1, 1);
  84. textMaster.loadText(fpsText);
  85. textMaster.loadText(text);
  86. // Barrel
  87. Entity3D barrel = new Entity3D(loader.getModel(1), new Vector3f(75, 10, 75), new Vector3f(0, 0, 0), 1f, loader.getBoundingBox(1));
  88. entities.add(barrel);
  89. Light sun = new Light(new Vector3f(100000, 150000, -70000), new Vector3f(1f, 1f, 1f));
  90. Light flashLight = new Light(new Vector3f(0, 10, -10), new Vector3f(2, 0, 0), new Vector3f(1, 0.01f, 0.002f));
  91. lights.add(sun);
  92. lights.add(flashLight);
  93. // ### Random lantern generation ###
  94. Random rand = new Random(SEED);
  95. for (int i = 0; i < 100; i++) {
  96. float x = rand.nextFloat() * 1000;
  97. float z = rand.nextFloat() * 1000;
  98. entities.add(new Entity3D(loader.getModel(2), new Vector3f(x, terrainPack.getTerrainHeightByWorldPos(x, z), z), new Vector3f(),
  99. 1, loader.getBoundingBox(2)));
  100. }
  101. terrainPack.addWaitingForTerrainHeight(entities.toArray(new Entity3D[entities.size()]));
  102. // #### Water rendering ####
  103. WaterMaster waterMaster = new WaterMaster(loader, loader.loadTexture(DUDV_MAP), loader.loadTexture(NORMAL_MAP),
  104. camera);
  105. WaterTile water = new WaterTile(75, 75, 0, 50);
  106. waterMaster.addWaterTile(water);
  107. waterMaster.addWaterTile(new WaterTile(175, 75, 0, 50));
  108. // #### Gui rendering ####
  109. List<GuiTexture> guis = new ArrayList<GuiTexture>();
  110. GuiRenderer guiRenderer = new GuiRenderer(loader);
  111. ParticleTexture particleTexture = new ParticleTexture(loader.loadTexture("particles/cosmic.png"), 4, true);
  112. ParticleSystem ps = new ParticleSystem(particleTexture, 50, 10, 0.3f, 1);
  113. particleMaster.addSystem(ps);
  114. MultisampleMultitargetFbo multisampleFbo = new MultisampleMultitargetFbo(Display.getWidth(),
  115. Display.getHeight());
  116. Fbo outputFbo = new Fbo(Display.getWidth(), Display.getHeight(), Fbo.DEPTH_TEXTURE);
  117. Fbo outputFbo2 = new Fbo(Display.getWidth(), Display.getHeight(), Fbo.DEPTH_TEXTURE);
  118. PostProcessor postProcessor = new PostProcessor(loader);
  119. MousePicker picker = new MousePicker(camera, camera.getProjectionMatrix(), entities, guis);
  120. while (!Display.isCloseRequested()) {
  121. barrel.increaseRotation(new Vector3f(0, 1, 0));
  122. player.move();
  123. terrainPack.update(player);
  124. camera.update();
  125. picker.update(terrainPack);
  126. if (picker.getCurrentTerrainPoint() != null) {
  127. Vector3f currentPoint = picker.getCurrentTerrainPoint();
  128. flashLight.getPosition().set(currentPoint);
  129. flashLight.getPosition().y = terrainPack.getTerrainHeightByWorldPos(currentPoint.x, currentPoint.z)
  130. + 1.0f;
  131. }
  132. if (picker.getCurrentEntity() != null) {
  133. picker.getCurrentEntity().setScale(2);
  134. }
  135. if (picker.getCurrentGui() != null) {
  136. if (Mouse.isButtonDown(0)) {
  137. System.out.println("Clicked gui.");
  138. }
  139. }
  140. // Update debug info
  141. if (DEBUG) {
  142. Terrain currentTerrain = terrainPack.getTerrainByWorldPos(player.getPosition().x,
  143. player.getPosition().z);
  144. if (currentTerrain != null) {
  145. Vector3f pos = player.getPosition();
  146. String textString = "X: " + Math.floor(pos.x) + " Y: " + Math.floor(pos.y) + " Z: "
  147. + Math.floor(pos.z) + " Current terrain: " + currentTerrain.getX() / Settings.TERRAIN_SIZE
  148. + ":" + currentTerrain.getZ() / Settings.TERRAIN_SIZE;
  149. text.setText(textString);
  150. fpsText.setText(String.format("FPS: %.2f", getFps()));
  151. }
  152. }
  153. // Sort list of lights
  154. DistanceSorter.sort(lights, camera);
  155. renderer.renderShadowMap(entities, sun);
  156. ps.setPosition(player.getPosition());
  157. particleMaster.update(camera);
  158. Scene scene = new Scene(entities, terrainPack, lights, camera, skybox);
  159. EnvironmentMapRenderer.renderEnvironmentMap(scene.getEnvironmentMap(), scene, player.getPosition(),
  160. renderer);
  161. waterMaster.renderBuffers(renderer, scene);
  162. multisampleFbo.bindFrameBuffer();
  163. renderer.renderScene(scene, new Vector4f(0, 1, 0, Float.MAX_VALUE));
  164. waterMaster.renderWater(camera, lights);
  165. particleMaster.renderParticles(camera);
  166. multisampleFbo.unbindFrameBuffer();
  167. multisampleFbo.resolveToFbo(GL30.GL_COLOR_ATTACHMENT0, outputFbo);
  168. multisampleFbo.resolveToFbo(GL30.GL_COLOR_ATTACHMENT1, outputFbo2);
  169. postProcessor.doPostProcessing(outputFbo.getColourTexture(), outputFbo2.getColourTexture());
  170. guiRenderer.render(guis);
  171. textMaster.render();
  172. DisplayManager.updateDisplay();
  173. }
  174. postProcessor.cleanUp();
  175. outputFbo.cleanUp();
  176. outputFbo2.cleanUp();
  177. multisampleFbo.cleanUp();
  178. particleMaster.cleanUp();
  179. textMaster.cleanUp();
  180. waterMaster.cleanUp();
  181. guiRenderer.cleanUp();
  182. renderer.cleanUp();
  183. loader.cleanUp();
  184. terrainPack.cleanUp();
  185. DisplayManager.closeDisplay();
  186. }
  187. private static double getFps() {
  188. return 1 / DisplayManager.getFrameTimeSeconds();
  189. }
  190. }