Fixed: If mask is using colors, convert it to grayscale using Red value (compatible with previous algorithm)

--HG--
branch : develop
hg/feature/material-editor
kervala 9 years ago
parent ed98662de3
commit aaa9c394d7

@ -791,41 +791,49 @@ static void BuildColoredVersionForOneBitmap(const CBuildInfo &bi, const std::str
throw NLMISC::Exception("Failed to load mask"); throw NLMISC::Exception("Failed to load mask");
} }
// masks can be converted to grayscale files // convert color mask to grayscale (red is the new gray value)
if (bi.OptimizeTextures > 0 && maskDepth > 8) if (li.Mask.getPixelFormat() == CBitmap::RGBA)
{ {
if (!li.Mask.isGrayscale()) // display a warning if checks enabled
if (bi.OptimizeTextures > 0 && !li.Mask.isGrayscale())
{ {
nlwarning("Mask %s is using colors, results may by incorrect! Use OptimizeTextures = 2 to fix it.", maskFileName.c_str()); nlwarning("Mask %s is using colors, results may by incorrect! Use OptimizeTextures = 2 to fix it.", maskFileName.c_str());
} }
if (bi.OptimizeTextures > 1) // get a pointer on original data
{ uint32 size = li.Mask.getPixels().size();
// get a pointer on original data uint32 *data = (uint32*)li.Mask.getPixels().getPtr();
uint32 size = li.Mask.getPixels().size(); uint32 *endData = (uint32*)((uint8*)data + size);
uint32 *data = (uint32*)li.Mask.getPixels().getPtr();
uint32 *endData = (uint32*)((uint8*)data + size);
NLMISC::CRGBA *color = NULL; NLMISC::CRGBA *color = NULL;
// process all pixels // process all pixels
while(data < endData) while(data < endData)
{ {
color = (NLMISC::CRGBA*)data; color = (NLMISC::CRGBA*)data;
// copy red value to green and blue, // copy red value to green and blue,
// because only red is used for mask // because only red is used for mask
color->B = color->G = color->R; color->B = color->G = color->R;
// make opaque // make opaque
color->A = 255; color->A = 255;
++data; ++data;
} }
}
// convert image to real grayscale // convert image to real grayscale
li.Mask.convertToType(NLMISC::CBitmap::Luminance); if (li.Mask.PixelFormat != NLMISC::CBitmap::Luminance)
{
li.Mask.convertToType(NLMISC::CBitmap::Luminance);
}
// masks can be converted to grayscale files
if (bi.OptimizeTextures > 0 && maskDepth > 8)
{
if (bi.OptimizeTextures > 1)
{
NLMISC::COFile os; NLMISC::COFile os;
if (os.open(maskFileName)) if (os.open(maskFileName))
@ -855,11 +863,6 @@ static void BuildColoredVersionForOneBitmap(const CBuildInfo &bi, const std::str
} }
} }
if (li.Mask.PixelFormat != NLMISC::CBitmap::Luminance)
{
li.Mask.convertToType(NLMISC::CBitmap::Luminance);
}
/// make sure the mask has the same size /// make sure the mask has the same size
if (li.Mask.getWidth() != srcBitmap.getWidth() if (li.Mask.getWidth() != srcBitmap.getWidth()
|| li.Mask.getHeight() != srcBitmap.getHeight()) || li.Mask.getHeight() != srcBitmap.getHeight())

Loading…
Cancel
Save