From 52a0b9d8e532569b0ac152636d28ab49f2688ce8 Mon Sep 17 00:00:00 2001 From: numzero Date: Tue, 14 Mar 2023 18:34:47 +0300 Subject: [PATCH] Drop dependency on FileSystem from SceneManager --- examples/AutomatedTest/main.cpp | 6 +++- include/ISceneManager.h | 17 +---------- source/Irrlicht/CIrrDeviceStub.cpp | 2 +- source/Irrlicht/CIrrDeviceStub.h | 2 +- source/Irrlicht/CSceneManager.cpp | 49 +++--------------------------- source/Irrlicht/CSceneManager.h | 12 +------- 6 files changed, 14 insertions(+), 74 deletions(-) diff --git a/examples/AutomatedTest/main.cpp b/examples/AutomatedTest/main.cpp index 0141b2b..5df7a29 100644 --- a/examples/AutomatedTest/main.cpp +++ b/examples/AutomatedTest/main.cpp @@ -85,8 +85,12 @@ int main(int argc, char *argv[]) const io::path mediaPath = getExampleMediaPath(); - scene::IAnimatedMesh* mesh = smgr->getMesh(mediaPath + "coolguy_opt.x"); + auto mesh_file = device->getFileSystem()->createAndOpenFile(mediaPath + "coolguy_opt.x"); + check(mesh_file, "mesh file loading"); + scene::IAnimatedMesh* mesh = smgr->getMesh(mesh_file); check(mesh, "mesh loading"); + if (mesh_file) + mesh_file->drop(); if (mesh) { video::ITexture* tex = driver->getTexture(mediaPath + "cooltexture.png"); diff --git a/include/ISceneManager.h b/include/ISceneManager.h index 60d2d49..9379a9c 100644 --- a/include/ISceneManager.h +++ b/include/ISceneManager.h @@ -318,20 +318,10 @@ namespace scene * \endcode * If you would like to implement and add your own file format loader to Irrlicht, * see addExternalMeshLoader(). - * \param filename: Filename of the mesh to load. - * \param alternativeCacheName: In case you want to have the mesh under another name in the cache (to create real copies) + * \param file File handle of the mesh to load. * \return Null if failed, otherwise pointer to the mesh. * This pointer should not be dropped. See IReferenceCounted::drop() for more information. **/ - virtual IAnimatedMesh* getMesh(const io::path& filename, const io::path& alternativeCacheName=io::path("")) = 0; - - //! Get pointer to an animateable mesh. Loads the file if not loaded already. - /** Works just as getMesh(const char* filename). If you want to - remove a loaded mesh from the cache again, use removeMesh(). - \param file File handle of the mesh to load. - \return NULL if failed and pointer to the mesh if successful. - This pointer should not be dropped. See - IReferenceCounted::drop() for more information. */ virtual IAnimatedMesh* getMesh(io::IReadFile* file) = 0; //! Get interface to the mesh cache which is shared between all existing scene managers. @@ -345,11 +335,6 @@ namespace scene This pointer should not be dropped. See IReferenceCounted::drop() for more information. */ virtual video::IVideoDriver* getVideoDriver() = 0; - //! Get the active FileSystem - /** \return Pointer to the FileSystem - This pointer should not be dropped. See IReferenceCounted::drop() for more information. */ - virtual io::IFileSystem* getFileSystem() = 0; - //! Adds a scene node for rendering an animated mesh model. /** \param mesh: Pointer to the loaded animated mesh to be displayed. \param parent: Parent of the scene node. Can be NULL if no parent. diff --git a/source/Irrlicht/CIrrDeviceStub.cpp b/source/Irrlicht/CIrrDeviceStub.cpp index 6990673..3fde44a 100644 --- a/source/Irrlicht/CIrrDeviceStub.cpp +++ b/source/Irrlicht/CIrrDeviceStub.cpp @@ -92,7 +92,7 @@ void CIrrDeviceStub::createGUIAndScene() GUIEnvironment = gui::createGUIEnvironment(FileSystem, VideoDriver, Operator); // create Scene manager - SceneManager = scene::createSceneManager(VideoDriver, FileSystem, CursorControl); + SceneManager = scene::createSceneManager(VideoDriver, CursorControl); setEventReceiver(UserReceiver); } diff --git a/source/Irrlicht/CIrrDeviceStub.h b/source/Irrlicht/CIrrDeviceStub.h index fd069b1..10e5d72 100644 --- a/source/Irrlicht/CIrrDeviceStub.h +++ b/source/Irrlicht/CIrrDeviceStub.h @@ -24,7 +24,7 @@ namespace irr namespace scene { - ISceneManager* createSceneManager(video::IVideoDriver* driver, io::IFileSystem* fs, gui::ICursorControl* cc); + ISceneManager* createSceneManager(video::IVideoDriver* driver, gui::ICursorControl* cc); } namespace io diff --git a/source/Irrlicht/CSceneManager.cpp b/source/Irrlicht/CSceneManager.cpp index 568c754..8a16dd2 100644 --- a/source/Irrlicht/CSceneManager.cpp +++ b/source/Irrlicht/CSceneManager.cpp @@ -33,9 +33,9 @@ namespace scene { //! constructor -CSceneManager::CSceneManager(video::IVideoDriver* driver, io::IFileSystem* fs, +CSceneManager::CSceneManager(video::IVideoDriver* driver, gui::ICursorControl* cursorControl, IMeshCache* cache) -: ISceneNode(0, 0), Driver(driver), FileSystem(fs), +: ISceneNode(0, 0), Driver(driver), CursorControl(cursorControl), ActiveCamera(0), ShadowColor(150,0,0,0), AmbientLight(0,0,0,0), Parameters(0), MeshCache(cache), CurrentRenderPass(ESNRP_NONE) @@ -51,9 +51,6 @@ CSceneManager::CSceneManager(video::IVideoDriver* driver, io::IFileSystem* fs, if (Driver) Driver->grab(); - if (FileSystem) - FileSystem->grab(); - if (CursorControl) CursorControl->grab(); @@ -92,9 +89,6 @@ CSceneManager::~CSceneManager() if (Driver) Driver->removeAllHardwareBuffers(); - if (FileSystem) - FileSystem->drop(); - if (CursorControl) CursorControl->drop(); @@ -125,29 +119,6 @@ CSceneManager::~CSceneManager() } -//! gets an animateable mesh. loads it if needed. returned pointer must not be dropped. -IAnimatedMesh* CSceneManager::getMesh(const io::path& filename, const io::path& alternativeCacheName) -{ - io::path cacheName = alternativeCacheName.empty() ? filename : alternativeCacheName; - IAnimatedMesh* msh = MeshCache->getMeshByName(cacheName); - if (msh) - return msh; - - io::IReadFile* file = FileSystem->createAndOpenFile(filename); - if (!file) - { - os::Printer::log("Could not load mesh, because file could not be opened: ", filename, ELL_ERROR); - return 0; - } - - msh = getUncachedMesh(file, filename, cacheName); - - file->drop(); - - return msh; -} - - //! gets an animateable mesh. loads it if needed. returned pointer must not be dropped. IAnimatedMesh* CSceneManager::getMesh(io::IReadFile* file) { @@ -202,15 +173,6 @@ video::IVideoDriver* CSceneManager::getVideoDriver() } -//! Get the active FileSystem -/** \return Pointer to the FileSystem -This pointer should not be dropped. See IReferenceCounted::drop() for more information. */ -io::IFileSystem* CSceneManager::getFileSystem() -{ - return FileSystem; -} - - //! adds a scene node for rendering a static mesh //! the returned pointer must not be dropped. IMeshSceneNode* CSceneManager::addMeshSceneNode(IMesh* mesh, ISceneNode* parent, s32 id, @@ -875,7 +837,7 @@ IMeshCache* CSceneManager::getMeshCache() //! Creates a new scene manager. ISceneManager* CSceneManager::createNewSceneManager(bool cloneContent) { - CSceneManager* manager = new CSceneManager(Driver, FileSystem, CursorControl, MeshCache); + CSceneManager* manager = new CSceneManager(Driver, CursorControl, MeshCache); if (cloneContent) manager->cloneMembers(this, manager); @@ -912,10 +874,9 @@ IMeshWriter* CSceneManager::createMeshWriter(EMESH_WRITER_TYPE type) // creates a scenemanager -ISceneManager* createSceneManager(video::IVideoDriver* driver, - io::IFileSystem* fs, gui::ICursorControl* cursorcontrol) +ISceneManager* createSceneManager(video::IVideoDriver* driver, gui::ICursorControl* cursorcontrol) { - return new CSceneManager(driver, fs, cursorcontrol, nullptr); + return new CSceneManager(driver, cursorcontrol, nullptr); } diff --git a/source/Irrlicht/CSceneManager.h b/source/Irrlicht/CSceneManager.h index 1a74995..4b1beec 100644 --- a/source/Irrlicht/CSceneManager.h +++ b/source/Irrlicht/CSceneManager.h @@ -31,15 +31,11 @@ namespace scene public: //! constructor - CSceneManager(video::IVideoDriver* driver, io::IFileSystem* fs, - gui::ICursorControl* cursorControl, IMeshCache* cache = nullptr); + CSceneManager(video::IVideoDriver* driver, gui::ICursorControl* cursorControl, IMeshCache* cache = 0); //! destructor virtual ~CSceneManager(); - //! gets an animateable mesh. loads it if needed. returned pointer must not be dropped. - IAnimatedMesh* getMesh(const io::path& filename, const io::path& alternativeCacheName) override; - //! gets an animateable mesh. loads it if needed. returned pointer must not be dropped. IAnimatedMesh* getMesh(io::IReadFile* file) override; @@ -49,9 +45,6 @@ namespace scene //! returns the video driver video::IVideoDriver* getVideoDriver() override; - //! return the filesystem - io::IFileSystem* getFileSystem() override; - //! adds a scene node for rendering an animated mesh model virtual IAnimatedMeshSceneNode* addAnimatedMeshSceneNode(IAnimatedMesh* mesh, ISceneNode* parent=0, s32 id=-1, const core::vector3df& position = core::vector3df(0,0,0), @@ -278,9 +271,6 @@ namespace scene //! video driver video::IVideoDriver* Driver; - //! file system - io::IFileSystem* FileSystem; - //! cursor control gui::ICursorControl* CursorControl;