From f2cc51a602b1e1cf3bd0534b7dc932ca0cd11fc5 Mon Sep 17 00:00:00 2001 From: Benau Date: Sun, 3 Apr 2022 10:54:27 +0800 Subject: [PATCH] Fix mismatched max size for background.jpg when reloading --- lib/graphics_engine/include/ge_texture.hpp | 1 + lib/graphics_engine/src/ge_dx9_texture.cpp | 5 ++++- lib/graphics_engine/src/ge_dx9_texture.hpp | 2 +- lib/graphics_engine/src/ge_gl_texture.cpp | 7 +++++-- lib/graphics_engine/src/ge_gl_texture.hpp | 2 +- lib/graphics_engine/src/ge_texture.cpp | 5 +---- lib/graphics_engine/src/ge_vulkan_texture.cpp | 5 ++++- lib/graphics_engine/src/ge_vulkan_texture.hpp | 2 +- src/graphics/sp_mesh_loader.cpp | 5 ++++- src/tracks/track.cpp | 3 ++- 10 files changed, 24 insertions(+), 13 deletions(-) diff --git a/lib/graphics_engine/include/ge_texture.hpp b/lib/graphics_engine/include/ge_texture.hpp index 9425ef13b..8a5e51aa2 100644 --- a/lib/graphics_engine/include/ge_texture.hpp +++ b/lib/graphics_engine/include/ge_texture.hpp @@ -13,6 +13,7 @@ irr::video::ITexture* createFontTexture(const std::string& name, irr::video::ITexture* createTexture(irr::video::IImage* img, const std::string& name); irr::video::IImage* getResizedImage(const std::string& path, + const irr::core::dimension2d& max_size, irr::core::dimension2d* orig_size = NULL); irr::video::ITexture* createTexture(const std::string& path, std::function image_mani = nullptr); diff --git a/lib/graphics_engine/src/ge_dx9_texture.cpp b/lib/graphics_engine/src/ge_dx9_texture.cpp index 0e1e540d6..b7c141a5a 100644 --- a/lib/graphics_engine/src/ge_dx9_texture.cpp +++ b/lib/graphics_engine/src/ge_dx9_texture.cpp @@ -5,6 +5,7 @@ #include "ge_main.hpp" #include "ge_texture.hpp" +#include #include namespace GE @@ -15,6 +16,8 @@ GEDX9Texture::GEDX9Texture(const std::string& path, m_device_9(NULL), m_texture_9(NULL), m_texture_size(0), m_disable_reload(false) { + m_max_size = getDriver()->getDriverAttributes() + .getAttributeAsDimension2d("MAX_TEXTURE_SIZE"); getDevice9(); reload(); } // GEDX9Texture @@ -87,7 +90,7 @@ void GEDX9Texture::reload() if (!m_device_9 || m_disable_reload) return; video::IImage* texture_image = getResizedImage(NamedPath.getPtr(), - &m_orig_size); + m_max_size, &m_orig_size); if (texture_image == NULL) return; m_size = texture_image->getDimension(); diff --git a/lib/graphics_engine/src/ge_dx9_texture.hpp b/lib/graphics_engine/src/ge_dx9_texture.hpp index 5e6776673..1be770183 100644 --- a/lib/graphics_engine/src/ge_dx9_texture.hpp +++ b/lib/graphics_engine/src/ge_dx9_texture.hpp @@ -17,7 +17,7 @@ namespace GE class GEDX9Texture : public video::ITexture { private: - core::dimension2d m_size, m_orig_size; + core::dimension2d m_size, m_orig_size, m_max_size; std::function m_image_mani; diff --git a/lib/graphics_engine/src/ge_gl_texture.cpp b/lib/graphics_engine/src/ge_gl_texture.cpp index 1b9789eb2..496b1cca5 100644 --- a/lib/graphics_engine/src/ge_gl_texture.cpp +++ b/lib/graphics_engine/src/ge_gl_texture.cpp @@ -3,6 +3,7 @@ #include "ge_main.hpp" #include "ge_texture.hpp" +#include #include // TODO remove it after vulkan is done @@ -20,6 +21,8 @@ GEGLTexture::GEGLTexture(const std::string& path, m_driver_type(GE::getDriver()->getDriverType()), m_disable_reload(false), m_single_channel(false) { + m_max_size = getDriver()->getDriverAttributes() + .getAttributeAsDimension2d("MAX_TEXTURE_SIZE"); reload(); } // GEGLTexture @@ -89,7 +92,7 @@ void GEGLTexture::reload() if (m_disable_reload) return; video::IImage* texture_image = getResizedImage(NamedPath.getPtr(), - &m_orig_size); + m_max_size, &m_orig_size); if (texture_image == NULL) return; m_size = texture_image->getDimension(); @@ -146,7 +149,7 @@ void* GEGLTexture::lock(video::E_TEXTURE_LOCK_MODE mode, u32 mipmap_level) if (m_driver_type == video::EDT_OGLES2 || !glGetTexImage) { - video::IImage* img = getResizedImage(NamedPath.getPtr()); + video::IImage* img = getResizedImage(NamedPath.getPtr(), m_max_size); if (!img) return NULL; img->setDeleteMemory(false); diff --git a/lib/graphics_engine/src/ge_gl_texture.hpp b/lib/graphics_engine/src/ge_gl_texture.hpp index 869e09eb3..6f1cff49a 100644 --- a/lib/graphics_engine/src/ge_gl_texture.hpp +++ b/lib/graphics_engine/src/ge_gl_texture.hpp @@ -14,7 +14,7 @@ namespace GE class GEGLTexture : public video::ITexture { private: - core::dimension2d m_size, m_orig_size; + core::dimension2d m_size, m_orig_size, m_max_size; std::function m_image_mani; diff --git a/lib/graphics_engine/src/ge_texture.cpp b/lib/graphics_engine/src/ge_texture.cpp index be5391c9e..f5c5ae301 100644 --- a/lib/graphics_engine/src/ge_texture.cpp +++ b/lib/graphics_engine/src/ge_texture.cpp @@ -5,12 +5,12 @@ #include "ge_texture.hpp" #include -#include namespace GE { using namespace irr; video::IImage* getResizedImage(const std::string& path, + const core::dimension2du& max_size, core::dimension2d* orig_size) { video::IImage* image = getDriver()->createImageFromFile(path.c_str()); @@ -24,9 +24,6 @@ video::IImage* getResizedImage(const std::string& path, getDriver()->queryFeature(video::EVDF_TEXTURE_NPOT); core::dimension2du tex_size = img_size.getOptimalSize(!has_npot); - const core::dimension2du& max_size = getDriver()->getDriverAttributes(). - getAttributeAsDimension2d("MAX_TEXTURE_SIZE"); - if (tex_size.Width > max_size.Width) tex_size.Width = max_size.Width; if (tex_size.Height > max_size.Height) diff --git a/lib/graphics_engine/src/ge_vulkan_texture.cpp b/lib/graphics_engine/src/ge_vulkan_texture.cpp index 4af7ac04a..fb3c405f9 100644 --- a/lib/graphics_engine/src/ge_vulkan_texture.cpp +++ b/lib/graphics_engine/src/ge_vulkan_texture.cpp @@ -5,6 +5,7 @@ #include "ge_main.hpp" #include "ge_texture.hpp" +#include #include #include @@ -19,6 +20,8 @@ GEVulkanTexture::GEVulkanTexture(const std::string& path, m_image_view(VK_NULL_HANDLE), m_texture_size(0), m_disable_reload(false), m_single_channel(false) { + m_max_size = getDriver()->getDriverAttributes() + .getAttributeAsDimension2d("MAX_TEXTURE_SIZE"); reloadInternal(); } // GEVulkanTexture @@ -322,7 +325,7 @@ void GEVulkanTexture::reloadInternal() clearVulkanData(); video::IImage* texture_image = getResizedImage(NamedPath.getPtr(), - &m_orig_size); + m_max_size, &m_orig_size); if (texture_image == NULL) return; m_size = texture_image->getDimension(); diff --git a/lib/graphics_engine/src/ge_vulkan_texture.hpp b/lib/graphics_engine/src/ge_vulkan_texture.hpp index efa13a24e..cb5690380 100644 --- a/lib/graphics_engine/src/ge_vulkan_texture.hpp +++ b/lib/graphics_engine/src/ge_vulkan_texture.hpp @@ -14,7 +14,7 @@ namespace GE class GEVulkanTexture : public video::ITexture { private: - core::dimension2d m_size, m_orig_size; + core::dimension2d m_size, m_orig_size, m_max_size; std::function m_image_mani; diff --git a/src/graphics/sp_mesh_loader.cpp b/src/graphics/sp_mesh_loader.cpp index e5f1f737b..add209de0 100644 --- a/src/graphics/sp_mesh_loader.cpp +++ b/src/graphics/sp_mesh_loader.cpp @@ -20,6 +20,7 @@ #include "graphics/sp/sp_mesh.hpp" #include "graphics/sp/sp_mesh_buffer.hpp" #include "graphics/central_settings.hpp" +#include "graphics/irr_driver.hpp" #include "graphics/material.hpp" #include "graphics/material_manager.hpp" #include "graphics/mesh_tools.hpp" @@ -171,7 +172,9 @@ scene::IAnimatedMesh* SPMeshLoader::createMesh(io::IReadFile* f) { image_mani = [mask_full_path](video::IImage* img)->void { - video::IImage* converted_mask = GE::getResizedImage(mask_full_path); + video::IImage* converted_mask = GE::getResizedImage(mask_full_path, + irr_driver->getVideoDriver()->getDriverAttributes() + .getAttributeAsDimension2d("MAX_TEXTURE_SIZE")); if (converted_mask == NULL) { Log::warn("SPMeshLoader", "Applying mask failed for '%s'!", diff --git a/src/tracks/track.cpp b/src/tracks/track.cpp index 081f1822e..7d9997bce 100644 --- a/src/tracks/track.cpp +++ b/src/tracks/track.cpp @@ -2965,6 +2965,7 @@ video::IImage* Track::getSkyTexture(std::string path) const path = file_manager->getFileSystem()->getAbsolutePath(relative_path) .c_str(); } - return GE::getResizedImage(path); + return GE::getResizedImage(path, irr_driver->getVideoDriver() + ->getDriverAttributes().getAttributeAsDimension2d("MAX_TEXTURE_SIZE")); #endif } // getSkyTexture