package com.thecherno.ld29.graphics; import static org.lwjgl.opengl.GL11.*; import static org.lwjgl.opengl.GL13.*; import static org.lwjgl.opengl.GL15.*; import static org.lwjgl.opengl.GL20.*; import static org.lwjgl.opengl.GL30.*; import com.thecherno.ld29.resources.Texture; import com.thecherno.ld29.util.Buffer; public class Font { protected int vao, vbo, vio, vto; private int list = 0; private int[] texIDs; private int size = 128; private static Shader shader; private String chars = "ABCDEFGHIJKLM" + // "NOPQRSTUVWXYZ" + // "abcdefghijklm" + // "nopqrstuvwxyz" + // "0123456789!,%"; protected float[] vertices = new float[] { 0.0f, 0.0f, 0.0f,// size, 0.0f, 0.0f, // size, size, 0.0f,// 0, size, 0.0f // }; protected byte[] indices = new byte[] { 0, 1, 2, // 2, 3, 0 // }; protected byte[] texCoords = new byte[] { 0, 0,// 1, 0,// 1, 1, // 1, 1, // 0, 1, // 0, 0 // }; public Font() { texIDs = Texture.loadFont("res/font.png", 13, 5, size); compile(); if (shader == null) shader = Shader.FONT; shader.bind(); int uniform = shader.getUniform("texture"); glUniform1i(uniform, 3); shader.release(); } /* private void createList() { list = glGenLists(1); glNewList(list, GL_COMPILE); glBegin(GL_TRIANGLES); glTexCoord2f(0.0f, 0.0f); glVertex2f(0.0f, 0.0f); glTexCoord2f(1.0f, 0.0f); glVertex2f(size, 0); glTexCoord2f(1.0f, 1.0f); glVertex2f(size, size); glTexCoord2f(1.0f, 1.0f); glVertex2f(size, size); glTexCoord2f(0.0f, 1.0f); glVertex2f(0.0f, size); glTexCoord2f(0.0f, 0.0f); glVertex2f(0.0f, 0.0f); glEnd(); glEndList(); }*/ protected void compile() { vao = glGenVertexArrays(); glBindVertexArray(vao); { vbo = glGenBuffers(); glBindBuffer(GL_ARRAY_BUFFER, vbo); { glBufferData(GL_ARRAY_BUFFER, Buffer.createFloatBuffer(vertices), GL_STATIC_DRAW); glVertexAttribPointer(0, 3, GL_FLOAT, false, 0, 0); } glBindBuffer(GL_ARRAY_BUFFER, 0); vio = glGenBuffers(); glBindBuffer(GL_ARRAY_BUFFER, vio); { glBufferData(GL_ARRAY_BUFFER, Buffer.createByteBuffer(indices), GL_STATIC_DRAW); } glBindBuffer(GL_ARRAY_BUFFER, 0); vto = glGenBuffers(); glBindBuffer(GL_ARRAY_BUFFER, vto); { glBufferData(GL_ARRAY_BUFFER, Buffer.createByteBuffer(texCoords), GL_STATIC_DRAW); glVertexAttribPointer(1, 3, GL_UNSIGNED_BYTE, false, 0, 1); } glBindBuffer(GL_ARRAY_BUFFER, 0); } glBindVertexArray(0); } public void drawString(String text, int x, int y, int size, int spacing) { glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glActiveTexture(GL_TEXTURE3); shader.bind(); float scale = size / 20.0f; int xx = x; int yy = y; for (int i = 0; i < text.length(); i++) { float xOffset = xx / scale; float yOffset = yy / scale; int currentChar = text.charAt(i); int index = chars.indexOf(currentChar); if (index >= 0 && currentChar != ' ') { if (currentChar == 'p' || currentChar == 'g' || currentChar == 'q' || currentChar == 'y' || currentChar == ',') yOffset += 40; glPushMatrix(); glLoadIdentity(); glScalef(scale, scale, 0); glTranslatef(xOffset, yOffset, 0); glBindTexture(GL_TEXTURE_2D, texIDs[index]); glBindVertexArray(vao); glEnableVertexAttribArray(0); glEnableVertexAttribArray(1); { glTranslatef(x, y, 0); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vio); glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_BYTE, 0); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); } glDisableVertexAttribArray(1); glDisableVertexAttribArray(0); glBindVertexArray(0); glBindTexture(GL_TEXTURE_2D, 0); glPopMatrix(); } xx += (this.size + spacing) * scale; } shader.release(); glDisable(GL_BLEND); } }