From dfb01714c74136ce9e890b186b070af5e5df7770 Mon Sep 17 00:00:00 2001 From: Chris Danford Date: Mon, 17 Mar 2008 08:57:43 +0000 Subject: [PATCH] revamp StreamDisplay: remove zbuffer tricks, replace with Sprite pills that can be used to make arbitrary shapes --- .../LifeMeterBar frame (doubleres).png | Bin 10301 -> 10305 bytes .../default/Graphics/LifeMeterBar hot.png | Bin 264 -> 0 bytes .../default/Graphics/LifeMeterBar normal.png | Bin 302 -> 0 bytes .../Graphics/LifeMeterBar passing.redir | 1 - .../default/Graphics/StreamDisplay hot.png | Bin 0 -> 2863 bytes .../default/Graphics/StreamDisplay normal.png | Bin 0 -> 2873 bytes .../Graphics/StreamDisplay passing.redir | 1 + stepmania/src/LifeMeterBar.cpp | 15 +- stepmania/src/LifeMeterBar.h | 2 - stepmania/src/LifeMeterTime.cpp | 20 +- stepmania/src/StreamDisplay.cpp | 246 +++++------------- stepmania/src/StreamDisplay.h | 56 ++-- 12 files changed, 88 insertions(+), 253 deletions(-) delete mode 100644 stepmania/Themes/default/Graphics/LifeMeterBar hot.png delete mode 100644 stepmania/Themes/default/Graphics/LifeMeterBar normal.png delete mode 100644 stepmania/Themes/default/Graphics/LifeMeterBar passing.redir create mode 100644 stepmania/Themes/default/Graphics/StreamDisplay hot.png create mode 100644 stepmania/Themes/default/Graphics/StreamDisplay normal.png create mode 100644 stepmania/Themes/default/Graphics/StreamDisplay passing.redir diff --git a/stepmania/Themes/default/Graphics/LifeMeterBar frame (doubleres).png b/stepmania/Themes/default/Graphics/LifeMeterBar frame (doubleres).png index ae9b785edb305150bd3c18216cf523cb6cd79290..62a6faa08e3f6a34e7b56e0292d0b28bd7cbdb0d 100644 GIT binary patch delta 7588 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 delta 7584 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 XLn8tVj2>IsAnExtraStage(); RString sExtra = bExtra ? "extra " : ""; - m_pStream->Load( - METER_WIDTH, - METER_HEIGHT, - NUM_STRIPS, - NUM_CHAMBERS, - THEME->GetPathG(sType,sExtra+"normal"), - THEME->GetPathG(sType,sExtra+"hot"), - THEME->GetPathG(sType,sExtra+"passing"), - THEME->GetMetricA(sType,"StreamNormalOnCommand"), - THEME->GetMetricA(sType,"StreamHotOnCommand"), - THEME->GetMetricA(sType,"StreamPassingOnCommand") - ); + m_pStream->Load( bExtra ? "StreamDisplayExtra" : "StreamDisplay" ); this->AddChild( m_pStream ); m_sprFrame.Load( THEME->GetPathG(sType,sExtra+"frame") ); diff --git a/stepmania/src/LifeMeterBar.h b/stepmania/src/LifeMeterBar.h index ca9558b046..e632dbe463 100644 --- a/stepmania/src/LifeMeterBar.h +++ b/stepmania/src/LifeMeterBar.h @@ -37,8 +37,6 @@ private: ThemeMetric METER_WIDTH; ThemeMetric METER_HEIGHT; ThemeMetric DANGER_THRESHOLD; - ThemeMetric NUM_CHAMBERS; - ThemeMetric NUM_STRIPS; ThemeMetric INITIAL_VALUE; ThemeMetric MIN_STAY_ALIVE; diff --git a/stepmania/src/LifeMeterTime.cpp b/stepmania/src/LifeMeterTime.cpp index 5803803765..b3fbbcd479 100644 --- a/stepmania/src/LifeMeterTime.cpp +++ b/stepmania/src/LifeMeterTime.cpp @@ -16,8 +16,6 @@ const float FULL_LIFE_SECONDS = 1.5f*60; static ThemeMetric METER_WIDTH ("LifeMeterTime","MeterWidth"); static ThemeMetric METER_HEIGHT ("LifeMeterTime","MeterHeight"); static ThemeMetric DANGER_THRESHOLD ("LifeMeterTime","DangerThreshold"); -static ThemeMetric NUM_CHAMBERS ("LifeMeterTime","NumChambers"); -static ThemeMetric NUM_STRIPS ("LifeMeterTime","NumStrips"); static ThemeMetric INITIAL_VALUE ("LifeMeterTime","InitialValue"); static const float g_fTimeMeterSecondsChangeInit[] = @@ -73,21 +71,10 @@ void LifeMeterTime::Load( const PlayerState *pPlayerState, PlayerStageStats *pPl m_pStream = new StreamDisplay; bool bExtra = GAMESTATE->IsAnExtraStage(); - RString sExtra = bExtra ? "extra " : ""; - m_pStream->Load( - METER_WIDTH, - METER_HEIGHT, - NUM_STRIPS, - NUM_CHAMBERS, - THEME->GetPathG(sType,sExtra+"normal"), - THEME->GetPathG(sType,sExtra+"hot"), - THEME->GetPathG(sType,sExtra+"passing"), - THEME->GetMetricA(sType,"StreamNormalOnCommand"), - THEME->GetMetricA(sType,"StreamHotOnCommand"), - THEME->GetMetricA(sType,"StreamPassingOnCommand") - ); + m_pStream->Load( bExtra ? "StreamDisplayExtra" : "StreamDisplay" ); this->AddChild( m_pStream ); + RString sExtra = bExtra ? "extra " : ""; m_sprFrame.Load( THEME->GetPathG(sType,sExtra+"frame") ); m_sprFrame->SetName( "Frame" ); this->AddChild( m_sprFrame ); @@ -181,7 +168,7 @@ void LifeMeterTime::SendLifeChangedMessage( float fOldLife, TapNoteScore tns, Ho bool LifeMeterTime::IsInDanger() const { - return m_pStream->GetTrailingLifePercent() < DANGER_THRESHOLD; + return m_pStream->GetPercent() < DANGER_THRESHOLD; } bool LifeMeterTime::IsHot() const @@ -203,7 +190,6 @@ void LifeMeterTime::Update( float fDeltaTime ) LifeMeter::Update( fDeltaTime ); - // TODO m_pStream->SetPercent( GetLife() ); m_pStream->SetPassingAlpha( 0 ); m_pStream->SetHotAlpha( 0 ); diff --git a/stepmania/src/StreamDisplay.cpp b/stepmania/src/StreamDisplay.cpp index c0fc2882cd..4dc5e9e9e8 100644 --- a/stepmania/src/StreamDisplay.cpp +++ b/stepmania/src/StreamDisplay.cpp @@ -3,11 +3,18 @@ #include "GameState.h" #include #include "RageDisplay.h" +#include "ThemeManager.h" +#include "EnumHelper.h" + +static const char *StreamTypeNames[] = { + "Normal", + "Passing", + "Hot", +}; +XToString( StreamType ); StreamDisplay::StreamDisplay() { - m_iNumStrips = 1; - m_iNumChambers = 1; m_fPercent = 0; m_fTrailingPercent = 0; m_fVelocity = 0; @@ -15,63 +22,38 @@ StreamDisplay::StreamDisplay() m_fHotAlpha = 0; } -void StreamDisplay::Load( - float fMeterWidth, - float fMeterHeight, - int iNumStrips, - int iNumChambers, - const RString &sNormalPath, - const RString &sHotPath, - const RString &sPassingPath, - const apActorCommands &acNormalOnCommand, - const apActorCommands &acHotOnCommand, - const apActorCommands &acPassingOnCommand - ) +void StreamDisplay::Load( const RString &_sMetricsGroup ) { - m_size.x = fMeterWidth; - m_size.y = fMeterHeight; + // XXX + RString sMetricsGroup = "StreamDisplay"; - m_iNumStrips = iNumStrips; - m_iNumChambers = iNumChambers; + m_transformPill.SetFromReference( THEME->GetMetricR(sMetricsGroup,"PillTransformFunction") ); - m_quadMask.SetBlendMode( BLEND_NO_EFFECT ); - m_quadMask.SetZWrite( true ); - m_quadMask.ZoomToWidth( fMeterWidth ); - m_quadMask.ZoomToHeight( fMeterHeight ); + float fTextureCoordScaleX = THEME->GetMetricF(sMetricsGroup,"TextureCoordScaleX"); + int iNumPills = THEME->GetMetricF(sMetricsGroup,"NumPills"); + FOREACH_ENUM( StreamType, st ) + { + ASSERT( m_vpSprPill[st].empty() ); - RString sGraphicPath; - RageTextureID ID; - ID.bStretch = true; + for( int i=0; iLoad( THEME->GetPathG(sMetricsGroup,StreamTypeToString(st)) ); + m_vpSprPill[st].push_back( pSpr ); + m_transformPill.PositionItem( pSpr, -1, i, iNumPills ); - float fStripWidthInPercent = 1.0f/m_iNumStrips; + float f = 1 / fTextureCoordScaleX; + pSpr->SetCustomTextureRect( RectF(f*i,0,f*(i+1),1) ); - ID.filename = sNormalPath; - m_sprStreamNormal.Load( ID ); - m_sprStreamNormal.SetZTestMode( ZTEST_WRITE_ON_PASS ); - m_sprStreamNormal.SetHorizAlign( align_right ); - m_sprStreamNormal.ZoomToHeight( fMeterHeight ); - m_sprStreamNormal.ZoomToWidth( fMeterWidth*fStripWidthInPercent ); - m_sprStreamNormal.RunCommands( acNormalOnCommand ); - - ID.filename = sHotPath; - m_sprStreamHot.Load( ID ); - m_sprStreamHot.SetZTestMode( ZTEST_WRITE_ON_PASS ); - m_sprStreamHot.SetHorizAlign( align_right ); - m_sprStreamHot.ZoomToHeight( fMeterHeight ); - m_sprStreamHot.ZoomToWidth( fMeterWidth*fStripWidthInPercent ); - m_sprStreamHot.RunCommands( acHotOnCommand ); - - ID.filename = sPassingPath; - m_sprStreamPassing.Load( ID ); - m_sprStreamPassing.SetZTestMode( ZTEST_WRITE_ON_PASS ); - m_sprStreamPassing.SetHorizAlign( align_right ); - m_sprStreamPassing.ZoomToHeight( fMeterHeight ); - m_sprStreamPassing.ZoomToWidth( fMeterWidth*fStripWidthInPercent ); - m_sprStreamPassing.RunCommands( acPassingOnCommand ); + this->AddChild( pSpr ); + } + } } void StreamDisplay::Update( float fDeltaSecs ) { + ActorFrame::Update( fDeltaSecs ); + // HACK: Tweaking these values is very difficulty. Update the // "physics" many times so that the spring motion appears faster for( int i=0; i<10; i++ ) @@ -104,35 +86,39 @@ void StreamDisplay::Update( float fDeltaSecs ) // Don't clamp life percentage a little outside the visible range so // that the clamp doesn't dampen the "jiggle" of the meter. CLAMP( m_fTrailingPercent, -0.1f, 1.1f ); -} -void StreamDisplay::DrawPrimitives() -{ - DrawMask( m_fTrailingPercent ); // this is the "right endcap" to the life - - const float fChamberWidthInPercent = 1.0f/m_iNumChambers; - float fPercentBetweenStrips = 1.0f/m_iNumStrips; - // round down so that the chamber overflows align - if( m_iNumChambers > 10 ) - fPercentBetweenStrips = QuantizeDown( fPercentBetweenStrips, fChamberWidthInPercent ); - - - if( m_iNumChambers > 3 ) - fPercentBetweenStrips -= 2*fChamberWidthInPercent; - - float fPercentOffset = fmodf( GAMESTATE->m_fSongBeat/4+1000, fPercentBetweenStrips ); - ASSERT( fPercentOffset >= 0 && fPercentOffset <= fPercentBetweenStrips ); - - // "+fPercentBetweenStrips" so that the whole area is overdrawn 2x - for( float f=fPercentOffset+1+fPercentBetweenStrips; f>=0; f-=fPercentBetweenStrips ) + // set crop of pills + const float fPillWidthPercent = 1.0f / m_vpSprPill[0].size(); + FOREACH_ENUM( StreamType, st ) { - DrawMask( f ); - DrawStrip( f ); - } + for( int i=0; i<(int)m_vpSprPill[st].size(); i++ ) + { + Sprite *pSpr = m_vpSprPill[st][i]; + float fPercentFilledThisPill = SCALE( m_fTrailingPercent, fPillWidthPercent*i, fPillWidthPercent*(i+1), 0.0f, 1.0f ); + CLAMP( fPercentFilledThisPill, 0.0f, 1.0f ); + pSpr->SetCropRight( 1.0f - fPercentFilledThisPill ); + // XXX scale by current song speed + pSpr->SetTexCoordVelocity(-1,0); - // Don't leave the Zbuffer in a messy state for arrows and dancing characters - DISPLAY->ClearZBuffer(); + // Optimization: Don't draw pills that are covered up + switch( st ) + { + DEFAULT_FAIL( st ); + case StreamType_Normal: + pSpr->SetVisible( m_fPassingAlpha < 1 || m_fHotAlpha < 1 ); + pSpr->SetDiffuseAlpha( 1 ); + break; + case StreamType_Passing: + pSpr->SetDiffuseAlpha( m_fPassingAlpha ); + pSpr->SetVisible( m_fHotAlpha < 1 ); + break; + case StreamType_Hot: + pSpr->SetDiffuseAlpha( m_fHotAlpha ); + break; + } + } + } } void StreamDisplay::SetPercent( float fPercent ) @@ -154,118 +140,6 @@ void StreamDisplay::SetPercent( float fPercent ) m_fPercent = fPercent; } -void StreamDisplay::SetPassingAlpha( float fPassingAlpha ) -{ - m_fPassingAlpha = fPassingAlpha; -} - -void StreamDisplay::SetHotAlpha( float fHotAlpha ) -{ - m_fHotAlpha = fHotAlpha; -} - -void StreamDisplay::GetChamberIndexAndOverflow( float fPercent, int& iChamberOut, float& fChamberOverflowPercentOut ) -{ - iChamberOut = (int)(fPercent*m_iNumChambers); - fChamberOverflowPercentOut = fPercent*m_iNumChambers - iChamberOut; -} - -float StreamDisplay::GetChamberLeftPercent( int iChamber ) -{ - return (iChamber+0) / (float)m_iNumChambers; -} - -float StreamDisplay::GetChamberRightPercent( int iChamber ) -{ - return (iChamber+1) / (float)m_iNumChambers; -} - -float StreamDisplay::GetRightEdgePercent( int iChamber, float fChamberOverflowPercent ) -{ - if( (iChamber%2) == 0 ) - return (iChamber+fChamberOverflowPercent) / (float)m_iNumChambers; - else - return (iChamber+1) / (float)m_iNumChambers; -} - -float StreamDisplay::GetHeightPercent( int iChamber, float fChamberOverflowPercent ) -{ - if( (iChamber%2) == 1 ) - return 1-fChamberOverflowPercent; - else - return 0; -} - -void StreamDisplay::DrawStrip( float fRightEdgePercent ) -{ - float fMeterWidth = this->GetUnzoomedWidth(); - m_sprStreamNormal.SetX( -fMeterWidth/2 + fMeterWidth*fRightEdgePercent ); - m_sprStreamPassing.SetX( -fMeterWidth/2 + fMeterWidth*fRightEdgePercent ); - m_sprStreamHot.SetX( -fMeterWidth/2 + fMeterWidth*fRightEdgePercent ); - - const float fMeterLeftEdgePixels = SCALE( 0.0f, 0.0f, 1.0f, -fMeterWidth/2, +fMeterWidth/2 ); - const float fMeterRightEdgePixels = SCALE( 1.0f, 0.0f, 1.0f, -fMeterWidth/2, +fMeterWidth/2 ); - - const float fStreamRightEdgePixels = SCALE( fRightEdgePercent, 0.0f, 1.0f, -fMeterWidth/2, +fMeterWidth/2 ); - const float fStreamLeftEdgePixels = fStreamRightEdgePixels - m_sprStreamNormal.GetZoomedWidth(); - - const float fLeftOverhangPixels = max( 0, fMeterLeftEdgePixels - fStreamLeftEdgePixels ); - const float fStreamCropLeftPercent = SCALE( fLeftOverhangPixels, 0.0f, m_sprStreamNormal.GetZoomedWidth(), 0.0f, 1.0f ); - - const float fRightOverhangPixels = max( 0, fStreamRightEdgePixels - fMeterRightEdgePixels ); - const float fStreamCropRightPercent = SCALE( fRightOverhangPixels, 0.0f, m_sprStreamNormal.GetZoomedWidth(), 0.0f, 1.0f ); - - m_sprStreamNormal.SetCropLeft( fStreamCropLeftPercent ); - m_sprStreamPassing.SetCropLeft( fStreamCropLeftPercent ); - m_sprStreamHot.SetCropLeft( fStreamCropLeftPercent ); - - m_sprStreamNormal.SetCropRight( fStreamCropRightPercent ); - m_sprStreamPassing.SetCropRight(fStreamCropRightPercent ); - m_sprStreamHot.SetCropRight( fStreamCropRightPercent ); - - - float fOrigPassingAlpha = m_sprStreamPassing.GetDiffuse().a; - float fOrigHotAlpha = m_sprStreamHot.GetDiffuse().a; - - m_sprStreamPassing.SetDiffuseAlpha( m_fPassingAlpha * fOrigPassingAlpha ); - m_sprStreamHot.SetDiffuseAlpha( m_fHotAlpha * fOrigHotAlpha ); - - if( m_fPassingAlpha < 1 && m_fHotAlpha < 1) - m_sprStreamNormal.Draw(); - if( m_fHotAlpha < 1) - m_sprStreamPassing.Draw(); - m_sprStreamHot.Draw(); - - m_sprStreamPassing.SetDiffuseAlpha( fOrigPassingAlpha ); - m_sprStreamHot.SetDiffuseAlpha( fOrigHotAlpha ); -} - -void StreamDisplay::DrawMask( float fPercent ) -{ - int iChamber; - float fChamberOverflowPercent; - GetChamberIndexAndOverflow( fPercent, iChamber, fChamberOverflowPercent ); - - // draw mask for vertical chambers - float fHeightPercent = GetHeightPercent( iChamber, fChamberOverflowPercent ); - float fChamberLeftPercent = GetChamberLeftPercent( iChamber ); - float fChamberRightPercent = GetChamberRightPercent( iChamber ); - m_quadMask.SetCropLeft( fChamberLeftPercent ); - m_quadMask.SetCropRight( 1-fChamberRightPercent ); - m_quadMask.SetCropTop( 0 ); - m_quadMask.SetCropBottom( 1-fHeightPercent ); - m_quadMask.Draw(); - - // draw mask for horizontal chambers - float fRightPercent = GetRightEdgePercent( iChamber, fChamberOverflowPercent ); - m_quadMask.SetCropLeft( fRightPercent ); - m_quadMask.SetCropRight( 0 ); - m_quadMask.SetCropTop( 0 ); - m_quadMask.SetCropBottom( 0 ); - - m_quadMask.Draw(); -} - /* * (c) 2003-2004 Chris Danford diff --git a/stepmania/src/StreamDisplay.h b/stepmania/src/StreamDisplay.h index 2ce8c644f8..c3b5205f26 100644 --- a/stepmania/src/StreamDisplay.h +++ b/stepmania/src/StreamDisplay.h @@ -1,57 +1,47 @@ #ifndef StreamDisplay_H #define StreamDisplay_H +#include "ActorFrame.h" #include "Sprite.h" #include "Quad.h" +#include "LuaExpressionTransform.h" -class StreamDisplay : public Actor +enum StreamType +{ + StreamType_Normal, + StreamType_Passing, + StreamType_Hot, + NUM_StreamType, +}; + + +class StreamDisplay : public ActorFrame { public: StreamDisplay(); virtual void Update( float fDeltaSecs ); - void Load( - float fMeterWidth, - float fMeterHeight, - int iNumStrips, - int iNumChambers, - const RString &sNormalPath, - const RString &sHotPath, - const RString &sPassingPath, - const apActorCommands &acNormalOnCommand, - const apActorCommands &acHotOnCommand, - const apActorCommands &acPassingOnCommand - ); + void Load( const RString &sMetricsGroup ); - void DrawPrimitives(); void SetPercent( float fPercent ); - void SetPassingAlpha( float fPassingAlpha ); - void SetHotAlpha( float fHotAlpha ); + void SetPassingAlpha( float fPassingAlpha ) { m_fPassingAlpha = fPassingAlpha; } + void SetHotAlpha( float fHotAlpha ) { m_fHotAlpha = fHotAlpha; } - float GetTrailingLifePercent() { return m_fTrailingPercent; } + float GetPercent() { return m_fPercent; } private: - Sprite m_sprStreamNormal; - Sprite m_sprStreamHot; - Sprite m_sprStreamPassing; - Quad m_quadMask; + vector m_vpSprPill[NUM_StreamType]; - int m_iNumStrips; - int m_iNumChambers; - float m_fPercent; - float m_fTrailingPercent; // this approaches m_fPercent - float m_fVelocity; // of m_fTrailingPercent + LuaExpressionTransform m_transformPill; // params: self,positionIndex,itemIndex,numItems + + float m_fPercent; // percent filled + float m_fTrailingPercent; // this approaches m_fPercent, use this value to draw + float m_fVelocity; // velocity of m_fTrailingPercent + float m_fPassingAlpha; float m_fHotAlpha; - void GetChamberIndexAndOverflow( float fPercent, int& iChamberOut, float& fChamberOverflowPercentOut ); - float GetChamberLeftPercent( int iChamber ); - float GetChamberRightPercent( int iChamber ); - float GetRightEdgePercent( int iChamber, float fChamberOverflowPercent ); - float GetHeightPercent( int iChamber, float fChamberOverflowPercent ); - void DrawStrip( float fRightEdgePercent ); - void DrawMask( float fPercent ); }; #endif