//-----------------------------------------------------------------------------
// Purpose: 
//-----------------------------------------------------------------------------
void C_WeaponMortar::Redraw()
{
	BaseClass::Redraw();

	// If the player's dead, abort
	C_BaseTFPlayer *pPlayer = C_BaseTFPlayer::GetLocalPlayer();
	if ( pPlayer == NULL )
		return;
	if ( pPlayer->GetHealth() < 1 )
	{
		m_iFiringState = MORTAR_IDLE;
		m_bCarried = true;
		return;
	}

	// If it's reloading, tell the player
	if ( m_bMortarReloading )
	{
		int width, height;
		messagechars->GetStringLength( m_hFontText, &width, &height, "Mortar is reloading..." );
		messagechars->DrawString( m_hFontText, (ScreenWidth() - width) / 2, YRES(350), 192, 192, 192, 255, "Mortar is reloading...", IMessageChars::MESSAGESTRINGID_NONE );
		return;
	}

	// Handle power charging
	switch( m_iFiringState )
	{
	case MORTAR_IDLE:
		m_pPowerBar->m_flPower = 0;
		break;
	case MORTAR_CHARGING_POWER:
		m_pPowerBar->m_flPower = min( m_pPowerBar->m_flPower + ( (1.0 / MORTAR_CHARGE_POWER_RATE) * gpGlobals->curtimeDelta), 1.0f);
		m_pPowerBar->m_flFiringPower = 0;
		m_pPowerBar->m_flFiringAccuracy = 0;
		if ( m_pPowerBar->m_flPower >= 1.0 )
		{
			// Hit Max, start going down
			m_pPowerBar->m_flFiringPower = m_pPowerBar->m_flPower;
			m_iFiringState = MORTAR_CHARGING_ACCURACY;
			m_flNextClick = gpGlobals->curtime + 0.25;
		}
		break;
	case MORTAR_CHARGING_ACCURACY:
		// Calculate accuracy speed
		m_flAccuracySpeed = (1.0 / MORTAR_CHARGE_ACCURACY_RATE);
		if ( m_pPowerBar->m_flFiringPower > 0.5 )
		{
			// Shots over halfway suffer an increased speed to the accuracy power, making accurate shots harder
			float flAdjustedPower = (m_pPowerBar->m_flFiringPower - 0.5) * 3.0;
			m_flAccuracySpeed += (m_pPowerBar->m_flFiringPower * flAdjustedPower);
		}

		m_pPowerBar->m_flPower = max( m_pPowerBar->m_flPower - ( m_flAccuracySpeed * gpGlobals->curtimeDelta), -0.25f);
		if ( m_pPowerBar->m_flPower <= -0.25 )
		{
			// Hit Min, fire mortar
			m_pPowerBar->m_flFiringAccuracy = m_pPowerBar->m_flPower;
			m_iFiringState = MORTAR_IDLE;

			FireMortar();
			m_flNextClick = gpGlobals->curtime + 0.25;
		}
		break;
	default:
		break;
	}

	// Draw the rotate icon if the player's rotating the mortar
	if ( m_bRotating )
	{
		vgui::Panel *pParent = GetClientModeNormal()->GetViewport();
		int parentWidth, parentHeight;
		pParent->GetSize(parentWidth, parentHeight);
		int iWidth = 64;
		int iHeight = 64;
		int iX = (parentWidth - iWidth) / 2;
		int iY = (parentHeight - 216);

		IMesh* pMesh = materials->GetDynamicMesh( true, NULL, NULL, m_pRotateIcon );

		CMeshBuilder meshBuilder;
		meshBuilder.Begin( pMesh, MATERIAL_QUADS, 1 );

		meshBuilder.Color3f( 1.0, 1.0, 1.0 );
		meshBuilder.TexCoord2f( 0,0,0 );
		meshBuilder.Position3f( iX,iY,0 );
		meshBuilder.AdvanceVertex();

		meshBuilder.Color3f( 1.0, 1.0, 1.0 );
		meshBuilder.TexCoord2f( 0,1,0 );
		meshBuilder.Position3f( iX+iWidth, iY, 0 );
		meshBuilder.AdvanceVertex();

		meshBuilder.Color3f( 1.0, 1.0, 1.0 );
		meshBuilder.TexCoord2f( 0,1,1 );
		meshBuilder.Position3f( iX+iWidth, iY+iHeight, 0 );
		meshBuilder.AdvanceVertex();

		meshBuilder.Color3f( 1.0, 1.0, 1.0 );
		meshBuilder.TexCoord2f( 0,0,1 );
		meshBuilder.Position3f( iX, iY+iHeight, 0 );
		meshBuilder.AdvanceVertex();

		meshBuilder.End();
		pMesh->Draw();
	}

	// Update the ground line if it's moved
	if ( !m_bCarried && (m_flPrevMortarYaw != m_flMortarYaw ) && 
		gpGlobals->curtime > m_flLastGroundlineUpdateTime + g_CVMortarGroundLineUpdateInterval.GetFloat() )
	{
		// Create the Ground line start & end points
		Vector vecForward;
		AngleVectors( QAngle( 0, m_flMortarYaw, 0 ), &vecForward );
		Vector vecStart = m_vecMortarOrigin + (vecForward * MORTAR_RANGE_MIN);

		float flRange = MORTAR_RANGE_MAX_INITIAL;
		if ( pPlayer->HasNamedTechnology( "mortar_range" ) )
			flRange = MORTAR_RANGE_MAX_UPGRADED;
		Vector vecEnd = m_vecMortarOrigin + (vecForward * flRange);

		m_pDarkLine->SetParameters( m_vecMortarOrigin, vecStart, Vector( 0.1,0.1,0.1 ), Vector( 0.1,0.1,0.1 ), 0.5, 22 );
		m_pGroundLine->SetParameters( vecStart, vecEnd, Vector(0,1,0), Vector(1,0,0), 0.5, 22 );

		m_flPrevMortarYaw = m_flMortarYaw;

		m_flLastGroundlineUpdateTime = gpGlobals->curtime;
	}
}