From 12b89079ceef5e3475fb6a2c00b8e4ae256388ee Mon Sep 17 00:00:00 2001 From: Antoine Date: Fri, 4 Jun 2021 20:14:10 +0200 Subject: [PATCH] UIElement scale with zoom level of the projection --- src/engine/Engine.java | 43 +++++++++++++------ src/engine/gui/UIDummy.java | 16 +++++++ src/engine/gui/UIElement.java | 69 +++++++++++++++++++------------ src/engine/gui/UIElementText.java | 11 +---- src/engine/object/Camera.java | 9 ++++ src/engine/object/ObjectGl.java | 8 +++- src/engine/object/Sprite.java | 11 +++++ src/engine/object/Text.java | 13 +++--- 8 files changed, 123 insertions(+), 57 deletions(-) create mode 100644 src/engine/gui/UIDummy.java create mode 100644 src/engine/object/Sprite.java diff --git a/src/engine/Engine.java b/src/engine/Engine.java index dd141aa..ea47d5e 100644 --- a/src/engine/Engine.java +++ b/src/engine/Engine.java @@ -1,5 +1,6 @@ package engine; +import engine.gui.UIDummy; import engine.gui.UIElement; import engine.input.*; import engine.math.*; @@ -22,7 +23,7 @@ public class Engine { private static long window; private final List objectsGl; - public final List uiElements; + public final List uiElements; private boolean running; @@ -105,6 +106,10 @@ public class Engine { */ public void update() { glfwPollEvents(); + // METS A JOUR LA POSITION DES ELEMENTS D'INTERFACE + for (UIDummy uiElement : this.uiElements){ + uiElement.update(); + } } /** @@ -139,9 +144,16 @@ public class Engine { } public void add_uiElement(UIElement uiElement) { + uiElement.init(); this.uiElements.add(uiElement); } + public void setUIElementZoomFactor(float scaleFactor){ + for (UIDummy uiElement : this.uiElements){ + uiElement.updateScalingFactor(scaleFactor); + } + } + public void translateView(Vector3f vec){ ObjectGl.view = ObjectGl.view.multiply(Matrix4f.translate(vec)); viewXPos += vec.x; @@ -230,7 +242,7 @@ public class Engine { String pathToBG = "textures/background_beach.png"; String pathToText = "textures/dejavu10x10_gs_tc.png"; - ObjectGl zangief = new ObjectGl(10.0f, 1f, 1f, 10f, path, null); + ObjectGl zangief = new Sprite(10.0f, 10f, path, null); zangief.setTextureWrap(58, 0, 62, 84, ObjectGl.DEFAULT); engine.add_objectGl(zangief); zangief.translate(new Vector3f(-1000.0f, 200.0f, 0.0f)); @@ -244,13 +256,20 @@ public class Engine { background.translate(new Vector3f(-3011.0f, 1400.0f, 1.0f)); engine.add_objectGl(background); + ObjectGl smiley = new Sprite(15.0f, 500.0f, path2, null); + + UIElement uiElement = new UIElement(smiley, 0.0f, 1.0f, engine); + engine.add_uiElement(uiElement); + Text texTest = new Text("ABCDEFGHIJKLMNOPQRSTUVWYZ",20.0f, 10, engine); + texTest.show(); texTest.translate(new Vector3f(-1000.0f, (float) (-1000.0f * (3.0 / 4.0f) + 100.0f))); - UIElement fpsCounter = new UIElement(texTest.getObj(), engine); - engine.add_uiElement(fpsCounter); // Pour être atteint par les modification du frustum +// UIElement fpsCounter = new UIElement(texTest.getObj(), engine); +// engine.add_uiElement(fpsCounter); // Pour être atteint par les modification du frustum +// +// texTest.linkToUIElement(fpsCounter); - texTest.linkToUIElement(fpsCounter); long timer = System.currentTimeMillis(); long lastFrame; int frame = 0; @@ -283,18 +302,17 @@ public class Engine { // Check si le personnage a sauté if (jump.isButtonPressed()){ // Le personnage saute - System.out.println(" JE SAUTE "); + engine.camera.zoom(1.001f); } } KeyboardInput.keyboardInput(zangief, speed); - engine.transformationView = new Vector3f((- zangief.getXPos() - engine.viewXPos) - 250.0f,0.0f,0.0f); - engine.translateView(engine.transformationView); - - fpsCounter.update(); - - engine.camera.zoom(1.001f); + Vector3f zangiefTracking = new Vector3f((- zangief.getXPos() - engine.viewXPos) - 250.0f,0.0f,0.0f); + // LE MOUVEMENT DE LA CAMERA POUR CETTE FRAME + engine.translateView(zangiefTracking); + // LA SOMME TOTAL DES MOUVEMENTS DE CAMERA DEPUIS L'ORIGINE + engine.transformationView = engine.transformationView.addXYZ(zangiefTracking); /* ******************** @@ -309,7 +327,6 @@ public class Engine { if (System.currentTimeMillis() - timer > 1000) { timer += 1000; System.out.println("FPS: " + frame); - texTest.setNewText("FPS: " + frame); frame = 0; } diff --git a/src/engine/gui/UIDummy.java b/src/engine/gui/UIDummy.java new file mode 100644 index 0000000..331e474 --- /dev/null +++ b/src/engine/gui/UIDummy.java @@ -0,0 +1,16 @@ +package engine.gui; + +public class UIDummy { + + public void init(){ + } + + private void getObjInPosition(){ + } + + public void updateScalingFactor(float scaleFactor){ + } + + public void update(){ + } +} diff --git a/src/engine/gui/UIElement.java b/src/engine/gui/UIElement.java index 70cac61..cafcee2 100644 --- a/src/engine/gui/UIElement.java +++ b/src/engine/gui/UIElement.java @@ -1,47 +1,64 @@ package engine.gui; + import engine.Engine; import engine.math.Vector3f; +import engine.object.Camera; import engine.object.ObjectGl; -import java.util.ArrayList; -import java.util.List; +public class UIElement extends UIDummy{ -public class UIElement { + private final ObjectGl obj; + private final Engine engine; + private final Camera camera; + private float scalingFactor; + private float xPos; + private float yPos; + private float zPos; - private List objs; - private Engine engine; - private Vector3f transformation; - - public UIElement(List objs, Engine engine){ - this.objs = new ArrayList<>(); - this.objs.addAll(objs); + /** + * Crée un elements d'interface càd un sprite qui suis les mouvements de la camera, pas besoin d'ajouter l'ObjectGl + * dans la liste de rendu cette classe s'en occupe lors de l'initialisation + * @param obj l'objet à mettre dans le conteneur + * @param posX la position relative à la camera souhaité sur l'axe X, 0.0 à l'extreme gauche, 1.0 à l'extreme droite + * @param posY la position relative à la camera souhaité sur l'axe Y, 0.0 à l'extreme bas, 1.0 à l'extreme haut + * @param engine le moteur de rendu depuis lequel UIElement va determiner la camera à tracker + */ + public UIElement(ObjectGl obj, float posX, float posY, Engine engine){ + this.obj = obj; this.engine = engine; - this.transformation = new Vector3f(); + this.camera = engine.getCamera(); + this.scalingFactor = obj.getScalingFactor(); + this.xPos = posX; + this.yPos = posY; + this.zPos = obj.getZPos(); + this.getObjInPosition(); } - public void addObj(ObjectGl obj){ - obj.translate(this.transformation); - this.objs.add(obj); + public void init(){ + this.engine.add_objectGl(obj); } - public void addObj(List objs){ - for (ObjectGl obj : objs){ - obj.translate(this.transformation); - this.objs.add(obj); - } + private void getObjInPosition(){ + obj.resetTransform(); + obj.scale(new Vector3f(this.scalingFactor, this.scalingFactor, 1.0f)); + // Position in the camera space + float dimension = this.camera.getDimension(); + float ar = this.camera.getAspectRatio().y / this.camera.getAspectRatio().x; + float x = dimension * 2 * this.xPos - dimension; + float y = dimension * ar * 2 * this.yPos - dimension * ar; + obj.translate(new Vector3f(x, y, this.zPos)); + System.out.println(x); + // Camera position + obj.translate(new Vector3f(- engine.transformationView.x, engine.transformationView.y)); } - public void removeObj(ObjectGl obj){ - this.objs.remove(obj); + public void updateScalingFactor(float scaleFactor){ + this.scalingFactor *= scaleFactor; } public void update(){ - Vector3f translationViewPoint = new Vector3f(-engine.transformationView.x, engine.transformationView.y); - this.transformation = this.transformation.addXYZ(translationViewPoint); - for (ObjectGl obj : this.objs){ - obj.translate(translationViewPoint); // Tous les elmts font le même déplacement que la caméra - } + this.getObjInPosition(); } } diff --git a/src/engine/gui/UIElementText.java b/src/engine/gui/UIElementText.java index 42c7d3d..40ba356 100644 --- a/src/engine/gui/UIElementText.java +++ b/src/engine/gui/UIElementText.java @@ -1,13 +1,6 @@ package engine.gui; -import engine.Engine; -import engine.gui.UIElement; -import engine.object.ObjectGl; -import java.util.List; +public class UIElementText extends UIDummy{ -public class UIElementText extends UIElement { - public UIElementText(List objs, Engine engine) { - super(objs, engine); - } -} +} \ No newline at end of file diff --git a/src/engine/object/Camera.java b/src/engine/object/Camera.java index c0f4627..3ce67b2 100644 --- a/src/engine/object/Camera.java +++ b/src/engine/object/Camera.java @@ -20,8 +20,17 @@ public class Camera { } public void zoom(float zoomFactor){ + engine.setUIElementZoomFactor(zoomFactor); this.dimension *= zoomFactor; float ar = aspectRatio.y / aspectRatio.x; ObjectGl.projection = Matrix4f.orthographic(-dimension, dimension, -dimension * ar, dimension * ar, 0.1f, 100.0f); } + + public float getDimension(){ + return this.dimension; + } + + public Vector3f getAspectRatio(){ + return this.aspectRatio; + } } diff --git a/src/engine/object/ObjectGl.java b/src/engine/object/ObjectGl.java index 91f9e5e..4824095 100644 --- a/src/engine/object/ObjectGl.java +++ b/src/engine/object/ObjectGl.java @@ -98,7 +98,7 @@ public class ObjectGl { } /** - * Reset the transform matrix, the model will appear at the 0.0.0 coordinate, his scaleFactor will be set to zero + * Reset the transform matrix, the model will appear at the 0.0.0 coordinate, his scaleFactor will be set to one * Because the model is at position 0 on the z axis he will not show up on screen */ public void resetTransform(){ @@ -236,7 +236,7 @@ public class ObjectGl { this.vertexArray = new VertexArray(Primitive.createRectangle(this.zPos, this.width, this.height), Primitive.rectangle_indices, colorBuffer, Primitive.stdTexWrap); } - private void setTextureWrap(float[] texture){ + public void setTextureWrap(float[] texture){ this.textureWrap = texture; this.vertexArray.swapTextureBufferObject(texture); } @@ -253,6 +253,10 @@ public class ObjectGl { return zPos; } + public float getScalingFactor(){ + return scalingFactor; + } + /** * Do shader binding, texture binding and vertexArray drawing */ diff --git a/src/engine/object/Sprite.java b/src/engine/object/Sprite.java new file mode 100644 index 0000000..d5ba390 --- /dev/null +++ b/src/engine/object/Sprite.java @@ -0,0 +1,11 @@ +package engine.object; + +import engine.math.Vector3f; + +public class Sprite extends ObjectGl { + + public Sprite(float z, float size, String tex, Vector3f color) { + super(z, 1f, 1f, size, tex, color); + } + +} diff --git a/src/engine/object/Text.java b/src/engine/object/Text.java index f5e20cb..e6b69ef 100644 --- a/src/engine/object/Text.java +++ b/src/engine/object/Text.java @@ -7,13 +7,15 @@ import engine.math.Vector3f; import java.util.ArrayList; import java.util.List; +/** + * Un texte construit selon la même logique qu'une sprite pour faire un element d'interface utilisez UIElementText + */ public class Text { private List charList; private final float size; private final Engine engine; private final float zPos; - private UIElement linkedUIElement; private Vector3f transformation; @@ -24,6 +26,9 @@ public class Text { this.engine = engine; this.transformation = new Vector3f(); this.textToArrayObjectGl(text); + } + + public void show(){ this.addCharListInEngine(); } @@ -44,14 +49,10 @@ public class Text { private void addCharInEngine(int i, ObjectGl obj){ obj.translate(new Vector3f(i * 10.0f * this.size, 0.0f, 0.0f)); obj.translate(transformation); - if (linkedUIElement != null){ - linkedUIElement.addObj(obj); - } this.engine.add_objectGl(obj); } public void linkToUIElement(UIElement ui){ - this.linkedUIElement = ui; } public void setNewText(String text){ @@ -81,7 +82,6 @@ public class Text { public void remove(){ for (ObjectGl obj : this.charList){ this.engine.remove_objectGl(obj); - if (linkedUIElement != null) linkedUIElement.removeObj(obj); } } @@ -94,7 +94,6 @@ public class Text { for (ObjectGl objectGl : this.charList){ if (j >= i) { this.engine.remove_objectGl(objectGl); - if (linkedUIElement != null) linkedUIElement.removeObj(objectGl); } j++; }