#include "global.h" /* ----------------------------------------------------------------------------- Class: GrooveRadar Desc: See header. Copyright (c) 2001-2002 by the person(s) listed below. All rights reserved. Chris Danford ----------------------------------------------------------------------------- */ #include "GrooveRadar.h" #include "RageUtil.h" #include "PrefsManager.h" #include "RageBitmapTexture.h" #include "GameConstantsAndTypes.h" #include "ThemeManager.h" #include "Steps.h" #include "RageDisplay.h" #include "RageMath.h" #define LABEL_OFFSET_X( i ) THEME->GetMetricF("GrooveRadar",ssprintf("Label%dOffsetX",i+1)) #define LABEL_OFFSET_Y( i ) THEME->GetMetricF("GrooveRadar",ssprintf("Label%dOffsetY",i+1)) #define LABEL_ON_COMMAND THEME->GetMetric ("GrooveRadar","LabelOnCommand") #define LABEL_ON_DELAY THEME->GetMetricF("GrooveRadar","LabelOnDelay") #define LABEL_ON_COMMAND_POST_DELAY THEME->GetMetric ("GrooveRadar","LabelOnCommandPostDelay") #define DISABLE_RADAR THEME->GetMetricI("GrooveRadar","DisableRadar") float RADAR_VALUE_ROTATION( int iValueIndex ) { return PI/2 + PI*2 / 5.0f * iValueIndex; } const float RADAR_EDGE_WIDTH = 2; static const int NUM_SHOWN_RADAR_CATEGORIES = 5; GrooveRadar::GrooveRadar() { this->AddChild( &m_GrooveRadarValueMap ); for( int c=0; cGetPathToG("GrooveRadar labels 1x5") ); m_sprRadarLabels[c].StopAnimating(); m_sprRadarLabels[c].SetState( c ); m_sprRadarLabels[c].SetXY( LABEL_OFFSET_X(c), LABEL_OFFSET_Y(c) ); this->AddChild( &m_sprRadarLabels[c] ); } } void GrooveRadar::TweenOnScreen() { for( int c=0; cGetPathToG("GrooveRadar base") ); this->AddChild( &m_sprRadarBase ); FOREACH_PlayerNumber( p ) { m_bValuesVisible[p] = false; m_PercentTowardNew[p] = 0; for( int c=0; cGetRadarValues()[c]; } if( m_bValuesVisible[pn] == false ) // the values WERE invisible m_PercentTowardNew[pn] = 1; else m_PercentTowardNew[pn] = 0; m_bValuesVisible[pn] = true; } else // pSteps == NULL { m_bValuesVisible[pn] = false; } } void GrooveRadar::GrooveRadarValueMap::Update( float fDeltaTime ) { ActorFrame::Update( fDeltaTime ); if(DISABLE_RADAR != 1) { FOREACH_PlayerNumber( p ) { m_PercentTowardNew[p] = min( m_PercentTowardNew[p]+4.0f*fDeltaTime, 1 ); } } } void GrooveRadar::GrooveRadarValueMap::DrawPrimitives() { ActorFrame::DrawPrimitives(); if(DISABLE_RADAR == 1) // if they disabled the radar return; // get out of here... // draw radar filling const float fRadius = m_sprRadarBase.GetZoomedHeight()/2.0f*1.1f; DISPLAY->ClearAllTextures(); DISPLAY->SetTextureModeModulate(); RageSpriteVertex v[12]; // needed to draw 5 fan primitives and 10 strip primitives FOREACH_PlayerNumber( p ) { if( !m_bValuesVisible[p] ) continue; // // use a fan to draw the volume // RageColor color = PlayerToColor( (PlayerNumber)p ); color.a = 0.5f; v[0].p = RageVector3( 0, 0, 0 ); v[0].c = color; int i; for( i=0; iDrawFan( v, NUM_SHOWN_RADAR_CATEGORIES+2 ); // // use a line loop to draw the thick line // for( i=0; i<=NUM_SHOWN_RADAR_CATEGORIES; i++ ) { const int c = i%NUM_SHOWN_RADAR_CATEGORIES; const float fDistFromCenter = ( m_fValuesOld[p][c] * (1-m_PercentTowardNew[p]) + m_fValuesNew[p][c] * m_PercentTowardNew[p] + 0.07f ) * fRadius; const float fRotation = RADAR_VALUE_ROTATION(i); const float fX = cosf(fRotation) * fDistFromCenter; const float fY = -sinf(fRotation) * fDistFromCenter; v[i].p = RageVector3( fX, fY, 0 ); v[i].c = PlayerToColor( (PlayerNumber)p ); } // TODO: Add this back in. -Chris // switch( PREFSMAN->m_iPolygonRadar ) // { // case 0: DISPLAY->DrawLoop_LinesAndPoints( v, NUM_SHOWN_RADAR_CATEGORIES, RADAR_EDGE_WIDTH ); break; // case 1: DISPLAY->DrawLoop_Polys( v, NUM_SHOWN_RADAR_CATEGORIES, RADAR_EDGE_WIDTH ); break; // default: // case -1: DISPLAY->DrawLineStrip( v, NUM_SHOWN_RADAR_CATEGORIES+1, RADAR_EDGE_WIDTH ); // break; // } } } void GrooveRadar::GrooveRadarValueMap::TweenOnScreen() { SetZoom( 0.5f ); SetRotationZ( 720 ); BeginTweening( 0.6f ); SetZoom( 1 ); SetRotationZ( 0 ); } void GrooveRadar::GrooveRadarValueMap::TweenOffScreen() { BeginTweening( 0.6f ); SetRotationZ( 180*4 ); SetZoom( 0 ); }