Fix mismatched max size for background.jpg when reloading

This commit is contained in:
Benau 2022-04-03 10:54:27 +08:00
parent b6b565aabb
commit f2cc51a602
10 changed files with 24 additions and 13 deletions

View File

@ -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<irr::u32>& max_size,
irr::core::dimension2d<irr::u32>* orig_size = NULL);
irr::video::ITexture* createTexture(const std::string& path,
std::function<void(irr::video::IImage*)> image_mani = nullptr);

View File

@ -5,6 +5,7 @@
#include "ge_main.hpp"
#include "ge_texture.hpp"
#include <IAttributes.h>
#include <vector>
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();

View File

@ -17,7 +17,7 @@ namespace GE
class GEDX9Texture : public video::ITexture
{
private:
core::dimension2d<u32> m_size, m_orig_size;
core::dimension2d<u32> m_size, m_orig_size, m_max_size;
std::function<void(video::IImage*)> m_image_mani;

View File

@ -3,6 +3,7 @@
#include "ge_main.hpp"
#include "ge_texture.hpp"
#include <IAttributes.h>
#include <vector>
// 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);

View File

@ -14,7 +14,7 @@ namespace GE
class GEGLTexture : public video::ITexture
{
private:
core::dimension2d<u32> m_size, m_orig_size;
core::dimension2d<u32> m_size, m_orig_size, m_max_size;
std::function<void(video::IImage*)> m_image_mani;

View File

@ -5,12 +5,12 @@
#include "ge_texture.hpp"
#include <IVideoDriver.h>
#include <IAttributes.h>
namespace GE
{
using namespace irr;
video::IImage* getResizedImage(const std::string& path,
const core::dimension2du& max_size,
core::dimension2d<u32>* 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)

View File

@ -5,6 +5,7 @@
#include "ge_main.hpp"
#include "ge_texture.hpp"
#include <IAttributes.h>
#include <limits>
#include <vector>
@ -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();

View File

@ -14,7 +14,7 @@ namespace GE
class GEVulkanTexture : public video::ITexture
{
private:
core::dimension2d<u32> m_size, m_orig_size;
core::dimension2d<u32> m_size, m_orig_size, m_max_size;
std::function<void(video::IImage*)> m_image_mani;

View File

@ -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'!",

View File

@ -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