Created
May 29, 2012 00:30
-
-
Save Pamelloes/2821870 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package org.dyndns.pamelloes.Corruptopoly.render; | |
import java.awt.Color; | |
import java.awt.Font; | |
import java.awt.Graphics2D; | |
import java.awt.Rectangle; | |
import java.awt.font.FontRenderContext; | |
import java.awt.font.GlyphVector; | |
import java.awt.geom.Rectangle2D; | |
import java.awt.image.BufferedImage; | |
import java.io.File; | |
import javax.imageio.ImageIO; | |
import org.dyndns.pamelloes.Corruptopoly.util.FileUtil; | |
public class FontRenderer { | |
private static final FontRenderContext DEFAULT_CONTEXT = new FontRenderContext(null, true, true); | |
private Font font; | |
private Texture tex; | |
private GlyphVector vec; | |
private String charset; | |
private int imagewidth; | |
private int imageheight; | |
public FontRenderer(Font font) { | |
this.font = font; | |
charset = getASCIICharacters(); | |
vec = font.createGlyphVector(DEFAULT_CONTEXT, charset); | |
Rectangle2D bounds = font.getStringBounds(charset, DEFAULT_CONTEXT); | |
//make image | |
BufferedImage image = new BufferedImage(roundUpPowerOf2((int) bounds.getWidth()), roundUpPowerOf2((int) bounds.getHeight()), BufferedImage.TYPE_INT_ARGB); | |
Graphics2D g = image.createGraphics(); | |
g.setColor(Color.WHITE); | |
g.fillRect(0, 0, image.getWidth(), image.getHeight()); | |
g.setColor(Color.BLACK); | |
g.drawGlyphVector(vec, 0, font.getSize()); | |
g.dispose(); | |
try { | |
ImageIO.write(image, "png", new File(FileUtil.getResourceDirectory(), font.getName() + ".png")); | |
} catch(Exception e) { | |
} | |
//set up texture | |
imagewidth = image.getWidth(); | |
imageheight = image.getHeight(); | |
tex = new Texture(image); | |
tex.load(); | |
} | |
private String getASCIICharacters() { | |
StringBuilder res = new StringBuilder(); | |
for(int i = 32; i < 127; i++) res.append((char) i); | |
return res.toString(); | |
} | |
private int roundUpPowerOf2(int round) { | |
return (int) Math.pow(2, round == 0 ? 0 : 32 - Integer.numberOfLeadingZeros(round - 1)); | |
} | |
/** | |
* Gets the Font object this FontRenderer renders. | |
*/ | |
public Font getFont() { | |
return font; | |
} | |
public void renderString(String string, float x, float y, float z, float height, PrimitiveBatch render) { | |
render.getRenderer().getShader().setUniform("tex", tex); | |
System.out.println(tex.getTextureID()); | |
render.begin(); | |
float lx = x; | |
for(char c : string.toCharArray()) { | |
int index = charset.indexOf(c); | |
Rectangle bounds = vec.getGlyphPixelBounds(index, DEFAULT_CONTEXT, 0, 0); | |
System.out.println("Rectangle: (" + bounds.x + "," + bounds.y + ") width=" + bounds.width + ", height=" + bounds.height); | |
float width = ((float) bounds.getWidth() * (float) height)/(float) imageheight; | |
render.addTexturedQuad(new float[]{lx,y+height,z}, new float[]{lx,y,z}, new float[]{lx+width,y,z}, new float[]{lx+width,y+height,z}, (float) bounds.getX()/(float)imagewidth, (float) bounds.getY()/(float)imageheight, (float) bounds.getWidth()/(float)imagewidth, (float) bounds.getHeight()/(float)imageheight); | |
lx+=width; | |
} | |
render.end(); | |
render.draw(); | |
} | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package org.dyndns.pamelloes.Corruptopoly.render; | |
import java.awt.Color; | |
import org.dyndns.pamelloes.Corruptopoly.util.MathHelper; | |
import org.lwjgl.opengl.GL11; | |
public class PrimitiveBatch { | |
BatchVertexRenderer renderer; | |
private final float[][] cubeCorners = new float[][]{{0,0,0}, {0,1,0}, {0, 1, 1}, {0,0,1}, | |
{1,0,0}, {1, 1, 0}, {1,1,1}, {1, 0, 1}}; | |
public PrimitiveBatch() { | |
renderer = BatchVertexRenderer.constructNewBatch(GL11.GL_TRIANGLES); | |
} | |
public BatchVertexRenderer getRenderer() { | |
return renderer; | |
} | |
public void begin() { | |
renderer.begin(); | |
} | |
/*public void addCube(Vector3 location, Vector3 scale, float[][] coords, boolean[] sides) { | |
if (sides.length != 6) { | |
throw new IllegalStateException("Must have 6 sides!"); | |
} | |
boolean offset = false; | |
if(coords.length == 24) offset = true; | |
else if(coords.length == 4) offset = false; | |
else throw new IllegalArgumentException("You can only have 4 or 24 coordiantes!"); | |
if (sides[0]) { | |
addQuad(cubeCorners[0].multiply(scale).add(location), cubeCorners[1].multiply(scale).add(location), cubeCorners[2].multiply(scale).add(location), cubeCorners[3].multiply(scale).add(location), coords, 0); | |
} | |
if (sides[1]) { | |
addQuad(cubeCorners[7].multiply(scale).add(location), cubeCorners[6].multiply(scale).add(location), cubeCorners[5].multiply(scale).add(location), cubeCorners[4].multiply(scale).add(location), coords, offset ? 4 : 0); | |
} | |
if (sides[2]) { | |
addQuad(cubeCorners[3].multiply(scale).add(location), cubeCorners[2].multiply(scale).add(location), cubeCorners[6].multiply(scale).add(location), cubeCorners[7].multiply(scale).add(location), coords, offset ? 8 : 0); | |
} | |
if (sides[3]) { | |
addQuad(cubeCorners[4].multiply(scale).add(location), cubeCorners[5].multiply(scale).add(location), cubeCorners[1].multiply(scale).add(location), cubeCorners[0].multiply(scale).add(location), coords, offset ? 12 : 0); | |
} | |
if (sides[4]) { | |
addQuad(cubeCorners[1].multiply(scale).add(location), cubeCorners[5].multiply(scale).add(location), cubeCorners[6].multiply(scale).add(location), cubeCorners[2].multiply(scale).add(location), coords, offset ? 16 : 0); | |
} | |
if (sides[5]) { | |
addQuad(cubeCorners[4].multiply(scale).add(location), cubeCorners[0].multiply(scale).add(location), cubeCorners[3].multiply(scale).add(location), cubeCorners[7].multiply(scale).add(location), coords, offset ? 20 : 0); | |
} | |
}*/ | |
// z-1 - z+1 - x+1 - x-1 - y+1 - y-1 | |
public void addCube(float[] location, float[] scale, Color c, boolean[] sides) { | |
if (sides.length != 6) { | |
throw new IllegalStateException("Must have 6 sides!"); | |
} | |
if (sides[0]) { | |
addQuad(MathHelper.add3(MathHelper.multiply3(cubeCorners[0],scale),location), MathHelper.add3(MathHelper.multiply3(cubeCorners[1],scale),location), MathHelper.add3(MathHelper.multiply3(cubeCorners[2],scale),location), MathHelper.add3(MathHelper.multiply3(cubeCorners[3],scale),location), c); | |
} | |
if (sides[1]) { | |
addQuad(MathHelper.add3(MathHelper.multiply3(cubeCorners[7],scale),location), MathHelper.add3(MathHelper.multiply3(cubeCorners[6],scale),location), MathHelper.add3(MathHelper.multiply3(cubeCorners[5],scale),location), MathHelper.add3(MathHelper.multiply3(cubeCorners[4],scale),location), c); | |
} | |
if (sides[2]) { | |
addQuad(MathHelper.add3(MathHelper.multiply3(cubeCorners[3],scale),location), MathHelper.add3(MathHelper.multiply3(cubeCorners[2],scale),location), MathHelper.add3(MathHelper.multiply3(cubeCorners[6],scale),location), MathHelper.add3(MathHelper.multiply3(cubeCorners[7],scale),location), c); | |
} | |
if (sides[3]) { | |
addQuad(MathHelper.add3(MathHelper.multiply3(cubeCorners[4],scale),location), MathHelper.add3(MathHelper.multiply3(cubeCorners[5],scale),location), MathHelper.add3(MathHelper.multiply3(cubeCorners[1],scale),location), MathHelper.add3(MathHelper.multiply3(cubeCorners[0],scale),location), c); | |
} | |
if (sides[4]) { | |
addQuad(MathHelper.add3(MathHelper.multiply3(cubeCorners[1],scale),location), MathHelper.add3(MathHelper.multiply3(cubeCorners[5],scale),location), MathHelper.add3(MathHelper.multiply3(cubeCorners[6],scale),location), MathHelper.add3(MathHelper.multiply3(cubeCorners[2],scale),location), c); | |
} | |
if (sides[5]) { | |
addQuad(MathHelper.add3(MathHelper.multiply3(cubeCorners[4],scale),location), MathHelper.add3(MathHelper.multiply3(cubeCorners[0],scale),location), MathHelper.add3(MathHelper.multiply3(cubeCorners[3],scale),location), MathHelper.add3(MathHelper.multiply3(cubeCorners[7],scale),location), c); | |
} | |
} | |
public void addQuad(float[] a, float[] b, float[] c, float[] d, Color col) { | |
renderer.addColor(col); | |
renderer.addVertex(a[0], a[1], a[2]); | |
renderer.addColor(col); | |
renderer.addVertex(b[0], b[1], b[2]); | |
renderer.addColor(col); | |
renderer.addVertex(c[0], c[1], c[2]); | |
renderer.addColor(col); | |
renderer.addVertex(c[0], c[1], c[2]); | |
renderer.addColor(col); | |
renderer.addVertex(a[0], a[1], a[2]); | |
renderer.addColor(col); | |
renderer.addVertex(d[0], d[1], d[2]); | |
} | |
public void addTexturedQuad(float[] a, float[] b, float[] c, float[] d, float x, float y, float width, float height) { | |
renderer.addTexCoord(x + height, y); | |
renderer.addVertex(a[0], a[1], a[2]); | |
renderer.addTexCoord(x, y); | |
renderer.addVertex(b[0], b[1], b[2]); | |
renderer.addTexCoord(x, y + width); | |
renderer.addVertex(c[0], c[1], c[2]); | |
renderer.addTexCoord(x, y + width); | |
renderer.addVertex(c[0], c[1], c[2]); | |
renderer.addTexCoord(x + height, y); | |
renderer.addVertex(a[0], a[1], a[2]); | |
renderer.addTexCoord(x + height, y + width); | |
renderer.addVertex(d[0], d[1], d[2]); | |
} | |
/*public void addQuad(Vector3 a, Vector3 b, Vector3 c, Vector3 d, float[][] coords, int offset) { | |
renderer.addTexCoord(coords[0 + offset][0], coords[0 + offset][1]); | |
//renderer.addTexCoord(0.0f, 0.0f); | |
renderer.addVertex(a); | |
renderer.addTexCoord(coords[1 + offset][0], coords[1 + offset][1]); | |
//renderer.addTexCoord(0.0f, 1.0f); | |
renderer.addVertex(b); | |
renderer.addTexCoord(coords[2 + offset][0], coords[2 + offset][1]); | |
//renderer.addTexCoord(1.0f, 0.0f); | |
renderer.addVertex(c); | |
renderer.addTexCoord(coords[2 + offset][0], coords[2 + offset][1]); | |
//renderer.addTexCoord(1.0f, 1.0f); | |
renderer.addVertex(c); | |
renderer.addTexCoord(coords[0 + offset][0], coords[0 + offset][1]); | |
//renderer.addTexCoord(0.0f, 0.0f); | |
renderer.addVertex(a); | |
renderer.addTexCoord(coords[3 + offset][0], coords[3 + offset][1]); | |
//renderer.addTexCoord(1.0f, 0.0f); | |
renderer.addVertex(d); | |
}*/ | |
public void end() { | |
renderer.end(); | |
} | |
public void draw() { | |
renderer.render(); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment