From d60a3a7c0cd3178a874400350260b7c0bd39891e Mon Sep 17 00:00:00 2001 From: Benau Date: Fri, 8 Apr 2022 14:56:24 +0800 Subject: [PATCH] Add loadingFailed function for ITexture --- lib/graphics_engine/src/ge_dx9_texture.cpp | 27 ++++++++++++++++++- lib/graphics_engine/src/ge_gl_texture.cpp | 6 +++++ lib/graphics_engine/src/ge_vulkan_texture.cpp | 6 +++++ lib/irrlicht/include/ITexture.h | 5 +++- src/graphics/stk_tex_manager.cpp | 2 +- 5 files changed, 43 insertions(+), 3 deletions(-) diff --git a/lib/graphics_engine/src/ge_dx9_texture.cpp b/lib/graphics_engine/src/ge_dx9_texture.cpp index b7c141a5a..9c57ae98d 100644 --- a/lib/graphics_engine/src/ge_dx9_texture.cpp +++ b/lib/graphics_engine/src/ge_dx9_texture.cpp @@ -30,14 +30,20 @@ GEDX9Texture::GEDX9Texture(video::IImage* img, const std::string& name) { getDevice9(); if (!m_device_9 || !img) + { + LoadingFailed = true; return; + } uint8_t* data = NULL; m_size = m_orig_size = img->getDimension(); HRESULT hr = m_device_9->CreateTexture(m_size.Width, m_size.Height, 0, D3DUSAGE_AUTOGENMIPMAP, D3DFMT_A8R8G8B8, D3DPOOL_MANAGED, &m_texture_9, NULL); if (FAILED(hr)) + { + LoadingFailed = true; goto exit; + } data = (uint8_t*)img->lock(); upload(data); exit: @@ -53,7 +59,10 @@ GEDX9Texture::GEDX9Texture(const std::string& name, unsigned int size) { getDevice9(); if (!m_device_9) + { + LoadingFailed = true; return; + } m_orig_size.Width = size; m_orig_size.Height = size; m_size = m_orig_size; @@ -61,7 +70,10 @@ GEDX9Texture::GEDX9Texture(const std::string& name, unsigned int size) 0, D3DUSAGE_AUTOGENMIPMAP, D3DFMT_A8R8G8B8, D3DPOOL_MANAGED, &m_texture_9, NULL); if (FAILED(hr)) + { + LoadingFailed = true; return; + } std::vector data; data.resize(size * size * 4, 0); upload(data.data()); @@ -87,12 +99,22 @@ void GEDX9Texture::getDevice9() // ---------------------------------------------------------------------------- void GEDX9Texture::reload() { - if (!m_device_9 || m_disable_reload) + if (m_disable_reload) return; + + if (!m_device_9) + { + LoadingFailed = true; + return; + } + video::IImage* texture_image = getResizedImage(NamedPath.getPtr(), m_max_size, &m_orig_size); if (texture_image == NULL) + { + LoadingFailed = true; return; + } m_size = texture_image->getDimension(); if (m_image_mani) m_image_mani(texture_image); @@ -106,7 +128,10 @@ void GEDX9Texture::reload() 0, D3DUSAGE_AUTOGENMIPMAP, D3DFMT_A8R8G8B8, D3DPOOL_MANAGED, &m_texture_9, NULL); if (FAILED(hr)) + { + LoadingFailed = true; goto exit; + } upload(data); exit: texture_image->unlock(); diff --git a/lib/graphics_engine/src/ge_gl_texture.cpp b/lib/graphics_engine/src/ge_gl_texture.cpp index 496b1cca5..1dc957608 100644 --- a/lib/graphics_engine/src/ge_gl_texture.cpp +++ b/lib/graphics_engine/src/ge_gl_texture.cpp @@ -34,7 +34,10 @@ GEGLTexture::GEGLTexture(video::IImage* img, const std::string& name) m_disable_reload(true), m_single_channel(false) { if (!img) + { + LoadingFailed = true; return; + } glGenTextures(1, &m_texture_name); m_size = m_orig_size = img->getDimension(); uint8_t* data = (uint8_t*)img->lock(); @@ -94,7 +97,10 @@ void GEGLTexture::reload() video::IImage* texture_image = getResizedImage(NamedPath.getPtr(), m_max_size, &m_orig_size); if (texture_image == NULL) + { + LoadingFailed = true; return; + } m_size = texture_image->getDimension(); if (m_image_mani) m_image_mani(texture_image); diff --git a/lib/graphics_engine/src/ge_vulkan_texture.cpp b/lib/graphics_engine/src/ge_vulkan_texture.cpp index d5e022106..5e84cb630 100644 --- a/lib/graphics_engine/src/ge_vulkan_texture.cpp +++ b/lib/graphics_engine/src/ge_vulkan_texture.cpp @@ -35,7 +35,10 @@ GEVulkanTexture::GEVulkanTexture(video::IImage* img, const std::string& name) m_disable_reload(true), m_single_channel(false) { if (!img) + { + LoadingFailed = true; return; + } m_size = m_orig_size = img->getDimension(); uint8_t* data = (uint8_t*)img->lock(); upload(data); @@ -329,7 +332,10 @@ void GEVulkanTexture::reloadInternal() video::IImage* texture_image = getResizedImage(NamedPath.getPtr(), m_max_size, &m_orig_size); if (texture_image == NULL) + { + LoadingFailed = true; return; + } m_size = texture_image->getDimension(); if (m_image_mani) m_image_mani(texture_image); diff --git a/lib/irrlicht/include/ITexture.h b/lib/irrlicht/include/ITexture.h index 00f41a4c4..a538889fc 100644 --- a/lib/irrlicht/include/ITexture.h +++ b/lib/irrlicht/include/ITexture.h @@ -100,7 +100,7 @@ class ITexture : public virtual IReferenceCounted public: //! constructor - ITexture(const io::path& name) : NamedPath(name) + ITexture(const io::path& name) : NamedPath(name), LoadingFailed(false) { } @@ -202,6 +202,8 @@ public: virtual void updateTexture(void* data, ECOLOR_FORMAT format, u32 w, u32 h, u32 x, u32 y) {} virtual void reload() {} + + virtual bool loadingFailed() const { return LoadingFailed; } protected: //! Helper function, helps to get the desired texture creation format from the flags. @@ -221,6 +223,7 @@ protected: } io::SNamedPath NamedPath; + bool LoadingFailed; }; diff --git a/src/graphics/stk_tex_manager.cpp b/src/graphics/stk_tex_manager.cpp index a37091541..c858bfab6 100644 --- a/src/graphics/stk_tex_manager.cpp +++ b/src/graphics/stk_tex_manager.cpp @@ -101,7 +101,7 @@ video::ITexture* STKTexManager::getTexture(const std::string& path, GE::createTexture(full_path.empty() ? path : full_path, image_mani); } - if (new_texture->getTextureHandler() == 0) + if (new_texture->loadingFailed()) { const char* name = new_texture->getName().getPtr(); if (!m_texture_error_message.empty())