FossilOrigin-Name: 0a0d4f91558171cf85e108964a5fed9e1c390a8343e9d2eda086c9c20fde7d1a
235 lines
6 KiB
C++
235 lines
6 KiB
C++
// rendertext.cpp: based on Don's gl_text.cpp
|
|
|
|
#include "cube.h"
|
|
|
|
short char_coords[96][4] = {
|
|
{0, 0, 25, 64}, //!
|
|
{25, 0, 54, 64}, //"
|
|
{54, 0, 107, 64}, // #
|
|
{107, 0, 148, 64}, //$
|
|
{148, 0, 217, 64}, //%
|
|
{217, 0, 263, 64}, //&
|
|
{263, 0, 280, 64}, //'
|
|
{280, 0, 309, 64}, //(
|
|
{309, 0, 338, 64}, //)
|
|
{338, 0, 379, 64}, //*
|
|
{379, 0, 432, 64}, //+
|
|
{432, 0, 455, 64}, //,
|
|
{455, 0, 484, 64}, //-
|
|
{0, 64, 21, 128}, //.
|
|
{23, 64, 52, 128}, ///
|
|
{52, 64, 93, 128}, // 0
|
|
{93, 64, 133, 128}, // 1
|
|
{133, 64, 174, 128}, // 2
|
|
{174, 64, 215, 128}, // 3
|
|
{215, 64, 256, 128}, // 4
|
|
{256, 64, 296, 128}, // 5
|
|
{296, 64, 337, 128}, // 6
|
|
{337, 64, 378, 128}, // 7
|
|
{378, 64, 419, 128}, // 8
|
|
{419, 64, 459, 128}, // 9
|
|
{459, 64, 488, 128}, //:
|
|
{0, 128, 29, 192}, //;
|
|
{29, 128, 81, 192}, //<
|
|
{81, 128, 134, 192}, //=
|
|
{134, 128, 186, 192}, //>
|
|
{186, 128, 221, 192}, //?
|
|
{221, 128, 285, 192}, //@
|
|
{285, 128, 329, 192}, // A
|
|
{329, 128, 373, 192}, // B
|
|
{373, 128, 418, 192}, // C
|
|
{418, 128, 467, 192}, // D
|
|
{0, 192, 40, 256}, // E
|
|
{40, 192, 77, 256}, // F
|
|
{77, 192, 127, 256}, // G
|
|
{127, 192, 175, 256}, // H
|
|
{175, 192, 202, 256}, // I
|
|
{202, 192, 231, 256}, // J
|
|
{231, 192, 275, 256}, // K
|
|
{275, 192, 311, 256}, // L
|
|
{311, 192, 365, 256}, // M
|
|
{365, 192, 413, 256}, // N
|
|
{413, 192, 463, 256}, // O
|
|
{1, 256, 38, 320}, // P
|
|
{38, 256, 89, 320}, // Q
|
|
{89, 256, 133, 320}, // R
|
|
{133, 256, 176, 320}, // S
|
|
{177, 256, 216, 320}, // T
|
|
{217, 256, 263, 320}, // U
|
|
{263, 256, 307, 320}, // V
|
|
{307, 256, 370, 320}, // W
|
|
{370, 256, 414, 320}, // X
|
|
{414, 256, 453, 320}, // Y
|
|
{453, 256, 497, 320}, // Z
|
|
{0, 320, 29, 384}, //[
|
|
{29, 320, 58, 384}, //"\"
|
|
{59, 320, 87, 384}, //]
|
|
{87, 320, 139, 384}, //^
|
|
{139, 320, 180, 384}, //_
|
|
{180, 320, 221, 384}, //`
|
|
{221, 320, 259, 384}, // a
|
|
{259, 320, 299, 384}, // b
|
|
{299, 320, 332, 384}, // c
|
|
{332, 320, 372, 384}, // d
|
|
{372, 320, 411, 384}, // e
|
|
{411, 320, 433, 384}, // f
|
|
{435, 320, 473, 384}, // g
|
|
{0, 384, 40, 448}, // h
|
|
{40, 384, 56, 448}, // i
|
|
{58, 384, 80, 448}, // j
|
|
{80, 384, 118, 448}, // k
|
|
{118, 384, 135, 448}, // l
|
|
{135, 384, 197, 448}, // m
|
|
{197, 384, 238, 448}, // n
|
|
{238, 384, 277, 448}, // o
|
|
{277, 384, 317, 448}, // p
|
|
{317, 384, 356, 448}, // q
|
|
{357, 384, 384, 448}, // r
|
|
{385, 384, 417, 448}, // s
|
|
{417, 384, 442, 448}, // t
|
|
{443, 384, 483, 448}, // u
|
|
{0, 448, 38, 512}, // v
|
|
{38, 448, 90, 512}, // w
|
|
{90, 448, 128, 512}, // x
|
|
{128, 448, 166, 512}, // y
|
|
{166, 448, 200, 512}, // z
|
|
{200, 448, 241, 512}, //{
|
|
{241, 448, 270, 512}, //|
|
|
{270, 448, 310, 512}, //}
|
|
{310, 448, 363, 512}, //~
|
|
};
|
|
|
|
int
|
|
text_width(char *str)
|
|
{
|
|
int x = 0;
|
|
for (int i = 0; str[i] != 0; i++) {
|
|
int c = str[i];
|
|
if (c == '\t') {
|
|
x = (x + PIXELTAB) / PIXELTAB * PIXELTAB;
|
|
continue;
|
|
};
|
|
if (c == '\f')
|
|
continue;
|
|
if (c == ' ') {
|
|
x += FONTH / 2;
|
|
continue;
|
|
};
|
|
c -= 33;
|
|
if (c < 0 || c >= 95)
|
|
continue;
|
|
int in_width = char_coords[c][2] - char_coords[c][0];
|
|
x += in_width + 1;
|
|
}
|
|
return x;
|
|
}
|
|
|
|
void
|
|
draw_textf(char *fstr, int left, int top, int gl_num, ...)
|
|
{
|
|
sprintf_sdlv(str, gl_num, fstr);
|
|
draw_text(str, left, top, gl_num);
|
|
};
|
|
|
|
void
|
|
draw_text(char *str, int left, int top, int gl_num)
|
|
{
|
|
glBlendFunc(GL_ONE, GL_ONE);
|
|
glBindTexture(GL_TEXTURE_2D, gl_num);
|
|
glColor3ub(255, 255, 255);
|
|
|
|
int x = left;
|
|
int y = top;
|
|
|
|
int i;
|
|
float in_left, in_top, in_right, in_bottom;
|
|
int in_width, in_height;
|
|
|
|
for (i = 0; str[i] != 0; i++) {
|
|
int c = str[i];
|
|
if (c == '\t') {
|
|
x = (x - left + PIXELTAB) / PIXELTAB * PIXELTAB + left;
|
|
continue;
|
|
};
|
|
if (c == '\f') {
|
|
glColor3ub(64, 255, 128);
|
|
continue;
|
|
};
|
|
if (c == ' ') {
|
|
x += FONTH / 2;
|
|
continue;
|
|
};
|
|
c -= 33;
|
|
if (c < 0 || c >= 95)
|
|
continue;
|
|
|
|
in_left = ((float)char_coords[c][0]) / 512.0f;
|
|
in_top = ((float)char_coords[c][1] + 2) / 512.0f;
|
|
in_right = ((float)char_coords[c][2]) / 512.0f;
|
|
in_bottom = ((float)char_coords[c][3] - 2) / 512.0f;
|
|
|
|
in_width = char_coords[c][2] - char_coords[c][0];
|
|
in_height = char_coords[c][3] - char_coords[c][1];
|
|
|
|
glBegin(GL_QUADS);
|
|
glTexCoord2f(in_left, in_top);
|
|
glVertex2i(x, y);
|
|
glTexCoord2f(in_right, in_top);
|
|
glVertex2i(x + in_width, y);
|
|
glTexCoord2f(in_right, in_bottom);
|
|
glVertex2i(x + in_width, y + in_height);
|
|
glTexCoord2f(in_left, in_bottom);
|
|
glVertex2i(x, y + in_height);
|
|
glEnd();
|
|
|
|
xtraverts += 4;
|
|
x += in_width + 1;
|
|
}
|
|
}
|
|
|
|
// also Don's code, so goes in here too :)
|
|
|
|
void
|
|
draw_envbox_aux(float s0, float t0, int x0, int y0, int z0, float s1, float t1,
|
|
int x1, int y1, int z1, float s2, float t2, int x2, int y2, int z2,
|
|
float s3, float t3, int x3, int y3, int z3, int texture)
|
|
{
|
|
glBindTexture(GL_TEXTURE_2D, texture);
|
|
glBegin(GL_QUADS);
|
|
glTexCoord2f(s3, t3);
|
|
glVertex3d(x3, y3, z3);
|
|
glTexCoord2f(s2, t2);
|
|
glVertex3d(x2, y2, z2);
|
|
glTexCoord2f(s1, t1);
|
|
glVertex3d(x1, y1, z1);
|
|
glTexCoord2f(s0, t0);
|
|
glVertex3d(x0, y0, z0);
|
|
glEnd();
|
|
xtraverts += 4;
|
|
}
|
|
|
|
void
|
|
draw_envbox(int t, int w)
|
|
{
|
|
glDepthMask(GL_FALSE);
|
|
|
|
draw_envbox_aux(1.0f, 1.0f, -w, -w, w, 0.0f, 1.0f, w, -w, w, 0.0f, 0.0f,
|
|
w, -w, -w, 1.0f, 0.0f, -w, -w, -w, t);
|
|
|
|
draw_envbox_aux(1.0f, 1.0f, +w, w, w, 0.0f, 1.0f, -w, w, w, 0.0f, 0.0f,
|
|
-w, w, -w, 1.0f, 0.0f, +w, w, -w, t + 1);
|
|
|
|
draw_envbox_aux(0.0f, 0.0f, -w, -w, -w, 1.0f, 0.0f, -w, w, -w, 1.0f,
|
|
1.0f, -w, w, w, 0.0f, 1.0f, -w, -w, w, t + 2);
|
|
|
|
draw_envbox_aux(1.0f, 1.0f, +w, -w, w, 0.0f, 1.0f, +w, w, w, 0.0f, 0.0f,
|
|
+w, w, -w, 1.0f, 0.0f, +w, -w, -w, t + 3);
|
|
|
|
draw_envbox_aux(0.0f, 1.0f, -w, w, w, 0.0f, 0.0f, +w, w, w, 1.0f, 0.0f,
|
|
+w, -w, w, 1.0f, 1.0f, -w, -w, w, t + 4);
|
|
|
|
draw_envbox_aux(0.0f, 1.0f, +w, w, -w, 0.0f, 0.0f, -w, w, -w, 1.0f,
|
|
0.0f, -w, -w, -w, 1.0f, 1.0f, +w, -w, -w, t + 5);
|
|
|
|
glDepthMask(GL_TRUE);
|
|
}
|