Skip to content

Instantly share code, notes, and snippets.

@Pamelloes
Created May 29, 2012 00:30
Show Gist options
  • Save Pamelloes/2821870 to your computer and use it in GitHub Desktop.
Save Pamelloes/2821870 to your computer and use it in GitHub Desktop.
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();
}
}
package org.dyndns.pamelloes.Corruptopoly.screen.menu;
import java.awt.Font;
import java.awt.image.BufferedImage;
import java.io.File;
import java.nio.ByteBuffer;
import javax.imageio.ImageIO;
import org.dyndns.pamelloes.Corruptopoly.render.FontRenderer;
import org.dyndns.pamelloes.Corruptopoly.render.PrimitiveBatch;
import org.dyndns.pamelloes.Corruptopoly.render.Texture;
import org.dyndns.pamelloes.Corruptopoly.util.FileUtil;
import org.lwjgl.BufferUtils;
import org.lwjgl.opengl.GL11;
public class MainMenu extends MenuScreen {
private Texture tex;
private FontRenderer render = new FontRenderer(Font.decode("Arial").deriveFont(20f));
public MainMenu() {
File file = new File(FileUtil.getResourceDirectory(), "Corruptopoly.png");
BufferedImage image = null;
try {
image = ImageIO.read(file);
} catch(Exception e) {
e.printStackTrace();
}
if(image == null) System.exit(0);//no better option atm
tex = new Texture(image);
}
@Override
public void onEnable() {
tex.load();
}
@Override
public void onDisable() {
tex.unload();
}
@Override
public void drawOverlay(float offset, PrimitiveBatch renderer) {
render.renderString("Test", -1f, -0.25f, -1f, 0.5f, renderer);
renderer.getRenderer().getShader().setUniform("tex", tex);
renderer.begin();
renderer.addTexturedQuad(new float[]{-1,-1,0}, new float[]{-1,1,0}, new float[]{1,1,0}, new float[]{1,-1,0}, 0, 0, 1920f/2048f, 1080f/2048f);
renderer.end();
renderer.draw();
}
}
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