Files
itgmania212121/stepmania/src/GrooveRadar.cpp
T

225 lines
7.0 KiB
C++
Raw Normal View History

2003-02-16 04:01:45 +00:00
#include "global.h"
2002-03-31 07:55:25 +00:00
#include "GrooveRadar.h"
#include "RageUtil.h"
2002-07-23 01:41:40 +00:00
#include "PrefsManager.h"
2002-05-01 19:14:55 +00:00
#include "GameConstantsAndTypes.h"
#include "ThemeManager.h"
2003-08-03 00:13:55 +00:00
#include "Steps.h"
#include "RageDisplay.h"
2003-07-04 18:03:20 +00:00
#include "RageMath.h"
#include "ThemeMetric.h"
2005-02-12 21:03:39 +00:00
#include "CommonMetrics.h"
2002-09-03 06:33:08 +00:00
#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))
2005-01-26 11:21:43 +00:00
static const ThemeMetric<apActorCommands> LABEL_ON_COMMAND ("GrooveRadar","LabelOnCommand");
static const ThemeMetric<float> LABEL_ON_DELAY ("GrooveRadar","LabelOnDelay");
2005-01-26 11:21:43 +00:00
static const ThemeMetric<apActorCommands> LABEL_ON_COMMAND_POST_DELAY ("GrooveRadar","LabelOnCommandPostDelay");
2002-09-03 06:33:08 +00:00
float RADAR_VALUE_ROTATION( int iValueIndex ) { return PI/2 + PI*2 / 5.0f * iValueIndex; }
2002-04-28 20:42:32 +00:00
const float RADAR_EDGE_WIDTH = 2;
static const int NUM_SHOWN_RADAR_CATEGORIES = 5;
2002-07-27 19:29:51 +00:00
2002-03-31 07:55:25 +00:00
GrooveRadar::GrooveRadar()
{
this->AddChild( &m_GrooveRadarValueMap );
2002-04-16 17:31:00 +00:00
for( int c=0; c<NUM_SHOWN_RADAR_CATEGORIES; c++ )
2002-04-28 20:42:32 +00:00
{
2005-02-06 03:32:53 +00:00
m_sprRadarLabels[c].Load( THEME->GetPathG("GrooveRadar","labels 1x5") );
2002-04-28 20:42:32 +00:00
m_sprRadarLabels[c].StopAnimating();
m_sprRadarLabels[c].SetState( c );
2002-09-03 06:33:08 +00:00
m_sprRadarLabels[c].SetXY( LABEL_OFFSET_X(c), LABEL_OFFSET_Y(c) );
this->AddChild( &m_sprRadarLabels[c] );
2002-04-28 20:42:32 +00:00
}
2002-05-19 01:59:48 +00:00
}
void GrooveRadar::TweenOnScreen()
{
for( int c=0; c<NUM_SHOWN_RADAR_CATEGORIES; c++ )
2002-05-19 01:59:48 +00:00
{
2003-07-20 01:47:50 +00:00
m_sprRadarLabels[c].SetX( LABEL_OFFSET_X(c) );
2004-12-03 05:19:46 +00:00
m_sprRadarLabels[c].RunCommands( LABEL_ON_COMMAND );
2003-07-20 01:47:50 +00:00
m_sprRadarLabels[c].BeginTweening( LABEL_ON_DELAY*c ); // sleep
2004-12-03 05:19:46 +00:00
m_sprRadarLabels[c].RunCommands( LABEL_ON_COMMAND_POST_DELAY );
2002-05-19 01:59:48 +00:00
}
m_GrooveRadarValueMap.TweenOnScreen();
}
void GrooveRadar::TweenOffScreen()
{
for( int c=0; c<NUM_SHOWN_RADAR_CATEGORIES; c++ )
2002-05-19 01:59:48 +00:00
{
2002-07-28 20:28:37 +00:00
m_sprRadarLabels[c].StopTweening();
2002-05-19 01:59:48 +00:00
m_sprRadarLabels[c].BeginTweening( 0.2f );
/* Make sure we undo glow. We do this at the end of TweenIn,
* but we might tween off before we complete tweening in, and
* the glow can remain. */
2003-04-12 06:16:12 +00:00
m_sprRadarLabels[c].SetGlow( RageColor(1,1,1,0) );
m_sprRadarLabels[c].SetDiffuse( RageColor(1,1,1,0) );
2002-05-19 01:59:48 +00:00
}
m_GrooveRadarValueMap.TweenOffScreen();
}
GrooveRadar::GrooveRadarValueMap::GrooveRadarValueMap()
{
2005-02-06 03:32:53 +00:00
m_sprRadarBase.Load( THEME->GetPathG("GrooveRadar","base") );
this->AddChild( &m_sprRadarBase );
2002-04-16 17:31:00 +00:00
FOREACH_PlayerNumber( p )
2002-04-16 17:31:00 +00:00
{
m_bValuesVisible[p] = false;
m_PercentTowardNew[p] = 0;
for( int c=0; c<NUM_SHOWN_RADAR_CATEGORIES; c++ )
2002-04-16 17:31:00 +00:00
{
m_fValuesNew[p][c] = 0;
m_fValuesOld[p][c] = 0;
}
}
2002-03-31 07:55:25 +00:00
}
2004-05-29 04:50:47 +00:00
void GrooveRadar::GrooveRadarValueMap::SetFromSteps( PlayerNumber pn, Steps* pSteps ) // NULL means no song
2002-03-31 07:55:25 +00:00
{
2004-05-24 03:41:39 +00:00
if( pSteps != NULL )
2002-04-16 17:31:00 +00:00
{
for( int c=0; c<NUM_SHOWN_RADAR_CATEGORIES; c++ )
2002-04-16 17:31:00 +00:00
{
const float fValueCurrent = m_fValuesOld[pn][c] * (1-m_PercentTowardNew[pn]) + m_fValuesNew[pn][c] * m_PercentTowardNew[pn];
m_fValuesOld[pn][c] = fValueCurrent;
2004-05-24 03:41:39 +00:00
m_fValuesNew[pn][c] = pSteps->GetRadarValues()[c];
}
2002-04-16 17:31:00 +00:00
2004-09-06 21:28:56 +00:00
if( !m_bValuesVisible[pn] ) // the values WERE invisible
m_PercentTowardNew[pn] = 1;
2002-04-16 17:31:00 +00:00
else
m_PercentTowardNew[pn] = 0;
2002-04-16 17:31:00 +00:00
m_bValuesVisible[pn] = true;
2002-04-16 17:31:00 +00:00
}
2004-05-24 03:41:39 +00:00
else // pSteps == NULL
2002-04-16 17:31:00 +00:00
{
m_bValuesVisible[pn] = false;
2002-04-16 17:31:00 +00:00
}
}
2002-05-19 01:59:48 +00:00
void GrooveRadar::GrooveRadarValueMap::Update( float fDeltaTime )
2002-04-16 17:31:00 +00:00
{
ActorFrame::Update( fDeltaTime );
2004-12-06 06:43:27 +00:00
FOREACH_PlayerNumber( p )
2002-04-16 17:31:00 +00:00
{
2004-12-06 06:43:27 +00:00
m_PercentTowardNew[p] = min( m_PercentTowardNew[p]+4.0f*fDeltaTime, 1 );
2002-04-16 17:31:00 +00:00
}
}
2002-05-19 01:59:48 +00:00
void GrooveRadar::GrooveRadarValueMap::DrawPrimitives()
2002-04-16 17:31:00 +00:00
{
2002-05-19 01:59:48 +00:00
ActorFrame::DrawPrimitives();
2002-04-16 17:31:00 +00:00
// draw radar filling
2002-07-03 21:27:26 +00:00
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
2002-04-16 17:31:00 +00:00
FOREACH_PlayerNumber( p )
2002-04-16 17:31:00 +00:00
{
if( !m_bValuesVisible[p] )
continue;
//
// use a fan to draw the volume
//
2005-02-12 21:03:39 +00:00
RageColor color = PLAYER_COLOR.GetValue(p);
2002-04-16 17:31:00 +00:00
color.a = 0.5f;
v[0].p = RageVector3( 0, 0, 0 );
v[0].c = color;
2002-04-16 17:31:00 +00:00
2004-09-21 07:53:39 +00:00
for( int i=0; i<NUM_SHOWN_RADAR_CATEGORIES+1; i++ ) // do one extra to close the fan
2002-04-16 17:31:00 +00:00
{
const int c = i%NUM_SHOWN_RADAR_CATEGORIES;
2002-04-16 17:31:00 +00:00
const float fDistFromCenter =
2002-07-03 21:27:26 +00:00
( m_fValuesOld[p][c] * (1-m_PercentTowardNew[p]) + m_fValuesNew[p][c] * m_PercentTowardNew[p] + 0.07f ) * fRadius;
2002-04-28 20:42:32 +00:00
const float fRotation = RADAR_VALUE_ROTATION(i);
const float fX = RageFastCos(fRotation) * fDistFromCenter;
const float fY = -RageFastSin(fRotation) * fDistFromCenter;
2002-04-16 17:31:00 +00:00
v[1+i].p = RageVector3( fX, fY, 0 );
v[1+i].c = v[0].c;
2002-04-16 17:31:00 +00:00
}
DISPLAY->DrawFan( v, NUM_SHOWN_RADAR_CATEGORIES+2 );
2002-04-16 17:31:00 +00:00
//
// use a line loop to draw the thick line
2002-04-16 17:31:00 +00:00
//
2004-09-21 07:53:39 +00:00
for( int i=0; i<=NUM_SHOWN_RADAR_CATEGORIES; i++ )
2002-04-16 17:31:00 +00:00
{
const int c = i%NUM_SHOWN_RADAR_CATEGORIES;
2002-04-16 17:31:00 +00:00
const float fDistFromCenter =
2002-07-03 21:27:26 +00:00
( m_fValuesOld[p][c] * (1-m_PercentTowardNew[p]) + m_fValuesNew[p][c] * m_PercentTowardNew[p] + 0.07f ) * fRadius;
2002-04-28 20:42:32 +00:00
const float fRotation = RADAR_VALUE_ROTATION(i);
const float fX = RageFastCos(fRotation) * fDistFromCenter;
const float fY = -RageFastSin(fRotation) * fDistFromCenter;
2002-04-16 17:31:00 +00:00
2002-11-14 09:15:05 +00:00
v[i].p = RageVector3( fX, fY, 0 );
2005-02-12 21:03:39 +00:00
v[i].c = PLAYER_COLOR.GetValue( p );
2002-04-16 17:31:00 +00:00
}
2003-05-22 05:28:37 +00:00
// 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;
2003-05-22 05:28:37 +00:00
// default:
// case -1:
DISPLAY->DrawLineStrip( v, NUM_SHOWN_RADAR_CATEGORIES+1, RADAR_EDGE_WIDTH );
2003-05-22 05:28:37 +00:00
// break;
// }
2002-04-16 17:31:00 +00:00
}
2002-03-31 07:55:25 +00:00
}
2002-04-16 17:31:00 +00:00
2002-05-19 01:59:48 +00:00
void GrooveRadar::GrooveRadarValueMap::TweenOnScreen()
2002-04-16 17:31:00 +00:00
{
SetZoom( 0.5f );
2003-04-02 06:02:55 +00:00
SetRotationZ( 720 );
2002-04-16 17:31:00 +00:00
BeginTweening( 0.6f );
2003-04-12 06:16:12 +00:00
SetZoom( 1 );
SetRotationZ( 0 );
2002-04-16 17:31:00 +00:00
}
2002-05-19 01:59:48 +00:00
void GrooveRadar::GrooveRadarValueMap::TweenOffScreen()
2002-04-16 17:31:00 +00:00
{
BeginTweening( 0.6f );
2003-04-12 06:16:12 +00:00
SetRotationZ( 180*4 );
SetZoom( 0 );
2002-04-16 17:31:00 +00:00
}
2004-06-07 21:14:03 +00:00
/*
* (c) 2001-2004 Chris Danford
* All rights reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the
* "Software"), to deal in the Software without restriction, including
* without limitation the rights to use, copy, modify, merge, publish,
* distribute, and/or sell copies of the Software, and to permit persons to
* whom the Software is furnished to do so, provided that the above
* copyright notice(s) and this permission notice appear in all copies of
* the Software and that both the above copyright notice(s) and this
* permission notice appear in supporting documentation.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF
* THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS
* INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT
* OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
* OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
* OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
* PERFORMANCE OF THIS SOFTWARE.
*/