Browse Source

Replaced textureIDs with Texture objects.

Tankernn 8 years ago
parent
commit
d1a7645c5c
46 changed files with 301 additions and 458 deletions
  1. 55 52
      src/main/java/eu/tankernn/gameEngine/MainLoop.java
  2. 1 1
      src/main/java/eu/tankernn/gameEngine/TankernnGame.java
  3. 4 4
      src/main/java/eu/tankernn/gameEngine/entities/Entity.java
  4. 7 5
      src/main/java/eu/tankernn/gameEngine/font/meshCreator/FontType.java
  5. 2 1
      src/main/java/eu/tankernn/gameEngine/font/meshCreator/GUIText.java
  6. 19 118
      src/main/java/eu/tankernn/gameEngine/loader/Loader.java
  7. 1 1
      src/main/java/eu/tankernn/gameEngine/loader/models/TexturedModel.java
  8. 16 14
      src/main/java/eu/tankernn/gameEngine/loader/obj/OBJFileLoader.java
  9. 8 11
      src/main/java/eu/tankernn/gameEngine/loader/obj/normalMapped/NormalMappedObjLoader.java
  10. 16 12
      src/main/java/eu/tankernn/gameEngine/loader/textures/ModelTexture.java
  11. 0 13
      src/main/java/eu/tankernn/gameEngine/loader/textures/TerrainTexture.java
  12. 9 9
      src/main/java/eu/tankernn/gameEngine/loader/textures/TerrainTexturePack.java
  13. 0 1
      src/main/java/eu/tankernn/gameEngine/loader/textures/Texture.java
  14. 33 1
      src/main/java/eu/tankernn/gameEngine/loader/textures/TextureUtils.java
  15. 1 1
      src/main/java/eu/tankernn/gameEngine/particles/ParticleMaster.java
  16. 2 4
      src/main/java/eu/tankernn/gameEngine/particles/ParticleRenderer.java
  17. 7 5
      src/main/java/eu/tankernn/gameEngine/particles/ParticleTexture.java
  18. 4 6
      src/main/java/eu/tankernn/gameEngine/postProcessing/ContrastChanger.java
  19. 13 42
      src/main/java/eu/tankernn/gameEngine/postProcessing/Fbo.java
  20. 8 0
      src/main/java/eu/tankernn/gameEngine/postProcessing/IPostProcessingEffect.java
  21. 3 1
      src/main/java/eu/tankernn/gameEngine/postProcessing/ImageRenderer.java
  22. 2 2
      src/main/java/eu/tankernn/gameEngine/postProcessing/MultisampleMultitargetFbo.java
  23. 4 3
      src/main/java/eu/tankernn/gameEngine/postProcessing/PostProcessing.java
  24. 6 8
      src/main/java/eu/tankernn/gameEngine/postProcessing/bloom/BrightFilter.java
  25. 4 8
      src/main/java/eu/tankernn/gameEngine/postProcessing/bloom/CombineFilter.java
  26. 6 8
      src/main/java/eu/tankernn/gameEngine/postProcessing/gaussianBlur/HorizontalBlur.java
  27. 6 9
      src/main/java/eu/tankernn/gameEngine/postProcessing/gaussianBlur/VerticalBlur.java
  28. 1 0
      src/main/java/eu/tankernn/gameEngine/renderEngine/MasterRenderer.java
  29. 3 6
      src/main/java/eu/tankernn/gameEngine/renderEngine/entities/EntityRenderer.java
  30. 1 3
      src/main/java/eu/tankernn/gameEngine/renderEngine/font/FontRenderer.java
  31. 2 2
      src/main/java/eu/tankernn/gameEngine/renderEngine/font/FontShader.java
  32. 1 1
      src/main/java/eu/tankernn/gameEngine/renderEngine/font/TextMaster.java
  33. 1 1
      src/main/java/eu/tankernn/gameEngine/renderEngine/gui/GuiRenderer.java
  34. 2 2
      src/main/java/eu/tankernn/gameEngine/renderEngine/gui/GuiShader.java
  35. 4 8
      src/main/java/eu/tankernn/gameEngine/renderEngine/normalMap/NormalMappingRenderer.java
  36. 2 2
      src/main/java/eu/tankernn/gameEngine/renderEngine/normalMap/NormalMappingShader.java
  37. 3 5
      src/main/java/eu/tankernn/gameEngine/renderEngine/shadows/ShadowMapEntityRenderer.java
  38. 2 2
      src/main/java/eu/tankernn/gameEngine/renderEngine/shadows/ShadowShader.java
  39. 1 1
      src/main/java/eu/tankernn/gameEngine/renderEngine/skybox/SkyboxRenderer.java
  40. 2 2
      src/main/java/eu/tankernn/gameEngine/renderEngine/skybox/SkyboxShader.java
  41. 5 11
      src/main/java/eu/tankernn/gameEngine/renderEngine/terrain/TerrainRenderer.java
  42. 16 49
      src/main/java/eu/tankernn/gameEngine/renderEngine/water/WaterFrameBuffers.java
  43. 1 1
      src/main/java/eu/tankernn/gameEngine/renderEngine/water/WaterMaster.java
  44. 9 14
      src/main/java/eu/tankernn/gameEngine/renderEngine/water/WaterRenderer.java
  45. 2 2
      src/main/java/eu/tankernn/gameEngine/renderEngine/water/WaterShader.java
  46. 6 6
      src/main/java/eu/tankernn/gameEngine/terrains/Terrain.java

+ 55 - 52
src/main/java/eu/tankernn/gameEngine/MainLoop.java

@@ -20,13 +20,12 @@ 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.models.RawModel;
 import eu.tankernn.gameEngine.loader.models.TexturedModel;
 import eu.tankernn.gameEngine.loader.obj.ModelData;
 import eu.tankernn.gameEngine.loader.obj.OBJFileLoader;
-import eu.tankernn.gameEngine.loader.obj.normalMapped.NormalMappedObjLoader;
 import eu.tankernn.gameEngine.loader.textures.ModelTexture;
-import eu.tankernn.gameEngine.loader.textures.TerrainTexture;
 import eu.tankernn.gameEngine.loader.textures.TerrainTexturePack;
 import eu.tankernn.gameEngine.loader.textures.Texture;
 import eu.tankernn.gameEngine.particles.ParticleMaster;
@@ -36,7 +35,6 @@ 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.Loader;
 import eu.tankernn.gameEngine.renderEngine.MasterRenderer;
 import eu.tankernn.gameEngine.renderEngine.Scene;
 import eu.tankernn.gameEngine.renderEngine.font.TextMaster;
@@ -48,73 +46,76 @@ import eu.tankernn.gameEngine.renderEngine.water.WaterTile;
 import eu.tankernn.gameEngine.terrains.Terrain;
 import eu.tankernn.gameEngine.terrains.TerrainPack;
 import eu.tankernn.gameEngine.util.DistanceSorter;
-import eu.tankernn.gameEngine.util.MousePicker;
 import eu.tankernn.gameEngine.util.InternalFile;
