Apply real fix from Stragus for normal map

This commit is contained in:
Benau 2017-03-17 13:08:08 +08:00
parent e1a563612f
commit 41844de6a5
11 changed files with 27 additions and 57 deletions

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -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());

View File

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

View File

@ -85,8 +85,6 @@ private:
bool isSrgb() const;
// ------------------------------------------------------------------------
bool isPremulAlpha() const;
// ------------------------------------------------------------------------
bool handleGamma() const;
public:
// ------------------------------------------------------------------------