package eu.tankernn.gameEngine.loader.font; import org.lwjgl.util.vector.Vector2f; import org.lwjgl.util.vector.Vector3f; import eu.tankernn.gameEngine.loader.Loader; import eu.tankernn.gameEngine.renderEngine.Vao; /** * Represents a piece of text in the game. * * @author Karl * */ public class GUIText { private String textString; private boolean dirty; private float fontSize; private Vao textMeshVao; private int vertexCount; private Vector3f colour = new Vector3f(0f, 0f, 0f); private Vector2f position; private float lineMaxSize; private int numberOfLines; private FontType font; private boolean centerText = false; /** * Creates a new text, loads the text's quads into a VAO, and adds the text * to the screen. * * @param text * - the text. * @param fontSize * - the font size of the text, where a font size of 1 is the * default size. * @param font * - the font that this text should use. * @param position * - the position on the screen where the top left corner of the * text should be rendered. The top left corner of the screen is * (0, 0) and the bottom right is (1, 1). * @param maxLineLength * - basically the width of the virtual page in terms of screen * width (1 is full screen width, 0.5 is half the width of the * screen, etc.) Text cannot go off the edge of the page, so if * the text is longer than this length it will go onto the next * line. When text is centered it is centered into the middle of * the line, based on this line length value. * @param centered * - whether the text should be centered or not. */ public GUIText(String text, float fontSize, FontType font, Vector2f position, float maxLineLength, boolean centered) { this.textString = text; this.fontSize = fontSize; this.font = font; this.position = position; this.lineMaxSize = maxLineLength; this.centerText = centered; } /** * @return The font used by this text. */ public FontType getFont() { return font; } /** * Set the colour of the text. * * @param r * - red value, between 0 and 1. * @param g * - green value, between 0 and 1. * @param b * - blue value, between 0 and 1. */ public GUIText setColor(float r, float g, float b) { colour.set(r, g, b); return this; } /** * @return the colour of the text. */ public Vector3f getColor() { return colour; } /** * @return The number of lines of text. This is determined when the text is * loaded, based on the length of the text and the max line length * that is set. */ public int getNumberOfLines() { return numberOfLines; } /** * @return The position of the top-left corner of the text in screen-space. * (0, 0) is the top left corner of the screen, (1, 1) is the bottom * right. */ public Vector2f getPosition() { return position; } /** * @return the ID of the text's VAO, which contains all the vertex data for * the quads on which the text will be rendered. */ public Vao getMesh() { return textMeshVao; } /** * Set the VAO and vertex count for this text. * * @param vao * - the VAO containing all the vertex data for the quads on * which the text will be rendered. * @param verticesCount * - the total number of vertices in all of the quads. */ public void setMeshInfo(Vao vao, int verticesCount) { this.textMeshVao = vao; this.vertexCount = verticesCount; } /** * @return The total number of vertices of all the text's quads. */ public int getVertexCount() { return this.vertexCount; } /** * @return the font size of the text (a font size of 1 is normal). */ protected float getFontSize() { return fontSize; } /** * Sets the number of lines that this text covers (method used only in * loading). * * @param number */ protected void setNumberOfLines(int number) { this.numberOfLines = number; } /** * @return {@code true} if the text should be centered. */ protected boolean isCentered() { return centerText; } /** * @return The maximum length of a line of this text. */ protected float getMaxLineSize() { return lineMaxSize; } /** * @return The string of text. */ protected String getTextString() { return textString; } public void setText(String text) { this.textString = text; this.dirty = true; } public boolean isDirty() { return this.dirty; } public void update(Loader loader) { TextMeshData data = font.loadText(this); Vao vao = loader.loadToVAO(data.getVertexPositions(), data.getTextureCoords()); this.setMeshInfo(vao, data.getVertexCount()); } }