From: Thomas Debesse Date: Thu, 21 May 2020 22:43:20 +0000 (+0200) Subject: radiant/image: load fallback images with png loader even if game does not support... X-Git-Url: http://git.xonotic.org/?p=xonotic%2Fnetradiant.git;a=commitdiff_plain;h=09c7358f15264e0436c4f1b762d942e2570af831 radiant/image: load fallback images with png loader even if game does not support png, fix #141 Current implementation has a minor issue, when "Hide Fallback" option is disabled, the fallback image does not appear in texture browser before radiant makes use of it (for example creating a brush before selecting a texture). Since "Hide Fallback" option is enabled by default and it never makes sense to apply those fallback intentionally, I don't care for the moment. I would like to see a better implementation that would work for all editor images (like the one set with `qer_editorImage` shader keyword). --- diff --git a/radiant/image.cpp b/radiant/image.cpp index c81b3617..c9014294 100644 --- a/radiant/image.cpp +++ b/radiant/image.cpp @@ -30,9 +30,9 @@ #include "os/path.h" #include "stream/stringstream.h" - typedef Modules<_QERPlugImageTable> ImageModules; ImageModules& Textures_getImageModules(); +ImageModules& Textures_getFallbackImageModules(); /// \brief Returns a new image for the first file matching \p name in one of the available texture formats, or 0 if no file is found. Image* QERApp_LoadImage( void* environment, const char* name ){ @@ -60,5 +60,12 @@ public: Textures_getImageModules().foreachModule( LoadImageVisitor( name, image ) ); + // Games can provide their own fallback, so only do this when previous + // loading attempt did not work. + if ( image == 0 && !!string_compare_nocase( name, "textures/radiant" ) ) + { + Textures_getFallbackImageModules().foreachModule( LoadImageVisitor( name, image ) ); + } + return image; } diff --git a/radiant/textures.cpp b/radiant/textures.cpp index 02f706b9..afa8d4e0 100644 --- a/radiant/textures.cpp +++ b/radiant/textures.cpp @@ -815,13 +815,18 @@ class TexturesDependencies : public GlobalPreferenceSystemModuleRef { ImageModulesRef m_image_modules; +ImageModulesRef m_fallback_image_modules; public: TexturesDependencies() : - m_image_modules( GlobalRadiant().getRequiredGameDescriptionKeyValue( "texturetypes" ) ){ + m_image_modules( GlobalRadiant().getRequiredGameDescriptionKeyValue( "texturetypes" ) ), + m_fallback_image_modules( "png" ){ } ImageModules& getImageModules(){ return m_image_modules.get(); } +ImageModules& getFallbackImageModules(){ + return m_fallback_image_modules.get(); +} }; class TexturesAPI @@ -851,3 +856,6 @@ StaticRegisterModule staticRegisterTextures( StaticTexturesModule::instance() ); ImageModules& Textures_getImageModules(){ return StaticTexturesModule::instance().getDependencies().getImageModules(); } +ImageModules& Textures_getFallbackImageModules(){ + return StaticTexturesModule::instance().getDependencies().getFallbackImageModules(); +}