+import eu.tankernn.gameEngine.util.MousePicker;
 
 public class MainLoop {
 
 	private static final int SEED = 1235;
-	
+
 	// Skybox settings
-	public static final String[] TEXTURE_FILES = {"alps_rt", "alps_lf", "alps_up", "alps_dn", "alps_bk", "alps_ft"};
-	public static final String[] NIGHT_TEXTURE_FILES = {"midnight_rt", "midnight_lf", "midnight_up", "midnight_dn", "midnight_bk", "midnight_ft"};
-	
+	public static final String[] TEXTURE_FILES = { "alps_rt", "alps_lf", "alps_up", "alps_dn", "alps_bk", "alps_ft" };
+	public static final String[] NIGHT_TEXTURE_FILES = { "midnight_rt", "midnight_lf", "midnight_up", "midnight_dn",
+			"midnight_bk", "midnight_ft" };
+
 	// Water settings
-	public static final String DUDV_MAP = "waterDUDV";
-	public static final String NORMAL_MAP = "waterNormalMap";
+	public static final String DUDV_MAP = "waterDUDV.png";
+	public static final String NORMAL_MAP = "waterNormalMap.png";
 
 	private static final boolean DEBUG = true;
 
 	public static void main(String[] args) throws FileNotFoundException {
-		
+
 		List<Entity> entities = new ArrayList<Entity>();
 		List<Entity> normalMapEntities = new ArrayList<Entity>();
 		TerrainPack terrainPack = new TerrainPack();
 
 		DisplayManager.createDisplay("Tankernn Game Engine tester");
 		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();
+		// Player
+		ModelData playrModelData = OBJFileLoader.loadOBJ(new InternalFile("Soptunna.obj"));
+		RawModel playerModel = loader.loadToVAO(playrModelData);
+		TexturedModel texturedMonkeyModel = new TexturedModel(playerModel,
+				new ModelTexture(loader.loadTexture("Soptunna.png")));
+
+		ModelTexture texture = texturedMonkeyModel.getModelTexture();
 		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")));
+		TexturedModel monkey = new TexturedModel(playerModel, new ModelTexture(loader.loadTexture("white.png")));
 		Player player = new Player(monkey, new Vector3f(10, 0, 50), 0, 0, 0, 1, terrainPack);
 		entities.add(player);
 		Camera camera = new PlayerCamera(player, terrainPack);
-		
-		InternalFile[] dayTextures = new InternalFile[TEXTURE_FILES.length], nightTextures = new InternalFile[NIGHT_TEXTURE_FILES.length];
-		
+
+		InternalFile[] dayTextures = new InternalFile[TEXTURE_FILES.length],
+				nightTextures = new InternalFile[NIGHT_TEXTURE_FILES.length];
+
 		for (int i = 0; i < TEXTURE_FILES.length; i++)
 			dayTextures[i] = new InternalFile("skybox/" + TEXTURE_FILES[i] + ".png");
 		for (int i = 0; i < NIGHT_TEXTURE_FILES.length; i++)
 			nightTextures[i] = new InternalFile("skybox/" + NIGHT_TEXTURE_FILES[i] + ".png");
-		
+
 		Skybox skybox = new Skybox(Texture.newCubeMap(dayTextures, 500), Texture.newCubeMap(nightTextures, 500), 500);
-		
+
 		MasterRenderer renderer = new MasterRenderer(loader, camera, skybox);
 		ParticleMaster.init(loader, camera.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);
+		FontType font = new FontType(loader.loadTexture("arial.png"), "arial.fnt");
+		GUIText text = new GUIText("Sample text", 3, font, new Vector2f(0.5f, 0.5f), 0.5f, true).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().setSpecularMap(loader.loadTexture("barrelS"));
-		barrelModel.getTexture().setShineDamper(10);
-		barrelModel.getTexture().setReflectivity(0.5f);
+		TexturedModel barrelModel = new TexturedModel(loader.loadOBJ(new InternalFile("barrel.obj")),
+				new ModelTexture(loader.loadTexture("barrel.png")));
+		
+		barrelModel.getModelTexture().setNormalMap(loader.loadTexture("barrelNormal.png"))
+									.setSpecularMap(loader.loadTexture("barrelS.png"))
+									.setShineDamper(10)
+									.setReflectivity(0.5f);
+		
 		Entity barrel = new Entity(barrelModel, new Vector3f(75, 10, 75), 0, 0, 0, 1f);
 		normalMapEntities.add(barrel);
 
@@ -130,13 +131,13 @@ public class MainLoop {
 
 		// ### 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"));
+		Texture backgroundTexture = loader.loadTexture("grassy.png");
+		Texture rTexture = loader.loadTexture("dirt.png");
+		Texture gTexture = loader.loadTexture("pinkFlowers.png");
+		Texture bTexture = loader.loadTexture("path.png");
 
 		TerrainTexturePack texturePack = new TerrainTexturePack(backgroundTexture, rTexture, gTexture, bTexture);
-		TerrainTexture blendMap = new TerrainTexture(loader.loadTexture("blendMap"));
+		Texture blendMap = loader.loadTexture("blendMap.png");
 
 		terrainPack.addTerrain(new Terrain(0, 1, loader, texturePack, blendMap, SEED));
 		terrainPack.addTerrain(new Terrain(1, 1, loader, texturePack, blendMap, SEED));
@@ -145,13 +146,14 @@ public class MainLoop {
 
 		// ### Random grass generation ###
 
-		ModelTexture textureAtlas = new ModelTexture(loader.loadTexture("lantern"));
+		ModelTexture textureAtlas = new ModelTexture(Texture.newTexture(new InternalFile("lantern.png")).create());
 		textureAtlas.setNumberOfRows(1);
-		TexturedModel grassModel = new TexturedModel(loader.loadToVAO(OBJFileLoader.loadOBJ("lantern")), textureAtlas);
-		grassModel.getTexture().setHasTransparency(true);
-		grassModel.getTexture().setShineDamper(10);
-		grassModel.getTexture().setReflectivity(0.5f);
-		grassModel.getTexture().setSpecularMap(loader.loadTexture("lanternS"));
+		TexturedModel grassModel = new TexturedModel(
+				loader.loadToVAO(OBJFileLoader.loadOBJ(new InternalFile("lantern.obj"))), textureAtlas);
+		grassModel.getModelTexture().setHasTransparency(true);
+		grassModel.getModelTexture().setShineDamper(10);
+		grassModel.getModelTexture().setReflectivity(0.5f);
+		grassModel.getModelTexture().setSpecularMap(loader.loadTexture("lanternS.png"));
 
 		Random rand = new Random();
 
@@ -170,14 +172,14 @@ public class MainLoop {
 
 		// #### Gui rendering ####
 		List<GuiTexture> guis = new ArrayList<GuiTexture>();
-		
+
 		GuiTexture debug = new GuiTexture(0, new Vector2f(1, 1), new Vector2f(1, 1));
-		
+
 		guis.add(debug);
 
 		GuiRenderer guiRenderer = new GuiRenderer(loader);
 
-		ParticleTexture particleTexture = new ParticleTexture(loader.loadTexture("particles/cosmic"), 4, true);
+		ParticleTexture particleTexture = new ParticleTexture(loader.loadTexture("particles/cosmic.png"), 4, true);
 		ParticleSystem ps = new ParticleSystem(particleTexture, 50, 10, 0.3f, 4);
 
 		MultisampleMultitargetFbo multisampleFbo = new MultisampleMultitargetFbo(Display.getWidth(),
@@ -188,7 +190,7 @@ public class MainLoop {
 		PostProcessing.init(loader);
 
 		MousePicker picker = new MousePicker(camera, camera.getProjectionMatrix(), terrainPack, entities, guis);
-		
+
 		while (!Display.isCloseRequested()) {
 			barrel.increaseRotation(0, 1, 0);
 			player.move(terrainPack);
@@ -232,11 +234,12 @@ public class MainLoop {
 			ParticleMaster.update(camera);
 
 			Scene scene = new Scene(entities, normalMapEntities, terrainPack, lights, camera, skybox);
-			
-			EnvironmentMapRenderer.renderEnvironmentMap(scene.getEnvironmentMap(), scene, player.getPosition(), renderer);
-			
+
+			EnvironmentMapRenderer.renderEnvironmentMap(scene.getEnvironmentMap(), scene, player.getPosition(),
+					renderer);
+
 			debug = new GuiTexture(scene.getEnvironmentMap().textureId, new Vector2f(1, 1), new Vector2f(1, 1));
-			
+
 			waterMaster.renderBuffers(renderer, scene);
 
 			multisampleFbo.bindFrameBuffer();

+ 1 - 1
src/main/java/eu/tankernn/gameEngine/TankernnGame.java

@@ -1,8 +1,8 @@
 package eu.tankernn.gameEngine;
 
 import eu.tankernn.gameEngine.entities.Camera;
+import eu.tankernn.gameEngine.loader.Loader;
 import eu.tankernn.gameEngine.renderEngine.DisplayManager;
-import eu.tankernn.gameEngine.renderEngine.Loader;
 import eu.tankernn.gameEngine.renderEngine.MasterRenderer;
 import eu.tankernn.gameEngine.renderEngine.skybox.Skybox;
 import eu.tankernn.gameEngine.renderEngine.water.WaterMaster;

+ 4 - 4
src/main/java/eu/tankernn/gameEngine/entities/Entity.java

@@ -39,13 +39,13 @@ public class Entity implements IPositionable {
 	}
 	
 	public float getTextureXOffset() {
-		int column = textureIndex % model.getTexture().getNumberOfRows();
-		return (float) column / (float) model.getTexture().getNumberOfRows();
+		int column = textureIndex % model.getModelTexture().getNumberOfRows();
+		return (float) column / (float) model.getModelTexture().getNumberOfRows();
 	}
 	
 	public float getTextureYOffset() {
-		int row = textureIndex / model.getTexture().getNumberOfRows();
-		return (float) row / (float) model.getTexture().getNumberOfRows();
+		int row = textureIndex / model.getModelTexture().getNumberOfRows();
+		return (float) row / (float) model.getModelTexture().getNumberOfRows();
 	}
 	
 	public void increasePosition(float dx, float dy, float dz) {

+ 7 - 5
src/main/java/eu/tankernn/gameEngine/font/meshCreator/FontType.java

@@ -1,5 +1,7 @@
 package eu.tankernn.gameEngine.font.meshCreator;
 
+import eu.tankernn.gameEngine.loader.textures.Texture;
+
 /**
  * Represents a font. It holds the font's texture atlas as well as having the
  * ability to create the quad vertices for any text using this font.
@@ -9,28 +11,28 @@ package eu.tankernn.gameEngine.font.meshCreator;
  */
 public class FontType {
 
-	private int textureAtlas;
+	private Texture textureAtlas;
 	private TextMeshCreator loader;
 
 	/**
 	 * Creates a new font and loads up the data about each character from the
 	 * font file.
 	 * 
-	 * @param textureAtlas
+	 * @param texture
 	 *            - the ID of the font atlas texture.
 	 * @param fontFile
 	 *            - the font file containing information about each character in
 	 *            the texture atlas.
 	 */
-	public FontType(int textureAtlas, String fontFile) {
-		this.textureAtlas = textureAtlas;
+	public FontType(Texture texture, String fontFile) {
+		this.textureAtlas = texture;
 		this.loader = new TextMeshCreator(fontFile);
 	}
 
 	/**
 	 * @return The font texture atlas.
 	 */
-	public int getTextureAtlas() {
+	public Texture getTextureAtlas() {
 		return textureAtlas;
 	}
 

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

@@ -88,8 +88,9 @@ public class GUIText {
 	 * @param b
 	 *            - blue value, between 0 and 1.
 	 */
-	public void setColor(float r, float g, float b) {
+	public GUIText setColor(float r, float g, float b) {
 		colour.set(r, g, b);
+		return this;
 	}
 
 	/**

+ 19 - 118
src/main/java/eu/tankernn/gameEngine/renderEngine/Loader.java → src/main/java/eu/tankernn/gameEngine/loader/Loader.java

@@ -1,30 +1,22 @@
-package eu.tankernn.gameEngine.renderEngine;
+package eu.tankernn.gameEngine.loader;
 
-import java.io.IOException;
-import java.io.InputStream;
-import java.nio.ByteBuffer;
 import java.nio.FloatBuffer;
 import java.nio.IntBuffer;
 import java.util.ArrayList;
 import java.util.List;
 
 import org.lwjgl.BufferUtils;
-import org.lwjgl.opengl.EXTTextureFilterAnisotropic;
 import org.lwjgl.opengl.GL11;
-import org.lwjgl.opengl.GL13;
-import org.lwjgl.opengl.GL14;
 import org.lwjgl.opengl.GL15;
 import org.lwjgl.opengl.GL20;
 import org.lwjgl.opengl.GL30;
 import org.lwjgl.opengl.GL33;
-import org.lwjgl.opengl.GLContext;
 
-import de.matthiasmann.twl.utils.PNGDecoder;
-import de.matthiasmann.twl.utils.PNGDecoder.Format;
 import eu.tankernn.gameEngine.loader.models.RawModel;
 import eu.tankernn.gameEngine.loader.obj.ModelData;
-import eu.tankernn.gameEngine.loader.textures.TextureData;
-import eu.tankernn.gameEngine.settings.Settings;
+import eu.tankernn.gameEngine.loader.obj.normalMapped.NormalMappedObjLoader;
+import eu.tankernn.gameEngine.loader.textures.Texture;
+import eu.tankernn.gameEngine.util.InternalFile;
 /**
  * General purpose loader
  * @author Frans
@@ -33,7 +25,7 @@ import eu.tankernn.gameEngine.settings.Settings;
 public class Loader {
 	private List<Integer> vaos = new ArrayList<Integer>();
 	private List<Integer> vbos = new ArrayList<Integer>();
-	private List<Integer> textures = new ArrayList<Integer>();
+	private List<Texture> textures = new ArrayList<Texture>();
 	
 	public RawModel loadToVAO(float[] vertices, float[] textureCoords, float[] normals, int[] indices) {
 		int vaoID = createVAO();
@@ -114,75 +106,10 @@ public class Loader {
 	 * @param filename The path, relative to the root of the jar file, of the file to load.
 	 * @return The texture ID
 	 */
-	public int loadTexture(String filename) {
-		int textureID = 0;
-		try {
-			textureID = loadPNGTexture(getClass().getResourceAsStream("/" + filename + ".png"), GL13.GL_TEXTURE0);
-			GL11.glTexParameterf(GL11.GL_TEXTURE_2D, GL14.GL_TEXTURE_LOD_BIAS, 0f);
-			if (GLContext.getCapabilities().GL_EXT_texture_filter_anisotropic) {
-				float amount = Math.min(Settings.ANISOTROPIC_FILTERING_AMOUNT, GL11.glGetFloat(EXTTextureFilterAnisotropic.GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT));
-				GL11.glTexParameterf(GL11.GL_TEXTURE_2D, EXTTextureFilterAnisotropic.GL_TEXTURE_MAX_ANISOTROPY_EXT, amount);
-			} else {
-				System.out.println("Anisotropic filtering not supported.");
-			}
-		} catch (NullPointerException e) {
-			System.err.println("Could not load texture: " + filename);
-			e.printStackTrace();
-		}
-		
-		textures.add(textureID);
-		
-		return textureID;
-	}
-	
-	private int loadPNGTexture(InputStream file, int textureUnit) {
-		ByteBuffer buf = null;
-		int tWidth = 0;
-		int tHeight = 0;
-		
-		try {
-			// Link the PNG decoder to this stream
-			PNGDecoder decoder = new PNGDecoder(file);
-			
-			// Get the width and height of the texture
-			tWidth = decoder.getWidth();
-			tHeight = decoder.getHeight();
-			
-			// Decode the PNG file in a ByteBuffer
-			buf = ByteBuffer.allocateDirect(4 * decoder.getWidth() * decoder.getHeight());
-			decoder.decode(buf, decoder.getWidth() * 4, Format.RGBA);
-			buf.flip();
-			
-			file.close();
-		} catch (IOException e) {
-			e.printStackTrace();
-			System.exit(-1);
-		}
-		
-		// Create a new texture object in memory and bind it
-		int texId = GL11.glGenTextures();
-		GL13.glActiveTexture(textureUnit);
-		GL11.glBindTexture(GL11.GL_TEXTURE_2D, texId);
-		
-		// All RGB bytes are aligned to each other and each component is 1 byte
-		GL11.glPixelStorei(GL11.GL_UNPACK_ALIGNMENT, 1);
-		
-		// Upload the texture data and generate mip maps (for scaling)
-		GL11.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA, tWidth, tHeight, 0,
-				GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, buf);
-		GL30.glGenerateMipmap(GL11.GL_TEXTURE_2D);
-		
-		// Setup the ST coordinate system
-		GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_S, GL11.GL_REPEAT);
-		GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_T, GL11.GL_REPEAT);
-		
-		// Setup what to do when the texture has to be scaled
-		GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER,
-				GL11.GL_NEAREST);
-		GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER,
-				GL11.GL_LINEAR_MIPMAP_LINEAR);
-		
-		return texId;
+	public Texture loadTexture(String filename) {
+		Texture texture = Texture.newTexture(new InternalFile(filename)).create();
+		textures.add(texture);
+		return texture;
 	}
 	
 	/**
@@ -198,40 +125,10 @@ public class Loader {
 	 * @return The ID of the new cube map
 	 */
 	
-	public int loadCubeMap(String[] textureFiles, String folder) {
-		int texID = GL11.glGenTextures();
-		GL13.glActiveTexture(GL13.GL_TEXTURE0);
-		GL11.glBindTexture(GL13.GL_TEXTURE_CUBE_MAP, texID);
-		
-		for (int i = 0; i < textureFiles.length; i++) {
-			TextureData data = decodeTextureFile("/" + folder + textureFiles[i] + ".png");
-			GL11.glTexImage2D(GL13.GL_TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, GL11.GL_RGBA, data.getWidth(), data.getHeight(), 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, data.getBuffer());
-		}
-		GL11.glTexParameteri(GL13.GL_TEXTURE_CUBE_MAP, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_LINEAR);
-		GL11.glTexParameteri(GL13.GL_TEXTURE_CUBE_MAP, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_LINEAR);
-		textures.add(texID);
-		return texID;
-	}
-	
-	private TextureData decodeTextureFile(String filename) {
-		int width = 0;
-		int height = 0;
-		ByteBuffer buffer = null;
-		try {
-			InputStream in = getClass().getResourceAsStream(filename);
-			PNGDecoder decoder = new PNGDecoder(in);
-			width = decoder.getWidth();
-			height = decoder.getHeight();
-			buffer = ByteBuffer.allocateDirect(4 * width * height);
-			decoder.decode(buffer, width * 4, Format.RGBA);
-			buffer.flip();
-			in.close();
-		} catch (Exception e) {
-			e.printStackTrace();
-			System.err.println("Unable to load texture " + filename + ".");
-			System.exit(-1);
-		}
-		return new TextureData(buffer, width, height);
+	public Texture loadCubeMap(InternalFile[] textureFiles) {
+		Texture cubeMap = Texture.newCubeMap(textureFiles, 500);
+		textures.add(cubeMap);
+		return cubeMap;
 	}
 	
 	public void cleanUp() {
@@ -239,8 +136,8 @@ public class Loader {
 			GL30.glDeleteVertexArrays(vao);
 		for (int vbo: vbos)
 			GL15.glDeleteBuffers(vbo);
-		for (int tex: textures)
-			GL11.glDeleteTextures(tex);
+		for (Texture tex: textures)
+			tex.delete();
 	}
 	
 	private int createVAO() {
@@ -285,4 +182,8 @@ public class Loader {
 		buffer.flip();
 		return buffer;
 	}
+
+	public RawModel loadOBJ(InternalFile objFile) {
+		return NormalMappedObjLoader.loadOBJ(objFile, this);
+	}
 }

+ 1 - 1
src/main/java/eu/tankernn/gameEngine/loader/models/TexturedModel.java

@@ -16,7 +16,7 @@ public class TexturedModel {
 		return rawModel;
 	}
 
-	public ModelTexture getTexture() {
+	public ModelTexture getModelTexture() {
 		return texture;
 	}
 	

+ 16 - 14
src/main/java/eu/tankernn/gameEngine/loader/obj/OBJFileLoader.java

@@ -3,27 +3,24 @@ package eu.tankernn.gameEngine.loader.obj;
 import java.io.BufferedReader;
 import java.io.FileNotFoundException;
 import java.io.IOException;
-import java.io.InputStreamReader;
 import java.util.ArrayList;
 import java.util.List;
 
 import org.lwjgl.util.vector.Vector2f;
 import org.lwjgl.util.vector.Vector3f;
 
+import eu.tankernn.gameEngine.util.InternalFile;
+
 public class OBJFileLoader {
 	
-	private static final String OBJ_LOC = "/";
-	
-	public static ModelData loadOBJ(String objFileName) throws FileNotFoundException {
-		InputStreamReader isr = null;
-		String objFile = OBJ_LOC + objFileName + ".obj";
+	public static ModelData loadOBJ(InternalFile objFile) throws FileNotFoundException {
+		BufferedReader reader;
 		try {
-			isr = new InputStreamReader(OBJFileLoader.class.getResourceAsStream(objFile));
-		} catch (NullPointerException e) {
-			System.err.println("File not found in res; don't use any extension");
-			throw new FileNotFoundException();
+			reader = objFile.getReader();
+		} catch (Exception e1) {
+			e1.printStackTrace();
+			return null;
 		}
-		BufferedReader reader = new BufferedReader(isr);
 		String line;
 		List<Vertex> vertices = new ArrayList<Vertex>();
 		List<Vector2f> textures = new ArrayList<Vector2f>();
@@ -60,9 +57,14 @@ public class OBJFileLoader {
 				String[] vertex1 = currentLine[1].split("/");
 				String[] vertex2 = currentLine[2].split("/");
 				String[] vertex3 = currentLine[3].split("/");
-				processVertex(vertex1, vertices, indices);
-				processVertex(vertex2, vertices, indices);
-				processVertex(vertex3, vertices, indices);
+				try {
+					processVertex(vertex1, vertices, indices);
+					processVertex(vertex2, vertices, indices);
+					processVertex(vertex3, vertices, indices);
+				} catch (NumberFormatException e) {
+					System.err.println("No UV-coordinates found. Remember to unwrap in blender!");
+				}
+				
 				line = reader.readLine();
 			}
 			reader.close();

+ 8 - 11
src/main/java/eu/tankernn/gameEngine/loader/obj/normalMapped/NormalMappedObjLoader.java

@@ -2,29 +2,26 @@ package eu.tankernn.gameEngine.loader.obj.normalMapped;
 
 import java.io.BufferedReader;
 import java.io.IOException;
-import java.io.InputStreamReader;
 import java.util.ArrayList;
 import java.util.List;
 
 import org.lwjgl.util.vector.Vector2f;
 import org.lwjgl.util.vector.Vector3f;
 
+import eu.tankernn.gameEngine.loader.Loader;
 import eu.tankernn.gameEngine.loader.models.RawModel;
-import eu.tankernn.gameEngine.renderEngine.Loader;
+import eu.tankernn.gameEngine.util.InternalFile;
 
 public class NormalMappedObjLoader {
 
-	private static final String RES_LOC = "/";
-
-	public static RawModel loadOBJ(String objFileName, Loader loader) {
-		InputStreamReader isr = null;
-		String objFile = RES_LOC + objFileName + ".obj";
+	public static RawModel loadOBJ(InternalFile objFile, Loader loader) {
+		BufferedReader reader;
 		try {
-			isr = new InputStreamReader(NormalMappedObjLoader.class.getResourceAsStream(objFile));
-		} catch (NullPointerException e) {
-			System.err.println("File not found in res; don't use any extention");
+			reader = objFile.getReader();
+		} catch (Exception e1) {
+			e1.printStackTrace();
+			return null;
 		}
-		BufferedReader reader = new BufferedReader(isr);
 		String line;
 		List<VertexNM> vertices = new ArrayList<VertexNM>();
 		List<Vector2f> textures = new ArrayList<Vector2f>();

+ 16 - 12
src/main/java/eu/tankernn/gameEngine/loader/textures/ModelTexture.java

@@ -1,9 +1,9 @@
 package eu.tankernn.gameEngine.loader.textures;
 
 public class ModelTexture {
-	private int textureID;
-	private int normalMap;
-	private int specularMap;
+	private Texture textureID;
+	private Texture normalMap;
+	private Texture specularMap;
 
 	private float shineDemper = 1;
 	private float reflectivity = 0;
@@ -14,11 +14,11 @@ public class ModelTexture {
 
 	private int numberOfRows = 1;
 
-	public ModelTexture(int id) {
+	public ModelTexture(Texture id) {
 		this.textureID = id;
 	}
 
-	public int getID() {
+	public Texture getTexture() {
 		return textureID;
 	}
 
@@ -46,40 +46,44 @@ public class ModelTexture {
 		this.numberOfRows = numberOfRows;
 	}
 
-	public int getNormalMap() {
+	public Texture getNormalMap() {
 		return normalMap;
 	}
 
-	public void setNormalMap(int normalMap) {
+	public ModelTexture setNormalMap(Texture normalMap) {
 		this.normalMap = normalMap;
+		return this;
 	}
 
 	public float getShineDamper() {
 		return shineDemper;
 	}
 
-	public void setShineDamper(float shineDemper) {
+	public ModelTexture setShineDamper(float shineDemper) {
 		this.shineDemper = shineDemper;
+		return this;
 	}
 
 	public float getReflectivity() {
 		return reflectivity;
 	}
 
-	public void setReflectivity(float reflectivity) {
+	public ModelTexture setReflectivity(float reflectivity) {
 		this.reflectivity = reflectivity;
+		return this;
 	}
 	
-	public void setSpecularMap(int textureId) {
-		this.specularMap = textureId;
+	public ModelTexture setSpecularMap(Texture texture) {
+		this.specularMap = texture;
 		this.hasSpecularMap = true;
+		return this;
 	}
 	
 	public boolean hasSpecularMap() {
 		return this.hasSpecularMap;
 	}
 	
-	public int getSpecularMap() {
+	public Texture getSpecularMap() {
 		return this.specularMap;
 	}
 }

+ 0 - 13
src/main/java/eu/tankernn/gameEngine/loader/textures/TerrainTexture.java

@@ -1,13 +0,0 @@
-package eu.tankernn.gameEngine.loader.textures;
-
-public class TerrainTexture {
-	private int textureID;
-	
-	public TerrainTexture(int textureID) {
-		this.textureID = textureID;
-	}
-
-	public int getTextureID() {
-		return textureID;
-	}
-}

+ 9 - 9
src/main/java/eu/tankernn/gameEngine/loader/textures/TerrainTexturePack.java

@@ -2,31 +2,31 @@ package eu.tankernn.gameEngine.loader.textures;
 
 public class TerrainTexturePack {
 	
-	private TerrainTexture backgroundTexture;
-	private TerrainTexture rTexture;
-	private TerrainTexture gTexture;
-	private TerrainTexture bTexture;
+	private Texture backgroundTexture;
+	private Texture rTexture;
+	private Texture gTexture;
+	private Texture bTexture;
 	
-	public TerrainTexturePack(TerrainTexture backgroundTexture, TerrainTexture rTexture, TerrainTexture gTexture, TerrainTexture bTexture) {
+	public TerrainTexturePack(Texture backgroundTexture, Texture rTexture, Texture gTexture, Texture bTexture) {
 		this.backgroundTexture = backgroundTexture;
 		this.rTexture = rTexture;
 		this.gTexture = gTexture;
 		this.bTexture = bTexture;
 	}
 
-	public TerrainTexture getBackgroundTexture() {
+	public Texture getBackgroundTexture() {
 		return backgroundTexture;
 	}
 
-	public TerrainTexture getrTexture() {
+	public Texture getrTexture() {
 		return rTexture;
 	}
 
-	public TerrainTexture getgTexture() {
+	public Texture getgTexture() {
 		return gTexture;
 	}
 
-	public TerrainTexture getbTexture() {
+	public Texture getbTexture() {
 		return bTexture;
 	}
 	

+ 0 - 1
src/main/java/eu/tankernn/gameEngine/loader/textures/Texture.java

@@ -5,7 +5,6 @@ import org.lwjgl.opengl.GL13;
 
 import eu.tankernn.gameEngine.util.InternalFile;
 
-
 public class Texture {
 
 	public final int textureId;

+ 33 - 1
src/main/java/eu/tankernn/gameEngine/loader/textures/TextureUtils.java

@@ -9,6 +9,7 @@ import org.lwjgl.opengl.GL12;
 import org.lwjgl.opengl.GL13;
 import org.lwjgl.opengl.GL14;
 import org.lwjgl.opengl.GL30;
+import org.lwjgl.opengl.GL32;
 import org.lwjgl.opengl.GLContext;
 
 import de.matthiasmann.twl.utils.PNGDecoder;
@@ -22,7 +23,7 @@ public class TextureUtils {
 		GL11.glBindTexture(GL13.GL_TEXTURE_CUBE_MAP, texID);
 		for (int i = 0; i < 6; i++) {
 			GL11.glTexImage2D(GL13.GL_TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, GL11.GL_RGBA8, size, size, 0, GL11.GL_RGBA,
-					GL11.GL_UNSIGNED_BYTE, (ByteBuffer)null);
+					GL11.GL_UNSIGNED_BYTE, (ByteBuffer) null);
 		}
 		GL11.glTexParameteri(GL13.GL_TEXTURE_CUBE_MAP, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_LINEAR);
 		GL11.glTexParameteri(GL13.GL_TEXTURE_CUBE_MAP, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_LINEAR);
@@ -106,4 +107,35 @@ public class TextureUtils {
 		return texID;
 	}
 
+	public static Texture createTextureAttachment(int width, int height) {
+		int texture = GL11.glGenTextures();
+		GL11.glBindTexture(GL11.GL_TEXTURE_2D, texture);
+		GL11.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGB, width, height, 0, GL11.GL_RGB, GL11.GL_UNSIGNED_BYTE,
+				(ByteBuffer) null);
+		GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_LINEAR);
+		GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_LINEAR);
+		GL32.glFramebufferTexture(GL30.GL_FRAMEBUFFER, GL30.GL_COLOR_ATTACHMENT0, texture, 0);
+		return new Texture(texture, width * height);
+	}
+
+	public static Texture createDepthTextureAttachment(int width, int height) {
+		int texture = GL11.glGenTextures();
+		GL11.glBindTexture(GL11.GL_TEXTURE_2D, texture);
+		GL11.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL14.GL_DEPTH_COMPONENT32, width, height, 0, GL11.GL_DEPTH_COMPONENT,
+				GL11.GL_FLOAT, (ByteBuffer) null);
+		GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_LINEAR);
+		GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_LINEAR);
+		GL32.glFramebufferTexture(GL30.GL_FRAMEBUFFER, GL30.GL_DEPTH_ATTACHMENT, texture, 0);
+		return new Texture(texture, width * height);
+	}
+
+	public static int createDepthBufferAttachment(int width, int height) {
+		int depthBuffer = GL30.glGenRenderbuffers();
+		GL30.glBindRenderbuffer(GL30.GL_RENDERBUFFER, depthBuffer);
+		GL30.glRenderbufferStorage(GL30.GL_RENDERBUFFER, GL11.GL_DEPTH_COMPONENT, width, height);
+		GL30.glFramebufferRenderbuffer(GL30.GL_FRAMEBUFFER, GL30.GL_DEPTH_ATTACHMENT, GL30.GL_RENDERBUFFER,
+				depthBuffer);
+		return depthBuffer;
+	}
+
 }

+ 1 - 1
src/main/java/eu/tankernn/gameEngine/particles/ParticleMaster.java

@@ -10,7 +10,7 @@ import java.util.Map.Entry;
 import org.lwjgl.util.vector.Matrix4f;
 
 import eu.tankernn.gameEngine.entities.Camera;
-import eu.tankernn.gameEngine.renderEngine.Loader;
+import eu.tankernn.gameEngine.loader.Loader;
 import eu.tankernn.gameEngine.util.DistanceSorter;
 
 public class ParticleMaster {

+ 2 - 4
src/main/java/eu/tankernn/gameEngine/particles/ParticleRenderer.java

@@ -6,7 +6,6 @@ import java.util.Map;
 
 import org.lwjgl.BufferUtils;
 import org.lwjgl.opengl.GL11;
-import org.lwjgl.opengl.GL13;
 import org.lwjgl.opengl.GL20;
 import org.lwjgl.opengl.GL30;
 import org.lwjgl.opengl.GL31;
@@ -14,8 +13,8 @@ import org.lwjgl.util.vector.Matrix4f;
 import org.lwjgl.util.vector.Vector3f;
 
 import eu.tankernn.gameEngine.entities.Camera;
+import eu.tankernn.gameEngine.loader.Loader;
 import eu.tankernn.gameEngine.loader.models.RawModel;
-import eu.tankernn.gameEngine.renderEngine.Loader;
 
 public class ParticleRenderer {
 	
@@ -78,8 +77,7 @@ public class ParticleRenderer {
 	private void bindTexture(ParticleTexture texture) {
 		int blendType = texture.usesAdditiveBlending() ? GL11.GL_ONE : GL11.GL_ONE_MINUS_SRC_ALPHA;
 		GL11.glBlendFunc(GL11.GL_SRC_ALPHA, blendType);
-		GL13.glActiveTexture(GL13.GL_TEXTURE0);
-		GL11.glBindTexture(GL11.GL_TEXTURE_2D, texture.getTextureID());
+		texture.getTexture().bindToUnit(0);
 		shader.numberOfRows.loadFloat(texture.getNumberOfRows());
 	}
 	

+ 7 - 5
src/main/java/eu/tankernn/gameEngine/particles/ParticleTexture.java

@@ -1,18 +1,20 @@
 package eu.tankernn.gameEngine.particles;
 
+import eu.tankernn.gameEngine.loader.textures.Texture;
+
 public class ParticleTexture {
-	private int textureID;
+	private Texture texture;
 	private int numberOfRows;
 	private boolean additive;
 	
-	public ParticleTexture(int textureID, int numberOfRows, boolean additive) {
-		this.textureID = textureID;
+	public ParticleTexture(Texture texture, int numberOfRows, boolean additive) {
+		this.texture = texture;
 		this.numberOfRows = numberOfRows;
 		this.additive = additive;
 	}
 
-	public int getTextureID() {
-		return textureID;
+	public Texture getTexture() {
+		return texture;
 	}
 
 	public int getNumberOfRows() {

+ 4 - 6
src/main/java/eu/tankernn/gameEngine/postProcessing/ContrastChanger.java

@@ -1,9 +1,8 @@
 package eu.tankernn.gameEngine.postProcessing;
 
-import org.lwjgl.opengl.GL11;
-import org.lwjgl.opengl.GL13;
+import eu.tankernn.gameEngine.loader.textures.Texture;
 
-public class ContrastChanger {
+public class ContrastChanger implements IPostProcessingEffect {
 	private ImageRenderer renderer;
 	private ContrastShader shader;
 	
@@ -12,10 +11,9 @@ public class ContrastChanger {
 		renderer = new ImageRenderer();
 	}
 	
-	public void render(int texture) {
+	public void render(Texture texture) {
 		shader.start();
-		GL13.glActiveTexture(GL13.GL_TEXTURE0);
-		GL11.glBindTexture(GL11.GL_TEXTURE_2D, texture);
+		texture.bindToUnit(0);
 		renderer.renderQuad();
 		shader.stop();
 	}

+ 13 - 42
src/main/java/eu/tankernn/gameEngine/postProcessing/Fbo.java

@@ -1,16 +1,17 @@
 package eu.tankernn.gameEngine.postProcessing;
 
-import java.nio.ByteBuffer;
 import java.nio.IntBuffer;
 
 import org.lwjgl.BufferUtils;
 import org.lwjgl.opengl.Display;
 import org.lwjgl.opengl.GL11;
-import org.lwjgl.opengl.GL12;
 import org.lwjgl.opengl.GL14;
 import org.lwjgl.opengl.GL20;
 import org.lwjgl.opengl.GL30;
 
+import eu.tankernn.gameEngine.loader.textures.Texture;
+import eu.tankernn.gameEngine.loader.textures.TextureUtils;
+
 public class Fbo {
 
 	public static final int NONE = 0, DEPTH_TEXTURE = 1, DEPTH_RENDER_BUFFER = 2;
@@ -20,8 +21,8 @@ public class Fbo {
 
 	protected int frameBuffer;
 
-	private int colourTexture;
-	private int depthTexture;
+	private Texture colourTexture;
+	private Texture depthTexture;
 
 	protected int depthBuffer;
 
@@ -48,8 +49,9 @@ public class Fbo {
 	 */
 	public void cleanUp() {
 		GL30.glDeleteFramebuffers(frameBuffer);
-		GL11.glDeleteTextures(colourTexture);
-		GL11.glDeleteTextures(depthTexture);
+		colourTexture.delete();
+		if (depthTexture != null)
+			depthTexture.delete();
 		GL30.glDeleteRenderbuffers(depthBuffer);
 	}
 
@@ -82,16 +84,16 @@ public class Fbo {
 	}
 
 	/**
-	 * @return The ID of the texture containing the colour buffer of the FBO.
+	 * @return The texture containing the color buffer of the FBO.
 	 */
-	public int getColourTexture() {
+	public Texture getColourTexture() {
 		return colourTexture;
 	}
 
 	/**
 	 * @return The texture containing the FBOs depth buffer.
 	 */
-	public int getDepthTexture() {
+	public Texture getDepthTexture() {
 		return depthTexture;
 	}
 
@@ -105,11 +107,11 @@ public class Fbo {
 	 */
 	protected void initialiseFrameBuffer(int type) {
 		createFrameBuffer();
-		createTextureAttachment();
+		colourTexture = TextureUtils.createTextureAttachment(width, height);
 		if (type == DEPTH_RENDER_BUFFER) {
 			createDepthBufferAttachment();
 		} else if (type == DEPTH_TEXTURE) {
-			createDepthTextureAttachment();
+			depthTexture = TextureUtils.createDepthTextureAttachment(width, height);
 		}
 		unbindFrameBuffer();
 	}
@@ -132,37 +134,6 @@ public class Fbo {
 		determineDrawBuffers();
 	}
 
-	/**
-	 * Creates a texture and sets it as the colour buffer attachment for this
-	 * FBO.
-	 */
-	protected void createTextureAttachment() {
-		colourTexture = GL11.glGenTextures();
-		GL11.glBindTexture(GL11.GL_TEXTURE_2D, colourTexture);
-		GL11.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA8, width, height, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE,
-				(ByteBuffer) null);
-		GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_LINEAR);
-		GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_LINEAR);
-		GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_S, GL12.GL_CLAMP_TO_EDGE);
-		GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_T, GL12.GL_CLAMP_TO_EDGE);
-		GL30.glFramebufferTexture2D(GL30.GL_FRAMEBUFFER, GL30.GL_COLOR_ATTACHMENT0, GL11.GL_TEXTURE_2D, colourTexture,
-				0);
-	}
-
-	/**
-	 * Adds a depth buffer to the FBO in the form of a texture, which can later
-	 * be sampled.
-	 */
-	protected void createDepthTextureAttachment() {
-		depthTexture = GL11.glGenTextures();
-		GL11.glBindTexture(GL11.GL_TEXTURE_2D, depthTexture);
-		GL11.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL14.GL_DEPTH_COMPONENT24, width, height, 0, GL11.GL_DEPTH_COMPONENT,
-				GL11.GL_FLOAT, (ByteBuffer) null);
-		GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_LINEAR);
-		GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_LINEAR);
-		GL30.glFramebufferTexture2D(GL30.GL_FRAMEBUFFER, GL30.GL_DEPTH_ATTACHMENT, GL11.GL_TEXTURE_2D, depthTexture, 0);
-	}
-
 	/**
 	 * Adds a depth buffer to the FBO in the form of a render buffer. This can't
 	 * be used for sampling in the shaders.

+ 8 - 0
src/main/java/eu/tankernn/gameEngine/postProcessing/IPostProcessingEffect.java

@@ -0,0 +1,8 @@
+package eu.tankernn.gameEngine.postProcessing;
+
+import eu.tankernn.gameEngine.loader.textures.Texture;
+
+public interface IPostProcessingEffect {
+	public void render(Texture texture);
+	public void cleanUp();
+}

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

@@ -2,6 +2,8 @@ package eu.tankernn.gameEngine.postProcessing;
 
 import org.lwjgl.opengl.GL11;
 
+import eu.tankernn.gameEngine.loader.textures.Texture;
+
 public class ImageRenderer {
 
 	private Fbo fbo;
@@ -23,7 +25,7 @@ public class ImageRenderer {
 		}
 	}
 
-	public int getOutputTexture() {
+	public Texture getOutputTexture() {
 		return fbo.getColourTexture();
 	}
 

+ 2 - 2
src/main/java/eu/tankernn/gameEngine/postProcessing/MultisampleMultitargetFbo.java

@@ -9,11 +9,11 @@ import org.lwjgl.opengl.GL14;
 import org.lwjgl.opengl.GL20;
 import org.lwjgl.opengl.GL30;
 
+import eu.tankernn.gameEngine.loader.textures.TextureUtils;
 import eu.tankernn.gameEngine.renderEngine.DisplayManager;
 
 public class MultisampleMultitargetFbo extends Fbo {
 	
-
 	private int colorBuffer;
 	private int colorBuffer2;
 	
@@ -69,7 +69,7 @@ public class MultisampleMultitargetFbo extends Fbo {
 		if (type == DEPTH_RENDER_BUFFER) {
 			createDepthBufferAttachment();
 		} else if (type == DEPTH_TEXTURE) {
-			createDepthTextureAttachment();
+			TextureUtils.createDepthTextureAttachment(width, height);
 		}
 		unbindFrameBuffer();
 	}

+ 4 - 3
src/main/java/eu/tankernn/gameEngine/postProcessing/PostProcessing.java

@@ -5,12 +5,13 @@ import org.lwjgl.opengl.GL11;
 import org.lwjgl.opengl.GL20;
 import org.lwjgl.opengl.GL30;
 
+import eu.tankernn.gameEngine.loader.Loader;
 import eu.tankernn.gameEngine.loader.models.RawModel;
+import eu.tankernn.gameEngine.loader.textures.Texture;
 import eu.tankernn.gameEngine.postProcessing.bloom.BrightFilter;
 import eu.tankernn.gameEngine.postProcessing.bloom.CombineFilter;
 import eu.tankernn.gameEngine.postProcessing.gaussianBlur.HorizontalBlur;
 import eu.tankernn.gameEngine.postProcessing.gaussianBlur.VerticalBlur;
-import eu.tankernn.gameEngine.renderEngine.Loader;
 
 public class PostProcessing {
 	
@@ -36,10 +37,10 @@ public class PostProcessing {
 		combineFilter = new CombineFilter();
 	}
 	
-	public static void doPostProcessing(int colorTexture, int brightTexture) {
+	public static void doPostProcessing(Texture colorTexture, Texture brightTexture) {
 		start();
 		//brightFilter.render(colorTexture);
-		int bloomTexture = brightTexture;
+		Texture bloomTexture = brightTexture;
 		for (int i = 0; i < blurFactor; i++) {
 			hBlur[i].render(bloomTexture);
 			vBlur[i].render(hBlur[i].getOutputTexture());

+ 6 - 8
src/main/java/eu/tankernn/gameEngine/postProcessing/bloom/BrightFilter.java

@@ -1,11 +1,10 @@
 package eu.tankernn.gameEngine.postProcessing.bloom;
 
-import org.lwjgl.opengl.GL11;
-import org.lwjgl.opengl.GL13;
-
+import eu.tankernn.gameEngine.loader.textures.Texture;
+import eu.tankernn.gameEngine.postProcessing.IPostProcessingEffect;
 import eu.tankernn.gameEngine.postProcessing.ImageRenderer;
 
-public class BrightFilter {
+public class BrightFilter implements IPostProcessingEffect {
 
 	private ImageRenderer renderer;
 	private BrightFilterShader shader;
@@ -15,15 +14,14 @@ public class BrightFilter {
 		renderer = new ImageRenderer(width, height);
 	}
 	
-	public void render(int texture){
+	public void render(Texture texture){
 		shader.start();
-		GL13.glActiveTexture(GL13.GL_TEXTURE0);
-		GL11.glBindTexture(GL11.GL_TEXTURE_2D, texture);
+		texture.bindToUnit(0);
 		renderer.renderQuad();
 		shader.stop();
 	}
 	
-	public int getOutputTexture(){
+	public Texture getOutputTexture(){
 		return renderer.getOutputTexture();
 	}
 	

+ 4 - 8
src/main/java/eu/tankernn/gameEngine/postProcessing/bloom/CombineFilter.java

@@ -1,8 +1,6 @@
 package eu.tankernn.gameEngine.postProcessing.bloom;
 
-import org.lwjgl.opengl.GL11;
-import org.lwjgl.opengl.GL13;
-
+import eu.tankernn.gameEngine.loader.textures.Texture;
 import eu.tankernn.gameEngine.postProcessing.ImageRenderer;
 
 public class CombineFilter {
@@ -18,12 +16,10 @@ public class CombineFilter {
 		renderer = new ImageRenderer();
 	}
 	
-	public void render(int colourTexture, int highlightTexture){
+	public void render(Texture colorTexture, Texture bloomTexture){
 		shader.start();
-		GL13.glActiveTexture(GL13.GL_TEXTURE0);
-		GL11.glBindTexture(GL11.GL_TEXTURE_2D, colourTexture);
-		GL13.glActiveTexture(GL13.GL_TEXTURE1);
-		GL11.glBindTexture(GL11.GL_TEXTURE_2D, highlightTexture);
+		colorTexture.bindToUnit(0);
+		bloomTexture.bindToUnit(1);
 		renderer.renderQuad();
 		shader.stop();
 	}

+ 6 - 8
src/main/java/eu/tankernn/gameEngine/postProcessing/gaussianBlur/HorizontalBlur.java

@@ -1,11 +1,10 @@
 package eu.tankernn.gameEngine.postProcessing.gaussianBlur;
 
-import org.lwjgl.opengl.GL11;
-import org.lwjgl.opengl.GL13;
-
+import eu.tankernn.gameEngine.loader.textures.Texture;
+import eu.tankernn.gameEngine.postProcessing.IPostProcessingEffect;
 import eu.tankernn.gameEngine.postProcessing.ImageRenderer;
 
-public class HorizontalBlur {
+public class HorizontalBlur implements IPostProcessingEffect {
 	
 	private ImageRenderer renderer;
 	private HorizontalBlurShader shader;
@@ -18,15 +17,14 @@ public class HorizontalBlur {
 		renderer = new ImageRenderer(targetFboWidth, targetFboHeight);
 	}
 	
-	public void render(int texture){
+	public void render(Texture texture){
 		shader.start();
-		GL13.glActiveTexture(GL13.GL_TEXTURE0);
-		GL11.glBindTexture(GL11.GL_TEXTURE_2D, texture);
+		texture.bindToUnit(0);
 		renderer.renderQuad();
 		shader.stop();
 	}
 	
-	public int getOutputTexture(){
+	public Texture getOutputTexture(){
 		return renderer.getOutputTexture();
 	}
 	

+ 6 - 9
src/main/java/eu/tankernn/gameEngine/postProcessing/gaussianBlur/VerticalBlur.java

@@ -1,11 +1,10 @@
 package eu.tankernn.gameEngine.postProcessing.gaussianBlur;
 
-import org.lwjgl.opengl.GL11;
-import org.lwjgl.opengl.GL13;
-
+import eu.tankernn.gameEngine.loader.textures.Texture;
+import eu.tankernn.gameEngine.postProcessing.IPostProcessingEffect;
 import eu.tankernn.gameEngine.postProcessing.ImageRenderer;
 
-public class VerticalBlur {
+public class VerticalBlur implements IPostProcessingEffect {
 	
 	private ImageRenderer renderer;
 	private VerticalBlurShader shader;
@@ -17,17 +16,15 @@ public class VerticalBlur {
 		shader.targetHeight.loadFloat(targetFboHeight);
 		shader.stop();
 	}
-
 	
-	public void render(int texture){
+	public void render(Texture texture){
 		shader.start();
-		GL13.glActiveTexture(GL13.GL_TEXTURE0);
-		GL11.glBindTexture(GL11.GL_TEXTURE_2D, texture);
+		texture.bindToUnit(0);
 		renderer.renderQuad();
 		shader.stop();
 	}
 	
-	public int getOutputTexture(){
+	public Texture getOutputTexture(){
 		return renderer.getOutputTexture();
 	}
 	

+ 1 - 0
src/main/java/eu/tankernn/gameEngine/renderEngine/MasterRenderer.java

@@ -18,6 +18,7 @@ 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.loader.Loader;
 import eu.tankernn.gameEngine.loader.models.TexturedModel;
 import eu.tankernn.gameEngine.loader.textures.Texture;
 import eu.tankernn.gameEngine.renderEngine.entities.EntityRenderer;

+ 3 - 6
src/main/java/eu/tankernn/gameEngine/renderEngine/entities/EntityRenderer.java

@@ -8,7 +8,6 @@ import java.util.List;
 import java.util.Map;
 
 import org.lwjgl.opengl.GL11;
-import org.lwjgl.opengl.GL13;
 import org.lwjgl.opengl.GL20;
 import org.lwjgl.opengl.GL30;
 import org.lwjgl.util.vector.Matrix4f;
@@ -88,19 +87,17 @@ public class EntityRenderer {
 		GL20.glEnableVertexAttribArray(0);
 		GL20.glEnableVertexAttribArray(1);
 		GL20.glEnableVertexAttribArray(2);
-		ModelTexture texture = model.getTexture();
+		ModelTexture texture = model.getModelTexture();
 		shader.numberOfRows.loadFloat(texture.getNumberOfRows());
 		if (texture.hasTransparency())
 			MasterRenderer.disableCulling();
 		shader.useFakeLighting.loadBoolean(texture.isUseFakeLighting());
 		shader.shineDamper.loadFloat(texture.getShineDamper());
 		shader.reflectivity.loadFloat(texture.getReflectivity());
-		GL13.glActiveTexture(GL13.GL_TEXTURE0);
-		GL11.glBindTexture(GL11.GL_TEXTURE_2D, model.getTexture().getID());
+		model.getModelTexture().getTexture().bindToUnit(0);
 		shader.usesSpecularMap.loadBoolean(texture.hasSpecularMap());
 		if (texture.hasSpecularMap()) {
-			GL13.glActiveTexture(GL13.GL_TEXTURE1);
-			GL11.glBindTexture(GL11.GL_TEXTURE_2D, texture.getSpecularMap());
+			texture.getSpecularMap().bindToUnit(1);
 		}
 		bindEnvironmentMap(environmentMap);
 	}

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

@@ -4,7 +4,6 @@ import java.util.List;
 import java.util.Map;
 
 import org.lwjgl.opengl.GL11;
-import org.lwjgl.opengl.GL13;
 import org.lwjgl.opengl.GL20;
 import org.lwjgl.opengl.GL30;
 
@@ -22,8 +21,7 @@ public class FontRenderer {
 	public void render(Map<FontType, List<GUIText>> texts) {
 		prepare();
 		for (FontType font: texts.keySet()) {
-			GL13.glActiveTexture(GL13.GL_TEXTURE0);
-			GL11.glBindTexture(GL11.GL_TEXTURE_2D, font.getTextureAtlas());
+			font.getTextureAtlas().bindToUnit(0);
 			for (GUIText text: texts.get(font)) {
 				renderText(text);
 			}

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

@@ -6,8 +6,8 @@ import eu.tankernn.gameEngine.renderEngine.shaders.UniformVec3;
 
 public class FontShader extends ShaderProgram{
 
-	private static final String VERTEX_FILE = "/eu/tankernn/gameEngine/font/rendering/fontVertex.glsl";
-	private static final String FRAGMENT_FILE = "/eu/tankernn/gameEngine/font/rendering/fontFragment.glsl";
+	private static final String VERTEX_FILE = "/eu/tankernn/gameEngine/renderEngine/font/fontVertex.glsl";
+	private static final String FRAGMENT_FILE = "/eu/tankernn/gameEngine/renderEngine/font/fontFragment.glsl";
 	
 	protected UniformVec3 color = new UniformVec3("color");
 	protected UniformVec2 translation = new UniformVec2("translation");

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

@@ -8,7 +8,7 @@ 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.renderEngine.Loader;
+import eu.tankernn.gameEngine.loader.Loader;
 
 public class TextMaster {
 	

+ 1 - 1
src/main/java/eu/tankernn/gameEngine/renderEngine/gui/GuiRenderer.java

@@ -8,8 +8,8 @@ import org.lwjgl.opengl.GL20;
 import org.lwjgl.opengl.GL30;
 import org.lwjgl.util.vector.Matrix4f;
 
+import eu.tankernn.gameEngine.loader.Loader;
 import eu.tankernn.gameEngine.loader.models.RawModel;
-import eu.tankernn.gameEngine.renderEngine.Loader;
 import eu.tankernn.gameEngine.util.Maths;
 
 public class GuiRenderer {

+ 2 - 2
src/main/java/eu/tankernn/gameEngine/renderEngine/gui/GuiShader.java

@@ -4,8 +4,8 @@ import eu.tankernn.gameEngine.renderEngine.shaders.ShaderProgram;
 import eu.tankernn.gameEngine.renderEngine.shaders.UniformMatrix;
 
 public class GuiShader extends ShaderProgram {
-	private static final String VERTEX_FILE = "/eu/tankernn/gameEngine/gui/guiVertexShader.glsl";
-	private static final String FRAGMENT_FILE = "/eu/tankernn/gameEngine/gui/guiFragmentShader.glsl";
+	private static final String VERTEX_FILE = "/eu/tankernn/gameEngine/renderEngine/gui/guiVertexShader.glsl";
+	private static final String FRAGMENT_FILE = "/eu/tankernn/gameEngine/renderEngine/gui/guiFragmentShader.glsl";
 	
 	protected UniformMatrix transformationMatrix = new UniformMatrix("transformationMatrix");
 	

+ 4 - 8
src/main/java/eu/tankernn/gameEngine/renderEngine/normalMap/NormalMappingRenderer.java

@@ -4,7 +4,6 @@ import java.util.List;
 import java.util.Map;
 
 import org.lwjgl.opengl.GL11;
-import org.lwjgl.opengl.GL13;
 import org.lwjgl.opengl.GL20;
 import org.lwjgl.opengl.GL30;
 import org.lwjgl.util.vector.Matrix4f;
@@ -58,21 +57,18 @@ public class NormalMappingRenderer {
 		GL20.glEnableVertexAttribArray(1);
 		GL20.glEnableVertexAttribArray(2);
 		GL20.glEnableVertexAttribArray(3);
-		ModelTexture texture = model.getTexture();
+		ModelTexture texture = model.getModelTexture();
 		shader.numberOfRows.loadFloat(texture.getNumberOfRows());
 		if (texture.hasTransparency()) {
 			MasterRenderer.disableCulling();
 		}
 		shader.shineDamper.loadFloat(texture.getShineDamper());
 		shader.reflectivity.loadFloat(texture.getReflectivity());
-		GL13.glActiveTexture(GL13.GL_TEXTURE0);
-		GL11.glBindTexture(GL11.GL_TEXTURE_2D, model.getTexture().getID());
-		GL13.glActiveTexture(GL13.GL_TEXTURE1);
-		GL11.glBindTexture(GL11.GL_TEXTURE_2D, model.getTexture().getNormalMap());
+		model.getModelTexture().getTexture().bindToUnit(0);
+		model.getModelTexture().getNormalMap().bindToUnit(1);
 		shader.usesSpecularMap.loadBoolean(texture.hasSpecularMap());
 		if (texture.hasSpecularMap()) {
-			GL13.glActiveTexture(GL13.GL_TEXTURE2);
-			GL11.glBindTexture(GL11.GL_TEXTURE_2D, texture.getSpecularMap());
+			texture.getSpecularMap().bindToUnit(2);
 		}
 	}
 

+ 2 - 2
src/main/java/eu/tankernn/gameEngine/renderEngine/normalMap/NormalMappingShader.java

@@ -18,8 +18,8 @@ import eu.tankernn.gameEngine.renderEngine.shaders.UniformVec4;
 
 public class NormalMappingShader extends ShaderProgram {
 
-	private static final String VERTEX_FILE = "/eu/tankernn/gameEngine/normalMapping/renderer/normalMapVShader.glsl";
-	private static final String FRAGMENT_FILE = "/eu/tankernn/gameEngine/normalMapping/renderer/normalMapFShader.glsl";
+	private static final String VERTEX_FILE = "/eu/tankernn/gameEngine/renderEngine/normalMap/normalMapVShader.glsl";
+	private static final String FRAGMENT_FILE = "/eu/tankernn/gameEngine/renderEngine/normalMap/normalMapFShader.glsl";
 
 	protected UniformMatrix transformationMatrix = new UniformMatrix("transformationMatrix");
 	protected UniformMatrix projectionMatrix = new UniformMatrix("projectionMatrix");

+ 3 - 5
src/main/java/eu/tankernn/gameEngine/renderEngine/shadows/ShadowMapEntityRenderer.java

@@ -4,7 +4,6 @@ import java.util.List;
 import java.util.Map;
 
 import org.lwjgl.opengl.GL11;
-import org.lwjgl.opengl.GL13;
 import org.lwjgl.opengl.GL20;
 import org.lwjgl.opengl.GL30;
 import org.lwjgl.util.vector.Matrix4f;
@@ -44,9 +43,8 @@ public class ShadowMapEntityRenderer {
 		for (TexturedModel model : entities.keySet()) {
 			RawModel rawModel = model.getRawModel();
 			bindModel(rawModel);
-			GL13.glActiveTexture(GL13.GL_TEXTURE0);
-			GL11.glBindTexture(GL11.GL_TEXTURE_2D, model.getTexture().getID());
-			if (model.getTexture().hasTransparency()) {
+			model.getModelTexture().getTexture().bindToUnit(0);
+			if (model.getModelTexture().hasTransparency()) {
 				MasterRenderer.disableCulling();
 			}
 			for (Entity entity : entities.get(model)) {
@@ -54,7 +52,7 @@ public class ShadowMapEntityRenderer {
 				GL11.glDrawElements(GL11.GL_TRIANGLES, rawModel.getVertexCount(),
 						GL11.GL_UNSIGNED_INT, 0);
 			}
-			if (model.getTexture().hasTransparency()) {
+			if (model.getModelTexture().hasTransparency()) {
 				MasterRenderer.enableCulling();
 			}
 		}

+ 2 - 2
src/main/java/eu/tankernn/gameEngine/renderEngine/shadows/ShadowShader.java

@@ -5,8 +5,8 @@ import eu.tankernn.gameEngine.renderEngine.shaders.UniformMatrix;
 
 public class ShadowShader extends ShaderProgram {
 	
-	private static final String VERTEX_FILE = "/eu/tankernn/gameEngine/shadows/shadowVertexShader.glsl";
-	private static final String FRAGMENT_FILE = "/eu/tankernn/gameEngine/shadows/shadowFragmentShader.glsl";
+	private static final String VERTEX_FILE = "/eu/tankernn/gameEngine/renderEngine/shadows/shadowVertexShader.glsl";
+	private static final String FRAGMENT_FILE = "/eu/tankernn/gameEngine/renderEngine/shadows/shadowFragmentShader.glsl";
 	
 	protected UniformMatrix mvpMatrix = new UniformMatrix("mvpMatrix");
 	

+ 1 - 1
src/main/java/eu/tankernn/gameEngine/renderEngine/skybox/SkyboxRenderer.java

@@ -5,9 +5,9 @@ import org.lwjgl.opengl.GL20;
 import org.lwjgl.opengl.GL30;
 import org.lwjgl.util.vector.Matrix4f;
 
+import eu.tankernn.gameEngine.loader.Loader;
 import eu.tankernn.gameEngine.loader.textures.Texture;
 import eu.tankernn.gameEngine.renderEngine.DisplayManager;
-import eu.tankernn.gameEngine.renderEngine.Loader;
 import eu.tankernn.gameEngine.renderEngine.Vao;
 import eu.tankernn.gameEngine.util.ICamera;
 

+ 2 - 2
src/main/java/eu/tankernn/gameEngine/renderEngine/skybox/SkyboxShader.java

@@ -13,8 +13,8 @@ import eu.tankernn.gameEngine.util.ICamera;
 
 public class SkyboxShader extends ShaderProgram {
 	
-	private static final String VERTEX_FILE = "/eu/tankernn/gameEngine/skybox/skyboxVertexShader.glsl";
-	private static final String FRAGMENT_FILE = "/eu/tankernn/gameEngine/skybox/skyboxFragmentShader.glsl";
+	private static final String VERTEX_FILE = "/eu/tankernn/gameEngine/renderEngine/skybox/skyboxVertexShader.glsl";
+	private static final String FRAGMENT_FILE = "/eu/tankernn/gameEngine/renderEngine/skybox/skyboxFragmentShader.glsl";
 	
 	private static final float ROTATE_SPEED = 1f;
 	

+ 5 - 11
src/main/java/eu/tankernn/gameEngine/renderEngine/terrain/TerrainRenderer.java

@@ -7,7 +7,6 @@ import static eu.tankernn.gameEngine.settings.Settings.RED;
 import java.util.List;
 
 import org.lwjgl.opengl.GL11;
-import org.lwjgl.opengl.GL13;
 import org.lwjgl.opengl.GL20;
 import org.lwjgl.opengl.GL30;
 import org.lwjgl.util.vector.Matrix4f;
@@ -70,16 +69,11 @@ public class TerrainRenderer {
 
 	private void bindTexture(Terrain terrain) {
 		TerrainTexturePack texturePack = terrain.getTexturePack();
-		GL13.glActiveTexture(GL13.GL_TEXTURE0);
-		GL11.glBindTexture(GL11.GL_TEXTURE_2D, texturePack.getBackgroundTexture().getTextureID());
-		GL13.glActiveTexture(GL13.GL_TEXTURE1);
-		GL11.glBindTexture(GL11.GL_TEXTURE_2D, texturePack.getrTexture().getTextureID());
-		GL13.glActiveTexture(GL13.GL_TEXTURE2);
-		GL11.glBindTexture(GL11.GL_TEXTURE_2D, texturePack.getgTexture().getTextureID());
-		GL13.glActiveTexture(GL13.GL_TEXTURE3);
-		GL11.glBindTexture(GL11.GL_TEXTURE_2D, texturePack.getbTexture().getTextureID());
-		GL13.glActiveTexture(GL13.GL_TEXTURE4);
-		GL11.glBindTexture(GL11.GL_TEXTURE_2D, terrain.getBlendMap().getTextureID());
+		texturePack.getBackgroundTexture().bindToUnit(0);
+		texturePack.getrTexture().bindToUnit(1);
+		texturePack.getgTexture().bindToUnit(2);
+		texturePack.getbTexture().bindToUnit(3);
+		terrain.getBlendMap().bindToUnit(4);
 	}
 
 	private void unbindTexturedModel() {

+ 16 - 49
src/main/java/eu/tankernn/gameEngine/renderEngine/water/WaterFrameBuffers.java

@@ -1,12 +1,11 @@
 package eu.tankernn.gameEngine.renderEngine.water;
 
-import java.nio.ByteBuffer;
-
 import org.lwjgl.opengl.Display;
 import org.lwjgl.opengl.GL11;
-import org.lwjgl.opengl.GL14;
 import org.lwjgl.opengl.GL30;
-import org.lwjgl.opengl.GL32;
+
+import eu.tankernn.gameEngine.loader.textures.Texture;
+import eu.tankernn.gameEngine.loader.textures.TextureUtils;
 
 public class WaterFrameBuffers {
 	
@@ -17,12 +16,12 @@ public class WaterFrameBuffers {
 	private static final int REFRACTION_HEIGHT = 180;
 	
 	private int reflectionFrameBuffer;
-	private int reflectionTexture;
+	private Texture reflectionTexture;
 	private int reflectionDepthBuffer;
 	
 	private int refractionFrameBuffer;
-	private int refractionTexture;
-	private int refractionDepthTexture;
+	private Texture refractionTexture;
+	private Texture refractionDepthTexture;
 	
 	public WaterFrameBuffers() {//call when loading the game
 		initialiseReflectionFrameBuffer();
@@ -31,11 +30,11 @@ public class WaterFrameBuffers {
 	
 	public void cleanUp() {//call when closing the game
 		GL30.glDeleteFramebuffers(reflectionFrameBuffer);
-		GL11.glDeleteTextures(reflectionTexture);
+		reflectionTexture.delete();
 		GL30.glDeleteRenderbuffers(reflectionDepthBuffer);
 		GL30.glDeleteFramebuffers(refractionFrameBuffer);
-		GL11.glDeleteTextures(refractionTexture);
-		GL11.glDeleteTextures(refractionDepthTexture);
+		refractionTexture.delete();
+		refractionDepthTexture.delete();
 	}
 	
 	public void bindReflectionFrameBuffer() {//call before rendering to this FBO
@@ -51,29 +50,29 @@ public class WaterFrameBuffers {
 		GL11.glViewport(0, 0, Display.getWidth(), Display.getHeight());
 	}
 	
-	public int getReflectionTexture() {//get the resulting texture
+	public Texture getReflectionTexture() {//get the resulting texture
 		return reflectionTexture;
 	}
 	
-	public int getRefractionTexture() {//get the resulting texture
+	public Texture getRefractionTexture() {//get the resulting texture
 		return refractionTexture;
 	}
 	
-	public int getRefractionDepthTexture() {//get the resulting depth texture
+	public Texture getRefractionDepthTexture() {//get the resulting depth texture
 		return refractionDepthTexture;
 	}
 	
 	private void initialiseReflectionFrameBuffer() {
 		reflectionFrameBuffer = createFrameBuffer();
-		reflectionTexture = createTextureAttachment(REFLECTION_WIDTH, REFLECTION_HEIGHT);
-		reflectionDepthBuffer = createDepthBufferAttachment(REFLECTION_WIDTH, REFLECTION_HEIGHT);
+		reflectionTexture = TextureUtils.createTextureAttachment(REFLECTION_WIDTH, REFLECTION_HEIGHT);
+		reflectionDepthBuffer = TextureUtils.createDepthBufferAttachment(REFLECTION_WIDTH, REFLECTION_HEIGHT);
 		unbindCurrentFrameBuffer();
 	}
 	
 	private void initialiseRefractionFrameBuffer() {
 		refractionFrameBuffer = createFrameBuffer();
-		refractionTexture = createTextureAttachment(REFRACTION_WIDTH, REFRACTION_HEIGHT);
-		refractionDepthTexture = createDepthTextureAttachment(REFRACTION_WIDTH, REFRACTION_HEIGHT);
+		refractionTexture = TextureUtils.createTextureAttachment(REFRACTION_WIDTH, REFRACTION_HEIGHT);
+		refractionDepthTexture = TextureUtils.createDepthTextureAttachment(REFRACTION_WIDTH, REFRACTION_HEIGHT);
 		unbindCurrentFrameBuffer();
 	}
 	
@@ -93,38 +92,6 @@ public class WaterFrameBuffers {
 		return frameBuffer;
 	}
 	
-	private static int createTextureAttachment(int width, int height) {
-		int texture = GL11.glGenTextures();
-		GL11.glBindTexture(GL11.GL_TEXTURE_2D, texture);
-		GL11.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGB, width, height,
-				0, GL11.GL_RGB, GL11.GL_UNSIGNED_BYTE, (ByteBuffer) null);
-		GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_LINEAR);
-		GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_LINEAR);
-		GL32.glFramebufferTexture(GL30.GL_FRAMEBUFFER, GL30.GL_COLOR_ATTACHMENT0,
-				texture, 0);
-		return texture;
-	}
-	
-	private static int createDepthTextureAttachment(int width, int height) {
-		int texture = GL11.glGenTextures();
-		GL11.glBindTexture(GL11.GL_TEXTURE_2D, texture);
-		GL11.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL14.GL_DEPTH_COMPONENT32, width, height,
-				0, GL11.GL_DEPTH_COMPONENT, GL11.GL_FLOAT, (ByteBuffer) null);
-		GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_LINEAR);
-		GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_LINEAR);
-		GL32.glFramebufferTexture(GL30.GL_FRAMEBUFFER, GL30.GL_DEPTH_ATTACHMENT,
-				texture, 0);
-		return texture;
-	}
 	
-	private static int createDepthBufferAttachment(int width, int height) {
-		int depthBuffer = GL30.glGenRenderbuffers();
-		GL30.glBindRenderbuffer(GL30.GL_RENDERBUFFER, depthBuffer);
-		GL30.glRenderbufferStorage(GL30.GL_RENDERBUFFER, GL11.GL_DEPTH_COMPONENT, width,
-				height);
-		GL30.glFramebufferRenderbuffer(GL30.GL_FRAMEBUFFER, GL30.GL_DEPTH_ATTACHMENT,
-				GL30.GL_RENDERBUFFER, depthBuffer);
-		return depthBuffer;
-	}
 	
 }

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

@@ -9,7 +9,7 @@ import org.lwjgl.util.vector.Vector4f;
 
 import eu.tankernn.gameEngine.entities.Camera;
 import eu.tankernn.gameEngine.entities.Light;
-import eu.tankernn.gameEngine.renderEngine.Loader;
+import eu.tankernn.gameEngine.loader.Loader;
 import eu.tankernn.gameEngine.renderEngine.MasterRenderer;
 import eu.tankernn.gameEngine.renderEngine.Scene;
 import eu.tankernn.gameEngine.util.ICamera;

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

@@ -3,7 +3,6 @@ package eu.tankernn.gameEngine.renderEngine.water;
 import java.util.List;
 
 import org.lwjgl.opengl.GL11;
-import org.lwjgl.opengl.GL13;
 import org.lwjgl.opengl.GL20;
 import org.lwjgl.opengl.GL30;
 import org.lwjgl.util.vector.Matrix4f;
@@ -11,9 +10,10 @@ import org.lwjgl.util.vector.Vector3f;
 
 import eu.tankernn.gameEngine.entities.Camera;
 import eu.tankernn.gameEngine.entities.Light;
+import eu.tankernn.gameEngine.loader.Loader;
 import eu.tankernn.gameEngine.loader.models.RawModel;
+import eu.tankernn.gameEngine.loader.textures.Texture;
 import eu.tankernn.gameEngine.renderEngine.DisplayManager;
-import eu.tankernn.gameEngine.renderEngine.Loader;
 import eu.tankernn.gameEngine.util.Maths;
 
 public class WaterRenderer {
@@ -26,8 +26,8 @@ public class WaterRenderer {
 	
 	private float moveFactor = 0;
 	
-	private int dudvTexture;
-	private int normalMap;
+	private Texture dudvTexture;
+	private Texture normalMap;
 
 	public WaterRenderer(Loader loader, String dudvTexture, String normalMap, WaterShader shader, Matrix4f projectionMatrix, WaterFrameBuffers buffers) {
 		this.shader = shader;
@@ -63,16 +63,11 @@ public class WaterRenderer {
 		shader.loadLights(lights);
 		GL30.glBindVertexArray(quad.getVaoID());
 		GL20.glEnableVertexAttribArray(0);
-		GL13.glActiveTexture(GL13.GL_TEXTURE0);
-		GL11.glBindTexture(GL11.GL_TEXTURE_2D, buffers.getReflectionTexture());
-		GL13.glActiveTexture(GL13.GL_TEXTURE1);
-		GL11.glBindTexture(GL11.GL_TEXTURE_2D, buffers.getRefractionTexture());
-		GL13.glActiveTexture(GL13.GL_TEXTURE2);
-		GL11.glBindTexture(GL11.GL_TEXTURE_2D, dudvTexture);
-		GL13.glActiveTexture(GL13.GL_TEXTURE3);
-		GL11.glBindTexture(GL11.GL_TEXTURE_2D, normalMap);
-		GL13.glActiveTexture(GL13.GL_TEXTURE4);
-		GL11.glBindTexture(GL11.GL_TEXTURE_2D, buffers.getRefractionDepthTexture());
+		buffers.getReflectionTexture().bindToUnit(0);
+		buffers.getRefractionTexture().bindToUnit(1);
+		dudvTexture.bindToUnit(2);
+		normalMap.bindToUnit(3);
+		buffers.getRefractionDepthTexture().bindToUnit(4);
 		
 		GL11.glEnable(GL11.GL_BLEND);
 		GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);

+ 2 - 2
src/main/java/eu/tankernn/gameEngine/renderEngine/water/WaterShader.java

@@ -9,8 +9,8 @@ import eu.tankernn.gameEngine.renderEngine.shaders.UniformViewMatrix;
 
 public class WaterShader extends ShaderProgram {
 
-	private final static String VERTEX_FILE = "/eu/tankernn/gameEngine/water/waterVertex.glsl";
-	private final static String FRAGMENT_FILE = "/eu/tankernn/gameEngine/water/waterFragment.glsl";
+	private final static String VERTEX_FILE = "/eu/tankernn/gameEngine/renderEngine/water/waterVertex.glsl";
+	private final static String FRAGMENT_FILE = "/eu/tankernn/gameEngine/renderEngine/water/waterFragment.glsl";
 
 	protected UniformMatrix modelMatrix = new UniformMatrix("modelMatrix");
 	protected UniformViewMatrix viewMatrix = new UniformViewMatrix("viewMatrix");

+ 6 - 6
src/main/java/eu/tankernn/gameEngine/terrains/Terrain.java

@@ -9,10 +9,10 @@ import javax.imageio.ImageIO;
 import org.lwjgl.util.vector.Vector2f;
 import org.lwjgl.util.vector.Vector3f;
 
+import eu.tankernn.gameEngine.loader.Loader;
 import eu.tankernn.gameEngine.loader.models.RawModel;
-import eu.tankernn.gameEngine.loader.textures.TerrainTexture;
 import eu.tankernn.gameEngine.loader.textures.TerrainTexturePack;
-import eu.tankernn.gameEngine.renderEngine.Loader;
+import eu.tankernn.gameEngine.loader.textures.Texture;
 import eu.tankernn.gameEngine.util.Maths;
 
 public class Terrain {
@@ -24,11 +24,11 @@ public class Terrain {
 	private int gridX, gridZ;
 	private RawModel model;
 	private TerrainTexturePack texturePack;
-	private TerrainTexture blendMap;
+	private Texture blendMap;
 	
 	private float[][] heights;
 	
-	public Terrain(int gridX, int gridZ, Loader loader, TerrainTexturePack texturePack, TerrainTexture blendMap, String heightMap) {
+	public Terrain(int gridX, int gridZ, Loader loader, TerrainTexturePack texturePack, Texture blendMap, String heightMap) {
 		this.texturePack = texturePack;
 		this.blendMap = blendMap;
 		this.gridX = gridX;
@@ -38,7 +38,7 @@ public class Terrain {
 		this.model = generateTerrain(loader, heightMap);
 	}
 	
-	public Terrain(int gridX, int gridZ, Loader loader, TerrainTexturePack texturePack, TerrainTexture blendMap, int seed) {
+	public Terrain(int gridX, int gridZ, Loader loader, TerrainTexturePack texturePack, Texture blendMap, int seed) {
 		this.texturePack = texturePack;
 		this.blendMap = blendMap;
 		this.gridX = gridX;
@@ -199,7 +199,7 @@ public class Terrain {
 		return texturePack;
 	}
 	
-	public TerrainTexture getBlendMap() {
+	public Texture getBlendMap() {
 		return blendMap;
 	}