Browse Source

Added ILight interface and made Sun implement it

Tankernn 7 years ago
parent
commit
047760fcab

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

@@ -10,6 +10,7 @@ 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;
@@ -42,7 +43,7 @@ public class TankernnGame3D extends TankernnGame {
 
 	protected List<Entity3D> entities = new ArrayList<>();
 	protected List<Projectile> projectiles = new ArrayList<>();
-	protected List<Light> lights = new ArrayList<>();
+	protected List<ILight> lights = new ArrayList<>();
 	protected List<FloatingTexture> floatTextures = new ArrayList<>();
 	protected Light sun;
 	protected TerrainPack terrainPack;
@@ -53,10 +54,8 @@ 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, Light sun) {
+	public TankernnGame3D(String name, String[] dayTextures, String[] nightTextures) {
 		super(name);
-		this.sun = sun;
-		lights.add(sun);
 		try {
 			loader.readModelSpecification(new InternalFile("models.json"));
 		} catch (IOException e) {

+ 10 - 0
src/main/java/eu/tankernn/gameEngine/entities/ILight.java

@@ -0,0 +1,10 @@
+package eu.tankernn.gameEngine.entities;
+
+import org.lwjgl.util.vector.Vector3f;
+
+import eu.tankernn.gameEngine.util.IPositionable;
+
+public interface ILight extends IPositionable {
+	Vector3f getColor();
+	Vector3f getAttenuation();
+}

+ 1 - 1
src/main/java/eu/tankernn/gameEngine/entities/Light.java

@@ -4,7 +4,7 @@ import org.lwjgl.util.vector.Vector3f;
 
 import eu.tankernn.gameEngine.util.IPositionable;
 
-public class Light implements IPositionable {
+public class Light implements ILight, IPositionable {
 	private Vector3f position;
 	private Vector3f color;
 	private Vector3f attenuation = new Vector3f(1, 0, 0);

+ 19 - 6
src/main/java/eu/tankernn/gameEngine/particles/Sun.java

@@ -4,8 +4,9 @@ import org.lwjgl.util.vector.Vector2f;
 import org.lwjgl.util.vector.Vector3f;
 
 import eu.tankernn.gameEngine.entities.Camera;
+import eu.tankernn.gameEngine.entities.ILight;
 
-public class Sun implements IParticle {
+public class Sun implements IParticle, ILight {
 
 	private static final float SUN_DIS = 50;// fairly arbitrary - but make sure
 											// it doesn't go behind skybox
@@ -13,12 +14,13 @@ public class Sun implements IParticle {
 	private final ParticleTexture texture;
 
 	private Vector3f lightDirection = new Vector3f(0, -1, 0);
-	private Vector3f position;
+	private Vector3f position, color;
 	private float scale;
 
-	public Sun(ParticleTexture texture, float scale) {
+	public Sun(ParticleTexture texture, float scale, Vector3f color) {
 		this.texture = texture;
 		this.scale = scale;
+		this.color = color;
 	}
 
 	public void setScale(float scale) {
@@ -41,7 +43,7 @@ public class Sun implements IParticle {
 	public float getScale() {
 		return scale;
 	}
-	
+
 	public Vector3f getPosition() {
 		return position;
 	}
@@ -51,10 +53,11 @@ public class Sun implements IParticle {
 	 * distance of the sun from the camera is fairly arbitrary, although care
 	 * should be taken to ensure it doesn't get rendered outside the skybox.
 	 * 
-	 * @param camPos - The camera's position.
+	 * @param camPos
+	 *            - The camera's position.
 	 * @return The 3D world position of the sun.
 	 */
-	public Vector3f calculateWorldPosition(Vector3f camPos) {
+	private Vector3f calculateWorldPosition(Vector3f camPos) {
 		Vector3f sunPos = new Vector3f(lightDirection);
 		sunPos.negate();
 		sunPos.scale(SUN_DIS);
@@ -87,4 +90,14 @@ public class Sun implements IParticle {
 		return true;
 	}
 
+	@Override
+	public Vector3f getColor() {
+		return color;
+	}
+
+	@Override
+	public Vector3f getAttenuation() {
+		return new Vector3f(1, 0, 0);
+	}
+
 }

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

@@ -16,6 +16,7 @@ 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;
@@ -107,7 +108,7 @@ public class MasterRenderer {
 	 * @param clipPlane
 	 *            The clip plane.
 	 */
-	public void render(List<Light> lights, ICamera camera, Vector4f clipPlane, Texture environmentMap) {
+	public void render(List<ILight> lights, ICamera camera, Vector4f clipPlane, Texture environmentMap) {
 		prepareBuffer();
 		entityRenderer.render(entities, shadowMapRenderer.getToShadowMapSpaceMatrix(), camera, clipPlane, lights, environmentMap);
 		terrainRenderer.render(terrains, shadowMapRenderer.getToShadowMapSpaceMatrix(), camera, clipPlane, lights);

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

@@ -4,7 +4,7 @@ import java.util.List;
 
 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.textures.Texture;
 import eu.tankernn.gameEngine.renderEngine.skybox.Skybox;
 import eu.tankernn.gameEngine.terrains.TerrainPack;
@@ -12,13 +12,13 @@ import eu.tankernn.gameEngine.terrains.TerrainPack;
 public class Scene {
 	private List<Entity3D> entities;
 	private TerrainPack terrainPack;
-	private List<Light> lights;
+	private List<ILight> lights;
 	private Camera camera;
 	private Skybox sky;
 	
 	private Texture environmentMap;
 	
-	public Scene(List<Entity3D> entities, TerrainPack terrainPack, List<Light> lights, Camera camera, Skybox sky) {
+	public Scene(List<Entity3D> entities, TerrainPack terrainPack, List<ILight> lights, Camera camera, Skybox sky) {
 		this.entities = entities;
 		this.terrainPack = terrainPack;
 		this.lights = lights;
@@ -35,7 +35,7 @@ public class Scene {
 		return terrainPack;
 	}
 
-	public List<Light> getLights() {
+	public List<ILight> getLights() {
 		return lights;
 	}
 

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

@@ -13,7 +13,7 @@ import org.lwjgl.util.vector.Vector4f;
 
 import eu.tankernn.gameEngine.animation.model.AnimatedModel;
 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.ModelTexture;
 import eu.tankernn.gameEngine.loader.textures.Texture;
@@ -57,7 +57,7 @@ public class EntityRenderer<S extends EntityShader> {
 	 * @param toShadowSpace Transformation matrix to shadow space. Used for
 	 *        applying shadows.
 	 */
-	public void render(Map<TexturedModel, List<Entity3D>> entities, Matrix4f toShadowSpace, ICamera cam, Vector4f clipPlane, List<Light> lights, Texture environmentMap) {
+	public void render(Map<TexturedModel, List<Entity3D>> entities, Matrix4f toShadowSpace, ICamera cam, Vector4f clipPlane, List<ILight> lights, Texture environmentMap) {
 		OpenGlUtils.antialias(true);
 		OpenGlUtils.disableBlending();
 		OpenGlUtils.enableDepthTesting(true);

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

@@ -6,7 +6,7 @@ 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.entities.ILight;
 import eu.tankernn.gameEngine.renderEngine.shaders.ShaderProgram;
 import eu.tankernn.gameEngine.renderEngine.shaders.UniformBoolean;
 import eu.tankernn.gameEngine.renderEngine.shaders.UniformFloat;
@@ -60,7 +60,7 @@ public class EntityShader extends ShaderProgram {
 		super(vertexFile, fragmentFile, string);
 	}
 
-	public void loadLights(List<Light> lights, Matrix4f viewMatrix) {
+	public void loadLights(List<ILight> lights, Matrix4f viewMatrix) {
 		super.loadLights(lights);
 		for (int i = 0; i < MAX_LIGHTS; i++) {
 			if (i < lights.size()) {
@@ -79,7 +79,7 @@ public class EntityShader extends ShaderProgram {
 		enviroMap.loadTexUnit(10);
 	}
 
-	private Vector3f getEyeSpacePosition(Light light, Matrix4f viewMatrix) {
+	private Vector3f getEyeSpacePosition(ILight light, Matrix4f viewMatrix) {
 		Vector3f position = light.getPosition();
 		Vector4f eyeSpacePos = new Vector4f(position.x, position.y, position.z, 1f);
 		Matrix4f.transform(viewMatrix, eyeSpacePos, eyeSpacePos);

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

@@ -9,7 +9,7 @@ import org.lwjgl.opengl.GL11;
 import org.lwjgl.opengl.GL20;
 import org.lwjgl.util.vector.Vector3f;
 
-import eu.tankernn.gameEngine.entities.Light;
+import eu.tankernn.gameEngine.entities.ILight;
 import eu.tankernn.gameEngine.util.InternalFile;
 
 public class ShaderProgram {
@@ -56,7 +56,7 @@ public class ShaderProgram {
 		}
 	}
 
-	public void loadLights(List<Light> lights) {
+	public void loadLights(List<ILight> lights) {
 		for (int i = 0; i < MAX_LIGHTS; i++) {
 			if (i < lights.size()) {
 				lightPosition[i].loadVec3(lights.get(i).getPosition());

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

@@ -11,7 +11,7 @@ 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.entities.ILight;
 import eu.tankernn.gameEngine.loader.textures.TerrainTexturePack;
 import eu.tankernn.gameEngine.renderEngine.shadows.ShadowBox;
 import eu.tankernn.gameEngine.renderEngine.shadows.ShadowMapMasterRenderer;
@@ -31,7 +31,7 @@ public class TerrainRenderer {
 	}
 
 	public void render(List<Terrain> terrains, Matrix4f toShadowSpace, ICamera camera, Vector4f clipPlane,
-			List<Light> lights) {
+			List<ILight> lights) {
 		shader.start();
 		shader.plane.loadVec4(clipPlane);
 		shader.skyColor.loadVec3(RED, GREEN, BLUE);

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

@@ -9,7 +9,7 @@ import org.lwjgl.util.vector.Vector3f;
 import org.lwjgl.util.vector.Vector4f;
 
 import eu.tankernn.gameEngine.entities.Camera;
-import eu.tankernn.gameEngine.entities.Light;
+import eu.tankernn.gameEngine.entities.ILight;
 import eu.tankernn.gameEngine.loader.Loader;
 import eu.tankernn.gameEngine.loader.textures.Texture;
 import eu.tankernn.gameEngine.renderEngine.MasterRenderer;
@@ -69,7 +69,7 @@ public class WaterMaster {
 		return false;
 	}
 	
-	public void renderWater(Camera camera, List<Light> lights) {
+	public void renderWater(Camera camera, List<ILight> lights) {
 		waterRenderer.render(waterTiles, camera, lights);
 	}
 	

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

@@ -9,7 +9,7 @@ import org.lwjgl.util.vector.Matrix4f;
 import org.lwjgl.util.vector.Vector3f;
 
 import eu.tankernn.gameEngine.entities.Camera;
-import eu.tankernn.gameEngine.entities.Light;
+import eu.tankernn.gameEngine.entities.ILight;
 import eu.tankernn.gameEngine.loader.Loader;
 import eu.tankernn.gameEngine.loader.textures.Texture;
 import eu.tankernn.gameEngine.renderEngine.DisplayManager;
@@ -45,7 +45,7 @@ public class WaterRenderer {
 		setUpVAO(loader);
 	}
 	
-	public void render(List<WaterTile> water, Camera camera, List<Light> lights) {
+	public void render(List<WaterTile> water, Camera camera, List<ILight> lights) {
 		prepareRender(camera, lights);
 		for (WaterTile tile: water) {
 			Matrix4f modelMatrix = Maths.createTransformationMatrix(new Vector3f(tile.getX(), tile.getHeight(), tile.getZ()), new Vector3f(0, 0, 0), tile.getSize());
@@ -55,7 +55,7 @@ public class WaterRenderer {
 		unbind();
 	}
 	
-	private void prepareRender(Camera camera, List<Light> lights) {
+	private void prepareRender(Camera camera, List<ILight> lights) {
 		shader.start();
 		shader.viewMatrix.loadCamera(camera);
 		shader.cameraPosition.loadVec3(camera.getPosition());