static void drawText(float x, float y, const char *text, int align, unsigned int col) { if (!g_ftex) return; if (!text) return; if (align == IMGUI_ALIGN_CENTER) x -= getTextLength(g_cdata, text)/2; else if (align == IMGUI_ALIGN_RIGHT) x -= getTextLength(g_cdata, text); glColor4ub(col&0xff, (col>>8)&0xff, (col>>16)&0xff, (col>>24)&0xff); glEnable(GL_TEXTURE_2D); // assume orthographic projection with units = screen pixels, origin at top left glBindTexture(GL_TEXTURE_2D, g_ftex); glBegin(GL_TRIANGLES); const float ox = x; while (*text) { int c = (unsigned char)*text; if (c == '\t') { for (int i = 0; i < 4; ++i) { if (x < g_tabStops[i]+ox) { x = g_tabStops[i]+ox; break; } } } else if (c >= 32 && c < 128) { stbtt_aligned_quad q; getBakedQuad(g_cdata, 512,512, c-32, &x,&y,&q); glTexCoord2f(q.s0, q.t0); glVertex2f(q.x0, q.y0); glTexCoord2f(q.s1, q.t1); glVertex2f(q.x1, q.y1); glTexCoord2f(q.s1, q.t0); glVertex2f(q.x1, q.y0); glTexCoord2f(q.s0, q.t0); glVertex2f(q.x0, q.y0); glTexCoord2f(q.s0, q.t1); glVertex2f(q.x0, q.y1); glTexCoord2f(q.s1, q.t1); glVertex2f(q.x1, q.y1); } ++text; } glEnd(); glDisable(GL_TEXTURE_2D); }
void sRenderString(float x, float y, const char *text, TextAlign align, unsigned int col) { if (!g_ftex) return; if (!text) return; if (align == TEXT_ALIGN_CENTER) x -= getTextLength(g_cdata, text) / 2; else if (align == TEXT_ALIGN_RIGHT) x -= getTextLength(g_cdata, text); float r = (float)(col & 0xff) / 255.f; float g = (float)((col >> 8) & 0xff) / 255.f; float b = (float)((col >> 16) & 0xff) / 255.f; float a = (float)((col >> 24) & 0xff) / 255.f; // assume orthographic projection with units = screen pixels, origin at top left glBindTexture(GL_TEXTURE_2D, g_ftex); const float ox = x; while (*text) { int c = (unsigned char)*text; if (c == '\t') { for (int i = 0; i < 4; ++i) { if (x < g_tabStops[i] + ox) { x = g_tabStops[i] + ox; break; } } } else if (c >= 32 && c < 128) { stbtt_aligned_quad q; getBakedQuad(g_cdata, 512, 512, c - 32, &x, &y, &q); float v[12] = { q.x0, q.y0, q.x1, q.y1, q.x1, q.y0, q.x0, q.y0, q.x0, q.y1, q.x1, q.y1, }; float uv[12] = { q.s0, q.t0, q.s1, q.t1, q.s1, q.t0, q.s0, q.t0, q.s0, q.t1, q.s1, q.t1, }; float c[24] = { r, g, b, a, r, g, b, a, r, g, b, a, r, g, b, a, r, g, b, a, r, g, b, a, }; glBindVertexArray(g_vao); glBindBuffer(GL_ARRAY_BUFFER, g_vbos[0]); glBufferData(GL_ARRAY_BUFFER, 12 * sizeof(float), v, GL_STATIC_DRAW); glBindBuffer(GL_ARRAY_BUFFER, g_vbos[1]); glBufferData(GL_ARRAY_BUFFER, 12 * sizeof(float), uv, GL_STATIC_DRAW); glBindBuffer(GL_ARRAY_BUFFER, g_vbos[2]); glBufferData(GL_ARRAY_BUFFER, 24 * sizeof(float), c, GL_STATIC_DRAW); glDrawArrays(GL_TRIANGLES, 0, 6); } ++text; } //glEnd(); //glDisable(GL_TEXTURE_2D); }