From e78b6803893c0998163ace8cbae2b20ff32e84f5 Mon Sep 17 00:00:00 2001 From: Antoine Date: Wed, 19 May 2021 02:52:15 +0200 Subject: [PATCH] new engine --- .../{frag.frag => ObjectGlTexColor/frag.glsl} | 2 +- .../{vert.vert => ObjectGlTexColor/vert.glsl} | 0 src/Main.java | 2 +- src/engine/Engine.java | 81 ++++++++++---- src/engine/Primitive.java | 99 ------------------ src/engine/math/Primitive.java | 28 +++++ src/engine/object/ObjectGl.java | 6 +- src/engine/object/ObjectGlColor.java | 9 +- src/engine/object/ObjectGlTex.java | 20 +++- src/engine/object/ObjectGlTexColor.java | 20 ++++ textures/zangief_sprite.png | Bin 0 -> 27955 bytes 11 files changed, 138 insertions(+), 129 deletions(-) rename shaders/{frag.frag => ObjectGlTexColor/frag.glsl} (56%) rename shaders/{vert.vert => ObjectGlTexColor/vert.glsl} (100%) delete mode 100644 src/engine/Primitive.java create mode 100644 src/engine/math/Primitive.java create mode 100644 src/engine/object/ObjectGlTexColor.java create mode 100644 textures/zangief_sprite.png diff --git a/shaders/frag.frag b/shaders/ObjectGlTexColor/frag.glsl similarity index 56% rename from shaders/frag.frag rename to shaders/ObjectGlTexColor/frag.glsl index 9642779..17a5870 100644 --- a/shaders/frag.frag +++ b/shaders/ObjectGlTexColor/frag.glsl @@ -10,5 +10,5 @@ uniform sampler2D texture2; void main() { - FragColor = mix(texture(texture1, TexCoord), texture(texture2, vec2(TexCoord.x, -TexCoord.y)), position.x * position.y); + FragColor = mix(texture(texture1, TexCoord), texture(texture2, vec2(TexCoord.x, -TexCoord.y)), position.x * position.y); } \ No newline at end of file diff --git a/shaders/vert.vert b/shaders/ObjectGlTexColor/vert.glsl similarity index 100% rename from shaders/vert.vert rename to shaders/ObjectGlTexColor/vert.glsl diff --git a/src/Main.java b/src/Main.java index d4c19c8..c769c8c 100644 --- a/src/Main.java +++ b/src/Main.java @@ -7,8 +7,8 @@ * */ -import launcher.Launcher; import engine.Engine; +import launcher.Launcher; public class Main { diff --git a/src/engine/Engine.java b/src/engine/Engine.java index 05bf3f9..36a0998 100644 --- a/src/engine/Engine.java +++ b/src/engine/Engine.java @@ -8,10 +8,15 @@ */ package engine; +import engine.object.ObjectGl; import org.lwjgl.glfw.GLFWFramebufferSizeCallback; import org.lwjgl.glfw.GLFWVidMode; import org.lwjgl.opengl.GL; +import java.util.ArrayList; +import java.util.List; +import java.util.ListIterator; + import static org.lwjgl.glfw.GLFW.*; import static org.lwjgl.opengl.GL11.*; import static org.lwjgl.system.MemoryUtil.*; @@ -20,28 +25,35 @@ public class Engine { private long window; - private Scene scene; - private Scene scene2; + private List objectsGl; private boolean running; - public Engine(){ + /** + * Create the engine and initial attributes use .init() to start the engine + */ + public Engine() { this.running = false; + this.objectsGl = new ArrayList(); } + /** + * Start the engine + * Create the window + */ private void init() { - if(!glfwInit()){ - // TODO Erreur d'initialisation - } + glfwInit(); + this.running = true; + glfwWindowHint(GLFW_RESIZABLE, GL_TRUE); glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); //On utilise la version 3.3 d'openGL glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3); glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE); //Compatible MAC glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); //Le core profile est l'interface 'avancé' d'openGL - int width = 800; - int height = 600; + int width = 1280; + int height = 720; this.window = glfwCreateWindow(width, height, "Boulevard Combattant", NULL, NULL); assert this.window != NULL; @@ -49,6 +61,7 @@ public class Engine { GLFWVidMode vidmode = glfwGetVideoMode(glfwGetPrimaryMonitor()); assert vidmode != null; + // On met la fenêtre au centre de l'écran principale glfwSetWindowPos(this.window, (vidmode.width() - width)/2, (vidmode.height() - height)/2); glfwSetKeyCallback(window, new Input()); @@ -64,38 +77,54 @@ public class Engine { glEnable(GL_DEPTH_TEST); // Z-Buffer glClearColor(0.2f, 0.3f, 0.3f, 1.0f); System.out.println("OpenGL: " + glGetString(GL_VERSION)); - - this.scene = new Scene("shaders/vert.vert", "shaders/frag.frag", Primitive.rectangle, Primitive.rectangle_indices, Primitive.rectangle_color, Primitive.rectangle_texture); - this.scene2 = new Scene("shaders/vert.glsl", "shaders/frag.frag", Primitive.triangle, Primitive.triangle_indices); - } + /** + * + */ private void update(){ glfwPollEvents(); } + /** + * + */ private void render(){ + glClearColor(0.2f, 0.3f, 0.3f, 1.0f); - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); //SWAP avec le precedent - scene.render(); - scene2.render(); + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + + for (ObjectGl objectGl : objectsGl) { + objectGl.render(); + } + int error = glGetError(); if (error != GL_NO_ERROR) System.out.println(error); glfwSwapBuffers(window); //Envoie le buffer vers le moniteur } + /** + * TODO la boucle de rendu doit être inscrite dans la boucle de gameplay: cette methode doit disparaitre + */ public void run(){ - init(); - while(running){ - update(); - render(); - if(glfwWindowShouldClose(window)) running = false; + while(running){ + update(); + render(); + if(glfwWindowShouldClose(window)) running = false; } } - /* - Est appelé à chaque modification de la taille de la fenêtre, et modifie la taille de la zone de rendu - pour quelle corresponde à la taille de la fenêtre + public void add_objectGl(ObjectGl obj){ + objectsGl.add(obj); + } + + public void remove_objectGl(ObjectGl obj){ + objectsGl.remove(obj); + } + + /** + * Est appelé à chaque modification de la taille de la fenêtre, et modifie la taille de la zone de rendu + * pour quelle corresponde à la taille de la fenêtre */ private static final GLFWFramebufferSizeCallback resizeWindow = new GLFWFramebufferSizeCallback(){ @Override @@ -106,6 +135,12 @@ public class Engine { public static void main(String[] args) { Engine engine = new Engine(); + engine.init(); + // Add objects to render + ObjectGl cube = new ObjectGl(-0.2f,-0.2f,0.0f,1.0f,1.0f); + engine.add_objectGl(cube); +// engine.remove_objectGl(cube); + engine.run(); } diff --git a/src/engine/Primitive.java b/src/engine/Primitive.java deleted file mode 100644 index 9f7ec19..0000000 --- a/src/engine/Primitive.java +++ /dev/null @@ -1,99 +0,0 @@ -package engine; - -import engine.math.Vector3f; - -public class Primitive { - - public float[] vertices; - public byte[] indices; - - public Primitive(Vector3f vertex1, Vector3f vertex2, Vector3f vertex3){ - vertices = new float[]{ - vertex1.x, vertex1.y, vertex1.z, - vertex2.x, vertex2.y, vertex2.z, - vertex3.x, vertex3.y, vertex3.z - }; - indices = new byte[]{ - 0, 1, 2 - }; - } - - public Primitive(Vector3f vertex1, Vector3f vertex2, Vector3f vertex3, Vector3f vertex4){ - vertices = new float[]{ - vertex1.x, vertex1.y, vertex1.z, - vertex2.x, vertex2.y, vertex2.z, - vertex3.x, vertex3.y, vertex3.z, - vertex4.x, vertex4.y, vertex4.z - }; - indices = new byte[]{ - 0, 1, 2, - 1, 2, 3 - }; - } - - public static float[] createRectangle(float x, float y, float z, float w, float h){ - return new float[] { - x , y , z, - x + h, y , z, - x + h, y + w, z, - x , y + w, z - }; - } - - public static float[] triangle = new float[] { - 0.0f, 0.5f, 0.0f, - 0.5f, -0.5f, 0.0f, - -0.5f, -0.5f, 0.0f, - }; - - public static float[] triangle_couleur = new float[] { - 1.0f, 0.0f, 0.0f, - 0.0f, 1.0f, 0.0f, - 0.0f, 0.0f, 1.0f - }; - - public static byte[] triangle_indices = new byte[]{ - 0, 1, 2 - }; - - public static float[] two_triangle = new float[] { - 0.0f, 0.5f, 0.0f, - 0.5f, -0.5f, 0.0f, - -0.5f, -0.5f, 0.0f, - -0.8f, -0.8f, 0.0f, - 0.8f, -0.8f, 0.0f, - 0.8f, -0.9f, 0.0f, - }; - - public static byte[] two_triangle_indices = new byte[]{ - 0, 1, 2, - 3, 4, 5 - }; - - public static float[] rectangle = new float[] { - 0.5f, 0.5f, 0.0f, // top right - 0.5f, -0.5f, 0.0f, // bottom right - -0.5f, -0.5f, 0.0f, // bottom left - -0.5f, 0.5f, 0.0f // top left - }; - - public static float[] rectangle_color = new float[]{ - 1.0f, 0.0f, 0.0f, // top right - 0.0f, 1.0f, 0.0f, // bottom right - 0.0f, 0.0f, 1.0f, // bottom left - 1.0f, 1.0f, 0.0f, // top left - }; - - public static float[] rectangle_texture = new float[]{ - 2.0f, 2.0f, - 2.0f, 0.0f, - 0.0f, 0.0f, - 0.0f, 2.0f - }; - - public static byte[] rectangle_indices = new byte[] { - 0, 1, 3, - 1, 2, 3 - }; - -} diff --git a/src/engine/math/Primitive.java b/src/engine/math/Primitive.java new file mode 100644 index 0000000..5eaff03 --- /dev/null +++ b/src/engine/math/Primitive.java @@ -0,0 +1,28 @@ +package engine.math; + +import engine.math.Vector3f; + +public class Primitive { + + public static float[] createRectangle(float x, float y, float z, float w, float h){ + return new float[] { + x , y , z, + x + w, y , z, + x + w, y - h, z, + x , y - h, z + }; + } + + public static float[] stdTexWrap = new float[] { + 1.0f, 1.0f, + 1.0f, 0.0f, + 0.0f, 0.0f, + 0.0f, 1.0f + }; + + public static byte[] rectangle_indices = new byte[] { + 0, 1, 3, + 1, 2, 3 + }; + +} diff --git a/src/engine/object/ObjectGl.java b/src/engine/object/ObjectGl.java index fefa176..6563ad7 100644 --- a/src/engine/object/ObjectGl.java +++ b/src/engine/object/ObjectGl.java @@ -1,6 +1,6 @@ package engine.object; -import engine.Primitive; +import engine.math.Primitive; import engine.graphics.VertexArray; import engine.graphics.Shader; import engine.math.Matrix4f; @@ -15,6 +15,10 @@ public class ObjectGl { protected Shader shader; protected Matrix4f transform; + public ObjectGl(){ + + } + public ObjectGl(float x, float y, float z, float h, float w){ this.vertexArray = new VertexArray(Primitive.createRectangle(x, y, z, h, w), Primitive.rectangle_indices, null, null); this.transform = Matrix4f.identity(); diff --git a/src/engine/object/ObjectGlColor.java b/src/engine/object/ObjectGlColor.java index ee4042d..d3759a3 100644 --- a/src/engine/object/ObjectGlColor.java +++ b/src/engine/object/ObjectGlColor.java @@ -1,11 +1,16 @@ package engine.object; +import engine.math.Primitive; import engine.graphics.Shader; +import engine.graphics.VertexArray; +import engine.math.Matrix4f; public class ObjectGlColor extends ObjectGl{ - public ObjectGlColor(float x, float y, float h, float w, float[] color) { - super(x, y, h, w); + public ObjectGlColor(float x, float y, float z, float h, float w, float[] color) { + super(); + this.vertexArray = new VertexArray(Primitive.createRectangle(x, y, z, h, w), Primitive.rectangle_indices, color, null); + this.transform = Matrix4f.identity(); this.shader = new Shader("shaders/ObjectGlColor/vert.glsl","shaders/ObjectGlColor/frag.glsl"); } diff --git a/src/engine/object/ObjectGlTex.java b/src/engine/object/ObjectGlTex.java index 0fea018..d636b10 100644 --- a/src/engine/object/ObjectGlTex.java +++ b/src/engine/object/ObjectGlTex.java @@ -1,12 +1,28 @@ package engine.object; +import engine.math.Primitive; import engine.graphics.Shader; +import engine.graphics.Texture; +import engine.graphics.VertexArray; +import engine.math.Matrix4f; + +import java.util.List; public class ObjectGlTex extends ObjectGl{ - public ObjectGlTex(float x, float y, float h, float w, float[] texCoord) { - super(x, y, h, w); + List textures; + + public ObjectGlTex(){ + + } + + public ObjectGlTex(float x, float y, float z, float h, float w, List texPath, float[] texCoord) { + super(); + this.vertexArray = new VertexArray(Primitive.createRectangle(x, y, z, h, w), Primitive.rectangle_indices, null, texCoord); + this.transform = Matrix4f.identity(); this.shader = new Shader("shaders/ObjectGlTex/vert.glsl","shaders/ObjectGlTex/frag.glsl"); + + // TODO tex } @Override diff --git a/src/engine/object/ObjectGlTexColor.java b/src/engine/object/ObjectGlTexColor.java new file mode 100644 index 0000000..3c1641c --- /dev/null +++ b/src/engine/object/ObjectGlTexColor.java @@ -0,0 +1,20 @@ +package engine.object; + +import engine.math.Primitive; +import engine.graphics.Shader; +import engine.graphics.VertexArray; +import engine.math.Matrix4f; + +import java.util.List; + +public class ObjectGlTexColor extends ObjectGlTex{ + + public ObjectGlTexColor(float x, float y, float z, float h, float w, List texPath, float[] texCoord, float[] color) { + super(); + this.vertexArray = new VertexArray(Primitive.createRectangle(x, y, z, h, w), Primitive.rectangle_indices, color, texCoord); + this.transform = Matrix4f.identity(); + this.shader = new Shader("shaders/ObjectGlTexColor/vert.glsl","shaders/ObjectGlTexColor/frag.glsl"); + + // TODO Create texture + } +} diff --git a/textures/zangief_sprite.png b/textures/zangief_sprite.png new file mode 100644 index 0000000000000000000000000000000000000000..862b9fb71ede5cbd851a260e0f6c89a7043ecfdc GIT binary patch literal 27955 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 literal 0 HcmV?d00001