From 89ed1b95716cfb2ae4614b8aaa29853373002439 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Przemys=C5=82aw=20Pluta?= Date: Sat, 30 Jan 2021 13:15:36 +0100 Subject: [PATCH] Create model matrix for Object --- .../samplegame/core/gl/object/mesh/Mesh.java | 4 +- .../core/gl/render/DefaultRenderer.java | 15 +++--- .../samplegame/core/gl/render/Renderable.java | 5 +- .../core/gl/shader/constant/UniformName.java | 5 ++ .../samplegame/core/world/object/Object.java | 51 ++++++++++++++----- .../core/world/object/RenderableObject.java | 21 ++++++++ .../samplegame/core/world/object/Sprite.java | 4 +- .../samplegame/core/world/scene/Scene.java | 18 ++++--- .../game/logic/DefaultGameLogic.java | 6 ++- app/src/main/resources/shaders/default.vs | 4 +- 10 files changed, 100 insertions(+), 33 deletions(-) create mode 100755 app/src/main/java/com/bartlomiejpluta/samplegame/core/gl/shader/constant/UniformName.java create mode 100755 app/src/main/java/com/bartlomiejpluta/samplegame/core/world/object/RenderableObject.java diff --git a/app/src/main/java/com/bartlomiejpluta/samplegame/core/gl/object/mesh/Mesh.java b/app/src/main/java/com/bartlomiejpluta/samplegame/core/gl/object/mesh/Mesh.java index 6bfea995..8bc2cbe1 100755 --- a/app/src/main/java/com/bartlomiejpluta/samplegame/core/gl/object/mesh/Mesh.java +++ b/app/src/main/java/com/bartlomiejpluta/samplegame/core/gl/object/mesh/Mesh.java @@ -1,6 +1,8 @@ package com.bartlomiejpluta.samplegame.core.gl.object.mesh; import com.bartlomiejpluta.samplegame.core.gl.render.Renderable; +import com.bartlomiejpluta.samplegame.core.gl.shader.manager.ShaderManager; +import com.bartlomiejpluta.samplegame.core.gl.shader.program.ShaderProgram; import org.lwjgl.opengl.GL15; import org.lwjgl.system.MemoryStack; @@ -44,7 +46,7 @@ public class Mesh implements Renderable { } @Override - public void render() { + public void render(ShaderManager shaderManager) { glBindVertexArray(vaoId); glEnableVertexAttribArray(0); glDrawElements(GL_TRIANGLES, elementsCount, GL_UNSIGNED_INT, 0); diff --git a/app/src/main/java/com/bartlomiejpluta/samplegame/core/gl/render/DefaultRenderer.java b/app/src/main/java/com/bartlomiejpluta/samplegame/core/gl/render/DefaultRenderer.java index bc856d10..f308a5d3 100755 --- a/app/src/main/java/com/bartlomiejpluta/samplegame/core/gl/render/DefaultRenderer.java +++ b/app/src/main/java/com/bartlomiejpluta/samplegame/core/gl/render/DefaultRenderer.java @@ -1,18 +1,14 @@ package com.bartlomiejpluta.samplegame.core.gl.render; -import com.bartlomiejpluta.samplegame.core.ui.Window; +import com.bartlomiejpluta.samplegame.core.gl.shader.constant.UniformName; import com.bartlomiejpluta.samplegame.core.gl.shader.manager.ShaderManager; +import com.bartlomiejpluta.samplegame.core.ui.Window; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.lwjgl.system.MemoryStack; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import static org.lwjgl.opengl.GL15.*; -import static org.lwjgl.opengl.GL20.glEnableVertexAttribArray; -import static org.lwjgl.opengl.GL20.glVertexAttribPointer; -import static org.lwjgl.opengl.GL30.glBindVertexArray; -import static org.lwjgl.opengl.GL30.glGenVertexArrays; @Slf4j @Component @@ -23,7 +19,10 @@ public class DefaultRenderer implements Renderer { @Override public void init() { log.info("Initializing renderer"); - shaderManager.createShader("default", "/shaders/default.vs", "/shaders/default.fs"); + shaderManager + .createShader("default", "/shaders/default.vs", "/shaders/default.fs") + .selectShader("default") + .createUniform(UniformName.UNI_MODEL_MATRIX); } @Override @@ -33,7 +32,7 @@ public class DefaultRenderer implements Renderer { shaderManager.selectShader("default").useSelectedShader(); - renderable.render(); + renderable.render(shaderManager); shaderManager.detachCurrentShader(); } diff --git a/app/src/main/java/com/bartlomiejpluta/samplegame/core/gl/render/Renderable.java b/app/src/main/java/com/bartlomiejpluta/samplegame/core/gl/render/Renderable.java index 296173d7..1fc8886e 100755 --- a/app/src/main/java/com/bartlomiejpluta/samplegame/core/gl/render/Renderable.java +++ b/app/src/main/java/com/bartlomiejpluta/samplegame/core/gl/render/Renderable.java @@ -1,6 +1,9 @@ package com.bartlomiejpluta.samplegame.core.gl.render; +import com.bartlomiejpluta.samplegame.core.gl.shader.manager.ShaderManager; +import com.bartlomiejpluta.samplegame.core.gl.shader.program.ShaderProgram; + public interface Renderable { - void render(); + void render(ShaderManager shaderManager); void cleanUp(); } diff --git a/app/src/main/java/com/bartlomiejpluta/samplegame/core/gl/shader/constant/UniformName.java b/app/src/main/java/com/bartlomiejpluta/samplegame/core/gl/shader/constant/UniformName.java new file mode 100755 index 00000000..e79caed5 --- /dev/null +++ b/app/src/main/java/com/bartlomiejpluta/samplegame/core/gl/shader/constant/UniformName.java @@ -0,0 +1,5 @@ +package com.bartlomiejpluta.samplegame.core.gl.shader.constant; + +public interface UniformName { + public static final String UNI_MODEL_MATRIX = "modelMatrix"; +} diff --git a/app/src/main/java/com/bartlomiejpluta/samplegame/core/world/object/Object.java b/app/src/main/java/com/bartlomiejpluta/samplegame/core/world/object/Object.java index 5ea81e74..0cf2f01f 100755 --- a/app/src/main/java/com/bartlomiejpluta/samplegame/core/world/object/Object.java +++ b/app/src/main/java/com/bartlomiejpluta/samplegame/core/world/object/Object.java @@ -1,15 +1,14 @@ package com.bartlomiejpluta.samplegame.core.world.object; -import com.bartlomiejpluta.samplegame.core.gl.object.mesh.Mesh; -import com.bartlomiejpluta.samplegame.core.gl.render.Renderable; import lombok.Getter; -import lombok.RequiredArgsConstructor; import lombok.Setter; +import org.joml.Matrix4f; import org.joml.Vector3f; -@RequiredArgsConstructor -public abstract class Object implements Renderable { - private final Mesh mesh; +import static java.lang.Math.toRadians; + +public abstract class Object { + private final Matrix4f modelMatrix = new Matrix4f(); @Getter private final Vector3f position = new Vector3f(0, 0, 0); @@ -34,6 +33,20 @@ public abstract class Object implements Renderable { this.position.z = position.z; return this; } + + public Object movePosition(float x, float y, float z) { + position.x += x; + position.y += y; + position.z += z; + return this; + } + + public Object movePosition(Vector3f position) { + this.position.x += position.x; + this.position.y += position.y; + this.position.z += position.z; + return this; + } public Object setRotation(float x, float y, float z) { rotation.x = x; @@ -49,13 +62,27 @@ public abstract class Object implements Renderable { return this; } - @Override - public void render() { - mesh.render(); + public Object moveRotation(float x, float y, float z) { + rotation.x += x; + rotation.y += y; + rotation.z += z; + return this; } - @Override - public void cleanUp() { - mesh.cleanUp(); + public Object moveRotation(Vector3f rotation) { + this.rotation.x += rotation.x; + this.rotation.y += rotation.y; + this.rotation.z += rotation.z; + return this; + } + + public Matrix4f getModelMatrix() { + return modelMatrix + .identity() + .translate(position) + .rotateX((float) toRadians(-rotation.x)) + .rotateY((float) toRadians(-rotation.y)) + .rotateZ((float) toRadians(-rotation.z)) + .scale(scale); } } diff --git a/app/src/main/java/com/bartlomiejpluta/samplegame/core/world/object/RenderableObject.java b/app/src/main/java/com/bartlomiejpluta/samplegame/core/world/object/RenderableObject.java new file mode 100755 index 00000000..c33de92b --- /dev/null +++ b/app/src/main/java/com/bartlomiejpluta/samplegame/core/world/object/RenderableObject.java @@ -0,0 +1,21 @@ +package com.bartlomiejpluta.samplegame.core.world.object; + +import com.bartlomiejpluta.samplegame.core.gl.object.mesh.Mesh; +import com.bartlomiejpluta.samplegame.core.gl.render.Renderable; +import com.bartlomiejpluta.samplegame.core.gl.shader.manager.ShaderManager; +import lombok.RequiredArgsConstructor; + +@RequiredArgsConstructor +public abstract class RenderableObject extends Object implements Renderable { + private final Mesh mesh; + + @Override + public void render(ShaderManager shaderManager) { + mesh.render(shaderManager); + } + + @Override + public void cleanUp() { + mesh.cleanUp(); + } +} diff --git a/app/src/main/java/com/bartlomiejpluta/samplegame/core/world/object/Sprite.java b/app/src/main/java/com/bartlomiejpluta/samplegame/core/world/object/Sprite.java index 733fd2ce..b84b749e 100755 --- a/app/src/main/java/com/bartlomiejpluta/samplegame/core/world/object/Sprite.java +++ b/app/src/main/java/com/bartlomiejpluta/samplegame/core/world/object/Sprite.java @@ -2,14 +2,14 @@ package com.bartlomiejpluta.samplegame.core.world.object; import com.bartlomiejpluta.samplegame.core.gl.object.mesh.Mesh; -public class Sprite extends Object { +public class Sprite extends RenderableObject { private static final float[] VERTICES = new float[]{ -0.5f, 0.5f, 0.0f, -0.5f, -0.5f, 0.0f, 0.5f, -0.5f, 0.0f, 0.5f, 0.5f, 0.0f }; - + private static final int[] ELEMENTS = new int[]{ 0, 1, 2, 2, 3, 0 diff --git a/app/src/main/java/com/bartlomiejpluta/samplegame/core/world/scene/Scene.java b/app/src/main/java/com/bartlomiejpluta/samplegame/core/world/scene/Scene.java index 59fe3145..eb3b085c 100755 --- a/app/src/main/java/com/bartlomiejpluta/samplegame/core/world/scene/Scene.java +++ b/app/src/main/java/com/bartlomiejpluta/samplegame/core/world/scene/Scene.java @@ -1,27 +1,31 @@ package com.bartlomiejpluta.samplegame.core.world.scene; import com.bartlomiejpluta.samplegame.core.gl.render.Renderable; +import com.bartlomiejpluta.samplegame.core.gl.shader.constant.UniformName; +import com.bartlomiejpluta.samplegame.core.gl.shader.manager.ShaderManager; +import com.bartlomiejpluta.samplegame.core.world.object.RenderableObject; import java.util.ArrayList; import java.util.List; public class Scene implements Renderable { - private final List renderables = new ArrayList<>(); + private final List objects = new ArrayList<>(); - public Scene add(Renderable renderable) { - renderables.add(renderable); + public Scene add(RenderableObject object) { + objects.add(object); return this; } @Override - public void render() { - for(var renderable : renderables) { - renderable.render(); + public void render(ShaderManager shaderManager) { + for(var object : objects) { + shaderManager.setUniform(UniformName.UNI_MODEL_MATRIX, object.getModelMatrix()); + object.render(shaderManager); } } @Override public void cleanUp() { - renderables.forEach(Renderable::cleanUp); + objects.forEach(Renderable::cleanUp); } } diff --git a/app/src/main/java/com/bartlomiejpluta/samplegame/game/logic/DefaultGameLogic.java b/app/src/main/java/com/bartlomiejpluta/samplegame/game/logic/DefaultGameLogic.java index aab30ac1..fa797ed9 100755 --- a/app/src/main/java/com/bartlomiejpluta/samplegame/game/logic/DefaultGameLogic.java +++ b/app/src/main/java/com/bartlomiejpluta/samplegame/game/logic/DefaultGameLogic.java @@ -7,6 +7,7 @@ import com.bartlomiejpluta.samplegame.core.world.object.Sprite; import com.bartlomiejpluta.samplegame.core.world.scene.Scene; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.joml.Vector3f; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @@ -17,12 +18,15 @@ public class DefaultGameLogic implements GameLogic { private final Renderer renderer; private final Scene scene = new Scene(); + Sprite sprite; + @Override public void init(Window window) { log.info("Initializing game logic"); renderer.init(); - scene.add(new Sprite()); + sprite = new Sprite(); + scene.add(sprite); } @Override diff --git a/app/src/main/resources/shaders/default.vs b/app/src/main/resources/shaders/default.vs index bb8fc424..fc52843b 100755 --- a/app/src/main/resources/shaders/default.vs +++ b/app/src/main/resources/shaders/default.vs @@ -1,8 +1,10 @@ #version 330 +uniform mat4 modelMatrix; + layout(location=0) in vec3 position; void main() { - gl_Position = vec4(position, 1.0); + gl_Position = modelMatrix * vec4(position, 1.0); } \ No newline at end of file