diff --git a/.idea/artifacts/Helium_Engine_jar.xml b/.idea/artifacts/Helium_Engine_jar.xml index 8413fd3..0d08ed7 100644 --- a/.idea/artifacts/Helium_Engine_jar.xml +++ b/.idea/artifacts/Helium_Engine_jar.xml @@ -3,7 +3,7 @@ $PROJECT_DIR$/out/artifacts/Helium_Engine_jar - + diff --git a/src/Test.java b/src/Test.java index 86e3975..4c71438 100644 --- a/src/Test.java +++ b/src/Test.java @@ -136,9 +136,9 @@ public class Test implements Game { // rendering the cube and plane - renderer.renderMesh(cubeObject, camera); - renderer.renderMesh(planeObject, camera); - renderer.renderMesh(dragonObject, camera); + renderer.renderObject3D(cubeObject, camera); + renderer.renderObject3D(planeObject, camera); + renderer.renderObject3D(dragonObject, camera); //swap buffers so the new one will appear display.reset(); @@ -148,13 +148,13 @@ public class Test implements Game { public void setup() throws Exception { //First, set up the display - display = new Display(WIDTH, HEIGHT, windowName, 70, 0.1f, 1000f); + display = new Display(WIDTH, HEIGHT, windowName); display.create(); // Open the shaders - shader = new Shader(Shader.VERTEXSHADER, Shader.FRAGSHADER); + shader = new Shader(0); // Set up the renderer renderer = new Renderer(display, shader); diff --git a/src/org/hl/engine/graphics/Renderer.java b/src/org/hl/engine/graphics/Renderer.java index 2048b72..92615d4 100644 --- a/src/org/hl/engine/graphics/Renderer.java +++ b/src/org/hl/engine/graphics/Renderer.java @@ -13,13 +13,20 @@ public class Renderer { private Shader shader; private Display display; + private Matrix4f projectionMatrix; + private static final float fov = 70; + private static final float near = 0.1f; + private static final float far = 1000f; + private Matrix4f orthoProjection; + public Renderer(Display display, Shader shader) { this.shader = shader; this.display = display; + this.projectionMatrix = Matrix4f.perspective(fov, this.display.getAspectRatio(), near, far); } - public void renderMesh(GameObject object, Camera camera) { + public void renderObject3D(GameObject object, Camera camera) { // Renders the mesh by drawing it using triangles (least complicated) GL30.glBindVertexArray(object.getMesh().getVertexArrayObject()); @@ -35,7 +42,7 @@ public class Renderer { shader.bind(); shader.setUniform("type", object.getMesh().isType()); - shader.setUniform("projection", display.getProjectionMatrix()); + shader.setUniform("projection", this.projectionMatrix); shader.setUniform("view", Matrix4f.view(camera.getPosition(), camera.getRotation())); shader.setUniform("model", Matrix4f.transform(object.getPosition(), object.getRotation(), object.getScale())); @@ -48,4 +55,66 @@ public class Renderer { GL30.glBindVertexArray(0); } + + public void renderScene3D(Scene scene, Camera camera) { + for (GameObject object: scene.getObjects()) { + GL30.glBindVertexArray(object.getMesh().getVertexArrayObject()); + GL30.glEnableVertexAttribArray(0); + GL30.glEnableVertexAttribArray(1); + GL30.glEnableVertexAttribArray(2); + GL15.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, object.getMesh().getIndicesBufferObject()); + + GL13.glActiveTexture(GL13.GL_TEXTURE0); + + GL13.glBindTexture(GL11.GL_TEXTURE_2D, object.getMesh().getMaterial().getTexture().getId()); + + shader.bind(); + + shader.setUniform("type", object.getMesh().isType()); + shader.setUniform("projection", this.projectionMatrix); + shader.setUniform("view", Matrix4f.view(camera.getPosition(), camera.getRotation())); + shader.setUniform("model", Matrix4f.transform(object.getPosition(), object.getRotation(), object.getScale())); + + GL11.glDrawElements(GL11.GL_TRIANGLES, object.getMesh().getIndices().length, GL11.GL_UNSIGNED_INT, 0); + + shader.unbind(); + GL30.glDisableVertexAttribArray(0); + GL30.glDisableVertexAttribArray(1); + GL30.glDisableVertexAttribArray(2); + GL30.glBindVertexArray(0); + } + } + + public void renderObject2D(GameObject object, Camera camera, float top, float bottom, float left, float right) { + + orthoProjection = Matrix4f.orthoProjection(right, left, bottom, top, near, far); + + // Renders the mesh by drawing it using triangles (least complicated) + GL30.glBindVertexArray(object.getMesh().getVertexArrayObject()); + GL30.glEnableVertexAttribArray(0); + GL30.glEnableVertexAttribArray(1); + GL30.glEnableVertexAttribArray(2); + GL15.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, object.getMesh().getIndicesBufferObject()); + + GL13.glActiveTexture(GL13.GL_TEXTURE0); + + GL13.glBindTexture(GL11.GL_TEXTURE_2D, object.getMesh().getMaterial().getTexture().getId()); + + shader.bind(); + + shader.setUniform("type", object.getMesh().isType()); + shader.setUniform("projection", this.orthoProjection); + shader.setUniform("view", Matrix4f.view(camera.getPosition(), camera.getRotation())); + shader.setUniform("model", Matrix4f.transform(object.getPosition(), object.getRotation(), object.getScale())); + + GL11.glDrawElements(GL11.GL_TRIANGLES, object.getMesh().getIndices().length, GL11.GL_UNSIGNED_INT, 0); + + shader.unbind(); + GL30.glDisableVertexAttribArray(0); + GL30.glDisableVertexAttribArray(1); + GL30.glDisableVertexAttribArray(2); + GL30.glBindVertexArray(0); + + } + } diff --git a/src/org/hl/engine/graphics/Scene.java b/src/org/hl/engine/graphics/Scene.java new file mode 100644 index 0000000..340886b --- /dev/null +++ b/src/org/hl/engine/graphics/Scene.java @@ -0,0 +1,40 @@ +package org.hl.engine.graphics; + +import org.hl.engine.objects.GameObject; + +import java.util.ArrayList; +import java.util.Arrays; + +public class Scene { + + private ArrayList objects; + + public Scene() { + objects = new ArrayList(); + } + + public ArrayList getObjects() { + return objects; + } + + public void setObjects(ArrayList objects) { + this.objects = objects; + } + + public void setObjects(GameObject[] objects) { + this.objects.addAll(Arrays.asList(objects)); + } + + public void addObject(GameObject object) { + this.objects.add(object); + } + + public void removeObject(int index) { + this.objects.remove(index); + } + + public GameObject getObject(int index) { + return this.objects.get(index); + } + +} diff --git a/src/org/hl/engine/graphics/Shader.java b/src/org/hl/engine/graphics/Shader.java index 0a3de22..beb4211 100644 --- a/src/org/hl/engine/graphics/Shader.java +++ b/src/org/hl/engine/graphics/Shader.java @@ -17,8 +17,10 @@ public class Shader { private int vertexID, fragmentID, programID; - public static final String VERTEXSHADER = "/resources/shaders/mainVertex.glsl"; - public static final String FRAGSHADER = "/resources/shaders/mainFragment.glsl"; + public static final String VERTEX_SHADER_NO_LIGHT = "/resources/shaders/mainVertex.glsl"; + public static final String FRAG_SHADER_NO_LIGHT = "/resources/shaders/mainFragment.glsl"; + + public static final int NO_LIGHT = 0; public Shader(String vertexPath, String fragmentPath) { vertexFile = FileUtils.loadAsString(vertexPath); @@ -26,6 +28,13 @@ public class Shader { } + public Shader(int type) { + if (type == 0) { + vertexFile = FileUtils.loadAsString(VERTEX_SHADER_NO_LIGHT); + fragmentFile = FileUtils.loadAsString(FRAG_SHADER_NO_LIGHT); + } + } + public void create() { // Creates the program diff --git a/src/org/hl/engine/io/Display.java b/src/org/hl/engine/io/Display.java index 54d7e4f..46e36f5 100644 --- a/src/org/hl/engine/io/Display.java +++ b/src/org/hl/engine/io/Display.java @@ -30,7 +30,6 @@ public class Display { private int savedPosY; private int savedWidth; private int savedHeight; - private Matrix4f projection; private boolean isLocked; private double[] cursorX = new double[1]; private double[] cursorY = new double[1]; @@ -40,11 +39,14 @@ public class Display { // Constructor to create the display - public Display (int width, int height, String windowName, float fov, float near, float far) { + public Display (int width, int height, String windowName) { this.width = width; this.height = height; this.windowName = windowName; - projection = Matrix4f.projection(fov, (float)this.width / (float) this.height, near, far); + } + + public float getAspectRatio() { + return (float)this.width / (float)this.height; } // Change the window name @@ -74,10 +76,6 @@ public class Display { return isFullscreen; } - public Matrix4f getProjectionMatrix() { - return projection; - } - // Makes the screen fullscreen or not based on the argument public void setFullscreen(boolean fullscreen) { isFullscreen = fullscreen; @@ -124,6 +122,7 @@ public class Display { public boolean isResized() { return isResized; + } diff --git a/src/org/hl/engine/math/lalg/Matrix4f.java b/src/org/hl/engine/math/lalg/Matrix4f.java index 1419e61..e778a59 100644 --- a/src/org/hl/engine/math/lalg/Matrix4f.java +++ b/src/org/hl/engine/math/lalg/Matrix4f.java @@ -108,7 +108,7 @@ public class Matrix4f { return result; } - public static Matrix4f projection( float fov, float aspectRatio, float near, float far) { + public static Matrix4f perspective( float fov, float aspectRatio, float near, float far) { Matrix4f result = Matrix4f.identity(); float tan = (float)Math.tan(Math.toRadians(fov / 2)); @@ -124,6 +124,17 @@ public class Matrix4f { return result; } + public static Matrix4f orthoProjection(float right, float left, float bottom, float top, float near, float far) { + Matrix4f result = Matrix4f.identity(); + result.set(0, 0, 2/(right - left)); + result.set(1, 1, 2/(top - bottom)); + result.set(2, 2, -2/(far - near)); + result.set(0, 3, -(right + left) / (right - left)); + result.set(1, 3, -(top + bottom) / (top - bottom)); + result.set(2, 3, -(far + near) / (far - near)); + return result; + } + public static Matrix4f view(Vector3f position, Vector3f rotation) { Vector3f negative = new Vector3f(-position.getX(), -position.getY(), -position.getZ());