package com.igorcrevar.goingunder.utils; import java.util.ArrayList; import com.badlogic.gdx.Gdx; import com.badlogic.gdx.graphics.GL20; import com.badlogic.gdx.graphics.g2d.TextureRegion; import com.badlogic.gdx.graphics.glutils.ShaderProgram; import com.badlogic.gdx.math.Matrix4; import com.badlogic.gdx.utils.Disposable; public class MyFontDrawerBatch implements Disposable { private ShaderProgram sp; private IMyFontDrawerFont myFont; private ArrayList<MyFontDrawer> fonts = new ArrayList<MyFontDrawer>(4); private Matrix4 projectionMatrix = new Matrix4(); public MyFontDrawerBatch(IMyFontDrawerFont myFont) { this.myFont = myFont; String vertexShader = "attribute vec4 " + ShaderProgram.POSITION_ATTRIBUTE + ";\n" // + "attribute vec2 " + ShaderProgram.TEXCOORD_ATTRIBUTE + "0;\n" // + "uniform mat4 u_projTrans;\n" // + "varying vec2 v_texCoords;\n" // + "\n" // + "void main()\n" // + "{\n" // + " v_texCoords = " + ShaderProgram.TEXCOORD_ATTRIBUTE + "0;\n" // + " gl_Position = u_projTrans * " + ShaderProgram.POSITION_ATTRIBUTE + ";\n" // + "}\n"; String fragmentShader = "#ifdef GL_ES\n" + "precision mediump float;\n" + "#endif\n" + "varying vec2 v_texCoords;\n" // + "uniform sampler2D u_texture;\n" // + "void main()\n"// + "{\n" // + " gl_FragColor = texture2D(u_texture, v_texCoords);\n" // + "}"; // make an actual shader from our strings sp = new ShaderProgram(vertexShader, fragmentShader); // check there's no shader compile errors if (sp.isCompiled() == false) throw new IllegalStateException(sp.getLog()); } public MyFontDrawer addNew(String value, TextureRegion textureRegion, float startX, float startY, float width, float height, float letterPadding, float cellPadding) { MyFontDrawer drawer = new MyFontDrawer(myFont, value, textureRegion, startX, startY, width, height, letterPadding, cellPadding); fonts.add(drawer); return drawer; } public void draw() { Gdx.gl.glEnable(GL20.GL_BLEND); Gdx.gl.glBlendFunc(GL20.GL_SRC_ALPHA, GL20.GL_ONE_MINUS_SRC_ALPHA); Gdx.gl.glEnable(GL20.GL_TEXTURE_2D); Gdx.gl.glActiveTexture(GL20.GL_TEXTURE0); sp.begin(); sp.setUniformi("u_texture", 0); for (MyFontDrawer fd : fonts) { projectionMatrix.setToOrtho2D(0, 0, 1080, 1920); sp.setUniformMatrix("u_projTrans", projectionMatrix.mul(fd.getViewModelMatrix())); fd.draw(sp); } sp.end(); } @Override public void dispose() { for (MyFontDrawer fd : fonts) { fd.dispose(); } sp.dispose(); } }