diff --git a/client/src/main/java/core/engine/Engine.java b/client/src/main/java/core/engine/Engine.java index a567e54..fda4cc2 100644 --- a/client/src/main/java/core/engine/Engine.java +++ b/client/src/main/java/core/engine/Engine.java @@ -1,5 +1,6 @@ package core.engine; +import core.engine.model.RawModel; import org.lwjgl.Version; import org.lwjgl.glfw.GLFWErrorCallback; import org.lwjgl.glfw.GLFWVidMode; @@ -19,6 +20,8 @@ import static org.lwjgl.system.MemoryUtil.NULL; public class Engine { private long window; + private final Loader loader = new Loader(); + private final Renderer renderer = new Renderer(); public Engine() { @@ -99,18 +102,29 @@ public class Engine { // Set the clear color glClearColor(1.0f, 0.0f, 0.0f, 0.0f); - + float[] vertices = { + -0.5f, 0.5f, 0f, + -0.5f, -0.5f, 0f, + 0.5f, -0.5f, 0f, + 0.5f, -0.5f, 0f, + 0.5f, 0.5f, 0f, + -0.5f, 0.5f, 0f + }; + RawModel model = loader.loadToVAO(vertices); // Run the rendering loop until the user has attempted to close // the window or has pressed the ESCAPE key. while ( !glfwWindowShouldClose(window) ) { + renderer.prepare(); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // clear the framebuffer - + renderer.render(model); glfwSwapBuffers(window); // swap the color buffers // Poll for window events. The key callback above will only be // invoked during this call. glfwPollEvents(); } + + loader.cleanUp(); } } diff --git a/client/src/main/java/core/engine/Loader.java b/client/src/main/java/core/engine/Loader.java new file mode 100644 index 0000000..49b14d6 --- /dev/null +++ b/client/src/main/java/core/engine/Loader.java @@ -0,0 +1,64 @@ +package core.engine; + +import core.engine.model.RawModel; +import org.lwjgl.BufferUtils; +import org.lwjgl.opengl.GL11; +import org.lwjgl.opengl.GL15; +import org.lwjgl.opengl.GL20; +import org.lwjgl.opengl.GL30; + +import java.nio.FloatBuffer; +import java.util.ArrayList; +import java.util.List; + +public class Loader { + + private List vaos = new ArrayList<>(); + private List vbos = new ArrayList<>(); + + public RawModel loadToVAO(float[] positions) { + int vaoID = createVAO(); + storeDataInAttributeList(0, positions); + unbindVAO(); + return new RawModel(vaoID, positions.length/3); + } + + private int createVAO() { + int vao = GL30.glGenVertexArrays(); + vaos.add(vao); + GL30.glBindVertexArray(vao); + return vao; + } + + private void storeDataInAttributeList(int attributeNumber, float[] data) { + int vboID = GL15.glGenBuffers(); + vbos.add(vboID); + GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, vboID); + FloatBuffer floatBuffer = storeInFloatBuffer(data); + GL15.glBufferData(GL15.GL_ARRAY_BUFFER, floatBuffer, GL15.GL_STATIC_DRAW); + GL20.glVertexAttribPointer(attributeNumber, 3, GL11.GL_FLOAT, false, 0,0); + GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0); + } + + private void unbindVAO() { + GL30.glBindVertexArray(0); + } + + private FloatBuffer storeInFloatBuffer(float[] data) { + FloatBuffer floatBuffer = BufferUtils.createFloatBuffer(data.length); + floatBuffer.put(data); + //Buffer is until know expected to be written to. Flip it, so it can be read + floatBuffer.flip(); + return floatBuffer; + } + + public void cleanUp() { + for(int vao: vaos) { + GL30.glDeleteVertexArrays(vao); + } + + for(int vbo: vbos) { + GL15.glDeleteBuffers(vbo); + } + } +} diff --git a/client/src/main/java/core/engine/Renderer.java b/client/src/main/java/core/engine/Renderer.java new file mode 100644 index 0000000..91d4d51 --- /dev/null +++ b/client/src/main/java/core/engine/Renderer.java @@ -0,0 +1,21 @@ +package core.engine; + +import core.engine.model.RawModel; +import org.lwjgl.opengl.GL11; +import org.lwjgl.opengl.GL20; +import org.lwjgl.opengl.GL30; + +public class Renderer { + + public void prepare() { + GL11.glClearColor(1,0,0,1); + } + + public void render(RawModel rawModel) { + GL30.glBindVertexArray(rawModel.getVaoID()); + GL20.glEnableVertexAttribArray(0); + GL11.glDrawArrays(GL11.GL_TRIANGLES, 0, rawModel.getVertexCount()); + GL20.glDisableVertexAttribArray(0); + GL30.glBindVertexArray(0); + } +} diff --git a/client/src/main/java/core/engine/model/RawModel.java b/client/src/main/java/core/engine/model/RawModel.java new file mode 100644 index 0000000..c9faef0 --- /dev/null +++ b/client/src/main/java/core/engine/model/RawModel.java @@ -0,0 +1,20 @@ +package core.engine.model; + +public class RawModel { + + private final int vaoID; + private final int vertexCount; + + public RawModel(int vaoID, int vertexCount) { + this.vaoID = vaoID; + this.vertexCount = vertexCount; + } + + public int getVaoID() { + return vaoID; + } + + public int getVertexCount() { + return vertexCount; + } +}