add GetFileType to consolidate file extension parsing

This commit is contained in:
Chris Danford
2005-05-29 01:04:44 +00:00
parent 98db8b8157
commit 94a9cda191
2 changed files with 112 additions and 67 deletions
+64 -35
View File
@@ -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
+16
View File
@@ -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 )