The loader selection process now consistently checks loader lists in reverse order, so new loaders added to Irrlicht override the internal ones. This applies when adding external mesh, image, scene and archive loaders, image writers, plus node, animator and GUI element factories.

git-svn-id: svn://svn.code.sf.net/p/irrlicht/code/trunk@3568 dfc29bdd-3216-0410-991c-e03cc46cb475
master
bitplane 2011-01-20 08:50:15 +00:00
parent 07bc66af6c
commit e451fa41c2
6 changed files with 66 additions and 58 deletions

View File

@ -1,5 +1,9 @@
Changes in 1.8 (??.??.2011)
- The loader selection process now consistently checks loader lists in reverse order, so new loaders added to Irrlicht override the internal ones. This applies when adding external mesh, image, scene and archive loaders, image writers, plus node, animator and GUI element factories.
- Added getters to retrieve mesh, scene and archive loaders.
- Added ISceneLoader interface and .irr loader. Users can now add their own scene loaders to the scene manager and use them by calling loadScene.
- Renamed IGUIElement::bringToBack to sendToBack, like in Windows

View File

@ -58,14 +58,6 @@ CFileSystem::CFileSystem()
//! reset current working directory
getWorkingDirectory();
#ifdef __IRR_COMPILE_WITH_ZIP_ARCHIVE_LOADER_
ArchiveLoader.push_back(new CArchiveLoaderZIP(this));
#endif
#ifdef __IRR_COMPILE_WITH_MOUNT_ARCHIVE_LOADER_
ArchiveLoader.push_back(new CArchiveLoaderMount(this));
#endif
#ifdef __IRR_COMPILE_WITH_PAK_ARCHIVE_LOADER_
ArchiveLoader.push_back(new CArchiveLoaderPAK(this));
#endif
@ -82,6 +74,14 @@ CFileSystem::CFileSystem()
ArchiveLoader.push_back(new CArchiveLoaderWAD(this));
#endif
#ifdef __IRR_COMPILE_WITH_MOUNT_ARCHIVE_LOADER_
ArchiveLoader.push_back(new CArchiveLoaderMount(this));
#endif
#ifdef __IRR_COMPILE_WITH_ZIP_ARCHIVE_LOADER_
ArchiveLoader.push_back(new CArchiveLoaderZIP(this));
#endif
}
@ -216,28 +216,29 @@ bool CFileSystem::addFileArchive(const io::path& filename, bool ignoreCase,
{
IFileArchive* archive = 0;
bool ret = false;
u32 i;
// check if the archive was already loaded
for (i = 0; i < FileArchives.size(); ++i)
for (u32 idx = 0; idx < FileArchives.size(); ++idx)
{
// TODO: This should go into a path normalization method
// We need to check for directory names with trailing slash and without
const core::stringc absPath = getAbsolutePath(filename);
const core::stringc arcPath = FileArchives[i]->getFileList()->getPath();
const core::stringc arcPath = FileArchives[idx]->getFileList()->getPath();
if ((absPath == arcPath) || ((absPath+"/") == arcPath))
{
if (password.size())
FileArchives[i]->Password=password;
FileArchives[idx]->Password=password;
return true;
}
}
s32 i;
// do we know what type it should be?
if (archiveType == EFAT_UNKNOWN || archiveType == EFAT_FOLDER)
{
// try to load archive based on file name
for (i = 0; i < ArchiveLoader.size(); ++i)
for (i = ArchiveLoader.size()-1; i >=0 ; --i)
{
if (ArchiveLoader[i]->isALoadableFileFormat(filename))
{
@ -253,7 +254,7 @@ bool CFileSystem::addFileArchive(const io::path& filename, bool ignoreCase,
io::IReadFile* file = createAndOpenFile(filename);
if (file)
{
for (i = 0; i < ArchiveLoader.size(); ++i)
for (i = ArchiveLoader.size()-1; i >= 0; --i)
{
file->seek(0);
if (ArchiveLoader[i]->isALoadableFileFormat(file))
@ -274,7 +275,7 @@ bool CFileSystem::addFileArchive(const io::path& filename, bool ignoreCase,
io::IReadFile* file = 0;
for (i = 0; i < ArchiveLoader.size(); ++i)
for (i = ArchiveLoader.size()-1; i >= 0; --i)
{
if (ArchiveLoader[i]->isALoadableFileFormat(archiveType))
{

View File

@ -696,7 +696,7 @@ IGUIElement* CGUIEnvironment::addGUIElement(const c8* elementName, IGUIElement*
if (!parent)
parent = this;
for (u32 i=0; i<GUIElementFactoryList.size() && !node; ++i)
for (s32 i=GUIElementFactoryList.size()-1; i>=0 && !node; --i)
node = GUIElementFactoryList[i]->addGUIElement(elementName, parent);

View File

@ -120,14 +120,20 @@ CNullDriver::CNullDriver(io::IFileSystem* io, const core::dimension2d<u32>& scre
// create surface loader
#ifdef _IRR_COMPILE_WITH_BMP_LOADER_
SurfaceLoader.push_back(video::createImageLoaderBMP());
#ifdef _IRR_COMPILE_WITH_HALFLIFE_LOADER_
SurfaceLoader.push_back(video::createImageLoaderHalfLife());
#endif
#ifdef _IRR_COMPILE_WITH_JPG_LOADER_
SurfaceLoader.push_back(video::createImageLoaderJPG());
#ifdef _IRR_COMPILE_WITH_WAL_LOADER_
SurfaceLoader.push_back(video::createImageLoaderWAL());
#endif
#ifdef _IRR_COMPILE_WITH_TGA_LOADER_
SurfaceLoader.push_back(video::createImageLoaderTGA());
#ifdef _IRR_COMPILE_WITH_LMP_LOADER_
SurfaceLoader.push_back(video::createImageLoaderLMP());
#endif
#ifdef _IRR_COMPILE_WITH_PPM_LOADER_
SurfaceLoader.push_back(video::createImageLoaderPPM());
#endif
#ifdef _IRR_COMPILE_WITH_RGB_LOADER_
SurfaceLoader.push_back(video::createImageLoaderRGB());
#endif
#ifdef _IRR_COMPILE_WITH_PSD_LOADER_
SurfaceLoader.push_back(video::createImageLoaderPSD());
@ -138,49 +144,43 @@ CNullDriver::CNullDriver(io::IFileSystem* io, const core::dimension2d<u32>& scre
#ifdef _IRR_COMPILE_WITH_PCX_LOADER_
SurfaceLoader.push_back(video::createImageLoaderPCX());
#endif
#ifdef _IRR_COMPILE_WITH_TGA_LOADER_
SurfaceLoader.push_back(video::createImageLoaderTGA());
#endif
#ifdef _IRR_COMPILE_WITH_PNG_LOADER_
SurfaceLoader.push_back(video::createImageLoaderPNG());
#endif
#ifdef _IRR_COMPILE_WITH_WAL_LOADER_
SurfaceLoader.push_back(video::createImageLoaderWAL());
#ifdef _IRR_COMPILE_WITH_JPG_LOADER_
SurfaceLoader.push_back(video::createImageLoaderJPG());
#endif
#ifdef _IRR_COMPILE_WITH_LMP_LOADER_
SurfaceLoader.push_back(video::createImageLoaderLMP());
#endif
#ifdef _IRR_COMPILE_WITH_HALFLIFE_LOADER_
SurfaceLoader.push_back(video::createImageLoaderHalfLife());
#endif
#ifdef _IRR_COMPILE_WITH_PPM_LOADER_
SurfaceLoader.push_back(video::createImageLoaderPPM());
#endif
#ifdef _IRR_COMPILE_WITH_RGB_LOADER_
SurfaceLoader.push_back(video::createImageLoaderRGB());
#ifdef _IRR_COMPILE_WITH_BMP_LOADER_
SurfaceLoader.push_back(video::createImageLoaderBMP());
#endif
#ifdef _IRR_COMPILE_WITH_BMP_WRITER_
SurfaceWriter.push_back(video::createImageWriterBMP());
#endif
#ifdef _IRR_COMPILE_WITH_JPG_WRITER_
SurfaceWriter.push_back(video::createImageWriterJPG());
#endif
#ifdef _IRR_COMPILE_WITH_TGA_WRITER_
SurfaceWriter.push_back(video::createImageWriterTGA());
#endif
#ifdef _IRR_COMPILE_WITH_PSD_WRITER_
SurfaceWriter.push_back(video::createImageWriterPSD());
#ifdef _IRR_COMPILE_WITH_PPM_WRITER_
SurfaceWriter.push_back(video::createImageWriterPPM());
#endif
#ifdef _IRR_COMPILE_WITH_PCX_WRITER_
SurfaceWriter.push_back(video::createImageWriterPCX());
#endif
#ifdef _IRR_COMPILE_WITH_PSD_WRITER_
SurfaceWriter.push_back(video::createImageWriterPSD());
#endif
#ifdef _IRR_COMPILE_WITH_TGA_WRITER_
SurfaceWriter.push_back(video::createImageWriterTGA());
#endif
#ifdef _IRR_COMPILE_WITH_JPG_WRITER_
SurfaceWriter.push_back(video::createImageWriterJPG());
#endif
#ifdef _IRR_COMPILE_WITH_PNG_WRITER_
SurfaceWriter.push_back(video::createImageWriterPNG());
#endif
#ifdef _IRR_COMPILE_WITH_PPM_WRITER_
SurfaceWriter.push_back(video::createImageWriterPPM());
#ifdef _IRR_COMPILE_WITH_BMP_WRITER_
SurfaceWriter.push_back(video::createImageWriterBMP());
#endif
// set ExposedData to 0
memset(&ExposedData, 0, sizeof(ExposedData));
for (u32 i=0; i<video::EVDF_COUNT; ++i)
@ -261,7 +261,7 @@ u32 CNullDriver::getImageLoaderCount() const
//! Retrieve the given image loader
IImageLoader* CNullDriver::getImageLoader(u32 n)
{
if(n < SurfaceLoader.size())
if (n < SurfaceLoader.size())
return SurfaceLoader[n];
return 0;
}
@ -277,7 +277,7 @@ u32 CNullDriver::getImageWriterCount() const
//! Retrieve the given image writer
IImageWriter* CNullDriver::getImageWriter(u32 n)
{
if(n < SurfaceWriter.size())
if (n < SurfaceWriter.size())
return SurfaceWriter[n];
return 0;
}
@ -903,6 +903,7 @@ void CNullDriver::setAmbientLight(const SColorf& color)
//! \return Returns the name of the video driver. Example: In case of the DIRECT3D8
//! driver, it would return "Direct3D8".
const wchar_t* CNullDriver::getName() const
{
return L"Irrlicht NullDevice";
@ -1317,10 +1318,10 @@ IImage* CNullDriver::createImageFromFile(io::IReadFile* file)
IImage* image = 0;
u32 i;
s32 i;
// try to load file based on file extension
for (i=0; i<SurfaceLoader.size(); ++i)
for (i=SurfaceLoader.size()-1; i>=0; --i)
{
if (SurfaceLoader[i]->isALoadableFileExtension(file->getFileName()))
{
@ -1333,7 +1334,7 @@ IImage* CNullDriver::createImageFromFile(io::IReadFile* file)
}
// try to load file based on what is in it
for (i=0; i<SurfaceLoader.size(); ++i)
for (i=SurfaceLoader.size()-1; i>=0; --i)
{
// dito
file->seek(0);
@ -1369,7 +1370,7 @@ bool CNullDriver::writeImageToFile(IImage* image, io::IWriteFile * file, u32 par
if(!file)
return false;
for (u32 i=0; i<SurfaceWriter.size(); ++i)
for (s32 i=SurfaceWriter.size()-1; i>=0; --i)
{
if (SurfaceWriter[i]->isAWriteableFileExtension(file->getFileName()))
{

View File

@ -220,7 +220,9 @@ void CSceneLoaderIrr::readAnimators(io::IXMLReader* reader, ISceneNode* node)
core::stringc typeName = attr->getAttributeAsString("Type");
ISceneNodeAnimator* anim = 0;
for (u32 i=0; i < SceneManager->getRegisteredSceneNodeAnimatorFactoryCount() && !anim; ++i)
// todo: need a method to add animator by name in the scene manager. This loader and others like it
// have no business messing with the animator factories!
for (s32 i=SceneManager->getRegisteredSceneNodeAnimatorFactoryCount(); i >=0 && !anim; --i)
anim = SceneManager->getSceneNodeAnimatorFactory(i)->createSceneNodeAnimator(typeName.c_str(), node);
if (anim)

View File

@ -2053,7 +2053,7 @@ u32 CSceneManager::getRegisteredSceneNodeFactoryCount() const
//! Returns a scene node factory by index
ISceneNodeFactory* CSceneManager::getSceneNodeFactory(u32 index)
{
if (index<SceneNodeFactoryList.size())
if (index < SceneNodeFactoryList.size())
return SceneNodeFactoryList[index];
return 0;
@ -2351,7 +2351,7 @@ const c8* CSceneManager::getAnimatorTypeName(ESCENE_NODE_ANIMATOR_TYPE type)
{
const char* name = 0;
for (u32 i=0; !name && i<SceneNodeAnimatorFactoryList.size(); ++i)
for (s32 i=SceneNodeAnimatorFactoryList.size()-1; !name && i >= 0; --i)
name = SceneNodeAnimatorFactoryList[i]->getCreateableSceneNodeAnimatorTypeName(type);
return name;