From 180aad05decc7eefa87e4e45d6747c48f40e5361 Mon Sep 17 00:00:00 2001 From: Tyler Murphy Date: Mon, 17 Apr 2023 12:12:01 -0400 Subject: save --- .../tylermurphy/Minecraft/Render/FontRenderer.java | 101 +++++++++++++++++++++ 1 file changed, 101 insertions(+) create mode 100755 src/main/java/net/tylermurphy/Minecraft/Render/FontRenderer.java (limited to 'src/main/java/net/tylermurphy/Minecraft/Render/FontRenderer.java') 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> 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); + } + +} -- cgit v1.2.3-freya