diff options
Diffstat (limited to 'src/main/java/net/tylermurphy/Minecraft/Render/FontRenderer.java')
-rwxr-xr-x | src/main/java/net/tylermurphy/Minecraft/Render/FontRenderer.java | 101 |
1 files changed, 101 insertions, 0 deletions
diff --git a/src/main/java/net/tylermurphy/Minecraft/Render/FontRenderer.java b/src/main/java/net/tylermurphy/Minecraft/Render/FontRenderer.java new file mode 100755 index 0000000..ed17824 --- /dev/null +++ b/src/main/java/net/tylermurphy/Minecraft/Render/FontRenderer.java @@ -0,0 +1,101 @@ +package net.tylermurphy.Minecraft.Render;
+
+import java.util.List;
+
+import java.util.Map;
+
+import net.tylermurphy.Minecraft.Render.Data.Mesh;
+import org.lwjgl.opengl.GL11;
+import org.lwjgl.opengl.GL13;
+import org.lwjgl.opengl.GL20;
+import org.lwjgl.opengl.GL30;
+import org.joml.Matrix4f;
+import org.joml.Vector2f;
+import org.joml.Vector4f;
+
+import net.tylermurphy.Minecraft.Render.Shaders.FontShader;
+import net.tylermurphy.Minecraft.Render.Shaders.QuadShader;
+import net.tylermurphy.Minecraft.UI.UIFont;
+import net.tylermurphy.Minecraft.UI.UIText;
+import net.tylermurphy.Minecraft.Util.Maths;
+
+public class FontRenderer {
+
+ private final Mesh quad;
+ private final FontShader fontShader;
+ private final QuadShader quadShader;
+
+ public FontRenderer() {
+ float[] positions = {-1, 1, -1, -1, 1, 1, 1, -1};
+ quad = new Mesh(positions.length/2).store(positions, 2).finish();
+ fontShader = new FontShader();
+ quadShader = new QuadShader();
+ }
+
+ public void render(Map<UIFont, List<UIText>> texts){
+ for(UIFont font : texts.keySet()){
+ for(UIText text : texts.get(font)){
+ renderQuad(text);
+ }
+ }
+ prepare();
+ for(UIFont font : texts.keySet()){
+ GL13.glActiveTexture(GL13.GL_TEXTURE0);
+ GL11.glBindTexture(GL11.GL_TEXTURE_2D, font.getTextureAtlas());
+ for(UIText text : texts.get(font)){
+ renderText(text);
+ }
+ }
+ endRendering();
+ }
+
+ public void cleanUp(){
+ fontShader.cleanUp();
+ quadShader.cleanUp();
+ }
+
+ private void prepare(){
+ GL11.glEnable(GL11.GL_BLEND);
+ GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
+ GL11.glDisable(GL11.GL_DEPTH_TEST);
+ fontShader.start();
+ }
+
+ private void renderText(UIText text){
+ GL30.glBindVertexArray(text.getMesh());
+ GL20.glEnableVertexAttribArray(0);
+ GL20.glEnableVertexAttribArray(1);
+ fontShader.loadColor(text.getColour());
+ fontShader.loadTranslation(text.getConvertedPosition());
+ GL11.glDrawArrays(GL11.GL_TRIANGLES, 0, text.getVertexCount());
+ GL20.glDisableVertexAttribArray(0);
+ GL20.glDisableVertexAttribArray(1);
+ GL30.glBindVertexArray(0);
+ }
+
+ private void renderQuad(UIText text) {
+ quadShader.start();
+ GL30.glBindVertexArray(quad.getID());
+ GL20.glEnableVertexAttribArray(0);
+ GL11.glEnable(GL11.GL_BLEND);
+ GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
+ GL11.glDisable(GL11.GL_DEPTH_TEST);
+ Matrix4f matrix = Maths.createTransformationMatrix(new Vector2f(text.getStretchBackdrop() ? -1 : text.getConvertedPosition().x*2-1,(1-text.getConvertedPosition().y-.0125f*text.getFontSize()-.0025f)*2-1), new Vector2f(text.getStretchBackdrop() ? 2 : (float) text.getMaxX()*2,.025f*text.getFontSize()));
+ quadShader.loadTransformation(matrix);
+ quadShader.loadColor(new Vector4f(150/255f,150/255f,150/255f,.5f));
+ GL11.glDrawArrays(GL11.GL_TRIANGLE_STRIP, 0, quad.getVertexCount());
+ GL11.glEnable(GL11.GL_DEPTH_TEST);
+ GL20.glDisableVertexAttribArray(0);
+ GL30.glBindVertexArray(0);
+ quadShader.stop();
+ GL11.glDisable(GL11.GL_BLEND);
+ GL11.glEnable(GL11.GL_DEPTH_TEST);
+ }
+
+ private void endRendering(){
+ fontShader.stop();
+ GL11.glDisable(GL11.GL_BLEND);
+ GL11.glEnable(GL11.GL_DEPTH_TEST);
+ }
+
+}
|