support loading Sprite frames from xml (deprecates .sprite files)
This commit is contained in:
@@ -5,6 +5,12 @@
|
|||||||
REGISTER_ACTOR_CLASS( Quad )
|
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
|
* (c) 2005 Glenn Maynard
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
|
|||||||
@@ -13,6 +13,8 @@ public:
|
|||||||
{
|
{
|
||||||
m_bDrawIfTextureNull = true;
|
m_bDrawIfTextureNull = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void LoadFromNode( const CString& sDir, const XNode* pNode );
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
+80
-76
@@ -99,6 +99,82 @@ bool Sprite::Load( RageTextureID ID )
|
|||||||
return result;
|
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<CString> 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 file has the format:
|
||||||
//
|
//
|
||||||
// [Sprite]
|
// [Sprite]
|
||||||
@@ -117,10 +193,7 @@ bool Sprite::LoadFromSpriteFile( RageTextureID ID )
|
|||||||
{
|
{
|
||||||
LOG->Trace( ssprintf("Sprite::LoadFromSpriteFile(%s)", ID.filename.c_str()) );
|
LOG->Trace( ssprintf("Sprite::LoadFromSpriteFile(%s)", ID.filename.c_str()) );
|
||||||
|
|
||||||
retry:
|
|
||||||
|
|
||||||
//Init();
|
//Init();
|
||||||
|
|
||||||
m_sSpritePath = ID.filename;
|
m_sSpritePath = ID.filename;
|
||||||
|
|
||||||
// read sprite file
|
// read sprite file
|
||||||
@@ -128,79 +201,7 @@ retry:
|
|||||||
if( !ini.ReadFile( m_sSpritePath ) )
|
if( !ini.ReadFile( m_sSpritePath ) )
|
||||||
RageException::Throw( "Error opening Sprite file '%s'.", m_sSpritePath.c_str() );
|
RageException::Throw( "Error opening Sprite file '%s'.", m_sSpritePath.c_str() );
|
||||||
|
|
||||||
CString sTextureFile;
|
LoadFromNode( Dirname(m_sSpritePath), ini.GetChild("Sprite") );
|
||||||
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<CString> 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 );
|
|
||||||
|
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -401,6 +402,9 @@ void TexCoordArrayFromRect(float fImageCoords[8], const RectF &rect)
|
|||||||
|
|
||||||
void Sprite::DrawTexture( const TweenState *state )
|
void Sprite::DrawTexture( const TweenState *state )
|
||||||
{
|
{
|
||||||
|
if( m_fBaseAlpha != 1 )
|
||||||
|
int dkjfksdf = 0;
|
||||||
|
|
||||||
Actor::SetGlobalRenderStates(); // set Actor-specified render states
|
Actor::SetGlobalRenderStates(); // set Actor-specified render states
|
||||||
|
|
||||||
// bail if cropped all the way
|
// bail if cropped all the way
|
||||||
|
|||||||
@@ -14,6 +14,8 @@ public:
|
|||||||
Sprite();
|
Sprite();
|
||||||
virtual ~Sprite();
|
virtual ~Sprite();
|
||||||
|
|
||||||
|
void LoadFromNode( const CString& sDir, const XNode* pNode );
|
||||||
|
|
||||||
virtual bool EarlyAbortDraw();
|
virtual bool EarlyAbortDraw();
|
||||||
virtual void DrawPrimitives();
|
virtual void DrawPrimitives();
|
||||||
virtual void Update( float fDeltaTime );
|
virtual void Update( float fDeltaTime );
|
||||||
|
|||||||
Reference in New Issue
Block a user