GLetraUSW: modo de empleo
No tiene mucha complicación pero hay que saber como.
Lo primero será incluir el fichero de GLetraUSW en nuestro código.
1
|
#include "GLetraUSW.hpp"
|
Dentro de este fichero está la inclusión de los ficheros de cabecera de FreeType2. Se pueden dejar ahà o sacarlos fuera, según convenga.
Luego hay que crear un objeto para una fuente. Esto se puede hacer en cualquier momento, aunque la carga de la fuente se debe hacer despues de inicializar OpenGL y asegurarse de que la extensión "ARB_vertex_buffer_object" está soportada (con GLEE o GLEW es fácil).
1
2
3
4
5
6
7
|
GLetraUSW fuente;
// Antes de cargar la fuente OpenGL debe estar inicializado
fuente.color(255,200,0);
fuente.tamano(30);
fuente.carga("times.ttf");
|
o
1
2
3
4
5
6
7
|
fuente=new GLetraUSW();
// Antes de cargar la fuente OpenGL debe estar inicializado
fuente->color(255,200,0);
fuente->tamano(30);
fuente->carga("times.ttf");
|
También se puede cargar la fuente desde memoria si la hubieramos cargado de otro modo en un buffer.
1
2
3
4
5
6
7
8
9
10
11
|
char *buffer; // buffer para cargar el fichero
unsigned long tamano; //tamaño que ocupara el fichero en memoria
// Cargamos en el buffer el fichero de alguna forma
fuente=new GLetraUSW;
fuente->color(255,200,0);
fuente->tamano(30);
fuente->carga(buffer, tamano ); // cargo desde memoria
// Ya puedo liberar el espacio del buffer
|
Despues podemos pintar en cualquier momento y en cualquier lugar.
1
|
fuente->escribe(100,100,"Letra times de 30 pixels");
|
o
1
2
|
fuente->posicion(100,100);
fuente->escribe("Letra times de 30 pixels");
|
Y el resultado será poner el texto de 30 pixels de alto en el pixel de coordenadas 100, 100 desde la esquina superior izquierda, en amarillo con un resultado asÃ.

El tamaño lo ponemos antes de cargar la fuente. Esto quiere decir que será fijo, aunque después intentemos cambiarlo, la función "tamano" no hará nada. El color, en cambio, si se puede cambiar cuando queramos, siempre que la letra no tenga borde. El color, eso si, se indica con 3 parametros, RGB de 0 a 255 cada uno. En caso de poner borde se añade el color del borde en la función "color" y el grosor del borde en la función "tamano", y ya no se podrán cambiar los colores (al contrario que sin borde).
1
2
3
4
5
6
7
|
GLetraUSW fuente;
// Antes de cargar la fuente OpenGL debe estar inicializado
fuente.color(0,0,255,255,255,255);
fuente.tamano(50,2);
fuente.carga("tahoma.ttf");
|
resultado:

Con la sombra será parecido. Debemos usar la función "sombra" antes de la función carga para que genere la textura que se usará luego al pintar la sombra. Si no se lo indicamos antes de cargar no la generará y no podremos usar la sonbra con esa fuente. Una vez generada podremos habilitarla o deshabilitarla pero siempre con el mismo tono que indicamos al generar.
1
2
3
4
5
6
7
8
|
GLetraUSW fuente;
// Antes de cargar la fuente OpenGL debe estar inicializado
fuente.color(0,0,255,255,255,255);
fuente.tamano(70,3);
fuente.sombra(100,20,20); // 100 de intensidad y a 20 de distancia X e Y
fuente.carga("medieval.ttf");
|
se ve asÃ:

En general las letras con borde quedan mejor en tamaños grandes pero depende mucho del diseño de la fuente. Como habreis notado también se puede elegir la distancia de la sombra a la letra. Si llamamos a la función "sombra" sin parametros o con el primer parametro 0, lo siguiente no se pintará con sombra.
Pasando a la función para pintar, hace falta una aclaración. En sus dos versiones, con o sin coordenadas X e Y, admite más parametros al estilo printf. Veamos un ejemplo.
1
2
3
|
int zi=457;
float zf=3.1415;
fuente->escribe("Un entero: %i - El número pi: %.2f",zi,zf);
|
saldrá esto:

Otra función es "gira" que permite rotar el texto.
1
2
|
fuente->gira(20);
fuente->escribe("Texto girado 20 grados");
|
pintará esto:

