/* ============== SCR_DrawField ============== */ void SCR_DrawField(int x, int y, int color, int width, int value){ char num[16], *ptr; int l; int frame; if(width < 1) return; // draw number string if(width > 5) width = 5; SCR_AddDirtyPoint(x, y); SCR_AddDirtyPoint(x + width*CHAR_WIDTH + 2, y + 23); Com_sprintf(num, sizeof(num), "%i", value); l = strlen(num); if(l > width) l = width; x += 2 + CHAR_WIDTH *(width - l); ptr = num; while(*ptr && l){ if(*ptr == '-') frame = STAT_MINUS; else frame = *ptr - '0'; re.DrawPic(x, y, sb_nums[color][frame]); x += CHAR_WIDTH; ptr++; l--; } }
void SCR_DrawFieldScaled(int x, int y, int color, int width, int value, float factor) { char num[16], *ptr; int l; int frame; if (width < 1) { return; } /* draw number string */ if (width > 5) { width = 5; } SCR_AddDirtyPoint(x, y); SCR_AddDirtyPoint(x + (width * CHAR_WIDTH + 2)*factor, y + 23); Com_sprintf(num, sizeof(num), "%i", value); l = (int)strlen(num); if (l > width) { l = width; } x += (2 + CHAR_WIDTH * (width - l)) * factor; ptr = num; while (*ptr && l) { if (*ptr == '-') { frame = STAT_MINUS; } else { frame = *ptr - '0'; } Draw_PicScaled(x, y, sb_nums[color][frame], factor); x += CHAR_WIDTH*factor; ptr++; l--; } }
void SCR_DrawCenterString (void) { char *start; int l; int j; int x, y; int remaining; // the finale prints the characters one at a time remaining = 9999; scr_erase_center = 0; start = scr_centerstring; if (scr_center_lines <= 4) y = viddef.height*0.35; else y = 48; do { // scan the width of the line for (l=0 ; l<40 ; l++) if (start[l] == '\n' || !start[l]) break; x = (viddef.width - l*8)/2; SCR_AddDirtyPoint (x, y); for (j=0 ; j<l ; j++, x+=8) { re.DrawChar (x, y, start[j]); if (!remaining--) return; } SCR_AddDirtyPoint (x, y+8); y += 8; while (*start && *start != '\n') start++; if (!*start) break; start++; // skip the \n } while (1); }
/* =============== V_CalcRefDef sets cl.refdef view values =============== */ void V_CalcRefDef( void ) { R_Set2DMode( false ); tr.framecount++; // g-cont. keep actual frame for all viewpasses do { clgame.dllFuncs.pfnCalcRefdef( &cl.refdef ); V_MergeOverviewRefdef( &cl.refdef ); R_RenderFrame( &cl.refdef, true ); cl.refdef.onlyClientDraw = false; } while( cl.refdef.nextView ); // Xash3D extension. draw debug triangles on a server SV_DrawDebugTriangles (); SCR_AddDirtyPoint( cl.refdef.viewport[0], cl.refdef.viewport[1] ); SCR_AddDirtyPoint( cl.refdef.viewport[0] + cl.refdef.viewport[2] - 1, cl.refdef.viewport[1] + cl.refdef.viewport[3] - 1 ); }
void SCR_DirtyScreen(void) { SCR_AddDirtyPoint(0, 0); SCR_AddDirtyPoint(viddef.width - 1, viddef.height - 1); }
void SCR_DrawCenterString(void) { char *start; int l; int j; int x, y; int remaining; /* the finale prints the characters one at a time */ remaining = 9999; scr_erase_center = 0; start = scr_centerstring; if (scr_center_lines <= 4) { y = viddef.height * 0.35; } else { y = 48; } do { /* scan the width of the line */ for (l = 0; l < 40; l++) { if ((start[l] == '\n') || !start[l]) { break; } } x = (viddef.width - l * 8) / 2; SCR_AddDirtyPoint(x, y); for (j = 0; j < l; j++, x += 8) { Draw_Char(x, y, start[j]); if (!remaining--) { return; } } SCR_AddDirtyPoint(x, y + 8); y += 8; while (*start && *start != '\n') { start++; } if (!*start) { break; } start++; /* skip the \n */ } while (1); }
void SCR_ExecuteLayoutString(char *s) { int x, y; int value; char *token; int width; int index; clientinfo_t *ci; float scale = gl_hudscale->value; if ((cls.state != ca_active) || !cl.refresh_prepped) { return; } if (!s[0]) { return; } x = 0; y = 0; while (s) { token = COM_Parse(&s); if (!strcmp(token, "xl")) { token = COM_Parse(&s); x = (int)strtol(token, (char **)NULL, 10); continue; } if (!strcmp(token, "xr")) { token = COM_Parse(&s); x = viddef.width + scale*(int)strtol(token, (char **)NULL, 10); continue; } if (!strcmp(token, "xv")) { token = COM_Parse(&s); x = viddef.width / 2 - scale*160 + scale*(int)strtol(token, (char **)NULL, 10); continue; } if (!strcmp(token, "yt")) { token = COM_Parse(&s); y = (int)strtol(token, (char **)NULL, 10); continue; } if (!strcmp(token, "yb")) { token = COM_Parse(&s); y = viddef.height + scale*(int)strtol(token, (char **)NULL, 10); continue; } if (!strcmp(token, "yv")) { token = COM_Parse(&s); y = viddef.height / 2 - scale*120 + scale*(int)strtol(token, (char **)NULL, 10); continue; } if (!strcmp(token, "pic")) { /* draw a pic from a stat number */ token = COM_Parse(&s); index = (int)strtol(token, (char **)NULL, 10); if ((index < 0) || (index >= sizeof(cl.frame.playerstate.stats))) { Com_Error(ERR_DROP, "bad stats index %d (0x%x)", index, index); } value = cl.frame.playerstate.stats[index]; if (value >= MAX_IMAGES) { Com_Error(ERR_DROP, "Pic >= MAX_IMAGES"); } if (cl.configstrings[CS_IMAGES + value]) { SCR_AddDirtyPoint(x, y); SCR_AddDirtyPoint(x + 23*scale, y + 23*scale); Draw_PicScaled(x, y, cl.configstrings[CS_IMAGES + value], scale); } continue; } if (!strcmp(token, "client")) { /* draw a deathmatch client block */ int score, ping, time; token = COM_Parse(&s); x = viddef.width / 2 - scale*160 + scale*(int)strtol(token, (char **)NULL, 10); token = COM_Parse(&s); y = viddef.height / 2 - scale*120 + scale*(int)strtol(token, (char **)NULL, 10); SCR_AddDirtyPoint(x, y); SCR_AddDirtyPoint(x + scale*159, y + scale*31); token = COM_Parse(&s); value = (int)strtol(token, (char **)NULL, 10); if ((value >= MAX_CLIENTS) || (value < 0)) { Com_Error(ERR_DROP, "client >= MAX_CLIENTS"); } ci = &cl.clientinfo[value]; token = COM_Parse(&s); score = (int)strtol(token, (char **)NULL, 10); token = COM_Parse(&s); ping = (int)strtol(token, (char **)NULL, 10); token = COM_Parse(&s); time = (int)strtol(token, (char **)NULL, 10); // TODO: scale* DrawAltStringScaled(x + scale*32, y, ci->name, scale); DrawAltStringScaled(x + scale*32, y + scale*8, "Score: ", scale); DrawAltStringScaled(x + scale*(32 + 7 * 8), y + scale*8, va("%i", score), scale); DrawStringScaled(x + scale*32, y + scale*16, va("Ping: %i", ping), scale); DrawStringScaled(x + scale*32, y + scale*24, va("Time: %i", time), scale); if (!ci->icon) { ci = &cl.baseclientinfo; } Draw_PicScaled(x, y, ci->iconname, scale); continue; } if (!strcmp(token, "ctf")) { /* draw a ctf client block */ int score, ping; char block[80]; token = COM_Parse(&s); x = viddef.width / 2 - scale*160 + scale*(int)strtol(token, (char **)NULL, 10); token = COM_Parse(&s); y = viddef.height / 2 - scale*120 + scale*(int)strtol(token, (char **)NULL, 10); SCR_AddDirtyPoint(x, y); SCR_AddDirtyPoint(x + scale*159, y + scale*31); token = COM_Parse(&s); value = (int)strtol(token, (char **)NULL, 10); if ((value >= MAX_CLIENTS) || (value < 0)) { Com_Error(ERR_DROP, "client >= MAX_CLIENTS"); } ci = &cl.clientinfo[value]; token = COM_Parse(&s); score = (int)strtol(token, (char **)NULL, 10); token = COM_Parse(&s); ping = (int)strtol(token, (char **)NULL, 10); if (ping > 999) { ping = 999; } sprintf(block, "%3d %3d %-12.12s", score, ping, ci->name); if (value == cl.playernum) { DrawAltStringScaled(x, y, block, scale); } else { DrawAltStringScaled(x, y, block, scale); } continue; } if (!strcmp(token, "picn")) { /* draw a pic from a name */ token = COM_Parse(&s); SCR_AddDirtyPoint(x, y); SCR_AddDirtyPoint(x + scale*23, y + scale*23); Draw_PicScaled(x, y, (char *)token, scale); continue; } if (!strcmp(token, "num")) { /* draw a number */ token = COM_Parse(&s); width = (int)strtol(token, (char **)NULL, 10); token = COM_Parse(&s); value = cl.frame.playerstate.stats[(int)strtol(token, (char **)NULL, 10)]; SCR_DrawFieldScaled(x, y, 0, width, value, scale); continue; } if (!strcmp(token, "hnum")) { /* health number */ int color; width = 3; value = cl.frame.playerstate.stats[STAT_HEALTH]; if (value > 25) { color = 0; /* green */ } else if (value > 0) { color = (cl.frame.serverframe >> 2) & 1; /* flash */ } else {
/* ================ SCR_ExecuteLayoutString ================ */ void SCR_ExecuteLayoutString (char *s) { int x, y; int value; char *token; int width; int index; clientinfo_t *ci; if (cls.state != ca_active || !cl.refresh_prepped) return; if (!s[0]) return; x = 0; y = 0; width = 3; while (s) { token = COM_Parse (&s); if (!strcmp(token, "xl")) { token = COM_Parse (&s); x = atoi(token); continue; } if (!strcmp(token, "xr")) { token = COM_Parse (&s); x = viddef.width + atoi(token); continue; } if (!strcmp(token, "xv")) { token = COM_Parse (&s); x = viddef.width/2 - 160 + atoi(token); continue; } if (!strcmp(token, "yt")) { token = COM_Parse (&s); y = atoi(token); continue; } if (!strcmp(token, "yb")) { token = COM_Parse (&s); y = viddef.height + atoi(token); continue; } if (!strcmp(token, "yv")) { token = COM_Parse (&s); y = viddef.height/2 - 120 + atoi(token); continue; } if (!strcmp(token, "pic")) { // draw a pic from a stat number token = COM_Parse (&s); value = cl.frame.playerstate.stats[atoi(token)]; if (value >= MAX_IMAGES) Com_Error (ERR_DROP, "Pic >= MAX_IMAGES"); if (cl.configstrings[CS_IMAGES+value]) { SCR_AddDirtyPoint (x, y); SCR_AddDirtyPoint (x+23, y+23); re.DrawPic (x, y, cl.configstrings[CS_IMAGES+value]); } continue; } if (!strcmp(token, "client")) { // draw a deathmatch client block int score, ping, time; token = COM_Parse (&s); x = viddef.width/2 - 160 + atoi(token); token = COM_Parse (&s); y = viddef.height/2 - 120 + atoi(token); SCR_AddDirtyPoint (x, y); SCR_AddDirtyPoint (x+159, y+31); token = COM_Parse (&s); value = atoi(token); if (value >= MAX_CLIENTS || value < 0) Com_Error (ERR_DROP, "client >= MAX_CLIENTS"); ci = &cl.clientinfo[value]; token = COM_Parse (&s); score = atoi(token); token = COM_Parse (&s); ping = atoi(token); token = COM_Parse (&s); time = atoi(token); DrawAltString (x+32, y, ci->name); #if defined (__APPLE__) || defined (MACOSX) Con_DrawString (x+32, y+8, "Score: "); #else DrawString (x+32, y+8, "Score: "); #endif /* __APPLE__ || MACOSX */ DrawAltString (x+32+7*8, y+8, va("%i", score)); #if defined (__APPLE__) || defined (MACOSX) Con_DrawString (x+32, y+16, va("Ping: %i", ping)); Con_DrawString (x+32, y+24, va("Time: %i", time)); #else DrawString (x+32, y+16, va("Ping: %i", ping)); DrawString (x+32, y+24, va("Time: %i", time)); #endif /* __APPLE__ || MACOSX */ if (!ci->icon) ci = &cl.baseclientinfo; re.DrawPic (x, y, ci->iconname); continue; } if (!strcmp(token, "ctf")) { // draw a ctf client block int score, ping; char block[80]; token = COM_Parse (&s); x = viddef.width/2 - 160 + atoi(token); token = COM_Parse (&s); y = viddef.height/2 - 120 + atoi(token); SCR_AddDirtyPoint (x, y); SCR_AddDirtyPoint (x+159, y+31); token = COM_Parse (&s); value = atoi(token); if (value >= MAX_CLIENTS || value < 0) Com_Error (ERR_DROP, "client >= MAX_CLIENTS"); ci = &cl.clientinfo[value]; token = COM_Parse (&s); score = atoi(token); token = COM_Parse (&s); ping = atoi(token); if (ping > 999) ping = 999; #if defined (__APPLE__) || defined (MACOSX) snprintf(block, 80, "%3d %3d %-12.12s", score, ping, ci->name); #else sprintf(block, "%3d %3d %-12.12s", score, ping, ci->name); #endif /* __APPLE__ || MACOSX */ if (value == cl.playernum) DrawAltString (x, y, block); else #if defined (__APPLE__) || defined (MACOSX) Con_DrawString (x, y, block); #else DrawString (x, y, block); #endif /* __APPLE__ ||ÊMACOSX */ continue; } if (!strcmp(token, "picn")) { // draw a pic from a name token = COM_Parse (&s); SCR_AddDirtyPoint (x, y); SCR_AddDirtyPoint (x+23, y+23); re.DrawPic (x, y, token); continue; } if (!strcmp(token, "num")) { // draw a number token = COM_Parse (&s); width = atoi(token); token = COM_Parse (&s); value = cl.frame.playerstate.stats[atoi(token)]; SCR_DrawField (x, y, 0, width, value); continue; } if (!strcmp(token, "hnum")) { // health number int color; width = 3; value = cl.frame.playerstate.stats[STAT_HEALTH]; if (value > 25) color = 0; // green else if (value > 0) color = (cl.frame.serverframe>>2) & 1; // flash else color = 1; if (cl.frame.playerstate.stats[STAT_FLASHES] & 1) re.DrawPic (x, y, "field_3"); SCR_DrawField (x, y, color, width, value); continue; }
/* =============== V_SetupRefDef update refdef values each frame =============== */ void V_SetupRefDef( void ) { cl_entity_t *clent; int size; int sb_lines; clent = CL_GetLocalPlayer (); clgame.entities->curstate.scale = clgame.movevars.waveHeight; VectorCopy( cl.frame.local.client.punchangle, cl.refdef.punchangle ); clgame.viewent.curstate.modelindex = cl.frame.local.client.viewmodel; clgame.viewent.model = Mod_Handle( clgame.viewent.curstate.modelindex ); clgame.viewent.curstate.number = cl.playernum + 1; clgame.viewent.curstate.entityType = ET_NORMAL; clgame.viewent.index = cl.playernum + 1; cl.refdef.movevars = &clgame.movevars; cl.refdef.onground = ( cl.frame.local.client.flags & FL_ONGROUND ) ? 1 : 0; cl.refdef.health = cl.frame.local.client.health; cl.refdef.playernum = cl.playernum; cl.refdef.max_entities = clgame.maxEntities; cl.refdef.maxclients = cl.maxclients; cl.refdef.time = cl.time; cl.refdef.frametime = cl.time - cl.oldtime; cl.refdef.demoplayback = cls.demoplayback; cl.refdef.smoothing = cl_smooth->integer; cl.refdef.viewsize = scr_viewsize->integer; cl.refdef.waterlevel = cl.frame.local.client.waterlevel; cl.refdef.onlyClientDraw = 0; // reset clientdraw cl.refdef.hardware = true; // always true cl.refdef.spectator = (clent->curstate.spectator != 0); cl.refdef.nextView = 0; SCR_AddDirtyPoint( 0, 0 ); SCR_AddDirtyPoint( scr_width->integer - 1, scr_height->integer - 1 ); if( cl.refdef.viewsize >= 120 ) sb_lines = 0; // no status bar at all else if( cl.refdef.viewsize >= 110 ) sb_lines = 24; // no inventory else sb_lines = 48; size = min( scr_viewsize->integer, 100 ); cl.refdef.viewport[2] = scr_width->integer * size / 100; cl.refdef.viewport[3] = scr_height->integer * size / 100; if( cl.refdef.viewport[3] > scr_height->integer - sb_lines ) cl.refdef.viewport[3] = scr_height->integer - sb_lines; if( cl.refdef.viewport[3] > scr_height->integer ) cl.refdef.viewport[3] = scr_height->integer; cl.refdef.viewport[0] = (scr_width->integer - cl.refdef.viewport[2]) / 2; cl.refdef.viewport[1] = (scr_height->integer - sb_lines - cl.refdef.viewport[3]) / 2; // calc FOV cl.refdef.fov_x = cl.data.fov; // this is a final fov value cl.refdef.fov_y = V_CalcFov( &cl.refdef.fov_x, cl.refdef.viewport[2], cl.refdef.viewport[3] ); // adjust FOV for widescreen if( glState.wideScreen && r_adjust_fov->integer ) V_AdjustFov( &cl.refdef.fov_x, &cl.refdef.fov_y, cl.refdef.viewport[2], cl.refdef.viewport[3], false ); if( CL_IsPredicted( ) && !cl.refdef.demoplayback ) { VectorCopy( cl.predicted_origin, cl.refdef.simorg ); VectorCopy( cl.predicted_velocity, cl.refdef.simvel ); VectorCopy( cl.predicted_viewofs, cl.refdef.viewheight ); } else { VectorCopy( cl.frame.local.client.origin, cl.refdef.simorg ); VectorCopy( cl.frame.local.client.view_ofs, cl.refdef.viewheight ); VectorCopy( cl.frame.local.client.velocity, cl.refdef.simvel ); } }
/* ================ SCR_DirtyScreen ================ */ void SCR_DirtyScreen( void ) { SCR_AddDirtyPoint( 0, 0 ); SCR_AddDirtyPoint( scr_width->integer - 1, scr_height->integer - 1 ); }
void SCR_DrawCenterString(void) { char *start; int l; int j; int x, y; int remaining; float scale; const int char_unscaled_width = 8; const int char_unscaled_height = 8; /* the finale prints the characters one at a time */ remaining = 9999; scr_erase_center = 0; start = scr_centerstring; scale = SCR_GetConsoleScale(); if (scr_center_lines <= 4) { y = (viddef.height * 0.35) / scale; } else { y = 48 / scale; } do { /* scan the width of the line */ for (l = 0; l < 40; l++) { if ((start[l] == '\n') || !start[l]) { break; } } x = ((viddef.width / scale) - (l * char_unscaled_width)) / 2; SCR_AddDirtyPoint(x, y); for (j = 0; j < l; j++, x += char_unscaled_width) { Draw_CharScaled(x * scale, y * scale, start[j], scale); if (!remaining--) { return; } } SCR_AddDirtyPoint(x, y + char_unscaled_height); y += char_unscaled_height; while (*start && *start != '\n') { start++; } if (!*start) { break; } start++; /* skip the \n */ } while (1); }