// 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); }