diff --git a/stepmania/src/Quad.cpp b/stepmania/src/Quad.cpp index 9b745abf3b..daaae86f13 100644 --- a/stepmania/src/Quad.cpp +++ b/stepmania/src/Quad.cpp @@ -5,6 +5,12 @@ REGISTER_ACTOR_CLASS( Quad ) +void Quad::LoadFromNode( const CString& sDir, const XNode* pNode ) +{ + // HACK: Bypass Sprite's texture loading. Sprite should really derive from Quad. + Actor::LoadFromNode( sDir, pNode ); +} + /* * (c) 2005 Glenn Maynard * All rights reserved. diff --git a/stepmania/src/Quad.h b/stepmania/src/Quad.h index 61920084e9..005683798b 100644 --- a/stepmania/src/Quad.h +++ b/stepmania/src/Quad.h @@ -13,6 +13,8 @@ public: { m_bDrawIfTextureNull = true; } + + void LoadFromNode( const CString& sDir, const XNode* pNode ); }; #endif diff --git a/stepmania/src/Sprite.cpp b/stepmania/src/Sprite.cpp index d7011af4ac..3abbdd7841 100644 --- a/stepmania/src/Sprite.cpp +++ b/stepmania/src/Sprite.cpp @@ -99,6 +99,82 @@ bool Sprite::Load( RageTextureID ID ) return result; }; +void Sprite::LoadFromNode( const CString& sDir, const XNode* pNode ) +{ +retry: + + CString sTextureFile; + CString sPath; + if( pNode->GetAttrValue( "Texture", sTextureFile ) ) + { + sPath = sDir + sTextureFile; + CollapsePath( sPath ); + } + + if( !sPath.empty() ) + { + vector asElementPaths; + GetDirListing( sPath + "*", asElementPaths, false, true ); + if( asElementPaths.size() == 0 ) + { + CString sMessage = ssprintf( "The sprite file '%s' points to a texture '%s' which doesn't exist.", m_sSpritePath.c_str(), sPath.c_str() ); + switch( Dialog::AbortRetryIgnore(sMessage) ) + { + case Dialog::abort: + RageException::Throw( "Error reading value 'Texture' from %s.", m_sSpritePath.c_str() ); + case Dialog::retry: + goto retry; + case Dialog::ignore: + return; + default: + ASSERT(0); + } + } + if( asElementPaths.size() > 1 ) + { + CString message = ssprintf( + "There is more than one file that matches " + "'%s'. Please remove all but one of these matches.", + sPath.c_str() ); + + RageException::Throw( message ); + } + sPath = asElementPaths[0]; + + // Load the texture + LoadFromTexture( sPath ); + + + // Read in frames and delays from the sprite file, + // overwriting the states that LoadFromTexture created. + // If the .sprite file doesn't define any states, leave + // frames and delays created during LoadFromTexture(). + for( int i=0; true; i++ ) + { + CString sFrameKey = ssprintf( "Frame%04d", i ); + CString sDelayKey = ssprintf( "Delay%04d", i ); + State newState; + + if( !pNode->GetAttrValue( sFrameKey, newState.iFrameIndex ) ) + break; + if( newState.iFrameIndex >= m_pTexture->GetNumFrames() ) + RageException::Throw( "In '%s', %s is %d, but the texture %s only has %d frames.", + m_sSpritePath.c_str(), sFrameKey.c_str(), newState.iFrameIndex, sPath.c_str(), m_pTexture->GetNumFrames() ); + + if( !pNode->GetAttrValue( sDelayKey, newState.fDelay ) ) + break; + + if( i == 0 ) // the ini file defines at least one frame + m_States.clear(); // clear before adding + + m_States.push_back( newState ); + } + } + + + Actor::LoadFromNode( sDir, pNode ); +} + // Sprite file has the format: // // [Sprite] @@ -117,10 +193,7 @@ bool Sprite::LoadFromSpriteFile( RageTextureID ID ) { LOG->Trace( ssprintf("Sprite::LoadFromSpriteFile(%s)", ID.filename.c_str()) ); -retry: - //Init(); - m_sSpritePath = ID.filename; // read sprite file @@ -128,79 +201,7 @@ retry: if( !ini.ReadFile( m_sSpritePath ) ) RageException::Throw( "Error opening Sprite file '%s'.", m_sSpritePath.c_str() ); - CString sTextureFile; - ini.GetValue( "Sprite", "Texture", sTextureFile ); - if( sTextureFile == "" ) - RageException::Throw( "Error reading value 'Texture' from %s.", m_sSpritePath.c_str() ); - - // save the path of the real texture - ID.filename = Dirname(m_sSpritePath) + sTextureFile; - { - vector asElementPaths; - GetDirListing( ID.filename + "*", asElementPaths, false, true ); - if(asElementPaths.size() == 0) - { - CString sMessage = ssprintf( "The sprite file '%s' points to a texture '%s' which doesn't exist.", m_sSpritePath.c_str(), ID.filename.c_str() ); - switch( Dialog::AbortRetryIgnore(sMessage) ) - { - case Dialog::abort: - RageException::Throw( "Error reading value 'Texture' from %s.", m_sSpritePath.c_str() ); - case Dialog::retry: - goto retry; - case Dialog::ignore: - return false; - default: - ASSERT(0); - } - } - if(asElementPaths.size() > 1) - { - CString message = ssprintf( - "There is more than one file that matches " - "'%s'. Please remove all but one of these matches.", - ID.filename.c_str() ); - - RageException::Throw( message ); - } - ID.filename = asElementPaths[0]; - } - - // Load the texture - LoadFromTexture( ID ); - - // Read in frames and delays from the sprite file, - // overwriting the states that LoadFromTexture created. - // If the .sprite file doesn't define any states, leave - // frames and delays created during LoadFromTexture(). - for( int i=0; true; i++ ) - { - CString sFrameKey = ssprintf( "Frame%04d", i ); - CString sDelayKey = ssprintf( "Delay%04d", i ); - State newState; - - if( !ini.GetValue( "Sprite", sFrameKey, newState.iFrameIndex ) ) - break; - if( newState.iFrameIndex >= m_pTexture->GetNumFrames() ) - RageException::Throw( "In '%s', %s is %d, but the texture %s only has %d frames.", - m_sSpritePath.c_str(), sFrameKey.c_str(), newState.iFrameIndex, ID.filename.c_str(), m_pTexture->GetNumFrames() ); - - if( !ini.GetValue( "Sprite", sDelayKey, newState.fDelay ) ) - break; - - if( i == 0 ) // the ini file defines at least one frame - m_States.clear(); // clear before adding - - m_States.push_back( newState ); - } - - float f; - if( ini.GetValue( "Sprite", "BaseRotationXDegrees", f ) ) Actor::SetBaseRotationX( f ); - if( ini.GetValue( "Sprite", "BaseRotationYDegrees", f ) ) Actor::SetBaseRotationY( f ); - if( ini.GetValue( "Sprite", "BaseRotationZDegrees", f ) ) Actor::SetBaseRotationZ( f ); - if( ini.GetValue( "Sprite", "BaseZoomX", f ) ) Actor::SetBaseZoomX( f ); - if( ini.GetValue( "Sprite", "BaseZoomY", f ) ) Actor::SetBaseZoomY( f ); - if( ini.GetValue( "Sprite", "BaseZoomZ", f ) ) Actor::SetBaseZoomZ( f ); - + LoadFromNode( Dirname(m_sSpritePath), ini.GetChild("Sprite") ); return true; } @@ -401,6 +402,9 @@ void TexCoordArrayFromRect(float fImageCoords[8], const RectF &rect) void Sprite::DrawTexture( const TweenState *state ) { + if( m_fBaseAlpha != 1 ) + int dkjfksdf = 0; + Actor::SetGlobalRenderStates(); // set Actor-specified render states // bail if cropped all the way diff --git a/stepmania/src/Sprite.h b/stepmania/src/Sprite.h index 7515c4ec59..06fceae58b 100644 --- a/stepmania/src/Sprite.h +++ b/stepmania/src/Sprite.h @@ -14,6 +14,8 @@ public: Sprite(); virtual ~Sprite(); + void LoadFromNode( const CString& sDir, const XNode* pNode ); + virtual bool EarlyAbortDraw(); virtual void DrawPrimitives(); virtual void Update( float fDeltaTime );