Exemplo n.º 1
0
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);
}
Exemplo n.º 2
0
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);
	}
}