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