Cursory materials alphamask parameter support (and only alpha mask)
This commit is contained in:
@@ -1973,6 +1973,13 @@ S32 LLVOVolume::setTEMaterialID(const U8 te, const LLMaterialID& pMaterialID)
|
|||||||
{
|
{
|
||||||
LLMaterialMgr::instance().getTE(getRegion()->getRegionID(), pMaterialID, te, boost::bind(&LLVOVolume::setTEMaterialParamsCallbackTE, getID(), _1, _2, _3));
|
LLMaterialMgr::instance().getTE(getRegion()->getRegionID(), pMaterialID, te, boost::bind(&LLVOVolume::setTEMaterialParamsCallbackTE, getID(), _1, _2, _3));
|
||||||
|
|
||||||
|
setChanged(ALL_CHANGED);
|
||||||
|
if (!mDrawable.isNull())
|
||||||
|
{
|
||||||
|
gPipeline.markTextured(mDrawable);
|
||||||
|
gPipeline.markRebuild(mDrawable,LLDrawable::REBUILD_ALL);
|
||||||
|
}
|
||||||
|
mFaceMappingChanged = TRUE;
|
||||||
}
|
}
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
@@ -1983,7 +1990,14 @@ S32 LLVOVolume::setTEMaterialParams(const U8 te, const LLMaterialPtr pMaterialPa
|
|||||||
LL_DEBUGS("MaterialTEs") << "te " << (S32)te << " material " << ((pMaterialParams) ? pMaterialParams->asLLSD() : LLSD("null")) << " res " << res
|
LL_DEBUGS("MaterialTEs") << "te " << (S32)te << " material " << ((pMaterialParams) ? pMaterialParams->asLLSD() : LLSD("null")) << " res " << res
|
||||||
<< ( LLSelectMgr::getInstance()->getSelection()->contains(const_cast<LLVOVolume*>(this), te) ? " selected" : " not selected" )
|
<< ( LLSelectMgr::getInstance()->getSelection()->contains(const_cast<LLVOVolume*>(this), te) ? " selected" : " not selected" )
|
||||||
<< LL_ENDL;
|
<< LL_ENDL;
|
||||||
return res;
|
setChanged(ALL_CHANGED);
|
||||||
|
if (!mDrawable.isNull())
|
||||||
|
{
|
||||||
|
gPipeline.markTextured(mDrawable);
|
||||||
|
gPipeline.markRebuild(mDrawable,LLDrawable::REBUILD_ALL);
|
||||||
|
}
|
||||||
|
mFaceMappingChanged = TRUE;
|
||||||
|
return TEM_CHANGE_TEXTURE;
|
||||||
}
|
}
|
||||||
|
|
||||||
S32 LLVOVolume::setTEScale(const U8 te, const F32 s, const F32 t)
|
S32 LLVOVolume::setTEScale(const U8 te, const F32 s, const F32 t)
|
||||||
@@ -4032,7 +4046,9 @@ void LLVolumeGeometryManager::registerFace(LLSpatialGroup* group, LLFace* facep,
|
|||||||
|
|
||||||
BOOL fullbright = (type == LLRenderPass::PASS_FULLBRIGHT) ||
|
BOOL fullbright = (type == LLRenderPass::PASS_FULLBRIGHT) ||
|
||||||
(type == LLRenderPass::PASS_INVISIBLE) ||
|
(type == LLRenderPass::PASS_INVISIBLE) ||
|
||||||
(type == LLRenderPass::PASS_ALPHA && facep->isState(LLFace::FULLBRIGHT));
|
(type == LLRenderPass::PASS_FULLBRIGHT_ALPHA_MASK) ||
|
||||||
|
(type == LLRenderPass::PASS_ALPHA && facep->isState(LLFace::FULLBRIGHT)) ||
|
||||||
|
(facep->getTextureEntry()->getFullbright());
|
||||||
|
|
||||||
if (!fullbright && type != LLRenderPass::PASS_GLOW && !facep->getVertexBuffer()->hasDataType(LLVertexBuffer::TYPE_NORMAL))
|
if (!fullbright && type != LLRenderPass::PASS_GLOW && !facep->getVertexBuffer()->hasDataType(LLVertexBuffer::TYPE_NORMAL))
|
||||||
{
|
{
|
||||||
@@ -4070,6 +4086,8 @@ void LLVolumeGeometryManager::registerFace(LLSpatialGroup* group, LLFace* facep,
|
|||||||
LLViewerTexture* tex = facep->getTexture();
|
LLViewerTexture* tex = facep->getTexture();
|
||||||
|
|
||||||
U8 index = facep->getTextureIndex();
|
U8 index = facep->getTextureIndex();
|
||||||
|
|
||||||
|
LLMaterialID mat_id = facep->getTextureEntry()->getMaterialID();
|
||||||
|
|
||||||
bool batchable = false;
|
bool batchable = false;
|
||||||
|
|
||||||
@@ -4415,66 +4433,104 @@ void LLVolumeGeometryManager::rebuildGeom(LLSpatialGroup* group)
|
|||||||
LLViewerTexture* tex = facep->getTexture();
|
LLViewerTexture* tex = facep->getTexture();
|
||||||
U32 type = gPipeline.getPoolTypeFromTE(te, tex);
|
U32 type = gPipeline.getPoolTypeFromTE(te, tex);
|
||||||
|
|
||||||
if (type == LLDrawPool::POOL_ALPHA)
|
|
||||||
{
|
|
||||||
if (te->getColor().mV[3] > 0.f)
|
|
||||||
{
|
|
||||||
if (te->getFullbright())
|
|
||||||
{
|
|
||||||
pool->addRiggedFace(facep, LLDrawPoolAvatar::RIGGED_FULLBRIGHT_ALPHA);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
pool->addRiggedFace(facep, LLDrawPoolAvatar::RIGGED_ALPHA);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (te->getShiny())
|
|
||||||
{
|
|
||||||
if (te->getFullbright())
|
|
||||||
{
|
|
||||||
pool->addRiggedFace(facep, LLDrawPoolAvatar::RIGGED_FULLBRIGHT_SHINY);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (LLPipeline::sRenderDeferred)
|
|
||||||
{
|
|
||||||
pool->addRiggedFace(facep, LLDrawPoolAvatar::RIGGED_SIMPLE);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
pool->addRiggedFace(facep, LLDrawPoolAvatar::RIGGED_SHINY);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (te->getFullbright())
|
|
||||||
{
|
|
||||||
pool->addRiggedFace(facep, LLDrawPoolAvatar::RIGGED_FULLBRIGHT);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
pool->addRiggedFace(facep, LLDrawPoolAvatar::RIGGED_SIMPLE);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (te->getGlow())
|
if (te->getGlow())
|
||||||
{
|
{
|
||||||
pool->addRiggedFace(facep, LLDrawPoolAvatar::RIGGED_GLOW);
|
pool->addRiggedFace(facep, LLDrawPoolAvatar::RIGGED_GLOW);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (LLPipeline::sRenderDeferred)
|
LLMaterial* mat = te->getMaterialParams().get();
|
||||||
|
|
||||||
|
if (mat)
|
||||||
{
|
{
|
||||||
if (type != LLDrawPool::POOL_ALPHA && !te->getFullbright())
|
bool fullbright = te->getFullbright();
|
||||||
|
bool is_alpha = type == LLDrawPool::POOL_ALPHA;
|
||||||
|
U8 mode = mat->getDiffuseAlphaMode();
|
||||||
|
bool can_be_shiny = mode == LLMaterial::DIFFUSE_ALPHA_MODE_NONE ||
|
||||||
|
mode == LLMaterial::DIFFUSE_ALPHA_MODE_EMISSIVE;
|
||||||
|
|
||||||
|
if (mode == LLMaterial::DIFFUSE_ALPHA_MODE_MASK && te->getColor().mV[3] >= 0.999f)
|
||||||
{
|
{
|
||||||
if (te->getBumpmap())
|
pool->addRiggedFace(facep, fullbright ? LLDrawPoolAvatar::RIGGED_FULLBRIGHT : LLDrawPoolAvatar::RIGGED_SIMPLE);
|
||||||
|
}
|
||||||
|
else if (is_alpha || (te->getColor().mV[3] < 0.999f))
|
||||||
|
{
|
||||||
|
if (te->getColor().mV[3] > 0.f)
|
||||||
{
|
{
|
||||||
pool->addRiggedFace(facep, LLDrawPoolAvatar::RIGGED_DEFERRED_BUMP);
|
pool->addRiggedFace(facep, fullbright ? LLDrawPoolAvatar::RIGGED_FULLBRIGHT_ALPHA : LLDrawPoolAvatar::RIGGED_ALPHA);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (gPipeline.canUseVertexShaders()
|
||||||
|
&& LLPipeline::sRenderBump
|
||||||
|
&& te->getShiny()
|
||||||
|
&& can_be_shiny)
|
||||||
|
{
|
||||||
|
pool->addRiggedFace(facep, fullbright ? LLDrawPoolAvatar::RIGGED_FULLBRIGHT_SHINY : LLDrawPoolAvatar::RIGGED_SHINY);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
pool->addRiggedFace(facep, fullbright ? LLDrawPoolAvatar::RIGGED_FULLBRIGHT : LLDrawPoolAvatar::RIGGED_SIMPLE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (type == LLDrawPool::POOL_ALPHA)
|
||||||
|
{
|
||||||
|
if (te->getColor().mV[3] > 0.f)
|
||||||
|
{
|
||||||
|
if (te->getFullbright())
|
||||||
|
{
|
||||||
|
pool->addRiggedFace(facep, LLDrawPoolAvatar::RIGGED_FULLBRIGHT_ALPHA);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
pool->addRiggedFace(facep, LLDrawPoolAvatar::RIGGED_ALPHA);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (te->getShiny())
|
||||||
|
{
|
||||||
|
if (te->getFullbright())
|
||||||
|
{
|
||||||
|
pool->addRiggedFace(facep, LLDrawPoolAvatar::RIGGED_FULLBRIGHT_SHINY);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
pool->addRiggedFace(facep, LLDrawPoolAvatar::RIGGED_DEFERRED_SIMPLE);
|
if (LLPipeline::sRenderDeferred)
|
||||||
|
{
|
||||||
|
pool->addRiggedFace(facep, LLDrawPoolAvatar::RIGGED_SIMPLE);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
pool->addRiggedFace(facep, LLDrawPoolAvatar::RIGGED_SHINY);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (te->getFullbright())
|
||||||
|
{
|
||||||
|
pool->addRiggedFace(facep, LLDrawPoolAvatar::RIGGED_FULLBRIGHT);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
pool->addRiggedFace(facep, LLDrawPoolAvatar::RIGGED_SIMPLE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if (LLPipeline::sRenderDeferred)
|
||||||
|
{
|
||||||
|
if (type != LLDrawPool::POOL_ALPHA && !te->getFullbright())
|
||||||
|
{
|
||||||
|
if (te->getBumpmap())
|
||||||
|
{
|
||||||
|
pool->addRiggedFace(facep, LLDrawPoolAvatar::RIGGED_DEFERRED_BUMP);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
pool->addRiggedFace(facep, LLDrawPoolAvatar::RIGGED_DEFERRED_SIMPLE);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -5102,7 +5158,6 @@ void LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, std::
|
|||||||
index_offset += facep->getGeomCount();
|
index_offset += facep->getGeomCount();
|
||||||
indices_index += facep->getIndicesCount();
|
indices_index += facep->getIndicesCount();
|
||||||
|
|
||||||
|
|
||||||
//append face to appropriate render batch
|
//append face to appropriate render batch
|
||||||
|
|
||||||
BOOL force_simple = facep->getPixelArea() < FORCE_SIMPLE_RENDER_AREA;
|
BOOL force_simple = facep->getPixelArea() < FORCE_SIMPLE_RENDER_AREA;
|
||||||
@@ -5122,7 +5177,46 @@ void LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, std::
|
|||||||
|
|
||||||
BOOL is_alpha = (facep->getPoolType() == LLDrawPool::POOL_ALPHA) ? TRUE : FALSE;
|
BOOL is_alpha = (facep->getPoolType() == LLDrawPool::POOL_ALPHA) ? TRUE : FALSE;
|
||||||
|
|
||||||
if (is_alpha)
|
LLMaterial* mat = te->getMaterialParams().get();
|
||||||
|
|
||||||
|
bool can_be_shiny = true;
|
||||||
|
if (mat)
|
||||||
|
{
|
||||||
|
U8 mode = mat->getDiffuseAlphaMode();
|
||||||
|
can_be_shiny = mode == LLMaterial::DIFFUSE_ALPHA_MODE_NONE ||
|
||||||
|
mode == LLMaterial::DIFFUSE_ALPHA_MODE_EMISSIVE;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool use_legacy_bump = te->getBumpmap();
|
||||||
|
if (mat)
|
||||||
|
{
|
||||||
|
U8 mode = mat->getDiffuseAlphaMode();
|
||||||
|
if (te->getColor().mV[3] < 0.999f)
|
||||||
|
{
|
||||||
|
mode = LLMaterial::DIFFUSE_ALPHA_MODE_BLEND;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (mode == LLMaterial::DIFFUSE_ALPHA_MODE_MASK)
|
||||||
|
{
|
||||||
|
registerFace(group, facep, fullbright ? LLRenderPass::PASS_FULLBRIGHT_ALPHA_MASK : LLRenderPass::PASS_ALPHA_MASK);
|
||||||
|
}
|
||||||
|
else if (is_alpha || (te->getColor().mV[3] < 0.999f))
|
||||||
|
{
|
||||||
|
registerFace(group, facep, LLRenderPass::PASS_ALPHA);
|
||||||
|
}
|
||||||
|
else if (gPipeline.canUseVertexShaders()
|
||||||
|
&& LLPipeline::sRenderBump
|
||||||
|
&& te->getShiny()
|
||||||
|
&& can_be_shiny)
|
||||||
|
{
|
||||||
|
registerFace(group, facep, fullbright ? LLRenderPass::PASS_FULLBRIGHT_SHINY : LLRenderPass::PASS_SHINY);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
registerFace(group, facep, fullbright ? LLRenderPass::PASS_FULLBRIGHT : LLRenderPass::PASS_SIMPLE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (is_alpha)
|
||||||
{
|
{
|
||||||
// can we safely treat this as an alpha mask?
|
// can we safely treat this as an alpha mask?
|
||||||
if (facep->getFaceColor().mV[3] <= 0.f)
|
if (facep->getFaceColor().mV[3] <= 0.f)
|
||||||
@@ -5147,7 +5241,8 @@ void LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, std::
|
|||||||
}
|
}
|
||||||
else if (gPipeline.canUseVertexShaders()
|
else if (gPipeline.canUseVertexShaders()
|
||||||
&& LLPipeline::sRenderBump
|
&& LLPipeline::sRenderBump
|
||||||
&& te->getShiny())
|
&& te->getShiny()
|
||||||
|
&& can_be_shiny)
|
||||||
{ //shiny
|
{ //shiny
|
||||||
if (tex->getPrimaryFormat() == GL_ALPHA)
|
if (tex->getPrimaryFormat() == GL_ALPHA)
|
||||||
{ //invisiprim+shiny
|
{ //invisiprim+shiny
|
||||||
@@ -5164,7 +5259,7 @@ void LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, std::
|
|||||||
registerFace(group, facep, LLRenderPass::PASS_POST_BUMP);
|
registerFace(group, facep, LLRenderPass::PASS_POST_BUMP);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (te->getBumpmap())
|
else if (use_legacy_bump)
|
||||||
{ //register in deferred bump pass
|
{ //register in deferred bump pass
|
||||||
registerFace(group, facep, LLRenderPass::PASS_BUMP);
|
registerFace(group, facep, LLRenderPass::PASS_BUMP);
|
||||||
}
|
}
|
||||||
@@ -5191,25 +5286,40 @@ void LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, std::
|
|||||||
}
|
}
|
||||||
else if (fullbright || bake_sunlight)
|
else if (fullbright || bake_sunlight)
|
||||||
{ //fullbright
|
{ //fullbright
|
||||||
registerFace(group, facep, LLRenderPass::PASS_FULLBRIGHT);
|
if (mat && mat->getDiffuseAlphaMode() == LLMaterial::DIFFUSE_ALPHA_MODE_MASK)
|
||||||
if (LLPipeline::sRenderDeferred && !hud_group && LLPipeline::sRenderBump && te->getBumpmap())
|
{
|
||||||
|
registerFace(group, facep, LLRenderPass::PASS_FULLBRIGHT_ALPHA_MASK);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
registerFace(group, facep, LLRenderPass::PASS_FULLBRIGHT);
|
||||||
|
}
|
||||||
|
if (LLPipeline::sRenderDeferred && !hud_group && LLPipeline::sRenderBump && use_legacy_bump)
|
||||||
{ //if this is the deferred render and a bump map is present, register in post deferred bump
|
{ //if this is the deferred render and a bump map is present, register in post deferred bump
|
||||||
registerFace(group, facep, LLRenderPass::PASS_POST_BUMP);
|
registerFace(group, facep, LLRenderPass::PASS_POST_BUMP);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (LLPipeline::sRenderDeferred && LLPipeline::sRenderBump && te->getBumpmap())
|
if (LLPipeline::sRenderDeferred && LLPipeline::sRenderBump && use_legacy_bump)
|
||||||
{ //non-shiny or fullbright deferred bump
|
{ //non-shiny or fullbright deferred bump
|
||||||
registerFace(group, facep, LLRenderPass::PASS_BUMP);
|
registerFace(group, facep, LLRenderPass::PASS_BUMP);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{ //all around simple
|
{ //all around simple
|
||||||
llassert(mask & LLVertexBuffer::MAP_NORMAL);
|
llassert(mask & LLVertexBuffer::MAP_NORMAL);
|
||||||
registerFace(group, facep, LLRenderPass::PASS_SIMPLE);
|
if (mat && mat->getDiffuseAlphaMode() == LLMaterial::DIFFUSE_ALPHA_MODE_MASK)
|
||||||
|
{ //material alpha mask can be respected in non-deferred
|
||||||
|
registerFace(group, facep, LLRenderPass::PASS_ALPHA_MASK);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
registerFace(group, facep, LLRenderPass::PASS_SIMPLE);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if (!gPipeline.canUseVertexShaders() &&
|
if (!gPipeline.canUseVertexShaders() &&
|
||||||
!is_alpha &&
|
!is_alpha &&
|
||||||
te->getShiny() &&
|
te->getShiny() &&
|
||||||
@@ -5225,7 +5335,7 @@ void LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, std::
|
|||||||
llassert((mask & LLVertexBuffer::MAP_NORMAL) || fullbright);
|
llassert((mask & LLVertexBuffer::MAP_NORMAL) || fullbright);
|
||||||
facep->setPoolType((fullbright) ? LLDrawPool::POOL_FULLBRIGHT : LLDrawPool::POOL_SIMPLE);
|
facep->setPoolType((fullbright) ? LLDrawPool::POOL_FULLBRIGHT : LLDrawPool::POOL_SIMPLE);
|
||||||
|
|
||||||
if (!force_simple && te->getBumpmap() && LLPipeline::sRenderBump)
|
if (!force_simple && LLPipeline::sRenderBump && use_legacy_bump)
|
||||||
{
|
{
|
||||||
registerFace(group, facep, LLRenderPass::PASS_BUMP);
|
registerFace(group, facep, LLRenderPass::PASS_BUMP);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user