Automated merge with https://bitbucket.org/lindenlab/viewer-development-materials
commit
aaad46c18b
|
|
@ -253,6 +253,10 @@ void LLDrawPoolAlpha::render(S32 pass)
|
|||
simple_shader->setMinimumAlpha(0.33f);
|
||||
|
||||
pushMaskBatches(LLRenderPass::PASS_ALPHA_MASK, getVertexDataMask() | LLVertexBuffer::MAP_TEXTURE_INDEX, TRUE, TRUE);
|
||||
pushMaskBatches(LLRenderPass::PASS_MATERIAL_ALPHA_MASK, getVertexDataMask() | LLVertexBuffer::MAP_TEXTURE_INDEX, TRUE, TRUE);
|
||||
pushMaskBatches(LLRenderPass::PASS_SPECMAP_MASK, getVertexDataMask() | LLVertexBuffer::MAP_TEXTURE_INDEX, TRUE, TRUE);
|
||||
pushMaskBatches(LLRenderPass::PASS_NORMMAP_MASK, getVertexDataMask() | LLVertexBuffer::MAP_TEXTURE_INDEX, TRUE, TRUE);
|
||||
pushMaskBatches(LLRenderPass::PASS_NORMSPEC_MASK, getVertexDataMask() | LLVertexBuffer::MAP_TEXTURE_INDEX, TRUE, TRUE);
|
||||
}
|
||||
if (fullbright_shader)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -198,7 +198,11 @@ void LLDrawPoolSimple::render(S32 pass)
|
|||
if (LLPipeline::sRenderDeferred)
|
||||
{ //if deferred rendering is enabled, bump faces aren't registered as simple
|
||||
//render bump faces here as simple so bump faces will appear under water
|
||||
pushBatches(LLRenderPass::PASS_BUMP, mask, TRUE, TRUE);
|
||||
pushBatches(LLRenderPass::PASS_BUMP, mask, TRUE, TRUE);
|
||||
pushBatches(LLRenderPass::PASS_MATERIAL, mask, TRUE, TRUE);
|
||||
pushBatches(LLRenderPass::PASS_SPECMAP, mask, TRUE, TRUE);
|
||||
pushBatches(LLRenderPass::PASS_NORMMAP, mask, TRUE, TRUE);
|
||||
pushBatches(LLRenderPass::PASS_NORMSPEC, mask, TRUE, TRUE);
|
||||
}
|
||||
}
|
||||
else
|
||||
|
|
@ -355,6 +359,11 @@ void LLDrawPoolFullbright::renderPostDeferred(S32 pass)
|
|||
gGL.setSceneBlendType(LLRender::BT_ALPHA);
|
||||
U32 fullbright_mask = LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_TEXCOORD0 | LLVertexBuffer::MAP_COLOR | LLVertexBuffer::MAP_TEXTURE_INDEX;
|
||||
pushBatches(LLRenderPass::PASS_FULLBRIGHT, fullbright_mask, TRUE, TRUE);
|
||||
|
||||
pushBatches(LLRenderPass::PASS_MATERIAL_ALPHA_EMISSIVE, fullbright_mask, TRUE, FALSE);
|
||||
pushBatches(LLRenderPass::PASS_SPECMAP_EMISSIVE, fullbright_mask, TRUE, FALSE);
|
||||
pushBatches(LLRenderPass::PASS_NORMMAP_EMISSIVE, fullbright_mask, TRUE, FALSE);
|
||||
pushBatches(LLRenderPass::PASS_NORMSPEC_EMISSIVE, fullbright_mask, TRUE, FALSE);
|
||||
}
|
||||
|
||||
void LLDrawPoolFullbright::endPostDeferredPass(S32 pass)
|
||||
|
|
@ -405,12 +414,20 @@ void LLDrawPoolFullbright::render(S32 pass)
|
|||
fullbright_shader->uniform1f(LLViewerShaderMgr::FULLBRIGHT, 1.f);
|
||||
U32 fullbright_mask = LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_TEXCOORD0 | LLVertexBuffer::MAP_COLOR | LLVertexBuffer::MAP_TEXTURE_INDEX;
|
||||
pushBatches(LLRenderPass::PASS_FULLBRIGHT, fullbright_mask, TRUE, TRUE);
|
||||
pushBatches(LLRenderPass::PASS_MATERIAL_ALPHA_EMISSIVE, fullbright_mask, TRUE, TRUE);
|
||||
pushBatches(LLRenderPass::PASS_SPECMAP_EMISSIVE, fullbright_mask, TRUE, TRUE);
|
||||
pushBatches(LLRenderPass::PASS_NORMMAP_EMISSIVE, fullbright_mask, TRUE, TRUE);
|
||||
pushBatches(LLRenderPass::PASS_NORMSPEC_EMISSIVE, fullbright_mask, TRUE, TRUE);
|
||||
}
|
||||
else
|
||||
{
|
||||
gPipeline.enableLightsFullbright(LLColor4(1,1,1,1));
|
||||
U32 fullbright_mask = LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_TEXCOORD0 | LLVertexBuffer::MAP_COLOR;
|
||||
renderTexture(LLRenderPass::PASS_FULLBRIGHT, fullbright_mask);
|
||||
pushBatches(LLRenderPass::PASS_MATERIAL_ALPHA_EMISSIVE, fullbright_mask);
|
||||
pushBatches(LLRenderPass::PASS_SPECMAP_EMISSIVE, fullbright_mask);
|
||||
pushBatches(LLRenderPass::PASS_NORMMAP_EMISSIVE, fullbright_mask);
|
||||
pushBatches(LLRenderPass::PASS_NORMSPEC_EMISSIVE, fullbright_mask);
|
||||
}
|
||||
|
||||
stop_glerror();
|
||||
|
|
|
|||
|
|
@ -1311,6 +1311,8 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume,
|
|||
{
|
||||
if (tep)
|
||||
{
|
||||
LLMaterial* mat = tep->getMaterialParams().get();
|
||||
|
||||
GLfloat alpha[4] =
|
||||
{
|
||||
0.00f,
|
||||
|
|
@ -1319,7 +1321,9 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume,
|
|||
0.75f
|
||||
};
|
||||
|
||||
if (getPoolType() != LLDrawPool::POOL_ALPHA && (LLPipeline::sRenderDeferred || (LLPipeline::sRenderBump && tep->getShiny())))
|
||||
if ((!LLPipeline::sRenderDeferred || !mat) &&
|
||||
getPoolType() != LLDrawPool::POOL_ALPHA &&
|
||||
(LLPipeline::sRenderDeferred || (LLPipeline::sRenderBump && tep->getShiny())))
|
||||
{
|
||||
color.mV[3] = U8 (alpha[tep->getShiny()] * 255);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -4639,6 +4639,7 @@ LLDrawInfo::LLDrawInfo(U16 start, U16 end, U32 count, U32 offset,
|
|||
mFace(NULL),
|
||||
mDistance(0.f),
|
||||
mDrawMode(LLRender::TRIANGLES),
|
||||
mMaterial(NULL),
|
||||
mSpecColor(1.0f, 1.0f, 1.0f, 0.5f),
|
||||
mEnvIntensity(0.0f),
|
||||
mAlphaMaskCutoff(0.5f),
|
||||
|
|
|
|||
|
|
@ -120,7 +120,7 @@ public:
|
|||
F32 mDistance;
|
||||
U32 mDrawMode;
|
||||
|
||||
LLMaterialID mMaterialID; // If this is null, the following parameters are unused.
|
||||
LLMaterial* mMaterial; // If this is null, the following parameters are unused.
|
||||
LLPointer<LLViewerTexture> mSpecularMap;
|
||||
const LLMatrix4* mSpecularMapMatrix;
|
||||
LLPointer<LLViewerTexture> mNormalMap;
|
||||
|
|
|
|||
|
|
@ -3997,6 +3997,11 @@ bool can_batch_texture(LLFace* facep)
|
|||
return false;
|
||||
}
|
||||
|
||||
if (facep->getTextureEntry()->getMaterialParams().notNull())
|
||||
{ //materials don't work with texture batching yet
|
||||
return false;
|
||||
}
|
||||
|
||||
if (facep->getTexture() && facep->getTexture()->getPrimaryFormat() == GL_ALPHA)
|
||||
{ //can't batch invisiprims
|
||||
return false;
|
||||
|
|
@ -4067,13 +4072,17 @@ void LLVolumeGeometryManager::registerFace(LLSpatialGroup* group, LLFace* facep,
|
|||
|
||||
U8 index = facep->getTextureIndex();
|
||||
|
||||
const LLMaterialID& matid = facep->getTextureEntry()->getMaterialID();
|
||||
LLMaterial* mat = LLPipeline::sRenderDeferred ? facep->getTextureEntry()->getMaterialParams() : NULL;
|
||||
|
||||
bool batchable = false;
|
||||
|
||||
if (index < 255 && idx >= 0)
|
||||
{
|
||||
if (index < draw_vec[idx]->mTextureList.size())
|
||||
if (mat || draw_vec[idx]->mMaterial)
|
||||
{ //can't batch textures when materials are present (yet)
|
||||
batchable = false;
|
||||
}
|
||||
else if (index < draw_vec[idx]->mTextureList.size())
|
||||
{
|
||||
if (draw_vec[idx]->mTextureList[index].isNull())
|
||||
{
|
||||
|
|
@ -4103,13 +4112,13 @@ void LLVolumeGeometryManager::registerFace(LLSpatialGroup* group, LLFace* facep,
|
|||
draw_vec[idx]->mBump == bump &&
|
||||
draw_vec[idx]->mTextureMatrix == tex_mat &&
|
||||
draw_vec[idx]->mModelMatrix == model_mat &&
|
||||
draw_vec[idx]->mMaterialID == matid)
|
||||
draw_vec[idx]->mMaterial == mat)
|
||||
{
|
||||
draw_vec[idx]->mCount += facep->getIndicesCount();
|
||||
draw_vec[idx]->mEnd += facep->getGeomCount();
|
||||
draw_vec[idx]->mVSize = llmax(draw_vec[idx]->mVSize, facep->getVirtualSize());
|
||||
|
||||
if (index >= draw_vec[idx]->mTextureList.size())
|
||||
if (index < 255 && index >= draw_vec[idx]->mTextureList.size())
|
||||
{
|
||||
draw_vec[idx]->mTextureList.resize(index+1);
|
||||
draw_vec[idx]->mTextureList[index] = tex;
|
||||
|
|
@ -4131,22 +4140,22 @@ void LLVolumeGeometryManager::registerFace(LLSpatialGroup* group, LLFace* facep,
|
|||
draw_vec.push_back(draw_info);
|
||||
draw_info->mTextureMatrix = tex_mat;
|
||||
draw_info->mModelMatrix = model_mat;
|
||||
if (facep->getTextureEntry()->getMaterialParams().notNull())
|
||||
{
|
||||
if (mat)
|
||||
{
|
||||
// We have a material. Update our draw info accordingly.
|
||||
draw_info->mMaterialID = matid;
|
||||
draw_info->mMaterial = mat;
|
||||
LLVector4 specColor;
|
||||
specColor.mV[0] = facep->getTextureEntry()->getMaterialParams()->getSpecularLightColor().mV[0] * (1.f / 255.f);
|
||||
specColor.mV[1] = facep->getTextureEntry()->getMaterialParams()->getSpecularLightColor().mV[1] * (1.f / 255.f);
|
||||
specColor.mV[2] = facep->getTextureEntry()->getMaterialParams()->getSpecularLightColor().mV[2] * (1.f / 255.f);
|
||||
specColor.mV[3] = facep->getTextureEntry()->getMaterialParams()->getSpecularLightExponent() * (1.f / 255.f);
|
||||
specColor.mV[0] = mat->getSpecularLightColor().mV[0] * (1.f / 255.f);
|
||||
specColor.mV[1] = mat->getSpecularLightColor().mV[1] * (1.f / 255.f);
|
||||
specColor.mV[2] = mat->getSpecularLightColor().mV[2] * (1.f / 255.f);
|
||||
specColor.mV[3] = mat->getSpecularLightExponent() * (1.f / 255.f);
|
||||
draw_info->mSpecColor = specColor;
|
||||
draw_info->mEnvIntensity = facep->getTextureEntry()->getMaterialParams()->getEnvironmentIntensity() * (1.f / 255.f);
|
||||
draw_info->mAlphaMaskCutoff = facep->getTextureEntry()->getMaterialParams()->getAlphaMaskCutoff() * (1.f / 255.f);
|
||||
draw_info->mDiffuseAlphaMode = facep->getTextureEntry()->getMaterialParams()->getDiffuseAlphaMode();
|
||||
draw_info->mEnvIntensity = mat->getEnvironmentIntensity() * (1.f / 255.f);
|
||||
draw_info->mAlphaMaskCutoff = mat->getAlphaMaskCutoff() * (1.f / 255.f);
|
||||
draw_info->mDiffuseAlphaMode = mat->getDiffuseAlphaMode();
|
||||
draw_info->mNormalMap = facep->getViewerObject()->getTENormalMap(facep->getTEOffset());
|
||||
draw_info->mSpecularMap = facep->getViewerObject()->getTESpecularMap(facep->getTEOffset());
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
U8 shiny = facep->getTextureEntry()->getShiny();
|
||||
|
|
@ -4463,7 +4472,7 @@ void LLVolumeGeometryManager::rebuildGeom(LLSpatialGroup* group)
|
|||
pool->addRiggedFace(facep, LLDrawPoolAvatar::RIGGED_GLOW);
|
||||
}
|
||||
|
||||
LLMaterial* mat = te->getMaterialParams().get();
|
||||
LLMaterial* mat = LLPipeline::sRenderDeferred ? te->getMaterialParams().get() : NULL;
|
||||
|
||||
if (mat)
|
||||
{
|
||||
|
|
@ -4920,13 +4929,13 @@ struct CompareBatchBreakerModified
|
|||
{
|
||||
return lte->getFullbright() < rte->getFullbright();
|
||||
}
|
||||
else if (lhs->getTexture() != rhs->getTexture())
|
||||
else if (LLPipeline::sRenderDeferred && lte->getMaterialParams() != rte->getMaterialParams())
|
||||
{
|
||||
return lhs->getTexture() < rhs->getTexture();
|
||||
return lte->getMaterialParams() < rte->getMaterialParams();
|
||||
}
|
||||
else
|
||||
{
|
||||
return lte->getMaterialParams() < rte->getMaterialParams();
|
||||
return lhs->getTexture() < rhs->getTexture();
|
||||
}
|
||||
}
|
||||
};
|
||||
|
|
@ -5057,6 +5066,7 @@ void LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, std::
|
|||
if (!can_batch_texture(facep))
|
||||
{ //face is bump mapped or has an animated texture matrix -- can't
|
||||
//batch more than 1 texture at a time
|
||||
facep->setTextureIndex(0);
|
||||
break;
|
||||
}
|
||||
|
||||
|
|
@ -5107,6 +5117,10 @@ void LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, std::
|
|||
facep->setTextureIndex(cur_tex);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
facep->setTextureIndex(0);
|
||||
}
|
||||
|
||||
tex = texture_list[0];
|
||||
}
|
||||
|
|
@ -5202,8 +5216,7 @@ void LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, std::
|
|||
|
||||
index_offset += facep->getGeomCount();
|
||||
indices_index += facep->getIndicesCount();
|
||||
|
||||
|
||||
|
||||
//append face to appropriate render batch
|
||||
|
||||
BOOL force_simple = facep->getPixelArea() < FORCE_SIMPLE_RENDER_AREA;
|
||||
|
|
|
|||
Loading…
Reference in New Issue