Browse Source

Fixed practically all issues regarding rendering and mouse picking

Tankernn 8 years ago
parent
commit
013e5648d3

+ 4 - 17
src/main/java/eu/tankernn/gameEngine/TankernnGame3D.java

@@ -13,8 +13,8 @@ import eu.tankernn.gameEngine.entities.Camera;
 import eu.tankernn.gameEngine.entities.Entity3D;
 import eu.tankernn.gameEngine.entities.Light;
 import eu.tankernn.gameEngine.entities.Player;
+import eu.tankernn.gameEngine.entities.PlayerCamera;
 import eu.tankernn.gameEngine.environmentMap.EnvironmentMapRenderer;
-import eu.tankernn.gameEngine.loader.Loader;
 import eu.tankernn.gameEngine.loader.textures.Texture;
 import eu.tankernn.gameEngine.particles.ParticleMaster;
 import eu.tankernn.gameEngine.postProcessing.PostProcessor;
@@ -38,8 +38,8 @@ public class TankernnGame3D extends TankernnGame {
 	protected Skybox sky;
 	protected MousePicker picker;
 
-	protected List<Entity3D> entities;
-	protected List<Light> lights;
+	protected List<Entity3D> entities = new ArrayList<>();
+	protected List<Light> lights= new ArrayList<>();
 	private Light sun;
 	protected TerrainPack terrainPack;
 	protected Player player;
@@ -49,30 +49,17 @@ public class TankernnGame3D extends TankernnGame {
 	private Fbo outputFbo = new Fbo(Display.getWidth(), Display.getHeight(), Fbo.DEPTH_TEXTURE),
 			outputFbo2 = new Fbo(Display.getWidth(), Display.getHeight(), Fbo.DEPTH_TEXTURE);
 	
-	public TankernnGame3D(String name, String[] dayTextures, String[] nightTextures, String dudvMap, String normalMap, Light sun) {
+	public TankernnGame3D(String name, String[] dayTextures, String[] nightTextures, Light sun) {
 		super(name);
-		entities = new ArrayList<Entity3D>();
-		lights = new ArrayList<Light>();
 		this.sun = sun;
 		lights.add(sun);
 		try {
-			loader = new Loader();
 			loader.readModelSpecification(new InternalFile("models.json"));
 		} catch (IOException e) {
 			e.printStackTrace();
 		}
 		this.sky = new Skybox(loader, Texture.newCubeMap(InternalFile.fromFilenames("skybox", dayTextures, "png"), 400),
 				Texture.newCubeMap(InternalFile.fromFilenames("skybox", nightTextures, "png"), 400), 400);
-		camera = new Camera();
-		renderer = new MasterRenderer(loader, camera, sky);
-		try {
-			waterMaster = new WaterMaster(loader, loader.loadTexture(dudvMap), loader.loadTexture(normalMap), camera);
-		} catch (FileNotFoundException e) {
-			e.printStackTrace();
-		}
-		particleMaster = new ParticleMaster(loader, camera.getProjectionMatrix());
-		postProcessor = new PostProcessor(loader);
-		picker = new MousePicker(camera, camera.getProjectionMatrix(), entities, guiMaster.getGuis());
 	}
 
 	public void update() {

+ 10 - 15
src/main/java/eu/tankernn/gameEngine/entities/Camera.java

@@ -10,7 +10,6 @@ import org.lwjgl.util.vector.Vector3f;
 
 import eu.tankernn.gameEngine.util.ICamera;
 import eu.tankernn.gameEngine.util.IPositionable;
-import eu.tankernn.gameEngine.util.Maths;
 
 /**
  * Camera for determining the view frustum when rendering.
@@ -20,7 +19,6 @@ import eu.tankernn.gameEngine.util.Maths;
 public class Camera implements IPositionable, ICamera {
 	
 	private Matrix4f projectionMatrix;
-	private Matrix4f viewMatrix = new Matrix4f();
 	
 	protected Vector3f position = new Vector3f(0, 10, 0);
 	protected float pitch = 20;
@@ -54,7 +52,6 @@ public class Camera implements IPositionable, ICamera {
 	}
 	
 	public void update() {
-		updateViewMatrix();
 	}
 	
 	public Vector3f getPosition() {
@@ -87,15 +84,6 @@ public class Camera implements IPositionable, ICamera {
 		this.roll = -roll;
 	}
 	
-	private void updateViewMatrix() {
-		viewMatrix.setIdentity();
-		Matrix4f.rotate((float) Math.toRadians(pitch), new Vector3f(1, 0, 0), viewMatrix,
-				viewMatrix);
-		Matrix4f.rotate((float) Math.toRadians(yaw), new Vector3f(0, 1, 0), viewMatrix, viewMatrix);
-		Vector3f negativeCameraPos = new Vector3f(-position.x,-position.y,-position.z);
-		Matrix4f.translate(negativeCameraPos, viewMatrix, viewMatrix);
-	}
-	
 	private static Matrix4f createProjectionMatrix(){
 		Matrix4f projectionMatrix = new Matrix4f();
 		float aspectRatio = (float) Display.getWidth() / (float) Display.getHeight();
@@ -114,14 +102,21 @@ public class Camera implements IPositionable, ICamera {
 
 	@Override
 	public Matrix4f getViewMatrix() {
-		return Maths.createViewMatrix(this);
+		Matrix4f viewMatrix = new Matrix4f();
+		viewMatrix.setIdentity();
+		Matrix4f.rotate((float) Math.toRadians(getPitch()), new Vector3f(1, 0, 0), viewMatrix, viewMatrix);
+		Matrix4f.rotate((float) Math.toRadians(getYaw()), new Vector3f(0, 1, 0), viewMatrix, viewMatrix);
+		Matrix4f.rotate((float) Math.toRadians(getRoll()), new Vector3f(0, 0, 1), viewMatrix, viewMatrix);
+		Vector3f cameraPos = getPosition();
+		Vector3f negativeCameraPos = new Vector3f(-cameraPos.x, -cameraPos.y, -cameraPos.z);
+		Matrix4f.translate(negativeCameraPos, viewMatrix, viewMatrix);
+		return viewMatrix;
 	}
 	
 	@Override
 	public void reflect(float height){
 		this.pitch = -pitch;
 		this.position.y = position.y - 2 * (position.y - height);
-		updateViewMatrix();
 	}
 
 	@Override
@@ -131,7 +126,7 @@ public class Camera implements IPositionable, ICamera {
 
 	@Override
 	public Matrix4f getProjectionViewMatrix() {
-		return Matrix4f.mul(projectionMatrix, viewMatrix, null);
+		return Matrix4f.mul(projectionMatrix, getViewMatrix(), null);
 	}
 	
 }

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

@@ -71,8 +71,6 @@ public class EntityRenderer<S extends EntityShader> {
 		shader.toShadowMapSpace.loadMatrix(toShadowSpace);
 		shader.cameraPosition.loadVec3(cam.getPosition());
 		for (TexturedModel model: entities.keySet()) {
-			if (model instanceof AnimatedModel)
-				shader.jointTransforms.loadMatrixArray(((AnimatedModel) model).getJointTransforms());
 			prepareTexturedModel(model, environmentMap);
 			List<Entity3D> batch = entities.get(model);
 			for (Entity3D entity: batch) {
@@ -90,10 +88,14 @@ public class EntityRenderer<S extends EntityShader> {
 	}
 	
 	private void prepareTexturedModel(TexturedModel model, Texture environmentMap) {
-		if (model instanceof AnimatedModel)
+		if (model instanceof AnimatedModel) {
 			model.getModel().bind(0, 1, 2, 4, 5);
-		else
+			shader.animated.loadBoolean(true);
+			shader.jointTransforms.loadMatrixArray(((AnimatedModel) model).getJointTransforms());
+		} else {
 			model.getModel().bind(0, 1, 2, 3);
+			shader.animated.loadBoolean(false);
+		}
 		ModelTexture texture = model.getTexture();
 		shader.numberOfRows.loadFloat(texture.getNumberOfRows());
 		if (texture.hasTransparency())

+ 3 - 1
src/main/java/eu/tankernn/gameEngine/renderEngine/entities/EntityShader.java

@@ -45,13 +45,15 @@ public class EntityShader extends ShaderProgram {
 	protected UniformSampler normalMap = new UniformSampler("normalMap");
 	public UniformBoolean usesNormalMap = new UniformBoolean("usesNormalMap");
 	protected UniformMat4Array jointTransforms = new UniformMat4Array("jointTransforms", MAX_JOINTS);
+	protected UniformBoolean animated = new UniformBoolean("isAnimated");
 
 	public EntityShader() {
 		super(VERTEX_FILE, FRAGMENT_FILE, "position", "textureCoords", "normal", "tangent", "in_jointIndices", "in_weights");
 		super.getLightUniformLocations();
 		super.storeAllUniformLocations(transformationMatrix, projectionMatrix, viewMatrix, shineDamper, reflectivity,
 				refractivity, useFakeLighting, skyColor, numberOfRows, offset, plane, toShadowMapSpace, shadowMap,
-				specularMap, usesSpecularMap, modelTexture, cameraPosition, enviroMap, normalMap, usesNormalMap, jointTransforms);
+				specularMap, usesSpecularMap, modelTexture, cameraPosition, enviroMap, normalMap, usesNormalMap,
+				jointTransforms, animated);
 	}
 
 	public EntityShader(String vertexFile, String fragmentFile, String... string) {

+ 15 - 8
src/main/java/eu/tankernn/gameEngine/renderEngine/entities/vertexShader.glsl

@@ -41,19 +41,26 @@ const float gradient = 2.0;
 uniform vec4 plane;
 
 uniform mat4 jointTransforms[MAX_JOINTS];
+uniform float isAnimated;
 
 void main(void) {
 	
-	vec4 totalLocalPos = vec4(0.0);
-	vec4 totalNormal = vec4(0.0);
+	vec4 totalLocalPos = vec4(position, 1.0);
+	vec4 totalNormal = vec4(normal, 0.0);
 	
-	for(int i=0;i<MAX_WEIGHTS;i++){
-		mat4 jointTransform = jointTransforms[in_jointIndices[i]];
-		vec4 posePosition = jointTransform * vec4(position, 1.0);
-		totalLocalPos += posePosition * in_weights[i];
+	
+	if (isAnimated > 0.5) {
+		totalLocalPos = vec4(0.0);
+		totalNormal = vec4(0.0);
 		
-		vec4 worldNormal = jointTransform * vec4(normal, 0.0);
-		totalNormal += worldNormal * in_weights[i];
+		for(int i=0;i<MAX_WEIGHTS;i++){
+			mat4 jointTransform = jointTransforms[in_jointIndices[i]];
+			vec4 posePosition = jointTransform * vec4(position, 1.0);
+			totalLocalPos += posePosition * in_weights[i];
+			
+			vec4 worldNormal = jointTransform * vec4(normal, 0.0);
+			totalNormal += worldNormal * in_weights[i];
+		}
 	}
 	
 	vec4 worldPosition = transformationMatrix * totalLocalPos;

+ 1 - 1
src/main/java/eu/tankernn/gameEngine/renderEngine/shadows/ShadowMapMasterRenderer.java

@@ -25,7 +25,7 @@ import eu.tankernn.gameEngine.loader.textures.Texture;
  */
 public class ShadowMapMasterRenderer {
 
-	public static final int SHADOW_MAP_SIZE = 1024 * 2;
+	public static final int SHADOW_MAP_SIZE = 1024 * 4;
 
 	private ShadowFrameBuffer shadowFbo;
 	private ShadowShader shader;

+ 2 - 2
src/main/java/eu/tankernn/gameEngine/settings/Settings.java

@@ -4,7 +4,7 @@ public class Settings {
 	//Display settings
 	public static final float FOV = 70;
 	public static final float NEAR_PLANE = 0.1f;
-	public static final float FAR_PLANE = 500;
+	public static final float FAR_PLANE = 1000;
 	
 	//Sky color
 	public static final float RED = 0.7f;
@@ -14,5 +14,5 @@ public class Settings {
 	public static final float TERRAIN_SIZE = 800;
 	
 	public static final float ANISOTROPIC_FILTERING_AMOUNT = 4f;
-	public static final int MULTISAMPLING = 0;
+	public static final int MULTISAMPLING = 2;
 }

+ 2 - 7
src/main/java/eu/tankernn/gameEngine/util/DistanceSorter.java

@@ -1,17 +1,12 @@
 package eu.tankernn.gameEngine.util;
 
 import java.util.Collections;
-import java.util.Comparator;
 import java.util.List;
 
 public class DistanceSorter {
 	public static <T extends IPositionable> void sort(List<T> list, IPositionable centerPoint) {
-		Collections.sort(list, new Comparator<T>() {
-			@Override
-			public int compare(T t1, T t2) {
-				return Float.compare(Maths.distanceBetweenPoints(t1.getPosition(), centerPoint.getPosition()),
-						Maths.distanceBetweenPoints(t2.getPosition(), centerPoint.getPosition()));
-			}
+		Collections.sort(list, (t1, t2) -> {
+			return Float.compare(Maths.distanceBetweenPoints(t1.getPosition(), centerPoint.getPosition()), Maths.distanceBetweenPoints(t2.getPosition(), centerPoint.getPosition()));
 		});
 	}
 }

+ 0 - 12
src/main/java/eu/tankernn/gameEngine/util/Maths.java

@@ -77,16 +77,4 @@ public class Maths {
 		Matrix4f.scale(new Vector3f(scale, scale, scale), matrix, matrix);
 		return matrix;
 	}
-	
-	public static Matrix4f createViewMatrix(Camera camera) {
-		Matrix4f viewMatrix = new Matrix4f();
-		viewMatrix.setIdentity();
-		Matrix4f.rotate((float) Math.toRadians(camera.getPitch()), new Vector3f(1, 0, 0), viewMatrix, viewMatrix);
-		Matrix4f.rotate((float) Math.toRadians(camera.getYaw()), new Vector3f(0, 1, 0), viewMatrix, viewMatrix);
-		Matrix4f.rotate((float) Math.toRadians(camera.getRoll()), new Vector3f(0, 0, 1), viewMatrix, viewMatrix);
-		Vector3f cameraPos = camera.getPosition();
-		Vector3f negativeCameraPos = new Vector3f(-cameraPos.x, -cameraPos.y, -cameraPos.z);
-		Matrix4f.translate(negativeCameraPos, viewMatrix, viewMatrix);
-		return viewMatrix;
-	}
 }

+ 0 - 1
src/main/java/eu/tankernn/gameEngine/util/MousePicker.java

@@ -37,7 +37,6 @@ public class MousePicker {
 	public MousePicker(Camera cam, Matrix4f projection, List<Entity3D> entities, List<GuiTexture> guis) {
 		camera = cam;
 		projectionMatrix = projection;
-		viewMatrix = camera.getViewMatrix();
 		this.entities = entities;
 		this.guis = guis;
 	}