コード例 #1
0
ファイル: cg_newDraw.c プロジェクト: DerSaidin/OpenWolf
/*
==============
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);
}
コード例 #2
0
ファイル: cg_newDraw.c プロジェクト: BulldogDrummond/etpub
/*
==============
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)
}
コード例 #3
0
ファイル: cg_drawtools.c プロジェクト: ethr/ETXreaLPro_etmain
/*
=================
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);
}
コード例 #4
0
ファイル: cg_newDraw.c プロジェクト: ioid3-games/ioid3-wet
/**
 * @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);
}
コード例 #5
0
ファイル: cg_draw_hud.c プロジェクト: sxweet/etlegacy
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);
}
コード例 #6
0
ファイル: cg_draw_hud.c プロジェクト: sxweet/etlegacy
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);
}
コード例 #7
0
ファイル: cg_info.c プロジェクト: belstgut/etlegacy
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);
	}
}
コード例 #8
0
ファイル: cg_draw_hud.c プロジェクト: sxweet/etlegacy
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);
}
コード例 #9
0
ファイル: cg_newDraw.c プロジェクト: BulldogDrummond/etpub
/*
==============
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);
	}

}
コード例 #10
0
ファイル: cg_newDraw.c プロジェクト: Exosum/ETrun
/*
==============
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);
	}
}
コード例 #11
0
ファイル: cg_newDraw.c プロジェクト: Ponce/etlegacy
/*
==============
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);
		}
	}
}