/* ============== CG_DrawWeapHeat ============== */ void CG_DrawWeapHeat(rectDef_t * rect, int align) { vec4_t color = { 1, 0, 0, 0.2f }, color2 = { 1, 0, 0, 0.5f}; int flags = 0; if(!(cg.snap->ps.curWeapHeat)) { return; } if(align != HUD_HORIZONTAL) { flags |= 4; // BAR_VERT } flags |= 1; // BAR_LEFT - this is hardcoded now, but will be decided by the menu script flags |= 16; // BAR_BG - draw the filled contrast box // flags|=32; // BAR_BGSPACING_X0Y5 - different style flags |= 256; // BAR_COLOR_LERP CG_FilledBar(rect->x, rect->y, rect->w, rect->h, color, color2, NULL, (float)cg.snap->ps.curWeapHeat / 255.0f, flags); }
/* ============== CG_DrawWeapStability draw a bar showing current stability level (0-255), max at current weapon/ability, and 'perfect' reference mark probably only drawn for scoped weapons ============== */ void CG_DrawWeapStability( rectDef_t *rect ) { vec4_t goodColor = {0, 1, 0, 0.5f}, badColor = {1, 0, 0, 0.5f}; if(!cg_drawSpreadScale.integer) return; if( cg_drawSpreadScale.integer == 1 && !BG_IsScopedWeapon( cg.predictedPlayerState.weapon ) ) { // cg_drawSpreadScale of '1' means only draw for scoped weapons, '2' means draw all the time (for debugging) return; } if( cg.predictedPlayerState.weaponstate != WEAPON_READY ) { return; } //if(!(cg.snap->ps.aimSpreadScale)) { // forty - use the predicted values for the bar... if(!(cg.predictedPlayerState.aimSpreadScale)) { return; } if( cg.renderingThirdPerson ) { return; } //CG_FilledBar(rect->x, rect->y, rect->w, rect->h, goodColor, badColor, NULL, (float)cg.snap->ps.aimSpreadScale / 255.0f, 2|4|256); // flags (BAR_CENTER|BAR_VERT|BAR_LERP_COLOR) // forty - use the predicted values for the bar... CG_FilledBar(rect->x, rect->y, rect->w, rect->h, goodColor, badColor, NULL, (float)cg.predictedPlayerState.aimSpreadScale / 255.0f, 2|4|256); // flags (BAR_CENTER|BAR_VERT|BAR_LERP_COLOR) }
/* ================= CG_HorizontalPercentBar ================= */ void CG_HorizontalPercentBar(float x, float y, float width, float height, float percent) { vec4_t bgcolor = { 0.5f, 0.5f, 0.5f, 0.3f }, color = { 1.0f, 1.0f, 1.0f, 0.3f}; CG_FilledBar(x, y, width, height, color, NULL, bgcolor, percent, BAR_BG | BAR_NOHUDALPHA); }
/** * @brief Draw a bar showing current stability level (0-255), max at current weapon/ability, and 'perfect' reference mark * probably only drawn for scoped weapons * @param[in] rect */ void CG_DrawWeapStability(rectDef_t *rect) { static vec4_t goodColor = { 0, 1, 0, 0.5f }, badColor = { 1, 0, 0, 0.5f }; if (!cg_drawSpreadScale.integer) { return; } if (cg_drawSpreadScale.integer == 1 && !cg.zoomed) { // cg_drawSpreadScale of '1' means only draw for scoped weapons, '2' means draw all the time (for debugging) return; } if (cg.predictedPlayerState.weaponstate != WEAPON_READY) { return; } if (!(cg.snap->ps.aimSpreadScale)) { return; } if (cg.renderingThirdPerson) { return; } CG_FilledBar(rect->x, rect->y, rect->w, rect->h, goodColor, badColor, NULL, (float)cg.snap->ps.aimSpreadScale / 255.0f, BAR_CENTER | BAR_VERT | BAR_LERP_COLOR); }
static void CG_DrawWeapRecharge(rectDef_t *rect) { float barFrac, chargeTime; int flags; qboolean fade = qfalse; vec4_t bgcolor = { 1.0f, 1.0f, 1.0f, 0.25f }; vec4_t color; flags = 1 | 4 | 16; // Draw power bar if (cg.snap->ps.stats[STAT_PLAYER_CLASS] == PC_ENGINEER) { chargeTime = cg.engineerChargeTime[cg.snap->ps.persistant[PERS_TEAM] - 1]; } else if (cg.snap->ps.stats[STAT_PLAYER_CLASS] == PC_MEDIC) { chargeTime = cg.medicChargeTime[cg.snap->ps.persistant[PERS_TEAM] - 1]; } else if (cg.snap->ps.stats[STAT_PLAYER_CLASS] == PC_FIELDOPS) { chargeTime = cg.ltChargeTime[cg.snap->ps.persistant[PERS_TEAM] - 1]; } else if (cg.snap->ps.stats[STAT_PLAYER_CLASS] == PC_COVERTOPS) { chargeTime = cg.covertopsChargeTime[cg.snap->ps.persistant[PERS_TEAM] - 1]; } else { chargeTime = cg.soldierChargeTime[cg.snap->ps.persistant[PERS_TEAM] - 1]; } barFrac = (float)(cg.time - cg.snap->ps.classWeaponTime) / chargeTime; if (barFrac > 1.0) { barFrac = 1.0; } color[0] = 1.0f; color[1] = color[2] = barFrac; color[3] = 0.25 + barFrac * 0.5; if (fade) { bgcolor[3] *= 0.4f; color[3] *= 0.4; } CG_FilledBar(rect->x, rect->y + (rect->h * 0.1f), rect->w, rect->h * 0.84f, color, NULL, bgcolor, barFrac, flags); trap_R_SetColor(NULL); CG_DrawPic(rect->x, rect->y, rect->w, rect->h, cgs.media.hudSprintBar); CG_DrawPic(rect->x + (rect->w * 0.25f) - 1, rect->y + rect->h + 4, (rect->w * 0.5f) + 2, rect->w + 2, cgs.media.hudPowerIcon); }
static void CG_DrawStaminaBar(rectDef_t *rect) { vec4_t colour = { 0.1f, 1.0f, 0.1f, 0.5f }; vec4_t colourlow = { 1.0f, 0.1f, 0.1f, 0.5f }; vec_t *color = colour; int flags = 1 | 4 | 16 | 64; float frac = cg.pmext.sprintTime / (float)SPRINTTIME; if (cg.snap->ps.powerups[PW_ADRENALINE]) { if (cg.snap->ps.pm_flags & PMF_FOLLOW) { Vector4Average(colour, colorWhite, sin(cg.time * .005f), colour); } else { float msec = cg.snap->ps.powerups[PW_ADRENALINE] - cg.time; if (msec < 0) { msec = 0; } else { Vector4Average(colour, colorWhite, .5f + sin(.2f * sqrt(msec) * 2 * M_PI) * .5f, colour); } } } else { if (frac < 0.25) { color = colourlow; } } CG_FilledBar(rect->x, rect->y + (rect->h * 0.1f), rect->w, rect->h * 0.84f, color, NULL, bgcolour, frac, flags); trap_R_SetColor(NULL); CG_DrawPic(rect->x, rect->y, rect->w, rect->h, cgs.media.hudSprintBar); CG_DrawPic(rect->x, rect->y + rect->h + 4, rect->w, rect->w, cgs.media.hudSprintIcon); }
void CG_DemoControlButtonRender(panel_button_t *button) { if (button->data[0]) { CG_FillRect(button->rect.x, button->rect.y, button->rect.w, button->rect.h, color_bg_title); CG_DrawRect(button->rect.x, button->rect.y, button->rect.w, button->rect.h, 1, color_border); //BG_PanelButtonsRender_Text(button); CG_Text_Paint_Ext(button->rect.x + button->rect.w * 0.4f, button->rect.y + button->rect.h * 0.7f, button->font->scalex, button->font->scaley, button->font->colour, button->text, 0.0f, 0, button->font->style, button->font->font); } else { float demoStatus = ((float)(cg.time - cg.demoinfo->firstTime)) / (cg.demoinfo->lastTime - cg.demoinfo->firstTime); vec4_t barColor; Vector4Copy(colorGreen, barColor); barColor[3] = button->font->colour[3]; //borderColor CG_FilledBar(button->rect.x, button->rect.y, button->rect.w, button->rect.h, barColor, NULL, color_border1, demoStatus, BAR_BG); } }
static void CG_DrawPlayerHealthBar(rectDef_t *rect) { vec4_t colour; int flags = 1 | 4 | 16 | 64; float frac; CG_ColorForHealth(colour); colour[3] = 0.5f; if (cgs.clientinfo[cg.snap->ps.clientNum].cls == PC_MEDIC) { frac = cg.snap->ps.stats[STAT_HEALTH] / ((float) cg.snap->ps.stats[STAT_MAX_HEALTH] * 1.12f); } else { frac = cg.snap->ps.stats[STAT_HEALTH] / (float) cg.snap->ps.stats[STAT_MAX_HEALTH]; } CG_FilledBar(rect->x, rect->y + (rect->h * 0.1f), rect->w, rect->h * 0.84f, colour, NULL, bgcolour, frac, flags); trap_R_SetColor(NULL); CG_DrawPic(rect->x, rect->y, rect->w, rect->h, cgs.media.hudSprintBar); CG_DrawPic(rect->x, rect->y + rect->h + 4, rect->w, rect->w, cgs.media.hudHealthIcon); }
/* ============== CG_DrawCursorHints cg_cursorHints.integer == 0: no hints 1: sin size pulse 2: one way size pulse 3: alpha pulse 4+: static image ============== */ void CG_DrawCursorhint(rectDef_t *rect) { float *color; qhandle_t icon, icon2 = 0; float scale, halfscale; //qboolean redbar = qfalse; qboolean yellowbar = qfalse; if(!cg_cursorHints.integer) return; CG_CheckForCursorHints(); switch(cg.cursorHintIcon) { case HINT_NONE: case HINT_FORCENONE: icon = 0; break; case HINT_DOOR: icon = cgs.media.doorHintShader; break; case HINT_DOOR_ROTATING: icon = cgs.media.doorRotateHintShader; break; case HINT_DOOR_LOCKED: icon = cgs.media.doorLockHintShader; break; case HINT_DOOR_ROTATING_LOCKED: icon = cgs.media.doorRotateLockHintShader; break; case HINT_MG42: icon = cgs.media.mg42HintShader; break; case HINT_BREAKABLE: icon = cgs.media.breakableHintShader; break; case HINT_BREAKABLE_DYNAMITE: icon = cgs.media.dynamiteHintShader; break; case HINT_TANK: icon = cgs.media.tankHintShader; break; case HINT_SATCHELCHARGE: icon = cgs.media.satchelchargeHintShader; break; case HINT_CONSTRUCTIBLE: icon = cgs.media.buildHintShader; break; case HINT_UNIFORM: icon = cgs.media.uniformHintShader; break; case HINT_LANDMINE: icon = cgs.media.landmineHintShader; break; case HINT_CHAIR: icon = cgs.media.notUsableHintShader; // only show 'pickupable' if you're not armed, or are armed with a single handed weapon // rain - WEAPS_ONE_HANDED isn't valid anymore, because // WP_SILENCED_COLT uses a bit >31 (and, therefore, is too large // to be shifted in the way WEAPS_ONE_HANDED does on a 32-bit // system.) If you want to use HINT_CHAIR, you'll need to fix // this. #if 0 if( !(cg.predictedPlayerState.weapon) || WEAPS_ONE_HANDED & (1<<(cg.predictedPlayerState.weapon)) ) { icon = cgs.media.chairHintShader; } #endif break; case HINT_ALARM: icon = cgs.media.alarmHintShader; break; case HINT_HEALTH: icon = cgs.media.healthHintShader; break; case HINT_TREASURE: icon = cgs.media.treasureHintShader; break; case HINT_KNIFE: icon = cgs.media.knifeHintShader; break; case HINT_LADDER: icon = cgs.media.ladderHintShader; break; case HINT_BUTTON: icon = cgs.media.buttonHintShader; break; case HINT_WATER: icon = cgs.media.waterHintShader; break; case HINT_CAUTION: icon = cgs.media.cautionHintShader; break; case HINT_DANGER: icon = cgs.media.dangerHintShader; break; case HINT_SECRET: icon = cgs.media.secretHintShader; break; case HINT_QUESTION: icon = cgs.media.qeustionHintShader; break; case HINT_EXCLAMATION: icon = cgs.media.exclamationHintShader; break; case HINT_CLIPBOARD: icon = cgs.media.clipboardHintShader; break; case HINT_WEAPON: icon = cgs.media.weaponHintShader; break; case HINT_AMMO: icon = cgs.media.ammoHintShader; break; case HINT_ARMOR: icon = cgs.media.armorHintShader; break; case HINT_POWERUP: icon = cgs.media.powerupHintShader; break; case HINT_HOLDABLE: icon = cgs.media.holdableHintShader; break; case HINT_INVENTORY: icon = cgs.media.inventoryHintShader; break; case HINT_PLYR_FRIEND: icon = cgs.media.hintPlrFriendShader; break; case HINT_PLYR_NEUTRAL: icon = cgs.media.hintPlrNeutralShader; break; case HINT_PLYR_ENEMY: icon = cgs.media.hintPlrEnemyShader; break; case HINT_PLYR_UNKNOWN: icon = cgs.media.hintPlrUnknownShader; break; // DHM - Nerve :: multiplayer hints case HINT_BUILD: icon = cgs.media.buildHintShader; break; case HINT_DISARM: icon = cgs.media.disarmHintShader; break; case HINT_REVIVE: icon = cgs.media.reviveHintShader; break; case HINT_DYNAMITE: icon = cgs.media.dynamiteHintShader; break; // dhm - end // Mad Doc - TDF case HINT_LOCKPICK: icon = cgs.media.doorLockHintShader; // TAT 1/30/2003 - use the locked door hint cursor yellowbar = qtrue; // draw the status bar in yellow so it shows up better break; case HINT_ACTIVATE: case HINT_PLAYER: default: icon = cgs.media.usableHintShader; break; } if(!icon) return; // color color = CG_FadeColor( cg.cursorHintTime, cg.cursorHintFade ); if ( !color ) { trap_R_SetColor( NULL ); return; } if(cg_cursorHints.integer == 3) { color[3] *= 0.5+0.5*sin((float)cg.time/150.0); } // size if(cg_cursorHints.integer >= 3) { // no size pulsing scale = halfscale = 0; } else { if(cg_cursorHints.integer == 2) scale = (float)((cg.cursorHintTime)%1000) / 100.0f; // one way size pulse else scale = CURSORHINT_SCALE * (0.5+0.5*sin((float)cg.time/150.0)); // sin pulse halfscale = scale * 0.5f; } // set color and draw the hint trap_R_SetColor( color ); CG_DrawPic( rect->x - halfscale, rect->y - halfscale, rect->w + scale, rect->h + scale, icon ); if( icon2 ) { CG_DrawPic( rect->x - halfscale, rect->y - halfscale, rect->w + scale, rect->h + scale, icon2 ); } trap_R_SetColor( NULL ); // draw status bar under the cursor hint if(cg.cursorHintValue) { if (yellowbar) { Vector4Set(color, 1, 1, 0, 1.0f); } else { Vector4Set(color, 0, 0, 1, 0.5f); } CG_FilledBar(rect->x, rect->y + rect->h + 4, rect->w, 8, color, NULL, NULL, (float)cg.cursorHintValue/255.0f, 0); } }
/* ============== CG_DrawCursorHints cg_cursorHints.integer == 0: no hints 1: sin size pulse 2: one way size pulse 3: alpha pulse 4+: static image ============== */ void CG_DrawCursorhint(rectDef_t *rect) { float *color; qhandle_t icon = 0, icon2 = 0; float scale, halfscale; qboolean yellowbar = qfalse; if (!cg_cursorHints.integer) { return; } CG_CheckForCursorHints(); switch (cg.cursorHintIcon) { case HINT_NONE: case HINT_FORCENONE: icon = 0; break; case HINT_DOOR: icon = cgs.media.doorHintShader; break; case HINT_DOOR_ROTATING: icon = cgs.media.doorRotateHintShader; break; case HINT_DOOR_LOCKED: icon = cgs.media.doorLockHintShader; break; case HINT_DOOR_ROTATING_LOCKED: icon = cgs.media.doorRotateLockHintShader; break; case HINT_MG42: icon = cgs.media.mg42HintShader; break; case HINT_BREAKABLE: icon = cgs.media.breakableHintShader; break; case HINT_BREAKABLE_DYNAMITE: icon = cgs.media.dynamiteHintShader; break; case HINT_TANK: icon = cgs.media.tankHintShader; break; case HINT_SATCHELCHARGE: icon = cgs.media.satchelchargeHintShader; break; case HINT_CONSTRUCTIBLE: icon = cgs.media.buildHintShader; break; case HINT_UNIFORM: icon = cgs.media.uniformHintShader; break; case HINT_CHAIR: icon = cgs.media.notUsableHintShader; break; case HINT_ALARM: icon = cgs.media.alarmHintShader; break; case HINT_HEALTH: icon = cgs.media.healthHintShader; break; case HINT_TREASURE: icon = cgs.media.treasureHintShader; break; case HINT_KNIFE: break; case HINT_LADDER: icon = cgs.media.ladderHintShader; break; case HINT_BUTTON: icon = cgs.media.buttonHintShader; break; case HINT_WATER: icon = cgs.media.waterHintShader; break; case HINT_CAUTION: icon = cgs.media.cautionHintShader; break; case HINT_DANGER: icon = cgs.media.dangerHintShader; break; case HINT_SECRET: icon = cgs.media.secretHintShader; break; case HINT_QUESTION: icon = cgs.media.qeustionHintShader; break; case HINT_EXCLAMATION: icon = cgs.media.exclamationHintShader; break; case HINT_CLIPBOARD: icon = cgs.media.clipboardHintShader; break; case HINT_WEAPON: icon = cgs.media.weaponHintShader; break; case HINT_AMMO: icon = cgs.media.ammoHintShader; break; case HINT_ARMOR: icon = cgs.media.armorHintShader; break; case HINT_POWERUP: icon = cgs.media.powerupHintShader; break; case HINT_HOLDABLE: icon = cgs.media.holdableHintShader; break; case HINT_INVENTORY: icon = cgs.media.inventoryHintShader; break; case HINT_PLYR_FRIEND: icon = cgs.media.hintPlrFriendShader; break; case HINT_PLYR_NEUTRAL: icon = cgs.media.hintPlrNeutralShader; break; case HINT_PLYR_ENEMY: icon = cgs.media.hintPlrEnemyShader; break; case HINT_PLYR_UNKNOWN: icon = cgs.media.hintPlrUnknownShader; break; // DHM - Nerve :: multiplayer hints case HINT_BUILD: icon = cgs.media.buildHintShader; break; case HINT_DISARM: icon = cgs.media.disarmHintShader; break; case HINT_REVIVE: break; case HINT_DYNAMITE: icon = cgs.media.dynamiteHintShader; break; // dhm - end // Mad Doc - TDF case HINT_LOCKPICK: icon = cgs.media.doorLockHintShader; // TAT 1/30/2003 - use the locked door hint cursor yellowbar = qtrue; // draw the status bar in yellow so it shows up better break; case HINT_ACTIVATE: case HINT_PLAYER: default: icon = cgs.media.usableHintShader; break; } if (!icon) { return; } // color color = CG_FadeColor(cg.cursorHintTime, cg.cursorHintFade); if (!color) { trap_R_SetColor(NULL); return; } if (cg_cursorHints.integer == 3) { color[3] *= 0.5 + 0.5 * sin((float)cg.time / 150.0); } // size if (cg_cursorHints.integer >= 3) { // no size pulsing scale = halfscale = 0; } else { if (cg_cursorHints.integer == 2) { scale = (float)((cg.cursorHintTime) % 1000) / 100.0f; // one way size pulse } else { scale = 10 * (0.5 + 0.5 * sin((float)cg.time / 150.0)); // sin pulse } halfscale = scale * 0.5f; } // set color and draw the hint trap_R_SetColor(color); CG_DrawPic(rect->x - halfscale, rect->y - halfscale, rect->w + scale, rect->h + scale, icon); if (icon2) { CG_DrawPic(rect->x - halfscale, rect->y - halfscale, rect->w + scale, rect->h + scale, icon2); } trap_R_SetColor(NULL); // draw status bar under the cursor hint if (cg.cursorHintValue) { if (yellowbar) { Vector4Set(color, 1, 1, 0, 1.0f); } else { Vector4Set(color, 0, 0, 1, 0.5f); } CG_FilledBar(rect->x, rect->y + rect->h + 4, rect->w, 8, color, NULL, NULL, (float)cg.cursorHintValue / 255.0f, 0); } }
/* ============== CG_DrawCursorHints cg_cursorHints.integer == 0: no hints 1: sin size pulse 2: one way size pulse 3: alpha pulse 4+: static image ============== */ void CG_DrawCursorhint(rectDef_t *rect) { float *color; qhandle_t icon, icon2 = 0; float scale, halfscale; float middle = rect->x + cgs.wideXoffset; if (!cg_cursorHints.integer) { return; } CG_CheckForCursorHints(); switch (cg.cursorHintIcon) { case HINT_NONE: case HINT_FORCENONE: icon = 0; break; case HINT_DOOR: icon = cgs.media.doorHintShader; break; case HINT_DOOR_ROTATING: icon = cgs.media.doorRotateHintShader; break; case HINT_DOOR_LOCKED: icon = cgs.media.doorLockHintShader; break; case HINT_DOOR_ROTATING_LOCKED: icon = cgs.media.doorRotateLockHintShader; break; case HINT_MG42: icon = cgs.media.mg42HintShader; break; case HINT_BREAKABLE: icon = cgs.media.breakableHintShader; break; case HINT_BREAKABLE_DYNAMITE: icon = cgs.media.dynamiteHintShader; break; case HINT_TANK: icon = cgs.media.tankHintShader; break; case HINT_SATCHELCHARGE: icon = cgs.media.satchelchargeHintShader; break; case HINT_CONSTRUCTIBLE: icon = cgs.media.buildHintShader; break; case HINT_UNIFORM: icon = cgs.media.uniformHintShader; break; case HINT_LANDMINE: icon = cgs.media.landmineHintShader; break; case HINT_CHAIR: icon = cgs.media.notUsableHintShader; break; case HINT_ALARM: icon = cgs.media.alarmHintShader; break; case HINT_HEALTH: icon = cgs.media.healthHintShader; break; case HINT_TREASURE: icon = cgs.media.treasureHintShader; break; case HINT_KNIFE: icon = cgs.media.knifeHintShader; break; case HINT_LADDER: icon = cgs.media.ladderHintShader; break; case HINT_BUTTON: icon = cgs.media.buttonHintShader; break; case HINT_WATER: icon = cgs.media.waterHintShader; break; case HINT_CAUTION: icon = cgs.media.cautionHintShader; break; case HINT_DANGER: icon = cgs.media.dangerHintShader; break; case HINT_SECRET: icon = cgs.media.secretHintShader; break; case HINT_QUESTION: icon = cgs.media.qeustionHintShader; break; case HINT_EXCLAMATION: icon = cgs.media.exclamationHintShader; break; case HINT_CLIPBOARD: icon = cgs.media.clipboardHintShader; break; case HINT_WEAPON: icon = cgs.media.weaponHintShader; break; case HINT_AMMO: icon = cgs.media.ammoHintShader; break; case HINT_ARMOR: icon = cgs.media.armorHintShader; break; case HINT_POWERUP: icon = cgs.media.powerupHintShader; break; case HINT_HOLDABLE: icon = cgs.media.holdableHintShader; break; case HINT_INVENTORY: icon = cgs.media.inventoryHintShader; break; case HINT_PLYR_FRIEND: case HINT_PLYR_NEUTRAL: case HINT_PLYR_ENEMY: case HINT_PLYR_UNKNOWN: return; // multiplayer hints case HINT_BUILD: icon = cgs.media.buildHintShader; break; case HINT_DISARM: icon = cgs.media.disarmHintShader; break; case HINT_REVIVE: icon = cgs.media.reviveHintShader; break; case HINT_DYNAMITE: icon = cgs.media.dynamiteHintShader; break; case HINT_ACTIVATE: case HINT_PLAYER: default: icon = cgs.media.usableHintShader; break; } if (!icon) { return; } // color color = CG_FadeColor(cg.cursorHintTime, cg.cursorHintFade); if (!color) { trap_R_SetColor(NULL); return; } if (cg_cursorHints.integer == 3) { color[3] *= 0.5 + 0.5 * sin((float)cg.time / 150.0); } // size if (cg_cursorHints.integer >= 3) // no size pulsing { scale = halfscale = 0; } else { if (cg_cursorHints.integer == 2) { scale = (float)((cg.cursorHintTime) % 1000) / 100.0f; // one way size pulse } else { scale = CURSORHINT_SCALE * (0.5 + 0.5 * sin((float)cg.time / 150.0)); // sin pulse } halfscale = scale * 0.5f; } // set color and draw the hint trap_R_SetColor(color); CG_DrawPic(middle - halfscale, rect->y - halfscale, rect->w + scale, rect->h + scale, icon); if (icon2) { CG_DrawPic(middle - halfscale, rect->y - halfscale, rect->w + scale, rect->h + scale, icon2); } trap_R_SetColor(NULL); // draw status bar under the cursor hint if (cg.cursorHintValue) { vec4_t backG = { 1, 1, 1, 0.3f }; float curValue = (float)cg.cursorHintValue / 255.0f; if (curValue > 0.01f) { CG_FilledBar(middle, rect->y + rect->h + 4, rect->w, 8, colorRed, colorGreen, backG, curValue, BAR_BORDER_SMALL | BAR_LERP_COLOR); } } }