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-e03cc46cb475master
parent
07bc66af6c
commit
e451fa41c2
|
@ -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
|
||||
|
|
|
@ -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))
|
||||
{
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
||||
|
|
|
@ -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()))
|
||||
{
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue