From ea77974d4234a66ad0af67fb28d214392856b40c Mon Sep 17 00:00:00 2001 From: MrDev023 Date: Fri, 20 Jan 2017 20:37:24 +0100 Subject: [PATCH 1/3] Add Event GUI --- .idea/workspace.xml | 387 ++++++---- src/globalgamejam/gui/GUI.java | 62 ++ .../gui/{Label.java => GUILabel.java} | 708 +++++++++--------- src/globalgamejam/gui/IActionGUI.java | 11 + src/globalgamejam/input/Input.java | 4 +- src/globalgamejam/math/Matrix4f.java | 2 - src/globalgamejam/render/DisplayManager.java | 3 +- 7 files changed, 689 insertions(+), 488 deletions(-) create mode 100644 src/globalgamejam/gui/GUI.java rename src/globalgamejam/gui/{Label.java => GUILabel.java} (88%) create mode 100644 src/globalgamejam/gui/IActionGUI.java diff --git a/.idea/workspace.xml b/.idea/workspace.xml index cd1564d..3f84723 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -2,10 +2,13 @@ + + + + - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -593,8 +690,6 @@ - - @@ -744,16 +839,6 @@ - - - - - - - - - - @@ -782,16 +867,6 @@ - - - - - - - - - - @@ -881,18 +956,6 @@ - - - - - - - - - - - - @@ -901,29 +964,10 @@ - - - - - - - - - - - - - - - - - - - - - + + @@ -942,6 +986,95 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/globalgamejam/gui/GUI.java b/src/globalgamejam/gui/GUI.java new file mode 100644 index 0000000..c3dcd6b --- /dev/null +++ b/src/globalgamejam/gui/GUI.java @@ -0,0 +1,62 @@ +package globalgamejam.gui; + +import globalgamejam.input.Input; + +/** + * Created by trexr on 20/01/2017. + */ +public abstract class GUI { + private int mouseInGUI = 0;//0 = En dehors, 1 = entrer, 2 = deplacer + + protected int x, y; + protected int width,height; + + protected IActionGUI action; + + public GUI(int x,int y){ + this.x = x; + this.y = y; + this.width = 0; + this.height = 0; + } + + public void update(){ + float mouseX = Input.getMousePosition().x; + float mouseY = Input.getMousePosition().y; + if(mouseX >= this.x && mouseX <= this.x && mouseY >= this.y && mouseY <= this.y){ + for(int i = 0;i < Input.NBRE_BUTTON;i++){ + if(Input.isButton(i)){ + action.clicked(mouseX,mouseY,i,Input.getButtonState(i)); + } + } + if(mouseInGUI == 0){ + mouseInGUI = 1; + action.enter(mouseX,mouseY); + }else if(mouseInGUI == 1 && mouseInGUI == 2){ + mouseInGUI = 2; + action.move(mouseX,mouseY); + } + }else{ + if(mouseInGUI == 1 && mouseInGUI == 2){ + mouseInGUI = 0; + action.leave(mouseX,mouseY); + } + } + } + + public int getX() { + return x; + } + + public void setX(int x) { + this.x = x; + } + + public int getY() { + return y; + } + + public void setY(int y) { + this.y = y; + } +} diff --git a/src/globalgamejam/gui/Label.java b/src/globalgamejam/gui/GUILabel.java similarity index 88% rename from src/globalgamejam/gui/Label.java rename to src/globalgamejam/gui/GUILabel.java index 2a03987..a7ae017 100644 --- a/src/globalgamejam/gui/Label.java +++ b/src/globalgamejam/gui/GUILabel.java @@ -1,356 +1,352 @@ -package globalgamejam.gui; -import static org.lwjgl.opengl.GL11.*; - -import java.awt.Color; -import java.awt.Font; -import java.awt.FontMetrics; -import java.awt.Graphics; -import java.awt.image.BufferedImage; -import java.nio.ByteBuffer; - -import org.lwjgl.BufferUtils; -import org.lwjgl.opengl.GL12; - -/** - * usefull to print 2D text in openGL LWJGL application - * @author Jean-Baptiste Pommeret (Fiesta) - * @version 1.0 - */ -public class Label { - - private static final int BYTES_PER_PIXEL = 4;//3 for RGB, 4 for RGBA - - private Image label; - private float x, y; - private String text; - private Color color; - private int size; - private int witdh, height; - - private String font; - - /** - * Full constructor of a Label - * @param text (String) : the text to print - * @param xC (float) : the x coordonnate of the frame where start printing the Label (upper left corner) - * @param yC (float) : the y coordonnate of the frame where start printing the Label (upper left corner) - * @param color (java.awt.Color) : the Color you wish for the text - * @param font (String) : the font (i.e. "Arial" or "Times new roman") - * @param size (int) : the font size - */ - public Label(String text, float xC, float yC, Color color, String font, int size){ - this.text = text; - this.x = xC; - this.y = yC; - this.color = color; - this.size = size; - this.font = font; - - Font f_font = new Font(font, Font.PLAIN, size); - - // to get the width of the text - BufferedImage img = new BufferedImage(1, 1, BufferedImage.TYPE_INT_ARGB); - FontMetrics fm = img.getGraphics().getFontMetrics(f_font); - - this.witdh = fm.stringWidth(this.text); - this.height = fm.getHeight(); - - final BufferedImage image = new BufferedImage(this.witdh, this.height, BufferedImage.TYPE_INT_ARGB); -// makeTransparent(image); - - Graphics g = image.getGraphics(); - g.setFont(f_font); - g.setColor(this.color); - g.drawString(this.text, 0, size); - g.dispose(); - - int[] pixels = new int[image.getWidth() * image.getHeight()]; - image.getRGB(0, 0, image.getWidth(), image.getHeight(), pixels, 0, image.getWidth()); - - ByteBuffer buffer = BufferUtils.createByteBuffer(image.getWidth() * image.getHeight() * BYTES_PER_PIXEL); //4 for RGBA, 3 for RGB - - for(int y = 0; y < image.getHeight(); y++){ - for(int x = 0; x < image.getWidth(); x++){ - int pixel = pixels[y * image.getWidth() + x]; - buffer.put((byte) ((pixel >> 16) & 0xFF)); // Red component - buffer.put((byte) ((pixel >> 8) & 0xFF)); // Green component - buffer.put((byte) (pixel & 0xFF)); // Blue component - buffer.put((byte) ((pixel >> 24) & 0xFF)); // Alpha component. Only for RGBA - } - } - - buffer.flip(); //FOR THE LOVE OF GOD DO NOT FORGET THIS - - // You now have a ByteBuffer filled with the color data of each pixel. - // Now just create a texture ID and bind it. Then you can load it using - // whatever OpenGL method you want, for example: - - int textureID = glGenTextures(); //Generate texture ID - glBindTexture(GL_TEXTURE_2D, textureID); //Bind texture ID - - //Setup wrap mode - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL12.GL_CLAMP_TO_EDGE); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL12.GL_CLAMP_TO_EDGE); - - //Setup texture scaling filtering - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); - - //Send texel data to OpenGL - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, image.getWidth(), image.getHeight(), 0, GL_RGBA, GL_UNSIGNED_BYTE, buffer); - - glBindTexture(GL_TEXTURE_2D, 0); - - this.label = new Image(xC, yC, image.getWidth(), image.getHeight(), textureID); - } - - /** - * Default constructor of a Label. Call the full constructor -> Label("", 100, 100, Color.white, "Arial", 30) - */ - public Label(){ - this(""); - } - - /** - * Construct a Label from the text param and default statement. - * Call the full constructor -> Label(text, 100, 100, Color.white, "Arial", 30) - * @param text (String) : the text to print - */ - public Label(String text){ - this(text, 100, 100, Color.white, "Arial", 30); - } - - /** - * Return the actual Color of the Label - * @return color (java.awt.Color) : the Color of the Label - */ - public Color getColor() { - return color; - } - - /** - * Set the Color of the Label. Automaticaly update the Label to use the new Color - * @param color (java.awt.Color) : the new Color of the Label - */ - public void setColor(Color color) { - this.color = color; - - Font f_font = new Font(font, Font.PLAIN, size); - - // to get the width of the text - BufferedImage img = new BufferedImage(1, 1, BufferedImage.TYPE_INT_ARGB); - FontMetrics fm = img.getGraphics().getFontMetrics(f_font); - - this.witdh = fm.stringWidth(this.text); - this.height = fm.getHeight(); - - final BufferedImage image = new BufferedImage(this.witdh, this.height, BufferedImage.TYPE_INT_ARGB); -// makeTransparent(image); - - Graphics g = image.getGraphics(); - g.setFont(f_font); - g.setColor(this.color); - g.drawString(this.text, 0, size); - g.dispose(); - - int[] pixels = new int[image.getWidth() * image.getHeight()]; - image.getRGB(0, 0, image.getWidth(), image.getHeight(), pixels, 0, image.getWidth()); - - ByteBuffer buffer = BufferUtils.createByteBuffer(image.getWidth() * image.getHeight() * BYTES_PER_PIXEL); //4 for RGBA, 3 for RGB - - for(int y = 0; y < image.getHeight(); y++){ - for(int x = 0; x < image.getWidth(); x++){ - int pixel = pixels[y * image.getWidth() + x]; - buffer.put((byte) ((pixel >> 16) & 0xFF)); // Red component - buffer.put((byte) ((pixel >> 8) & 0xFF)); // Green component - buffer.put((byte) (pixel & 0xFF)); // Blue component - buffer.put((byte) ((pixel >> 24) & 0xFF)); // Alpha component. Only for RGBA - } - } - - buffer.flip(); //FOR THE LOVE OF GOD DO NOT FORGET THIS - - // You now have a ByteBuffer filled with the color data of each pixel. - // Now just create a texture ID and bind it. Then you can load it using - // whatever OpenGL method you want, for example: - - int textureID = glGenTextures(); //Generate texture ID - glBindTexture(GL_TEXTURE_2D, textureID); //Bind texture ID - - //Setup wrap mode - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL12.GL_CLAMP_TO_EDGE); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL12.GL_CLAMP_TO_EDGE); - - //Setup texture scaling filtering - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); - - //Send texel data to OpenGL - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, image.getWidth(), image.getHeight(), 0, GL_RGBA, GL_UNSIGNED_BYTE, buffer); - - glBindTexture(GL_TEXTURE_2D, 0); - - this.label = new Image(this.x, this.y, image.getWidth(), image.getHeight(), textureID); - } - - /** - * Return the text of the Label - * @return text (String) : the text of the Label - */ - public String getText() { - return text; - } - - /** - * Set the text of the Label. Automaticaly update the Label to use the new text - * @param text (String) : the new text to display - */ - public void setText(String text) { - this.text = text; - - Font f_font = new Font(font, Font.PLAIN, size); - - // to get the width of the text - BufferedImage img = new BufferedImage(1, 1, BufferedImage.TYPE_INT_ARGB); - FontMetrics fm = img.getGraphics().getFontMetrics(f_font); - - this.witdh = fm.stringWidth(this.text); - this.height = fm.getHeight(); - - final BufferedImage image = new BufferedImage(this.witdh, this.height, BufferedImage.TYPE_INT_ARGB); -// makeTransparent(image); - - Graphics g = image.getGraphics(); - g.setFont(f_font); - g.setColor(this.color); - g.drawString(this.text, 0, size); - g.dispose(); - - int[] pixels = new int[image.getWidth() * image.getHeight()]; - image.getRGB(0, 0, image.getWidth(), image.getHeight(), pixels, 0, image.getWidth()); - - ByteBuffer buffer = BufferUtils.createByteBuffer(image.getWidth() * image.getHeight() * BYTES_PER_PIXEL); //4 for RGBA, 3 for RGB - - for(int y = 0; y < image.getHeight(); y++){ - for(int x = 0; x < image.getWidth(); x++){ - int pixel = pixels[y * image.getWidth() + x]; - buffer.put((byte) ((pixel >> 16) & 0xFF)); // Red component - buffer.put((byte) ((pixel >> 8) & 0xFF)); // Green component - buffer.put((byte) (pixel & 0xFF)); // Blue component - buffer.put((byte) ((pixel >> 24) & 0xFF)); // Alpha component. Only for RGBA - } - } - - buffer.flip(); //FOR THE LOVE OF GOD DO NOT FORGET THIS - - // You now have a ByteBuffer filled with the color data of each pixel. - // Now just create a texture ID and bind it. Then you can load it using - // whatever OpenGL method you want, for example: - - int textureID = glGenTextures(); //Generate texture ID - glBindTexture(GL_TEXTURE_2D, textureID); //Bind texture ID - - //Setup wrap mode - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL12.GL_CLAMP_TO_EDGE); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL12.GL_CLAMP_TO_EDGE); - - //Setup texture scaling filtering - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); - - //Send texel data to OpenGL - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, image.getWidth(), image.getHeight(), 0, GL_RGBA, GL_UNSIGNED_BYTE, buffer); - - glBindTexture(GL_TEXTURE_2D, 0); - - this.label = new Image(this.x, this.y, image.getWidth(), image.getHeight(), textureID); - } - - /** - * Return the x coordonnate of the Label (upper left corner) - * @return x (float) : the x coordonnate of the Label - */ - public float getX() { - return x; - } - - /** - * Set the x coordonnate of the Label (upper left corner) - * @param x (float) : the new x coordonnate of the Label - */ - public void setX(float x) { - this.x = x; - label.setX(x); - } - - /** - * Return the y coordonnate of the Label (upper left corner) - * @return y (float) : the y coordonnate of the Label - */ - public float getY() { - return y; - } - - /** - * Set the y coordonnate of the Label (upper left corner) - * @param y (float) : the new y coordonnate of the Label - */ - public void setY(float y) { - this.y = y; - label.setY(y); - } - - /** - * Set both x and y coordonnate of the Label - * @param x (float) : the new x coordonnate of the Label - * @param y (float) : the new y coordonnate of the Label - */ - public void setPosition(float x, float y){ - this.setX(x); - this.setY(y); - } - - /** - * Return the Image of the Label - * @return label (Image) : the Image of the Label - */ - public Image getLabel(){ - return this.label; - } - - /** - * Return the witdh of the Label - * @return witdh (int) : the width - */ - public int getWitdh() { - return witdh; - } - - /** - * Return the height of the Label - * @return height (int) : the height - */ - public int getHeight() { - return height; - } - - /** - * make the image transparent - * @param obj_img (BufferedImage) : the BufferedImage to make transparent - */ -/* private void makeTransparent(BufferedImage obj_img){ - byte alpha = (byte)255; - alpha %= 0xff; - for (int cx=0;cx> 16) & 0xFF)); // Red component + buffer.put((byte) ((pixel >> 8) & 0xFF)); // Green component + buffer.put((byte) (pixel & 0xFF)); // Blue component + buffer.put((byte) ((pixel >> 24) & 0xFF)); // Alpha component. Only for RGBA + } + } + + buffer.flip(); //FOR THE LOVE OF GOD DO NOT FORGET THIS + + // You now have a ByteBuffer filled with the color data of each pixel. + // Now just create a texture ID and bind it. Then you can load it using + // whatever OpenGL method you want, for example: + + int textureID = glGenTextures(); //Generate texture ID + glBindTexture(GL_TEXTURE_2D, textureID); //Bind texture ID + + //Setup wrap mode + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL12.GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL12.GL_CLAMP_TO_EDGE); + + //Setup texture scaling filtering + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + + //Send texel data to OpenGL + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, image.getWidth(), image.getHeight(), 0, GL_RGBA, GL_UNSIGNED_BYTE, buffer); + + glBindTexture(GL_TEXTURE_2D, 0); + + this.label = new Image(xC, yC, image.getWidth(), image.getHeight(), textureID); + } + + /** + * Default constructor of a Label. Call the full constructor -> Label("", 100, 100, Color.white, "Arial", 30) + */ + public GUILabel(){ + this(""); + } + + /** + * Construct a Label from the text param and default statement. + * Call the full constructor -> Label(text, 100, 100, Color.white, "Arial", 30) + * @param text (String) : the text to print + */ + public GUILabel(String text){ + this(text, 100, 100, Color.white, "Arial", 30); + } + + /** + * Return the actual Color of the Label + * @return color (java.awt.Color) : the Color of the Label + */ + public Color getColor() { + return color; + } + + /** + * Set the Color of the Label. Automaticaly update the Label to use the new Color + * @param color (java.awt.Color) : the new Color of the Label + */ + public void setColor(Color color) { + this.color = color; + + Font f_font = new Font(font, Font.PLAIN, size); + + // to get the width of the text + BufferedImage img = new BufferedImage(1, 1, BufferedImage.TYPE_INT_ARGB); + FontMetrics fm = img.getGraphics().getFontMetrics(f_font); + + super.width = fm.stringWidth(this.text); + super.height = fm.getHeight(); + + final BufferedImage image = new BufferedImage(super.width, super.height, BufferedImage.TYPE_INT_ARGB); +// makeTransparent(image); + + Graphics g = image.getGraphics(); + g.setFont(f_font); + g.setColor(this.color); + g.drawString(this.text, 0, size); + g.dispose(); + + int[] pixels = new int[image.getWidth() * image.getHeight()]; + image.getRGB(0, 0, image.getWidth(), image.getHeight(), pixels, 0, image.getWidth()); + + ByteBuffer buffer = BufferUtils.createByteBuffer(image.getWidth() * image.getHeight() * BYTES_PER_PIXEL); //4 for RGBA, 3 for RGB + + for(int y = 0; y < image.getHeight(); y++){ + for(int x = 0; x < image.getWidth(); x++){ + int pixel = pixels[y * image.getWidth() + x]; + buffer.put((byte) ((pixel >> 16) & 0xFF)); // Red component + buffer.put((byte) ((pixel >> 8) & 0xFF)); // Green component + buffer.put((byte) (pixel & 0xFF)); // Blue component + buffer.put((byte) ((pixel >> 24) & 0xFF)); // Alpha component. Only for RGBA + } + } + + buffer.flip(); //FOR THE LOVE OF GOD DO NOT FORGET THIS + + // You now have a ByteBuffer filled with the color data of each pixel. + // Now just create a texture ID and bind it. Then you can load it using + // whatever OpenGL method you want, for example: + + int textureID = glGenTextures(); //Generate texture ID + glBindTexture(GL_TEXTURE_2D, textureID); //Bind texture ID + + //Setup wrap mode + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL12.GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL12.GL_CLAMP_TO_EDGE); + + //Setup texture scaling filtering + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + + //Send texel data to OpenGL + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, image.getWidth(), image.getHeight(), 0, GL_RGBA, GL_UNSIGNED_BYTE, buffer); + + glBindTexture(GL_TEXTURE_2D, 0); + + this.label = new Image(this.x, this.y, image.getWidth(), image.getHeight(), textureID); + } + + /** + * Return the text of the Label + * @return text (String) : the text of the Label + */ + public String getText() { + return text; + } + + /** + * Set the text of the Label. Automaticaly update the Label to use the new text + * @param text (String) : the new text to display + */ + public void setText(String text) { + this.text = text; + + Font f_font = new Font(font, Font.PLAIN, size); + + // to get the width of the text + BufferedImage img = new BufferedImage(1, 1, BufferedImage.TYPE_INT_ARGB); + FontMetrics fm = img.getGraphics().getFontMetrics(f_font); + + super.width = fm.stringWidth(this.text); + super.height = fm.getHeight(); + + final BufferedImage image = new BufferedImage(super.width, super.height, BufferedImage.TYPE_INT_ARGB); +// makeTransparent(image); + + Graphics g = image.getGraphics(); + g.setFont(f_font); + g.setColor(this.color); + g.drawString(this.text, 0, size); + g.dispose(); + + int[] pixels = new int[image.getWidth() * image.getHeight()]; + image.getRGB(0, 0, image.getWidth(), image.getHeight(), pixels, 0, image.getWidth()); + + ByteBuffer buffer = BufferUtils.createByteBuffer(image.getWidth() * image.getHeight() * BYTES_PER_PIXEL); //4 for RGBA, 3 for RGB + + for(int y = 0; y < image.getHeight(); y++){ + for(int x = 0; x < image.getWidth(); x++){ + int pixel = pixels[y * image.getWidth() + x]; + buffer.put((byte) ((pixel >> 16) & 0xFF)); // Red component + buffer.put((byte) ((pixel >> 8) & 0xFF)); // Green component + buffer.put((byte) (pixel & 0xFF)); // Blue component + buffer.put((byte) ((pixel >> 24) & 0xFF)); // Alpha component. Only for RGBA + } + } + + buffer.flip(); //FOR THE LOVE OF GOD DO NOT FORGET THIS + + // You now have a ByteBuffer filled with the color data of each pixel. + // Now just create a texture ID and bind it. Then you can load it using + // whatever OpenGL method you want, for example: + + int textureID = glGenTextures(); //Generate texture ID + glBindTexture(GL_TEXTURE_2D, textureID); //Bind texture ID + + //Setup wrap mode + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL12.GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL12.GL_CLAMP_TO_EDGE); + + //Setup texture scaling filtering + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + + //Send texel data to OpenGL + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, image.getWidth(), image.getHeight(), 0, GL_RGBA, GL_UNSIGNED_BYTE, buffer); + + glBindTexture(GL_TEXTURE_2D, 0); + + this.label = new Image(this.x, this.y, image.getWidth(), image.getHeight(), textureID); + } + + /** + * Return the x coordonnate of the Label (upper left corner) + * @return x (float) : the x coordonnate of the Label + */ + public int getX() { + return x; + } + + /** + * Set the x coordonnate of the Label (upper left corner) + * @param x (float) : the new x coordonnate of the Label + */ + public void setX(int x) { + super.setX(x); + label.setX(x); + } + + /** + * Return the y coordonnate of the Label (upper left corner) + * @return y (float) : the y coordonnate of the Label + */ + public int getY() { + return y; + } + + /** + * Set the y coordonnate of the Label (upper left corner) + * @param y (float) : the new y coordonnate of the Label + */ + public void setY(int y) { + super.setY(y); + label.setY(y); + } + + /** + * Set both x and y coordonnate of the Label + * @param x (float) : the new x coordonnate of the Label + * @param y (float) : the new y coordonnate of the Label + */ + public void setPosition(int x, int y){ + this.setX(x); + this.setY(y); + } + + /** + * Return the Image of the Label + * @return label (Image) : the Image of the Label + */ + public Image getLabel(){ + return this.label; + } + + /** + * Return the witdh of the Label + * @return witdh (int) : the width + */ + public int getWitdh() { + return super.width; + } + + /** + * Return the height of the Label + * @return height (int) : the height + */ + public int getHeight() { + return super.height; + } + + /** + * make the image transparent + * @param obj_img (BufferedImage) : the BufferedImage to make transparent + */ +/* private void makeTransparent(BufferedImage obj_img){ + byte alpha = (byte)255; + alpha %= 0xff; + for (int cx=0;cx Date: Fri, 20 Jan 2017 22:34:01 +0100 Subject: [PATCH 2/3] Bug fixes and add Label --- .idea/workspace.xml | 416 +++++++++++------- .../Global-Gam-Jam-2017/shaders/main.frag | 4 +- res/shaders/main.frag | 4 +- src/globalgamejam/game/MainGame.java | 37 +- src/globalgamejam/gui/ActionGUI.java | 33 ++ src/globalgamejam/gui/GUI.java | 18 +- src/globalgamejam/gui/GUILabel.java | 253 +++-------- src/globalgamejam/gui/IActionGUI.java | 1 + src/globalgamejam/gui/Image.java | 92 ---- src/globalgamejam/render/DisplayManager.java | 2 +- src/globalgamejam/render/Texture.java | 68 ++- src/globalgamejam/tiles/Tile.java | 16 +- 12 files changed, 481 insertions(+), 463 deletions(-) create mode 100644 src/globalgamejam/gui/ActionGUI.java delete mode 100644 src/globalgamejam/gui/Image.java diff --git a/.idea/workspace.xml b/.idea/workspace.xml index c8158fd..a1e3487 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -2,8 +2,18 @@ - - + + + + + + + + + + + + @@ -242,6 +279,28 @@ - - - - - - - - @@ -710,18 +815,6 @@ - - - - - - - - - - - - @@ -778,9 +871,7 @@ - - - + @@ -863,16 +954,6 @@ - - - - - - - - - - @@ -916,22 +997,6 @@ - - - - - - - - - - - - - - - - @@ -959,28 +1024,6 @@ - - - - - - - - - - - - - - - - - - - - - - @@ -992,18 +1035,26 @@ - + - - + + - + - - + + + + + + + + + + @@ -1018,55 +1069,106 @@ - + - - + + - - - - - - - - - - - - + - + - - + + + + + + + + + + + + + + + + + + - - - - - - - - + - + - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/out/production/Global-Gam-Jam-2017/shaders/main.frag b/out/production/Global-Gam-Jam-2017/shaders/main.frag index 5fb950e..a0c0b6e 100644 --- a/out/production/Global-Gam-Jam-2017/shaders/main.frag +++ b/out/production/Global-Gam-Jam-2017/shaders/main.frag @@ -6,9 +6,11 @@ uniform vec4 color; in vec2 fragTexCoord; in vec3 fragVert; +out vec4 finalColor; + //layout(location = 0) out vec4 finalColor; // https://learnopengl.com/#!Lighting/Multiple-lights pour le lighing en cas de besoin void main() { - gl_FragData[0] = texture(materialTex, fragTexCoord) * color; + finalColor = texture(materialTex, fragTexCoord) * color; } \ No newline at end of file diff --git a/res/shaders/main.frag b/res/shaders/main.frag index 5fb950e..a0c0b6e 100644 --- a/res/shaders/main.frag +++ b/res/shaders/main.frag @@ -6,9 +6,11 @@ uniform vec4 color; in vec2 fragTexCoord; in vec3 fragVert; +out vec4 finalColor; + //layout(location = 0) out vec4 finalColor; // https://learnopengl.com/#!Lighting/Multiple-lights pour le lighing en cas de besoin void main() { - gl_FragData[0] = texture(materialTex, fragTexCoord) * color; + finalColor = texture(materialTex, fragTexCoord) * color; } \ No newline at end of file diff --git a/src/globalgamejam/game/MainGame.java b/src/globalgamejam/game/MainGame.java index 672e276..91f537a 100644 --- a/src/globalgamejam/game/MainGame.java +++ b/src/globalgamejam/game/MainGame.java @@ -1,9 +1,15 @@ package globalgamejam.game; +import globalgamejam.gui.ActionGUI; +import globalgamejam.gui.GUI; +import globalgamejam.gui.GUILabel; +import globalgamejam.gui.IActionGUI; +import globalgamejam.input.Input; import globalgamejam.render.*; import globalgamejam.tiles.TestTile; import globalgamejam.tiles.Tile; +import java.awt.*; import java.util.ArrayList; /** @@ -12,43 +18,58 @@ import java.util.ArrayList; public class MainGame extends Game{ private ArrayList tiles; - private FrameBufferObject fbo; + private ArrayList guis; + private GUILabel label; + @Override public void init() { - fbo = new FrameBufferObject(); tiles = new ArrayList(); + guis = new ArrayList(); TestTile t = new TestTile(); t.getTransform().translate(100,100,0); t.getTransform().scale(10,10,0); tiles.add(t); + label = new GUILabel("Test"); + label.setX(10); + label.setY(10); + label.setAction(new ActionGUI() { + @Override + public void enter(float mouseX, float mouseY) { + label.setColor(Color.RED); + } + + @Override + public void leave(float mouseX, float mouseY) { + label.setColor(Color.WHITE); + } + }); + guis.add(label); + } @Override public void update() { Camera.transform(); + for(GUI g : guis)g.update(); } @Override public void render2D() { - fbo.startRenderToFBO(); for(Tile t : tiles)t.render(); - fbo.stopRenderToFBO(); - - fbo.renderFBO(); } @Override public void renderGUI() { - + for(GUI g : guis)g.render(); } @Override public void destroy() { - fbo.destroy(); tiles.clear(); + guis.clear(); } } diff --git a/src/globalgamejam/gui/ActionGUI.java b/src/globalgamejam/gui/ActionGUI.java new file mode 100644 index 0000000..7525d76 --- /dev/null +++ b/src/globalgamejam/gui/ActionGUI.java @@ -0,0 +1,33 @@ +package globalgamejam.gui; + +/** + * Created by trexr on 20/01/2017. + */ +public class ActionGUI implements IActionGUI{ + + + @Override + public void enter(float mouseX, float mouseY) { + + } + + @Override + public void leave(float mouseX, float mouseY) { + + } + + @Override + public void move(float mouseX, float mouseY) { + + } + + @Override + public void hover(float mouseX, float mouseY) { + + } + + @Override + public void clicked(float mouseX, float mouseY, int buttonKey, int buttonState) { + + } +} diff --git a/src/globalgamejam/gui/GUI.java b/src/globalgamejam/gui/GUI.java index c3dcd6b..69d0ba9 100644 --- a/src/globalgamejam/gui/GUI.java +++ b/src/globalgamejam/gui/GUI.java @@ -20,10 +20,16 @@ public abstract class GUI { this.height = 0; } + public void setAction(IActionGUI action){ + this.action = action; + } + public void update(){ float mouseX = Input.getMousePosition().x; float mouseY = Input.getMousePosition().y; - if(mouseX >= this.x && mouseX <= this.x && mouseY >= this.y && mouseY <= this.y){ + float dMouseX = Input.getDMouse().x; + float dMouseY = Input.getDMouse().y; + if(mouseX >= this.x && mouseX <= this.x + this.width && mouseY >= this.y && mouseY <= this.y + this.height){ for(int i = 0;i < Input.NBRE_BUTTON;i++){ if(Input.isButton(i)){ action.clicked(mouseX,mouseY,i,Input.getButtonState(i)); @@ -32,18 +38,22 @@ public abstract class GUI { if(mouseInGUI == 0){ mouseInGUI = 1; action.enter(mouseX,mouseY); - }else if(mouseInGUI == 1 && mouseInGUI == 2){ + }else if(mouseInGUI == 1 || mouseInGUI == 2){ mouseInGUI = 2; - action.move(mouseX,mouseY); + action.hover(mouseX,mouseY); + if(dMouseX != 0 || dMouseY != 0)action.move(mouseX,mouseY); } }else{ - if(mouseInGUI == 1 && mouseInGUI == 2){ + if(mouseInGUI == 1 || mouseInGUI == 2){ mouseInGUI = 0; action.leave(mouseX,mouseY); } } } + public abstract void render(); + public abstract void destroy(); + public int getX() { return x; } diff --git a/src/globalgamejam/gui/GUILabel.java b/src/globalgamejam/gui/GUILabel.java index a7ae017..3b8f68c 100644 --- a/src/globalgamejam/gui/GUILabel.java +++ b/src/globalgamejam/gui/GUILabel.java @@ -7,9 +7,16 @@ import java.awt.FontMetrics; import java.awt.Graphics; import java.awt.image.BufferedImage; import java.nio.ByteBuffer; +import java.nio.FloatBuffer; +import globalgamejam.math.Color4f; +import globalgamejam.math.Matrix4f; +import globalgamejam.render.Camera; +import globalgamejam.render.DisplayManager; +import globalgamejam.render.Shaders; +import globalgamejam.render.Texture; import org.lwjgl.BufferUtils; -import org.lwjgl.opengl.GL12; +import org.lwjgl.opengl.*; /** * usefull to print 2D text in openGL LWJGL application @@ -17,14 +24,13 @@ import org.lwjgl.opengl.GL12; * @version 1.0 */ public class GUILabel extends GUI { - - private static final int BYTES_PER_PIXEL = 4;//3 for RGB, 4 for RGBA - private Image label; + private Texture texture; private String text; private Color color; private int size; private String font; + private int vbo,numberOfVertices; /** * Full constructor of a Label @@ -37,67 +43,51 @@ public class GUILabel extends GUI { */ public GUILabel(String text, int xC, int yC, Color color, String font, int size){ super(xC,yC); - this.text = text; - this.color = color; - this.size = size; this.font = font; - - Font f_font = new Font(font, Font.PLAIN, size); - - // to get the width of the text - BufferedImage img = new BufferedImage(1, 1, BufferedImage.TYPE_INT_ARGB); - FontMetrics fm = img.getGraphics().getFontMetrics(f_font); - - super.width = fm.stringWidth(this.text); - super.height = fm.getHeight(); - - final BufferedImage image = new BufferedImage(super.width, this.height, BufferedImage.TYPE_INT_ARGB); -// makeTransparent(image); - - Graphics g = image.getGraphics(); - g.setFont(f_font); - g.setColor(this.color); - g.drawString(this.text, 0, size); - g.dispose(); - - int[] pixels = new int[image.getWidth() * image.getHeight()]; - image.getRGB(0, 0, image.getWidth(), image.getHeight(), pixels, 0, image.getWidth()); - - ByteBuffer buffer = BufferUtils.createByteBuffer(image.getWidth() * image.getHeight() * BYTES_PER_PIXEL); //4 for RGBA, 3 for RGB - - for(int y = 0; y < image.getHeight(); y++){ - for(int x = 0; x < image.getWidth(); x++){ - int pixel = pixels[y * image.getWidth() + x]; - buffer.put((byte) ((pixel >> 16) & 0xFF)); // Red component - buffer.put((byte) ((pixel >> 8) & 0xFF)); // Green component - buffer.put((byte) (pixel & 0xFF)); // Blue component - buffer.put((byte) ((pixel >> 24) & 0xFF)); // Alpha component. Only for RGBA - } - } - - buffer.flip(); //FOR THE LOVE OF GOD DO NOT FORGET THIS - - // You now have a ByteBuffer filled with the color data of each pixel. - // Now just create a texture ID and bind it. Then you can load it using - // whatever OpenGL method you want, for example: - - int textureID = glGenTextures(); //Generate texture ID - glBindTexture(GL_TEXTURE_2D, textureID); //Bind texture ID - - //Setup wrap mode - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL12.GL_CLAMP_TO_EDGE); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL12.GL_CLAMP_TO_EDGE); - - //Setup texture scaling filtering - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); - - //Send texel data to OpenGL - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, image.getWidth(), image.getHeight(), 0, GL_RGBA, GL_UNSIGNED_BYTE, buffer); - - glBindTexture(GL_TEXTURE_2D, 0); - - this.label = new Image(xC, yC, image.getWidth(), image.getHeight(), textureID); + this.color = color; + this.text = text; + this.size = size; + if(this.texture != null)this.texture.destroy(); + this.texture = Texture.loadFont(text,color,font,size); + super.width = this.texture.width; + super.height = this.texture.height; + this.vbo = GL15.glGenBuffers(); + float[] a = new float[]{ + 0,0, 0.0f,0.0f, + this.texture.width,0, 1.0f,0.0f, + this.texture.width,this.texture.height, 1.0f,1.0f, + 0,this.texture.height, 0.0f,1.0f + }; + FloatBuffer buff = BufferUtils.createFloatBuffer(a.length); + buff.put(a).flip(); + this.numberOfVertices = a.length/(2+2); + + GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, this.vbo); + GL15.glBufferData(GL15.GL_ARRAY_BUFFER, buff, GL15.GL_STATIC_DRAW); + GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0); + } + + public void render(){ + Shaders.MAIN_SHADERS.bind(); + Shaders.MAIN_SHADERS.uniform("camera", Camera.matrix); + Matrix4f transform = new Matrix4f(); + transform.translate(super.x,super.y,0); + Shaders.MAIN_SHADERS.uniform("transform", transform); + Shaders.MAIN_SHADERS.uniform("projection", DisplayManager.projection); + Shaders.MAIN_SHADERS.uniform("color", Color4f.WHITE); + + texture.bind(); + GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, this.vbo); + GL20.glEnableVertexAttribArray(Shaders.MAIN_SHADERS.getAttribLocation("vert")); + GL20.glVertexAttribPointer(Shaders.MAIN_SHADERS.getAttribLocation("vert"), 2, GL11.GL_FLOAT, false, (2+2)*4, 0); + + GL20.glEnableVertexAttribArray(Shaders.MAIN_SHADERS.getAttribLocation("vertTexCoord")); + GL20.glVertexAttribPointer(Shaders.MAIN_SHADERS.getAttribLocation("vertTexCoord"), 2, GL11.GL_FLOAT, true, (2+2)*4, 2*4); + + GL11.glDrawArrays(GL11.GL_QUADS, 0, numberOfVertices); + GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0); + texture.unbind(); + Shaders.MAIN_SHADERS.unbind(); } /** @@ -130,63 +120,8 @@ public class GUILabel extends GUI { */ public void setColor(Color color) { this.color = color; - - Font f_font = new Font(font, Font.PLAIN, size); - - // to get the width of the text - BufferedImage img = new BufferedImage(1, 1, BufferedImage.TYPE_INT_ARGB); - FontMetrics fm = img.getGraphics().getFontMetrics(f_font); - - super.width = fm.stringWidth(this.text); - super.height = fm.getHeight(); - - final BufferedImage image = new BufferedImage(super.width, super.height, BufferedImage.TYPE_INT_ARGB); -// makeTransparent(image); - - Graphics g = image.getGraphics(); - g.setFont(f_font); - g.setColor(this.color); - g.drawString(this.text, 0, size); - g.dispose(); - - int[] pixels = new int[image.getWidth() * image.getHeight()]; - image.getRGB(0, 0, image.getWidth(), image.getHeight(), pixels, 0, image.getWidth()); - - ByteBuffer buffer = BufferUtils.createByteBuffer(image.getWidth() * image.getHeight() * BYTES_PER_PIXEL); //4 for RGBA, 3 for RGB - - for(int y = 0; y < image.getHeight(); y++){ - for(int x = 0; x < image.getWidth(); x++){ - int pixel = pixels[y * image.getWidth() + x]; - buffer.put((byte) ((pixel >> 16) & 0xFF)); // Red component - buffer.put((byte) ((pixel >> 8) & 0xFF)); // Green component - buffer.put((byte) (pixel & 0xFF)); // Blue component - buffer.put((byte) ((pixel >> 24) & 0xFF)); // Alpha component. Only for RGBA - } - } - - buffer.flip(); //FOR THE LOVE OF GOD DO NOT FORGET THIS - - // You now have a ByteBuffer filled with the color data of each pixel. - // Now just create a texture ID and bind it. Then you can load it using - // whatever OpenGL method you want, for example: - - int textureID = glGenTextures(); //Generate texture ID - glBindTexture(GL_TEXTURE_2D, textureID); //Bind texture ID - - //Setup wrap mode - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL12.GL_CLAMP_TO_EDGE); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL12.GL_CLAMP_TO_EDGE); - - //Setup texture scaling filtering - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); - - //Send texel data to OpenGL - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, image.getWidth(), image.getHeight(), 0, GL_RGBA, GL_UNSIGNED_BYTE, buffer); - - glBindTexture(GL_TEXTURE_2D, 0); - - this.label = new Image(this.x, this.y, image.getWidth(), image.getHeight(), textureID); + if(this.texture != null)this.texture.destroy(); + this.texture = Texture.loadFont(text,color,font,size); } /** @@ -203,64 +138,11 @@ public class GUILabel extends GUI { */ public void setText(String text) { this.text = text; - - Font f_font = new Font(font, Font.PLAIN, size); - - // to get the width of the text - BufferedImage img = new BufferedImage(1, 1, BufferedImage.TYPE_INT_ARGB); - FontMetrics fm = img.getGraphics().getFontMetrics(f_font); - - super.width = fm.stringWidth(this.text); - super.height = fm.getHeight(); - - final BufferedImage image = new BufferedImage(super.width, super.height, BufferedImage.TYPE_INT_ARGB); -// makeTransparent(image); - - Graphics g = image.getGraphics(); - g.setFont(f_font); - g.setColor(this.color); - g.drawString(this.text, 0, size); - g.dispose(); - - int[] pixels = new int[image.getWidth() * image.getHeight()]; - image.getRGB(0, 0, image.getWidth(), image.getHeight(), pixels, 0, image.getWidth()); - - ByteBuffer buffer = BufferUtils.createByteBuffer(image.getWidth() * image.getHeight() * BYTES_PER_PIXEL); //4 for RGBA, 3 for RGB - - for(int y = 0; y < image.getHeight(); y++){ - for(int x = 0; x < image.getWidth(); x++){ - int pixel = pixels[y * image.getWidth() + x]; - buffer.put((byte) ((pixel >> 16) & 0xFF)); // Red component - buffer.put((byte) ((pixel >> 8) & 0xFF)); // Green component - buffer.put((byte) (pixel & 0xFF)); // Blue component - buffer.put((byte) ((pixel >> 24) & 0xFF)); // Alpha component. Only for RGBA - } - } - - buffer.flip(); //FOR THE LOVE OF GOD DO NOT FORGET THIS - - // You now have a ByteBuffer filled with the color data of each pixel. - // Now just create a texture ID and bind it. Then you can load it using - // whatever OpenGL method you want, for example: - - int textureID = glGenTextures(); //Generate texture ID - glBindTexture(GL_TEXTURE_2D, textureID); //Bind texture ID - - //Setup wrap mode - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL12.GL_CLAMP_TO_EDGE); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL12.GL_CLAMP_TO_EDGE); - - //Setup texture scaling filtering - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); - - //Send texel data to OpenGL - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, image.getWidth(), image.getHeight(), 0, GL_RGBA, GL_UNSIGNED_BYTE, buffer); - - glBindTexture(GL_TEXTURE_2D, 0); - - this.label = new Image(this.x, this.y, image.getWidth(), image.getHeight(), textureID); + if(this.texture != null)this.texture.destroy(); + this.texture = Texture.loadFont(text,color,font,size); } + + /** * Return the x coordonnate of the Label (upper left corner) @@ -276,7 +158,6 @@ public class GUILabel extends GUI { */ public void setX(int x) { super.setX(x); - label.setX(x); } /** @@ -293,7 +174,6 @@ public class GUILabel extends GUI { */ public void setY(int y) { super.setY(y); - label.setY(y); } /** @@ -306,14 +186,6 @@ public class GUILabel extends GUI { this.setY(y); } - /** - * Return the Image of the Label - * @return label (Image) : the Image of the Label - */ - public Image getLabel(){ - return this.label; - } - /** * Return the witdh of the Label * @return witdh (int) : the width @@ -329,6 +201,11 @@ public class GUILabel extends GUI { public int getHeight() { return super.height; } + + public void destroy(){ + GL15.glDeleteBuffers(vbo); + texture.destroy(); + } /** * make the image transparent diff --git a/src/globalgamejam/gui/IActionGUI.java b/src/globalgamejam/gui/IActionGUI.java index 3ed866c..5ddb521 100644 --- a/src/globalgamejam/gui/IActionGUI.java +++ b/src/globalgamejam/gui/IActionGUI.java @@ -7,5 +7,6 @@ public interface IActionGUI { public void enter(float mouseX,float mouseY); public void leave(float mouseX,float mouseY); public void move(float mouseX,float mouseY); + public void hover(float mouseX,float mouseY); public void clicked(float mouseX,float mouseY,int buttonKey,int buttonState); } diff --git a/src/globalgamejam/gui/Image.java b/src/globalgamejam/gui/Image.java deleted file mode 100644 index 9e02ad6..0000000 --- a/src/globalgamejam/gui/Image.java +++ /dev/null @@ -1,92 +0,0 @@ -package globalgamejam.gui; - -public class Image { - protected float x, y; - protected float width, height; - protected int angle; - protected int textureID; - - public Image(float x, float y, float width, float height, int textureID) { - this.x = x; - this.y = y; - this.width = width; - this.height = height; - this.textureID = textureID; - } - - 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; - } - - public float getWidth() { - return width; - } - - /** - * @param width the width to set - */ - public void setWidth(float width) { - this.width = width; - } - - public float getHeight() { - return height; - } - - /** - * @param height the height to set - */ - public void setHeight(float height) { - this.height = height; - } - - public int getTextureID() { - return textureID; - } - - /** - * IT DOESN'T WORKS - * Rotate the image in the counter-clock wise of the specified angle in degrees - * @param rotationAngle (int) : the angle to rotate in degrees - */ - public void rotate(int rotationAngle){ - this.angle += rotationAngle; - this.angle = this.angle % 360; - } - - /** - * IT DOESN'T WORKS - * Set the angle of the Image - * @param angle (int) : the angle, between -360 and +360 degrees - */ - public void rotateTo(int angle){ - this.angle = angle; - this.angle = this.angle % 360; - } - - /** - * IT DOESN'T WORKS - * Return the actuel angle - * @return angle (int) : the actual angle - */ - public int getAngle() { - return angle; - } - - public void setPosition(float x, float y){ - this.setX(x); - this.setY(y); - } -} diff --git a/src/globalgamejam/render/DisplayManager.java b/src/globalgamejam/render/DisplayManager.java index 997ad65..2c02eaf 100644 --- a/src/globalgamejam/render/DisplayManager.java +++ b/src/globalgamejam/render/DisplayManager.java @@ -29,7 +29,7 @@ public class DisplayManager { public static void preRenderGUI(){ projection.loadIdentity(); //Permet de centrer la camera au centre de l'ecran - projection.Ortho2D(0, Main.WIDTH, 0, Main.HEIGHT, -1, 1); + projection.Ortho2D(0, Main.WIDTH, Main.HEIGHT, 0, -1, 1); glEnable(GL_DEPTH_TEST); glDepthFunc(GL_LESS); glEnable(GL_BLEND); diff --git a/src/globalgamejam/render/Texture.java b/src/globalgamejam/render/Texture.java index f4f768c..39655dd 100644 --- a/src/globalgamejam/render/Texture.java +++ b/src/globalgamejam/render/Texture.java @@ -2,6 +2,7 @@ package globalgamejam.render; import static org.lwjgl.opengl.GL11.*; import static org.lwjgl.opengl.GL12.*; +import java.awt.*; import java.awt.image.*; import java.io.*; import java.nio.*; @@ -9,20 +10,82 @@ import java.nio.*; import javax.imageio.*; import org.lwjgl.*; +import org.lwjgl.opengl.GL12; /** * Class created by MrDev023 (Florian RICHER) on 14/01/2017 */ public class Texture { - int width, height; + private static final int BYTES_PER_PIXEL = 4;//3 for RGB, 4 for RGBA + public int width, height; int id; public Texture(int width,int height,int id){ + System.out.println("Texture loaded ! " + width + "x" + height + " id:" + id); this.id = id; this.width = width; this.height = height; } + + public static Texture loadFont(String text, Color color, String font, int size){ + Font f_font = new Font(font, Font.PLAIN, size); + + // to get the width of the text + BufferedImage img = new BufferedImage(1, 1, BufferedImage.TYPE_INT_ARGB); + FontMetrics fm = img.getGraphics().getFontMetrics(f_font); + + int width = fm.stringWidth(text); + int height = fm.getHeight(); + + final BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB); +// makeTransparent(image); + + Graphics g = image.getGraphics(); + g.setFont(f_font); + g.setColor(color); + g.drawString(text, 0, size); + g.dispose(); + + int[] pixels = new int[image.getWidth() * image.getHeight()]; + image.getRGB(0, 0, image.getWidth(), image.getHeight(), pixels, 0, image.getWidth()); + + ByteBuffer buffer = BufferUtils.createByteBuffer(image.getWidth() * image.getHeight() * BYTES_PER_PIXEL); //4 for RGBA, 3 for RGB + + for(int y = 0; y < image.getHeight(); y++){ + for(int x = 0; x < image.getWidth(); x++){ + int pixel = pixels[y * image.getWidth() + x]; + buffer.put((byte) ((pixel >> 16) & 0xFF)); // Red component + buffer.put((byte) ((pixel >> 8) & 0xFF)); // Green component + buffer.put((byte) (pixel & 0xFF)); // Blue component + buffer.put((byte) ((pixel >> 24) & 0xFF)); // Alpha component. Only for RGBA + } + } + + buffer.flip(); //FOR THE LOVE OF GOD DO NOT FORGET THIS + + // You now have a ByteBuffer filled with the color data of each pixel. + // Now just create a texture ID and bind it. Then you can load it using + // whatever OpenGL method you want, for example: + + int textureID = glGenTextures(); //Generate texture ID + glBindTexture(GL_TEXTURE_2D, textureID); //Bind texture ID + + //Setup wrap mode + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL12.GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL12.GL_CLAMP_TO_EDGE); + + //Setup texture scaling filtering + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + + //Send texel data to OpenGL + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, image.getWidth(), image.getHeight(), 0, GL_RGBA, GL_UNSIGNED_BYTE, buffer); + + glBindTexture(GL_TEXTURE_2D, 0); + + return new Texture(image.getWidth(),image.getHeight(),textureID); + } public static Texture loadTexture(String path){ try { @@ -60,8 +123,6 @@ public class Texture { glBindTexture(GL_TEXTURE_2D, 0); - System.out.println("Texture loaded ! " + width + "x" + height + " id:" + id); - return new Texture(width, height, id); } catch (IOException e) { e.printStackTrace(); @@ -82,6 +143,7 @@ public class Texture { } public void bind(){ + if(!glIsEnabled(GL_TEXTURE_2D))glEnable(GL_TEXTURE_2D); glBindTexture(GL_TEXTURE_2D, id); } diff --git a/src/globalgamejam/tiles/Tile.java b/src/globalgamejam/tiles/Tile.java index 87faea3..dbd6e63 100644 --- a/src/globalgamejam/tiles/Tile.java +++ b/src/globalgamejam/tiles/Tile.java @@ -44,13 +44,6 @@ public abstract class Tile { GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo); GL15.glBufferData(GL15.GL_ARRAY_BUFFER, buffer, GL15.GL_STATIC_DRAW); - - GL20.glEnableVertexAttribArray(Shaders.MAIN_SHADERS.getAttribLocation("vert")); - GL20.glVertexAttribPointer(Shaders.MAIN_SHADERS.getAttribLocation("vert"), 2, GL11.GL_FLOAT, false, (2+2)*4, 0); - - GL20.glEnableVertexAttribArray(Shaders.MAIN_SHADERS.getAttribLocation("vertTexCoord")); - GL20.glVertexAttribPointer(Shaders.MAIN_SHADERS.getAttribLocation("vertTexCoord"), 2, GL11.GL_FLOAT, true, (2+2)*4, 2*4); - GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0); } @@ -62,10 +55,17 @@ public abstract class Tile { Shaders.MAIN_SHADERS.uniform("projection", DisplayManager.projection); Shaders.MAIN_SHADERS.uniform("color", this.color); - GL13.glActiveTexture(GL13.GL_TEXTURE0); +// GL13.glActiveTexture(GL13.GL_TEXTURE0); texture.bind(); GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo); + + GL20.glEnableVertexAttribArray(Shaders.MAIN_SHADERS.getAttribLocation("vert")); + GL20.glVertexAttribPointer(Shaders.MAIN_SHADERS.getAttribLocation("vert"), 2, GL11.GL_FLOAT, false, (2+2)*4, 0); + + GL20.glEnableVertexAttribArray(Shaders.MAIN_SHADERS.getAttribLocation("vertTexCoord")); + GL20.glVertexAttribPointer(Shaders.MAIN_SHADERS.getAttribLocation("vertTexCoord"), 2, GL11.GL_FLOAT, true, (2+2)*4, 2*4); + GL11.glDrawArrays(GL11.GL_QUADS, 0, size); GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0); texture.unbind(); From 9e5d6a03c3cfdf6525fea247bac79d0e04a92c46 Mon Sep 17 00:00:00 2001 From: MrDev023 Date: Fri, 20 Jan 2017 22:55:07 +0100 Subject: [PATCH 3/3] Bug fixes and add Label --- .idea/workspace.xml | 45 ++++++++++----------------- src/globalgamejam/render/Texture.java | 2 +- 2 files changed, 18 insertions(+), 29 deletions(-) diff --git a/.idea/workspace.xml b/.idea/workspace.xml index a1e3487..7273826 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -2,18 +2,7 @@ - - - - - - - - - - - @@ -1101,16 +1090,6 @@ - - - - - - - - - - @@ -1155,10 +1134,20 @@ + + + + + + + + + + - - + + diff --git a/src/globalgamejam/render/Texture.java b/src/globalgamejam/render/Texture.java index 39655dd..18c8e7f 100644 --- a/src/globalgamejam/render/Texture.java +++ b/src/globalgamejam/render/Texture.java @@ -22,7 +22,6 @@ public class Texture { int id; public Texture(int width,int height,int id){ - System.out.println("Texture loaded ! " + width + "x" + height + " id:" + id); this.id = id; this.width = width; this.height = height; @@ -83,6 +82,7 @@ public class Texture { glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, image.getWidth(), image.getHeight(), 0, GL_RGBA, GL_UNSIGNED_BYTE, buffer); glBindTexture(GL_TEXTURE_2D, 0); + System.out.println("Texture loaded ! " + width + "x" + height + " id:" + textureID); return new Texture(image.getWidth(),image.getHeight(),textureID); }