package eu.tankernn.gameEngine.tester; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.URISyntaxException; import java.util.ArrayList; import java.util.Enumeration; import java.util.List; import java.util.Random; import java.util.jar.JarEntry; import java.util.jar.JarFile; import javax.swing.JOptionPane; import org.lwjgl.opengl.Display; import org.lwjgl.util.vector.Vector2f; import org.lwjgl.util.vector.Vector3f; import org.lwjgl.util.vector.Vector4f; import eu.tankernn.gameEngine.entities.Camera; import eu.tankernn.gameEngine.entities.Entity; import eu.tankernn.gameEngine.entities.Light; import eu.tankernn.gameEngine.entities.Player; import eu.tankernn.gameEngine.entities.PlayerCamera; import eu.tankernn.gameEngine.font.meshCreator.FontType; import eu.tankernn.gameEngine.font.meshCreator.GUIText; import eu.tankernn.gameEngine.font.rendering.TextMaster; import eu.tankernn.gameEngine.gui.GuiRenderer; import eu.tankernn.gameEngine.gui.GuiTexture; import eu.tankernn.gameEngine.models.RawModel; import eu.tankernn.gameEngine.models.TexturedModel; import eu.tankernn.gameEngine.normalMapping.objConverter.NormalMappedObjLoader; import eu.tankernn.gameEngine.objLoader.ModelData; import eu.tankernn.gameEngine.objLoader.OBJFileLoader; import eu.tankernn.gameEngine.particles.ParticleMaster; import eu.tankernn.gameEngine.particles.ParticleSystem; import eu.tankernn.gameEngine.particles.ParticleTexture; import eu.tankernn.gameEngine.postProcessing.Fbo; import eu.tankernn.gameEngine.postProcessing.PostProcessing; import eu.tankernn.gameEngine.renderEngine.DisplayManager; import eu.tankernn.gameEngine.renderEngine.Loader; import eu.tankernn.gameEngine.renderEngine.MasterRenderer; import eu.tankernn.gameEngine.renderEngine.Scene; import eu.tankernn.gameEngine.terrains.Terrain; import eu.tankernn.gameEngine.terrains.TerrainPack; import eu.tankernn.gameEngine.textures.ModelTexture; import eu.tankernn.gameEngine.textures.TerrainTexture; import eu.tankernn.gameEngine.textures.TerrainTexturePack; import eu.tankernn.gameEngine.util.MousePicker; import eu.tankernn.gameEngine.util.Sorter; import eu.tankernn.gameEngine.water.WaterMaster; import eu.tankernn.gameEngine.water.WaterTile; public class MainLoop { private static final int SEED = 1235; public static void main(String[] args) { exportNatives(); List entities = new ArrayList(); List normalMapEntities = new ArrayList(); TerrainPack terrainPack = new TerrainPack(); DisplayManager.createDisplay(); Loader loader = new Loader(); // Monkey ModelData monkeyData = OBJFileLoader.loadOBJ("character"); RawModel monkeyModel = loader.loadToVAO(monkeyData); TexturedModel texturedMonkeyModel = new TexturedModel(monkeyModel, new ModelTexture(loader.loadTexture("erkky"))); ModelTexture texture = texturedMonkeyModel.getTexture(); texture.setReflectivity(3); texture.setShineDamper(10); Entity entity = new Entity(texturedMonkeyModel, new Vector3f(0, 0, 20), 0, 0, 0, 1); entities.add(entity); TexturedModel monkey = new TexturedModel(monkeyModel, new ModelTexture(loader.loadTexture("white"))); Player player = new Player(monkey, new Vector3f(10, 0, 50), 0, 0, 0, 1, terrainPack); entities.add(player); Camera camera = new PlayerCamera(player, terrainPack); MasterRenderer renderer = new MasterRenderer(loader, camera); ParticleMaster.init(loader, renderer.getProjectionMatrix()); TextMaster.init(loader); FontType font = new FontType(loader.loadTexture("arial"), "arial.fnt"); GUIText text = new GUIText("Sample text", 3, font, new Vector2f(0.5f, 0.5f), 0.5f, true); text.setColor(1, 1, 1); //Barrel TexturedModel barrelModel = new TexturedModel(NormalMappedObjLoader.loadOBJ("barrel", loader), new ModelTexture(loader.loadTexture("barrel"))); barrelModel.getTexture().setNormalMap(loader.loadTexture("barrelNormal")); barrelModel.getTexture().setShineDamper(10); barrelModel.getTexture().setReflectivity(0.5f); Entity barrel = new Entity(barrelModel, new Vector3f(75, 10, 75), 0, 0, 0, 1f); normalMapEntities.add(barrel); Light sun = new Light(new Vector3f(100000, 150000, -70000), new Vector3f(1, 1, 1)); Light flashLight = new Light(new Vector3f(0, 10, -10), new Vector3f(2, 0, 0), new Vector3f(1, 0.01f, 0.002f)); List lights = new ArrayList(); lights.add(sun); lights.add(flashLight); lights.add(new Light(new Vector3f(10, 100, 0), new Vector3f(0, 1, 0))); lights.add(new Light(new Vector3f(20, 100, 0), new Vector3f(0, 0, 1))); lights.add(new Light(new Vector3f(30, 100, 0), new Vector3f(1, 0, 0))); lights.add(new Light(new Vector3f(40, 100, 0), new Vector3f(1, 1, 0))); // ### Terrain textures ### TerrainTexture backgroundTexture = new TerrainTexture(loader.loadTexture("grassy")); TerrainTexture rTexture = new TerrainTexture(loader.loadTexture("dirt")); TerrainTexture gTexture = new TerrainTexture(loader.loadTexture("pinkFlowers")); TerrainTexture bTexture = new TerrainTexture(loader.loadTexture("path")); TerrainTexturePack texturePack = new TerrainTexturePack(backgroundTexture, rTexture, gTexture, bTexture); TerrainTexture blendMap = new TerrainTexture(loader.loadTexture("blendMap")); terrainPack.addTerrain(new Terrain(0, 1, loader, texturePack, blendMap, SEED)); terrainPack.addTerrain(new Terrain(1, 1, loader, texturePack, blendMap, SEED)); terrainPack.addTerrain(new Terrain(0, 0, loader, texturePack, blendMap, SEED)); terrainPack.addTerrain(new Terrain(1, 0, loader, texturePack, blendMap, SEED)); // ### Random grass generation ### ModelTexture textureAtlas = new ModelTexture(loader.loadTexture("fern")); textureAtlas.setNumberOfRows(2); TexturedModel grassModel = new TexturedModel(loader.loadToVAO(OBJFileLoader.loadOBJ("fern")), textureAtlas); //grassModel.getTexture().setHasTransparency(true); //grassModel.getTexture().setUseFakeLighting(true); Random rand = new Random(); for (int i = 0; i < 1000; i++) { float x = rand.nextFloat() * 1000; float z = rand.nextFloat() * 1000; entities.add(new Entity(grassModel, rand.nextInt(4), new Vector3f(x, terrainPack.getTerrainHeightByWorldPos(x, z), z), 0, 0, 0, 1)); } MousePicker picker = new MousePicker(camera, renderer.getProjectionMatrix(), terrainPack, entities); // #### Water rendering #### WaterMaster waterMaster = new WaterMaster(loader, renderer); WaterTile water = new WaterTile(75, 75, 0); waterMaster.addWaterTile(water); // #### Gui rendering #### List guis = new ArrayList(); GuiTexture depth = new GuiTexture(waterMaster.getBuffers().getRefractionDepthTexture(), new Vector2f(0.5f, 0.5f), new Vector2f(0.25f, 0.25f)); GuiTexture refraction = new GuiTexture(waterMaster.getBuffers().getRefractionTexture(), new Vector2f(-0.5f, 0.5f), new Vector2f(0.25f, 0.25f)); guis.add(depth); guis.add(refraction); GuiRenderer guiRenderer = new GuiRenderer(loader); ParticleTexture particleTexture = new ParticleTexture(loader.loadTexture("particles/cosmic"), 4, true); ParticleSystem ps = new ParticleSystem(particleTexture, 50, 10, 0.3f, 4); Fbo fbo = new Fbo(Display.getWidth(), Display.getHeight(), Fbo.DEPTH_RENDER_BUFFER); PostProcessing.init(loader); while (!Display.isCloseRequested()) { barrel.increaseRotation(0, 1, 0); player.move(terrainPack); camera.update(); picker.update(); if (picker.getCurrentTerrainPoint() != null) { Vector3f currentPoint = picker.getCurrentTerrainPoint(); flashLight.getPosition().x = currentPoint.x; flashLight.getPosition().z = currentPoint.z; flashLight.getPosition().y = terrainPack.getTerrainHeightByWorldPos(currentPoint.x, currentPoint.z) + 1.0f; } // Update debug info Terrain currentTerrain = terrainPack.getTerrainByWorldPos(player.getPosition().x, player.getPosition().z); if (currentTerrain != null) { text.remove(); Vector3f pos = player.getPosition(); String textString = "X: " + Math.floor(pos.x) + " Y: " + Math.floor(pos.y) + " Z: " + Math.floor(pos.z); text = new GUIText(textString, 1, font, new Vector2f(0.5f, 0f), 0.5f, false); } //Sort list of lights lights = new Sorter(lights, camera).sortByDistance(); renderer.renderShadowMap(entities, sun); ps.generateParticles(player.getPosition()); ParticleMaster.update(camera); Scene scene = new Scene(entities, normalMapEntities, terrainPack, lights, camera); waterMaster.renderBuffers(renderer, scene); fbo.bindFrameBuffer(); renderer.renderScene(scene, new Vector4f(0, 1, 0, Float.MAX_VALUE)); waterMaster.renderWater(camera, lights); ParticleMaster.renderParticles(camera); fbo.unbindFrameBuffer(); PostProcessing.doPostProcessing(fbo.getColourTexture()); guiRenderer.render(guis); TextMaster.render(); DisplayManager.updateDisplay(); } PostProcessing.cleanUp(); fbo.cleanUp(); ParticleMaster.cleanUp(); TextMaster.cleanUp(); waterMaster.cleanUp(); guiRenderer.cleanUp(); renderer.cleanUp(); loader.cleanUp(); DisplayManager.closeDisplay(); } private static void exportNatives() { File nativeDir = new File("natives"); if (!nativeDir.isDirectory() || nativeDir.list().length == 0) { try { nativeDir.mkdir(); File jarFile = null; try { jarFile = new File(MainLoop.class.getProtectionDomain().getCodeSource().getLocation().toURI().getPath()); } catch (URISyntaxException e1) { e1.printStackTrace(); } if (jarFile != null && jarFile.isFile()) { // Run with JAR file final JarFile jar = new JarFile(jarFile); final Enumeration entries = jar.entries(); //gives ALL entries in jar while (entries.hasMoreElements()) { final String name = entries.nextElement().getName(); if (name.endsWith(".dll") || name.endsWith(".so") || name.endsWith(".dylib") || name.endsWith(".jnilb")) { //filter according to the path System.out.println(name); try { exportFile(name, "natives"); } catch (Exception e) { e.printStackTrace(); } } } jar.close(); System.setProperty("org.lwjgl.librarypath", nativeDir.getAbsolutePath()); } else { // Run with IDE } } catch (IOException e) { JOptionPane.showMessageDialog(null, "Could not export natives. Execute in terminal to see full error output.", "Export natives", JOptionPane.ERROR_MESSAGE); e.printStackTrace(); } } } private static String exportFile(String classPath, String targetDir) throws Exception { InputStream stream = null; OutputStream resStreamOut = null; try { stream = MainLoop.class.getResourceAsStream("/" + classPath);//note that each / is a directory down in the "jar tree" been the jar the root of the tree if (stream == null) { throw new Exception("Cannot get resource \"" + classPath + "\" from Jar file."); } int readBytes; byte[] buffer = new byte[4096]; File outFile = new File(targetDir + "/" + classPath); outFile.getParentFile().mkdirs(); resStreamOut = new FileOutputStream(outFile); while ((readBytes = stream.read(buffer)) > 0) { resStreamOut.write(buffer, 0, readBytes); } stream.close(); resStreamOut.close(); } catch (Exception ex) { throw ex; } return classPath; } }