Loading a font without Slick.

The title says exactly what I am wondering. How would I load a font without Slick? I know that I would just have to draw a quad with certain texture coordinates and sizes, but how would you find out what character is where, and how big the letter should be?

Take a peek at my GLFont class: https://github.com/CopyableCougar4/Font-Rendering/blob/master/src/com/digiturtle/ui/GLFont.java

Any non-LWJGL dependencies are bundled with that class in the project.

Hope it helps,
CopyableCougar4

Just kind of wondering with that snippet, wouldn’t it be faster to just draw one dynamic VBO, as opposed to many little static VBOs?

The reason I chose many VBOs was because I wasn’t completely worried about performance. I also wanted to not have to rebuild the VBO every new text draw. I built in a slightly faster way to render, by drawing cached text which renders those VBOs in a DisplayList

But yes, there is room for improvement :slight_smile:
CopyableCougar4

Ah, I see. Well thanks man!

I have been working on text rendering lib.
https://www.mediafire.com/?xd9e54mb516k8d1

No idea how well it works on other computers, but seems to work fine on mine. Here is some quick code which will get you started.


JFreeType freetype = JFreeType.createInstance(); // Don't do new JFreeType(), I haven't gotten to prevent that
freetype.create(); // Initialize library

JFreeTypeOptions options = new JFreeTypeOptions(); // Just a data class used to call native functions
options.font = "C:/Windows/Fonts/Arial.ttf"; // Path to font. If you are using windows, should work.
options.text = "Any string of text"; // Any text you want to draw
options.size = 20; // The size of the font.

Bitmap bitmap = jfreetype.render(options); // Returns a bitmap, width and height and pixels

if (bitmap == null) {
	// in case there might have been errors and your application didn't crash :D

	String log = null;
	while ((log = freetype.getLog()) != null) { // get logs until there is none left
		System.out.println("JFreeType log: " + log);
	}
}

int width = bitmap.width; // the width of the returned texture
int height = bitmap.height; // the width of the returned texture

// A direct ByteBuffer. I think you can use it directly as texture data
// to load textures to OpenGL.  The format is RGBA. This is very bad, 
// since it should be ALPHA. 
ByteBuffer textureData = bitmap.pixels;

freetype.destroy(); // clean up, might not be fully functional

@ CopyableCougar4 — That looks ace, I’ll check out that for my work

There is also simpletext that gets thrown around youtube:

package com.base.engine;

import static org.lwjgl.opengl.GL11.*;

public class SimpleText
{

	public static void drawString(String s, int x, int y, int height)
	{
		float scale = height / 8f;
		glTranslatef(x, y, 0);
		glScalef(scale, scale, 1f);
		drawString(s, 0, 0);
		glScalef(1f / scale, 1f / scale, 1f);
		glTranslatef(0 - x, 0 - y, 0);
	}

