void TextArea::_updateBuffers() { std::vector<glm::vec2> vertices; std::vector<glm::vec2> UV; std::vector<GLushort> indexes; int cnt = 0; auto tex = font()->texture(); for ( auto symbol: _symbols ) { auto textureX = static_cast<float>((symbol.chr % 16) * font()->width() + (symbol.chr % 16) * 2 + 1); auto textureY = static_cast<float>((symbol.chr / 16) * font()->height() + (symbol.chr / 16) * 2 + 1); Point drawPos = symbol.position; glm::vec2 vertex_up_left = glm::vec2( (float)drawPos.x()-1.0, (float)drawPos.y()-1.0 ); glm::vec2 vertex_up_right = glm::vec2( (float)drawPos.x()+(float)font()->width()+1.0, (float)drawPos.y()-1.0 ); glm::vec2 vertex_down_left = glm::vec2( (float)drawPos.x()-1.0, (float)drawPos.y()+(float)font()->height()+1.0 ); glm::vec2 vertex_down_right = glm::vec2( (float)drawPos.x()+(float)font()->width()+1.0, (float)drawPos.y()+(float)font()->height()+1.0 ); vertices.push_back(vertex_up_left ); vertices.push_back(vertex_up_right ); vertices.push_back(vertex_down_left ); vertices.push_back(vertex_down_right); glm::vec2 tex_up_left = glm::vec2( (textureX-1.0)/(float)tex->textureWidth(), (textureY-1.0)/(float)tex->textureHeight() ); glm::vec2 tex_up_right = glm::vec2( (textureX+(float)font()->width()+1.0)/(float)tex->textureWidth(), (textureY-1.0)/(float)tex->textureHeight() ); glm::vec2 tex_down_left = glm::vec2( (textureX-1.0)/(float)tex->textureWidth(), (textureY+(float)font()->height()+1.0)/(float)tex->textureHeight() ); glm::vec2 tex_down_right = glm::vec2( (textureX+(float)font()->width()+1.0)/(float)tex->textureWidth(), (textureY+(float)font()->height()+1.0)/(float)tex->textureHeight() ); UV.push_back(tex_up_left ); UV.push_back(tex_up_right ); UV.push_back(tex_down_left ); UV.push_back(tex_down_right); indexes.push_back(cnt*4); indexes.push_back(cnt*4+1); indexes.push_back(cnt*4+2); indexes.push_back(cnt*4+3); indexes.push_back(cnt*4+2); indexes.push_back(cnt*4+1); cnt++; } _textArea.updateBuffers(vertices,UV,indexes); }
void LevelPlaySelect::renderTooltip(SDL_Renderer &renderer, unsigned int number, int dy){ if (!toolTip.name || toolTip.number != number) { SDL_Color themeTextColor={0,0,0}; const int SLEN = 64; char s[SLEN]; //Render the name of the level. toolTip.name=textureFromText(renderer,*fontText,_CC(levels->getDictionaryManager(),levels->getLevelName(number)),themeTextColor); toolTip.time=nullptr; toolTip.recordings=nullptr; toolTip.number=number; //The time it took. if(levels->getLevel(number)->time>0){ snprintf(s,SLEN,"%-.2fs",levels->getLevel(number)->time/40.0f); toolTip.time=textureFromText(renderer,*fontText,s,themeTextColor);//TTF_RenderUTF8_Blended(fontText,s,themeTextColor); } //The number of recordings it took. if(levels->getLevel(number)->recordings>=0){ snprintf(s,SLEN,"%d",levels->getLevel(number)->recordings); toolTip.recordings = textureFromText(renderer,*fontText,s,themeTextColor); } } const SDL_Rect nameSize = rectFromTexture(*toolTip.name); //Now draw a square the size of the three texts combined. SDL_Rect r=numbers[number].box; r.y-=dy*64; if(toolTip.time && toolTip.recordings){ const int recW = textureWidth(*toolTip.recordings); const int timeW = textureWidth(*toolTip.time); r.w=(nameSize.w)>(25+timeW+40+recW)?(nameSize.w):(25+timeW+40+recW); r.h=nameSize.h+5+20; }else{ r.w=nameSize.w; r.h=nameSize.h; } //Make sure the tooltip doesn't go outside the window. if(r.y>SCREEN_HEIGHT-200){ r.y-=nameSize.h+4; }else{ r.y+=numbers[number].box.h+2; } if(r.x+r.w>SCREEN_WIDTH-50) r.x=SCREEN_WIDTH-50-r.w; //Draw a rectange Uint32 color=0xFFFFFFFF; drawGUIBox(r.x-5,r.y-5,r.w+10,r.h+10,renderer,color); //Calc the position to draw. SDL_Rect r2=r; //Now we render the name if the surface isn't null. if(toolTip.name){ //Draw the name. applyTexture(r2.x, r2.y, toolTip.name, renderer); } //Increase the height to leave a gap between name and stats. r2.y+=30; if(toolTip.time){ //Now draw the time. applyTexture(r2.x,r2.y,levelInfoRender.timeIcon,renderer); r2.x+=25; applyTexture(r2.x, r2.y, toolTip.time, renderer); r2.x+=textureWidth(*toolTip.time)+15; } if(toolTip.recordings){ //Now draw the recordings. applyTexture(r2.x,r2.y,levelInfoRender.recordingsIcon,renderer); r2.x+=25; applyTexture(r2.x, r2.y, toolTip.recordings, renderer); } }