Browse Source

Lens flares added

Tankernn 7 years ago
parent
commit
877f8a0ccc

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

@@ -13,7 +13,7 @@ public class GameLauncher {
 
 		while (!Display.isCloseRequested()) {
 			instance.update();
-			instance.render();
+			instance.fullRender();
 		}
 
 		instance.cleanUp();

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

@@ -25,12 +25,16 @@ public class TankernnGame {
 		
 	}
 	
-	public void render() {
+	protected void render() {
 		guiMaster.render();
 		textMaster.render();
 		DisplayManager.updateDisplay();
 	}
 	
+	public void fullRender() {
+		this.render();
+	}
+	
 	public void cleanUp() {
 		textMaster.finalize();
 		guiMaster.finalize();

+ 15 - 7
src/main/java/eu/tankernn/gameEngine/TankernnGame3D.java

@@ -11,7 +11,6 @@ import org.lwjgl.util.vector.Vector4f;
 import eu.tankernn.gameEngine.entities.Camera;
 import eu.tankernn.gameEngine.entities.Entity3D;
 import eu.tankernn.gameEngine.entities.ILight;
-import eu.tankernn.gameEngine.entities.Light;
 import eu.tankernn.gameEngine.entities.Player;
 import eu.tankernn.gameEngine.entities.projectiles.Projectile;
 import eu.tankernn.gameEngine.environmentMap.EnvironmentMapRenderer;
@@ -45,7 +44,6 @@ public class TankernnGame3D extends TankernnGame {
 	protected List<Projectile> projectiles = new ArrayList<>();
 	protected List<ILight> lights = new ArrayList<>();
 	protected List<FloatingTexture> floatTextures = new ArrayList<>();
-	protected Light sun;
 	protected TerrainPack terrainPack;
 	protected Player player;
 	
@@ -83,10 +81,12 @@ public class TankernnGame3D extends TankernnGame {
 		
 		audioMaster.setListenerPosition(player.getPosition());
 	}
-
-	public void render() {
-		renderer.renderShadowMap(entities, sun);
-
+	
+	protected void preRender() {
+		
+	}
+	
+	protected void render() {
 		Scene scene = new Scene(entities, terrainPack, lights, camera, sky);
 
 		EnvironmentMapRenderer.renderEnvironmentMap(scene.getEnvironmentMap(), scene, player.getPosition(), renderer);
@@ -99,7 +99,9 @@ public class TankernnGame3D extends TankernnGame {
 		waterMaster.renderWater(camera, lights);
 		particleMaster.renderParticles(camera);
 		floatingRenderer.render(floatTextures, camera);
-
+	}
+	
+	protected void postRender() {
 		multisampleFbo.unbindFrameBuffer();
 
 		multisampleFbo.resolveToFbo(GL30.GL_COLOR_ATTACHMENT0, outputFbo);
@@ -108,6 +110,12 @@ public class TankernnGame3D extends TankernnGame {
 		postProcessor.doPostProcessing(outputFbo.getColourTexture(), outputFbo2.getColourTexture());
 		super.render();
 	}
+	
+	public void fullRender() {
+		this.preRender();
+		this.render();
+		this.postRender();
+	}
 
 	public void cleanUp() {
 		super.cleanUp();

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

@@ -17,7 +17,6 @@ import org.lwjgl.util.vector.Vector4f;
 import eu.tankernn.gameEngine.entities.Camera;
 import eu.tankernn.gameEngine.entities.Entity3D;
 import eu.tankernn.gameEngine.entities.ILight;
-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;
@@ -156,7 +155,7 @@ public class MasterRenderer {
 		terrains.add(terrain);
 	}
 
-	public void renderShadowMap(List<Entity3D> entityList, Light sun) {
+	public void renderShadowMap(List<Entity3D> entityList, ILight sun) {
 		for (Entity3D e : entityList) {
 			processEntity(e);
 		}

+ 4 - 0
src/main/java/eu/tankernn/gameEngine/renderEngine/gui/GuiMaster.java

@@ -32,4 +32,8 @@ public class GuiMaster {
 	public void finalize() {
 		renderer.finalize();
 	}
+
+	public GuiRenderer getRenderer() {
+		return renderer;
+	}
 }

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

@@ -27,11 +27,12 @@ public class GuiRenderer {
 		GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
 		GL11.glDisable(GL11.GL_DEPTH_TEST);
 		for (GuiTexture gui : guis) {
-			if (gui.isAdditive()) {
+			if (gui.getOpacity() < 1) {
 				GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE);
 			} else {
 				GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
 			}
+			shader.opacity.loadFloat(gui.getOpacity());
 			gui.getTexture().bindToUnit(0);
 			Matrix4f matrix = Maths.createTransformationMatrix(gui.getPosition(), gui.getSize());
 			shader.transformationMatrix.loadMatrix(matrix);

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

@@ -1,6 +1,7 @@
 package eu.tankernn.gameEngine.renderEngine.gui;
 
 import eu.tankernn.gameEngine.renderEngine.shaders.ShaderProgram;
+import eu.tankernn.gameEngine.renderEngine.shaders.UniformFloat;
 import eu.tankernn.gameEngine.renderEngine.shaders.UniformMatrix;
 
 public class GuiShader extends ShaderProgram {
@@ -8,10 +9,11 @@ public class GuiShader extends ShaderProgram {
 	private static final String FRAGMENT_FILE = "/eu/tankernn/gameEngine/renderEngine/gui/guiFragmentShader.glsl";
 	
 	protected UniformMatrix transformationMatrix = new UniformMatrix("transformationMatrix");
+	protected UniformFloat opacity = new UniformFloat("opacity");
 	
 	public GuiShader() {
 		super(VERTEX_FILE, FRAGMENT_FILE, "position");
-		super.storeAllUniformLocations(transformationMatrix);
+		super.storeAllUniformLocations(transformationMatrix, opacity);
 	}
 	
 }

+ 9 - 5
src/main/java/eu/tankernn/gameEngine/renderEngine/gui/GuiTexture.java

@@ -9,13 +9,17 @@ public class GuiTexture {
 	private Texture texture;
 	protected Vector2f position;
 	protected float scale;
-	private boolean additive;
+	private float opacity;
 	
 	public GuiTexture(Texture texture, Vector2f position, float scale) {
 		this.texture = texture;
 		this.position = position;
 		this.scale = scale;
 	}
+	
+	public GuiTexture(Texture texture, float scale) {
+		this(texture, new Vector2f(0, 0), scale);
+	}
 
 	public Texture getTexture() {
 		return texture;
@@ -37,12 +41,12 @@ public class GuiTexture {
 		this.scale = scale;
 	}
 
-	public boolean isAdditive() {
-		return additive;
+	public float getOpacity() {
+		return opacity;
 	}
 
-	public void setAdditive(boolean additive) {
-		this.additive = additive;
+	public void setOpacity(float opacity) {
+		this.opacity = opacity;
 	}
 	
 }

+ 3 - 2
src/main/java/eu/tankernn/gameEngine/renderEngine/gui/guiFragmentShader.glsl

@@ -5,9 +5,10 @@ in vec2 textureCoords;
 out vec4 out_Color;
 
 uniform sampler2D guiTexture;
+uniform float opacity;
 
 void main(void){
 
 	out_Color = texture(guiTexture,textureCoords);
-
-}
+	out_Color.a *= opacity;
+}

+ 69 - 0
src/main/java/eu/tankernn/gameEngine/renderEngine/lensFlare/FlareManager.java

@@ -0,0 +1,69 @@
+package eu.tankernn.gameEngine.renderEngine.lensFlare;
+
+import java.util.Arrays;
+
+import org.lwjgl.util.vector.Matrix4f;
+import org.lwjgl.util.vector.Vector2f;
+import org.lwjgl.util.vector.Vector3f;
+import org.lwjgl.util.vector.Vector4f;
+
+import eu.tankernn.gameEngine.renderEngine.gui.GuiRenderer;
+import eu.tankernn.gameEngine.renderEngine.gui.GuiTexture;
+import eu.tankernn.gameEngine.util.ICamera;
+
+public class FlareManager {
+
+	private static final Vector2f CENTER_SCREEN = new Vector2f(0f, 0f);// center
+																		// changed
+
+	private final GuiTexture[] flareTextures;
+	private final float spacing;
+
+	private final GuiRenderer renderer;
+
+	public FlareManager(GuiRenderer renderer, float spacing, GuiTexture... textures) {
+		this.spacing = spacing;
+		this.flareTextures = textures;
+		this.renderer = renderer;
+	}
+
+	public void render(ICamera camera, Vector3f sunWorldPos) {
+		Vector2f sunCoords = convertToScreenSpace(sunWorldPos, camera.getViewMatrix(), camera.getProjectionMatrix());
+		if (sunCoords == null) {
+			return;
+		}
+		Vector2f sunToCenter = Vector2f.sub(CENTER_SCREEN, sunCoords, null);
+		float brightness = 1 - (sunToCenter.length() / 1.4f);// number doubled
+		if (brightness > 0) {
+			calcFlarePositions(sunToCenter, sunCoords);
+			for (GuiTexture t : flareTextures)
+				t.setOpacity(brightness);
+			renderer.render(Arrays.asList(flareTextures));
+		}
+	}
+
+	private void calcFlarePositions(Vector2f sunToCenter, Vector2f sunCoords) {
+		for (int i = 0; i < flareTextures.length; i++) {
+			Vector2f direction = new Vector2f(sunToCenter);
+			direction.scale(i * spacing);
+			Vector2f flarePos = Vector2f.add(sunCoords, direction, null);
+			flareTextures[i].setPosition(flarePos);
+		}
+	}
+
+	private Vector2f convertToScreenSpace(Vector3f worldPos, Matrix4f viewMat, Matrix4f projectionMat) {
+		Vector4f coords = new Vector4f(worldPos.x, worldPos.y, worldPos.z, 1f);
+		Matrix4f.transform(viewMat, coords, coords);
+		Matrix4f.transform(projectionMat, coords, coords);
+		if (coords.w <= 0) {
+			return null;
+		}
+		// no need for conversion below
+		return new Vector2f(coords.x / coords.w, coords.y / coords.w);
+	}
+
+	public void finalize() {
+		renderer.finalize();
+	}
+
+}

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

@@ -10,7 +10,7 @@ import org.lwjgl.util.vector.Vector3f;
 
 import eu.tankernn.gameEngine.entities.Camera;
 import eu.tankernn.gameEngine.entities.Entity3D;
-import eu.tankernn.gameEngine.entities.Light;
+import eu.tankernn.gameEngine.entities.ILight;
 import eu.tankernn.gameEngine.loader.models.TexturedModel;
 import eu.tankernn.gameEngine.loader.textures.Texture;
 
@@ -70,7 +70,7 @@ public class ShadowMapMasterRenderer {
 	 * @param sun
 	 *            - the light acting as the sun in the scene.
 	 */
-	public void render(Map<TexturedModel, List<Entity3D>> entities, Light sun) {
+	public void render(Map<TexturedModel, List<Entity3D>> entities, ILight sun) {
 		shadowBox.update();
 		Vector3f sunPosition = sun.getPosition();
 		Vector3f lightDirection = new Vector3f(-sunPosition.x, -sunPosition.y, -sunPosition.z);