Add crop property to Actor - currently only used in Sprite

This commit is contained in:
Chris Danford
2003-06-20 23:04:11 +00:00
parent c0b41e3c4f
commit aac9739fac
16 changed files with 198 additions and 160 deletions
+17 -4
View File
@@ -661,10 +661,12 @@ void Actor::AddRotationR( float rot )
RageQuatMultiply( &DestTweenState().quat, DestTweenState().quat, RageQuatFromR(rot) ); RageQuatMultiply( &DestTweenState().quat, DestTweenState().quat, RageQuatFromR(rot) );
} }
void Actor::Command( CString sCommandString ) float Actor::Command( CString sCommandString )
{ {
// OPTIMIZATION OPPORTUNITY: sCommandString could be parsed more efficiently. // OPTIMIZATION OPPORTUNITY: sCommandString could be parsed more efficiently.
sCommandString.MakeLower();
CStringArray asCommands; CStringArray asCommands;
split( sCommandString, ";", asCommands, true ); split( sCommandString, ";", asCommands, true );
@@ -685,13 +687,12 @@ void Actor::Command( CString sCommandString )
#define bParam(i) (iParam(i)!=0) #define bParam(i) (iParam(i)!=0)
CString& sName = asTokens[0]; CString& sName = asTokens[0];
sName.MakeLower();
if( sName.size() == 0 ) if( sName.size() == 0 )
continue; continue;
// Commands that go in the tweening queue: // Commands that go in the tweening queue:
if ( sName=="sleep" ) BeginTweening( fParam(1), TWEEN_LINEAR ); if ( sName=="sleep" ) { BeginTweening( fParam(1), TWEEN_LINEAR ); BeginTweening( 0, TWEEN_LINEAR ); }
else if( sName=="linear" ) BeginTweening( fParam(1), TWEEN_LINEAR ); else if( sName=="linear" ) BeginTweening( fParam(1), TWEEN_LINEAR );
else if( sName=="accelerate" ) BeginTweening( fParam(1), TWEEN_ACCELERATE ); else if( sName=="accelerate" ) BeginTweening( fParam(1), TWEEN_ACCELERATE );
else if( sName=="decelerate" ) BeginTweening( fParam(1), TWEEN_DECELERATE ); else if( sName=="decelerate" ) BeginTweening( fParam(1), TWEEN_DECELERATE );
@@ -711,6 +712,10 @@ void Actor::Command( CString sCommandString )
// else if( sName=="zoomz" ) SetZoomZ( fParam(1) ); // else if( sName=="zoomz" ) SetZoomZ( fParam(1) );
else if( sName=="zoomtowidth" ) ZoomToWidth( fParam(1) ); else if( sName=="zoomtowidth" ) ZoomToWidth( fParam(1) );
else if( sName=="zoomtoheight" ) ZoomToHeight( fParam(1) ); else if( sName=="zoomtoheight" ) ZoomToHeight( fParam(1) );
else if( sName=="cropleft" ) SetCropLeft( fParam(1) );
else if( sName=="croptop" ) SetCropTop( fParam(1) );
else if( sName=="cropright" ) SetCropRight( fParam(1) );
else if( sName=="cropbottom" ) SetCropBottom( fParam(1) );
else if( sName=="diffuse" ) SetDiffuse( RageColor(fParam(1),fParam(2),fParam(3),fParam(4)) ); else if( sName=="diffuse" ) SetDiffuse( RageColor(fParam(1),fParam(2),fParam(3),fParam(4)) );
else if( sName=="diffuseleftedge" ) SetDiffuseLeftEdge( RageColor(fParam(1),fParam(2),fParam(3),fParam(4)) ); else if( sName=="diffuseleftedge" ) SetDiffuseLeftEdge( RageColor(fParam(1),fParam(2),fParam(3),fParam(4)) );
else if( sName=="diffuserightedge" ) SetDiffuseRightEdge( RageColor(fParam(1),fParam(2),fParam(3),fParam(4)) ); else if( sName=="diffuserightedge" ) SetDiffuseRightEdge( RageColor(fParam(1),fParam(2),fParam(3),fParam(4)) );
@@ -777,6 +782,8 @@ void Actor::Command( CString sCommandString )
#endif #endif
} }
} }
return GetTweenTimeLeft();
} }
float Actor::GetCommandLength( CString command ) float Actor::GetCommandLength( CString command )
@@ -837,6 +844,7 @@ void Actor::TweenState::Init()
rotation = RageVector3( 0, 0, 0 ); rotation = RageVector3( 0, 0, 0 );
quat = RageVector4( 0, 0, 0, 1 ); quat = RageVector4( 0, 0, 0, 1 );
scale = RageVector3( 1, 1, 1 ); scale = RageVector3( 1, 1, 1 );
crop = RectF( 0,0,0,0 );
for(int i=0; i<4; i++) for(int i=0; i<4; i++)
diffuse[i] = RageColor( 1, 1, 1, 1 ); diffuse[i] = RageColor( 1, 1, 1, 1 );
glow = RageColor( 1, 1, 1, 0 ); glow = RageColor( 1, 1, 1, 0 );
@@ -847,9 +855,14 @@ void Actor::TweenState::MakeWeightedAverage( TweenState& average_out, const Twee
{ {
average_out.pos = ts1.pos + (ts2.pos - ts1.pos )*fPercentBetween; average_out.pos = ts1.pos + (ts2.pos - ts1.pos )*fPercentBetween;
average_out.scale = ts1.scale + (ts2.scale - ts1.scale )*fPercentBetween; average_out.scale = ts1.scale + (ts2.scale - ts1.scale )*fPercentBetween;
average_out.rotation = ts1.rotation+ (ts2.rotation - ts1.rotation)*fPercentBetween; average_out.rotation = ts1.rotation + (ts2.rotation - ts1.rotation)*fPercentBetween;
RageQuatSlerp(&average_out.quat, ts1.quat, ts2.quat, fPercentBetween); RageQuatSlerp(&average_out.quat, ts1.quat, ts2.quat, fPercentBetween);
average_out.crop.left = ts1.crop.left + (ts2.crop.left - ts1.crop.left )*fPercentBetween;
average_out.crop.top = ts1.crop.top + (ts2.crop.top - ts1.crop.top )*fPercentBetween;
average_out.crop.right = ts1.crop.right + (ts2.crop.right - ts1.crop.right )*fPercentBetween;
average_out.crop.bottom = ts1.crop.bottom+ (ts2.crop.bottom - ts1.crop.bottom)*fPercentBetween;
for(int i=0; i<4; i++) for(int i=0; i<4; i++)
average_out.diffuse[i] = ts1.diffuse[i]+ (ts2.diffuse[i] - ts1.diffuse[i])*fPercentBetween; average_out.diffuse[i] = ts1.diffuse[i]+ (ts2.diffuse[i] - ts1.diffuse[i])*fPercentBetween;
average_out.glow = ts1.glow + (ts2.glow - ts1.glow )*fPercentBetween; average_out.glow = ts1.glow + (ts2.glow - ts1.glow )*fPercentBetween;
+12 -1
View File
@@ -43,6 +43,7 @@ public:
RageVector3 rotation; RageVector3 rotation;
RageVector4 quat; RageVector4 quat;
RageVector3 scale; RageVector3 scale;
RectF crop; // 0 = no cropping, 1 = fully cropped
RageColor diffuse[4]; RageColor diffuse[4];
RageColor glow; RageColor glow;
GlowMode glowmode; GlowMode glowmode;
@@ -119,6 +120,16 @@ public:
virtual void AddRotationP( float rot ); virtual void AddRotationP( float rot );
virtual void AddRotationR( float rot ); virtual void AddRotationR( float rot );
virtual float GetCropLeft() { return DestTweenState().crop.left; }
virtual float GetCropTop() { return DestTweenState().crop.top; }
virtual float GetCropRight() { return DestTweenState().crop.right;}
virtual float GetCropBottom() { return DestTweenState().crop.bottom;}
virtual void SetCropLeft( float percent ) { DestTweenState().crop.left = percent; }
virtual void SetCropTop( float percent ) { DestTweenState().crop.top = percent; }
virtual void SetCropRight( float percent ) { DestTweenState().crop.right = percent;}
virtual void SetCropBottom( float percent ){ DestTweenState().crop.bottom = percent;}
virtual void SetGlobalDiffuseColor( RageColor c ); virtual void SetGlobalDiffuseColor( RageColor c );
virtual void SetGlobalX( float x ); virtual void SetGlobalX( float x );
@@ -245,7 +256,7 @@ public:
void FadeOn( float fSleepSeconds, CString sFadeString, float fFadeSeconds ) { Fade(fSleepSeconds,sFadeString,fFadeSeconds,false); }; void FadeOn( float fSleepSeconds, CString sFadeString, float fFadeSeconds ) { Fade(fSleepSeconds,sFadeString,fFadeSeconds,false); };
void FadeOff( float fSleepSeconds, CString sFadeString, float fFadeSeconds ) { Fade(fSleepSeconds,sFadeString,fFadeSeconds,true); }; void FadeOff( float fSleepSeconds, CString sFadeString, float fFadeSeconds ) { Fade(fSleepSeconds,sFadeString,fFadeSeconds,true); };
void Command( CString sCommandString ); float Command( CString sCommandString ); // return length in seconds to execute command
static float GetCommandLength( CString command ); static float GetCommandLength( CString command );
virtual void SetState( int iNewState ) {}; virtual void SetState( int iNewState ) {};
+17 -14
View File
@@ -14,42 +14,45 @@
#include "Actor.h" #include "Actor.h"
#define SET_XY( actor ) UtilSetXY( actor, m_sName ); #define SET_XY( actor ) UtilSetXY( actor, m_sName )
#define ON_COMMAND( actor ) UtilOnCommand( actor, m_sName ); #define ON_COMMAND( actor ) UtilOnCommand( actor, m_sName )
#define OFF_COMMAND( actor ) UtilOffCommand( actor, m_sName ); #define OFF_COMMAND( actor ) UtilOffCommand( actor, m_sName )
#define SET_XY_AND_ON_COMMAND( actor ) UtilSetXYAndOnCommand( actor, m_sName ); #define SET_XY_AND_ON_COMMAND( actor ) UtilSetXYAndOnCommand( actor, m_sName )
#define COMMAND( actor, command_name ) UtilCommand( actor, m_sName, command_name ); #define COMMAND( actor, command_name ) UtilCommand( actor, m_sName, command_name )
inline void UtilSetXY( Actor& actor, CString sClassName ) inline void UtilSetXY( Actor& actor, CString sClassName )
{ {
ASSERT( !actor.GetName().empty() );
actor.SetXY( THEME->GetMetricF(sClassName,actor.GetName()+"X"), THEME->GetMetricF(sClassName,actor.GetName()+"Y") ); actor.SetXY( THEME->GetMetricF(sClassName,actor.GetName()+"X"), THEME->GetMetricF(sClassName,actor.GetName()+"Y") );
} }
inline void UtilOnCommand( Actor& actor, CString sClassName ) inline float UtilOnCommand( Actor& actor, CString sClassName )
{ {
actor.Command( THEME->GetMetric(sClassName,actor.GetName()+"OnCommand") ); ASSERT( !actor.GetName().empty() );
return actor.Command( THEME->GetMetric(sClassName,actor.GetName()+"OnCommand") );
} }
inline void UtilCommand( Actor& actor, CString sClassName, CString sCommandName ) inline float UtilCommand( Actor& actor, CString sClassName, CString sCommandName )
{ {
actor.Command( THEME->GetMetric(sClassName,actor.GetName()+sCommandName+"Command") ); ASSERT( !actor.GetName().empty() );
return actor.Command( THEME->GetMetric(sClassName,actor.GetName()+sCommandName+"Command") );
} }
inline void UtilOffCommand( Actor& actor, CString sClassName ) inline float UtilOffCommand( Actor& actor, CString sClassName )
{ {
// HACK: It's very often that we command things to TweenOffScreen // HACK: It's very often that we command things to TweenOffScreen
// that we aren't drawing. We know that an Actor is not being // that we aren't drawing. We know that an Actor is not being
// used if it's name is blank. So, do nothing on Actors with a blank name. // used if it's name is blank. So, do nothing on Actors with a blank name.
if( actor.GetName().empty() ) if( actor.GetName().empty() )
return; return 0;
actor.Command( THEME->GetMetric(sClassName,actor.GetName()+"OffCommand") ); return actor.Command( THEME->GetMetric(sClassName,actor.GetName()+"OffCommand") );
} }
inline void UtilSetXYAndOnCommand( Actor& actor, CString sClassName ) inline float UtilSetXYAndOnCommand( Actor& actor, CString sClassName )
{ {
UtilSetXY( actor, sClassName ); UtilSetXY( actor, sClassName );
UtilOnCommand( actor, sClassName ); return UtilOnCommand( actor, sClassName );
} }
#endif #endif
+8 -11
View File
@@ -212,7 +212,7 @@ void BGAnimationLayer::LoadFromAniLayerFile( CString sPath )
ID.bStretch = true; ID.bStretch = true;
m_Sprites.back()->LoadBG( ID ); m_Sprites.back()->LoadBG( ID );
m_Sprites.back()->StretchTo( RectI(SCREEN_LEFT,SCREEN_TOP,SCREEN_RIGHT,SCREEN_BOTTOM) ); m_Sprites.back()->StretchTo( RectI(SCREEN_LEFT,SCREEN_TOP,SCREEN_RIGHT,SCREEN_BOTTOM) );
m_Sprites.back()->SetCustomTextureRect( RectF(0,0,1,1) ); m_Sprites.back()->SetCustomTextureCoords( RectF(0,0,1,1) );
switch( effect ) switch( effect )
{ {
@@ -546,7 +546,7 @@ void BGAnimationLayer::LoadFromIni( CString sAniDir, CString sLayer )
ID.bStretch = true; ID.bStretch = true;
m_Sprites.back()->LoadBG( ID ); m_Sprites.back()->LoadBG( ID );
m_Sprites.back()->StretchTo( RectI(SCREEN_LEFT,SCREEN_TOP,SCREEN_RIGHT,SCREEN_BOTTOM) ); m_Sprites.back()->StretchTo( RectI(SCREEN_LEFT,SCREEN_TOP,SCREEN_RIGHT,SCREEN_BOTTOM) );
m_Sprites.back()->SetCustomTextureRect( RectF(0,0,1,1) ); m_Sprites.back()->SetCustomTextureCoords( RectF(0,0,1,1) );
} }
break; break;
case TYPE_PARTICLES: case TYPE_PARTICLES:
@@ -638,16 +638,13 @@ void BGAnimationLayer::Update( float fDeltaTime )
case TYPE_STRETCH: case TYPE_STRETCH:
for( i=0; i<m_Sprites.size(); i++ ) for( i=0; i<m_Sprites.size(); i++ )
{ {
float fTexCoords[8]; RectF texCoords = *m_Sprites[i]->GetActiveTextureCoords();
m_Sprites[i]->GetActiveTexCoords( fTexCoords ); texCoords.left += fDeltaTime*m_fStretchTexCoordVelocityX;
texCoords.right += fDeltaTime*m_fStretchTexCoordVelocityX;
texCoords.top += fDeltaTime*m_fStretchTexCoordVelocityY;
texCoords.bottom+= fDeltaTime*m_fStretchTexCoordVelocityY;
for( int j=0; j<8; j+=2 ) m_Sprites[i]->SetCustomTextureCoords( texCoords );
{
fTexCoords[j ] += fDeltaTime*m_fStretchTexCoordVelocityX;
fTexCoords[j+1] += fDeltaTime*m_fStretchTexCoordVelocityY;
}
m_Sprites[i]->SetCustomTextureCoords( fTexCoords );
} }
break; break;
/* case EFFECT_PARTICLES_SPIRAL_OUT: /* case EFFECT_PARTICLES_SPIRAL_OUT:
+4 -9
View File
@@ -57,16 +57,11 @@ void Banner::Update( float fDeltaTime )
m_fPercentScrolling += fDeltaTime/2; m_fPercentScrolling += fDeltaTime/2;
m_fPercentScrolling -= (int)m_fPercentScrolling; m_fPercentScrolling -= (int)m_fPercentScrolling;
const RectF *pTextureRect = m_pTexture->GetTextureCoordRect(0); RectF texCoords = *m_pTexture->GetTextureCoordRect(0);
texCoords.left += m_fPercentScrolling;
texCoords.right += m_fPercentScrolling;
float fTexCoords[8] = Sprite::SetCustomTextureCoords( texCoords );
{
0+m_fPercentScrolling, pTextureRect->top, // top left
0+m_fPercentScrolling, pTextureRect->bottom, // bottom left
1+m_fPercentScrolling, pTextureRect->bottom, // bottom right
1+m_fPercentScrolling, pTextureRect->top, // top right
};
Sprite::SetCustomTextureCoords( fTexCoords );
} }
} }
+26 -24
View File
@@ -56,28 +56,30 @@ void CroppedSprite::CropToSize( float fWidth, float fHeight )
float fOriginalX = GetX(); float fOriginalX = GetX();
float fOriginalY = GetY(); float fOriginalY = GetY();
if( IsDiagonalBanner(iSourceWidth, iSourceHeight) ) // this is a SSR/DWI CroppedSprite // TODO: Add this back in
{ // if( IsDiagonalBanner(iSourceWidth, iSourceHeight) ) // this is a SSR/DWI CroppedSprite
float fCustomImageCoords[8] = { // {
0.02f, 0.78f, // top left // float fCustomImageCoords[8] = {
0.22f, 0.98f, // bottom left // 0.02f, 0.78f, // top left
0.98f, 0.22f, // bottom right // 0.22f, 0.98f, // bottom left
0.78f, 0.02f, // top right // 0.98f, 0.22f, // bottom right
}; // 0.78f, 0.02f, // top right
Sprite::SetCustomImageCoords( fCustomImageCoords ); // };
// Sprite::SetCustomImageCoords( fCustomImageCoords );
if( m_fCropWidth != -1 && m_fCropHeight != -1) //
m_size = RageVector2( m_fCropWidth, m_fCropHeight ); // if( m_fCropWidth != -1 && m_fCropHeight != -1)
else // m_size = RageVector2( m_fCropWidth, m_fCropHeight );
{ // else
/* If no crop size is set, then we're only being used to crop diagonal // {
* banners so they look like regular ones. We don't actually care about // /* If no crop size is set, then we're only being used to crop diagonal
* the size of the image, only that it has an aspect ratio of 4:1. */ // * banners so they look like regular ones. We don't actually care about
m_size = RageVector2(256, 64); // * the size of the image, only that it has an aspect ratio of 4:1. */
} // m_size = RageVector2(256, 64);
SetZoom( 1 ); // }
} // SetZoom( 1 );
else if( m_pTexture->GetID().filename.find( "(was rotated)" ) != m_pTexture->GetID().filename.npos && // }
// else
if( m_pTexture->GetID().filename.find( "(was rotated)" ) != m_pTexture->GetID().filename.npos &&
m_fCropWidth != -1 && m_fCropHeight != -1 ) m_fCropWidth != -1 && m_fCropHeight != -1 )
{ {
/* Dumb hack. Normally, we crop all sprites except for diagonal banners, /* Dumb hack. Normally, we crop all sprites except for diagonal banners,
@@ -115,7 +117,7 @@ void CroppedSprite::CropToSize( float fWidth, float fHeight )
0, 0,
1 - fPercentageToCutOffEachSide, 1 - fPercentageToCutOffEachSide,
1 ); 1 );
SetCustomImageRect( fCustomImageCoords ); SetCustomImageCoords( fCustomImageCoords );
} }
else // crop Y else // crop Y
{ {
@@ -128,7 +130,7 @@ void CroppedSprite::CropToSize( float fWidth, float fHeight )
fPercentageToCutOffEachSide, fPercentageToCutOffEachSide,
1, 1,
1 - fPercentageToCutOffEachSide ); 1 - fPercentageToCutOffEachSide );
SetCustomImageRect( fCustomImageCoords ); SetCustomImageCoords( fCustomImageCoords );
} }
m_size = RageVector2( m_fCropWidth, m_fCropHeight ); m_size = RageVector2( m_fCropWidth, m_fCropHeight );
SetZoom( 1 ); SetZoom( 1 );
+1 -1
View File
@@ -71,7 +71,7 @@ void GradeDisplay::Update( float fDeltaTime )
m_frectCurTexCoords.right = m_frectStartTexCoords.right*(1-fPercentIntoScrolling) + m_frectDestTexCoords.right*fPercentIntoScrolling; m_frectCurTexCoords.right = m_frectStartTexCoords.right*(1-fPercentIntoScrolling) + m_frectDestTexCoords.right*fPercentIntoScrolling;
m_frectCurTexCoords.bottom = m_frectStartTexCoords.bottom*(1-fPercentIntoScrolling) + m_frectDestTexCoords.bottom*fPercentIntoScrolling; m_frectCurTexCoords.bottom = m_frectStartTexCoords.bottom*(1-fPercentIntoScrolling) + m_frectDestTexCoords.bottom*fPercentIntoScrolling;
this->SetCustomTextureRect( m_frectCurTexCoords ); this->SetCustomTextureCoords( m_frectCurTexCoords );
} }
} }
+2 -2
View File
@@ -182,8 +182,8 @@ public:
1-fPercentCroppedFromRight, 1-fPercentCroppedFromRight,
1); 1);
m_sprStreamNormal.SetCustomTextureRect( frectCustomTexCoords ); m_sprStreamNormal.SetCustomTextureCoords( frectCustomTexCoords );
m_sprStreamHot.SetCustomTextureRect( frectCustomTexCoords ); m_sprStreamHot.SetCustomTextureCoords( frectCustomTexCoords );
m_sprStreamHot.SetDiffuse( RageColor(1,1,1,m_fHotAlpha) ); m_sprStreamHot.SetDiffuse( RageColor(1,1,1,m_fHotAlpha) );
+3 -3
View File
@@ -422,7 +422,7 @@ void NoteDisplay::DrawHold( const HoldNote& hn, const bool bActive, const float
// draw manually in small segments // draw manually in small segments
RageVertex *v = &queue[0]; RageVertex *v = &queue[0];
RageTexture* pTexture = pBottomCap->GetTexture(); RageTexture* pTexture = pBottomCap->GetTexture();
const RectF *pRect = pBottomCap->GetCurrentTextureCoordRect(); const RectF *pRect = pBottomCap->GetCurrentTextureCoords();
DISPLAY->SetTexture( pTexture ); DISPLAY->SetTexture( pTexture );
DISPLAY->SetBlendMode( BLEND_NORMAL ); DISPLAY->SetBlendMode( BLEND_NORMAL );
DISPLAY->SetBackfaceCull( false ); DISPLAY->SetBackfaceCull( false );
@@ -489,7 +489,7 @@ void NoteDisplay::DrawHold( const HoldNote& hn, const bool bActive, const float
// draw manually in small segments // draw manually in small segments
RageVertex *v = &queue[0]; RageVertex *v = &queue[0];
RageTexture* pTexture = pSprBody->GetTexture(); RageTexture* pTexture = pSprBody->GetTexture();
const RectF *pRect = pSprBody->GetCurrentTextureCoordRect(); const RectF *pRect = pSprBody->GetCurrentTextureCoords();
DISPLAY->SetTexture( pTexture ); DISPLAY->SetTexture( pTexture );
DISPLAY->SetBlendMode( BLEND_NORMAL ); DISPLAY->SetBlendMode( BLEND_NORMAL );
DISPLAY->SetBackfaceCull( false ); DISPLAY->SetBackfaceCull( false );
@@ -569,7 +569,7 @@ void NoteDisplay::DrawHold( const HoldNote& hn, const bool bActive, const float
// draw manually in small segments // draw manually in small segments
RageVertex *v = &queue[0]; RageVertex *v = &queue[0];
RageTexture* pTexture = pSprTopCap->GetTexture(); RageTexture* pTexture = pSprTopCap->GetTexture();
const RectF *pRect = pSprTopCap->GetCurrentTextureCoordRect(); const RectF *pRect = pSprTopCap->GetCurrentTextureCoords();
DISPLAY->SetTexture( pTexture ); DISPLAY->SetTexture( pTexture );
DISPLAY->SetBlendMode( BLEND_NORMAL ); DISPLAY->SetBlendMode( BLEND_NORMAL );
DISPLAY->SetBackfaceCull( false ); DISPLAY->SetBackfaceCull( false );
+1 -1
View File
@@ -141,7 +141,7 @@ void NoteField::DrawBeatBar( const float fBeat )
m_sprBars.SetY( fYPos ); m_sprBars.SetY( fYPos );
m_sprBars.SetDiffuse( RageColor(1,1,1,fAlpha) ); m_sprBars.SetDiffuse( RageColor(1,1,1,fAlpha) );
m_sprBars.SetState( iState ); m_sprBars.SetState( iState );
m_sprBars.SetCustomTextureRect( RectF(0,SCALE(iState,0.f,4.f,0.f,1.f), fWidth/fFrameWidth, SCALE(iState+1,0.f,4.f,0.f,1.f)) ); m_sprBars.SetCustomTextureCoords( RectF(0,SCALE(iState,0.f,4.f,0.f,1.f), fWidth/fFrameWidth, SCALE(iState+1,0.f,4.f,0.f,1.f)) );
m_sprBars.SetZoomX( fWidth/m_sprBars.GetUnzoomedWidth() ); m_sprBars.SetZoomX( fWidth/m_sprBars.GetUnzoomedWidth() );
m_sprBars.Draw(); m_sprBars.Draw();
+2
View File
@@ -294,6 +294,7 @@ void Screen::ClearMessageQueue( const ScreenMessage SM )
#include "ScreenRaveOptions.h" #include "ScreenRaveOptions.h"
#include "ScreenSelectMode.h" #include "ScreenSelectMode.h"
#include "ScreenBackgroundOptions.h" #include "ScreenBackgroundOptions.h"
#include "ScreenSelectMaster.h"
Screen* Screen::Create( CString sClassName ) Screen* Screen::Create( CString sClassName )
{ {
@@ -359,6 +360,7 @@ Screen* Screen::Create( CString sClassName )
IF_RETURN( ScreenSelectCharacter ); IF_RETURN( ScreenSelectCharacter );
IF_RETURN( ScreenRaveOptions ); IF_RETURN( ScreenRaveOptions );
IF_RETURN( ScreenBackgroundOptions ); IF_RETURN( ScreenBackgroundOptions );
IF_RETURN( ScreenSelectMaster );
RageException::Throw( "Invalid Screen class name '%s'", sClassName.c_str() ); RageException::Throw( "Invalid Screen class name '%s'", sClassName.c_str() );
} }
+1 -1
View File
@@ -19,7 +19,7 @@
// Derived classes must send this when done // Derived classes must send this when done
const ScreenMessage SM_AllDoneChoosing = (ScreenMessage)(SM_User+123); // unique const ScreenMessage SM_AllDoneChoosing = (ScreenMessage)(SM_User+123); // unique
#define MAX_CHOICES 30 #define MAX_CHOICES 10
class ScreenSelect : public Screen class ScreenSelect : public Screen
{ {
+4 -7
View File
@@ -53,13 +53,10 @@ static const ScreenMessage SM_AllowOptionsMenuRepeat = ScreenMessage(SM_User+1);
* on Y by flipping texture coordinates. */ * on Y by flipping texture coordinates. */
static void FlipSpriteHorizontally(Sprite &s) static void FlipSpriteHorizontally(Sprite &s)
{ {
float Coords[8]; RectF texCoords = *s.GetCurrentTextureCoords();
s.GetCurrentTextureCoords(Coords); swap( texCoords.left, texCoords.right );
swap(Coords[0], Coords[6]); /* top left X <-> top right X */ swap( texCoords.top, texCoords.bottom );
swap(Coords[1], Coords[7]); /* top left Y <-> top right Y */ s.SetCustomTextureCoords( texCoords );
swap(Coords[2], Coords[4]); /* bottom left X <-> bottom left X */
swap(Coords[3], Coords[5]); /* bottom left Y <-> bottom left Y */
s.SetCustomTextureCoords(Coords);
} }
ScreenSelectMusic::ScreenSelectMusic() : Screen("ScreenSelectMusic") ScreenSelectMusic::ScreenSelectMusic() : Screen("ScreenSelectMusic")
+53 -50
View File
@@ -219,6 +219,9 @@ void Sprite::Update( float fDeltaTime )
} }
} }
/*
No longer needed. -Chris
static void TexCoordsFromArray(RageVertex *v, const float *f) static void TexCoordsFromArray(RageVertex *v, const float *f)
{ {
v[0].t = RageVector2( f[0], f[1] ); // top left v[0].t = RageVector2( f[0], f[1] ); // top left
@@ -234,12 +237,18 @@ void TexCoordArrayFromRect(float fImageCoords[8], const RectF &rect)
fImageCoords[4] = rect.right; fImageCoords[5] = rect.bottom; // bottom right fImageCoords[4] = rect.right; fImageCoords[5] = rect.bottom; // bottom right
fImageCoords[6] = rect.right; fImageCoords[7] = rect.top; // top right fImageCoords[6] = rect.right; fImageCoords[7] = rect.top; // top right
} }
*/
void Sprite::DrawPrimitives() void Sprite::DrawPrimitives()
{ {
if( m_pTexture == NULL && !m_bDrawIfTextureNull ) if( m_pTexture == NULL && !m_bDrawIfTextureNull )
return; return;
// bail if cropped all the way
if( m_temp.crop.left + m_temp.crop.right > 1 ||
m_temp.crop.top + m_temp.crop.bottom > 1 )
return;
if( m_pTexture && m_pTexture->IsAMovie() && m_pTexture->IsPlaying() ) if( m_pTexture && m_pTexture->IsAMovie() && m_pTexture->IsPlaying() )
SDL_Delay( PREFSMAN->m_iMovieDecodeMS ); // let the movie decode a frame SDL_Delay( PREFSMAN->m_iMovieDecodeMS ); // let the movie decode a frame
@@ -263,11 +272,19 @@ void Sprite::DrawPrimitives()
} }
RectF croppedQuadVerticies = quadVerticies;
#define IF_CROP_POS(side,opp_side) if(m_temp.crop.side>0) croppedQuadVerticies.side = SCALE( m_temp.crop.side, 0.f, 1.f, quadVerticies.side, quadVerticies.opp_side );
IF_CROP_POS( left, right );
IF_CROP_POS( top, bottom );
IF_CROP_POS( right, left );
IF_CROP_POS( bottom, top );
static RageVertex v[4]; static RageVertex v[4];
v[0].p = RageVector3( quadVerticies.left, quadVerticies.top, 0 ); // top left v[0].p = RageVector3( croppedQuadVerticies.left, croppedQuadVerticies.top, 0 ); // top left
v[1].p = RageVector3( quadVerticies.left, quadVerticies.bottom, 0 ); // bottom left v[1].p = RageVector3( croppedQuadVerticies.left, croppedQuadVerticies.bottom, 0 ); // bottom left
v[2].p = RageVector3( quadVerticies.right, quadVerticies.bottom, 0 ); // bottom right v[2].p = RageVector3( croppedQuadVerticies.right, croppedQuadVerticies.bottom, 0 ); // bottom right
v[3].p = RageVector3( quadVerticies.right, quadVerticies.top, 0 ); // top right v[3].p = RageVector3( croppedQuadVerticies.right, croppedQuadVerticies.top, 0 ); // top right
DISPLAY->SetTexture( m_pTexture ); DISPLAY->SetTexture( m_pTexture );
@@ -277,9 +294,21 @@ void Sprite::DrawPrimitives()
if( m_pTexture ) if( m_pTexture )
{ {
float TexCoords[8]; const RectF texCoords = *(m_bUsingCustomTexCoords ?
GetActiveTexCoords(TexCoords); GetCustomTextureCoords() :
TexCoordsFromArray(v, TexCoords); GetCurrentTextureCoords());
RectF croppedTexCoords = texCoords;
#define IF_CROP_TEX(side,opp_side) if(m_temp.crop.side>0) croppedTexCoords.side = SCALE( m_temp.crop.side, 0.f, 1.f, texCoords.side, texCoords.opp_side );
IF_CROP_TEX( left, right );
IF_CROP_TEX( top, bottom );
IF_CROP_TEX( right, left );
IF_CROP_TEX( bottom, top );
v[0].t = RageVector2( croppedTexCoords.left, croppedTexCoords.top ); // top left
v[1].t = RageVector2( croppedTexCoords.left, croppedTexCoords.bottom ); // bottom left
v[2].t = RageVector2( croppedTexCoords.right, croppedTexCoords.bottom ); // bottom right
v[3].t = RageVector2( croppedTexCoords.right, croppedTexCoords.top ); // top right
} }
DISPLAY->SetTextureModeModulate(); DISPLAY->SetTextureModeModulate();
@@ -337,70 +366,44 @@ void Sprite::SetState( int iNewState )
m_fSecsIntoState = 0.0; m_fSecsIntoState = 0.0;
} }
void Sprite::SetCustomTextureRect( const RectF &new_texcoord_frect ) void Sprite::SetCustomTextureCoords( const RectF &new_texcoord_frect )
{ {
m_bUsingCustomTexCoords = true; m_bUsingCustomTexCoords = true;
m_bTextureWrapping = true; m_bTextureWrapping = true;
TexCoordArrayFromRect(m_CustomTexCoords, new_texcoord_frect); m_CustomTexCoords = new_texcoord_frect;
} }
void Sprite::SetCustomTextureCoords( float fTexCoords[8] ) // order: top left, bottom left, bottom right, top right const RectF* Sprite::GetCustomTextureCoords() const
{ {
m_bUsingCustomTexCoords = true; return &m_CustomTexCoords;
m_bTextureWrapping = true;
for( int i=0; i<8; i++ )
m_CustomTexCoords[i] = fTexCoords[i];
} }
void Sprite::GetCustomTextureCoords( float fTexCoordsOut[8] ) const // order: top left, bottom left, bottom right, top right void Sprite::SetCustomImageCoords( const RectF &newImageCoords )
{
for( int i=0; i<8; i++ )
fTexCoordsOut[i] = m_CustomTexCoords[i];
}
void Sprite::SetCustomImageRect( RectF rectImageCoords )
{ {
// Convert to a rectangle in texture coordinate space. // Convert to a rectangle in texture coordinate space.
rectImageCoords.left *= m_pTexture->GetImageWidth() / (float)m_pTexture->GetTextureWidth(); RectF texCoords;
rectImageCoords.right *= m_pTexture->GetImageWidth() / (float)m_pTexture->GetTextureWidth(); texCoords.left = newImageCoords.left * m_pTexture->GetImageWidth() / (float)m_pTexture->GetTextureWidth();
rectImageCoords.top *= m_pTexture->GetImageHeight() / (float)m_pTexture->GetTextureHeight(); texCoords.right = newImageCoords.right * m_pTexture->GetImageWidth() / (float)m_pTexture->GetTextureWidth();
rectImageCoords.bottom *= m_pTexture->GetImageHeight() / (float)m_pTexture->GetTextureHeight(); texCoords.top = newImageCoords.top * m_pTexture->GetImageHeight()/ (float)m_pTexture->GetTextureHeight();
texCoords.bottom = newImageCoords.bottom * m_pTexture->GetImageHeight()/ (float)m_pTexture->GetTextureHeight();
SetCustomTextureRect( rectImageCoords ); SetCustomTextureCoords( texCoords );
} }
void Sprite::SetCustomImageCoords( float fImageCoords[8] ) // order: top left, bottom left, bottom right, top right const RectF *Sprite::GetCurrentTextureCoords() const
{
// convert image coords to texture coords in place
for( int i=0; i<8; i+=2 )
{
fImageCoords[i+0] *= m_pTexture->GetImageWidth() / (float)m_pTexture->GetTextureWidth();
fImageCoords[i+1] *= m_pTexture->GetImageHeight() / (float)m_pTexture->GetTextureHeight();
}
SetCustomTextureCoords( fImageCoords );
}
const RectF *Sprite::GetCurrentTextureCoordRect() const
{ {
unsigned int uFrameNo = m_States[m_iCurState].iFrameIndex; unsigned int uFrameNo = m_States[m_iCurState].iFrameIndex;
return m_pTexture->GetTextureCoordRect( uFrameNo ); return m_pTexture->GetTextureCoordRect( uFrameNo );
} }
void Sprite::GetCurrentTextureCoords(float fImageCoords[8]) const
{
const RectF *pTexCoordRect = GetCurrentTextureCoordRect();
TexCoordArrayFromRect(fImageCoords, *pTexCoordRect);
}
/* If we're using custom coordinates, return them; otherwise return the coordinates /* If we're using custom coordinates, return them; otherwise return the coordinates
* for the current state. */ * for the current state. */
void Sprite::GetActiveTexCoords(float fImageCoords[8]) const const RectF* Sprite::GetActiveTextureCoords() const
{ {
if(m_bUsingCustomTexCoords) GetCustomTextureCoords(fImageCoords); if(m_bUsingCustomTexCoords)
else GetCurrentTextureCoords(fImageCoords); return GetCustomTextureCoords();
else
return GetCurrentTextureCoords();
} }
+6 -12
View File
@@ -40,17 +40,12 @@ public:
virtual int GetNumStates() { return m_States.size(); }; virtual int GetNumStates() { return m_States.size(); };
CString GetTexturePath() { return m_pTexture==NULL ? "" : m_pTexture->GetID().filename; }; CString GetTexturePath() { return m_pTexture==NULL ? "" : m_pTexture->GetID().filename; };
void SetCustomTextureRect( const RectF &new_texcoord_frect ); void SetCustomTextureCoords( const RectF &newTexCoords );
void SetCustomTextureCoords( float fTexCoords[8] ); const RectF* GetCustomTextureCoords() const;
void GetCustomTextureCoords( float fTexCoordsOut[8] ) const; void SetCustomImageCoords( const RectF &newImageCoords ); // in image space (not texture space)
void SetCustomSourceRect( const RectF &rectSourceCoords ); // in source pixel space
void SetCustomImageRect( RectF rectImageCoords ); // in image pixel space
void SetCustomImageCoords( float fImageCoords[8] );
const RectF *GetCurrentTextureCoordRect() const;
void StopUsingCustomCoords(); void StopUsingCustomCoords();
const RectF* GetActiveTextureCoords() const; // depends on m_bUsingCustomTexCoords
void GetActiveTexCoords(float fImageCoords[8]) const; const RectF* GetCurrentTextureCoords() const;
void GetCurrentTextureCoords(float fImageCoords[8]) const;
protected: protected:
virtual bool LoadFromTexture( RageTextureID ID ); virtual bool LoadFromTexture( RageTextureID ID );
@@ -71,8 +66,7 @@ protected:
float m_fSecsIntoState; // number of seconds that have elapsed since we switched to this frame float m_fSecsIntoState; // number of seconds that have elapsed since we switched to this frame
bool m_bUsingCustomTexCoords; bool m_bUsingCustomTexCoords;
//FRECT m_CustomTexCoordRect; RectF m_CustomTexCoords;
float m_CustomTexCoords[8]; // (x,y) * 4
}; };
#endif #endif
+36 -15
View File
@@ -1,5 +1,5 @@
# Microsoft Developer Studio Project File - Name="StepMania" - Package Owner=<4> # Microsoft Developer Studio Project File - Name="StepMania" - Package Owner=<4>
# Microsoft Developer Studio Generated Build File, Format Version 6.00 # Microsoft Developer Studio Generated Build File, Format Version 60000
# ** DO NOT EDIT ** # ** DO NOT EDIT **
# TARGTYPE "Win32 (x86) Application" 0x0101 # TARGTYPE "Win32 (x86) Application" 0x0101
@@ -61,7 +61,7 @@ LINK32=link.exe
# SUBTRACT LINK32 /verbose /profile /pdb:none /incremental:no /nodefaultlib # SUBTRACT LINK32 /verbose /profile /pdb:none /incremental:no /nodefaultlib
# Begin Special Build Tool # Begin Special Build Tool
IntDir=.\../Debug6 IntDir=.\../Debug6
TargetDir=\temp\stepmania TargetDir=\stepmania\stepmania
TargetName=StepMania-debug TargetName=StepMania-debug
SOURCE="$(InputPath)" SOURCE="$(InputPath)"
PreLink_Cmds=disasm\verinc cl /Zl /nologo /c verstub.cpp /Fo$(IntDir)\ PreLink_Cmds=disasm\verinc cl /Zl /nologo /c verstub.cpp /Fo$(IntDir)\
@@ -82,24 +82,28 @@ PostBuild_Cmds=disasm\mapconv $(IntDir)\$(TargetName).map $(TargetDir)\StepMania
# PROP Intermediate_Dir "StepMania___Xbox_Debug___VC6" # PROP Intermediate_Dir "StepMania___Xbox_Debug___VC6"
# PROP Ignore_Export_Lib 0 # PROP Ignore_Export_Lib 0
# PROP Target_Dir "" # PROP Target_Dir ""
XBCP=xbecopy.exe CPP=cl.exe
# ADD BASE XBCP /NOLOGO # ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /I "." /I "SDL-1.2.5\include" /I "SDL_image-1.2" /I "plib-1.6.0" /D "WIN32" /D "_XBOX" /D "_DEBUG" /Fr /YX"global.h" /FD /c
# ADD XBCP /NOLOGO # ADD CPP /nologo /W3 /Gm /GX /ZI /Od /I "." /I "SDL-1.2.5\include" /I "SDL_image-1.2" /I "plib-1.6.0" /D "WIN32" /D "_XBOX" /D "_DEBUG" /Fr /YX"global.h" /FD /c
XBE=imagebld.exe BSC32=bscmake.exe
# ADD BASE XBE /nologo /stack:0x10000 /debug # ADD BASE BSC32 /nologo
# ADD XBE /nologo /stack:0x10000 /debug # ADD BSC32 /nologo
LINK32=link.exe LINK32=link.exe
# ADD BASE LINK32 $(intdir)\verstub.obj kernel32.lib shell32.lib user32.lib gdi32.lib advapi32.lib winmm.lib /nologo /pdb:"../debug6/StepMania-debug.pdb" /map /debug /machine:IX86 /nodefaultlib:"libcmtd.lib" /out:"../StepMania-debug.exe" # ADD BASE LINK32 $(intdir)\verstub.obj kernel32.lib shell32.lib user32.lib gdi32.lib advapi32.lib winmm.lib /nologo /pdb:"../debug6/StepMania-debug.pdb" /map /debug /machine:IX86 /nodefaultlib:"libcmtd.lib" /out:"../StepMania-debug.exe"
# SUBTRACT BASE LINK32 /verbose /profile /pdb:none /incremental:no /nodefaultlib # SUBTRACT BASE LINK32 /verbose /profile /pdb:none /incremental:no /nodefaultlib
# ADD LINK32 $(intdir)\verstub.obj kernel32.lib shell32.lib user32.lib gdi32.lib advapi32.lib winmm.lib /nologo /pdb:"../debug6/StepMania-debug.pdb" /map /debug /machine:IX86 /nodefaultlib:"libcmtd.lib" /out:"../StepMania-debug.exe" # ADD LINK32 $(intdir)\verstub.obj kernel32.lib shell32.lib user32.lib gdi32.lib advapi32.lib winmm.lib /nologo /pdb:"../debug6/StepMania-debug.pdb" /map /debug /machine:IX86 /nodefaultlib:"libcmtd.lib" /out:"../StepMania-debug.exe"
# SUBTRACT LINK32 /verbose /profile /pdb:none /incremental:no /nodefaultlib # SUBTRACT LINK32 /verbose /profile /pdb:none /incremental:no /nodefaultlib
BSC32=bscmake.exe XBE=imagebld.exe
# ADD BASE BSC32 /nologo # ADD BASE XBE /nologo /stack:0x10000 /debug
# ADD BSC32 /nologo # ADD XBE /nologo /stack:0x10000 /debug
CPP=cl.exe XBCP=xbecopy.exe
# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /I "." /I "SDL-1.2.5\include" /I "SDL_image-1.2" /I "plib-1.6.0" /D "WIN32" /D "_XBOX" /D "_DEBUG" /Fr /YX"global.h" /FD /c # ADD BASE XBCP /NOLOGO
# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /I "." /I "SDL-1.2.5\include" /I "SDL_image-1.2" /I "plib-1.6.0" /D "WIN32" /D "_XBOX" /D "_DEBUG" /Fr /YX"global.h" /FD /c # ADD XBCP /NOLOGO
# Begin Special Build Tool # Begin Special Build Tool
IntDir=.\StepMania___Xbox_Debug___VC6
TargetDir=.\StepMania___Xbox_Debug___VC6
TargetName=StepMania
SOURCE="$(InputPath)"
PreLink_Cmds=disasm\verinc cl /Zl /nologo /c verstub.cpp /Fo$(IntDir)\ PreLink_Cmds=disasm\verinc cl /Zl /nologo /c verstub.cpp /Fo$(IntDir)\
PostBuild_Cmds=disasm\mapconv $(IntDir)\$(TargetName).map $(TargetDir)\StepMania.vdi ia32.vdi PostBuild_Cmds=disasm\mapconv $(IntDir)\$(TargetName).map $(TargetDir)\StepMania.vdi ia32.vdi
# End Special Build Tool # End Special Build Tool
@@ -137,7 +141,7 @@ LINK32=link.exe
# SUBTRACT LINK32 /verbose /pdb:none # SUBTRACT LINK32 /verbose /pdb:none
# Begin Special Build Tool # Begin Special Build Tool
IntDir=.\../Release6 IntDir=.\../Release6
TargetDir=\temp\stepmania TargetDir=\stepmania\stepmania
TargetName=StepMania TargetName=StepMania
SOURCE="$(InputPath)" SOURCE="$(InputPath)"
PreLink_Cmds=disasm\verinc cl /Zl /nologo /c verstub.cpp /Fo$(IntDir)\ PreLink_Cmds=disasm\verinc cl /Zl /nologo /c verstub.cpp /Fo$(IntDir)\
@@ -3948,6 +3952,23 @@ SOURCE=.\ScreenSelectGroup.h
# End Source File # End Source File
# Begin Source File # Begin Source File
SOURCE=.\ScreenSelectMaster.cpp
!IF "$(CFG)" == "StepMania - Win32 Debug"
!ELSEIF "$(CFG)" == "StepMania - Xbox Debug"
!ELSEIF "$(CFG)" == "StepMania - Win32 Release"
!ENDIF
# End Source File
# Begin Source File
SOURCE=.\ScreenSelectMaster.h
# End Source File
# Begin Source File
SOURCE=.\ScreenSelectMode.cpp SOURCE=.\ScreenSelectMode.cpp
!IF "$(CFG)" == "StepMania - Win32 Debug" !IF "$(CFG)" == "StepMania - Win32 Debug"