secondlife/viewer-issues#82: Don't allow transparent texture terrain
parent
2a325fdeba
commit
7792e62d3c
|
|
@ -990,6 +990,28 @@ void LLImageRaw::verticalFlip()
|
|||
}
|
||||
|
||||
|
||||
bool LLImageRaw::checkHasTransparentPixels()
|
||||
{
|
||||
if (getComponents() != 4)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
U8* data = getData();
|
||||
U32 pixels = getWidth() * getHeight();
|
||||
|
||||
// check alpha channel for all 255
|
||||
for (U32 i = 0; i < pixels; ++i)
|
||||
{
|
||||
if (data[i * 4 + 3] != 255)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
bool LLImageRaw::optimizeAwayAlpha()
|
||||
{
|
||||
if (getComponents() == 4)
|
||||
|
|
|
|||
|
|
@ -210,6 +210,8 @@ public:
|
|||
|
||||
void verticalFlip();
|
||||
|
||||
// Returns true if the image is not fully opaque
|
||||
bool checkHasTransparentPixels();
|
||||
// if the alpha channel is all 100% opaque, delete it
|
||||
// returns true if alpha channel was deleted
|
||||
bool optimizeAwayAlpha();
|
||||
|
|
|
|||
|
|
@ -1330,7 +1330,7 @@ BOOL LLPanelRegionTerrainInfo::validateTextureSizes()
|
|||
if (!texture_ctrl) continue;
|
||||
|
||||
LLUUID image_asset_id = texture_ctrl->getImageAssetID();
|
||||
LLViewerTexture* img = LLViewerTextureManager::getFetchedTexture(image_asset_id);
|
||||
LLViewerFetchedTexture* img = LLViewerTextureManager::getFetchedTexture(image_asset_id);
|
||||
S32 components = img->getComponents();
|
||||
// Must ask for highest resolution version's width. JC
|
||||
S32 width = img->getFullWidth();
|
||||
|
|
@ -1348,6 +1348,33 @@ BOOL LLPanelRegionTerrainInfo::validateTextureSizes()
|
|||
return FALSE;
|
||||
}
|
||||
|
||||
if (components == 4)
|
||||
{
|
||||
if (!img->hasSavedRawImage())
|
||||
{
|
||||
// Raw image isn't loaded yet
|
||||
// Assume it's invalid due to presence of alpha channel
|
||||
LLSD args;
|
||||
args["TEXTURE_NUM"] = i+1;
|
||||
args["TEXTURE_BIT_DEPTH"] = llformat("%d",components * 8);
|
||||
LLNotificationsUtil::add("InvalidTerrainAlphaNotFullyLoaded", args);
|
||||
return FALSE;
|
||||
}
|
||||
// Slower path: Calculate alpha from raw image pixels (not needed
|
||||
// for GLTF materials, which use alphaMode to determine
|
||||
// transparency)
|
||||
// Raw image is pretty much guaranteed to be saved due to the texture swatches
|
||||
LLImageRaw* raw = img->getSavedRawImage();
|
||||
if (raw->checkHasTransparentPixels())
|
||||
{
|
||||
LLSD args;
|
||||
args["TEXTURE_NUM"] = i+1;
|
||||
LLNotificationsUtil::add("InvalidTerrainAlpha", args);
|
||||
return FALSE;
|
||||
}
|
||||
LL_WARNS() << "Terrain texture image in slot " << i << " with ID " << image_asset_id << " has alpha channel, but pixels are opaque. Is alpha being optimized away in the texture uploader?" << LL_ENDL;
|
||||
}
|
||||
|
||||
if (width > max_terrain_texture_size || height > max_terrain_texture_size)
|
||||
{
|
||||
|
||||
|
|
|
|||
|
|
@ -4008,6 +4008,32 @@ Replace texture [TEXTURE_NUM] with an RGB [MAX_SIZE]x[MAX_SIZE] or smaller image
|
|||
<tag>fail</tag>
|
||||
</notification>
|
||||
|
||||
<notification
|
||||
icon="alertmodal.tga"
|
||||
name="InvalidTerrainAlphaNotFullyLoaded"
|
||||
type="alertmodal">
|
||||
Couldn't set region textures:
|
||||
Terrain texture [TEXTURE_NUM] is not fully loaded, but is assumed to contain transparency due to a bit depth of [TEXTURE_BIT_DEPTH]. Transparency is not currently supported for terrain textures.
|
||||
|
||||
If texture [TEXTURE_NUM] is opaque, wait for the texture to fully load and then click "Apply" again.
|
||||
|
||||
Alpha is only supported for terrain materials (PBR Metallic Roughness), when alphaMode="MASK" and doubleSided=false.
|
||||
<tag>fail</tag>
|
||||
</notification>
|
||||
|
||||
<notification
|
||||
icon="alertmodal.tga"
|
||||
name="InvalidTerrainAlpha"
|
||||
type="alertmodal">
|
||||
Couldn't set region textures:
|
||||
Terrain texture [TEXTURE_NUM] contains transparency. Transparency is not currently supported for terrain textures.
|
||||
|
||||
Replace texture [TEXTURE_NUM] with an opaque RGB image, then click "Apply" again.
|
||||
|
||||
Alpha is only supported for terrain materials (PBR Metallic Roughness), when alphaMode="MASK" and doubleSided=false.
|
||||
<tag>fail</tag>
|
||||
</notification>
|
||||
|
||||
<notification
|
||||
icon="alertmodal.tga"
|
||||
name="InvalidTerrainSize"
|
||||
|
|
|
|||
Loading…
Reference in New Issue