Otra función importante es "origen" que permite cambiar donde se pinta el texto respecto a las coordenadas. Hay dos opciones en está función, que la posición del texto corresponde a la esquina superior izquierda del boundingbox o que corresponda a donde empezarÃa el rengló o subrrayado del texto. Con ejemplos se verá mejor. Las rayas se cruzan en la posición donde pondremos el texto, en la misma posición en los dos ejemplos.
1
2
|
fuente->origen(USWarriba);
fuente->escribe(100,100,"En la posición 100,100");
|
hará esto:

y
1
2
|
fuente->origen(USWrenglon);
fuente->escribe(100,100,"En la posición 100,100");
|
hará esto:

Para el cálculo del bounding box del texto que queramos hay una estructura para almacenar los datos y una función, "limites". Se puede calcular antes o despues de pintar el texto. Antes:
1
2
3
4
5
6
7
8
9
10
11
|
USWlimites bb; //para guandar los datos
fuente->posicion(150,250);
fuente->limites(&bb,"Texto en un cuadro"); //calculo el bounding box
glBegin(GL_QUADS); // pinto el bounding box -proyección ortogonal-
glColor3ub(200,150,0);
glVertex2i(bb.posx,bb.posy);
glVertex2i(bb.posx,bb.posy+bb.tamy);
glVertex2i(bb.posx+bb.tamx,bb.posy+bb.tamy);
glVertex2i(bb.posx+bb.tamx,bb.posy);
glEnd();
fuente->escribe(150,250,"Texto en un cuadro");
|
queda esto:

o calculado despues:
1
2
3
4
5
6
7
8
9
10
|
USWlimites bb; //para guandar los datos
fuente->escribe(150,250,"Texto en un cuadro");
fuente->limites(&bb); //calculo el bounding box
glBegin(GL_LINE_LOOP); // pinto el bounding box -proyección ortogonal-
glColor3ub(0,0,0);
glVertex2i(bb.posx,bb.posy);
glVertex2i(bb.posx,bb.posy+bb.tamy);
glVertex2i(bb.posx+bb.tamx,bb.posy+bb.tamy);
glVertex2i(bb.posx+bb.tamx,bb.posy);
glEnd();
|
queda si:

Puede que queramos saber el espacio (el alto) que debemos reservar para pintar en pantalla cualquier letra de una fuente y que quepa. Para saber el tamaño máximo (el alto) de una fuente podemos usar la función "maxtamy" sin argumentos, que devuelve el alto máximo de la fuente.
1
|
int alto = fuente->maxtamy();
|
También podemos hacer esto:
1
2
3
4
5
6
7
8
9
10
|
USWlimites bb; //para guandar los datos
fuente->escribe(150,250,"Texto en un cuadro");
fuente->limites(&bb); //calculo el bounding box
glBegin(GL_LINE_LOOP); // pinto el bounding box -proyección ortogonal-
glColor3ub(255,255,255);
glVertex2i(bb.posx,bb.posyMax);
glVertex2i(bb.posx,bb.posyMax+bb.tamyMax);
glVertex2i(bb.posx+bb.tamx,bb.posyMax+bb.tamyMax);
glVertex2i(bb.posx+bb.tamx,bb.posyMax);
glEnd();
|
que da este resultado:

Como se ve, el alto del cuadro es mayor.
Ahora veremos como colocar el texto para escribir un texto más largo. Primero pintaremos en un punto de la pantalla, iremos poniendo más texto, y cuando queramos cambiar de lÃnea usaremos la función "nl" (por nueva lÃnea). Veremos que si no indicamos la posición podemos ir encadenando texto. Veamos un ejemplo:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
fuente->sombra(100,2,2);
fuente->color(250,250,0);
fuente->escribe(150,200,"1ª ");
fuente->escribe("lÃnea");
fuente->escribe(" hasta que usemos");
fuente->escribe(" la función \"nl\"");
fuente->nl();
fuente->escribe("segunda lÃnea");
fuente->escribe("... y otro \"nl\"");
fuente->nl();
fuente->escribe("3ª lÃnea ");
fuente->escribe("y 2 lÃneas en blanco");
fuente->nl(3);
fuente->escribe("después de 2 lÃneas en blanco");
|
Dara como resultado esto:

Por último, el array "Error" almacenará el texto de los errores, si los hubiera y estuviera contemplado en el código. En caso contrario, si no hay error, su primera posición será 0.
Asà pues, ya está todo lo necesario para descargar y usar GLetraUSW.
Este otro link es por si el fichero zipeado del anterior no se ve bien (en linux): GLetraUSW
|