add GetFileType to consolidate file extension parsing
This commit is contained in:
+64
-35
@@ -263,19 +263,18 @@ Actor* ActorUtil::LoadFromActorFile( const CString& sAniDir, const XNode* pNode
|
|||||||
|
|
||||||
Actor* ActorUtil::MakeActor( const RageTextureID &ID )
|
Actor* ActorUtil::MakeActor( const RageTextureID &ID )
|
||||||
{
|
{
|
||||||
CString sExt = GetExtension( ID.filename );
|
FileType ft = GetFileType(ID.filename);
|
||||||
sExt.MakeLower();
|
switch( ft )
|
||||||
|
{
|
||||||
if( sExt=="xml" )
|
case FT_Xml:
|
||||||
{
|
{
|
||||||
XNode xml;
|
XNode xml;
|
||||||
PARSEINFO pi;
|
if( !xml.LoadFromFile(ID.filename) )
|
||||||
if( !xml.LoadFromFile( ID.filename, &pi ) )
|
RageException::Throw( ssprintf("Error loading %s", ID.filename.c_str()) );
|
||||||
RageException::Throw( ssprintf("Error loading %s: %s", ID.filename.c_str(), pi.error_string.c_str()) );
|
|
||||||
CString sDir = Dirname( ID.filename );
|
CString sDir = Dirname( ID.filename );
|
||||||
return LoadFromActorFile( sDir, &xml );
|
return LoadFromActorFile( sDir, &xml );
|
||||||
}
|
}
|
||||||
else if( sExt=="actor" )
|
case FT_Actor:
|
||||||
{
|
{
|
||||||
// TODO: Check for recursive loading
|
// TODO: Check for recursive loading
|
||||||
IniFile ini;
|
IniFile ini;
|
||||||
@@ -290,28 +289,7 @@ Actor* ActorUtil::MakeActor( const RageTextureID &ID )
|
|||||||
|
|
||||||
return LoadFromActorFile( sDir, pNode );
|
return LoadFromActorFile( sDir, pNode );
|
||||||
}
|
}
|
||||||
else if( sExt=="png" ||
|
case FT_Directory:
|
||||||
sExt=="jpg" ||
|
|
||||||
sExt=="gif" ||
|
|
||||||
sExt=="bmp" ||
|
|
||||||
sExt=="avi" ||
|
|
||||||
sExt=="mpeg" ||
|
|
||||||
sExt=="mpg" ||
|
|
||||||
sExt=="sprite" )
|
|
||||||
{
|
|
||||||
Sprite* pSprite = new Sprite;
|
|
||||||
pSprite->Load( ID );
|
|
||||||
return pSprite;
|
|
||||||
}
|
|
||||||
else if( sExt=="txt" ||
|
|
||||||
sExt=="model" )
|
|
||||||
{
|
|
||||||
Model* pModel = new Model;
|
|
||||||
pModel->Load( ID.filename );
|
|
||||||
return pModel;
|
|
||||||
}
|
|
||||||
/* Do this last, to avoid the IsADirectory in most cases. */
|
|
||||||
else if( IsADirectory(ID.filename) )
|
|
||||||
{
|
{
|
||||||
CString sDir = ID.filename;
|
CString sDir = ID.filename;
|
||||||
if( sDir.Right(1) != "/" )
|
if( sDir.Right(1) != "/" )
|
||||||
@@ -322,9 +300,8 @@ Actor* ActorUtil::MakeActor( const RageTextureID &ID )
|
|||||||
if( DoesFileExist(sXml) )
|
if( DoesFileExist(sXml) )
|
||||||
{
|
{
|
||||||
XNode xml;
|
XNode xml;
|
||||||
PARSEINFO pi;
|
if( !xml.LoadFromFile(sXml) )
|
||||||
if( !xml.LoadFromFile( sXml, &pi ) )
|
RageException::Throw( ssprintf("Error loading %s", sXml.c_str()) );
|
||||||
RageException::Throw( ssprintf("Error loading %s: %s", sXml.c_str(), pi.error_string.c_str()) );
|
|
||||||
return LoadFromActorFile( sDir, &xml );
|
return LoadFromActorFile( sDir, &xml );
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -334,10 +311,23 @@ Actor* ActorUtil::MakeActor( const RageTextureID &ID )
|
|||||||
return pBGA;
|
return pBGA;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
case FT_Bitmap:
|
||||||
|
case FT_Movie:
|
||||||
|
case FT_Sprite:
|
||||||
{
|
{
|
||||||
|
Sprite* pSprite = new Sprite;
|
||||||
|
pSprite->Load( ID );
|
||||||
|
return pSprite;
|
||||||
|
}
|
||||||
|
case FT_Model:
|
||||||
|
{
|
||||||
|
Model* pModel = new Model;
|
||||||
|
pModel->Load( ID.filename );
|
||||||
|
return pModel;
|
||||||
|
}
|
||||||
|
default:
|
||||||
RageException::Throw("File \"%s\" has unknown type, \"%s\"",
|
RageException::Throw("File \"%s\" has unknown type, \"%s\"",
|
||||||
ID.filename.c_str(), sExt.c_str() );
|
ID.filename.c_str(), FileTypeToString(ft).c_str() );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -410,6 +400,45 @@ void ActorUtil::SortByZPosition( vector<Actor*> &vActors )
|
|||||||
stable_sort( vActors.begin(), vActors.end(), CompareActorsByZPosition );
|
stable_sort( vActors.begin(), vActors.end(), CompareActorsByZPosition );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static const CString FileTypeNames[] = {
|
||||||
|
"Actor",
|
||||||
|
"Bitmap",
|
||||||
|
"Sprite",
|
||||||
|
"Movie",
|
||||||
|
"Directory",
|
||||||
|
"Xml",
|
||||||
|
"Model",
|
||||||
|
};
|
||||||
|
XToString( FileType, NUM_FileType );
|
||||||
|
|
||||||
|
FileType ActorUtil::GetFileType( const CString &sPath )
|
||||||
|
{
|
||||||
|
CString sExt = GetExtension( sPath );
|
||||||
|
sExt.MakeLower();
|
||||||
|
|
||||||
|
if( sExt=="xml" ) return FT_Xml;
|
||||||
|
else if( sExt=="actor" ) return FT_Actor;
|
||||||
|
/* Do this last, to avoid the IsADirectory in most cases. */
|
||||||
|
/* Yuck. Some directories end in ".mpg", so do the directory
|
||||||
|
/* check before the extensions check. */
|
||||||
|
else if( IsADirectory(sPath) ) return FT_Directory;
|
||||||
|
else if(
|
||||||
|
sExt=="png" ||
|
||||||
|
sExt=="jpg" ||
|
||||||
|
sExt=="gif" ||
|
||||||
|
sExt=="bmp" ) return FT_Bitmap;
|
||||||
|
else if(
|
||||||
|
sExt=="avi" ||
|
||||||
|
sExt=="mpeg" ||
|
||||||
|
sExt=="mpg" ) return FT_Movie;
|
||||||
|
else if(
|
||||||
|
sExt=="sprite" ) return FT_Sprite;
|
||||||
|
else if(
|
||||||
|
sExt=="txt" ||
|
||||||
|
sExt=="model" ) return FT_Model;
|
||||||
|
else return FT_Invalid;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* (c) 2003-2004 Chris Danford
|
* (c) 2003-2004 Chris Danford
|
||||||
|
|||||||
@@ -24,6 +24,20 @@ typedef Actor* (*CreateActorFn)(const CString& sDir, const XNode* pNode);
|
|||||||
|
|
||||||
#define REGISTER_ACTOR_CLASS( className ) REGISTER_ACTOR_CLASS_WITH_NAME( className, className )
|
#define REGISTER_ACTOR_CLASS( className ) REGISTER_ACTOR_CLASS_WITH_NAME( className, className )
|
||||||
|
|
||||||
|
enum FileType
|
||||||
|
{
|
||||||
|
FT_Actor,
|
||||||
|
FT_Bitmap,
|
||||||
|
FT_Sprite,
|
||||||
|
FT_Movie,
|
||||||
|
FT_Directory,
|
||||||
|
FT_Xml,
|
||||||
|
FT_Model,
|
||||||
|
NUM_FileType,
|
||||||
|
FT_Invalid
|
||||||
|
};
|
||||||
|
const CString& FileTypeToString( FileType ft );
|
||||||
|
|
||||||
namespace ActorUtil
|
namespace ActorUtil
|
||||||
{
|
{
|
||||||
// Every screen should register its class at program initialization.
|
// Every screen should register its class at program initialization.
|
||||||
@@ -59,6 +73,8 @@ namespace ActorUtil
|
|||||||
void ResolvePath( CString &sPath, const CString &sName );
|
void ResolvePath( CString &sPath, const CString &sName );
|
||||||
|
|
||||||
void SortByZPosition( vector<Actor*> &vActors );
|
void SortByZPosition( vector<Actor*> &vActors );
|
||||||
|
|
||||||
|
FileType GetFileType( const CString &sPath );
|
||||||
};
|
};
|
||||||
|
|
||||||
#define SET_XY( actor ) ActorUtil::SetXY( actor, m_sName )
|
#define SET_XY( actor ) ActorUtil::SetXY( actor, m_sName )
|
||||||
|
|||||||
Reference in New Issue
Block a user