diff --git a/.gitignore b/.gitignore index 2533bb5..0edeb44 100644 --- a/.gitignore +++ b/.gitignore @@ -3,7 +3,6 @@ # IntelliJ Idea folders -.idea out diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..5c98b42 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,2 @@ +# Default ignored files +/workspace.xml \ No newline at end of file diff --git a/.idea/Helium-Engine.iml b/.idea/Helium-Engine.iml new file mode 100644 index 0000000..60dfedb --- /dev/null +++ b/.idea/Helium-Engine.iml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/codeStyles/codeStyleConfig.xml b/.idea/codeStyles/codeStyleConfig.xml new file mode 100644 index 0000000..a55e7a1 --- /dev/null +++ b/.idea/codeStyles/codeStyleConfig.xml @@ -0,0 +1,5 @@ + + + + \ No newline at end of file diff --git a/.idea/libraries/commons_io_2.xml b/.idea/libraries/commons_io_2.xml new file mode 100644 index 0000000..3cd1687 --- /dev/null +++ b/.idea/libraries/commons_io_2.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/lwjgl_release_3_2.xml b/.idea/libraries/lwjgl_release_3_2.xml new file mode 100644 index 0000000..fb489a0 --- /dev/null +++ b/.idea/libraries/lwjgl_release_3_2.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..d5d79e0 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..4e40737 --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/uiDesigner.xml b/.idea/uiDesigner.xml new file mode 100644 index 0000000..e96534f --- /dev/null +++ b/.idea/uiDesigner.xml @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..35eb1dd --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/resources/textures/thonk.png b/resources/textures/thonk.png new file mode 100644 index 0000000..a166634 Binary files /dev/null and b/resources/textures/thonk.png differ diff --git a/src/Test.java b/src/Test.java index 1c153f3..a04ffe4 100644 --- a/src/Test.java +++ b/src/Test.java @@ -1,79 +1,83 @@ -import org.hl.engine.graphics.Mesh; -import org.hl.engine.graphics.Renderer; -import org.hl.engine.graphics.Shader; -import org.hl.engine.graphics.Vertex; +import org.hl.engine.graphics.*; import org.hl.engine.io.Display; import org.hl.engine.io.Input; -import org.hl.engine.math.Vector3f; +import org.hl.engine.math.lalg.Vector3f; +import org.hl.engine.math.lalg.Vector2f; import org.lwjgl.glfw.GLFW; public class Test { - public final static int WIDTH = 640, HEIGHT = 480; - public final String windowName = "Game!"; - public Display display; - public Input i; - public Renderer renderer; - public Shader shader; + public final static int WIDTH = 640, HEIGHT = 480; + public final String windowName = "Game!"; + public Display display; + public Input i; + public Renderer renderer; + public Shader shader; - public Mesh mesh = new Mesh(new Vertex[] { - new Vertex(new Vector3f(-0.5F, 0.5F, 0.0F), new Vector3f(0, 0, 1.0F)), - new Vertex(new Vector3f(-0.5F, -0.5F, 0.0F), new Vector3f(0, 0, 1.0F)), - new Vertex(new Vector3f(0.5F, -0.5F, 0.0F), new Vector3f(1.0F, 0, 1.0F)), - new Vertex(new Vector3f(0.5F, 0.5F, 0.0F), new Vector3f(1.0F, 0, 1.0F) ), + public Mesh mesh = new Mesh(new Vertex[] { + new Vertex(new Vector3f(-0.5F, 0.5F, 0.0F), new Vector3f(0, 0, 1.0F), new Vector2f(0, 0)), + new Vertex(new Vector3f(-0.5F, -0.5F, 0.0F), new Vector3f(0, 0, 1.0F), new Vector2f(0, 1)), + new Vertex(new Vector3f(0.5F, -0.5F, 0.0F), new Vector3f(1.0F, 0, 1.0F), new Vector2f(1, 1)), + new Vertex(new Vector3f(0.5F, 0.5F, 0.0F), new Vector3f(1.0F, 0, 1.0F), new Vector2f(1, 0)), - }, new int[] { - 0, 1, 2, - 0, 2, 3 + }, new int[] { + 0, 1, 2, + 0, 2, 3 - }); + }, new Material(new Texture("resources/textures/thonk.png"))); - public void run() { - init(); - i = new Input(display); - while (!(display.shouldClose()) && !i.isKeyDown(GLFW.GLFW_KEY_ESCAPE)) { - update(); - render(); - } + public void run() throws Exception { + setup(); + i = new Input(display); + while (!(display.shouldClose()) && !i.isKeyDown(GLFW.GLFW_KEY_ESCAPE)) { + loop(); + } - close(); + close(); - } - public void init() { - // System.out.println("Initializing Game "); - display = new Display(WIDTH, HEIGHT, windowName); - shader = new Shader("/resources/shaders/mainVertex.glsl", "/resources/shaders/mainFragment.glsl"); - renderer = new Renderer(shader); - display.setBackgroundColor(1F, 0, 0); - display.create(); - mesh.create(); - shader.create(); + } - } - private void update() { - // System.out.println("Updating "); - int frames = display.update(); - display.setWindowName(display.getWindowName().substring(0, 4) + " (Frames : " + frames + ")"); + public void loop() { + update(); + render(); + } - i.reset(); - } + public void setup() throws Exception { + // System.out.println("Initializing Game "); + display = new Display(WIDTH, HEIGHT, windowName); + display.create(); + shader = new Shader("/resources/shaders/mainVertex.glsl", "/resources/shaders/mainFragment.glsl"); + renderer = new Renderer(shader); + display.setBackgroundColor(1F, 1F, 1F); + mesh.create(); + shader.create(); - private void render() { - // System.out.println("Rendering "); - renderer.renderMesh(mesh); - display.swapBuffers(); + } + private void update() { + // System.out.println("Updating "); + int frames = display.update(); + display.setWindowName(display.getWindowName().substring(0, 4) + " (Frames : " + frames + ")"); - } + i.reset(); - private void close() { - display.destroy(); - mesh.destroy(); - shader.destroy(); - } + } - public static void main(String[] args) { - new Test().run(); - } + private void render() { + // System.out.println("Rendering "); + renderer.renderMesh(mesh); + display.swapBuffers(); + + } + + private void close() { + display.destroy(); + mesh.destroy(); + shader.destroy(); + } + + public static void main(String[] args) throws Exception { + new Test().run(); + } } diff --git a/src/org/hl/engine/graphics/Material.java b/src/org/hl/engine/graphics/Material.java new file mode 100644 index 0000000..0436d6a --- /dev/null +++ b/src/org/hl/engine/graphics/Material.java @@ -0,0 +1,107 @@ +package org.hl.engine.graphics; + +import org.hl.engine.math.lalg.Vector4f; + +public class Material { + private static final Vector4f DEFAULT_COLOR = new Vector4f(1.0f, 1.0f, 1.0f, 1.0f); + + private Vector4f ambientColor; + + private Vector4f diffuseColor; + + private Vector4f specularColor; + + private float reflectance; + + private Texture texture; + + private Texture normalMap; + + public Material() { + this.ambientColor = DEFAULT_COLOR; + this.diffuseColor = DEFAULT_COLOR; + this.specularColor = DEFAULT_COLOR; + this.texture = null; + this.reflectance = 0; + } + + public Material(Vector4f color, float reflectance) { + this(color, color, color, null, reflectance); + } + + public Material(Texture texture) { + this(DEFAULT_COLOR, DEFAULT_COLOR, DEFAULT_COLOR, texture, 0); + } + + public Material(Texture texture, float reflectance) { + this(DEFAULT_COLOR, DEFAULT_COLOR, DEFAULT_COLOR, texture, reflectance); + } + + public Material(Vector4f ambientColor, Vector4f diffuseColor, Vector4f specularColor, Texture texture, float reflectance) { + this.ambientColor = ambientColor; + this.diffuseColor = diffuseColor; + this.specularColor = specularColor; + this.texture = texture; + this.reflectance = reflectance; + } + + public Vector4f getAmbientColor() { + return ambientColor; + } + + public void setAmbientColor(Vector4f ambientColor) { + this.ambientColor = ambientColor; + } + + public Vector4f getDiffuseColor() { + return diffuseColor; + } + + public void setDiffuseColor(Vector4f diffuseColor) { + this.diffuseColor = diffuseColor; + } + + public Vector4f getSpecularColor() { + return specularColor; + } + + public void setSpecularColor(Vector4f specularColor) { + this.specularColor = specularColor; + } + + public float getReflectance() { + return reflectance; + } + + public void setReflectance(float reflectance) { + this.reflectance = reflectance; + } + + public boolean isTextured() { + return this.texture != null; + } + + public Texture getTexture() { + return texture; + } + + public void setTexture(Texture texture) { + this.texture = texture; + } + + public boolean hasNormalMap() { + return this.normalMap != null; + } + + public Texture getNormalMap() { + return normalMap; + } + + public void setNormalMap(Texture normalMap) { + this.normalMap = normalMap; + } + + public void create() { + texture.create(); + } +} diff --git a/src/org/hl/engine/graphics/Mesh.java b/src/org/hl/engine/graphics/Mesh.java index b6d6194..f994db9 100644 --- a/src/org/hl/engine/graphics/Mesh.java +++ b/src/org/hl/engine/graphics/Mesh.java @@ -10,102 +10,134 @@ import java.nio.FloatBuffer; import java.nio.IntBuffer; public class Mesh { - private Vertex[] vertices; - private int[] indices; - private int vertexArrayObject, positionBufferObject, indicesBufferObject, colorBufferObject; - // A group of vertices combined based on the indexes - public Mesh(Vertex[] vertices, int[] indices) { - this.vertices = vertices; - this.indices = indices; - } + private Vertex[] vertices; + private int[] indices; + private int vertexArrayObject, positionBufferObject, indicesBufferObject, colorBufferObject, textureBufferObject; + private Material material; - // Destroy the mesh - public void destroy () { - GL15.glDeleteBuffers(positionBufferObject); - GL15.glDeleteBuffers(indicesBufferObject); - GL15.glDeleteBuffers(colorBufferObject); - - GL30.glDeleteVertexArrays(vertexArrayObject); - } - - // getters for the mesh - - public Vertex[] getVertices() { - return vertices; - } - - public int[] getIndices() { - return indices; - } - - public int getVertexArrayObject() { - return vertexArrayObject; - } - - public int getPositionBufferObject() { - return positionBufferObject; - } - - public int getIndicesBufferObject() { - return indicesBufferObject; - } - - public int getColorBufferObject() { - return colorBufferObject; - } - - public void create() { - - // Creates the mesh by formatting the vertices and indices and inputting them to OpenGL - vertexArrayObject = GL30.glGenVertexArrays(); - GL30.glBindVertexArray(vertexArrayObject); + // A group of vertices combined based on the indexes + public Mesh(Vertex[] vertices, int[] indices, Material material) { + this.vertices = vertices; + this.indices = indices; + this.material = material; + } - // Putting the position of the vertex into the buffer so the renderer can read it + // Destroy the mesh + public void destroy () { + GL15.glDeleteBuffers(positionBufferObject); + GL15.glDeleteBuffers(indicesBufferObject); + GL15.glDeleteBuffers(colorBufferObject); + GL30.glDeleteBuffers(textureBufferObject); - FloatBuffer positionBuffer = MemoryUtil.memAllocFloat(vertices.length * 3); - float[] positionData = new float[vertices.length * 3]; - for (int i = 0; i < vertices.length; i ++ ) { - positionData[i * 3] = vertices[i].getPosition().getX(); - positionData[i * 3 + 1] = vertices[i].getPosition().getY(); - positionData[i * 3 + 2] = vertices[i].getPosition().getZ(); - } - positionBuffer.put(positionData).flip(); + GL30.glDeleteVertexArrays(vertexArrayObject); - positionBufferObject = storeData(positionBuffer, 0, 3); + material.getTexture().destroy(); - // Putting the color into the buffer so renderer and shader can read it + } - FloatBuffer colorBuffer = MemoryUtil.memAllocFloat(vertices.length * 3); - float[] colorData = new float[vertices.length * 3]; - for (int i = 0; i < vertices.length; i ++ ) { - colorData[i * 3] = vertices[i].getColor().getX(); - colorData[i * 3 + 1] = vertices[i].getColor().getY(); - colorData[i * 3 + 2] = vertices[i].getColor().getZ(); - } - colorBuffer.put(colorData).flip(); + // getters for the mesh - colorBufferObject = storeData(colorBuffer, 1, 3); + public Vertex[] getVertices() { + return vertices; + } - IntBuffer indicesBuffer = MemoryUtil.memAllocInt(indices.length); - indicesBuffer.put(indices).flip(); + public int[] getIndices() { + return indices; + } - indicesBufferObject = GL15.glGenBuffers(); - GL15.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, indicesBufferObject); - GL15.glBufferData(GL15.GL_ELEMENT_ARRAY_BUFFER, indicesBuffer, GL15.GL_STATIC_DRAW); - GL15.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, 0); - } + public int getVertexArrayObject() { + return vertexArrayObject; + } - // Storing data to the buffer at position index (helps with storing color / position) + public int getPositionBufferObject() { + return positionBufferObject; + } - private int storeData(FloatBuffer buffer, int index, int size) { - int bufferID = GL15.glGenBuffers(); - GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, bufferID); - GL15.glBufferData(GL15.GL_ARRAY_BUFFER, buffer, GL15.GL_STATIC_DRAW); - GL20.glVertexAttribPointer(index, size, GL11.GL_FLOAT, false, 0, 0); - GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0); - return bufferID; - } + public int getIndicesBufferObject() { + return indicesBufferObject; + } + + public int getColorBufferObject() { + return colorBufferObject; + } + + public int getTextureBufferObject() { + return textureBufferObject; + } + + + public Material getMaterial() { + return material; + } + + public void create() { + + material.create(); + + // Creates the mesh by formatting the vertices and indices and inputting them to OpenGL + vertexArrayObject = GL30.glGenVertexArrays(); + GL30.glBindVertexArray(vertexArrayObject); + + + // Putting the position of the vertex into the buffer so the renderer can read it + + FloatBuffer positionBuffer = MemoryUtil.memAllocFloat(vertices.length * 3); + float[] positionData = new float[vertices.length * 3]; + for (int i = 0; i < vertices.length; i ++ ) { + positionData[i * 3] = vertices[i].getPosition().getX(); + positionData[i * 3 + 1] = vertices[i].getPosition().getY(); + positionData[i * 3 + 2] = vertices[i].getPosition().getZ(); + } + positionBuffer.put(positionData).flip(); + + positionBufferObject = storeData(positionBuffer, 0, 3); + + // Putting the color into the buffer so renderer and shader can read it + + FloatBuffer colorBuffer = MemoryUtil.memAllocFloat(vertices.length * 3); + float[] colorData = new float[vertices.length * 3]; + for (int i = 0; i < vertices.length; i ++ ) { + colorData[i * 3] = vertices[i].getColor().getX(); + colorData[i * 3 + 1] = vertices[i].getColor().getY(); + colorData[i * 3 + 2] = vertices[i].getColor().getZ(); + } + colorBuffer.put(colorData).flip(); + + colorBufferObject = storeData(colorBuffer, 1, 3); + + // Putting the texture into the buffer so renderer and shader can read it + + FloatBuffer textureBuffer = MemoryUtil.memAllocFloat(vertices.length * 2); + float[] textureData = new float[vertices.length * 2]; + for (int i = 0; i < vertices.length; i ++ ) { + textureData[i * 2] = vertices[i].getTextureCoords().getX(); + textureData[i * 2 + 1] = vertices[i].getTextureCoords().getY(); + } + textureBuffer.put(textureData).flip(); + + textureBufferObject = storeData(textureBuffer, 2, 2); + + IntBuffer indicesBuffer = MemoryUtil.memAllocInt(indices.length); + indicesBuffer.put(indices).flip(); + + indicesBufferObject = GL15.glGenBuffers(); + GL15.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, indicesBufferObject); + GL15.glBufferData(GL15.GL_ELEMENT_ARRAY_BUFFER, indicesBuffer, GL15.GL_STATIC_DRAW); + GL15.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, 0); + } + + // Storing data to the buffer at position index (helps with storing color / position) + + private int storeData(FloatBuffer buffer, int index, int size) { + int bufferID = GL15.glGenBuffers(); + GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, bufferID); + GL15.glBufferData(GL15.GL_ARRAY_BUFFER, buffer, GL15.GL_STATIC_DRAW); + GL20.glVertexAttribPointer(index, size, GL11.GL_FLOAT, false, 0, 0); + GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0); + + return bufferID; + } } diff --git a/src/org/hl/engine/graphics/Renderer.java b/src/org/hl/engine/graphics/Renderer.java index 17f7c53..421f5e4 100644 --- a/src/org/hl/engine/graphics/Renderer.java +++ b/src/org/hl/engine/graphics/Renderer.java @@ -1,34 +1,41 @@ package org.hl.engine.graphics; import org.lwjgl.opengl.GL11; +import org.lwjgl.opengl.GL13; import org.lwjgl.opengl.GL15; import org.lwjgl.opengl.GL30; public class Renderer { - private Shader shader; + private Shader shader; - public Renderer(Shader shader) { - this.shader = shader; - } + public Renderer(Shader shader) { + this.shader = shader; + } - public void renderMesh(Mesh mesh) { + public void renderMesh(Mesh mesh) { - // Renders the mesh by drawing it using triangles (least complicated) - GL30.glBindVertexArray(mesh.getVertexArrayObject()); - GL30.glEnableVertexAttribArray(0); - GL30.glEnableVertexAttribArray(1); - GL15.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, mesh.getIndicesBufferObject()); + // Renders the mesh by drawing it using triangles (least complicated) + GL30.glBindVertexArray(mesh.getVertexArrayObject()); + GL30.glEnableVertexAttribArray(0); + GL30.glEnableVertexAttribArray(1); + GL30.glEnableVertexAttribArray(2); + GL15.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, mesh.getIndicesBufferObject()); - shader.bind(); + GL13.glActiveTexture(GL13.GL_TEXTURE0); - GL11.glDrawElements(GL11.GL_TRIANGLES, mesh.getIndices().length, GL11.GL_UNSIGNED_INT, 0); + GL13.glBindTexture(GL11.GL_TEXTURE_2D, mesh.getMaterial().getTexture().getId()); - shader.unbind(); - GL30.glDisableVertexAttribArray(0); - GL30.glDisableVertexAttribArray(1); - GL30.glBindVertexArray(0); + shader.bind(); - } + GL11.glDrawElements(GL11.GL_TRIANGLES, mesh.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/Shader.java b/src/org/hl/engine/graphics/Shader.java index 5a62d04..7e87109 100644 --- a/src/org/hl/engine/graphics/Shader.java +++ b/src/org/hl/engine/graphics/Shader.java @@ -5,84 +5,84 @@ import org.lwjgl.opengl.GL11; import org.lwjgl.opengl.GL20; public class Shader { - private String vertexFile; - private String fragmentFile; + private String vertexFile; + private String fragmentFile; - private int vertexID, fragmentID, programID; + private int vertexID, fragmentID, programID; - public Shader(String vertexPath, String fragmentPath) { - vertexFile = FileUtils.loadAsString(vertexPath); - fragmentFile = FileUtils.loadAsString(fragmentPath); + public Shader(String vertexPath, String fragmentPath) { + vertexFile = FileUtils.loadAsString(vertexPath); + fragmentFile = FileUtils.loadAsString(fragmentPath); - } + } - public void create() { + public void create() { - // Creates the program - programID = GL20.glCreateProgram(); + // Creates the program + programID = GL20.glCreateProgram(); - // loads the vertex shader - vertexID = GL20.glCreateShader(GL20.GL_VERTEX_SHADER); + // loads the vertex shader + vertexID = GL20.glCreateShader(GL20.GL_VERTEX_SHADER); - GL20.glShaderSource(vertexID, vertexFile); - GL20.glCompileShader(vertexID); + GL20.glShaderSource(vertexID, vertexFile); + GL20.glCompileShader(vertexID); - if (GL20.glGetShaderi(vertexID, GL20.GL_COMPILE_STATUS) == GL11.GL_FALSE) { - System.err.println("Vertex Shader: " + GL20.glGetShaderInfoLog(vertexID)); - System.exit(1); + if (GL20.glGetShaderi(vertexID, GL20.GL_COMPILE_STATUS) == GL11.GL_FALSE) { + System.err.println("Vertex Shader: " + GL20.glGetShaderInfoLog(vertexID)); + System.exit(1); - } + } - // loads the fragment shader - fragmentID = GL20.glCreateShader(GL20.GL_FRAGMENT_SHADER); + // loads the fragment shader + fragmentID = GL20.glCreateShader(GL20.GL_FRAGMENT_SHADER); - GL20.glShaderSource(fragmentID, fragmentFile); - GL20.glCompileShader(fragmentID); + GL20.glShaderSource(fragmentID, fragmentFile); + GL20.glCompileShader(fragmentID); - if (GL20.glGetShaderi(fragmentID, GL20.GL_COMPILE_STATUS) == GL11.GL_FALSE) { - System.err.println("Fragment Shader: " + GL20.glGetShaderInfoLog(fragmentID)); - System.exit(1); + if (GL20.glGetShaderi(fragmentID, GL20.GL_COMPILE_STATUS) == GL11.GL_FALSE) { + System.err.println("Fragment Shader: " + GL20.glGetShaderInfoLog(fragmentID)); + System.exit(1); - } + } - // Attach shaders to program - GL20.glAttachShader(programID, vertexID); - GL20.glAttachShader(programID, fragmentID); + // Attach shaders to program + GL20.glAttachShader(programID, vertexID); + GL20.glAttachShader(programID, fragmentID); - // Link the program - GL20.glLinkProgram(programID); - if (GL20.glGetProgrami(programID, GL20.GL_LINK_STATUS) == GL11.GL_FALSE) { - System.err.println("Program Linking: " + GL20.glGetProgramInfoLog(programID)); - System.exit(1); - return; - } + // Link the program + GL20.glLinkProgram(programID); + if (GL20.glGetProgrami(programID, GL20.GL_LINK_STATUS) == GL11.GL_FALSE) { + System.err.println("Program Linking: " + GL20.glGetProgramInfoLog(programID)); + System.exit(1); + return; + } - // Validate the program - GL20.glValidateProgram(programID); - if (GL20.glGetProgrami(programID, GL20.GL_VALIDATE_STATUS) == GL11.GL_FALSE) { - System.err.println("Program Validation: " + GL20.glGetProgramInfoLog(programID)); - System.exit(1); - return; - } + // Validate the program + GL20.glValidateProgram(programID); + if (GL20.glGetProgrami(programID, GL20.GL_VALIDATE_STATUS) == GL11.GL_FALSE) { + System.err.println("Program Validation: " + GL20.glGetProgramInfoLog(programID)); + System.exit(1); + return; + } - GL20.glDeleteShader(vertexID); - GL20.glDeleteShader(fragmentID); + GL20.glDeleteShader(vertexID); + GL20.glDeleteShader(fragmentID); - } + } - // Bind so we can use the shader - public void bind() { - GL20.glUseProgram(programID); - } + // Bind so we can use the shader + public void bind() { + GL20.glUseProgram(programID); + } - // Unbind the shader after use - public void unbind() { - GL20.glUseProgram(0); - } + // Unbind the shader after use + public void unbind() { + GL20.glUseProgram(0); + } - // Destroy the program - public void destroy() { - GL20.glDeleteProgram(programID); - } + // Destroy the program + public void destroy() { + GL20.glDeleteProgram(programID); + } } diff --git a/src/org/hl/engine/graphics/Texture.java b/src/org/hl/engine/graphics/Texture.java new file mode 100644 index 0000000..5325ae3 --- /dev/null +++ b/src/org/hl/engine/graphics/Texture.java @@ -0,0 +1,133 @@ +package org.hl.engine.graphics; +import static org.lwjgl.opengl.GL46.*; +import static org.lwjgl.stb.STBImage.*; + +import java.nio.ByteBuffer; +import java.nio.IntBuffer; + +import org.lwjgl.system.MemoryStack; + +public class Texture { + private int id; + + private int width; + + private int height; + + private int type; + + private String fileName; + private ByteBuffer imageBuffer; + + private int pixelFormat; + + + public Texture(int width, int height, int pixelFormat) { + this.type = 0; + this.width = width; + this.height = height; + this.pixelFormat = pixelFormat; + } + + public Texture(String fileName) { + this.type = 1; + this.fileName = fileName; + } + + public Texture(ByteBuffer imageBuffer) { + type = 2; + this.imageBuffer = imageBuffer; + } + + public void create() { + if (this.type == 0) { + this.id = glGenTextures(); + glBindTexture(GL_TEXTURE_2D, this.id); + glTexImage2D(GL_TEXTURE_2D, 0, this.pixelFormat, this.width, this.height, 0, this.pixelFormat, GL_FLOAT, (ByteBuffer) null); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + glBindTexture(GL_TEXTURE_2D, 0); + + } else if (this.type == 1) { + ByteBuffer buf; + try(MemoryStack stack = MemoryStack.stackPush()) { + IntBuffer w = stack.mallocInt(1); + IntBuffer h = stack.mallocInt(1); + IntBuffer channels = stack.mallocInt(1); + + buf = stbi_load(this.fileName, w, h, channels, 4); + if(buf == null) { + System.err.println("Image file [" + this.fileName + "] not loaded: " + stbi_failure_reason()); + System.exit(1); + } + + this.width = w.get(); + this.height = h.get(); + } + + this.id = createTexture(buf); + + stbi_image_free(buf); + + } else { + ByteBuffer buf; + try(MemoryStack stack = MemoryStack.stackPush()) { + IntBuffer w = stack.mallocInt(1); + IntBuffer h = stack.mallocInt(1); + IntBuffer channels = stack.mallocInt(1); + + buf = stbi_load_from_memory(this.imageBuffer, w, h, channels, 4); + if(buf == null) { + System.err.println("Image file not loaded: " + stbi_failure_reason()); + System.exit(1); + } + + this.width = w.get(); + this.height = h.get(); + } + + this.id = createTexture(buf); + + stbi_image_free(buf); + + } + + } + + private int createTexture(ByteBuffer buf) { + int textureID = glGenTextures(); + glBindTexture(GL_TEXTURE_2D, textureID); + + glPixelStorei(GL_UNPACK_ALIGNMENT, 1); + + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, buf); + glGenerateMipmap(GL_TEXTURE_2D); + + glBindTexture(GL_TEXTURE_2D, 0); + + return textureID; + } + + public int getWidth() { + return width; + } + + public int getHeight() { + return height; + } + + public int getId() { + return id; + } + + public void destroy() { + glDeleteTextures(id); + } +} + + diff --git a/src/org/hl/engine/graphics/Vertex.java b/src/org/hl/engine/graphics/Vertex.java index 5e2df5b..6124f00 100644 --- a/src/org/hl/engine/graphics/Vertex.java +++ b/src/org/hl/engine/graphics/Vertex.java @@ -1,24 +1,35 @@ package org.hl.engine.graphics; -import org.hl.engine.math.Vector3f; + +import org.hl.engine.math.lalg.*; + public class Vertex { - // Just a vertex + // Just a vertex - private Vector3f position; - private Vector3f color; + private Vector3f position; + private Vector3f color; + private Vector2f textureCoords; - public Vertex (Vector3f position, Vector3f color) { - this.position = position; - this.color = color; - } - public Vector3f getPosition() { - return position; - } + public Vertex (Vector3f position, Vector3f color, Vector2f textureCoords) { + this.position = position; + this.color = color; + this.textureCoords = textureCoords; + } + + public Vector3f getPosition() { + return position; + } + + + public Vector3f getColor() { + return color; + } + + public Vector2f getTextureCoords() { + return textureCoords; + } - public Vector3f getColor() { - return color; - } } diff --git a/src/org/hl/engine/io/Display.java b/src/org/hl/engine/io/Display.java index 0c0c5ec..7a2df59 100644 --- a/src/org/hl/engine/io/Display.java +++ b/src/org/hl/engine/io/Display.java @@ -1,5 +1,7 @@ package org.hl.engine.io; -import org.hl.engine.math.Vector3f; + +import org.hl.engine.math.lalg.Vector3f; +import org.lwjgl.glfw.GLFWErrorCallback; import org.lwjgl.glfw.GLFWVidMode; import org.lwjgl.glfw.GLFWWindowSizeCallback; import org.lwjgl.opengl.GL; @@ -8,205 +10,211 @@ import org.lwjgl.opengl.GL11; import static org.lwjgl.glfw.GLFW.*; public class Display { - private int width, height; - private String windowName; - private long window; - public int frames; - public int previousFrames = frames; - public long time; - public Input input; - private Vector3f background = new Vector3f(0, 0, 0); - private GLFWWindowSizeCallback resizeCallback; - private boolean isResized; - private boolean isFullscreen; - private int[] windowXPos = new int[1]; - private int[] windowYPos = new int[1]; - private GLFWVidMode videoMode; - private int savedPosX; - private int savedPosY; - private int savedWidth; - private int savedHeight; + + private int width, height; + private String windowName; + private long window; + public int frames; + public int previousFrames = frames; + public long time; + public Input input; + private Vector3f background = new Vector3f(0, 0, 0); + private GLFWWindowSizeCallback resizeCallback; + private boolean isResized; + private boolean isFullscreen; + private int[] windowXPos = new int[1]; + private int[] windowYPos = new int[1]; + private GLFWVidMode videoMode; + private int savedPosX; + private int savedPosY; + private int savedWidth; + private int savedHeight; - // Constructor to create the display - public Display (int width, int height, String windowName) { - this.width = width; - this.height = height; - this.windowName = windowName; - } + // Constructor to create the display + public Display (int width, int height, String windowName) { + this.width = width; + this.height = height; + this.windowName = windowName; + } - // Change the window name - public void setWindowName(String windowName) { - this.windowName = windowName; - glfwSetWindowTitle(window, windowName); - } + // Change the window name + public void setWindowName(String windowName) { + this.windowName = windowName; + glfwSetWindowTitle(window, windowName); + } - // Getters for size, name, window, time, and fullScreen - public int getWidth() { - return width; - } - public int getHeight() { - return height; - } - public String getWindowName() { - return windowName; - } - public long getWindow() { - return window; - } - public long getTime() { - return time; - } + // Getters for size, name, window, time, and fullScreen + public int getWidth() { + return width; + } + public int getHeight() { + return height; + } + public String getWindowName() { + return windowName; + } + public long getWindow() { + return window; + } + public long getTime() { + return time; + } - public boolean isFullscreen() { - return isFullscreen; - } + public boolean isFullscreen() { + return isFullscreen; + } - // Makes the screen fullscreen or not based on the argument - public void setFullscreen(boolean fullscreen) { - isFullscreen = fullscreen; - isResized = true; - GL11.glViewport(0, 0, width, height); - if (isFullscreen) { + // Makes the screen fullscreen or not based on the argument + public void setFullscreen(boolean fullscreen) { + isFullscreen = fullscreen; + isResized = true; + GL11.glViewport(0, 0, width, height); + if (isFullscreen) { - int[] xpos = {0}; - int[] ypos = {0}; - glfwGetWindowPos(this.window, xpos, ypos); - savedPosX = xpos[0]; - savedPosY = ypos[0]; + int[] xpos = {0}; + int[] ypos = {0}; + glfwGetWindowPos(this.window, xpos, ypos); + savedPosX = xpos[0]; + savedPosY = ypos[0]; - savedWidth = width; - savedHeight = height; - glfwGetWindowPos(window, windowXPos, windowYPos); - glfwSetWindowMonitor(window, glfwGetPrimaryMonitor(), 0, 0, videoMode.width(), videoMode.height(), 0); - } else { - glfwSetWindowMonitor(window, 0, savedPosX, savedPosY, savedWidth, savedHeight, 0); - } - } + savedWidth = width; + savedHeight = height; + glfwGetWindowPos(window, windowXPos, windowYPos); + glfwSetWindowMonitor(window, glfwGetPrimaryMonitor(), 0, 0, videoMode.width(), videoMode.height(), 0); + } else { + glfwSetWindowMonitor(window, 0, savedPosX, savedPosY, savedWidth, savedHeight, 0); + } + } - // resized getter + // resized getter - public boolean isResized() { - return isResized; - } + public boolean isResized() { + return isResized; + } - // Creates the window (should go in the init() function of your Main program) - public void create() { + // Creates the window (should go in the init() function of your Main program) + public void create() throws Exception { - // initializing glfw - if (!glfwInit()) { - System.err.println("Failed to initialize GLFW! "); - System.exit(1); - } + GLFWErrorCallback.createPrint(System.err).set(); - glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); - glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3); - glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL11.GL_TRUE); - glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); + // initializing glfw + if (!glfwInit()) { + //System.err.println("Failed to initialize GLFW! "); + //System.exit(1); + throw new Exception("Failed to initialize GLFW! "); + } - //Creating window - glfwWindowHint(GLFW_VISIBLE, GLFW_FALSE); - window = glfwCreateWindow(this.width, this.height, this.windowName, isFullscreen ? glfwGetPrimaryMonitor():0, 0); - if (window == 0) { - System.err.println("Failed to create window! "); - System.exit(1); - } + glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 4); + glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 1); + glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL11.GL_TRUE); + glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); - // Setting size of window + //Creating window + glfwWindowHint(GLFW_VISIBLE, GLFW_FALSE); + window = glfwCreateWindow(this.width, this.height, this.windowName, isFullscreen ? glfwGetPrimaryMonitor():0, 0); + if (window == 0) { + //System.err.println("Failed to create window! "); + //System.exit(1); + throw new Exception("Failed to create window! "); + } - videoMode = glfwGetVideoMode(glfwGetPrimaryMonitor()); - windowXPos[0] = (videoMode.width() - this.width) / 2; - windowYPos[0] = (videoMode.height() - this.height ) / 2; - glfwSetWindowPos(window, windowXPos[0], windowYPos[0]); + // Setting size of window + + videoMode = glfwGetVideoMode(glfwGetPrimaryMonitor()); + windowXPos[0] = (videoMode.width() - this.width) / 2; + windowYPos[0] = (videoMode.height() - this.height ) / 2; + glfwSetWindowPos(window, windowXPos[0], windowYPos[0]); - // Graphics - glfwMakeContextCurrent(window); - GL.createCapabilities(); + // Graphics + glfwMakeContextCurrent(window); + GL.createCapabilities(); - GL11.glEnable(GL11.GL_DEPTH_TEST); + GL11.glEnable(GL11.GL_DEPTH_TEST); - callBacks(); - glfwShowWindow(window); - glfwSwapInterval(1); + callBacks(); + glfwShowWindow(window); + glfwSwapInterval(1); - // setting time + // setting time - time = System.currentTimeMillis(); + time = System.currentTimeMillis(); - } + } - // Creating the resize callback (all other callbacks were removed and are now in Input class) - private void callBacks() { + // Creating the resize callback (all other callbacks were removed and are now in Input class) + private void callBacks() { - resizeCallback = new GLFWWindowSizeCallback() { + resizeCallback = new GLFWWindowSizeCallback() { - @Override - public void invoke(long window, int w, int h) { - width = w; - height = h; - isResized = true; - } - }; + @Override + public void invoke(long window, int w, int h) { + width = w; + height = h; + isResized = true; + } + }; - glfwSetWindowSizeCallback(window, resizeCallback); - } + glfwSetWindowSizeCallback(window, resizeCallback); + } - // Refreshes the screen, resets frame count - public int update() { - if (isResized) { - GL11.glViewport(0, 0, width, height); - isResized = false; - } - GL11.glClearColor(background.getX(), background.getY(), background.getZ(), 1.0F); - GL11.glClear(GL11.GL_COLOR_BUFFER_BIT | GL11.GL_DEPTH_BUFFER_BIT); - glfwPollEvents(); - frames++; - if (System.currentTimeMillis() > time + 1000) { - previousFrames = frames; - time = System.currentTimeMillis(); - frames = 0; - return frames; - } else { - return previousFrames; + // Refreshes the screen, resets frame count + public int update() { + if (isResized) { + GL11.glViewport(0, 0, width, height); + isResized = false; + } + GL11.glClearColor(background.getX(), background.getY(), background.getZ(), 1.0F); + GL11.glClear(GL11.GL_COLOR_BUFFER_BIT | GL11.GL_DEPTH_BUFFER_BIT); + glfwPollEvents(); + frames++; + if (System.currentTimeMillis() > time + 1000) { + previousFrames = frames; + time = System.currentTimeMillis(); + frames = 0; + return frames; + } else { + return previousFrames; - } - } + } + } - // Terminates the program (making WindowShouldClose) + // Terminates the program (making WindowShouldClose) - public void terminate() { - glfwSetWindowShouldClose(window, true); - } + public void terminate() { + glfwSetWindowShouldClose(window, true); + } - // Completely DESTROYS the window - public void destroy() { - resizeCallback.free(); - glfwDestroyWindow(window); - glfwTerminate(); - } + // Completely DESTROYS the window + public void destroy() { + resizeCallback.free(); + glfwSetErrorCallback(null).free(); + glfwDestroyWindow(window); + glfwTerminate(); + } - // switches the buffers (for rendering) + // switches the buffers (for rendering) - public void swapBuffers() { - glfwSwapBuffers(window); - } + public void swapBuffers() { + glfwSwapBuffers(window); + } - // get whether the window should close - public boolean shouldClose() { - return glfwWindowShouldClose(window); - } + // get whether the window should close + public boolean shouldClose() { + return glfwWindowShouldClose(window); + } - // changes the background color + // changes the background color - public void setBackgroundColor(float r, float g, float b) { - background.setVector(r, g, b); - } + public void setBackgroundColor(float r, float g, float b) { + background.setVector(r, g, b); + } } \ No newline at end of file diff --git a/src/org/hl/engine/io/Input.java b/src/org/hl/engine/io/Input.java index 7b7f258..5ceeeb7 100644 --- a/src/org/hl/engine/io/Input.java +++ b/src/org/hl/engine/io/Input.java @@ -7,115 +7,115 @@ import java.util.Arrays; import static org.lwjgl.glfw.GLFW.*; public class Input { - private boolean[] keys = new boolean[GLFW.GLFW_KEY_LAST]; - private boolean[] buttons = new boolean[GLFW.GLFW_MOUSE_BUTTON_LAST]; + private boolean[] keys = new boolean[GLFW.GLFW_KEY_LAST]; + private boolean[] buttons = new boolean[GLFW.GLFW_MOUSE_BUTTON_LAST]; - private int[] keyState = new int[GLFW.GLFW_KEY_LAST]; - private int[] buttonState = new int[GLFW.GLFW_MOUSE_BUTTON_LAST]; + private int[] keyState = new int[GLFW.GLFW_KEY_LAST]; + private int[] buttonState = new int[GLFW.GLFW_MOUSE_BUTTON_LAST]; - private long window; - private Display display; + private long window; + private Display display; - private boolean inWindow; + private boolean inWindow; - private double mouseX, mouseY; - private double scrollX, scrollY; + private double mouseX, mouseY; + private double scrollX, scrollY; - // Sets up the callbacks based on the window - public Input(Display d) { - this.display = d; - this.window = this.display.getWindow(); + // Sets up the callbacks based on the window + public Input(Display d) { + this.display = d; + this.window = this.display.getWindow(); - glfwSetKeyCallback(this.window, (window, key, scancode, action, mods) -> { - keys[key] = action != GLFW.GLFW_RELEASE; - keyState[key] = action; - }); + glfwSetKeyCallback(this.window, (window, key, scancode, action, mods) -> { + keys[key] = action != GLFW.GLFW_RELEASE; + keyState[key] = action; + }); - glfwSetMouseButtonCallback(this.window, (window, button, action, mods) -> { - buttons[button] = action != GLFW.GLFW_RELEASE; - buttonState[button] = action; - }); + glfwSetMouseButtonCallback(this.window, (window, button, action, mods) -> { + buttons[button] = action != GLFW.GLFW_RELEASE; + buttonState[button] = action; + }); - glfwSetCursorPosCallback(this.window, (window, xpos, ypos) -> { - mouseX = xpos; - mouseY = ypos; - }); + glfwSetCursorPosCallback(this.window, (window, xpos, ypos) -> { + mouseX = xpos; + mouseY = ypos; + }); - glfwSetCursorEnterCallback(this.window, (window, entered) -> { - inWindow = entered; - }); + glfwSetCursorEnterCallback(this.window, (window, entered) -> { + inWindow = entered; + }); - glfwSetScrollCallback(this.window, (window, xoffset, yoffset) -> { - scrollX += xoffset; - scrollY += yoffset; - }); + glfwSetScrollCallback(this.window, (window, xoffset, yoffset) -> { + scrollX += xoffset; + scrollY += yoffset; + }); - resetKeyboard(); - resetButtons(); - } + resetKeyboard(); + resetButtons(); + } - // All states (isDown will return whether it has been held down but Press only returns a press) + // All states (isDown will return whether it has been held down but Press only returns a press) - public boolean isKeyDown(int key) { - return keys[key]; - } + public boolean isKeyDown(int key) { + return keys[key]; + } - public boolean keyPress(int key) { - return keyState[key] == GLFW.GLFW_PRESS; - } + public boolean keyPress(int key) { + return keyState[key] == GLFW.GLFW_PRESS; + } - public boolean keyReleased(int key) { - return keyState[key] == GLFW.GLFW_RELEASE; - } + public boolean keyReleased(int key) { + return keyState[key] == GLFW.GLFW_RELEASE; + } - public boolean isButtonDown(int button) { - return buttons[button]; - } + public boolean isButtonDown(int button) { + return buttons[button]; + } - public boolean buttonPress(int button) { - return buttonState[button] == GLFW.GLFW_PRESS; - } + public boolean buttonPress(int button) { + return buttonState[button] == GLFW.GLFW_PRESS; + } - public boolean buttonReleased(int button) { - return buttonState[button] == GLFW.GLFW_RELEASE; - } + public boolean buttonReleased(int button) { + return buttonState[button] == GLFW.GLFW_RELEASE; + } - // Resets keyboard and buttons so the presses will only be registered once - private void resetKeyboard() { - Arrays.fill(keyState, -1); - } + // Resets keyboard and buttons so the presses will only be registered once + private void resetKeyboard() { + Arrays.fill(keyState, -1); + } - private void resetButtons() { - Arrays.fill(buttonState, -1); - } + private void resetButtons() { + Arrays.fill(buttonState, -1); + } - // This function should only be called after all input has been taken inside the loop. It must be called if keyPress and buttonPress should work. + // This function should only be called after all input has been taken inside the loop. It must be called if keyPress and buttonPress should work. - public void reset() { - resetKeyboard(); - resetButtons(); - } + public void reset() { + resetKeyboard(); + resetButtons(); + } - // Scroll, mouse, and window getters + // Scroll, mouse, and window getters - public double getMouseX() { - return mouseX; - } + public double getMouseX() { + return mouseX; + } - public double getMouseY() { - return mouseY; - } + public double getMouseY() { + return mouseY; + } - public boolean inWindow() { - return inWindow; - } + public boolean inWindow() { + return inWindow; + } - public double getScrollX() { - return scrollX; - } + public double getScrollX() { + return scrollX; + } - public double getScrollY() { - return scrollY; - } + public double getScrollY() { + return scrollY; + } } diff --git a/src/org/hl/engine/math/Vector3f.java b/src/org/hl/engine/math/Vector3f.java deleted file mode 100644 index afc8a6b..0000000 --- a/src/org/hl/engine/math/Vector3f.java +++ /dev/null @@ -1,43 +0,0 @@ -package org.hl.engine.math; - - -public class Vector3f { - private float x, y, z; - - public Vector3f(float x, float y, float z) { - this.x = x; - this.y = y; - this.z = z; - } - - public void setVector(float x, float y, float z) { - this.x = x; - this.y = y; - this.z = z; - } - - public float getX() { - return x; - } - - public void setX(float x) { - this.x = x; - } - - public float getY() { - return y; - } - - public void setY(float y) { - this.y = y; - } - - public float getZ() { - return z; - } - - public void setZ(float z) { - this.z = z; - } -} - diff --git a/src/org/hl/engine/math/lalg/Vector2f.java b/src/org/hl/engine/math/lalg/Vector2f.java new file mode 100644 index 0000000..8401f3e --- /dev/null +++ b/src/org/hl/engine/math/lalg/Vector2f.java @@ -0,0 +1,33 @@ +package org.hl.engine.math.lalg; + +public class Vector2f { + private float x; + private float y; + + // Just a vector if you know what I mean + public Vector2f (float x, float y) { + this.x = x; + this.y = y; + } + + public void setVector(float x, float y) { + this.x = x; + this.y = y; + } + + public float getX() { + return x; + } + + public void setX(float x) { + this.x = x; + } + + public float getY() { + return y; + } + + public void setY(float y) { + this.y = y; + } +} diff --git a/src/org/hl/engine/math/lalg/Vector3f.java b/src/org/hl/engine/math/lalg/Vector3f.java new file mode 100644 index 0000000..d2af940 --- /dev/null +++ b/src/org/hl/engine/math/lalg/Vector3f.java @@ -0,0 +1,46 @@ +package org.hl.engine.math.lalg; + + +public class Vector3f { + private float x; + private float y; + private float z; + + // Just a vector if you know what I mean + public Vector3f (float x, float y, float z) { + this.x = x; + this.y = y; + this.z = z; + } + + public void setVector(float x, float y, float z) { + this.x = x; + this.y = y; + this.z = z; + } + + public float getX() { + return x; + } + + public void setX(float x) { + this.x = x; + } + + public float getY() { + return y; + } + + public void setY(float y) { + this.y = y; + } + + public float getZ() { + return z; + } + + public void setZ(float z) { + this.z = z; + } +} + diff --git a/src/org/hl/engine/math/lalg/Vector4f.java b/src/org/hl/engine/math/lalg/Vector4f.java new file mode 100644 index 0000000..3370f4f --- /dev/null +++ b/src/org/hl/engine/math/lalg/Vector4f.java @@ -0,0 +1,55 @@ +package org.hl.engine.math.lalg; + +public class Vector4f { + private float x; + private float y; + private float z; + private float a; + + // Just a vector if you know what I mean + public Vector4f (float x, float y, float z, float a) { + this.x = x; + this.y = y; + this.z = z; + this.a = a; + } + + public void setVector(float x, float y, float z, float a) { + this.x = x; + this.y = y; + this.z = z; + this.a = a; + } + + public float getX() { + return x; + } + + public void setX(float x) { + this.x = x; + } + + public float getY() { + return y; + } + + public void setY(float y) { + this.y = y; + } + + public float getZ() { + return z; + } + + public void setZ(float z) { + this.z = z; + } + + public float getA() { + return a; + } + + public void setA(float a) { + this.a = a; + } +} diff --git a/src/org/hl/engine/utils/FileUtils.java b/src/org/hl/engine/utils/FileUtils.java index f1a1390..a314565 100644 --- a/src/org/hl/engine/utils/FileUtils.java +++ b/src/org/hl/engine/utils/FileUtils.java @@ -7,22 +7,22 @@ import java.io.InputStreamReader; public class FileUtils { - // Reads a filepath and returns that as a String - public static String loadAsString(String filepath) { - StringBuilder result = new StringBuilder(); - try (BufferedReader reader = new BufferedReader(new - InputStreamReader(FileUtils.class.getResourceAsStream(filepath)))) { - String line = ""; - while ((line = reader.readLine()) != null) { - result.append(line) .append("\n"); - } - } catch (Exception e) { - System.err.println("Couldn't get the file at " + filepath); - System.exit(1); + // Reads a filepath and returns that as a String + public static String loadAsString(String filepath) { + StringBuilder result = new StringBuilder(); + try (BufferedReader reader = new BufferedReader(new + InputStreamReader(FileUtils.class.getResourceAsStream(filepath)))) { + String line = ""; + while ((line = reader.readLine()) != null) { + result.append(line) .append("\n"); + } + } catch (Exception e) { + System.err.println("Couldn't get the file at " + filepath); + System.exit(1); - } + } - return result.toString(); - } + return result.toString(); + } } diff --git a/src/resources/shaders/mainFragment.glsl b/src/resources/shaders/mainFragment.glsl index 85d4098..ba10a51 100644 --- a/src/resources/shaders/mainFragment.glsl +++ b/src/resources/shaders/mainFragment.glsl @@ -1,8 +1,11 @@ -#version 330 core +#version 410 core -in vec3 passColor; -out vec4 outColor; + +layout(location = 0) in vec3 passColor; +layout(location = 1) in vec2 passTextureCoord; + +layout(location = 0) out vec4 outColor; void main() { outColor = vec4(passColor, 1.0); diff --git a/src/resources/shaders/mainVertex.glsl b/src/resources/shaders/mainVertex.glsl index 9ae1698..c795fa8 100644 --- a/src/resources/shaders/mainVertex.glsl +++ b/src/resources/shaders/mainVertex.glsl @@ -1,11 +1,21 @@ -#version 330 core +#version 410 core + + layout(location = 0) in vec3 position; layout(location = 1) in vec3 color; +layout(location = 2) in vec2 textureCoord; + + + + +layout(location = 0) out vec3 passColor; +layout(location = 1) out vec2 passTextureCoord; -out vec3 passColor; void main() { gl_Position = vec4(position, 1.0); passColor = color; + + passTextureCoord = textureCoord; } \ No newline at end of file