	public static void drawString(String s, int x, int y)
	{
		s = s.toLowerCase();
		int startX = x;
		glBegin(GL_LINES);
		//glPointSize(3F); // POINT SIZE / BOLDNESS
		for (char c : s.toLowerCase().toCharArray()) {
			if (c == 'a') {
				glVertex2f(x + 1, y);
				glVertex2f(x + 1, y + 8);

				glVertex2f(x + 7, y);
				glVertex2f(x + 7, y + 8);

				glVertex2f(x + 1, y + 8);
				glVertex2f(x + 7, y + 8);

				glVertex2f(x + 1, y + 4);
				glVertex2f(x + 7, y + 4);
				x += 8;
			} else if (c == 'b') {
				glVertex2f(x + 1, y);
				glVertex2f(x + 1, y + 8);

				glVertex2f(x + 1, y);
				glVertex2f(x + 7, y);
				glVertex2f(x + 1, y + 4);
				glVertex2f(x + 7, y + 4);
				glVertex2f(x + 1, y + 8);
				glVertex2f(x + 7, y + 8);

				glVertex2f(x + 7, y + 5);
				glVertex2f(x + 7, y + 8);

				glVertex2f(x + 7, y);
				glVertex2f(x + 7, y + 5);
				x += 8;
			} else if (c == 'c') {
				glVertex2f(x + 1, y);
				glVertex2f(x + 1, y + 8);

				glVertex2f(x + 1, y);
				glVertex2f(x + 6, y);
				glVertex2f(x + 1, y + 8);
				glVertex2f(x + 6, y + 8);

				glVertex2f(x + 6, y);
				glVertex2f(x + 6, y + 2);

				glVertex2f(x + 6, y + 6);
				glVertex2f(x + 6, y + 8);

				x += 8;
			} else if (c == 'd') {
				glVertex2f(x + 7, y + 2);
				glVertex2f(x + 7, y + 6);

				glVertex2f(x + 5, y);
				glVertex2f(x + 2, y);
				glVertex2f(x + 5, y + 8);
				glVertex2f(x + 2, y + 8);

				glVertex2f(x + 5, y);
				glVertex2f(x + 7, y + 2);
				glVertex2f(x + 5, y + 8);
				glVertex2f(x + 7, y + 6);

				glVertex2f(x + 2, y);
				glVertex2f(x + 2, y + 8);

				x += 8;
			} else if (c == 'e') {
				glVertex2f(x + 1, y);
				glVertex2f(x + 1, y + 8);

				glVertex2f(x + 1, y + 0);
				glVertex2f(x + 7, y + 0);
				glVertex2f(x + 1, y + 8);
				glVertex2f(x + 7, y + 8);

				glVertex2f(x + 1, y + 4);
				glVertex2f(x + 6, y + 4);

				x += 8;
			} else if (c == 'f') {
				glVertex2f(x, y);
				glVertex2f(x, y + 8);

				glVertex2f(x, y + 8);
				glVertex2f(x + 6, y + 8);

				glVertex2f(x, y + 4);
				glVertex2f(x + 5, y + 4);

				x += 8;
			} else if (c == 'g') {
				glVertex2f(x + 1, y);
				glVertex2f(x + 1, y + 8);

				glVertex2f(x + 1, y);
				glVertex2f(x + 7, y);
				glVertex2f(x + 1, y + 8);
				glVertex2f(x + 7, y + 8);

				glVertex2f(x + 7, y);
				glVertex2f(x + 7, y + 3);
				glVertex2f(x + 5, y + 3);
				glVertex2f(x + 7, y + 3);

				glVertex2f(x + 7, y + 6);
				glVertex2f(x + 7, y + 8);

				x += 8;
			} else if (c == 'h') {
				glVertex2f(x + 1, y);
				glVertex2f(x + 1, y + 8);
				glVertex2f(x + 7, y);
				glVertex2f(x + 7, y + 8);

				glVertex2f(x + 1, y + 4);
				glVertex2f(x + 7, y + 4);

				x += 8;
			} else if (c == 'i') {
				glVertex2f(x + 3, y);
				glVertex2f(x + 3, y + 8);

				glVertex2f(x + 1, y + 0);
				glVertex2f(x + 5, y + 0);
				glVertex2f(x + 1, y + 8);
				glVertex2f(x + 5, y + 8);

				x += 7;
			} else if (c == 'j') {
				glVertex2f(x + 6, y);
				glVertex2f(x + 6, y + 8);

				glVertex2f(x + 1, y);
				glVertex2f(x + 6, y + 0);

				glVertex2f(x + 1, y);
				glVertex2f(x + 1, y + 2);
				x += 8;
			} else if (c == 'k') {
				glVertex2f(x + 1, y);
				glVertex2f(x + 1, y + 8);

				glVertex2f(x + 1, y + 3);
				glVertex2f(x + 6, y + 8);
				glVertex2f(x + 7, y);
				glVertex2f(x + 2.5f, y + 4.5f);
				x += 8;
			} else if (c == 'l') {
				glVertex2f(x + 1, y);
				glVertex2f(x + 1, y + 8);

				glVertex2f(x + 1, y);
				glVertex2f(x + 6, y);

				x += 7;
			} else if (c == 'm') {
				glVertex2f(x + 1, y);
				glVertex2f(x + 1, y + 8);
				glVertex2f(x + 7, y);
				glVertex2f(x + 7, y + 8);

				glVertex2f(x + 4, y + 5);
				glVertex2f(x + 1, y + 8);

				glVertex2f(x + 4, y + 5);
				glVertex2f(x + 7, y + 8);

				x += 8;
			} else if (c == 'n') {
				glVertex2f(x + 1, y);
				glVertex2f(x + 1, y + 8);
				glVertex2f(x + 7, y);
				glVertex2f(x + 7, y + 8);

				glVertex2f(x + 1, y + 7);
				glVertex2f(x + 7, y + 1);
				x += 8;
			} else if (c == 'o') {
				glVertex2f(x + 1, y);
				glVertex2f(x + 1, y + 8);
				glVertex2f(x + 7, y);
				glVertex2f(x + 7, y + 8);

				glVertex2f(x + 1, y + 8);
				glVertex2f(x + 7, y + 8);
				glVertex2f(x + 1, y + 0);
				glVertex2f(x + 7, y + 0);

				x += 8;
			} else if (c == '0') {
				glVertex2f(x + 1, y);
				glVertex2f(x + 1, y + 8);
				glVertex2f(x + 7, y);
				glVertex2f(x + 7, y + 8);

				glVertex2f(x + 1, y + 8);
				glVertex2f(x + 7, y + 8);
				glVertex2f(x + 1, y + 0);
				glVertex2f(x + 7, y + 0);

				glVertex2f(x + 1, y + 1);
				glVertex2f(x + 7, y + 7);

				x += 8;
			} else if (c == 'p') {
				glVertex2f(x + 1, y);
				glVertex2f(x + 1, y + 8);

				glVertex2f(x + 1, y + 8);
				glVertex2f(x + 6, y + 8);
				glVertex2f(x + 1, y + 4);
				glVertex2f(x + 6, y + 4);

				glVertex2f(x + 6, y + 4);
				glVertex2f(x + 6, y + 8);
				x += 8;
			} else if (c == 'q') {
				glVertex2f(x + 1, y);
				glVertex2f(x + 1, y + 8);
				glVertex2f(x + 7, y + 3);
				glVertex2f(x + 7, y + 8);

				glVertex2f(x + 1, y + 8);
				glVertex2f(x + 7, y + 8);
				glVertex2f(x + 1, y + 0);
				glVertex2f(x + 4, y);

				glVertex2f(x + 4, y);
				glVertex2f(x + 7, y + 3);

				glVertex2f(x + 4, y + 3);
				glVertex2f(x + 7, y);
				x += 8;
			} else if (c == 'r') {
				glVertex2f(x + 1, y);
				glVertex2f(x + 1, y + 8);

				glVertex2f(x + 1, y + 8);
				glVertex2f(x + 6, y + 8);
				glVertex2f(x + 1, y + 4);
				glVertex2f(x + 6, y + 4);

				glVertex2f(x + 6, y + 8);
				glVertex2f(x + 6, y + 4);

				glVertex2f(x + 2, y + 4);
				glVertex2f(x + 6, y);
				x += 7;
			} else if (c == 's') {
				glVertex2f(x + 1, y + 8);
				glVertex2f(x + 7, y + 8);

				glVertex2f(x + 1, y + 8);
				glVertex2f(x + 1, y + 4);

				glVertex2f(x + 1, y + 4);
				glVertex2f(x + 7, y + 4);
				glVertex2f(x + 1, y);
				glVertex2f(x + 7, y);

				glVertex2f(x + 7, y + 4);
				glVertex2f(x + 7, y);
				glVertex2f(x + 1, y);
				glVertex2f(x + 1, y + 2);
				x += 9;
			} else if (c == 't') {
				glVertex2f(x + 4, y);
				glVertex2f(x + 4, y + 8);

				glVertex2f(x + 1, y + 8);
				glVertex2f(x + 7, y + 8);

				x += 8;
			} else if (c == 'u') {
				glVertex2f(x + 1, y);
				glVertex2f(x + 1, y + 8);
				glVertex2f(x + 7, y);
				glVertex2f(x + 7, y + 8);

				glVertex2f(x + 1, y + 0);
				glVertex2f(x + 7, y + 0);

				x += 8;
			} else if (c == 'v') {
				glVertex2f(x + 1, y + 3);
				glVertex2f(x + 1, y + 8);
				glVertex2f(x + 7, y + 3);
				glVertex2f(x + 7, y + 8);

				glVertex2f(x + 1, y + 3);
				glVertex2f(x + 4, y);
				glVertex2f(x + 7, y + 3);
				glVertex2f(x + 4, y);
				x += 9;
			} else if (c == 'w') {
				glVertex2f(x + 1, y + 8);
				glVertex2f(x + 1, y);
				glVertex2f(x + 7, y + 8);
				glVertex2f(x + 7, y);

				glVertex2f(x + 4, y + 3);
				glVertex2f(x + 1, y);

				glVertex2f(x + 4, y + 3);
				glVertex2f(x + 7, y);

				x += 8;
			} else if (c == 'x') {
				glVertex2f(x + 1, y);
				glVertex2f(x + 7, y + 8);
				glVertex2f(x + 1, y + 8);
				glVertex2f(x + 7, y);

				x += 8;
			} else if (c == 'y') {
				glVertex2f(x + 4, y);
				glVertex2f(x + 4, y + 4);

				glVertex2f(x + 4, y + 4);
				glVertex2f(x + 1, y + 7);
				glVertex2f(x + 1, y + 7);
				glVertex2f(x + 1, y + 8);

				glVertex2f(x + 4, y + 4);
				glVertex2f(x + 7, y + 7);
				glVertex2f(x + 7, y + 7);
				glVertex2f(x + 7, y + 8);
				x += 8;
			} else if (c == 'z') {
				glVertex2f(x + 1, y);
				glVertex2f(x + 7, y);
				glVertex2f(x + 1, y + 8);
				glVertex2f(x + 7, y + 8);
				glVertex2f(x + 1, y);
				glVertex2f(x + 7, y + 8);

				x += 8;
			} else if (c == '1') {
				glVertex2f(x + 1, y);
				glVertex2f(x + 5, y);

				glVertex2f(x + 3, y);
				glVertex2f(x + 3, y + 8);

				glVertex2f(x + 1, y + 6);
				glVertex2f(x + 3, y + 8);
				x += 7;
			} else if (c == '2') {
				glVertex2f(x + 1, y);
				glVertex2f(x + 6, y);

				glVertex2f(x + 1, y + 8);
				glVertex2f(x + 6, y + 8);

				glVertex2f(x + 1, y + 8);
				glVertex2f(x + 1, y + 6);

				glVertex2f(x + 6, y + 8);
				glVertex2f(x + 6, y + 5);
				glVertex2f(x + 6, y + 5);
				glVertex2f(x + 1, y);
				x += 8;
			} else if (c == '3') {
				glVertex2f(x + 1, y + 8);
				glVertex2f(x + 6, y + 8);
				glVertex2f(x + 1, y);
				glVertex2f(x + 6, y);

				glVertex2f(x + 6, y);
				glVertex2f(x + 6, y + 8);

				glVertex2f(x + 2, y + 4);
				glVertex2f(x + 6, y + 4);

				x += 8;
			} else if (c == '4') {
				glVertex2f(x + 1, y + 3);
				glVertex2f(x + 1, y + 8);

				glVertex2f(x + 1, y + 3);
				glVertex2f(x + 6, y + 3);

				glVertex2f(x + 6, y);
				glVertex2f(x + 6, y + 8);

				x += 7;
			} else if (c == '5') {
				glVertex2f(x + 1, y + 8);
				glVertex2f(x + 7, y + 8);

				glVertex2f(x + 1, y + 4);
				glVertex2f(x + 1, y + 8);

				glVertex2f(x + 1, y + 1);
				glVertex2f(x + 2, y);

				glVertex2f(x + 2, y);
				glVertex2f(x + 7, y);

				glVertex2f(x + 7, y);
				glVertex2f(x + 7, y + 4);

				glVertex2f(x + 7, y + 4);
				glVertex2f(x + 1, y + 4);
				x += 8;
			} else if (c == '6') {
				glVertex2f(x + 1, y);
				glVertex2f(x + 1, y + 8);

				glVertex2f(x + 1, y);
				glVertex2f(x + 7, y);

				glVertex2f(x + 1, y + 4);
				glVertex2f(x + 6, y + 4);
				glVertex2f(x + 1, y + 8);
				glVertex2f(x + 6, y + 8);

				glVertex2f(x + 7, y);
				glVertex2f(x + 7, y + 3);
				glVertex2f(x + 7, y + 3);
				glVertex2f(x + 6, y + 4);
				x += 8;
			} else if (c == '7') {
				glVertex2f(x + 1, y + 8);
				glVertex2f(x + 7, y + 8);

				glVertex2f(x + 7, y + 8);
				glVertex2f(x + 7, y + 6);

				glVertex2f(x + 7, y + 6);
				glVertex2f(x + 1, y);
				x += 8;
			} else if (c == '8') {
				glVertex2f(x + 1, y);
				glVertex2f(x + 1, y + 8);
				glVertex2f(x + 7, y);
				glVertex2f(x + 7, y + 8);

				glVertex2f(x + 1, y + 8);
				glVertex2f(x + 7, y + 8);
				glVertex2f(x + 1, y + 0);
				glVertex2f(x + 7, y + 0);

				glVertex2f(x + 1, y + 4);
				glVertex2f(x + 7, y + 4);

				x += 8;
			} else if (c == '9') {
				glVertex2f(x + 7, y);
				glVertex2f(x + 7, y + 8);

				glVertex2f(x + 1, y + 4);
				glVertex2f(x + 1, y + 8);

				glVertex2f(x + 1, y + 8);
				glVertex2f(x + 7, y + 8);
				glVertex2f(x + 2, y + 0);
				glVertex2f(x + 7, y + 0);

				glVertex2f(x + 1, y + 4);
				glVertex2f(x + 7, y + 4);
				x += 8;
			} else if (c == '.') {
				glVertex2f(x + 1, y);
				glVertex2f(x + 1, y + 1);
				x += 2;
			} else if (c == '\'') {
				glVertex2f(x + 1, y + 6);
				glVertex2f(x + 1, y + 8);
				x += 2;
			} else if (c == '!') {
				glVertex2f(x + 1, y + 8);
				glVertex2f(x + 1, y + 3);
				glVertex2f(x + 1, y);
				glVertex2f(x + 1, y + 1);
				x += 2;
			} else if (c == ':') {
				glVertex2f(x + 1, y + 5);
				glVertex2f(x + 1, y + 7);
				glVertex2f(x + 1, y + 1);
				glVertex2f(x + 1, y + 3);
				x += 2;
			} else if (c == '?') {
				glVertex2f(x + 1, y + 6);
				glVertex2f(x + 1, y + 8);
				glVertex2f(x + 1, y + 8);
				glVertex2f(x + 5, y + 8);
				glVertex2f(x + 5, y + 8);
				glVertex2f(x + 5, y + 5);
				glVertex2f(x + 5, y + 5);
				glVertex2f(x + 3, y + 5);
				glVertex2f(x + 3, y + 5);
				glVertex2f(x + 3, y + 3);
				glVertex2f(x + 3, y);
				glVertex2f(x + 3, y + 1);
				x += 6;
			} else if (c == ',') {
				glVertex2f(x + 1, y - 1);
				glVertex2f(x + 1, y + 1);
				x += 2;
			} else if (c == '\n') {
				y -= 10;
				x = startX;
			} else if (c == ' ') {
				x += 8;
			}
		}
		glEnd();
	}
}

Paste bin, use it lol

Sorry mate - I’ll know next time pretty new to this :slight_smile:

Why would you not want to use Slick’s internal Font classes?

Just curious, because it’s possible whatever functionality you’re trying to gain Slick can already do, you just don’t know how to do it. :slight_smile:

I had the problem with Slicks font class with drawing/transparency issues hence using the class I suggested which is very basic though

If I was to use Slicks fonts it would not let me display OpenGL drawings, even did a load of google searching without success. Something to do without it renders, but it would let me display images, I’m guessing Slicks method of fonts is transfering them to images for display

Retro-Pixel Castles actually uses Slick’s font classes, I just built a wrapper around them that I funnel through so I can have quick/easy methods like drawStringCentered(). Have you tried using AngleCodeFont instead? That’s the one I use, it uses BMFonts instead of standard ones, and can be rendered with no Anti-Aliasing what so ever.

Excellent, that retro pixels looks amazing, is there any demo anywhere? I’m short of funds at the moment but been dying to play it!

As for your comment, there is also this great bit of code using java GL with fonts…

http://potatoland.org/code/gl/source/glapp/GLFont.java