Text::Text() { score = 0; lr_increment = 5; level = 20; initializeFont(); initializeLeftPanel(); initializeRightPanel(); lines_remain = lr_increment * level + level; lr_text.setString(formatString(lines_remain)); }
void Ibex::TextRenderer::precompileText(float x, float y, const std::vector<std::string> &lines, const std::vector<bool> &highlighted, int maxChars) { if(!initialized) { initialized = true; loadProgram(); initializeFont(); } checkForErrors(); vertices.clear(); indices.clear(); minX = minY = INT_MAX; maxX = maxY = INT_MIN; // assume orthographic projection with units = screen pixels, origin at top left int index = 0; int lineNum = (int)lines.size()-1; //for(std::string line : lines) { for(int i = 0; i < lines.size(); ++i) { std::string line = lines[i]; if(maxChars > 0 && line.length() > maxChars) { line.resize(maxChars); } const GLfloat *color = (highlighted.size() > i && highlighted[i]) ? highlightedTextColor : textColor; x = 0; y = -lineNum * (ascent-descent+lineGap)*scale; unsigned char *text = (unsigned char *)line.data(); while (*text) { if (*text >= 32 && *text < 128) { stbtt_aligned_quad q; stbtt_GetBakedQuad(cdata, 1024,256, *text-32, &x,&y,&q,1); // bottom right triangle vertices.push_back(q.x0); vertices.push_back((baseline-q.y0)); vertices.push_back(0); vertices.push_back(q.s0); vertices.push_back(q.t0); vertices.push_back(color[0]); vertices.push_back(color[1]); vertices.push_back(color[2]); vertices.push_back(color[3]); vertices.push_back(q.x1); vertices.push_back((baseline-q.y0)); vertices.push_back(0); vertices.push_back(q.s1); vertices.push_back(q.t0); vertices.push_back(color[0]); vertices.push_back(color[1]); vertices.push_back(color[2]); vertices.push_back(color[3]); vertices.push_back(q.x1); vertices.push_back((baseline-q.y1)); vertices.push_back(0); vertices.push_back(q.s1); vertices.push_back(q.t1); vertices.push_back(color[0]); vertices.push_back(color[1]); vertices.push_back(color[2]); vertices.push_back(color[3]); // top left triangle vertices.push_back(q.x0); vertices.push_back((baseline-q.y0)); vertices.push_back(0); vertices.push_back(q.s0); vertices.push_back(q.t0); vertices.push_back(color[0]); vertices.push_back(color[1]); vertices.push_back(color[2]); vertices.push_back(color[3]); vertices.push_back(q.x1); vertices.push_back((baseline-q.y1)); vertices.push_back(0); vertices.push_back(q.s1); vertices.push_back(q.t1); vertices.push_back(color[0]); vertices.push_back(color[1]); vertices.push_back(color[2]); vertices.push_back(color[3]); vertices.push_back(q.x0); vertices.push_back((baseline-q.y1)); vertices.push_back(0); vertices.push_back(q.s0); vertices.push_back(q.t1); vertices.push_back(color[0]); vertices.push_back(color[1]); vertices.push_back(color[2]); vertices.push_back(color[3]); minX = std::min(minX,std::min(q.x0,q.x1)); maxX = std::max(maxX,std::max(q.x0,q.x1)); minY = std::min(minY,std::min(baseline-q.y0,baseline-q.y1)+y); maxY = std::max(maxY,std::max(baseline-q.y0,baseline-q.y1)); for(int i = 0; i < 6; ++i) { indices.push_back(index++); } } ++text; } --lineNum; if(minX > maxX) std::swap(minX,maxX); if(minY > maxY) std::swap(minY,maxY); } if(vaoTextRenderer == 0) glGenVertexArrays(1,&vaoTextRenderer); if(!checkForErrors()) { exit(1); } glBindVertexArray(vaoTextRenderer); if(vboTextVertices == 0) glGenBuffers(1, &vboTextVertices); glBindBuffer(GL_ARRAY_BUFFER, vboTextVertices); glBufferData(GL_ARRAY_BUFFER, vertices.size()*sizeof(GLfloat), vertices.data(), GL_STATIC_DRAW); if(!checkForErrors()) { exit(1); } glEnableVertexAttribArray(IbexTextAttribLocations[0]); glVertexAttribPointer(IbexTextAttribLocations[0], 3, GL_FLOAT, GL_FALSE, sizeof(GLfloat)*9, 0); glEnableVertexAttribArray(IbexTextAttribLocations[1]); glVertexAttribPointer(IbexTextAttribLocations[1], 2, GL_FLOAT, GL_FALSE, sizeof(GLfloat)*9, (GLvoid*) (sizeof(GLfloat)*3)); glEnableVertexAttribArray(IbexTextAttribLocations[2]); glVertexAttribPointer(IbexTextAttribLocations[2], 4, GL_FLOAT, GL_FALSE, sizeof(GLfloat)*9, (GLvoid*) (sizeof(GLfloat)*5)); if(!checkForErrors()) { exit(1); } if(vboTextIndices == 0) glGenBuffers(1, &vboTextIndices); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vboTextIndices); glBufferData(GL_ELEMENT_ARRAY_BUFFER, indices.size()*sizeof(GLuint), indices.data(), GL_STATIC_DRAW); if(!checkForErrors()) { exit(1); } glBindVertexArray(0); ////////////////////////////////////////////////////////////////////////////// static GLfloat IbexDisplayFlatVertices[] = { -1.0, -1.0, 0.0, 0, 1, 1.0, -1.0, 0.0, 1, 1, 1.0, 1.0, 0.0, 1, 0, -1.0, 1.0, 0.0, 0, 0 }; static GLushort IbexDisplayFlatIndices[] = { 0, 2, 1, 0, 3, 2 }; if(vaoTextTextureRenderer == 0) { if(vaoTextTextureRenderer == 0) glGenVertexArrays(1,&vaoTextTextureRenderer); if(!checkForErrors()) { exit(1); } glBindVertexArray(vaoTextTextureRenderer); if(vboTextTextureVertices == 0) glGenBuffers(1, &vboTextTextureVertices); glBindBuffer(GL_ARRAY_BUFFER, vboTextTextureVertices); glBufferData(GL_ARRAY_BUFFER, sizeof(IbexDisplayFlatVertices), IbexDisplayFlatVertices, GL_STATIC_DRAW); if(!checkForErrors()) { exit(1); } glEnableVertexAttribArray(IbexDisplayFlatAttribLocations[0]); glVertexAttribPointer(IbexDisplayFlatAttribLocations[0], 3, GL_FLOAT, GL_FALSE, sizeof(GLfloat)*5, 0); glEnableVertexAttribArray(IbexDisplayFlatAttribLocations[2]); glVertexAttribPointer(IbexDisplayFlatAttribLocations[2], 2, GL_FLOAT, GL_FALSE, sizeof(GLfloat)*5, (GLvoid*) (sizeof(GLfloat) * 3)); if(!checkForErrors()) { exit(1); } if(vboTextTextureIndices == 0) glGenBuffers(1, &vboTextTextureIndices); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vboTextTextureIndices); glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(IbexDisplayFlatIndices), IbexDisplayFlatIndices, GL_STATIC_DRAW); if(!checkForErrors()) { exit(1); } glBindVertexArray(0); } }