MainLoop.java 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292
  1. package eu.tankernn.gameEngine.tester;
  2. import java.io.File;
  3. import java.io.FileOutputStream;
  4. import java.io.IOException;
  5. import java.io.InputStream;
  6. import java.io.OutputStream;
  7. import java.net.URISyntaxException;
  8. import java.util.ArrayList;
  9. import java.util.Enumeration;
  10. import java.util.List;
  11. import java.util.Random;
  12. import java.util.jar.JarEntry;
  13. import java.util.jar.JarFile;
  14. import javax.swing.JOptionPane;
  15. import org.lwjgl.opengl.Display;
  16. import org.lwjgl.util.vector.Vector2f;
  17. import org.lwjgl.util.vector.Vector3f;
  18. import org.lwjgl.util.vector.Vector4f;
  19. import eu.tankernn.gameEngine.entities.Camera;
  20. import eu.tankernn.gameEngine.entities.Entity;
  21. import eu.tankernn.gameEngine.entities.Light;
  22. import eu.tankernn.gameEngine.entities.Player;
  23. import eu.tankernn.gameEngine.entities.PlayerCamera;
  24. import eu.tankernn.gameEngine.font.meshCreator.FontType;
  25. import eu.tankernn.gameEngine.font.meshCreator.GUIText;
  26. import eu.tankernn.gameEngine.font.rendering.TextMaster;
  27. import eu.tankernn.gameEngine.gui.GuiRenderer;
  28. import eu.tankernn.gameEngine.gui.GuiTexture;
  29. import eu.tankernn.gameEngine.models.RawModel;
  30. import eu.tankernn.gameEngine.models.TexturedModel;
  31. import eu.tankernn.gameEngine.normalMapping.objConverter.NormalMappedObjLoader;
  32. import eu.tankernn.gameEngine.objLoader.ModelData;
  33. import eu.tankernn.gameEngine.objLoader.OBJFileLoader;
  34. import eu.tankernn.gameEngine.particles.ParticleMaster;
  35. import eu.tankernn.gameEngine.particles.ParticleSystem;
  36. import eu.tankernn.gameEngine.particles.ParticleTexture;
  37. import eu.tankernn.gameEngine.postProcessing.Fbo;
  38. import eu.tankernn.gameEngine.postProcessing.PostProcessing;
  39. import eu.tankernn.gameEngine.renderEngine.DisplayManager;
  40. import eu.tankernn.gameEngine.renderEngine.Loader;
  41. import eu.tankernn.gameEngine.renderEngine.MasterRenderer;
  42. import eu.tankernn.gameEngine.renderEngine.Scene;
  43. import eu.tankernn.gameEngine.terrains.Terrain;
  44. import eu.tankernn.gameEngine.terrains.TerrainPack;
  45. import eu.tankernn.gameEngine.textures.ModelTexture;
  46. import eu.tankernn.gameEngine.textures.TerrainTexture;
  47. import eu.tankernn.gameEngine.textures.TerrainTexturePack;
  48. import eu.tankernn.gameEngine.util.MousePicker;
  49. import eu.tankernn.gameEngine.util.Sorter;
  50. import eu.tankernn.gameEngine.water.WaterMaster;
  51. import eu.tankernn.gameEngine.water.WaterTile;
  52. public class MainLoop {
  53. private static final int SEED = 1235;
  54. public static void main(String[] args) {
  55. exportNatives();
  56. List<Entity> entities = new ArrayList<Entity>();
  57. List<Entity> normalMapEntities = new ArrayList<Entity>();
  58. TerrainPack terrainPack = new TerrainPack();
  59. DisplayManager.createDisplay();
  60. Loader loader = new Loader();
  61. // Monkey
  62. ModelData monkeyData = OBJFileLoader.loadOBJ("character");
  63. RawModel monkeyModel = loader.loadToVAO(monkeyData);
  64. TexturedModel texturedMonkeyModel = new TexturedModel(monkeyModel, new ModelTexture(loader.loadTexture("erkky")));
  65. ModelTexture texture = texturedMonkeyModel.getTexture();
  66. texture.setReflectivity(3);
  67. texture.setShineDamper(10);
  68. Entity entity = new Entity(texturedMonkeyModel, new Vector3f(0, 0, 20), 0, 0, 0, 1);
  69. entities.add(entity);
  70. TexturedModel monkey = new TexturedModel(monkeyModel, new ModelTexture(loader.loadTexture("white")));
  71. Player player = new Player(monkey, new Vector3f(10, 0, 50), 0, 0, 0, 1, terrainPack);
  72. entities.add(player);
  73. Camera camera = new PlayerCamera(player, terrainPack);
  74. MasterRenderer renderer = new MasterRenderer(loader, camera);
  75. ParticleMaster.init(loader, renderer.getProjectionMatrix());
  76. TextMaster.init(loader);
  77. FontType font = new FontType(loader.loadTexture("arial"), "arial.fnt");
  78. GUIText text = new GUIText("Sample text", 3, font, new Vector2f(0.5f, 0.5f), 0.5f, true);
  79. text.setColor(1, 1, 1);
  80. //Barrel
  81. TexturedModel barrelModel = new TexturedModel(NormalMappedObjLoader.loadOBJ("barrel", loader), new ModelTexture(loader.loadTexture("barrel")));
  82. barrelModel.getTexture().setNormalMap(loader.loadTexture("barrelNormal"));
  83. barrelModel.getTexture().setShineDamper(10);
  84. barrelModel.getTexture().setReflectivity(0.5f);
  85. Entity barrel = new Entity(barrelModel, new Vector3f(75, 10, 75), 0, 0, 0, 1f);
  86. normalMapEntities.add(barrel);
  87. Light sun = new Light(new Vector3f(100000, 150000, -70000), new Vector3f(1, 1, 1));
  88. Light flashLight = new Light(new Vector3f(0, 10, -10), new Vector3f(2, 0, 0), new Vector3f(1, 0.01f, 0.002f));
  89. List<Light> lights = new ArrayList<Light>();
  90. lights.add(sun);
  91. lights.add(flashLight);
  92. lights.add(new Light(new Vector3f(10, 100, 0), new Vector3f(0, 1, 0)));
  93. lights.add(new Light(new Vector3f(20, 100, 0), new Vector3f(0, 0, 1)));
  94. lights.add(new Light(new Vector3f(30, 100, 0), new Vector3f(1, 0, 0)));
  95. lights.add(new Light(new Vector3f(40, 100, 0), new Vector3f(1, 1, 0)));
  96. // ### Terrain textures ###
  97. TerrainTexture backgroundTexture = new TerrainTexture(loader.loadTexture("grassy"));
  98. TerrainTexture rTexture = new TerrainTexture(loader.loadTexture("dirt"));
  99. TerrainTexture gTexture = new TerrainTexture(loader.loadTexture("pinkFlowers"));
  100. TerrainTexture bTexture = new TerrainTexture(loader.loadTexture("path"));
  101. TerrainTexturePack texturePack = new TerrainTexturePack(backgroundTexture, rTexture, gTexture, bTexture);
  102. TerrainTexture blendMap = new TerrainTexture(loader.loadTexture("blendMap"));
  103. terrainPack.addTerrain(new Terrain(0, 1, loader, texturePack, blendMap, SEED));
  104. terrainPack.addTerrain(new Terrain(1, 1, loader, texturePack, blendMap, SEED));
  105. terrainPack.addTerrain(new Terrain(0, 0, loader, texturePack, blendMap, SEED));
  106. terrainPack.addTerrain(new Terrain(1, 0, loader, texturePack, blendMap, SEED));
  107. // ### Random grass generation ###
  108. ModelTexture textureAtlas = new ModelTexture(loader.loadTexture("fern"));
  109. textureAtlas.setNumberOfRows(2);
  110. TexturedModel grassModel = new TexturedModel(loader.loadToVAO(OBJFileLoader.loadOBJ("fern")), textureAtlas);
  111. //grassModel.getTexture().setHasTransparency(true);
  112. //grassModel.getTexture().setUseFakeLighting(true);
  113. Random rand = new Random();
  114. for (int i = 0; i < 1000; i++) {
  115. float x = rand.nextFloat() * 1000;
  116. float z = rand.nextFloat() * 1000;
  117. entities.add(new Entity(grassModel, rand.nextInt(4), new Vector3f(x, terrainPack.getTerrainHeightByWorldPos(x, z), z), 0, 0, 0, 1));
  118. }
  119. MousePicker picker = new MousePicker(camera, renderer.getProjectionMatrix(), terrainPack, entities);
  120. // #### Water rendering ####
  121. WaterMaster waterMaster = new WaterMaster(loader, renderer);
  122. WaterTile water = new WaterTile(75, 75, 0);
  123. waterMaster.addWaterTile(water);
  124. // #### Gui rendering ####
  125. List<GuiTexture> guis = new ArrayList<GuiTexture>();
  126. GuiTexture depth = new GuiTexture(waterMaster.getBuffers().getRefractionDepthTexture(), new Vector2f(0.5f, 0.5f), new Vector2f(0.25f, 0.25f));
  127. GuiTexture refraction = new GuiTexture(waterMaster.getBuffers().getRefractionTexture(), new Vector2f(-0.5f, 0.5f), new Vector2f(0.25f, 0.25f));
  128. guis.add(depth);
  129. guis.add(refraction);
  130. GuiRenderer guiRenderer = new GuiRenderer(loader);
  131. ParticleTexture particleTexture = new ParticleTexture(loader.loadTexture("particles/cosmic"), 4, true);
  132. ParticleSystem ps = new ParticleSystem(particleTexture, 50, 10, 0.3f, 4);
  133. Fbo fbo = new Fbo(Display.getWidth(), Display.getHeight(), Fbo.DEPTH_RENDER_BUFFER);
  134. PostProcessing.init(loader);
  135. while (!Display.isCloseRequested()) {
  136. barrel.increaseRotation(0, 1, 0);
  137. player.move(terrainPack);
  138. camera.update();
  139. picker.update();
  140. if (picker.getCurrentTerrainPoint() != null) {
  141. Vector3f currentPoint = picker.getCurrentTerrainPoint();
  142. flashLight.getPosition().x = currentPoint.x;
  143. flashLight.getPosition().z = currentPoint.z;
  144. flashLight.getPosition().y = terrainPack.getTerrainHeightByWorldPos(currentPoint.x, currentPoint.z) + 1.0f;
  145. }
  146. // Update debug info
  147. Terrain currentTerrain = terrainPack.getTerrainByWorldPos(player.getPosition().x, player.getPosition().z);
  148. if (currentTerrain != null) {
  149. text.remove();
  150. Vector3f pos = player.getPosition();
  151. String textString = "X: " + Math.floor(pos.x) + " Y: " + Math.floor(pos.y) + " Z: " + Math.floor(pos.z);
  152. text = new GUIText(textString, 1, font, new Vector2f(0.5f, 0f), 0.5f, false);
  153. }
  154. //Sort list of lights
  155. lights = new Sorter<Light>(lights, camera).sortByDistance();
  156. renderer.renderShadowMap(entities, sun);
  157. ps.generateParticles(player.getPosition());
  158. ParticleMaster.update(camera);
  159. Scene scene = new Scene(entities, normalMapEntities, terrainPack, lights, camera);
  160. waterMaster.renderBuffers(renderer, scene);
  161. fbo.bindFrameBuffer();
  162. renderer.renderScene(scene, new Vector4f(0, 1, 0, Float.MAX_VALUE));
  163. waterMaster.renderWater(camera, lights);
  164. ParticleMaster.renderParticles(camera);
  165. fbo.unbindFrameBuffer();
  166. PostProcessing.doPostProcessing(fbo.getColourTexture());
  167. guiRenderer.render(guis);
  168. TextMaster.render();
  169. DisplayManager.updateDisplay();
  170. }
  171. PostProcessing.cleanUp();
  172. fbo.cleanUp();
  173. ParticleMaster.cleanUp();
  174. TextMaster.cleanUp();
  175. waterMaster.cleanUp();
  176. guiRenderer.cleanUp();
  177. renderer.cleanUp();
  178. loader.cleanUp();
  179. DisplayManager.closeDisplay();
  180. }
  181. private static void exportNatives() {
  182. File nativeDir = new File("natives");
  183. if (!nativeDir.isDirectory() || nativeDir.list().length == 0) {
  184. try {
  185. nativeDir.mkdir();
  186. File jarFile = null;
  187. try {
  188. jarFile = new File(MainLoop.class.getProtectionDomain().getCodeSource().getLocation().toURI().getPath());
  189. } catch (URISyntaxException e1) {
  190. e1.printStackTrace();
  191. }
  192. if (jarFile != null && jarFile.isFile()) { // Run with JAR file
  193. final JarFile jar = new JarFile(jarFile);
  194. final Enumeration<JarEntry> entries = jar.entries(); //gives ALL entries in jar
  195. while (entries.hasMoreElements()) {
  196. final String name = entries.nextElement().getName();
  197. if (name.endsWith(".dll") || name.endsWith(".so") || name.endsWith(".dylib") || name.endsWith(".jnilb")) { //filter according to the path
  198. System.out.println(name);
  199. try {
  200. exportFile(name, "natives");
  201. } catch (Exception e) {
  202. e.printStackTrace();
  203. }
  204. }
  205. }
  206. jar.close();
  207. System.setProperty("org.lwjgl.librarypath", nativeDir.getAbsolutePath());
  208. } else { // Run with IDE
  209. }
  210. } catch (IOException e) {
  211. JOptionPane.showMessageDialog(null, "Could not export natives. Execute in terminal to see full error output.", "Export natives", JOptionPane.ERROR_MESSAGE);
  212. e.printStackTrace();
  213. }
  214. }
  215. }
  216. private static String exportFile(String classPath, String targetDir) throws Exception {
  217. InputStream stream = null;
  218. OutputStream resStreamOut = null;
  219. try {
  220. stream = MainLoop.class.getResourceAsStream("/" + classPath);//note that each / is a directory down in the "jar tree" been the jar the root of the tree
  221. if (stream == null) {
  222. throw new Exception("Cannot get resource \"" + classPath + "\" from Jar file.");
  223. }
  224. int readBytes;
  225. byte[] buffer = new byte[4096];
  226. File outFile = new File(targetDir + "/" + classPath);
  227. outFile.getParentFile().mkdirs();
  228. resStreamOut = new FileOutputStream(outFile);
  229. while ((readBytes = stream.read(buffer)) > 0) {
  230. resStreamOut.write(buffer, 0, readBytes);
  231. }
  232. stream.close();
  233. resStreamOut.close();
  234. } catch (Exception ex) {
  235. throw ex;
  236. }
  237. return classPath;
  238. }
  239. }