Przeglądaj źródła

Animated shadows

Tankernn 8 lat temu
rodzic
commit
dee6d5ec5a

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

@@ -17,9 +17,9 @@ import eu.tankernn.gameEngine.renderEngine.shaders.UniformVec2;
 import eu.tankernn.gameEngine.renderEngine.shaders.UniformVec3;
 import eu.tankernn.gameEngine.renderEngine.shaders.UniformVec4;
 import eu.tankernn.gameEngine.renderEngine.shaders.UniformViewMatrix;
+import eu.tankernn.gameEngine.settings.Settings;
 
 public class EntityShader extends ShaderProgram {
-	private static final int MAX_JOINTS = 50;// max number of joints in a skeleton
 	
 	private static final String VERTEX_FILE = "/eu/tankernn/gameEngine/renderEngine/entities/vertexShader.glsl";
 	private static final String FRAGMENT_FILE = "/eu/tankernn/gameEngine/renderEngine/entities/fragmentShader.glsl";
@@ -44,7 +44,7 @@ public class EntityShader extends ShaderProgram {
 	protected UniformSampler enviroMap = new UniformSampler("enviroMap");
 	protected UniformSampler normalMap = new UniformSampler("normalMap");
 	public UniformBoolean usesNormalMap = new UniformBoolean("usesNormalMap");
-	protected UniformMat4Array jointTransforms = new UniformMat4Array("jointTransforms", MAX_JOINTS);
+	protected UniformMat4Array jointTransforms = new UniformMat4Array("jointTransforms", Settings.MAX_JOINTS);
 	protected UniformBoolean animated = new UniformBoolean("isAnimated");
 
 	public EntityShader() {

+ 14 - 6
src/main/java/eu/tankernn/gameEngine/renderEngine/shadows/ShadowMapEntityRenderer.java

@@ -9,10 +9,10 @@ import org.lwjgl.opengl.GL30;
 import org.lwjgl.util.vector.Matrix4f;
 import org.lwjgl.util.vector.Vector3f;
 
+import eu.tankernn.gameEngine.animation.animatedModel.AnimatedModel;
 import eu.tankernn.gameEngine.entities.Entity3D;
 import eu.tankernn.gameEngine.loader.models.TexturedModel;
 import eu.tankernn.gameEngine.renderEngine.MasterRenderer;
-import eu.tankernn.gameEngine.renderEngine.Vao;
 import eu.tankernn.gameEngine.util.Maths;
 
 public class ShadowMapEntityRenderer {
@@ -39,15 +39,14 @@ public class ShadowMapEntityRenderer {
 	 */
 	protected void render(Map<TexturedModel, List<Entity3D>> entities) {
 		for (TexturedModel model: entities.keySet()) {
-			Vao rawModel = model.getModel();
-			bindModel(rawModel);
+			bindModel(model);
 			model.getTexture().getTexture().bindToUnit(0);
 			if (model.getTexture().hasTransparency()) {
 				MasterRenderer.disableCulling();
 			}
 			for (Entity3D entity: entities.get(model)) {
 				prepareInstance(entity);
-				GL11.glDrawElements(GL11.GL_TRIANGLES, rawModel.getIndexCount(), GL11.GL_UNSIGNED_INT, 0);
+				GL11.glDrawElements(GL11.GL_TRIANGLES, model.getModel().getIndexCount(), GL11.GL_UNSIGNED_INT, 0);
 			}
 			if (model.getTexture().hasTransparency()) {
 				MasterRenderer.enableCulling();
@@ -55,6 +54,8 @@ public class ShadowMapEntityRenderer {
 		}
 		GL20.glDisableVertexAttribArray(0);
 		GL20.glDisableVertexAttribArray(1);
+		GL20.glDisableVertexAttribArray(4);
+		GL20.glDisableVertexAttribArray(5);
 		GL30.glBindVertexArray(0);
 	}
 	
@@ -66,8 +67,15 @@ public class ShadowMapEntityRenderer {
 	 * 
 	 * @param rawModel - the model to be bound.
 	 */
-	private void bindModel(Vao rawModel) {
-		rawModel.bind(0, 1);
+	private void bindModel(TexturedModel model) {
+		if (model instanceof AnimatedModel) {
+			model.getModel().bind(0, 1, 4, 5);
+			shader.animated.loadBoolean(true);
+			shader.jointTransforms.loadMatrixArray(((AnimatedModel) model).getJointTransforms());
+		} else {
+			model.getModel().bind(0, 1);
+			shader.animated.loadBoolean(false);
+		}
 	}
 	
 	/**

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

@@ -1,7 +1,10 @@
 package eu.tankernn.gameEngine.renderEngine.shadows;
 
 import eu.tankernn.gameEngine.renderEngine.shaders.ShaderProgram;
+import eu.tankernn.gameEngine.renderEngine.shaders.UniformBoolean;
+import eu.tankernn.gameEngine.renderEngine.shaders.UniformMat4Array;
 import eu.tankernn.gameEngine.renderEngine.shaders.UniformMatrix;
+import eu.tankernn.gameEngine.settings.Settings;
 
 public class ShadowShader extends ShaderProgram {
 	
@@ -9,10 +12,12 @@ public class ShadowShader extends ShaderProgram {
 	private static final String FRAGMENT_FILE = "/eu/tankernn/gameEngine/renderEngine/shadows/shadowFragmentShader.glsl";
 	
 	protected UniformMatrix mvpMatrix = new UniformMatrix("mvpMatrix");
+	protected UniformMat4Array jointTransforms = new UniformMat4Array("jointTransforms", Settings.MAX_JOINTS);
+	protected UniformBoolean animated = new UniformBoolean("isAnimated");
 	
 	protected ShadowShader() {
-		super(VERTEX_FILE, FRAGMENT_FILE, "in_position", "in_textureCoords");
-		super.storeAllUniformLocations(mvpMatrix);
+		super(VERTEX_FILE, FRAGMENT_FILE, "in_position", "in_textureCoords", "normal", "tangent", "in_jointIndices", "in_weights");
+		super.storeAllUniformLocations(mvpMatrix, jointTransforms, animated);
 	}
 	
 }

+ 0 - 1
src/main/java/eu/tankernn/gameEngine/renderEngine/shadows/shadowFragmentShader.glsl

@@ -14,5 +14,4 @@ void main(void){
 	}
 	
 	out_colour = vec4(1.0);
-	
 }

+ 23 - 1
src/main/java/eu/tankernn/gameEngine/renderEngine/shadows/shadowVertexShader.glsl

@@ -1,15 +1,37 @@
 #version 150
 
+const int MAX_JOINTS = 50;//max joints allowed in a skeleton
+const int MAX_WEIGHTS = 3;//max number of joints that can affect a vertex
+
 in vec3 in_position;
 in vec2 in_textureCoords;
+in vec3 normal;
+in vec3 tangent;
+in ivec3 in_jointIndices;
+in vec3 in_weights;
 
 out vec2 textureCoords;
 
 uniform mat4 mvpMatrix;
 
+uniform mat4 jointTransforms[MAX_JOINTS];
+uniform float isAnimated;
+
 void main(void){
+	
+	vec4 totalLocalPos = vec4(in_position, 1.0);
+	
+	if (isAnimated > 0.5) {
+		totalLocalPos = vec4(0.0);
+		
+		for(int i=0;i<MAX_WEIGHTS;i++){
+			mat4 jointTransform = jointTransforms[in_jointIndices[i]];
+			vec4 posePosition = jointTransform * vec4(in_position, 1.0);
+			totalLocalPos += posePosition * in_weights[i];
+		}
+	}
 
-	gl_Position = mvpMatrix * vec4(in_position, 1.0);
+	gl_Position = mvpMatrix * totalLocalPos;
 	
 	textureCoords = in_textureCoords;
 }

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

@@ -15,4 +15,9 @@ public class Settings {
 	
 	public static final float ANISOTROPIC_FILTERING_AMOUNT = 4f;
 	public static final int MULTISAMPLING = 2;
+	
+	/**
+	 * Maximum number of joints in a skeleton.
+	 */
+	public static final int MAX_JOINTS = 50;
 }