소스 검색

Merged normal-mapped and regular entities.

frans 8 년 전
부모
커밋
ff40e47131
21개의 변경된 파일186개의 추가작업 그리고 660개의 파일을 삭제
  1. 2 4
      src/main/java/eu/tankernn/gameEngine/MainLoop.java
  2. 20 0
      src/main/java/eu/tankernn/gameEngine/World.java
  3. 4 16
      src/main/java/eu/tankernn/gameEngine/loader/Loader.java
  4. 7 2
      src/main/java/eu/tankernn/gameEngine/loader/obj/ModelData.java
  5. 0 162
      src/main/java/eu/tankernn/gameEngine/loader/obj/OBJFileLoader.java
  6. 20 20
      src/main/java/eu/tankernn/gameEngine/loader/obj/ObjLoader.java
  7. 50 20
      src/main/java/eu/tankernn/gameEngine/loader/obj/Vertex.java
  8. 0 18
      src/main/java/eu/tankernn/gameEngine/loader/obj/normalMapped/ModelDataNM.java
  9. 0 96
      src/main/java/eu/tankernn/gameEngine/loader/obj/normalMapped/VertexNM.java
  10. 5 3
      src/main/java/eu/tankernn/gameEngine/loader/textures/ModelTexture.java
  11. 0 29
      src/main/java/eu/tankernn/gameEngine/renderEngine/MasterRenderer.java
  12. 1 7
      src/main/java/eu/tankernn/gameEngine/renderEngine/Scene.java
  13. 7 4
      src/main/java/eu/tankernn/gameEngine/renderEngine/entities/EntityRenderer.java
  14. 31 4
      src/main/java/eu/tankernn/gameEngine/renderEngine/entities/EntityShader.java
  15. 9 1
      src/main/java/eu/tankernn/gameEngine/renderEngine/entities/fragmentShader.glsl
  16. 0 74
      src/main/java/eu/tankernn/gameEngine/renderEngine/entities/normalMap/NormalMappingRenderer.java
  17. 0 73
      src/main/java/eu/tankernn/gameEngine/renderEngine/entities/normalMap/NormalMappingShader.java
  18. 0 64
      src/main/java/eu/tankernn/gameEngine/renderEngine/entities/normalMap/normalMapFShader.glsl
  19. 0 56
      src/main/java/eu/tankernn/gameEngine/renderEngine/entities/normalMap/normalMapVShader.glsl
  20. 27 7
      src/main/java/eu/tankernn/gameEngine/renderEngine/entities/vertexShader.glsl
  21. 3 0
      src/main/java/eu/tankernn/gameEngine/renderEngine/shaders/ShaderProgram.java

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

