From 41844de6a5e87361456d909958dab258614e00e0 Mon Sep 17 00:00:00 2001 From: Benau Date: Fri, 17 Mar 2017 13:08:08 +0800 Subject: [PATCH] Apply real fix from Stragus for normal map --- lib/graphics_utils/mipmap/imgresize.c | 2 +- lib/irrlicht/include/IImageLoader.h | 2 +- .../source/Irrlicht/CImageLoaderBMP.cpp | 2 +- .../source/Irrlicht/CImageLoaderBMP.h | 2 +- .../source/Irrlicht/CImageLoaderJPG.cpp | 2 +- .../source/Irrlicht/CImageLoaderJPG.h | 2 +- .../source/Irrlicht/CImageLoaderPNG.cpp | 23 +++++++--------- .../source/Irrlicht/CImageLoaderPNG.h | 2 +- src/graphics/hq_mipmap_generator.cpp | 26 ++++++------------- src/graphics/stk_texture.cpp | 19 ++------------ src/graphics/stk_texture.hpp | 2 -- 11 files changed, 27 insertions(+), 57 deletions(-) diff --git a/lib/graphics_utils/mipmap/imgresize.c b/lib/graphics_utils/mipmap/imgresize.c index ddc7263c8..b376bc46d 100644 --- a/lib/graphics_utils/mipmap/imgresize.c +++ b/lib/graphics_utils/mipmap/imgresize.c @@ -1591,7 +1591,7 @@ static void imStaticKernel4Normal( unsigned char *dst, int pointx, int pointy, i } #if CPU_SSE2_SUPPORT - vsum = _mm_sub_ps( vsum, _mm_set_ps( 1.0f/255.0f, 1.0f/255.0f, 1.0f/255.0f, 0.0f ) ); + vsum = _mm_sub_ps( vsum, _mm_set_ps( 0.0f, 0.5f*255.0f, 0.5f*255.0f, 0.5f*255.0f ) ); sum0 = _mm_cvtss_f32( vsum ); #if CPU_SSE3_SUPPORT sum1 = _mm_cvtss_f32( _mm_movehdup_ps( vsum ) ); diff --git a/lib/irrlicht/include/IImageLoader.h b/lib/irrlicht/include/IImageLoader.h index 40872a132..ba0da6886 100644 --- a/lib/irrlicht/include/IImageLoader.h +++ b/lib/irrlicht/include/IImageLoader.h @@ -42,7 +42,7 @@ public: //! Creates a surface from the file /** \param file File handle to check. \return Pointer to newly created image, or 0 upon error. */ - virtual IImage* loadImage(io::IReadFile* file, bool skip_checking = false, bool gamma_correction = true) const = 0; + virtual IImage* loadImage(io::IReadFile* file, bool skip_checking = false) const = 0; virtual core::dimension2du getImageSize(io::IReadFile* file) const { return core::dimension2du(0, 0); } virtual bool supportThreadedLoading() const { return false; } }; diff --git a/lib/irrlicht/source/Irrlicht/CImageLoaderBMP.cpp b/lib/irrlicht/source/Irrlicht/CImageLoaderBMP.cpp index 2b7e2a838..7bed41196 100644 --- a/lib/irrlicht/source/Irrlicht/CImageLoaderBMP.cpp +++ b/lib/irrlicht/source/Irrlicht/CImageLoaderBMP.cpp @@ -216,7 +216,7 @@ void CImageLoaderBMP::decompress4BitRLE(u8*& bmpData, s32 size, s32 width, s32 h //! creates a surface from the file -IImage* CImageLoaderBMP::loadImage(io::IReadFile* file, bool skip_checking, bool gamma_correction) const +IImage* CImageLoaderBMP::loadImage(io::IReadFile* file, bool skip_checking) const { SBMPHeader header; diff --git a/lib/irrlicht/source/Irrlicht/CImageLoaderBMP.h b/lib/irrlicht/source/Irrlicht/CImageLoaderBMP.h index a6275913a..c5708dcc5 100644 --- a/lib/irrlicht/source/Irrlicht/CImageLoaderBMP.h +++ b/lib/irrlicht/source/Irrlicht/CImageLoaderBMP.h @@ -81,7 +81,7 @@ public: virtual bool isALoadableFileFormat(io::IReadFile* file) const; //! creates a surface from the file - virtual IImage* loadImage(io::IReadFile* file, bool skip_checking = false, bool gamma_correction = true) const; + virtual IImage* loadImage(io::IReadFile* file, bool skip_checking = false) const; private: diff --git a/lib/irrlicht/source/Irrlicht/CImageLoaderJPG.cpp b/lib/irrlicht/source/Irrlicht/CImageLoaderJPG.cpp index 958adc8a7..f9e77dff0 100644 --- a/lib/irrlicht/source/Irrlicht/CImageLoaderJPG.cpp +++ b/lib/irrlicht/source/Irrlicht/CImageLoaderJPG.cpp @@ -135,7 +135,7 @@ bool CImageLoaderJPG::isALoadableFileFormat(io::IReadFile* file) const } //! creates a surface from the file -IImage* CImageLoaderJPG::loadImage(io::IReadFile* file, bool skip_checking, bool gamma_correction) const +IImage* CImageLoaderJPG::loadImage(io::IReadFile* file, bool skip_checking) const { #ifndef _IRR_COMPILE_WITH_LIBJPEG_ os::Printer::log("Can't load as not compiled with _IRR_COMPILE_WITH_LIBJPEG_:", file->getFileName(), ELL_DEBUG); diff --git a/lib/irrlicht/source/Irrlicht/CImageLoaderJPG.h b/lib/irrlicht/source/Irrlicht/CImageLoaderJPG.h index e548635ae..d15c06dbe 100644 --- a/lib/irrlicht/source/Irrlicht/CImageLoaderJPG.h +++ b/lib/irrlicht/source/Irrlicht/CImageLoaderJPG.h @@ -49,7 +49,7 @@ public: virtual bool isALoadableFileFormat(io::IReadFile* file) const; //! creates a surface from the file - virtual IImage* loadImage(io::IReadFile* file, bool skip_checking = false, bool gamma_correction = true) const; + virtual IImage* loadImage(io::IReadFile* file, bool skip_checking = false) const; private: diff --git a/lib/irrlicht/source/Irrlicht/CImageLoaderPNG.cpp b/lib/irrlicht/source/Irrlicht/CImageLoaderPNG.cpp index e14ac78a2..b4c873135 100644 --- a/lib/irrlicht/source/Irrlicht/CImageLoaderPNG.cpp +++ b/lib/irrlicht/source/Irrlicht/CImageLoaderPNG.cpp @@ -86,7 +86,7 @@ bool CImageLoaderPng::isALoadableFileFormat(io::IReadFile* file) const // load in the image data -IImage* CImageLoaderPng::loadImage(io::IReadFile* file, bool skip_checking, bool gamma_correction) const +IImage* CImageLoaderPng::loadImage(io::IReadFile* file, bool skip_checking) const { #ifdef _IRR_COMPILE_WITH_LIBPNG_ if (!file) @@ -174,20 +174,18 @@ IImage* CImageLoaderPng::loadImage(io::IReadFile* file, bool skip_checking, bool if (ColorType==PNG_COLOR_TYPE_GRAY || ColorType==PNG_COLOR_TYPE_GRAY_ALPHA) png_set_gray_to_rgb(png_ptr); - if (gamma_correction) + int intent; + const double screen_gamma = 2.2; + + if (png_get_sRGB(png_ptr, info_ptr, &intent)) + png_set_gamma(png_ptr, screen_gamma, 0.45455); + else { - int intent; - const double screen_gamma = 2.2; - if (png_get_sRGB(png_ptr, info_ptr, &intent)) - png_set_gamma(png_ptr, screen_gamma, 0.45455); + double image_gamma; + if (png_get_gAMA(png_ptr, info_ptr, &image_gamma)) + png_set_gamma(png_ptr, screen_gamma, image_gamma); else - { - double image_gamma; - if (png_get_gAMA(png_ptr, info_ptr, &image_gamma)) - png_set_gamma(png_ptr, screen_gamma, image_gamma); - else png_set_gamma(png_ptr, screen_gamma, 0.45455); - } } // Update the changes in between, as we need to get the new color type @@ -299,4 +297,3 @@ IImageLoader* createImageLoaderPNG() }//end namespace video #endif - diff --git a/lib/irrlicht/source/Irrlicht/CImageLoaderPNG.h b/lib/irrlicht/source/Irrlicht/CImageLoaderPNG.h index f2e5ff7ca..789cfdd18 100644 --- a/lib/irrlicht/source/Irrlicht/CImageLoaderPNG.h +++ b/lib/irrlicht/source/Irrlicht/CImageLoaderPNG.h @@ -33,7 +33,7 @@ public: virtual bool isALoadableFileFormat(io::IReadFile* file) const; //! creates a surface from the file - virtual IImage* loadImage(io::IReadFile* file, bool skip_checking = false, bool gamma_correction = true) const; + virtual IImage* loadImage(io::IReadFile* file, bool skip_checking = false) const; virtual core::dimension2du getImageSize(io::IReadFile* file) const; virtual bool supportThreadedLoading() const { return true; } }; diff --git a/src/graphics/hq_mipmap_generator.cpp b/src/graphics/hq_mipmap_generator.cpp index d710c4981..d0531d9b4 100644 --- a/src/graphics/hq_mipmap_generator.cpp +++ b/src/graphics/hq_mipmap_generator.cpp @@ -19,7 +19,7 @@ #include "graphics/hq_mipmap_generator.hpp" #include "graphics/stk_tex_manager.hpp" -#define DUMP_MIPMAP +#undef DUMP_MIPMAP #ifdef DUMP_MIPMAP #include "graphics/irr_driver.hpp" #include "utils/string_utils.hpp" @@ -61,9 +61,12 @@ HQMipmapGenerator::HQMipmapGenerator(const io::path& name, uint8_t* data, void HQMipmapGenerator::threadedReload(void* ptr, void* param) const { imReduceOptions options; - imReduceSetOptions(&options, m_tex_config->m_normal_map ? - IM_REDUCE_FILTER_NORMALMAP: IM_REDUCE_FILTER_SRGB, - 2, 2.0f, 0.0f, 0.0f); + imReduceSetOptions(&options, + m_tex_config->m_normal_map ? + IM_REDUCE_FILTER_NORMALMAP: m_tex_config->m_srgb ? + IM_REDUCE_FILTER_SRGB : IM_REDUCE_FILTER_LINEAR/*filter*/, + 2/*hopcount*/, 2.0f/*alpha*/, 1.0f/*amplifynormal*/, + 0.0f/*normalsustainfactor*/); imMipmapCascade* mm_cascade = (imMipmapCascade*)m_mipmap_data; #ifdef DEBUG int ret = imBuildMipmapCascade(mm_cascade, m_orig_data, m_size.Width, @@ -79,22 +82,9 @@ void HQMipmapGenerator::threadedReload(void* ptr, void* param) const memcpy((uint8_t*)ptr + m_mipmap_sizes[i].second, mm_cascade->mipmap[i + 1], size); #ifdef DUMP_MIPMAP - uint8_t* data = (uint8_t*)(mm_cascade->mipmap[i + 1]); - if (!m_tex_config->m_srgb) - { - for (unsigned int j = 0; j < size / 4; j++) - { - data[j * 4] = - (uint8_t)(powf(data[j * 4] / 255.f , 2.2f) * 255); - data[j * 4 + 1] = - (uint8_t)(powf(data[j * 4 + 1] / 255.f , 2.2f) * 255); - data[j * 4 + 2] = - (uint8_t)(powf(data[j * 4 + 2] / 255.f , 2.2f) * 255); - } - } video::IImage* image = irr_driver->getVideoDriver() ->createImageFromData(video::ECF_A8R8G8B8, m_mipmap_sizes[i].first, - data, false/*ownForeignMemory*/); + mm_cascade->mipmap[i + 1], false/*ownForeignMemory*/); irr_driver->getVideoDriver()->writeImageToFile(image, std::string (StringUtils::toString(i) + "_" + StringUtils::getBasename(NamedPath.getPtr())).c_str()); diff --git a/src/graphics/stk_texture.cpp b/src/graphics/stk_texture.cpp index 6b15f4e98..3a6a078f7 100644 --- a/src/graphics/stk_texture.cpp +++ b/src/graphics/stk_texture.cpp @@ -187,8 +187,7 @@ void STKTexture::reload(bool no_upload, uint8_t* preload_data, } else { - orig_img = m_img_loader->loadImage(m_file, - false/*skip_checking*/, handleGamma()); + orig_img = m_img_loader->loadImage(m_file); m_file->drop(); m_file = NULL; if (orig_img == NULL || orig_img->getDimension().Width == 0 || @@ -598,7 +597,7 @@ void STKTexture::threadedReload(void* ptr, void* param) const { #if !(defined(SERVER_ONLY) || defined(USE_GLES2)) video::IImage* orig_img = - m_img_loader->loadImage(m_file, true/*skip_checking*/, handleGamma()); + m_img_loader->loadImage(m_file, true/*skip_checking*/); orig_img = resizeImage(orig_img); uint8_t* data = (uint8_t*)orig_img->lock(); if (m_single_channel) @@ -678,17 +677,3 @@ bool STKTexture::isMeshTexture() const { return m_tex_config && m_tex_config->m_mesh_tex; } // isMeshTexture - -//----------------------------------------------------------------------------- -bool STKTexture::handleGamma() const -{ -#ifndef SERVER_ONLY - if (!CVS->isGLSL() || !m_tex_config) -#endif - return true; - - if ((m_tex_config->m_mesh_tex && m_tex_config->m_srgb) || - (!m_tex_config->m_mesh_tex && !m_tex_config->m_srgb)) - return true; - return false; -} // handleGamma diff --git a/src/graphics/stk_texture.hpp b/src/graphics/stk_texture.hpp index 52f3dfb8b..3eb09c0b2 100644 --- a/src/graphics/stk_texture.hpp +++ b/src/graphics/stk_texture.hpp @@ -85,8 +85,6 @@ private: bool isSrgb() const; // ------------------------------------------------------------------------ bool isPremulAlpha() const; - // ------------------------------------------------------------------------ - bool handleGamma() const; public: // ------------------------------------------------------------------------