Sfoglia il codice sorgente

Refactoring and more extensive game template.

Tankernn 8 anni fa
parent
commit
388bc43afd

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

@@ -26,7 +26,7 @@ import eu.tankernn.gameEngine.loader.textures.Texture;
 import eu.tankernn.gameEngine.particles.ParticleMaster;
 import eu.tankernn.gameEngine.particles.ParticleSystem;
 import eu.tankernn.gameEngine.particles.ParticleTexture;
-import eu.tankernn.gameEngine.postProcessing.PostProcessing;
+import eu.tankernn.gameEngine.postProcessing.PostProcessor;
 import eu.tankernn.gameEngine.renderEngine.DisplayManager;
 import eu.tankernn.gameEngine.renderEngine.Fbo;
 import eu.tankernn.gameEngine.renderEngine.MasterRenderer;
@@ -148,16 +148,16 @@ public class MainLoop {
 		Fbo outputFbo = new Fbo(Display.getWidth(), Display.getHeight(), Fbo.DEPTH_TEXTURE);
 		Fbo outputFbo2 = new Fbo(Display.getWidth(), Display.getHeight(), Fbo.DEPTH_TEXTURE);
 
-		PostProcessing.init(loader);
+		PostProcessor postProcessor = new PostProcessor(loader);
 
-		MousePicker picker = new MousePicker(camera, camera.getProjectionMatrix(), terrainPack, entities, guis);
+		MousePicker picker = new MousePicker(camera, camera.getProjectionMatrix(), entities, guis);
 
 		while (!Display.isCloseRequested()) {
 			barrel.increaseRotation(new Vector3f(0, 1, 0));
 			player.move();
 			terrainPack.update(player);
 			camera.update();
-			picker.update();
+			picker.update(terrainPack);
 
 			if (picker.getCurrentTerrainPoint() != null) {
 				Vector3f currentPoint = picker.getCurrentTerrainPoint();
@@ -216,7 +216,7 @@ public class MainLoop {
 			multisampleFbo.resolveToFbo(GL30.GL_COLOR_ATTACHMENT0, outputFbo);
 			multisampleFbo.resolveToFbo(GL30.GL_COLOR_ATTACHMENT1, outputFbo2);
 			
-			PostProcessing.doPostProcessing(outputFbo.getColourTexture(), outputFbo2.getColourTexture());
+			postProcessor.doPostProcessing(outputFbo.getColourTexture(), outputFbo2.getColourTexture());
 
 			guiRenderer.render(guis);
 			textMaster.render();
@@ -224,7 +224,7 @@ public class MainLoop {
 			DisplayManager.updateDisplay();
 		}
 
-		PostProcessing.cleanUp();
+		postProcessor.cleanUp();
 		outputFbo.cleanUp();
 		outputFbo2.cleanUp();
 		multisampleFbo.cleanUp();

+ 11 - 0
src/main/java/eu/tankernn/gameEngine/TankernnGame.java

@@ -2,24 +2,35 @@ package eu.tankernn.gameEngine;
 
 import eu.tankernn.gameEngine.loader.Loader;
 import eu.tankernn.gameEngine.renderEngine.DisplayManager;
+import eu.tankernn.gameEngine.renderEngine.font.TextMaster;
+import eu.tankernn.gameEngine.renderEngine.gui.GuiMaster;
 
 public class TankernnGame {
 	protected final String name;
 	protected Loader loader;
+	protected GuiMaster guiMaster;
+	protected TextMaster textMaster;
 	
 	public TankernnGame(String name) {
 		this.name = name;
 		this.loader = new Loader();
+		this.guiMaster = new GuiMaster(loader);
+		this.textMaster = new TextMaster(loader);
 	}
 	
 	public void update() {
+		
 	}
 	
 	public void render() {
+		guiMaster.render();
+		textMaster.render();
 		DisplayManager.updateDisplay();
 	}
 	
 	public void cleanUp() {
+		textMaster.cleanUp();
+		guiMaster.cleanUp();
 		loader.cleanUp();
 	}
 	

+ 78 - 3
src/main/java/eu/tankernn/gameEngine/TankernnGame3D.java

@@ -2,23 +2,59 @@ package eu.tankernn.gameEngine;
 
 import java.io.FileNotFoundException;
 import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.lwjgl.opengl.Display;
+import org.lwjgl.opengl.GL30;
+import org.lwjgl.util.vector.Vector4f;
 
 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.environmentMap.EnvironmentMapRenderer;
 import eu.tankernn.gameEngine.loader.Loader;
+import eu.tankernn.gameEngine.particles.ParticleMaster;
+import eu.tankernn.gameEngine.postProcessing.PostProcessor;
+import eu.tankernn.gameEngine.renderEngine.Fbo;
 import eu.tankernn.gameEngine.renderEngine.MasterRenderer;
+import eu.tankernn.gameEngine.renderEngine.MultisampleMultitargetFbo;
+import eu.tankernn.gameEngine.renderEngine.Scene;
 import eu.tankernn.gameEngine.renderEngine.skybox.Skybox;
 import eu.tankernn.gameEngine.renderEngine.water.WaterMaster;
+import eu.tankernn.gameEngine.terrains.TerrainPack;
+import eu.tankernn.gameEngine.util.DistanceSorter;
 import eu.tankernn.gameEngine.util.InternalFile;
+import eu.tankernn.gameEngine.util.MousePicker;
 
 public class TankernnGame3D extends TankernnGame {
 	protected MasterRenderer renderer;
 	protected WaterMaster waterMaster;
+	protected ParticleMaster particleMaster;
+	protected PostProcessor postProcessor;
 	protected Camera camera;
 	protected Skybox sky;
+	protected MousePicker picker;
+
+	protected List<Entity3D> entities;
+	protected List<Light> lights;
+	private Light sun;
+	protected TerrainPack terrainPack;
+	protected Player player;
+	
+	private MultisampleMultitargetFbo multisampleFbo = new MultisampleMultitargetFbo(Display.getWidth(),
+			Display.getHeight());
+	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, Skybox skybox, String dudvMap, String normalMap) {
+	public TankernnGame3D(String name, Skybox skybox, String dudvMap, String normalMap, Light sun) {
 		super(name);
+		entities = new ArrayList<Entity3D>();
+		lights = new ArrayList<Light>();
 		this.sky = skybox;
+		this.sun = sun;
+		lights.add(sun);
 		try {
 			loader = new Loader();
 			loader.readModelSpecification(new InternalFile("models.json"));
@@ -32,15 +68,54 @@ public class TankernnGame3D extends TankernnGame {
 		} 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() {
+		super.update();
+		player.move();
+		picker.update(terrainPack);
 		camera.update();
+		terrainPack.update(player);
+		particleMaster.update(camera);
+		DistanceSorter.sort(lights, camera);
 	}
-	
+
+	public void render() {
+		renderer.renderShadowMap(entities, sun);
+
+		Scene scene = new Scene(entities, terrainPack, lights, camera, sky);
+
+		EnvironmentMapRenderer.renderEnvironmentMap(scene.getEnvironmentMap(), scene, player.getPosition(), renderer);
+
+		waterMaster.renderBuffers(renderer, scene);
+
+		multisampleFbo.bindFrameBuffer();
+
+		renderer.renderScene(scene, new Vector4f(0, 1, 0, Float.MAX_VALUE));
+		waterMaster.renderWater(camera, lights);
+		particleMaster.renderParticles(camera);
+
+		multisampleFbo.unbindFrameBuffer();
+
+		multisampleFbo.resolveToFbo(GL30.GL_COLOR_ATTACHMENT0, outputFbo);
+		multisampleFbo.resolveToFbo(GL30.GL_COLOR_ATTACHMENT1, outputFbo2);
+
+		postProcessor.doPostProcessing(outputFbo.getColourTexture(), outputFbo2.getColourTexture());
+		super.render();
+	}
+
 	public void cleanUp() {
 		super.cleanUp();
+		terrainPack.cleanUp();
+		particleMaster.cleanUp();
+		postProcessor.cleanUp();
 		waterMaster.cleanUp();
+		multisampleFbo.cleanUp();
+		outputFbo.cleanUp();
+		outputFbo2.cleanUp();
 		renderer.cleanUp();
 	}
 }

+ 11 - 11
src/main/java/eu/tankernn/gameEngine/postProcessing/PostProcessing.java → src/main/java/eu/tankernn/gameEngine/postProcessing/PostProcessor.java

@@ -14,16 +14,16 @@ import eu.tankernn.gameEngine.postProcessing.gaussianBlur.HorizontalBlur;
 import eu.tankernn.gameEngine.postProcessing.gaussianBlur.VerticalBlur;
 import eu.tankernn.gameEngine.renderEngine.RawModel;
 
-public class PostProcessing {
+public class PostProcessor {
 
-	private static final int blurFactor = 0;
+	private final int blurFactor = 0;
 
-	private static final float[] POSITIONS = { -1, 1, -1, -1, 1, 1, 1, -1 };
-	private static RawModel quad;
-	private static List<PostProcessingEffect<?>> effects = new ArrayList<PostProcessingEffect<?>>();
-	private static CombineFilter combineFilter;
+	private final float[] POSITIONS = { -1, 1, -1, -1, 1, 1, 1, -1 };
+	private RawModel quad;
+	private List<PostProcessingEffect<?>> effects = new ArrayList<PostProcessingEffect<?>>();
+	private CombineFilter combineFilter;
 	
-	public static void init(Loader loader) {
+	public PostProcessor(Loader loader) {
 		quad = loader.loadToVAO(POSITIONS, 2);
 		effects.add(new ContrastChanger());
 		for (int i = 0; i < blurFactor; i++) {
@@ -35,7 +35,7 @@ public class PostProcessing {
 		combineFilter = new CombineFilter();
 	}
 
-	public static void doPostProcessing(Texture colorTexture, Texture brightTexture) {
+	public void doPostProcessing(Texture colorTexture, Texture brightTexture) {
 		start();
 		for (PostProcessingEffect<?> effect : effects) {
 			effect.render(colorTexture, brightTexture);
@@ -46,17 +46,17 @@ public class PostProcessing {
 		end();
 	}
 
-	public static void cleanUp() {
+	public void cleanUp() {
 		effects.forEach(p -> p.cleanUp());
 		combineFilter.cleanUp();
 	}
 
-	private static void start() {
+	private void start() {
 		quad.bind(0);
 		GL11.glDisable(GL11.GL_DEPTH_TEST);
 	}
 
-	private static void end() {
+	private void end() {
 		GL11.glEnable(GL11.GL_DEPTH_TEST);
 		quad.unbind(0);
 	}

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

@@ -24,6 +24,10 @@ public class GuiMaster {
 	public void removeGui(GuiTexture gui) {
 		guis.remove(gui);
 	}
+	
+	public List<GuiTexture> getGuis() {
+		return guis;
+	}
 
 	public void cleanUp() {
 		renderer.cleanUp();

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

@@ -26,19 +26,18 @@ public class MousePicker {
 	private Matrix4f viewMatrix;
 	private Camera camera;
 	
-	private TerrainPack terrains;
 	private Vector3f currentTerrainPoint;
 	private List<Entity3D> entities;
 	private Entity3D currentEntity;
 	
 	private List<GuiTexture> guis;
 	private GuiTexture currentGui;
+	private TerrainPack terrains;
 	
-	public MousePicker(Camera cam, Matrix4f projection, TerrainPack terrains, List<Entity3D> entities, List<GuiTexture> guis) {
+	public MousePicker(Camera cam, Matrix4f projection, List<Entity3D> entities, List<GuiTexture> guis) {
 		camera = cam;
 		projectionMatrix = projection;
 		viewMatrix = camera.getViewMatrix();
-		this.terrains = terrains;
 		this.entities = entities;
 		this.guis = guis;
 	}
@@ -59,7 +58,8 @@ public class MousePicker {
 		return currentGui;
 	}
 	
-	public void update() {
+	public void update(TerrainPack terrains) {
+		this.terrains = terrains;
 		viewMatrix = camera.getViewMatrix();
 		currentRay = calculateMouseRay();
 		currentGui = calculateGuiTexture();