Преглед изворни кода

Refactoring, AABB and loader improvements

- Moved font loading to loader.font.
- Changed AABBs to work with models that are not centered on their grid.
- Made it possible for the loader to guess filenames based on model
name.
- Changed water rendering to use the Fbo class instead of primitive
ones.
- Made water tile sizes customizable.
frans пре 8 година
родитељ
комит
02a98e853c
22 измењених фајлова са 125 додато и 159 уклоњено
  1. 2 1
      formats.md
  2. 6 5
      src/main/java/eu/tankernn/gameEngine/MainLoop.java
  3. 35 27
      src/main/java/eu/tankernn/gameEngine/loader/Loader.java
  4. 1 1
      src/main/java/eu/tankernn/gameEngine/loader/font/Character.java
  5. 1 1
      src/main/java/eu/tankernn/gameEngine/loader/font/FontType.java
  6. 1 1
      src/main/java/eu/tankernn/gameEngine/loader/font/GUIText.java
  7. 1 1
      src/main/java/eu/tankernn/gameEngine/loader/font/Line.java
  8. 1 1
      src/main/java/eu/tankernn/gameEngine/loader/font/MetaFile.java
  9. 1 1
      src/main/java/eu/tankernn/gameEngine/loader/font/TextMeshCreator.java
  10. 1 1
      src/main/java/eu/tankernn/gameEngine/loader/font/TextMeshData.java
  11. 1 1
      src/main/java/eu/tankernn/gameEngine/loader/font/Word.java
  12. 26 14
      src/main/java/eu/tankernn/gameEngine/loader/models/AABB.java
  13. 1 0
      src/main/java/eu/tankernn/gameEngine/postProcessing/ImageRenderer.java
  14. 1 1
      src/main/java/eu/tankernn/gameEngine/renderEngine/Fbo.java
  15. 1 1
      src/main/java/eu/tankernn/gameEngine/renderEngine/MultisampleMultitargetFbo.java
  16. 2 2
      src/main/java/eu/tankernn/gameEngine/renderEngine/font/FontRenderer.java
  17. 3 3
      src/main/java/eu/tankernn/gameEngine/renderEngine/font/TextMaster.java
  18. 21 84
      src/main/java/eu/tankernn/gameEngine/renderEngine/water/WaterFrameBuffers.java
  19. 3 3
      src/main/java/eu/tankernn/gameEngine/renderEngine/water/WaterMaster.java
  20. 5 5
      src/main/java/eu/tankernn/gameEngine/renderEngine/water/WaterRenderer.java
  21. 7 3
      src/main/java/eu/tankernn/gameEngine/renderEngine/water/WaterTile.java
  22. 4 2
      src/main/java/eu/tankernn/gameEngine/util/InternalFile.java

+ 2 - 1
formats.md

@@ -4,9 +4,10 @@
 
 Available options:
 
+- name (string), used to guess the filenames of files not specified according to the format: <name> + (.obj | .png | S.png | N.png)
 - id (int) <required>
 - model (filename) <required>
-- texture (filename)
+- texture (filename) <required>
 - normal (filename)
 - specular (filename)
 - shinedamper (float)

+ 6 - 5
src/main/java/eu/tankernn/gameEngine/MainLoop.java

@@ -18,19 +18,19 @@ import eu.tankernn.gameEngine.entities.Light;
 import eu.tankernn.gameEngine.entities.Player;
 import eu.tankernn.gameEngine.entities.PlayerCamera;
 import eu.tankernn.gameEngine.environmentMap.EnvironmentMapRenderer;
-import eu.tankernn.gameEngine.font.meshCreator.FontType;
-import eu.tankernn.gameEngine.font.meshCreator.GUIText;
 import eu.tankernn.gameEngine.loader.Loader;
+import eu.tankernn.gameEngine.loader.font.FontType;
+import eu.tankernn.gameEngine.loader.font.GUIText;
 import eu.tankernn.gameEngine.loader.textures.TerrainTexturePack;
 import eu.tankernn.gameEngine.loader.textures.Texture;
 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.MultisampleMultitargetFbo;
 import eu.tankernn.gameEngine.postProcessing.PostProcessing;
 import eu.tankernn.gameEngine.renderEngine.DisplayManager;
+import eu.tankernn.gameEngine.renderEngine.Fbo;
 import eu.tankernn.gameEngine.renderEngine.MasterRenderer;