@@ -61,7 +61,6 @@ public class MainLoop {
 	public static final boolean DEBUG = true;
 
 	static List<Entity> entities = new ArrayList<Entity>();
-	static List<Entity> normalMapEntities = new ArrayList<Entity>();
 	static List<Light> lights = new ArrayList<Light>();
 
 	public static void main(String[] args) throws IOException {
@@ -106,10 +105,9 @@ public class MainLoop {
 		textMaster.loadText(text);
 
 		// Barrel
-
 		Entity barrel = new Entity(1, new Vector3f(75, 10, 75), new Vector3f(0, 0, 0), 1f,
 				loader.getModel(1).getRawModel().getBoundingBox());
-		normalMapEntities.add(barrel);
+		entities.add(barrel);
 
 		Light sun = new Light(new Vector3f(100000, 150000, -70000), new Vector3f(1f, 1f, 1f));
 		Light flashLight = new Light(new Vector3f(0, 10, -10), new Vector3f(2, 0, 0), new Vector3f(1, 0.01f, 0.002f));
@@ -199,7 +197,7 @@ public class MainLoop {
 			ps.setPosition(player.getPosition());
 			particleMaster.update(camera);
 
-			Scene scene = new Scene(entities, normalMapEntities, terrainPack, lights, camera, skybox);
+			Scene scene = new Scene(entities, terrainPack, lights, camera, skybox);
 
 			EnvironmentMapRenderer.renderEnvironmentMap(scene.getEnvironmentMap(), scene, player.getPosition(),
 					renderer);

+ 20 - 0
src/main/java/eu/tankernn/gameEngine/World.java

@@ -0,0 +1,20 @@
+package eu.tankernn.gameEngine;
+
+import java.util.List;
+
+import eu.tankernn.gameEngine.entities.Entity;
+import eu.tankernn.gameEngine.entities.Light;
+
+public class World {
+	private final int seed;
+	private List<Light> lights;
+	private List<Entity> entities;
+	
+	public World(int seed, List<Light> lights, List<Entity> entities) {
+		this.seed = seed;
+		this.lights = lights;
+		this.entities = entities;
+	}
+	
+	
+}

+ 4 - 16
src/main/java/eu/tankernn/gameEngine/loader/Loader.java

@@ -20,9 +20,7 @@ import org.lwjgl.opengl.GL33;
 
 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.ModelDataNM;
-import eu.tankernn.gameEngine.loader.obj.normalMapped.NormalMappedObjLoader;
+import eu.tankernn.gameEngine.loader.obj.ObjLoader;
 import eu.tankernn.gameEngine.loader.textures.ModelTexture;
 import eu.tankernn.gameEngine.loader.textures.Texture;
 import eu.tankernn.gameEngine.renderEngine.RawModel;
@@ -112,12 +110,7 @@ public class Loader {
 	}
 
 	public RawModel loadToVAO(ModelData data) {
-		return (RawModel) loadToVAO(data.getVertices(), data.getTextureCoords(), data.getNormals(), data.getIndices());
-	}
-
-	public RawModel loadToVAO(ModelDataNM data) {
-		return (RawModel) loadToVAO(data.getVertices(), data.getTextureCoords(), data.getNormals(), data.getTangents(),
-				data.getIndices());
+		return (RawModel) loadToVAO(data.getVertices(), data.getTextureCoords(), data.getNormals(), data.getTangents(), data.getIndices());
 	}
 
 	/**
@@ -191,12 +184,7 @@ public class Loader {
 	}
 
 	public RawModel loadOBJ(InternalFile objFile) {
-		ModelData data = OBJFileLoader.loadOBJ(objFile);
-		return this.loadToVAO(data).withBoundingBox(data);
-	}
-
-	public RawModel loadNormalMappedOBJ(InternalFile objFile) {
-		ModelDataNM data = NormalMappedObjLoader.loadOBJ(objFile);
+		ModelData data = ObjLoader.loadOBJ(objFile);
 		return this.loadToVAO(data).withBoundingBox(data);
 	}
 
@@ -233,7 +221,7 @@ public class Loader {
 			if (cachedRawModels.containsKey(objFile))
 				model = cachedRawModels.get(objFile);
 			else {
-				model = (normalFile != null ? loadNormalMappedOBJ(objFile) : loadOBJ(objFile));
+				model = loadOBJ(objFile);
 				cachedRawModels.put(objFile, model);
 			}
 

+ 7 - 2
src/main/java/eu/tankernn/gameEngine/loader/obj/ModelData.java

@@ -5,15 +5,16 @@ public class ModelData {
 	private float[] vertices;
 	private float[] textureCoords;
 	private float[] normals;
+	private float[] tangents;
 	private int[] indices;
 	private float furthestPoint;
 
-	public ModelData(float[] vertices, float[] textureCoords, float[] normals, int[] indices,
-			float furthestPoint) {
+	public ModelData(float[] vertices, float[] textureCoords, float[] normals,  float[] tangents, int[] indices,  float furthestPoint) {
 		this.vertices = vertices;
 		this.textureCoords = textureCoords;
 		this.normals = normals;
 		this.indices = indices;
+		this.tangents = tangents;
 		this.furthestPoint = furthestPoint;
 	}
 
@@ -29,6 +30,10 @@ public class ModelData {
 		return normals;
 	}
 
+	public float[] getTangents() {
+		return tangents;
+	}
+
 	public int[] getIndices() {
 		return indices;
 	}

+ 0 - 162
src/main/java/eu/tankernn/gameEngine/loader/obj/OBJFileLoader.java

@@ -1,162 +0,0 @@
-package eu.tankernn.gameEngine.loader.obj;
-
-import java.io.BufferedReader;
-import java.io.IOException;
-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 {
-	
-	public static ModelData loadOBJ(InternalFile objFile) {
-		BufferedReader reader;
-		try {
-			reader = objFile.getReader();
-		} catch (IOException e1) {
-			e1.printStackTrace();
-			return null;
-		}
-		String line;
-		List<Vertex> vertices = new ArrayList<Vertex>();
-		List<Vector2f> textures = new ArrayList<Vector2f>();
-		List<Vector3f> normals = new ArrayList<Vector3f>();
-		List<Integer> indices = new ArrayList<Integer>();
-		try {
-			while (true) {
-				line = reader.readLine();
-				if (line.startsWith("v ")) {
-					String[] currentLine = line.split(" ");
-					Vector3f vertex = new Vector3f((float) Float.valueOf(currentLine[1]),
-							(float) Float.valueOf(currentLine[2]),
-							(float) Float.valueOf(currentLine[3]));
-					Vertex newVertex = new Vertex(vertices.size(), vertex);
-					vertices.add(newVertex);
-					
-				} else if (line.startsWith("vt ")) {
-					String[] currentLine = line.split(" ");
-					Vector2f texture = new Vector2f((float) Float.valueOf(currentLine[1]),
-							(float) Float.valueOf(currentLine[2]));
-					textures.add(texture);
-				} else if (line.startsWith("vn ")) {
-					String[] currentLine = line.split(" ");
-					Vector3f normal = new Vector3f((float) Float.valueOf(currentLine[1]),
-							(float) Float.valueOf(currentLine[2]),
-							(float) Float.valueOf(currentLine[3]));
-					normals.add(normal);
-				} else if (line.startsWith("f ")) {
-					break;
-				}
-			}
-			while (line != null && line.startsWith("f ")) {
-				String[] currentLine = line.split(" ");
-				String[] vertex1 = currentLine[1].split("/");
-				String[] vertex2 = currentLine[2].split("/");
-				String[] vertex3 = currentLine[3].split("/");
-				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();
-		} catch (IOException e) {
-			System.err.println("Error reading the file");
-		}
-		removeUnusedVertices(vertices);
-		float[] verticesArray = new float[vertices.size() * 3];
-		float[] texturesArray = new float[vertices.size() * 2];
-		float[] normalsArray = new float[vertices.size() * 3];
-		float furthest = convertDataToArrays(vertices, textures, normals, verticesArray,
-				texturesArray, normalsArray);
-		int[] indicesArray = convertIndicesListToArray(indices);
-		ModelData data = new ModelData(verticesArray, texturesArray, normalsArray, indicesArray,
-				furthest);
-		return data;
-	}
-	
-	private static void processVertex(String[] vertex, List<Vertex> vertices, List<Integer> indices) {
-		int index = Integer.parseInt(vertex[0]) - 1;
-		Vertex currentVertex = vertices.get(index);
-		int textureIndex = Integer.parseInt(vertex[1]) - 1;
-		int normalIndex = Integer.parseInt(vertex[2]) - 1;
-		if (!currentVertex.isSet()) {
-			currentVertex.setTextureIndex(textureIndex);
-			currentVertex.setNormalIndex(normalIndex);
-			indices.add(index);
-		} else {
-			dealWithAlreadyProcessedVertex(currentVertex, textureIndex, normalIndex, indices,
-					vertices);
-		}
-	}
-	
-	private static int[] convertIndicesListToArray(List<Integer> indices) {
-		int[] indicesArray = new int[indices.size()];
-		for (int i = 0; i < indicesArray.length; i++) {
-			indicesArray[i] = indices.get(i);
-		}
-		return indicesArray;
-	}
-	
-	private static float convertDataToArrays(List<Vertex> vertices, List<Vector2f> textures,
-			List<Vector3f> normals, float[] verticesArray, float[] texturesArray,
-			float[] normalsArray) {
-		float furthestPoint = 0;
-		for (int i = 0; i < vertices.size(); i++) {
-			Vertex currentVertex = vertices.get(i);
-			if (currentVertex.getLength() > furthestPoint) {
-				furthestPoint = currentVertex.getLength();
-			}
-			Vector3f position = currentVertex.getPosition();
-			Vector2f textureCoord = textures.get(currentVertex.getTextureIndex());
-			Vector3f normalVector = normals.get(currentVertex.getNormalIndex());
-			verticesArray[i * 3] = position.x;
-			verticesArray[i * 3 + 1] = position.y;
-			verticesArray[i * 3 + 2] = position.z;
-			texturesArray[i * 2] = textureCoord.x;
-			texturesArray[i * 2 + 1] = 1 - textureCoord.y;
-			normalsArray[i * 3] = normalVector.x;
-			normalsArray[i * 3 + 1] = normalVector.y;
-			normalsArray[i * 3 + 2] = normalVector.z;
-		}
-		return furthestPoint;
-	}
-	
-	private static void dealWithAlreadyProcessedVertex(Vertex previousVertex, int newTextureIndex,
-			int newNormalIndex, List<Integer> indices, List<Vertex> vertices) {
-		if (previousVertex.hasSameTextureAndNormal(newTextureIndex, newNormalIndex)) {
-			indices.add(previousVertex.getIndex());
-		} else {
-			Vertex anotherVertex = previousVertex.getDuplicateVertex();
-			if (anotherVertex != null) {
-				dealWithAlreadyProcessedVertex(anotherVertex, newTextureIndex, newNormalIndex,
-						indices, vertices);
-			} else {
-				Vertex duplicateVertex = new Vertex(vertices.size(), previousVertex.getPosition());
-				duplicateVertex.setTextureIndex(newTextureIndex);
-				duplicateVertex.setNormalIndex(newNormalIndex);
-				previousVertex.setDuplicateVertex(duplicateVertex);
-				vertices.add(duplicateVertex);
-				indices.add(duplicateVertex.getIndex());
-			}
-			
-		}
-	}
-	
-	private static void removeUnusedVertices(List<Vertex> vertices) {
-		for (Vertex vertex: vertices) {
-			if (!vertex.isSet()) {
-				vertex.setTextureIndex(0);
-				vertex.setNormalIndex(0);
-			}
-		}
-	}
-	
-}

+ 20 - 20
src/main/java/eu/tankernn/gameEngine/loader/obj/normalMapped/NormalMappedObjLoader.java → src/main/java/eu/tankernn/gameEngine/loader/obj/ObjLoader.java

@@ -1,4 +1,4 @@
-package eu.tankernn.gameEngine.loader.obj.normalMapped;
+package eu.tankernn.gameEngine.loader.obj;
 
 import java.io.BufferedReader;
 import java.io.IOException;
@@ -10,9 +10,9 @@ import org.lwjgl.util.vector.Vector3f;
 
 import eu.tankernn.gameEngine.util.InternalFile;
 
-public class NormalMappedObjLoader {
+public class ObjLoader {
 
-	public static ModelDataNM loadOBJ(InternalFile objFile) {
+	public static ModelData loadOBJ(InternalFile objFile) {
 		BufferedReader reader;
 		try {
 			reader = objFile.getReader();
@@ -21,7 +21,7 @@ public class NormalMappedObjLoader {
 			return null;
 		}
 		String line;
-		List<VertexNM> vertices = new ArrayList<VertexNM>();
+		List<Vertex> vertices = new ArrayList<Vertex>();
 		List<Vector2f> textures = new ArrayList<Vector2f>();
 		List<Vector3f> normals = new ArrayList<Vector3f>();
 		List<Integer> indices = new ArrayList<Integer>();
@@ -33,7 +33,7 @@ public class NormalMappedObjLoader {
 					Vector3f vertex = new Vector3f((float) Float.valueOf(currentLine[1]),
 							(float) Float.valueOf(currentLine[2]),
 							(float) Float.valueOf(currentLine[3]));
-					VertexNM newVertex = new VertexNM(vertices.size(), vertex);
+					Vertex newVertex = new Vertex(vertices.size(), vertex);
 					vertices.add(newVertex);
 
 				} else if (line.startsWith("vt ")) {
@@ -56,9 +56,9 @@ public class NormalMappedObjLoader {
 				String[] vertex1 = currentLine[1].split("/");
 				String[] vertex2 = currentLine[2].split("/");
 				String[] vertex3 = currentLine[3].split("/");
-				VertexNM v0 = processVertex(vertex1, vertices, indices);
-				VertexNM v1 = processVertex(vertex2, vertices, indices);
-				VertexNM v2 = processVertex(vertex3, vertices, indices);
+				Vertex v0 = processVertex(vertex1, vertices, indices);
+				Vertex v1 = processVertex(vertex2, vertices, indices);
+				Vertex v2 = processVertex(vertex3, vertices, indices);
 				calculateTangents(v0, v1, v2, textures);//NEW
 				line = reader.readLine();
 			}
@@ -75,11 +75,11 @@ public class NormalMappedObjLoader {
 				texturesArray, normalsArray, tangentsArray);
 		int[] indicesArray = convertIndicesListToArray(indices);
 		
-		return new ModelDataNM(verticesArray, texturesArray, normalsArray, tangentsArray, indicesArray, furthest);
+		return new ModelData(verticesArray, texturesArray, normalsArray, tangentsArray, indicesArray, furthest);
 	}
 
 	//NEW 
-	private static void calculateTangents(VertexNM v0, VertexNM v1, VertexNM v2,
+	private static void calculateTangents(Vertex v0, Vertex v1, Vertex v2,
 			List<Vector2f> textures) {
 		Vector3f delatPos1 = Vector3f.sub(v1.getPosition(), v0.getPosition(), null);
 		Vector3f delatPos2 = Vector3f.sub(v2.getPosition(), v0.getPosition(), null);
@@ -99,10 +99,10 @@ public class NormalMappedObjLoader {
 		v2.addTangent(tangent);
 	}
 
-	private static VertexNM processVertex(String[] vertex, List<VertexNM> vertices,
+	private static Vertex processVertex(String[] vertex, List<Vertex> vertices,
 			List<Integer> indices) {
 		int index = Integer.parseInt(vertex[0]) - 1;
-		VertexNM currentVertex = vertices.get(index);
+		Vertex currentVertex = vertices.get(index);
 		int textureIndex = Integer.parseInt(vertex[1]) - 1;
 		int normalIndex = Integer.parseInt(vertex[2]) - 1;
 		if (!currentVertex.isSet()) {
@@ -124,12 +124,12 @@ public class NormalMappedObjLoader {
 		return indicesArray;
 	}
 
-	private static float convertDataToArrays(List<VertexNM> vertices, List<Vector2f> textures,
+	private static float convertDataToArrays(List<Vertex> vertices, List<Vector2f> textures,
 			List<Vector3f> normals, float[] verticesArray, float[] texturesArray,
 			float[] normalsArray, float[] tangentsArray) {
 		float furthestPoint = 0;
 		for (int i = 0; i < vertices.size(); i++) {
-			VertexNM currentVertex = vertices.get(i);
+			Vertex currentVertex = vertices.get(i);
 			if (currentVertex.getLength() > furthestPoint) {
 				furthestPoint = currentVertex.getLength();
 			}
@@ -153,18 +153,18 @@ public class NormalMappedObjLoader {
 		return furthestPoint;
 	}
 
-	private static VertexNM dealWithAlreadyProcessedVertex(VertexNM previousVertex, int newTextureIndex,
-			int newNormalIndex, List<Integer> indices, List<VertexNM> vertices) {
+	private static Vertex dealWithAlreadyProcessedVertex(Vertex previousVertex, int newTextureIndex,
+			int newNormalIndex, List<Integer> indices, List<Vertex> vertices) {
 		if (previousVertex.hasSameTextureAndNormal(newTextureIndex, newNormalIndex)) {
 			indices.add(previousVertex.getIndex());
 			return previousVertex;
 		} else {
-			VertexNM anotherVertex = previousVertex.getDuplicateVertex();
+			Vertex anotherVertex = previousVertex.getDuplicateVertex();
 			if (anotherVertex != null) {
 				return dealWithAlreadyProcessedVertex(anotherVertex, newTextureIndex,
 						newNormalIndex, indices, vertices);
 			} else {
-				VertexNM duplicateVertex = previousVertex.duplicate(vertices.size());//NEW
+				Vertex duplicateVertex = previousVertex.duplicate(vertices.size());//NEW
 				duplicateVertex.setTextureIndex(newTextureIndex);
 				duplicateVertex.setNormalIndex(newNormalIndex);
 				previousVertex.setDuplicateVertex(duplicateVertex);
@@ -175,8 +175,8 @@ public class NormalMappedObjLoader {
 		}
 	}
 
-	private static void removeUnusedVertices(List<VertexNM> vertices) {
-		for (VertexNM vertex : vertices) {
+	private static void removeUnusedVertices(List<Vertex> vertices) {
+		for (Vertex vertex : vertices) {
 			vertex.averageTangents();
 			if (!vertex.isSet()) {
 				vertex.setTextureIndex(0);

+ 50 - 20
src/main/java/eu/tankernn/gameEngine/loader/obj/Vertex.java

@@ -1,5 +1,8 @@
 package eu.tankernn.gameEngine.loader.obj;
 
+import java.util.ArrayList;
+import java.util.List;
+
 import org.lwjgl.util.vector.Vector3f;
 
 public class Vertex {
@@ -12,55 +15,82 @@ public class Vertex {
 	private Vertex duplicateVertex = null;
 	private int index;
 	private float length;
+	private List<Vector3f> tangents = new ArrayList<Vector3f>();
+	private Vector3f averagedTangent = new Vector3f(0, 0, 0);
 	
-	public Vertex(int index, Vector3f position) {
+	protected Vertex(int index, Vector3f position){
 		this.index = index;
 		this.position = position;
 		this.length = position.length();
 	}
 	
-	public int getIndex() {
+	protected void addTangent(Vector3f tangent){
+		tangents.add(tangent);
+	}
+	
+	//NEW
+	protected Vertex duplicate(int newIndex){
+		Vertex vertex = new Vertex(newIndex, position);
+		vertex.tangents = this.tangents;
+		return vertex;
+	}
+	
+	protected void averageTangents(){
+		if(tangents.isEmpty()){
+			return;
+		}
+		for(Vector3f tangent : tangents){
+			Vector3f.add(averagedTangent, tangent, averagedTangent);
+		}
+		averagedTangent.normalise();
+	}
+	
+	protected Vector3f getAverageTangent(){
+		return averagedTangent;
+	}
+	
+	protected int getIndex(){
 		return index;
 	}
 	
-	public float getLength() {
+	protected float getLength(){
 		return length;
 	}
 	
-	public boolean isSet() {
-		return textureIndex != NO_INDEX && normalIndex != NO_INDEX;
+	protected boolean isSet(){
+		return textureIndex!=NO_INDEX && normalIndex!=NO_INDEX;
 	}
 	
-	public boolean hasSameTextureAndNormal(int textureIndexOther, int normalIndexOther) {
-		return textureIndexOther == textureIndex && normalIndexOther == normalIndex;
+	protected boolean hasSameTextureAndNormal(int textureIndexOther,int normalIndexOther){
+		return textureIndexOther==textureIndex && normalIndexOther==normalIndex;
 	}
 	
-	public void setTextureIndex(int textureIndex) {
+	protected void setTextureIndex(int textureIndex){
 		this.textureIndex = textureIndex;
 	}
 	
-	public void setNormalIndex(int normalIndex) {
+	protected void setNormalIndex(int normalIndex){
 		this.normalIndex = normalIndex;
 	}
-	
-	public Vector3f getPosition() {
+
+	protected Vector3f getPosition() {
 		return position;
 	}
-	
-	public int getTextureIndex() {
+
+	protected int getTextureIndex() {
 		return textureIndex;
 	}
-	
-	public int getNormalIndex() {
+
+	protected int getNormalIndex() {
 		return normalIndex;
 	}
-	
-	public Vertex getDuplicateVertex() {
+
+	protected Vertex getDuplicateVertex() {
 		return duplicateVertex;
 	}
-	
-	public void setDuplicateVertex(Vertex duplicateVertex) {
+
+	protected void setDuplicateVertex(Vertex duplicateVertex) {
 		this.duplicateVertex = duplicateVertex;
 	}
-	
+
 }

+ 0 - 18
src/main/java/eu/tankernn/gameEngine/loader/obj/normalMapped/ModelDataNM.java

@@ -1,18 +0,0 @@
-package eu.tankernn.gameEngine.loader.obj.normalMapped;
-
-import eu.tankernn.gameEngine.loader.obj.ModelData;
-
-public class ModelDataNM extends ModelData {
-	private float[] tangents;
-
-	public ModelDataNM(float[] vertices, float[] textureCoords, float[] normals, float[] tangents, int[] indices,
-			float furthestPoint) {
-		super(vertices, textureCoords, normals, indices, furthestPoint);
-		this.tangents = tangents;
-	}
-
-	public float[] getTangents(){
-		return tangents;
-	}
-
-}

+ 0 - 96
src/main/java/eu/tankernn/gameEngine/loader/obj/normalMapped/VertexNM.java

@@ -1,96 +0,0 @@
-package eu.tankernn.gameEngine.loader.obj.normalMapped;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.lwjgl.util.vector.Vector3f;
-
-public class VertexNM {
-	
-	private static final int NO_INDEX = -1;
-	
-	private Vector3f position;
-	private int textureIndex = NO_INDEX;
-	private int normalIndex = NO_INDEX;
-	private VertexNM duplicateVertex = null;
-	private int index;
-	private float length;
-	private List<Vector3f> tangents = new ArrayList<Vector3f>();
-	private Vector3f averagedTangent = new Vector3f(0, 0, 0);
-	
-	protected VertexNM(int index, Vector3f position){
-		this.index = index;
-		this.position = position;
-		this.length = position.length();
-	}
-	
-	protected void addTangent(Vector3f tangent){
-		tangents.add(tangent);
-	}
-	
-	//NEW
-	protected VertexNM duplicate(int newIndex){
-		VertexNM vertex = new VertexNM(newIndex, position);
-		vertex.tangents = this.tangents;
-		return vertex;
-	}
-	
-	protected void averageTangents(){
-		if(tangents.isEmpty()){
-			return;
-		}
-		for(Vector3f tangent : tangents){
-			Vector3f.add(averagedTangent, tangent, averagedTangent);
-		}
-		averagedTangent.normalise();
-	}
-	
-	protected Vector3f getAverageTangent(){
-		return averagedTangent;
-	}
-	
-	protected int getIndex(){
-		return index;
-	}
-	
-	protected float getLength(){
-		return length;
-	}
-	
-	protected boolean isSet(){
-		return textureIndex!=NO_INDEX && normalIndex!=NO_INDEX;
-	}
-	
-	protected boolean hasSameTextureAndNormal(int textureIndexOther,int normalIndexOther){
-		return textureIndexOther==textureIndex && normalIndexOther==normalIndex;
-	}
-	
-	protected void setTextureIndex(int textureIndex){
-		this.textureIndex = textureIndex;
-	}
-	
-	protected void setNormalIndex(int normalIndex){
-		this.normalIndex = normalIndex;
-	}
-
-	protected Vector3f getPosition() {
-		return position;
-	}
-
-	protected int getTextureIndex() {
-		return textureIndex;
-	}
-
-	protected int getNormalIndex() {
-		return normalIndex;
-	}
-
-	protected VertexNM getDuplicateVertex() {
-		return duplicateVertex;
-	}
-
-	protected void setDuplicateVertex(VertexNM duplicateVertex) {
-		this.duplicateVertex = duplicateVertex;
-	}
-
-}

+ 5 - 3
src/main/java/eu/tankernn/gameEngine/loader/textures/ModelTexture.java

@@ -11,7 +11,6 @@ public class ModelTexture {
 
 	private boolean hasTransparency = false;
 	private boolean useFakeLighting = false;
-	private boolean hasSpecularMap = false;
 
 	private int numberOfRows = 1;
 
@@ -50,6 +49,10 @@ public class ModelTexture {
 	public Texture getNormalMap() {
 		return normalMap;
 	}
+	
+	public boolean hasNormalMap() {
+		return normalMap != null;
+	}
 
 	public ModelTexture setNormalMap(Texture normalMap) {
 		this.normalMap = normalMap;
@@ -76,12 +79,11 @@ public class ModelTexture {
 	
 	public ModelTexture setSpecularMap(Texture texture) {
 		this.specularMap = texture;
-		this.hasSpecularMap = true;
 		return this;
 	}
 	
 	public boolean hasSpecularMap() {
-		return this.hasSpecularMap;
+		return this.specularMap != null;
 	}
 	
 	public Texture getSpecularMap() {

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

@@ -22,7 +22,6 @@ import eu.tankernn.gameEngine.loader.models.TexturedModel;
 import eu.tankernn.gameEngine.loader.textures.Texture;
 import eu.tankernn.gameEngine.renderEngine.entities.EntityRenderer;
 import eu.tankernn.gameEngine.renderEngine.entities.EntityShader;
-import eu.tankernn.gameEngine.renderEngine.entities.normalMap.NormalMappingRenderer;
 import eu.tankernn.gameEngine.renderEngine.shadows.ShadowMapMasterRenderer;
 import eu.tankernn.gameEngine.renderEngine.skybox.Skybox;
 import eu.tankernn.gameEngine.renderEngine.skybox.SkyboxRenderer;
@@ -43,11 +42,9 @@ public class MasterRenderer {
 	private EntityRenderer<EntityShader> entityRenderer;
 	private TerrainRenderer terrainRenderer;
 	private SkyboxRenderer skyboxRenderer;
-	private NormalMappingRenderer normalMapRenderer;
 	private ShadowMapMasterRenderer shadowMapRenderer;
 	
 	private Map<TexturedModel, List<Entity>> entities = new HashMap<TexturedModel, List<Entity>>();
-	private Map<TexturedModel, List<Entity>> normalMapEntities = new HashMap<TexturedModel, List<Entity>>();
 	private List<Terrain> terrains = new ArrayList<Terrain>();
 
 	/**
@@ -62,7 +59,6 @@ public class MasterRenderer {
 		enableCulling();
 		this.loader = loader;
 		terrainRenderer = new TerrainRenderer(camera.getProjectionMatrix());
-		normalMapRenderer = new NormalMappingRenderer(camera.getProjectionMatrix());
 		shadowMapRenderer = new ShadowMapMasterRenderer(camera);
 		skyboxRenderer = new SkyboxRenderer(loader, camera.getProjectionMatrix(), skybox);
 		entityRenderer = new EntityRenderer<EntityShader>(camera.getProjectionMatrix());
@@ -101,7 +97,6 @@ public class MasterRenderer {
 		prepareScene(scene);
 		prepareBuffer();
 		entityRenderer.render(entities, shadowMapRenderer.getToShadowMapSpaceMatrix(), camera, NO_CLIP, scene.getLights(), scene.getEnvironmentMap());
-		normalMapRenderer.render(normalMapEntities, NO_CLIP, scene.getLights(), camera);
 		terrainRenderer.render(terrains, shadowMapRenderer.getToShadowMapSpaceMatrix(), camera, NO_CLIP, scene.getLights());
 	}
 
@@ -118,7 +113,6 @@ public class MasterRenderer {
 	public void render(List<Light> lights, ICamera camera, Vector4f clipPlane, Texture environmentMap) {
 		prepareBuffer();
 		entityRenderer.render(entities, shadowMapRenderer.getToShadowMapSpaceMatrix(), camera, clipPlane, lights, environmentMap);
-		normalMapRenderer.render(normalMapEntities, clipPlane, lights, camera);
 		terrainRenderer.render(terrains, shadowMapRenderer.getToShadowMapSpaceMatrix(), camera, clipPlane, lights);
 		skyboxRenderer.render(camera, RED, GREEN, BLUE);
 	}
@@ -126,16 +120,12 @@ public class MasterRenderer {
 	private void prepareScene(Scene scene) {
 		entities.clear();
 		terrains.clear();
-		normalMapEntities.clear();
 		for (Terrain t : scene.getTerrainPack().getTerrains()) {
 			processTerrain(t);
 		}
 		for (Entity e : scene.getEntities()) {
 			processEntity(e);
 		}
-		for (Entity e : scene.getNormalEntities()) {
-			processNormalMappedEntity(e);
-		}
 	}
 
 	/**
@@ -156,24 +146,6 @@ public class MasterRenderer {
 		}
 	}
 
-	/**
-	 * Same as {@link #processEntity(Entity)}, but for normal-mapped entities.
-	 * 
-	 * @param entity
-	 *            Entity to add to the list
-	 */
-	public void processNormalMappedEntity(Entity entity) {
-		TexturedModel entityModel = loader.getModel(entity.getModel());
-		List<Entity> batch = normalMapEntities.get(entityModel);
-		if (batch != null) {
-			batch.add(entity);
-		} else {
-			List<Entity> newBatch = new ArrayList<Entity>();
-			newBatch.add(entity);
-			normalMapEntities.put(entityModel, newBatch);
-		}
-	}
-
 	/**
 	 * Adds specified terrain to the terrain list.
 	 * 
@@ -207,7 +179,6 @@ public class MasterRenderer {
 	public void cleanUp() {
 		entityRenderer.cleanUp();
 		terrainRenderer.cleanUp();
-		normalMapRenderer.cleanUp();
 		shadowMapRenderer.cleanUp();
 	}
 

+ 1 - 7
src/main/java/eu/tankernn/gameEngine/renderEngine/Scene.java

@@ -11,7 +11,6 @@ import eu.tankernn.gameEngine.terrains.TerrainPack;
 
 public class Scene {
 	private List<Entity> entities;
-	private List<Entity> normalEntities;
 	private TerrainPack terrainPack;
 	private List<Light> lights;
 	private Camera camera;
@@ -19,9 +18,8 @@ public class Scene {
 	
 	private Texture environmentMap;
 	
-	public Scene(List<Entity> entities, List<Entity> normalEntities, TerrainPack terrainPack, List<Light> lights, Camera camera, Skybox sky) {
+	public Scene(List<Entity> entities, TerrainPack terrainPack, List<Light> lights, Camera camera, Skybox sky) {
 		this.entities = entities;
-		this.normalEntities = normalEntities;
 		this.terrainPack = terrainPack;
 		this.lights = lights;
 		this.camera = camera;
@@ -33,10 +31,6 @@ public class Scene {
 		return entities;
 	}
 
-	public List<Entity> getNormalEntities() {
-		return normalEntities;
-	}
-
 	public TerrainPack getTerrainPack() {
 		return terrainPack;
 	}

+ 7 - 4
src/main/java/eu/tankernn/gameEngine/renderEngine/entities/EntityRenderer.java

@@ -65,7 +65,7 @@ public class EntityRenderer<S extends EntityShader> {
 		shader.start();
 		shader.plane.loadVec4(clipPlane);
 		shader.skyColor.loadVec3(RED, GREEN, BLUE);
-		shader.loadLights(lights);
+		shader.loadLights(lights, cam.getViewMatrix());
 		shader.viewMatrix.loadCamera(cam);
 
 		shader.toShadowMapSpace.loadMatrix(toShadowSpace);
@@ -87,7 +87,7 @@ public class EntityRenderer<S extends EntityShader> {
 	}
 
 	private void prepareTexturedModel(TexturedModel model, Texture environmentMap) {
-		model.getRawModel().bind(0, 1, 2);
+		model.getRawModel().bind(0, 1, 2, 3);
 		ModelTexture texture = model.getModelTexture();
 		shader.numberOfRows.loadFloat(texture.getNumberOfRows());
 		if (texture.hasTransparency())
@@ -99,8 +99,11 @@ public class EntityRenderer<S extends EntityShader> {
 		model.getModelTexture().getTexture().bindToUnit(0);
 		shader.usesSpecularMap.loadBoolean(texture.hasSpecularMap());
 		if (texture.hasSpecularMap()) {
-			texture.getSpecularMap().bindToUnit(1);
+			texture.getSpecularMap().bindToUnit(2);
 		}
+		shader.usesNormalMap.loadBoolean(texture.hasNormalMap());
+		if (texture.hasNormalMap())
+			texture.getNormalMap().bindToUnit(1);
 		bindEnvironmentMap(environmentMap);
 	}
 
@@ -110,7 +113,7 @@ public class EntityRenderer<S extends EntityShader> {
 
 	private void unbindTexturedModel(TexturedModel model) {
 		MasterRenderer.enableCulling();
-		model.getRawModel().unbind(0, 1, 2);
+		model.getRawModel().unbind(0, 1, 2, 3);
 	}
 
 	protected void prepareInstance(Entity entity, TexturedModel model) {

+ 31 - 4
src/main/java/eu/tankernn/gameEngine/renderEngine/entities/EntityShader.java

@@ -1,5 +1,12 @@
 package eu.tankernn.gameEngine.renderEngine.entities;
 
+import java.util.List;
+
+import org.lwjgl.util.vector.Matrix4f;
+import org.lwjgl.util.vector.Vector3f;
+import org.lwjgl.util.vector.Vector4f;
+
+import eu.tankernn.gameEngine.entities.Light;
 import eu.tankernn.gameEngine.renderEngine.shaders.ShaderProgram;
 import eu.tankernn.gameEngine.renderEngine.shaders.UniformBoolean;
 import eu.tankernn.gameEngine.renderEngine.shaders.UniformFloat;
@@ -18,7 +25,6 @@ public class EntityShader extends ShaderProgram {
 	protected UniformMatrix transformationMatrix = new UniformMatrix("transformationMatrix");
 	protected UniformMatrix projectionMatrix = new UniformMatrix("projectionMatrix");
 	public UniformViewMatrix viewMatrix = new UniformViewMatrix("viewMatrix");
-
 	public UniformFloat shineDamper = new UniformFloat("shineDamper");
 	public UniformFloat reflectivity = new UniformFloat("reflectivity");
 	protected UniformFloat refractivity = new UniformFloat("refractivity");
@@ -34,23 +40,44 @@ public class EntityShader extends ShaderProgram {
 	protected UniformSampler modelTexture = new UniformSampler("modelTexture");
 	protected UniformVec3 cameraPosition = new UniformVec3("cameraPosition");
 	protected UniformSampler enviroMap = new UniformSampler("enviroMap");
+	protected UniformSampler normalMap = new UniformSampler("normalMap");
+	public UniformBoolean usesNormalMap = new UniformBoolean("usesNormalMap");
 
 	public EntityShader() {
-		super(VERTEX_FILE, FRAGMENT_FILE, "position", "textureCoords", "normal");
+		super(VERTEX_FILE, FRAGMENT_FILE, "position", "textureCoords", "normal", "tangent");
 		super.getLightUniformLocations();
 		super.storeAllUniformLocations(transformationMatrix, projectionMatrix, viewMatrix, shineDamper, reflectivity,
 				refractivity, useFakeLighting, skyColor, numberOfRows, offset, plane, toShadowMapSpace, shadowMap,
-				specularMap, usesSpecularMap, modelTexture, cameraPosition, enviroMap);
+				specularMap, usesSpecularMap, modelTexture, cameraPosition, enviroMap, normalMap, usesNormalMap);
 	}
 
 	public EntityShader(String vertexFile, String fragmentFile, String... string) {
 		super(vertexFile, fragmentFile, string);
 	}
 
+	public void loadLights(List<Light> lights, Matrix4f viewMatrix) {
+		super.loadLights(lights);
+		for (int i = 0; i < MAX_LIGHTS; i++) {
+			if (i < lights.size()) {
+				lightPositionEyeSpace[i].loadVec3(getEyeSpacePosition(lights.get(i), viewMatrix));
+			} else {
+				lightPositionEyeSpace[i].loadVec3(new Vector3f(0, 0, 0));
+			}
+		}
+	}
+
 	protected void connectTextureUnits() {
 		shadowMap.loadTexUnit(5);
 		modelTexture.loadTexUnit(0);
-		specularMap.loadTexUnit(1);
+		normalMap.loadTexUnit(1);
+		specularMap.loadTexUnit(2);
 		enviroMap.loadTexUnit(10);
 	}
+
+	private Vector3f getEyeSpacePosition(Light light, Matrix4f viewMatrix) {
+		Vector3f position = light.getPosition();
+		Vector4f eyeSpacePos = new Vector4f(position.x, position.y, position.z, 1f);
+		Matrix4f.transform(viewMatrix, eyeSpacePos, eyeSpacePos);
+		return new Vector3f(eyeSpacePos);
+	}
 }

+ 9 - 1
src/main/java/eu/tankernn/gameEngine/renderEngine/entities/fragmentShader.glsl

@@ -14,8 +14,10 @@ layout (location = 1) out vec4 out_BrightColor;
 
 uniform sampler2D shadowMap;
 uniform sampler2D modelTexture;
+uniform sampler2D normalMap;
 uniform sampler2D specularMap;
 uniform samplerCube enviroMap;
+uniform float usesNormalMap;
 uniform float usesSpecularMap;
 uniform vec3 lightColor[4]; //4 max light sources
 uniform vec3 attenuation[4];
@@ -35,6 +37,12 @@ void main(void){
 	}
 	
 	vec3 unitNormal = normalize(surfaceNormal);
+
+	if (usesNormalMap > 0.5) {
+		vec4 normalMapValue = 2.0 * texture(normalMap, pass_textureCoords) - 1.0;
+		unitNormal = normalize(normalMapValue.rgb);
+	}
+
 	vec3 unitVectorToCamera = normalize(toCameraVector);
 	
 	vec3 totalDiffuse = vec3(0.0);
@@ -87,4 +95,4 @@ void main(void){
 	}
 	
 	out_Color = mix(out_Color, enviroColor, (reflectivity / 10 + refractivity) / 2);
-}
+}

+ 0 - 74
src/main/java/eu/tankernn/gameEngine/renderEngine/entities/normalMap/NormalMappingRenderer.java

@@ -1,74 +0,0 @@
-package eu.tankernn.gameEngine.renderEngine.entities.normalMap;
-
-import java.util.List;
-import java.util.Map;
-
-import org.lwjgl.opengl.GL11;
-import org.lwjgl.util.vector.Matrix4f;
-import org.lwjgl.util.vector.Vector4f;
-
-import eu.tankernn.gameEngine.entities.Entity;
-import eu.tankernn.gameEngine.entities.Light;
-import eu.tankernn.gameEngine.loader.models.TexturedModel;
-import eu.tankernn.gameEngine.loader.textures.ModelTexture;
-import eu.tankernn.gameEngine.renderEngine.MasterRenderer;
-import eu.tankernn.gameEngine.renderEngine.RawModel;
-import eu.tankernn.gameEngine.renderEngine.entities.EntityRenderer;
-import eu.tankernn.gameEngine.settings.Settings;
-import eu.tankernn.gameEngine.util.ICamera;
-
-public class NormalMappingRenderer extends EntityRenderer<NormalMappingShader> {
-
-	public NormalMappingRenderer(Matrix4f projectionMatrix) {
-		super(new NormalMappingShader(), projectionMatrix);
-	}
-
-	public void render(Map<TexturedModel, List<Entity>> entities, Vector4f clipPlane, List<Light> lights,
-			ICamera camera) {
-		shader.start();
-		prepare(clipPlane, lights, camera);
-		for (TexturedModel model : entities.keySet()) {
-			prepareTexturedModel(model);
-			List<Entity> batch = entities.get(model);
-			for (Entity entity : batch) {
-				prepareInstance(entity, model);
-				GL11.glDrawElements(GL11.GL_TRIANGLES, model.getRawModel().getIndexCount(), GL11.GL_UNSIGNED_INT, 0);
-			}
-			unbindTexturedModel(model);
-		}
-		shader.stop();
-	}
-
-	private void prepareTexturedModel(TexturedModel model) {
-		RawModel rawModel = model.getRawModel();
-		rawModel.bind(0, 1, 2, 3);
-		ModelTexture texture = model.getModelTexture();
-		shader.numberOfRows.loadFloat(texture.getNumberOfRows());
-		if (texture.hasTransparency()) {
-			MasterRenderer.disableCulling();
-		}
-		shader.shineDamper.loadFloat(texture.getShineDamper());
-		shader.reflectivity.loadFloat(texture.getReflectivity());
-		model.getModelTexture().getTexture().bindToUnit(0);
-		model.getModelTexture().getNormalMap().bindToUnit(1);
-		shader.usesSpecularMap.loadBoolean(texture.hasSpecularMap());
-		if (texture.hasSpecularMap()) {
-			texture.getSpecularMap().bindToUnit(2);
-		}
-	}
-
-	private void unbindTexturedModel(TexturedModel model) {
-		MasterRenderer.enableCulling();
-		model.getRawModel().unbind(0, 1, 2, 3);
-	}
-
-	private void prepare(Vector4f clipPlane, List<Light> lights, ICamera camera) {
-		shader.plane.loadVec4(clipPlane);
-		shader.skyColor.loadVec3(Settings.RED, Settings.GREEN, Settings.BLUE);
-		Matrix4f viewMatrix = camera.getViewMatrix();
-
-		shader.loadLights(lights, viewMatrix);
-		shader.viewMatrix.loadMatrix(viewMatrix);
-	}
-
-}

+ 0 - 73
src/main/java/eu/tankernn/gameEngine/renderEngine/entities/normalMap/NormalMappingShader.java

@@ -1,73 +0,0 @@
-package eu.tankernn.gameEngine.renderEngine.entities.normalMap;
-
-import java.util.List;
-
-import org.lwjgl.util.vector.Matrix4f;
-import org.lwjgl.util.vector.Vector3f;
-import org.lwjgl.util.vector.Vector4f;
-
-import eu.tankernn.gameEngine.entities.Light;
-import eu.tankernn.gameEngine.renderEngine.entities.EntityShader;
-import eu.tankernn.gameEngine.renderEngine.shaders.UniformSampler;
-import eu.tankernn.gameEngine.renderEngine.shaders.UniformVec3;
-
-public class NormalMappingShader extends EntityShader {
-
-	private static final String VERTEX_FILE = "/eu/tankernn/gameEngine/renderEngine/entities/normalMap/normalMapVShader.glsl";
-	private static final String FRAGMENT_FILE = "/eu/tankernn/gameEngine/renderEngine/entities/normalMap/normalMapFShader.glsl";
-	
-	private UniformVec3[] lightPositionEyeSpace;
-	protected UniformSampler normalMap = new UniformSampler("normalMap");
-
-	public NormalMappingShader() {
-		super(VERTEX_FILE, FRAGMENT_FILE, "position", "textureCoordinates", "normal", "tangent");
-		this.getLightUniformLocations();
-		super.storeAllUniformLocations(transformationMatrix, projectionMatrix, viewMatrix, shineDamper, reflectivity,
-				skyColor, numberOfRows, offset, plane, modelTexture, normalMap, specularMap, usesSpecularMap);
-	}
-
-	@Override
-	protected void getLightUniformLocations() {
-		lightPositionEyeSpace = new UniformVec3[MAX_LIGHTS];
-		lightColor = new UniformVec3[MAX_LIGHTS];
-		attenuation = new UniformVec3[MAX_LIGHTS];
-		for (int i = 0; i < MAX_LIGHTS; i++) {
-			lightPositionEyeSpace[i] = new UniformVec3("lightPositionEyeSpace[" + i + "]");
-			lightColor[i] = new UniformVec3("lightColor[" + i + "]");
-			attenuation[i] = new UniformVec3("attenuation[" + i + "]");
-		}
-	}
-
-	public void loadLights(List<Light> lights, Matrix4f viewMatrix) {
-		for (int i = 0; i < MAX_LIGHTS; i++) {
-			if (i < lights.size()) {
-				lightPositionEyeSpace[i].loadVec3(getEyeSpacePosition(lights.get(i), viewMatrix));
-				lightColor[i].loadVec3(lights.get(i).getColor());
-				attenuation[i].loadVec3(lights.get(i).getAttenuation());
-			} else {
-				lightPositionEyeSpace[i].loadVec3(new Vector3f(0, 0, 0));
-				lightColor[i].loadVec3(new Vector3f(0, 0, 0));
-				attenuation[i].loadVec3(new Vector3f(1, 0, 0));
-			}
-		}
-	}
-
-	@Override
-	public void loadLights(List<Light> lights) {
-		throw new NullPointerException("Use loadLights(List<Light> lights, Matrix4f viewMatrix) instead.");
-	}
-
-	protected void connectTextureUnits() {
-		modelTexture.loadTexUnit(0);
-		normalMap.loadTexUnit(1);
-		specularMap.loadTexUnit(2);
-	}
-
-	private Vector3f getEyeSpacePosition(Light light, Matrix4f viewMatrix) {
-		Vector3f position = light.getPosition();
-		Vector4f eyeSpacePos = new Vector4f(position.x, position.y, position.z, 1f);
-		Matrix4f.transform(viewMatrix, eyeSpacePos, eyeSpacePos);
-		return new Vector3f(eyeSpacePos);
-	}
-
-}

+ 0 - 64
src/main/java/eu/tankernn/gameEngine/renderEngine/entities/normalMap/normalMapFShader.glsl

@@ -1,64 +0,0 @@
-#version 400 core
-
-in vec2 pass_textureCoordinates;
-in vec3 toLightVector[4];
-in vec3 toCameraVector;
-in float visibility;
-
-layout (location = 0) out vec4 out_Color;
-layout (location = 1) out vec4 out_BrightColor;
-
-uniform sampler2D modelTexture;
-uniform sampler2D normalMap;
-uniform sampler2D specularMap;
-uniform float usesSpecularMap;
-uniform vec3 lightColor[4];
-uniform vec3 attenuation[4];
-uniform float shineDamper;
-uniform float reflectivity;
-uniform vec3 skyColor;
-
-void main(void){
-	
-	vec4 normalMapValue = 2.0 * texture(normalMap, pass_textureCoordinates) - 1.0;
-	
-	vec3 unitNormal = normalize(normalMapValue.rgb);
-	vec3 unitVectorToCamera = normalize(toCameraVector);
-	
-	vec3 totalDiffuse = vec3(0.0);
-	vec3 totalSpecular = vec3(0.0);
-	
-	for(int i=0;i<4;i++){
-		float distance = length(toLightVector[i]);
-		float attFactor = attenuation[i].x + (attenuation[i].y * distance) + (attenuation[i].z * distance * distance);
-		vec3 unitLightVector = normalize(toLightVector[i]);	
-		float nDotl = dot(unitNormal,unitLightVector);
-		float brightness = max(nDotl,0.0);
-		vec3 lightDirection = -unitLightVector;
-		vec3 reflectedLightDirection = reflect(lightDirection,unitNormal);
-		float specularFactor = dot(reflectedLightDirection , unitVectorToCamera);
-		specularFactor = max(specularFactor,0.0);
-		float dampedFactor = pow(specularFactor,shineDamper);
-		totalDiffuse = totalDiffuse + (brightness * lightColor[i])/attFactor;
-		totalSpecular = totalSpecular + (dampedFactor * reflectivity * lightColor[i])/attFactor;
-	}
-	totalDiffuse = max(totalDiffuse, 0.2);
-	
-	vec4 textureColour = texture(modelTexture,pass_textureCoordinates);
-	if(textureColour.a<0.5){
-		discard;
-	}
-	
-	if (usesSpecularMap > 0.5) {
-		vec4 mapInfo = texture(specularMap, pass_textureCoordinates);
-		totalSpecular *= mapInfo.r;
-		if (mapInfo.g > 0.5) {
-			totalDiffuse = vec3(1.0);
-		}
-	}
-
-	out_Color =  vec4(totalDiffuse,1.0) * textureColour + vec4(totalSpecular,1.0);
-	out_Color = mix(vec4(skyColor,1.0),out_Color, visibility);
-	
-	out_BrightColor = vec4(0.0);
-}

+ 0 - 56
src/main/java/eu/tankernn/gameEngine/renderEngine/entities/normalMap/normalMapVShader.glsl

@@ -1,56 +0,0 @@
-#version 400 core
-
-in vec3 position;
-in vec2 textureCoordinates;
-in vec3 normal;
-in vec3 tangent;
-
-out vec2 pass_textureCoordinates;
-out vec3 toLightVector[4];
-out vec3 toCameraVector;
-out float visibility;
-
-uniform mat4 transformationMatrix;
-uniform mat4 projectionMatrix;
-uniform mat4 viewMatrix;
-uniform vec3 lightPositionEyeSpace[4];
-
-uniform float numberOfRows;
-uniform vec2 offset;
-
-const float density = 0;
-const float gradient = 5.0;
-
-uniform vec4 plane;
-
-void main(void){
-	vec4 worldPosition = transformationMatrix * vec4(position,1.0);
-	gl_ClipDistance[0] = dot(worldPosition, plane);
-	mat4 modelViewMatrix = viewMatrix * transformationMatrix;
-	vec4 positionRelativeToCam = modelViewMatrix * vec4(position,1.0);
-	gl_Position = projectionMatrix * positionRelativeToCam;
-	
-	pass_textureCoordinates = (textureCoordinates/numberOfRows) + offset;
-	
-	vec3 surfaceNormal = (modelViewMatrix * vec4(normal,0.0)).xyz;
-	
-	vec3 norm = normalize(surfaceNormal);
-	vec3 tang = normalize((modelViewMatrix * vec4(tangent, 0.0)).xyz);
-	vec3 bitang = normalize(cross(norm, tang));
-	
-	mat3 toTangentSpace = mat3(
-		tang.x, bitang.x, norm.x,
-		tang.y, bitang.y, norm.y,
-		tang.z, bitang.z, norm.z
-	);
-	
-	for(int i = 0; i < 4; i++) {
-		toLightVector[i] = toTangentSpace * (lightPositionEyeSpace[i] - positionRelativeToCam.xyz);
-	}
-	toCameraVector = toTangentSpace * (-positionRelativeToCam.xyz);
-	
-	float distance = length(positionRelativeToCam.xyz);
-	visibility = exp(-pow((distance*density),gradient));
-	visibility = clamp(visibility,0.0,1.0);
-	
-}

+ 27 - 7
src/main/java/eu/tankernn/gameEngine/renderEngine/entities/vertexShader.glsl

@@ -3,6 +3,7 @@
 in vec3 position;
 in vec2 textureCoords;
 in vec3 normal;
+in vec3 tangent;
 
 out vec2 pass_textureCoords;
 out vec3 surfaceNormal;
@@ -17,6 +18,8 @@ uniform mat4 transformationMatrix;
 uniform mat4 projectionMatrix;
 uniform mat4 viewMatrix;
 uniform vec3 lightPosition[4]; //4 max light sources
+uniform vec3 lightPositionEyeSpace[4]; //4 max light sources
+uniform float usesNormalMap;
 
 uniform float useFakeLighting;
 
@@ -36,7 +39,7 @@ void main(void) {
 	vec4 worldPosition = transformationMatrix * vec4(position, 1.0);
 	shadowCoords = toShadowMapSpace * worldPosition;
 	gl_ClipDistance[0] = dot(worldPosition, plane);
-	
+	mat4 modelViewMatrix = viewMatrix * transformationMatrix;
 	vec4 positionRelativeToCam = viewMatrix * worldPosition;
 	gl_Position = projectionMatrix * positionRelativeToCam;
 	pass_textureCoords = (textureCoords/numberOfRows) + offset;
@@ -46,9 +49,28 @@ void main(void) {
 		actualNormal = vec3(0.0, 1.0, 0.0);
 	}
 	
-	surfaceNormal = (transformationMatrix * vec4(actualNormal, 0.0)).xyz;
-	for (int i = 0; i < 4; i++) {
-		toLightVector[i] = lightPosition[i] - worldPosition.xyz;
+	surfaceNormal = (modelViewMatrix * vec4(actualNormal, 0.0)).xyz;
+
+	if (usesNormalMap > 0.5) {
+		vec3 norm = normalize(surfaceNormal);
+		vec3 tang = normalize((modelViewMatrix * vec4(tangent, 0.0)).xyz);
+		vec3 bitang = normalize(cross(norm, tang));
+		
+		mat3 toTangentSpace = mat3(
+			tang.x, bitang.x, norm.x,
+			tang.y, bitang.y, norm.y,
+			tang.z, bitang.z, norm.z
+		);
+
+		for(int i = 0; i < 4; i++) {
+			toLightVector[i] = toTangentSpace * (lightPositionEyeSpace[i] - positionRelativeToCam.xyz);
+		}
+		toCameraVector = toTangentSpace * (-positionRelativeToCam.xyz);
+	} else {
+		for (int i = 0; i < 4; i++) {
+			toLightVector[i] = lightPosition[i] - worldPosition.xyz;
+		}
+		toCameraVector = (inverse(viewMatrix) * vec4(0.0, 0.0, 0.0, 1.0)).xyz - worldPosition.xyz;
 	}
 	
 	vec3 unitNormal = normalize(normal);
@@ -56,9 +78,7 @@ void main(void) {
 	reflectedVector = reflect(viewVector, unitNormal);
 	refractedVector = refract(viewVector, unitNormal, 1.0/1.33);
 	
-	toCameraVector = (inverse(viewMatrix) * vec4(0.0, 0.0, 0.0, 1.0)).xyz - worldPosition.xyz;
-	
 	float distance = length(positionRelativeToCam.xyz);
 	visibility = exp(-pow((distance * density), gradient));
 	visibility = clamp(visibility, 0.0, 1.0);
-}
+}

+ 3 - 0
src/main/java/eu/tankernn/gameEngine/renderEngine/shaders/ShaderProgram.java

@@ -18,6 +18,7 @@ public class ShaderProgram {
 	private int programID;
 
 	protected UniformVec3[] lightPosition;
+	protected UniformVec3[] lightPositionEyeSpace;
 	protected UniformVec3[] lightColor;
 	protected UniformVec3[] attenuation;
 
@@ -37,9 +38,11 @@ public class ShaderProgram {
 
 	protected void getLightUniformLocations() {
 		lightPosition = new UniformVec3[MAX_LIGHTS];
+		lightPositionEyeSpace = new UniformVec3[MAX_LIGHTS];
 		lightColor = new UniformVec3[MAX_LIGHTS];
 		attenuation = new UniformVec3[MAX_LIGHTS];
 		for (int i = 0; i < MAX_LIGHTS; i++) {
+			lightPositionEyeSpace[i] = new UniformVec3("lightPositionEyeSpace[" + i + "]");
 			lightPosition[i] = new UniformVec3("lightPosition[" + i + "]");
 			lightColor[i] = new UniformVec3("lightColor[" + i + "]");
 			attenuation[i] = new UniformVec3("attenuation[" + i + "]");