From 0594c87f77965b3daddc27913337c1dc39a84c0f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Przemys=C5=82aw=20Pluta?= Date: Sat, 30 Jan 2021 12:55:16 +0100 Subject: [PATCH] Create basic Sprite shape --- .../samplegame/core/gl/object/mesh/Mesh.java | 66 +++++++++++++++++++ .../core/gl/render/DefaultRenderer.java | 4 +- .../samplegame/core/gl/render/Renderable.java | 6 ++ .../samplegame/core/gl/render/Renderer.java | 2 +- .../samplegame/core/world/object/Object.java | 61 +++++++++++++++++ .../samplegame/core/world/object/Sprite.java | 21 ++++++ .../samplegame/core/world/scene/Scene.java | 27 ++++++++ .../game/logic/DefaultGameLogic.java | 7 +- 8 files changed, 190 insertions(+), 4 deletions(-) create mode 100755 app/src/main/java/com/bartlomiejpluta/samplegame/core/gl/object/mesh/Mesh.java create mode 100755 app/src/main/java/com/bartlomiejpluta/samplegame/core/gl/render/Renderable.java create mode 100755 app/src/main/java/com/bartlomiejpluta/samplegame/core/world/object/Object.java create mode 100755 app/src/main/java/com/bartlomiejpluta/samplegame/core/world/object/Sprite.java create mode 100755 app/src/main/java/com/bartlomiejpluta/samplegame/core/world/scene/Scene.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 new file mode 100755 index 00000000..6bfea995 --- /dev/null +++ b/app/src/main/java/com/bartlomiejpluta/samplegame/core/gl/object/mesh/Mesh.java @@ -0,0 +1,66 @@ +package com.bartlomiejpluta.samplegame.core.gl.object.mesh; + +import com.bartlomiejpluta.samplegame.core.gl.render.Renderable; +import org.lwjgl.opengl.GL15; +import org.lwjgl.system.MemoryStack; + +import java.util.ArrayList; +import java.util.List; + +import static org.lwjgl.opengl.GL15.*; +import static org.lwjgl.opengl.GL20.*; +import static org.lwjgl.opengl.GL30.*; + +public class Mesh implements Renderable { + private final int vaoId; + private final List vboIds = new ArrayList<>(2); + private final int elementsCount; + + public Mesh(float[] vertices, int[] elements) { + try(var stack = MemoryStack.stackPush()) { + elementsCount = elements.length; + var verticesBuffer = stack.mallocFloat(vertices.length); + var elementsBuffer = stack.mallocInt(elementsCount); + verticesBuffer.put(vertices).flip(); + elementsBuffer.put(elements).flip(); + + vaoId = glGenVertexArrays(); + glBindVertexArray(vaoId); + + int vboId = glGenBuffers(); + vboIds.add(vboId); + glBindBuffer(GL_ARRAY_BUFFER, vboId); + glBufferData(GL_ARRAY_BUFFER, verticesBuffer, GL_STATIC_DRAW); + glVertexAttribPointer(0, 3, GL_FLOAT, false, 0, 0); + + vboId = glGenBuffers(); + vboIds.add(vboId); + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vboId); + glBufferData(GL_ELEMENT_ARRAY_BUFFER, elementsBuffer, GL_STATIC_DRAW); + + glBindBuffer(GL_ARRAY_BUFFER, 0); + glBindVertexArray(0); + } + } + + @Override + public void render() { + glBindVertexArray(vaoId); + glEnableVertexAttribArray(0); + glDrawElements(GL_TRIANGLES, elementsCount, GL_UNSIGNED_INT, 0); + glDisableVertexAttribArray(0); + glBindVertexArray(0); + } + + @Override + public void cleanUp() { + glDisableVertexAttribArray(0); + glBindBuffer(GL_ARRAY_BUFFER, 0); + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); + + vboIds.forEach(GL15::glDeleteBuffers); + + glBindVertexArray(0); + glDeleteVertexArrays(vaoId); + } +} 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 4e6d3fa3..bc856d10 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 @@ -27,13 +27,13 @@ public class DefaultRenderer implements Renderer { } @Override - public void render(Window window) { + public void render(Window window, Renderable renderable) { clear(); updateViewport(window); shaderManager.selectShader("default").useSelectedShader(); - // here the objects will be rendered with the default shader + renderable.render(); 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 new file mode 100755 index 00000000..296173d7 --- /dev/null +++ b/app/src/main/java/com/bartlomiejpluta/samplegame/core/gl/render/Renderable.java @@ -0,0 +1,6 @@ +package com.bartlomiejpluta.samplegame.core.gl.render; + +public interface Renderable { + void render(); + void cleanUp(); +} diff --git a/app/src/main/java/com/bartlomiejpluta/samplegame/core/gl/render/Renderer.java b/app/src/main/java/com/bartlomiejpluta/samplegame/core/gl/render/Renderer.java index de3378a6..d64d670d 100755 --- a/app/src/main/java/com/bartlomiejpluta/samplegame/core/gl/render/Renderer.java +++ b/app/src/main/java/com/bartlomiejpluta/samplegame/core/gl/render/Renderer.java @@ -5,7 +5,7 @@ import com.bartlomiejpluta.samplegame.core.ui.Window; public interface Renderer { void init(); - void render(Window window); + void render(Window window, Renderable renderable); void cleanUp(); } 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 new file mode 100755 index 00000000..5ea81e74 --- /dev/null +++ b/app/src/main/java/com/bartlomiejpluta/samplegame/core/world/object/Object.java @@ -0,0 +1,61 @@ +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.Vector3f; + +@RequiredArgsConstructor +public abstract class Object implements Renderable { + private final Mesh mesh; + + @Getter + private final Vector3f position = new Vector3f(0, 0, 0); + + @Getter + private final Vector3f rotation = new Vector3f(0, 0, 0); + + @Getter + @Setter + private float scale = 1.0f; + + public Object setPosition(float x, float y, float z) { + position.x = x; + position.y = y; + position.z = z; + return this; + } + + public Object setPosition(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; + rotation.y = y; + rotation.z = z; + return this; + } + + public Object setRotation(Vector3f rotation) { + this.rotation.x = rotation.x; + this.rotation.y = rotation.y; + this.rotation.z = rotation.z; + return this; + } + + @Override + public void render() { + mesh.render(); + } + + @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 new file mode 100755 index 00000000..733fd2ce --- /dev/null +++ b/app/src/main/java/com/bartlomiejpluta/samplegame/core/world/object/Sprite.java @@ -0,0 +1,21 @@ +package com.bartlomiejpluta.samplegame.core.world.object; + +import com.bartlomiejpluta.samplegame.core.gl.object.mesh.Mesh; + +public class Sprite extends Object { + 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 + }; + + public Sprite() { + super(new Mesh(VERTICES, ELEMENTS)); + } +} 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 new file mode 100755 index 00000000..59fe3145 --- /dev/null +++ b/app/src/main/java/com/bartlomiejpluta/samplegame/core/world/scene/Scene.java @@ -0,0 +1,27 @@ +package com.bartlomiejpluta.samplegame.core.world.scene; + +import com.bartlomiejpluta.samplegame.core.gl.render.Renderable; + +import java.util.ArrayList; +import java.util.List; + +public class Scene implements Renderable { + private final List renderables = new ArrayList<>(); + + public Scene add(Renderable renderable) { + renderables.add(renderable); + return this; + } + + @Override + public void render() { + for(var renderable : renderables) { + renderable.render(); + } + } + + @Override + public void cleanUp() { + renderables.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 b2a3cf88..aab30ac1 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 @@ -3,6 +3,8 @@ package com.bartlomiejpluta.samplegame.game.logic; import com.bartlomiejpluta.samplegame.core.gl.render.Renderer; import com.bartlomiejpluta.samplegame.core.logic.GameLogic; import com.bartlomiejpluta.samplegame.core.ui.Window; +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.springframework.beans.factory.annotation.Autowired; @@ -13,11 +15,14 @@ import org.springframework.stereotype.Component; @RequiredArgsConstructor(onConstructor = @__(@Autowired)) public class DefaultGameLogic implements GameLogic { private final Renderer renderer; + private final Scene scene = new Scene(); @Override public void init(Window window) { log.info("Initializing game logic"); renderer.init(); + + scene.add(new Sprite()); } @Override @@ -32,7 +37,7 @@ public class DefaultGameLogic implements GameLogic { @Override public void render(Window window) { - renderer.render(window); + renderer.render(window, scene); } @Override