void DrawConsole()
{
if(!fontshader | | !fontshader->numlayers)
return;
switch(consolestate)
{
case con_up:
return;
case con_moving_up:
con_y+=deltatime*CONSOLE_SPEED/1000.0;
if(con_y>=25.0)
{
con_y=25.0;
consolestate=con_up;
return;
}
break;
case con_moving_down:
con_y-=deltatime*CONSOLE_SPEED/1000.0;
if(con_y<=con_y_target)
{
con_y=con_y_target;
consolestate=con_down;
}
break;
case con_down:
break;
}
glDisable(GL_DEPTH_TEST);
glPushMatrix(); // saves the model matrix
glMatrixMode(GL_PROJECTION);
glPushMatrix(); // saves the proj matrix
glLoadIdentity();
glOrtho(0.0,80.0,0.0,24.0,-1.0,1.0);
glMatrixMode(GL_MODELVIEW);
glEnable(GL_BLEND);
if(dropto==CONSOLE_DROP_FULL)
glColor4fv((float*)&color_white);
else
glColor4fv((float*)&color_white_halfalpha);
// draw the console background
if(console_bkg && console_bkg->numlayers)
{
glBindTexture(GL_TEXTURE_2D,console_bkg->layers[0]->gltexbind);
glBlendFunc(console_bkg->layers[0]->blendsrc,console_bkg->layers[0]->blenddest);
glBegin(GL_QUADS);
glTexCoord2f(0.0,0.0);
glVertex3f(0.0,con_y,0.0);
glTexCoord2f(1.0,0.0);
glVertex3f(80.0,con_y,0.0);
glTexCoord2f(1.0,1.0);
glVertex3f(80.0,25.0,0.0);
glTexCoord2f(0.0,1.0);
glVertex3f(0.0,25.0,0.0);
glEnd();
}
if(dropto!=CONSOLE_DROP_FULL)
glColor4fv((float*)&color_white);
// draw console text
render_char_parm parms;
parms.y=con_y+1;
parms.color4=(float*)&color_white;
glBindTexture(GL_TEXTURE_2D, fontshader->layers[0]->gltexbind);
glBlendFunc(GL_ONE,GL_ONE_MINUS_SRC_COLOR);
list<string *>::iterator lnit;
for(lnit=console_lines.begin();lnit!=console_lines.end();++lnit)
{
parms.x=0;
string *pstr=*lnit;
int len=pstr->length();
if(len<1)
continue;
if(len>80)
len=80;
char *c=console_scratch;
memcpy(console_scratch,pstr->c_str(),len+1);
for(int i=0;i<len;i++,c++)
{
switch(*c)
{
case '\r':
break;
case '\n':
case ' ':
parms.x++;
break;
case '\t':
parms.x+=8.0;
break;
case 1:
parms.color4=(float*)&color_red;
break;
case 2:
parms.color4=(float*)&color_green;
break;
case 3:
parms.color4=(float*)&color_blue;
break;
case 4:
parms.color4=(float*)&color_yellow;
break;
case 5:
parms.color4=(float*)&color_magenta;
break;
case 6:
parms.color4=(float*)&color_cyan;
break;
case 7:
parms.color4=(float*)&color_white;
break;
default:
Con_DrawChar(&parms,*c);
parms.x++;
}
}
parms.y++;
if(parms.y>25.0)
break;
}
// draw current cmd text (only last 79 characters of it)
int len=current_cmd_line.length();
int start;
if(len>79)
{
start=len-79;
len=79;
}
else
start=0;
parms.color4=(float*)&color_green;
parms.x=0;
parms.y=con_y;
for(int j=0;j<len;j++)
{
char ck=current_cmd_line[start+j];
switch(ck)
{
case '\r':
case '\n':
case ' ':
parms.x++;
break;
case '\t':
break;
case 1:
parms.color4=(float*)&color_red;
break;
case 2:
parms.color4=(float*)&color_green;
break;
case 3:
parms.color4=(float*)&color_blue;
break;
case 4:
parms.color4=(float*)&color_yellow;
break;
case 5:
parms.color4=(float*)&color_magenta;
break;
case 6:
parms.color4=(float*)&color_cyan;
break;
case 7:
parms.color4=(float*)&color_white;
break;
default:
Con_DrawChar(&parms,ck);
parms.x++;
}
}
// ok draw key cursor
parms.color4=(float*)&color_green;
Con_DrawChar(&parms,'_');
// all done, restore previous matrices
glColor4fv((float*)&color_white);
glDisable(GL_BLEND);
glMatrixMode(GL_PROJECTION);
glPopMatrix();
glMatrixMode(GL_MODELVIEW);
glPopMatrix();
glEnable(GL_DEPTH_TEST);
}