Ejemplo n.º 1
0
void renderprogress(float bar, const char *text)
{
    // Keep connection alive
    clientkeepalive();
    serverkeepalive();

    printf("|");
    for (int i = 0; i < 10; i++)
    {
        if (i < int(bar*10))
            printf("#");
        else
            printf("-");
    }
    printf("| %s\r", text);
    fflush(stdout);
}
void renderprogress(float bar, const char *text, GLuint tex, bool background)   // also used during loading
{
    if(!inbetweenframes || envmapping) return;

    clientkeepalive();      // make sure our connection doesn't time out while loading maps etc.

    #ifdef __APPLE__
    interceptkey(SDLK_UNKNOWN); // keep the event queue awake to avoid 'beachball' cursor
    #endif

    extern int sdl_backingstore_bug;
    if(background || sdl_backingstore_bug > 0) restorebackground();

    int w = screen->w, h = screen->h;
    getbackgroundres(w, h);
    gettextres(w, h);

    glMatrixMode(GL_PROJECTION);
    glPushMatrix();
    glLoadIdentity();
    glOrtho(0, w, h, 0, -1, 1);
    glMatrixMode(GL_MODELVIEW);
    glPushMatrix();
    glLoadIdentity();

    glEnable(GL_TEXTURE_2D);
    glEnable(GL_BLEND);
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

    defaultshader->set();
    glColor3f(1, 1, 1);

    float fh = 0.070f*min(w, h), fw = fh*10,
          fx = renderedframe ? w - fw - fh/4 : 0.5f*(w - fw),
          fy = renderedframe ? fh/4 : h - fh*1.5f;

    settexture("data/loadingscreen/load_frame.png", 3);

    glBegin(GL_QUADS);
        glTexCoord2f(0,0); glVertex2f(fx,    fy);
        glTexCoord2f(1,0); glVertex2f(fx+fw, fy);
        glTexCoord2f(1,1); glVertex2f(fx+fw, fy+fh);
        glTexCoord2f(0,1); glVertex2f(fx,    fy+fh);
    glEnd();

    float bh = fh*20/52.0f, bx = fx + fw*17/511.0f;
    float by = fy + fh*16/52.0f, sw = fw*7/511.0f;
    float mw = fw, prog = bar;
    float ex = fx + max(mw*bar, fw*7/511.0f);


    if(bar > 0)
    {
        settexture("data/loadingscreen/load_bar.png", 3);
        glBegin(GL_QUADS);
            glTexCoord2f(0,    0); glVertex2f(fx,    fy);
            glTexCoord2f(prog, 0); glVertex2f(ex,    fy);
            glTexCoord2f(prog, 1); glVertex2f(ex, fy+fh);
            glTexCoord2f(0,    1); glVertex2f(fx, fy+fh);
        glEnd();
    }

    if(text)
    {
        int tw = text_width(text);
        float tsz = bh*0.8f/FONTH;
        if(tw*tsz > mw) tsz = mw/tw;
        glPushMatrix();
        glTranslatef(bx+sw, by + (bh - FONTH*tsz)/2, 0);
        glScalef(tsz, tsz, 1);
        draw_text(text, 0, 0);
        glPopMatrix();
    }

    glDisable(GL_BLEND);

    if(tex)
    {
        float sz = 0.35f*min(w, h),
            x = 0.5f*(w-sz),
            y = 0.5f*min(w, h) - sz/15;

        glBindTexture(GL_TEXTURE_2D, tex);
        glBegin(GL_TRIANGLE_STRIP);
            glTexCoord2f(0, 0); glVertex2f(x,    y);
            glTexCoord2f(1, 0); glVertex2f(x+sz, y);
            glTexCoord2f(0, 1); glVertex2f(x,    y+sz);
            glTexCoord2f(1, 1); glVertex2f(x+sz, y+sz);
        glEnd();

        glEnable(GL_BLEND);
        glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

        settexture("data/loadingscreen/mapshot_frame.png", 3);
        glBegin(GL_TRIANGLE_STRIP);
            glTexCoord2f(0, 0); glVertex2f(x,    y);
            glTexCoord2f(1, 0); glVertex2f(x+sz, y);
            glTexCoord2f(0, 1); glVertex2f(x,    y+sz);
            glTexCoord2f(1, 1); glVertex2f(x+sz, y+sz);
        glEnd();

        glDisable(GL_BLEND);
    }

    glDisable(GL_TEXTURE_2D);

    glMatrixMode(GL_PROJECTION);
    glPopMatrix();
    glMatrixMode(GL_MODELVIEW);
    glPopMatrix();
    swapbuffers();
}