Changeset 1493


Ignore:
Timestamp:
Jun 18, 2012, 2:00:13 PM (8 years ago)
Author:
sam
Message:

neercs: properly scale the text buffer when blitting it.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/neercs/video/render.cpp

    r1489 r1493  
    173173struct TextRender
    174174{
    175     TextRender(caca_canvas_t *caca)
     175    TextRender(caca_canvas_t *caca, ivec2 font_size)
    176176      : m_caca(caca),
    177         m_width(caca_get_canvas_width(m_caca)),
    178         m_height(caca_get_canvas_height(m_caca))
    179     {
    180         for (int j = 0; j < m_height; j++)
    181         for (int i = 0; i < m_width; i++)
     177        m_font_size(font_size),
     178        m_canvas_size(caca_get_canvas_width(m_caca),
     179                      caca_get_canvas_height(m_caca)),
     180        m_cells(m_canvas_size.x * m_canvas_size.y)
     181    {
     182        for (int j = 0; j < m_canvas_size.y; j++)
     183        for (int i = 0; i < m_canvas_size.x; i++)
    182184            m_vertices << vec2(i, j);
    183185    }
    184186
    185     void Init(ivec2 screen_size, ivec2 font_size)
     187    void Init(ivec2 screen_size)
    186188    {
    187189        m_shader = Shader::Create(lolfx_text);
     
    204206        m_vbo1->Unlock();
    205207
    206         m_vbo2 = new VertexBuffer(m_width * m_height * sizeof(int32_t));
    207         m_vbo3 = new VertexBuffer(m_width * m_height * sizeof(int32_t));
     208        m_vbo2 = new VertexBuffer(m_cells * sizeof(int32_t));
     209        m_vbo3 = new VertexBuffer(m_cells * sizeof(int32_t));
    208210
    209211        m_fbo = new FrameBuffer(screen_size);
    210212    }
    211213
    212     void Render(ivec2 screen_size, ivec2 font_size)
     214    void Render(ivec2 fbo_size)
    213215    {
    214216        /* Transform matrix for the scene:
    215217         *  - translate to the centre of the glyph
    216          *  - scale by 2.f * font_size / screen_size
     218         *  - scale by 2.f * font_size / fbo_size
    217219         *  - translate to the upper left corner */
    218220        mat4 xform = mat4::translate(-1.f, 1.f, 0.f)
    219                    * mat4::scale(vec3(2.f * font_size / (screen_size), 1.f)
     221                   * mat4::scale(vec3(2.f * m_font_size / (fbo_size), 1.f)
    220222                                  * vec3(1.f, -1.f, 1.f))
    221223                   * mat4::translate(0.5f, 0.5f, 0.f);
     
    223225        /* Upload libcaca canvas contents to the vertex buffers */
    224226        uint32_t *colors = (uint32_t *)m_vbo2->Lock(0, 0);
    225         for (int j = 0; j < m_height; j++)
    226         for (int i = 0; i < m_width; i++)
     227        for (int j = 0; j < m_canvas_size.y; j++)
     228        for (int i = 0; i < m_canvas_size.x; i++)
    227229        {
    228230            uint32_t attr = caca_get_attr(m_caca, i, j);
     
    235237        }
    236238        memcpy(colors, caca_get_canvas_attrs(m_caca),
    237                m_width * m_height * sizeof(uint32_t));
     239               m_cells * sizeof(uint32_t));
    238240        m_vbo2->Unlock();
    239241
    240242        uint32_t *chars = (uint32_t *)m_vbo3->Lock(0, 0);
    241243        memcpy(chars, caca_get_canvas_chars(m_caca),
    242                m_width * m_height * sizeof(uint32_t));
     244               m_cells * sizeof(uint32_t));
    243245        m_vbo3->Unlock();
    244246
     
    248250        //glEnable(GL_VERTEX_PROGRAM_POINT_SIZE);
    249251        glDisable(GL_POINT_SMOOTH);
    250         glPointSize((float)max(font_size.x, font_size.y));
     252        glPointSize((float)max(m_font_size.x, m_font_size.y));
    251253        m_shader->Bind();
    252254        tex_map->Bind();
     
    257259        m_vdecl->SetStream(m_vbo3, m_char);
    258260        m_vdecl->Bind();
    259         m_vdecl->DrawElements(MeshPrimitive::Points, 0, m_width * m_height);
     261        m_vdecl->DrawElements(MeshPrimitive::Points, 0, m_cells);
    260262        m_vdecl->Unbind();
    261263        tex_map->Unbind();
     
    265267    }
    266268
    267     void Blit()
    268     {
    269         /* FIXME: scaling is wrong */
     269    void Blit(ivec2 fbo_size, ivec2 pos, ivec2 size)
     270    {
    270271        glDisable(GL_BLEND);
    271272        glEnable(GL_TEXTURE_2D);
    272273        glBindTexture(GL_TEXTURE_2D, m_fbo->GetTexture());
    273         glColor3f(1.0f,1.0f,1.0f);
    274 
    275         int x = dos_m;
    276         int y = dos_m + (font_size.y + 2) * ratio_2d.y;
    277         int w = screen_size.x - dos_m * 2;
    278         int h = screen_size.y - dos_m * 2 - (font_size.y + 2) * ratio_2d.y;
     274        glColor3f(1.0f, 1.0f, 1.0f);
     275
     276        vec2 tc = (vec2)m_canvas_size * m_font_size / fbo_size;
    279277
    280278        glLoadIdentity();
    281279        glBegin(GL_QUADS);
    282             glTexCoord2f(1.0f, 1.0f);
    283             glVertex2i(x+w, y  );
     280            glTexCoord2f(tc.x, 1.0f);
     281            glVertex2i(pos.x + size.x, pos.y);
    284282            glTexCoord2f(0.0f, 1.0f);
    285             glVertex2i(x  , y  );
    286             glTexCoord2f(0.0f, 0.0f);
    287             glVertex2i(x  , y+h);
    288             glTexCoord2f(1.0f, 0.0f);
    289             glVertex2i(x+w, y+h);
     283            glVertex2i(pos.x, pos.y);
     284            glTexCoord2f(0.0f, 1.0f - tc.y);
     285            glVertex2i(pos.x, pos.y + size.y);
     286            glTexCoord2f(tc.x, 1.0f - tc.y);
     287            glVertex2i(pos.x + size.x, pos.y + size.y);
    290288        glEnd();
    291289    }
     
    293291private:
    294292    caca_canvas_t *m_caca;
    295     int m_width, m_height;
     293    ivec2 m_font_size, m_canvas_size;
     294    int m_cells;
    296295
    297296    Array<vec2> m_vertices;
     
    506505    m_ready(false)
    507506{
    508     text_render = new TextRender(m_caca);
     507    text_render = new TextRender(m_caca, font_size);
    509508}
    510509
     
    521520    {
    522521        CreateGLWindow("LOL");
    523         text_render->Init(screen_size, ivec2(8, 8));
     522        text_render->Init(screen_size);
    524523
    525524        m_ready = true;
     
    577576{
    578577    /* Draw text in an offline buffer */
    579     text_render->Render(screen_size, ivec2(8, 8));
     578    text_render->Render(screen_size);
    580579
    581580#if SHADER
     
    589588    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    590589
    591     text_render->Blit();
     590    ivec2 border_top = ivec2(dos_m, dos_m + font_size.y * ratio_2d.y)
     591                     + ratio_2d * 2;
     592    ivec2 border_bottom = ivec2(dos_m * 2, dos_m * 2 + font_size.y * ratio_2d.y)
     593                        + ratio_2d * 2;
     594    text_render->Blit(screen_size, border_top, screen_size - border_bottom);
    592595
    593596    glEnableClientState(GL_VERTEX_ARRAY);
Note: See TracChangeset for help on using the changeset viewer.