diff --git a/src/Test.java b/src/Test.java index 1c153f3..5b2423e 100644 --- a/src/Test.java +++ b/src/Test.java @@ -1,10 +1,7 @@ -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.*; import org.lwjgl.glfw.GLFW; @@ -18,16 +15,16 @@ public class Test { 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) ), + 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 Material("/resources/textures/testimg.png")); public void run() { init(); diff --git a/src/org/hl/engine/graphics/Material.java b/src/org/hl/engine/graphics/Material.java index becaef4..52321c5 100644 --- a/src/org/hl/engine/graphics/Material.java +++ b/src/org/hl/engine/graphics/Material.java @@ -10,6 +10,8 @@ public class Material { private Texture texture; + private String path; + private BufferedImage image; private int width, height; @@ -17,10 +19,12 @@ public class Material { public Material(String path) { - this.image = TextureLoader.loadImage(path); //The path is inside the jar file + this.path = path; } public void create() { + + this.image = TextureLoader.loadImage(path); //The path is inside the jar file this.width = this.image.getWidth(); this.height = this.image.getHeight(); this.textureID = TextureLoader.loadTexture(image); diff --git a/src/org/hl/engine/graphics/Mesh.java b/src/org/hl/engine/graphics/Mesh.java index b6d6194..99e4e49 100644 --- a/src/org/hl/engine/graphics/Mesh.java +++ b/src/org/hl/engine/graphics/Mesh.java @@ -12,12 +12,14 @@ import java.nio.IntBuffer; public class Mesh { private Vertex[] vertices; private int[] indices; - private int vertexArrayObject, positionBufferObject, indicesBufferObject, colorBufferObject; + private int vertexArrayObject, positionBufferObject, indicesBufferObject, colorBufferObject, textureBufferObject; + private Material material; // A group of vertices combined based on the indexes - public Mesh(Vertex[] vertices, int[] indices) { + public Mesh(Vertex[] vertices, int[] indices, Material material) { this.vertices = vertices; this.indices = indices; + this.material = material; } // Destroy the mesh @@ -25,8 +27,12 @@ public class Mesh { GL15.glDeleteBuffers(positionBufferObject); GL15.glDeleteBuffers(indicesBufferObject); GL15.glDeleteBuffers(colorBufferObject); + GL30.glDeleteBuffers(textureBufferObject); GL30.glDeleteVertexArrays(vertexArrayObject); + + material.destroy(); + } // getters for the mesh @@ -55,8 +61,18 @@ public class Mesh { 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); @@ -88,6 +104,18 @@ public class Mesh { 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(); diff --git a/src/org/hl/engine/graphics/Renderer.java b/src/org/hl/engine/graphics/Renderer.java index 17f7c53..e85fca5 100644 --- a/src/org/hl/engine/graphics/Renderer.java +++ b/src/org/hl/engine/graphics/Renderer.java @@ -1,6 +1,7 @@ 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; @@ -19,8 +20,13 @@ public class Renderer { GL30.glBindVertexArray(mesh.getVertexArrayObject()); GL30.glEnableVertexAttribArray(0); GL30.glEnableVertexAttribArray(1); + GL30.glEnableVertexAttribArray(2); GL15.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, mesh.getIndicesBufferObject()); + GL13.glActiveTexture(GL13.GL_TEXTURE0); + + GL13.glBindTexture(GL11.GL_TEXTURE_2D, mesh.getMaterial().getTextureID()); + shader.bind(); GL11.glDrawElements(GL11.GL_TRIANGLES, mesh.getIndices().length, GL11.GL_UNSIGNED_INT, 0); @@ -28,6 +34,7 @@ public class Renderer { shader.unbind(); GL30.glDisableVertexAttribArray(0); GL30.glDisableVertexAttribArray(1); + GL30.glDisableVertexAttribArray(2); GL30.glBindVertexArray(0); } diff --git a/src/org/hl/engine/graphics/Vertex.java b/src/org/hl/engine/graphics/Vertex.java index 5e2df5b..4a2d4ce 100644 --- a/src/org/hl/engine/graphics/Vertex.java +++ b/src/org/hl/engine/graphics/Vertex.java @@ -1,6 +1,6 @@ package org.hl.engine.graphics; -import org.hl.engine.math.Vector3f; +import org.hl.engine.math.lalg.*; public class Vertex { @@ -8,8 +8,9 @@ public class Vertex { private Vector3f position; private Vector3f color; + private Vector2f textureCoords; - public Vertex (Vector3f position, Vector3f color) { + public Vertex (Vector3f position, Vector3f color, Vector2f texture) { this.position = position; this.color = color; } @@ -21,4 +22,8 @@ public class Vertex { public Vector3f getColor() { return color; } + + public Vector2f getTextureCoords() { + return textureCoords; + } } diff --git a/src/org/hl/engine/io/Display.java b/src/org/hl/engine/io/Display.java index 0c0c5ec..d9126f7 100644 --- a/src/org/hl/engine/io/Display.java +++ b/src/org/hl/engine/io/Display.java @@ -1,5 +1,5 @@ package org.hl.engine.io; -import org.hl.engine.math.Vector3f; +import org.hl.engine.math.lalg.Vector3f; import org.lwjgl.glfw.GLFWVidMode; import org.lwjgl.glfw.GLFWWindowSizeCallback; import org.lwjgl.opengl.GL; @@ -102,8 +102,8 @@ public class Display { System.exit(1); } - glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); - glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3); + glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 4); + glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 6); glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL11.GL_TRUE); glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); 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..e1e990c --- /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/Vector3f.java b/src/org/hl/engine/math/lalg/Vector3f.java similarity index 95% rename from src/org/hl/engine/math/Vector3f.java rename to src/org/hl/engine/math/lalg/Vector3f.java index fa1da5e..b2a87f0 100644 --- a/src/org/hl/engine/math/Vector3f.java +++ b/src/org/hl/engine/math/lalg/Vector3f.java @@ -1,4 +1,4 @@ -package org.hl.engine.math; +package org.hl.engine.math.lalg; public class Vector3f { private float x; diff --git a/src/resources/shaders/mainFragment.glsl b/src/resources/shaders/mainFragment.glsl index 85d4098..4be6a4c 100644 --- a/src/resources/shaders/mainFragment.glsl +++ b/src/resources/shaders/mainFragment.glsl @@ -1,9 +1,12 @@ -#version 330 core +#version 460 core in vec3 passColor; +in vec2 passTextureCoord; out vec4 outColor; +uniform sampler2D tex; + void main() { - outColor = vec4(passColor, 1.0); + outColor = texture(tex, passTextureCoord); } diff --git a/src/resources/shaders/mainVertex.glsl b/src/resources/shaders/mainVertex.glsl index 9ae1698..013665a 100644 --- a/src/resources/shaders/mainVertex.glsl +++ b/src/resources/shaders/mainVertex.glsl @@ -1,11 +1,14 @@ -#version 330 core +#version 460 core -layout(location = 0) in vec3 position; -layout(location = 1) in vec3 color; +in vec3 position; +in vec3 color; +in vec2 textureCoord; out vec3 passColor; +out vec2 passTextureCoord; void main() { gl_Position = vec4(position, 1.0); passColor = color; + passTextureCoord = textureCoord; } \ No newline at end of file diff --git a/src/resources/textures/testimg.png b/src/resources/textures/testimg.png new file mode 100644 index 0000000..ffe963e Binary files /dev/null and b/src/resources/textures/testimg.png differ