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; + } +}