+import eu.tankernn.gameEngine.renderEngine.MultisampleMultitargetFbo;
 import eu.tankernn.gameEngine.renderEngine.Scene;
 import eu.tankernn.gameEngine.renderEngine.font.TextMaster;
 import eu.tankernn.gameEngine.renderEngine.gui.GuiRenderer;
@@ -130,8 +130,9 @@ public class MainLoop {
 		// #### Water rendering ####
 		WaterMaster waterMaster = new WaterMaster(loader, loader.loadTexture(DUDV_MAP), loader.loadTexture(NORMAL_MAP),
 				camera);
-		WaterTile water = new WaterTile(75, 75, 0);
+		WaterTile water = new WaterTile(75, 75, 0, 50);
 		waterMaster.addWaterTile(water);
+		waterMaster.addWaterTile(new WaterTile(175, 75, 0, 50));
 
 		// #### Gui rendering ####
 		List<GuiTexture> guis = new ArrayList<GuiTexture>();

+ 35 - 27
src/main/java/eu/tankernn/gameEngine/loader/Loader.java

@@ -5,6 +5,7 @@ import java.io.IOException;
 import java.math.BigDecimal;
 import java.nio.FloatBuffer;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.HashMap;
 import java.util.Iterator;
 import java.util.List;
@@ -105,13 +106,6 @@ public class Loader {
 		return new RawModel(vaoID, positions.length / 2);
 	}
 
-	public RawModel loadToVAO(float[] positions) {
-		int vaoID = createVAO();
-		this.storeDataInAttributeList(0, 3, positions);
-		unbindVAO();
-		return new RawModel(vaoID, positions.length / 3);
-	}
-
 	public RawModel loadToVAO(ModelData data) {
 		return (RawModel) loadToVAO(data.getVertices(), data.getTextureCoords(), data.getNormals(), data.getTangents(),
 				data.getIndices());
@@ -205,16 +199,16 @@ public class Loader {
 			int id;
 			RawModel model;
 			ModelTexture modelTexture;
-			Texture[] textures = new Texture[3];
 
 			id = spec.getInt("id");
 
-			InternalFile objFile = new InternalFile(spec.getString("model"));
-			InternalFile textureFile = new InternalFile(spec.getString("texture")),
-					specularFile = spec.has("specular") ? new InternalFile(spec.getString("specular")) : null,
-					normalFile = spec.has("normal") ? new InternalFile(spec.getString("normal")) : null;
+			InternalFile objFile = new InternalFile(optFilename(spec, "model", ".obj"));
 
-			InternalFile[] textureFiles = { textureFile, specularFile, normalFile };
+			String[] textureFiles = {
+					optFilename(spec, "texture", ".png"), 
+					optFilename(spec, "specular", "S.png"),
+					optFilename(spec, "normal", "N.png")
+			};
 
 			if (cachedRawModels.containsKey(objFile))
 				model = cachedRawModels.get(objFile);
@@ -223,16 +217,22 @@ public class Loader {
 				cachedRawModels.put(objFile, model);
 			}
 
-			for (int i = 0; i < textureFiles.length; i++) {
-				if (textureFiles[i] == null)
-					textures[i] = null;
-				else if (cachedTextures.containsKey(textureFiles[i]))
-					textures[i] = cachedTextures.get(textureFiles[i]);
-				else {
-					textures[i] = this.loadTexture(textureFiles[i].getPath());
-					cachedTextures.put(textureFiles[i], textures[i]);
+			Texture[] textures = Arrays.stream(textureFiles).map(fileName -> {
+				try {
+					InternalFile f = new InternalFile(fileName);
+					if (cachedTextures.containsKey(f)) {
+						return cachedTextures.get(f);
+					} else {
+						Texture t = loadTexture(f.getPath());
+						cachedTextures.put(f, t);
+						return t;
+					}
+				} catch (FileNotFoundException ex) {
+					if (!(ex.getMessage().contains("S.png") || ex.getMessage().contains("N.png")))
+						ex.printStackTrace();
+					return null;
 				}
-			}
+			}).toArray(size -> new Texture[size]);
 
 			modelTexture = new ModelTexture(textures[0]);
 			if (textures[1] != null)
@@ -240,16 +240,24 @@ public class Loader {
 			if (textures[2] != null)
 				modelTexture.setSpecularMap(textures[1]);
 
-			modelTexture.setShineDamper(BigDecimal.valueOf(spec.optDouble("shinedamper", 10.0d)).floatValue());
-			modelTexture.setReflectivity(BigDecimal.valueOf(spec.optDouble("reflectivity", 0d)).floatValue());
-			modelTexture.setRefractivity(BigDecimal.valueOf(spec.optDouble("refractivity", 0d)).floatValue());
-			
+			modelTexture.setShineDamper(optFloat(spec, "shinedamper", 10.0f));
+			modelTexture.setReflectivity(optFloat(spec, "reflectivity", 0f));
+			modelTexture.setRefractivity(optFloat(spec, "refractivity", 0f));
+
 			modelTexture.setHasTransparency(spec.optBoolean("transparency"));
 
 			models.put(id, new TexturedModel(model, modelTexture));
 		}
 	}
 
+	private float optFloat(JSONObject spec, String key, float defaultValue) {
+		return BigDecimal.valueOf(spec.optDouble(key, (double) defaultValue)).floatValue();
+	}
+
+	private String optFilename(JSONObject spec, String key, String extension) {
+		return spec.has(key) ? spec.getString(key) : spec.get("name") + extension;
+	}
+
 	public int registerModel(int id, TexturedModel model) throws Exception {
 		if (models.containsKey(id)) {
 			throw new Exception("There is already a model registered for the key " + id + ".");
@@ -278,7 +286,7 @@ public class Loader {
 	public TexturedModel getModel(int id) {
 		return models.get(id);
 	}
-	
+
 	public AABB getBoundingBox(int id) {
 		return getModel(id).getBoundingBox();
 	}

+ 1 - 1
src/main/java/eu/tankernn/gameEngine/font/meshCreator/Character.java → src/main/java/eu/tankernn/gameEngine/loader/font/Character.java

@@ -1,4 +1,4 @@
-package eu.tankernn.gameEngine.font.meshCreator;
+package eu.tankernn.gameEngine.loader.font;
 
 /**
  * Simple data structure class holding information about a certain glyph in the

+ 1 - 1
src/main/java/eu/tankernn/gameEngine/font/meshCreator/FontType.java → src/main/java/eu/tankernn/gameEngine/loader/font/FontType.java

@@ -1,4 +1,4 @@
-package eu.tankernn.gameEngine.font.meshCreator;
+package eu.tankernn.gameEngine.loader.font;
 
 import eu.tankernn.gameEngine.loader.textures.Texture;
 

+ 1 - 1
src/main/java/eu/tankernn/gameEngine/font/meshCreator/GUIText.java → src/main/java/eu/tankernn/gameEngine/loader/font/GUIText.java

@@ -1,4 +1,4 @@
-package eu.tankernn.gameEngine.font.meshCreator;
+package eu.tankernn.gameEngine.loader.font;
 
 import org.lwjgl.util.vector.Vector2f;
 import org.lwjgl.util.vector.Vector3f;

+ 1 - 1
src/main/java/eu/tankernn/gameEngine/font/meshCreator/Line.java → src/main/java/eu/tankernn/gameEngine/loader/font/Line.java

@@ -1,4 +1,4 @@
-package eu.tankernn.gameEngine.font.meshCreator;
+package eu.tankernn.gameEngine.loader.font;
 
 import java.util.ArrayList;
 import java.util.List;

+ 1 - 1
src/main/java/eu/tankernn/gameEngine/font/meshCreator/MetaFile.java → src/main/java/eu/tankernn/gameEngine/loader/font/MetaFile.java

@@ -1,4 +1,4 @@
-package eu.tankernn.gameEngine.font.meshCreator;
+package eu.tankernn.gameEngine.loader.font;
 
 import java.io.BufferedReader;
 import java.io.IOException;

+ 1 - 1
src/main/java/eu/tankernn/gameEngine/font/meshCreator/TextMeshCreator.java → src/main/java/eu/tankernn/gameEngine/loader/font/TextMeshCreator.java

@@ -1,4 +1,4 @@
-package eu.tankernn.gameEngine.font.meshCreator;
+package eu.tankernn.gameEngine.loader.font;
 
 import java.util.ArrayList;
 import java.util.List;

+ 1 - 1
src/main/java/eu/tankernn/gameEngine/font/meshCreator/TextMeshData.java → src/main/java/eu/tankernn/gameEngine/loader/font/TextMeshData.java

@@ -1,4 +1,4 @@
-package eu.tankernn.gameEngine.font.meshCreator;
+package eu.tankernn.gameEngine.loader.font;
 
 /**
  * Stores the vertex data for all the quads on which a text will be rendered.

+ 1 - 1
src/main/java/eu/tankernn/gameEngine/font/meshCreator/Word.java → src/main/java/eu/tankernn/gameEngine/loader/font/Word.java

@@ -1,4 +1,4 @@
-package eu.tankernn.gameEngine.font.meshCreator;
+package eu.tankernn.gameEngine.loader.font;
 
 import java.util.ArrayList;
 import java.util.List;

+ 26 - 14
src/main/java/eu/tankernn/gameEngine/loader/models/AABB.java

@@ -5,11 +5,14 @@ import org.lwjgl.util.vector.Vector3f;
 import eu.tankernn.gameEngine.loader.obj.ModelData;
 
 public class AABB {
-	protected Vector3f middlePos = new Vector3f(0, 0, 0), halfSize;
+	protected Vector3f position;
+	private final Vector3f halfSize, relativeMiddlePos, relativeLb, relativeRt;
 
-	public AABB(Vector3f middlePos, Vector3f halfSize) {
-		this.middlePos = middlePos;
+	public AABB(Vector3f relativeMiddlePos, Vector3f halfSize) {
+		this.relativeMiddlePos = relativeMiddlePos;
 		this.halfSize = halfSize;
+		relativeLb = Vector3f.sub(relativeMiddlePos, halfSize, null);
+		relativeRt = Vector3f.add(relativeMiddlePos, halfSize, null);
 	}
 
 	public AABB(ModelData model) {
@@ -39,17 +42,22 @@ public class AABB {
 
 		Vector3f fullSize = Vector3f.sub(max, min, null);
 		this.halfSize = new Vector3f(fullSize.x / 2, fullSize.y / 2, fullSize.z / 2);
+		relativeLb = min;
+		relativeRt = max;
+		this.relativeMiddlePos = Vector3f.add(relativeLb, relativeRt, null);
+		this.relativeMiddlePos.x /= 2;
+		this.relativeMiddlePos.y /= 2;
+		this.relativeMiddlePos.z /= 2;
 	}
 
 	public void updatePosition(Vector3f pos) {
-		this.middlePos = new Vector3f(pos);
-		this.middlePos.setY(pos.y + halfSize.y);
+		this.position = pos;
 	}
 
 	public static boolean collides(AABB a, AABB b) {
-		if (Math.abs(a.middlePos.x - b.middlePos.x) < a.halfSize.x + b.halfSize.x) {
-			if (Math.abs(a.middlePos.y - b.middlePos.y) < a.halfSize.y + b.halfSize.y) {
-				if (Math.abs(a.middlePos.z - b.middlePos.z) < a.halfSize.z + b.halfSize.z) {
+		if (Math.abs(a.getMiddlePos().x - b.getMiddlePos().x) < a.halfSize.x + b.halfSize.x) {
+			if (Math.abs(a.getMiddlePos().y - b.getMiddlePos().y) < a.halfSize.y + b.halfSize.y) {
+				if (Math.abs(a.getMiddlePos().z - b.getMiddlePos().z) < a.halfSize.z + b.halfSize.z) {
 					return true;
 				}
 			}
@@ -59,9 +67,9 @@ public class AABB {
 	}
 
 	public static boolean inside(AABB a, Vector3f b) {
-		if (Math.abs(a.middlePos.x - b.x) < a.halfSize.x) {
-			if (Math.abs(a.middlePos.y - b.y) < a.halfSize.y) {
-				if (Math.abs(a.middlePos.z - b.z) < a.halfSize.z) {
+		if (Math.abs(a.getMiddlePos().x - b.x) < a.halfSize.x) {
+			if (Math.abs(a.getMiddlePos().y - b.y) < a.halfSize.y) {
+				if (Math.abs(a.getMiddlePos().z - b.z) < a.halfSize.z) {
 					return true;
 				}
 			}
@@ -70,14 +78,18 @@ public class AABB {
 	}
 
 	public Vector3f getLb() {
-		return new Vector3f(middlePos.x - halfSize.x, middlePos.y - halfSize.y, middlePos.z - halfSize.z);
+		return Vector3f.add(position, relativeLb, null);
 	}
 
 	public Vector3f getRt() {
-		return new Vector3f(middlePos.x + halfSize.x, middlePos.y + halfSize.y, middlePos.z + halfSize.z);
+		return Vector3f.add(position, relativeRt, null);
+	}
+	
+	public Vector3f getMiddlePos() {
+		return Vector3f.add(position, relativeMiddlePos, null);
 	}
 	
 	public AABB copy() {
-		return new AABB(new Vector3f(this.middlePos), new Vector3f(this.halfSize));
+		return new AABB(new Vector3f(this.relativeMiddlePos), new Vector3f(this.halfSize));
 	}
 }

+ 1 - 0
src/main/java/eu/tankernn/gameEngine/postProcessing/ImageRenderer.java

@@ -4,6 +4,7 @@ import org.lwjgl.opengl.Display;
 import org.lwjgl.opengl.GL11;
 
 import eu.tankernn.gameEngine.loader.textures.Texture;
+import eu.tankernn.gameEngine.renderEngine.Fbo;
 
 public class ImageRenderer {
 

+ 1 - 1
src/main/java/eu/tankernn/gameEngine/postProcessing/Fbo.java → src/main/java/eu/tankernn/gameEngine/renderEngine/Fbo.java

@@ -1,4 +1,4 @@
-package eu.tankernn.gameEngine.postProcessing;
+package eu.tankernn.gameEngine.renderEngine;
 
 import java.nio.IntBuffer;
 

+ 1 - 1
src/main/java/eu/tankernn/gameEngine/postProcessing/MultisampleMultitargetFbo.java → src/main/java/eu/tankernn/gameEngine/renderEngine/MultisampleMultitargetFbo.java

@@ -1,4 +1,4 @@
-package eu.tankernn.gameEngine.postProcessing;
+package eu.tankernn.gameEngine.renderEngine;
 
 import java.nio.IntBuffer;
 

+ 2 - 2
src/main/java/eu/tankernn/gameEngine/renderEngine/font/FontRenderer.java

@@ -7,8 +7,8 @@ import org.lwjgl.opengl.GL11;
 import org.lwjgl.opengl.GL20;
 import org.lwjgl.opengl.GL30;
 
-import eu.tankernn.gameEngine.font.meshCreator.FontType;
-import eu.tankernn.gameEngine.font.meshCreator.GUIText;
+import eu.tankernn.gameEngine.loader.font.FontType;
+import eu.tankernn.gameEngine.loader.font.GUIText;
 
 public class FontRenderer {
 	

+ 3 - 3
src/main/java/eu/tankernn/gameEngine/renderEngine/font/TextMaster.java

@@ -5,10 +5,10 @@ import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
-import eu.tankernn.gameEngine.font.meshCreator.FontType;
-import eu.tankernn.gameEngine.font.meshCreator.GUIText;
-import eu.tankernn.gameEngine.font.meshCreator.TextMeshData;
 import eu.tankernn.gameEngine.loader.Loader;
+import eu.tankernn.gameEngine.loader.font.FontType;
+import eu.tankernn.gameEngine.loader.font.GUIText;
+import eu.tankernn.gameEngine.loader.font.TextMeshData;
 
 public class TextMaster {
 

+ 21 - 84
src/main/java/eu/tankernn/gameEngine/renderEngine/water/WaterFrameBuffers.java

@@ -1,97 +1,34 @@
 package eu.tankernn.gameEngine.renderEngine.water;
 
-import org.lwjgl.opengl.Display;
-import org.lwjgl.opengl.GL11;
-import org.lwjgl.opengl.GL30;
-
-import eu.tankernn.gameEngine.loader.textures.Texture;
-import eu.tankernn.gameEngine.loader.textures.TextureUtils;
+import eu.tankernn.gameEngine.renderEngine.Fbo;
 
 public class WaterFrameBuffers {
-	
+
 	protected static final int REFLECTION_WIDTH = 1024 * 1;
 	private static final int REFLECTION_HEIGHT = 1024 * 1;
-	
+
 	protected static final int REFRACTION_WIDTH = 1024 / 2;
 	private static final int REFRACTION_HEIGHT = 1024 / 2;
-	
-	private int reflectionFrameBuffer;
-	private Texture reflectionTexture;
-	private int reflectionDepthBuffer;
-	
-	private int refractionFrameBuffer;
-	private Texture refractionTexture;
-	private Texture refractionDepthTexture;
-	
-	public WaterFrameBuffers() {//call when loading the game
-		initialiseReflectionFrameBuffer();
-		initialiseRefractionFrameBuffer();
-	}
-	
-	public void cleanUp() {//call when closing the game
-		GL30.glDeleteFramebuffers(reflectionFrameBuffer);
-		reflectionTexture.delete();
-		GL30.glDeleteRenderbuffers(reflectionDepthBuffer);
-		GL30.glDeleteFramebuffers(refractionFrameBuffer);
-		refractionTexture.delete();
-		refractionDepthTexture.delete();
-	}
-	
-	public void bindReflectionFrameBuffer() {//call before rendering to this FBO
-		bindFrameBuffer(reflectionFrameBuffer, REFLECTION_WIDTH, REFLECTION_HEIGHT);
-	}
-	
-	public void bindRefractionFrameBuffer() {//call before rendering to this FBO
-		bindFrameBuffer(refractionFrameBuffer, REFRACTION_WIDTH, REFRACTION_HEIGHT);
-	}
-	
-	public void unbindCurrentFrameBuffer() {//call to switch to default frame buffer
-		GL30.glBindFramebuffer(GL30.GL_FRAMEBUFFER, 0);
-		GL11.glViewport(0, 0, Display.getWidth(), Display.getHeight());
-	}
-	
-	public Texture getReflectionTexture() {//get the resulting texture
-		return reflectionTexture;
-	}
-	
-	public Texture getRefractionTexture() {//get the resulting texture
-		return refractionTexture;
-	}
-	
-	public Texture getRefractionDepthTexture() {//get the resulting depth texture
-		return refractionDepthTexture;
-	}
-	
-	private void initialiseReflectionFrameBuffer() {
-		reflectionFrameBuffer = createFrameBuffer();
-		reflectionTexture = TextureUtils.createTextureAttachment(REFLECTION_WIDTH, REFLECTION_HEIGHT);
-		reflectionDepthBuffer = TextureUtils.createDepthBufferAttachment(REFLECTION_WIDTH, REFLECTION_HEIGHT);
-		unbindCurrentFrameBuffer();
+
+	private Fbo reflectionBuffer;
+	private Fbo refractionBuffer;
+
+	public WaterFrameBuffers() {
+		reflectionBuffer = new Fbo(REFLECTION_WIDTH, REFLECTION_HEIGHT, Fbo.DEPTH_RENDER_BUFFER);
+		refractionBuffer = new Fbo(REFRACTION_WIDTH, REFRACTION_HEIGHT, Fbo.DEPTH_TEXTURE);
 	}
-	
-	private void initialiseRefractionFrameBuffer() {
-		refractionFrameBuffer = createFrameBuffer();
-		refractionTexture = TextureUtils.createTextureAttachment(REFRACTION_WIDTH, REFRACTION_HEIGHT);
-		refractionDepthTexture = TextureUtils.createDepthTextureAttachment(REFRACTION_WIDTH, REFRACTION_HEIGHT);
-		unbindCurrentFrameBuffer();
+
+	public void cleanUp() {
+		reflectionBuffer.cleanUp();
+		refractionBuffer.cleanUp();
 	}
-	
-	private void bindFrameBuffer(int frameBuffer, int width, int height) {
-		GL11.glBindTexture(GL11.GL_TEXTURE_2D, 0);//To make sure the texture isn't bound
-		GL30.glBindFramebuffer(GL30.GL_FRAMEBUFFER, frameBuffer);
-		GL11.glViewport(0, 0, width, height);
+
+	public Fbo getReflectionFbo() {
+		return reflectionBuffer;
 	}
-	
-	private int createFrameBuffer() {
-		int frameBuffer = GL30.glGenFramebuffers();
-		//generate name for frame buffer
-		GL30.glBindFramebuffer(GL30.GL_FRAMEBUFFER, frameBuffer);
-		//create the framebuffer
-		GL11.glDrawBuffer(GL30.GL_COLOR_ATTACHMENT0);
-		//indicate that we will always render to color attachment 0
-		return frameBuffer;
+
+	public Fbo getRefractionFbo() {
+		return refractionBuffer;
 	}
-	
-	
-	
+
 }

+ 3 - 3
src/main/java/eu/tankernn/gameEngine/renderEngine/water/WaterMaster.java

@@ -34,7 +34,7 @@ public class WaterMaster {
 		GL11.glEnable(GL30.GL_CLIP_DISTANCE0);
 		
 		// Reflection
-		buffers.bindReflectionFrameBuffer();
+		buffers.getReflectionFbo().bindFrameBuffer();
 		float distance = 2 * (scene.getCamera().getPosition().y - waterHeight);
 		scene.getCamera().getPosition().y -= distance;
 		scene.getCamera().invertPitch();
@@ -45,12 +45,12 @@ public class WaterMaster {
 		scene.getCamera().invertRoll();
 		
 		// Refraction
-		buffers.bindRefractionFrameBuffer();
+		buffers.getRefractionFbo().bindFrameBuffer();
 		renderer.renderScene(scene, new Vector4f(0, -1, 0, waterHeight + 1f));
 		
 		// Screen
 		GL11.glDisable(GL30.GL_CLIP_DISTANCE0);
-		buffers.unbindCurrentFrameBuffer();
+		buffers.getReflectionFbo().unbindFrameBuffer();
 	}
 	
 	public void renderWater(Camera camera, List<Light> lights) {

+ 5 - 5
src/main/java/eu/tankernn/gameEngine/renderEngine/water/WaterRenderer.java

@@ -50,7 +50,7 @@ public class WaterRenderer {
 		for (WaterTile tile : water) {
 			Matrix4f modelMatrix = Maths.createTransformationMatrix(
 					new Vector3f(tile.getX(), tile.getHeight(), tile.getZ()), 0, 0, 0,
-					WaterTile.TILE_SIZE);
+					tile.getSize());
 			shader.modelMatrix.loadMatrix(modelMatrix);
 			GL11.glDrawArrays(GL11.GL_TRIANGLES, 0, quad.getIndexCount());
 		}
@@ -71,11 +71,11 @@ public class WaterRenderer {
 		shader.shineDamper.loadFloat(SHINE_DAMPER);
 		shader.reflectivity.loadFloat(REFLECTIVITY);
 		quad.bind(0);
-		buffers.getReflectionTexture().bindToUnit(0);
-		buffers.getRefractionTexture().bindToUnit(1);
+		buffers.getReflectionFbo().getColourTexture().bindToUnit(0);
+		buffers.getRefractionFbo().getColourTexture().bindToUnit(1);
 		dudvTexture.bindToUnit(2);
 		normalMap.bindToUnit(3);
-		buffers.getRefractionDepthTexture().bindToUnit(4);
+		buffers.getRefractionFbo().getDepthTexture().bindToUnit(4);
 		
 		GL11.glEnable(GL11.GL_BLEND);
 		GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
@@ -89,7 +89,7 @@ public class WaterRenderer {
 	}
 
 	private void setUpVAO(Loader loader) {
-		// Just x and z vectex positions here, y is set to 0 in v.shader
+		// Just x and z vertex positions here, y is set to 0 in v.shader
 		float[] vertices = { -1, -1, -1, 1, 1, -1, 1, -1, -1, 1, 1, 1 };
 		quad = loader.loadToVAO(vertices, 2);
 	}

+ 7 - 3
src/main/java/eu/tankernn/gameEngine/renderEngine/water/WaterTile.java

@@ -2,15 +2,15 @@ package eu.tankernn.gameEngine.renderEngine.water;
 
 public class WaterTile {
 	
-	public static final float TILE_SIZE = 60;
-	
 	private float height;
 	private float x, z;
+	private float size;
 	
-	public WaterTile(float centerX, float centerZ, float height) {
+	public WaterTile(float centerX, float centerZ, float height, float size) {
 		this.x = centerX;
 		this.z = centerZ;
 		this.height = height;
+		this.size = size;
 	}
 	
 	public float getHeight() {
@@ -25,4 +25,8 @@ public class WaterTile {
 		return z;
 	}
 	
+	public float getSize() {
+		return size;
+	}
+	
 }

+ 4 - 2
src/main/java/eu/tankernn/gameEngine/util/InternalFile.java

@@ -29,6 +29,8 @@ public class InternalFile {
 		this.name = dirs[dirs.length - 1];
 		try {
 			getInputStream().close();
+		} catch (FileNotFoundException e) {
+			throw e;
 		} catch (IOException e) {
 			e.printStackTrace();
 		}
@@ -79,11 +81,11 @@ public class InternalFile {
 			throw e;
 		}
 	}
-	
+
 	public URL getURL() {
 		return InternalFile.class.getResource(path);
 	}
-	
+
 	public String readFile() throws IOException {
 		return Resources.toString(getURL(), Charsets.UTF_8);
 	}