diff --git a/Rendr/.idea/.gitignore b/Rendr/.idea/.gitignore
new file mode 100644
index 0000000..73f69e0
--- /dev/null
+++ b/Rendr/.idea/.gitignore
@@ -0,0 +1,8 @@
+# Default ignored files
+/shelf/
+/workspace.xml
+# Datasource local storage ignored files
+/dataSources/
+/dataSources.local.xml
+# Editor-based HTTP Client requests
+/httpRequests/
diff --git a/Rendr/.idea/libraries/lwjgl.xml b/Rendr/.idea/libraries/lwjgl.xml
new file mode 100644
index 0000000..f15c61d
--- /dev/null
+++ b/Rendr/.idea/libraries/lwjgl.xml
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Rendr/.idea/misc.xml b/Rendr/.idea/misc.xml
new file mode 100644
index 0000000..98cf9b9
--- /dev/null
+++ b/Rendr/.idea/misc.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Rendr/.idea/modules.xml b/Rendr/.idea/modules.xml
new file mode 100644
index 0000000..9bbb5f0
--- /dev/null
+++ b/Rendr/.idea/modules.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Rendr/.idea/uiDesigner.xml b/Rendr/.idea/uiDesigner.xml
new file mode 100644
index 0000000..e96534f
--- /dev/null
+++ b/Rendr/.idea/uiDesigner.xml
@@ -0,0 +1,124 @@
+
+
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+
+
+
+ -
+
+
+
+
+
+ -
+
+
+
+
+
+ -
+
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+
+
+ -
+
+
+ -
+
+
+
+
+
\ No newline at end of file
diff --git a/Rendr/Rendr.iml b/Rendr/Rendr.iml
new file mode 100644
index 0000000..0f9153e
--- /dev/null
+++ b/Rendr/Rendr.iml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Rendr/lib/natives/OpenAL32.dll b/Rendr/lib/natives/OpenAL32.dll
new file mode 100644
index 0000000..1f69e94
Binary files /dev/null and b/Rendr/lib/natives/OpenAL32.dll differ
diff --git a/Rendr/lib/natives/OpenAL64.dll b/Rendr/lib/natives/OpenAL64.dll
new file mode 100644
index 0000000..6f2a2fe
Binary files /dev/null and b/Rendr/lib/natives/OpenAL64.dll differ
diff --git a/Rendr/lib/natives/jinput-dx8.dll b/Rendr/lib/natives/jinput-dx8.dll
new file mode 100644
index 0000000..6d27ad5
Binary files /dev/null and b/Rendr/lib/natives/jinput-dx8.dll differ
diff --git a/Rendr/lib/natives/jinput-dx8_64.dll b/Rendr/lib/natives/jinput-dx8_64.dll
new file mode 100644
index 0000000..6730589
Binary files /dev/null and b/Rendr/lib/natives/jinput-dx8_64.dll differ
diff --git a/Rendr/lib/natives/jinput-raw.dll b/Rendr/lib/natives/jinput-raw.dll
new file mode 100644
index 0000000..ce1d162
Binary files /dev/null and b/Rendr/lib/natives/jinput-raw.dll differ
diff --git a/Rendr/lib/natives/jinput-raw_64.dll b/Rendr/lib/natives/jinput-raw_64.dll
new file mode 100644
index 0000000..3d2b3ad
Binary files /dev/null and b/Rendr/lib/natives/jinput-raw_64.dll differ
diff --git a/Rendr/lib/natives/lwjgl.dll b/Rendr/lib/natives/lwjgl.dll
new file mode 100644
index 0000000..bba9b3d
Binary files /dev/null and b/Rendr/lib/natives/lwjgl.dll differ
diff --git a/Rendr/lib/natives/lwjgl64.dll b/Rendr/lib/natives/lwjgl64.dll
new file mode 100644
index 0000000..1267747
Binary files /dev/null and b/Rendr/lib/natives/lwjgl64.dll differ
diff --git a/Rendr/out/production/Rendr/Shaders/fragmentShader.glsl b/Rendr/out/production/Rendr/Shaders/fragmentShader.glsl
new file mode 100644
index 0000000..4dc8ade
--- /dev/null
+++ b/Rendr/out/production/Rendr/Shaders/fragmentShader.glsl
@@ -0,0 +1,13 @@
+#version 400 core
+
+in vec3 color;
+in vec2 passUvs;
+
+out vec4 outColor;
+
+uniform sampler2D textureSampler;
+
+void main(void)
+{
+ outColor = texture(textureSampler, passUvs);
+}
\ No newline at end of file
diff --git a/Rendr/out/production/Rendr/Shaders/vertexShader.glsl b/Rendr/out/production/Rendr/Shaders/vertexShader.glsl
new file mode 100644
index 0000000..a513114
--- /dev/null
+++ b/Rendr/out/production/Rendr/Shaders/vertexShader.glsl
@@ -0,0 +1,13 @@
+#version 400 core
+
+in vec3 position;
+in vec2 uvs;
+
+out vec3 color;
+out vec2 passUvs;
+
+void main(void)
+{
+ gl_Position = vec4(position.x, position.y, position.z, 1.0);
+ passUvs = uvs;
+}
\ No newline at end of file
diff --git a/Rendr/res/mossyBricks.png b/Rendr/res/mossyBricks.png
new file mode 100644
index 0000000..e66409f
Binary files /dev/null and b/Rendr/res/mossyBricks.png differ
diff --git a/Rendr/src/EngineTest/MainGameLoop.java b/Rendr/src/EngineTest/MainGameLoop.java
new file mode 100644
index 0000000..a4988c3
--- /dev/null
+++ b/Rendr/src/EngineTest/MainGameLoop.java
@@ -0,0 +1,64 @@
+package EngineTest;
+
+import RenderEngine.DisplayManager;
+import RenderEngine.Loader;
+import models.RawModel;
+import RenderEngine.Renderer;
+import Shaders.StaticShader;
+import models.TexturedModel;
+import org.lwjgl.opengl.Display;
+import textures.ModelTexture;
+
+public class MainGameLoop
+{
+ /**
+ * A test class of the render engine
+ * @param args
+ */
+
+ public static void main(String[] args)
+ {
+ DisplayManager.createDisplay("Rendr");
+
+ Loader loader = new Loader();
+ Renderer renderer = new Renderer();
+ StaticShader shader = new StaticShader();
+
+ float[] vertices =
+ {
+ -.5f, .5f, 0,
+ -.5f, -.5f, 0,
+ .5f, -.5f, 0,
+ .5f, .5f, 0
+ };
+ int[] indices =
+ {
+ 0, 1, 3,
+ 3, 1, 2,
+ };
+ float[] uvs =
+ {
+ 0, 0,
+ 0, 1,
+ 1, 1,
+ 1, 0
+ };
+
+ RawModel model = loader.loadToVAO(vertices, indices, uvs);
+ ModelTexture texture = new ModelTexture(loader.loadTexture("mossyBricks"));
+ TexturedModel texturedModel = new TexturedModel(model, texture);
+
+ while(!Display.isCloseRequested())
+ {
+ renderer.prepare(0, 0, 0);
+ shader.start();
+ renderer.render(texturedModel);
+ shader.stop();
+ DisplayManager.updateDisplay();
+ }
+
+ shader.clear();
+ loader.clear();
+ DisplayManager.closeDisplay();
+ }
+}
diff --git a/Rendr/src/RenderEngine/DisplayManager.java b/Rendr/src/RenderEngine/DisplayManager.java
new file mode 100644
index 0000000..b4a7b11
--- /dev/null
+++ b/Rendr/src/RenderEngine/DisplayManager.java
@@ -0,0 +1,42 @@
+package RenderEngine;
+
+import org.lwjgl.LWJGLException;
+import org.lwjgl.opengl.*;
+
+public class DisplayManager
+{
+ private static final int width = 1280, height = 700;
+ private static final int fps = 60;
+
+ //creates a new display with openGL viewport in it
+ public static void createDisplay(String title)
+ {
+ ContextAttribs attribs = new ContextAttribs(3, 2)
+ .withForwardCompatible(true).withProfileCore(true);
+
+ try
+ {
+ Display.setDisplayMode(new DisplayMode(width, height));
+ Display.create(new PixelFormat(), attribs);
+ Display.setTitle(title);
+ } catch (LWJGLException e)
+ {
+ e.printStackTrace();
+ }
+
+ GL11.glViewport(0, 0, width, height);
+ }
+
+ //updates the display (limited to the given fps)
+ public static void updateDisplay()
+ {
+ Display.sync(fps);
+ Display.update();
+ }
+
+ //destroys the display
+ public static void closeDisplay()
+ {
+ Display.destroy();
+ }
+}
diff --git a/Rendr/src/RenderEngine/Loader.java b/Rendr/src/RenderEngine/Loader.java
new file mode 100644
index 0000000..f351cf6
--- /dev/null
+++ b/Rendr/src/RenderEngine/Loader.java
@@ -0,0 +1,132 @@
+package RenderEngine;
+
+import models.RawModel;
+import org.lwjgl.BufferUtils;
+import org.lwjgl.opengl.GL11;
+import org.lwjgl.opengl.GL15;
+import org.lwjgl.opengl.GL20;
+import org.lwjgl.opengl.GL30;
+import org.newdawn.slick.opengl.Texture;
+import org.newdawn.slick.opengl.TextureLoader;
+
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.nio.FloatBuffer;
+import java.nio.IntBuffer;
+import java.util.ArrayList;
+import java.util.List;
+
+public class Loader
+{
+ private List vaos = new ArrayList<>();
+ private List vbos = new ArrayList<>();
+ private List textures = new ArrayList<>();
+
+ public RawModel loadToVAO(float[] vertices, int[] indices, float[] uvs)
+ {
+ //create a new vao
+ int vaoID = createVAO();
+ bindIndexBuffer(indices);
+ storeDataToAttList(0, 3, vertices);
+ storeDataToAttList(1, 2, uvs);
+ unbindVAO();
+ return new RawModel(vaoID, indices.length);
+ }
+
+ public int loadTexture(String fileName)
+ {
+ Texture texture = null;
+ try
+ {
+ texture = TextureLoader.getTexture("PNG", new FileInputStream("res/"+fileName+".png"));
+ } catch (IOException e)
+ {
+ e.printStackTrace();
+ }
+
+ int textureID = texture.getTextureID();
+ textures.add(textureID);
+ return textureID;
+ }
+
+ public void clear()
+ {
+ //delete all the vaos from memory
+ for(int vao:vaos)
+ {
+ GL30.glDeleteVertexArrays(vao);
+ }
+
+ //delete all the vbos from memory
+ for(int vbo:vbos)
+ {
+ GL15.glDeleteBuffers(vbo);
+ }
+
+ //delete all the textures from memory
+ for(int texture:textures)
+ {
+ GL11.glDeleteTextures(texture);
+ }
+ }
+
+ private int createVAO()
+ {
+ //generate a new vao and store as an int pointer
+ int vaoID = GL30.glGenVertexArrays();
+ vaos.add(vaoID);
+ //bind the current vao
+ GL30.glBindVertexArray(vaoID);
+ return vaoID;
+ }
+
+ private void storeDataToAttList(int attNumber, int coordinateSize, float[] data)
+ {
+ //generate a new vbo and store as an int pointer
+ int vboID = GL15.glGenBuffers();
+ vbos.add(vboID);
+ //bind the vbo as an array buffer
+ GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, vboID);
+ //prepare a float buffer to be load into the vbo
+ FloatBuffer buffer = storeDataToFloatBuffer(data);
+ //load in the float buffer as an static object
+ GL15.glBufferData(GL15.GL_ARRAY_BUFFER, buffer, GL15.GL_STATIC_DRAW);
+ //add the vbo to the given list in the already bound vao
+ GL20.glVertexAttribPointer(attNumber, coordinateSize, GL11.GL_FLOAT, false, 0, 0);
+ //unbind the vbo
+ GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
+ }
+
+ private void unbindVAO()
+ {
+ GL30.glBindVertexArray(0);
+ }
+
+ private void bindIndexBuffer(int[] indices)
+ {
+ int vboID = GL15.glGenBuffers();
+ vbos.add(vboID);
+ GL15.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, vboID);
+ IntBuffer buffer = storeDataToIntBuffer(indices);
+ GL15.glBufferData(GL15.GL_ELEMENT_ARRAY_BUFFER, buffer, GL15.GL_STATIC_DRAW);
+ }
+
+ private IntBuffer storeDataToIntBuffer(int[] data)
+ {
+ IntBuffer buffer = BufferUtils.createIntBuffer(data.length);
+ buffer.put(data);
+ buffer.flip();
+ return buffer;
+ }
+
+ private FloatBuffer storeDataToFloatBuffer(float[] data)
+ {
+ //create a new float buffer with size of the data array
+ FloatBuffer buffer = BufferUtils.createFloatBuffer(data.length);
+ //put all the data into the float buffer
+ buffer.put(data);
+ //turn the float buffer from write to read mode
+ buffer.flip();
+ return buffer;
+ }
+}
diff --git a/Rendr/src/RenderEngine/Renderer.java b/Rendr/src/RenderEngine/Renderer.java
new file mode 100644
index 0000000..a499937
--- /dev/null
+++ b/Rendr/src/RenderEngine/Renderer.java
@@ -0,0 +1,37 @@
+package RenderEngine;
+
+import models.RawModel;
+import models.TexturedModel;
+import org.lwjgl.opengl.GL11;
+import org.lwjgl.opengl.GL13;
+import org.lwjgl.opengl.GL20;
+import org.lwjgl.opengl.GL30;
+
+public class Renderer
+{
+ public void prepare(float r, float g, float b)
+ {
+ GL11.glClearColor(r, g, b, 1);
+ GL11.glClear(GL11.GL_COLOR_BUFFER_BIT);
+ }
+
+ public void render(TexturedModel texturedModel)
+ {
+ RawModel model = texturedModel.getRawModel();
+ //bind the models vao
+ GL30.glBindVertexArray(model.getVaoID());
+ //vertex data is in list 0
+ GL20.glEnableVertexAttribArray(0);
+ GL20.glEnableVertexAttribArray(1);
+
+ GL13.glActiveTexture(GL13.GL_TEXTURE0);
+ GL11.glBindTexture(GL11.GL_TEXTURE_2D, texturedModel.getTexture().getID());
+
+ //render the model in triangles
+ GL11.glDrawElements(GL11.GL_TRIANGLES, model.getVertexCount(), GL11.GL_UNSIGNED_INT, 0);
+ //unbind and disable everything
+ GL20.glDisableVertexAttribArray(0);
+ GL20.glDisableVertexAttribArray(1);
+ GL30.glBindVertexArray(0);
+ }
+}
diff --git a/Rendr/src/Shaders/ShaderProgram.java b/Rendr/src/Shaders/ShaderProgram.java
new file mode 100644
index 0000000..74588e8
--- /dev/null
+++ b/Rendr/src/Shaders/ShaderProgram.java
@@ -0,0 +1,79 @@
+package Shaders;
+
+import org.lwjgl.opengl.GL11;
+import org.lwjgl.opengl.GL20;
+
+import java.io.BufferedReader;
+import java.io.FileNotFoundException;
+import java.io.FileReader;
+import java.io.IOException;
+
+public abstract class ShaderProgram
+{
+ private int programID;
+ private int vertexShaderID;
+ private int fragmentShaderID;
+
+ public ShaderProgram(String vertexFile, String fragmentFile)
+ {
+ vertexShaderID = loadShader(vertexFile, GL20.GL_VERTEX_SHADER);
+ fragmentShaderID = loadShader(fragmentFile, GL20.GL_FRAGMENT_SHADER);
+ programID = GL20.glCreateProgram();
+ GL20.glAttachShader(programID, vertexShaderID);
+ GL20.glAttachShader(programID, fragmentShaderID);
+ bindAttributes();
+ GL20.glLinkProgram(programID);
+ GL20.glValidateProgram(programID);
+ }
+
+ public void start()
+ {
+ GL20.glUseProgram(programID);
+ }
+
+ public void stop()
+ {
+ GL20.glUseProgram(0);
+ }
+
+ public void clear()
+ {
+ stop();
+ GL20.glDetachShader(programID, vertexShaderID);
+ GL20.glDetachShader(programID, fragmentShaderID);
+ GL20.glDeleteShader(vertexShaderID);
+ GL20.glDeleteShader(fragmentShaderID);
+ GL20.glDeleteProgram(programID);
+ }
+
+ protected abstract void bindAttributes();
+
+ protected void bindAttribute(int attribute, String variableName)
+ {
+ GL20.glBindAttribLocation(programID, attribute, variableName);
+ }
+
+ private static int loadShader(String file, int type)
+ {
+ StringBuilder shaderSource = new StringBuilder();
+
+ try
+ {
+ BufferedReader reader = new BufferedReader(new FileReader(file));
+ String line;
+ while((line = reader.readLine()) != null)
+ {
+ shaderSource.append(line).append("\n");
+ }
+ reader.close();
+ } catch (IOException e)
+ {
+ e.printStackTrace();
+ }
+
+ int shaderID = GL20.glCreateShader(type);
+ GL20.glShaderSource(shaderID, shaderSource);
+ GL20.glCompileShader(shaderID);
+ return shaderID;
+ }
+}
diff --git a/Rendr/src/Shaders/StaticShader.java b/Rendr/src/Shaders/StaticShader.java
new file mode 100644
index 0000000..019ad2c
--- /dev/null
+++ b/Rendr/src/Shaders/StaticShader.java
@@ -0,0 +1,18 @@
+package Shaders;
+
+public class StaticShader extends ShaderProgram
+{
+ private static final String vertexFile = "src/shaders/vertexShader.glsl", fragmentFile = "src/shaders/fragmentShader.glsl";
+
+ public StaticShader()
+ {
+ super(vertexFile, fragmentFile);
+ }
+
+ @Override
+ protected void bindAttributes()
+ {
+ bindAttribute(0, "position");
+ bindAttribute(1, "uvs");
+ }
+}
diff --git a/Rendr/src/Shaders/fragmentShader.glsl b/Rendr/src/Shaders/fragmentShader.glsl
new file mode 100644
index 0000000..4dc8ade
--- /dev/null
+++ b/Rendr/src/Shaders/fragmentShader.glsl
@@ -0,0 +1,13 @@
+#version 400 core
+
+in vec3 color;
+in vec2 passUvs;
+
+out vec4 outColor;
+
+uniform sampler2D textureSampler;
+
+void main(void)
+{
+ outColor = texture(textureSampler, passUvs);
+}
\ No newline at end of file
diff --git a/Rendr/src/Shaders/vertexShader.glsl b/Rendr/src/Shaders/vertexShader.glsl
new file mode 100644
index 0000000..a513114
--- /dev/null
+++ b/Rendr/src/Shaders/vertexShader.glsl
@@ -0,0 +1,13 @@
+#version 400 core
+
+in vec3 position;
+in vec2 uvs;
+
+out vec3 color;
+out vec2 passUvs;
+
+void main(void)
+{
+ gl_Position = vec4(position.x, position.y, position.z, 1.0);
+ passUvs = uvs;
+}
\ No newline at end of file
diff --git a/Rendr/src/models/RawModel.java b/Rendr/src/models/RawModel.java
new file mode 100644
index 0000000..41c6dbc
--- /dev/null
+++ b/Rendr/src/models/RawModel.java
@@ -0,0 +1,24 @@
+package models;
+
+public class RawModel
+{
+ private int vaoID;
+ private int vertexCount;
+
+ //stores information about the vao of an model
+ public RawModel(int vaoID, int vertexCount)
+ {
+ this.vaoID = vaoID;
+ this.vertexCount = vertexCount;
+ }
+
+ public int getVaoID()
+ {
+ return vaoID;
+ }
+
+ public int getVertexCount()
+ {
+ return vertexCount;
+ }
+}
diff --git a/Rendr/src/models/TexturedModel.java b/Rendr/src/models/TexturedModel.java
new file mode 100644
index 0000000..8613a2a
--- /dev/null
+++ b/Rendr/src/models/TexturedModel.java
@@ -0,0 +1,25 @@
+package models;
+
+import textures.ModelTexture;
+
+public class TexturedModel
+{
+ private RawModel rawModel;
+ private ModelTexture texture;
+
+ public TexturedModel(RawModel rawModel, ModelTexture texture)
+ {
+ this.rawModel = rawModel;
+ this.texture = texture;
+ }
+
+ public RawModel getRawModel()
+ {
+ return rawModel;
+ }
+
+ public ModelTexture getTexture()
+ {
+ return texture;
+ }
+}
diff --git a/Rendr/src/textures/ModelTexture.java b/Rendr/src/textures/ModelTexture.java
new file mode 100644
index 0000000..0a31fba
--- /dev/null
+++ b/Rendr/src/textures/ModelTexture.java
@@ -0,0 +1,16 @@
+package textures;
+
+public class ModelTexture
+{
+ private int textureID;
+
+ public ModelTexture(int id)
+ {
+ this.textureID = id;
+ }
+
+ public int getID()
+ {
+ return textureID;
+ }
+}