MainLoop.java 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270
  1. package eu.tankernn.gameEngine;
  2. import java.io.FileNotFoundException;
  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.Entity;
  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.font.meshCreator.FontType;
  19. import eu.tankernn.gameEngine.font.meshCreator.GUIText;
  20. import eu.tankernn.gameEngine.loader.Loader;
  21. import eu.tankernn.gameEngine.loader.models.TexturedModel;
  22. import eu.tankernn.gameEngine.loader.obj.ModelData;
  23. import eu.tankernn.gameEngine.loader.obj.OBJFileLoader;
  24. import eu.tankernn.gameEngine.loader.textures.ModelTexture;
  25. import eu.tankernn.gameEngine.loader.textures.TerrainTexturePack;
  26. import eu.tankernn.gameEngine.loader.textures.Texture;
  27. import eu.tankernn.gameEngine.particles.ParticleMaster;
  28. import eu.tankernn.gameEngine.particles.ParticleSystem;
  29. import eu.tankernn.gameEngine.particles.ParticleTexture;
  30. import eu.tankernn.gameEngine.postProcessing.Fbo;
  31. import eu.tankernn.gameEngine.postProcessing.MultisampleMultitargetFbo;
  32. import eu.tankernn.gameEngine.postProcessing.PostProcessing;
  33. import eu.tankernn.gameEngine.renderEngine.DisplayManager;
  34. import eu.tankernn.gameEngine.renderEngine.MasterRenderer;
  35. import eu.tankernn.gameEngine.renderEngine.RawModel;
  36. import eu.tankernn.gameEngine.renderEngine.Scene;
  37. import eu.tankernn.gameEngine.renderEngine.font.TextMaster;
  38. import eu.tankernn.gameEngine.renderEngine.gui.GuiRenderer;
  39. import eu.tankernn.gameEngine.renderEngine.gui.GuiTexture;
  40. import eu.tankernn.gameEngine.renderEngine.skybox.Skybox;
  41. import eu.tankernn.gameEngine.renderEngine.water.WaterMaster;
  42. import eu.tankernn.gameEngine.renderEngine.water.WaterTile;
  43. import eu.tankernn.gameEngine.settings.Settings;
  44. import eu.tankernn.gameEngine.terrains.Terrain;
  45. import eu.tankernn.gameEngine.terrains.TerrainPack;
  46. import eu.tankernn.gameEngine.util.DistanceSorter;
  47. import eu.tankernn.gameEngine.util.InternalFile;
  48. import eu.tankernn.gameEngine.util.MousePicker;
  49. public class MainLoop {
  50. private static final int SEED = 1235;
  51. // Skybox settings
  52. public static final String[] TEXTURE_FILES = { "alps_ft", "alps_bk", "alps_up", "alps_dn", "alps_rt", "alps_lf", };
  53. public static final String[] NIGHT_TEXTURE_FILES = { "midnight_ft", "midnight_bk", "midnight_up", "midnight_dn",
  54. "midnight_rt", "midnight_lf" };
  55. // Water settings
  56. public static final String DUDV_MAP = "waterDUDV.png";
  57. public static final String NORMAL_MAP = "waterNormalMap.png";
  58. private static final boolean DEBUG = true;
  59. static List<Entity> entities = new ArrayList<Entity>();
  60. static List<Entity> normalMapEntities = new ArrayList<Entity>();
  61. static List<Light> lights = new ArrayList<Light>();
  62. public static void main(String[] args) throws FileNotFoundException {
  63. DisplayManager.createDisplay("Tankernn Game Engine tester");
  64. Loader loader = new Loader();
  65. // ### Terrain textures ###
  66. Texture backgroundTexture = loader.loadTexture("grassy.png");
  67. Texture rTexture = loader.loadTexture("dirt.png");
  68. Texture gTexture = loader.loadTexture("pinkFlowers.png");
  69. Texture bTexture = loader.loadTexture("path.png");
  70. TerrainTexturePack texturePack = new TerrainTexturePack(backgroundTexture, rTexture, gTexture, bTexture);
  71. Texture blendMap = loader.loadTexture("blendMap.png");
  72. TerrainPack terrainPack = new TerrainPack(loader, texturePack, blendMap, SEED);
  73. // Player
  74. ModelData playrModelData = OBJFileLoader.loadOBJ(new InternalFile("dragon.obj"));
  75. RawModel playerModel = loader.loadToVAO(playrModelData);
  76. TexturedModel texturedMonkeyModel = new TexturedModel(playerModel,
  77. new ModelTexture(loader.loadTexture("white.png")));
  78. ModelTexture texture = texturedMonkeyModel.getModelTexture();
  79. texture.setReflectivity(3);
  80. texture.setShineDamper(10);
  81. Entity entity = new Entity(texturedMonkeyModel, new Vector3f(0, 0, 20), 0, 0, 0, 1);
  82. entities.add(entity);
  83. TexturedModel monkey = new TexturedModel(playerModel, new ModelTexture(loader.loadTexture("white.png")));
  84. Player player = new Player(monkey, new Vector3f(10, 0, 50), 0, 0, 0, 1, terrainPack);
  85. entities.add(player);
  86. Camera camera = new PlayerCamera(player, terrainPack);
  87. InternalFile[] dayTextures = new InternalFile[TEXTURE_FILES.length],
  88. nightTextures = new InternalFile[NIGHT_TEXTURE_FILES.length];
  89. for (int i = 0; i < TEXTURE_FILES.length; i++)
  90. dayTextures[i] = new InternalFile("skybox/" + TEXTURE_FILES[i] + ".png");
  91. for (int i = 0; i < NIGHT_TEXTURE_FILES.length; i++)
  92. nightTextures[i] = new InternalFile("skybox/" + NIGHT_TEXTURE_FILES[i] + ".png");
  93. Skybox skybox = new Skybox(Texture.newCubeMap(dayTextures, 500), Texture.newCubeMap(nightTextures, 500), 500);
  94. MasterRenderer renderer = new MasterRenderer(loader, camera, skybox);
  95. ParticleMaster.init(loader, camera.getProjectionMatrix());
  96. TextMaster.init(loader);
  97. FontType font = new FontType(loader.loadTexture("arial.png"), "arial.fnt");
  98. GUIText text = new GUIText("Sample text", 3, font, new Vector2f(0.5f, 0.5f), 0.5f, true).setColor(1, 1, 1);
  99. // Barrel
  100. TexturedModel barrelModel = new TexturedModel(loader.loadOBJ(new InternalFile("barrel.obj")),
  101. new ModelTexture(loader.loadTexture("barrel.png")));
  102. barrelModel.getModelTexture().setNormalMap(loader.loadTexture("barrelNormal.png"))
  103. .setSpecularMap(loader.loadTexture("barrelS.png")).setShineDamper(10).setReflectivity(0.5f);
  104. Entity barrel = new Entity(barrelModel, new Vector3f(75, 10, 75), 0, 0, 0, 1f);
  105. normalMapEntities.add(barrel);
  106. Light sun = new Light(new Vector3f(100000, 150000, -70000), new Vector3f(1f, 1f, 1f));
  107. Light flashLight = new Light(new Vector3f(0, 10, -10), new Vector3f(2, 0, 0), new Vector3f(1, 0.01f, 0.002f));
  108. lights.add(sun);
  109. lights.add(flashLight);
  110. lights.add(new Light(new Vector3f(10, 100, 0), new Vector3f(0, 1, 0)));
  111. lights.add(new Light(new Vector3f(20, 100, 0), new Vector3f(0, 0, 1)));
  112. lights.add(new Light(new Vector3f(30, 100, 0), new Vector3f(1, 0, 0)));
  113. lights.add(new Light(new Vector3f(40, 100, 0), new Vector3f(1, 1, 0)));
  114. terrainPack.update(player);
  115. // ### Random grass generation ###
  116. ModelTexture textureAtlas = new ModelTexture(Texture.newTexture(new InternalFile("lantern.png")).create());
  117. textureAtlas.setNumberOfRows(1);
  118. TexturedModel grassModel = new TexturedModel(
  119. loader.loadToVAO(OBJFileLoader.loadOBJ(new InternalFile("lantern.obj"))), textureAtlas);
  120. grassModel.getModelTexture().setHasTransparency(true);
  121. grassModel.getModelTexture().setShineDamper(10);
  122. grassModel.getModelTexture().setReflectivity(0.5f);
  123. grassModel.getModelTexture().setSpecularMap(loader.loadTexture("lanternS.png"));
  124. Random rand = new Random();
  125. for (int i = 0; i < 1000; i++) {
  126. float x = rand.nextFloat() * 1000;
  127. float z = rand.nextFloat() * 1000;
  128. entities.add(new Entity(grassModel, rand.nextInt(4),
  129. new Vector3f(x, terrainPack.getTerrainHeightByWorldPos(x, z), z), 0, 0, 0, 1));
  130. }
  131. // #### Water rendering ####
  132. WaterMaster waterMaster = new WaterMaster(loader, DUDV_MAP, NORMAL_MAP, camera);
  133. WaterTile water = new WaterTile(75, 75, 0);
  134. waterMaster.addWaterTile(water);
  135. // #### Gui rendering ####
  136. List<GuiTexture> guis = new ArrayList<GuiTexture>();
  137. GuiRenderer guiRenderer = new GuiRenderer(loader);
  138. ParticleTexture particleTexture = new ParticleTexture(loader.loadTexture("particles/cosmic.png"), 4, true);
  139. ParticleSystem ps = new ParticleSystem(particleTexture, 50, 10, 0.3f, 4);
  140. MultisampleMultitargetFbo multisampleFbo = new MultisampleMultitargetFbo(Display.getWidth(),
  141. Display.getHeight());
  142. Fbo outputFbo = new Fbo(Display.getWidth(), Display.getHeight(), Fbo.DEPTH_TEXTURE);
  143. Fbo outputFbo2 = new Fbo(Display.getWidth(), Display.getHeight(), Fbo.DEPTH_TEXTURE);
  144. PostProcessing.init(loader);
  145. MousePicker picker = new MousePicker(camera, camera.getProjectionMatrix(), terrainPack, entities, guis);
  146. while (!Display.isCloseRequested()) {
  147. barrel.increaseRotation(0, 1, 0);
  148. player.move(terrainPack);
  149. terrainPack.update(player);
  150. camera.update();
  151. picker.update();
  152. if (picker.getCurrentTerrainPoint() != null) {
  153. Vector3f currentPoint = picker.getCurrentTerrainPoint();
  154. flashLight.getPosition().x = currentPoint.x;
  155. flashLight.getPosition().z = currentPoint.z;
  156. flashLight.getPosition().y = terrainPack.getTerrainHeightByWorldPos(currentPoint.x, currentPoint.z)
  157. + 1.0f;
  158. }
  159. if (picker.getCurrentGui() != null) {
  160. if (Mouse.isButtonDown(0)) {
  161. System.out.println("Clicked gui.");
  162. picker.getCurrentGui().getPosition().x += 0.1f;
  163. }
  164. }
  165. // Update debug info
  166. if (DEBUG) {
  167. Terrain currentTerrain = terrainPack.getTerrainByWorldPos(player.getPosition().x,
  168. player.getPosition().z);
  169. if (currentTerrain != null) {
  170. text.remove();
  171. Vector3f pos = player.getPosition();
  172. String textString = "X: " + Math.floor(pos.x) + " Y: " + Math.floor(pos.y) + " Z: "
  173. + Math.floor(pos.z) + " Current terrain: " + currentTerrain.getX() / Settings.TERRAIN_SIZE
  174. + ":" + currentTerrain.getZ() / Settings.TERRAIN_SIZE;
  175. text = new GUIText(textString, 1, font, new Vector2f(0.5f, 0f), 0.5f, false);
  176. }
  177. }
  178. // Sort list of lights
  179. DistanceSorter.sort(lights, camera);
  180. renderer.renderShadowMap(entities, sun);
  181. ps.generateParticles(player.getPosition());
  182. ParticleMaster.update(camera);
  183. Scene scene = new Scene(entities, normalMapEntities, terrainPack, lights, camera, skybox);
  184. EnvironmentMapRenderer.renderEnvironmentMap(scene.getEnvironmentMap(), scene, player.getPosition(),
  185. renderer);
  186. waterMaster.renderBuffers(renderer, scene);
  187. multisampleFbo.bindFrameBuffer();
  188. renderer.renderScene(scene, new Vector4f(0, 1, 0, Float.MAX_VALUE));
  189. waterMaster.renderWater(camera, lights);
  190. ParticleMaster.renderParticles(camera);
  191. multisampleFbo.unbindFrameBuffer();
  192. multisampleFbo.resolveToFbo(GL30.GL_COLOR_ATTACHMENT0, outputFbo);
  193. multisampleFbo.resolveToFbo(GL30.GL_COLOR_ATTACHMENT1, outputFbo2);
  194. PostProcessing.doPostProcessing(outputFbo.getColourTexture(), outputFbo2.getColourTexture());
  195. guiRenderer.render(guis);
  196. TextMaster.render();
  197. DisplayManager.updateDisplay();
  198. }
  199. PostProcessing.cleanUp();
  200. outputFbo.cleanUp();
  201. outputFbo2.cleanUp();
  202. multisampleFbo.cleanUp();
  203. ParticleMaster.cleanUp();
  204. TextMaster.cleanUp();
  205. waterMaster.cleanUp();
  206. guiRenderer.cleanUp();
  207. renderer.cleanUp();
  208. loader.cleanUp();
  209. terrainPack.cleanUp();
  210. DisplayManager.closeDisplay();
  211. }
  212. }