Optimization -- don't draw glow in alpha pool unless needed
parent
2a8ec731c9
commit
dbfcd6c9c5
|
|
@ -4520,7 +4520,11 @@ LLVolumeFace& LLVolumeFace::operator=(const LLVolumeFace& src)
|
|||
S32 tc_size = (mNumVertices*sizeof(LLVector2)+0xF) & ~0xF;
|
||||
|
||||
LLVector4a::memcpyNonAliased16((F32*) mPositions, (F32*) src.mPositions, vert_size);
|
||||
LLVector4a::memcpyNonAliased16((F32*) mNormals, (F32*) src.mNormals, vert_size);
|
||||
|
||||
if (src.mNormals)
|
||||
{
|
||||
LLVector4a::memcpyNonAliased16((F32*) mNormals, (F32*) src.mNormals, vert_size);
|
||||
}
|
||||
|
||||
if(src.mTexCoords)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -1122,6 +1122,43 @@ void LLModel::getNormalizedScaleTranslation(LLVector3& scale_out, LLVector3& tra
|
|||
translation_out = mNormalizedTranslation;
|
||||
}
|
||||
|
||||
LLVector3 LLModel::getTransformedCenter(const LLMatrix4& mat)
|
||||
{
|
||||
LLVector3 ret;
|
||||
|
||||
if (!mVolumeFaces.empty())
|
||||
{
|
||||
LLMatrix4a m;
|
||||
m.loadu(mat);
|
||||
|
||||
LLVector4a minv,maxv;
|
||||
|
||||
LLVector4a t;
|
||||
m.affineTransform(mVolumeFaces[0].mPositions[0], t);
|
||||
minv = maxv = t;
|
||||
|
||||
for (S32 i = 0; i < mVolumeFaces.size(); ++i)
|
||||
{
|
||||
LLVolumeFace& face = mVolumeFaces[i];
|
||||
|
||||
for (U32 j = 0; j < face.mNumVertices; ++j)
|
||||
{
|
||||
m.affineTransform(face.mPositions[j],t);
|
||||
update_min_max(minv, maxv, t);
|
||||
}
|
||||
}
|
||||
|
||||
minv.add(maxv);
|
||||
minv.mul(0.5f);
|
||||
|
||||
ret.set(minv.getF32ptr());
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
|
||||
void LLModel::setNumVolumeFaces(S32 count)
|
||||
{
|
||||
mVolumeFaces.resize(count);
|
||||
|
|
|
|||
|
|
@ -173,13 +173,15 @@ public:
|
|||
void optimizeVolumeFaces();
|
||||
void offsetMesh( const LLVector3& pivotPoint );
|
||||
void getNormalizedScaleTranslation(LLVector3& scale_out, LLVector3& translation_out);
|
||||
|
||||
LLVector3 getTransformedCenter(const LLMatrix4& mat);
|
||||
|
||||
//reorder face list based on mMaterialList in this and reference so
|
||||
//order matches that of reference (material ordering touchup)
|
||||
bool matchMaterialOrder(LLModel* ref, int& refFaceCnt, int& modelFaceCnt );
|
||||
bool isMaterialListSubset( LLModel* ref );
|
||||
bool needToAddFaces( LLModel* ref, int& refFaceCnt, int& modelFaceCnt );
|
||||
|
||||
|
||||
std::vector<std::string> mMaterialList;
|
||||
|
||||
//data used for skin weights
|
||||
|
|
|
|||
|
|
@ -515,7 +515,8 @@ void LLDrawPoolAlpha::renderAlpha(U32 mask)
|
|||
// If this alpha mesh has glow, then draw it a second time to add the destination-alpha (=glow). Interleaving these state-changing calls could be expensive, but glow must be drawn Z-sorted with alpha.
|
||||
if (current_shader &&
|
||||
draw_glow_for_this_partition &&
|
||||
params.mVertexBuffer->hasDataType(LLVertexBuffer::TYPE_EMISSIVE))
|
||||
params.mVertexBuffer->hasDataType(LLVertexBuffer::TYPE_EMISSIVE) &&
|
||||
(!params.mParticle || params.mHasGlow))
|
||||
{
|
||||
static LLFastTimer::DeclareTimer FTM_RENDER_ALPHA_GLOW("Alpha Glow");
|
||||
LLFastTimer t(FTM_RENDER_ALPHA_GLOW);
|
||||
|
|
|
|||
|
|
@ -4656,7 +4656,8 @@ LLDrawInfo::LLDrawInfo(U16 start, U16 end, U32 count, U32 offset,
|
|||
mDistance(0.f),
|
||||
mDrawMode(LLRender::TRIANGLES),
|
||||
mBlendFuncSrc(LLRender::BF_SOURCE_ALPHA),
|
||||
mBlendFuncDst(LLRender::BF_ONE_MINUS_SOURCE_ALPHA)
|
||||
mBlendFuncDst(LLRender::BF_ONE_MINUS_SOURCE_ALPHA),
|
||||
mHasGlow(FALSE)
|
||||
{
|
||||
mVertexBuffer->validateRange(mStart, mEnd, mCount, mOffset);
|
||||
|
||||
|
|
|
|||
|
|
@ -70,12 +70,12 @@ protected:
|
|||
public:
|
||||
void* operator new(size_t size)
|
||||
{
|
||||
return ll_aligned_malloc_16(size);
|
||||
return ll_aligned_malloc(size,64);
|
||||
}
|
||||
|
||||
void operator delete(void* ptr)
|
||||
{
|
||||
ll_aligned_free_16(ptr);
|
||||
ll_aligned_free(ptr);
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -121,6 +121,7 @@ public:
|
|||
U32 mDrawMode;
|
||||
U32 mBlendFuncSrc;
|
||||
U32 mBlendFuncDst;
|
||||
BOOL mHasGlow;
|
||||
|
||||
struct CompareTexture
|
||||
{
|
||||
|
|
|
|||
|
|
@ -387,7 +387,7 @@ void LLViewerPartGroup::updateParticles(const F32 lastdt)
|
|||
}
|
||||
|
||||
// Do glow interpolation
|
||||
part->mGlow.mV[3] = (U8) (lerp(part->mStartGlow, part->mEndGlow, frac)*255.f);
|
||||
part->mGlow.mV[3] = (U8) llround(lerp(part->mStartGlow, part->mEndGlow, frac)*255.f);
|
||||
|
||||
// Set the last update time to now.
|
||||
part->mLastUpdateTime = cur_time;
|
||||
|
|
|
|||
|
|
@ -313,7 +313,7 @@ void LLViewerPartSourceScript::update(const F32 dt)
|
|||
|
||||
part->mStartGlow = mPartSysData.mPartData.mStartGlow;
|
||||
part->mEndGlow = mPartSysData.mPartData.mEndGlow;
|
||||
part->mGlow = LLColor4U(0, 0, 0, (U8) (part->mStartGlow*255.f));
|
||||
part->mGlow = LLColor4U(0, 0, 0, (U8) llround(part->mStartGlow*255.f));
|
||||
|
||||
if (mPartSysData.mPattern & LLPartSysData::LL_PART_SRC_PATTERN_DROP)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -273,6 +273,10 @@ void LLVOPartGroup::getBlendFunc(S32 idx, U32& src, U32& dst)
|
|||
src = part->mBlendFuncSource;
|
||||
dst = part->mBlendFuncDest;
|
||||
}
|
||||
else
|
||||
{
|
||||
llerrs << "WTF?" << llendl;
|
||||
}
|
||||
}
|
||||
|
||||
LLVector3 LLVOPartGroup::getCameraPosition() const
|
||||
|
|
@ -670,7 +674,7 @@ void LLVOPartGroup::getGeometry(S32 idx,
|
|||
}
|
||||
else
|
||||
{
|
||||
pglow = LLColor4U(0, 0, 0, (U8) (255.f*part.mStartGlow));
|
||||
pglow = LLColor4U(0, 0, 0, (U8) llround(255.f*part.mStartGlow));
|
||||
pcolor = part.mStartColor;
|
||||
}
|
||||
}
|
||||
|
|
@ -685,10 +689,13 @@ void LLVOPartGroup::getGeometry(S32 idx,
|
|||
*colorsp++ = color;
|
||||
*colorsp++ = color;
|
||||
|
||||
*emissivep++ = pglow;
|
||||
*emissivep++ = pglow;
|
||||
*emissivep++ = part.mGlow;
|
||||
*emissivep++ = part.mGlow;
|
||||
//if (pglow.mV[3] || part.mGlow.mV[3])
|
||||
{ //only write glow if it is not zero
|
||||
*emissivep++ = pglow;
|
||||
*emissivep++ = pglow;
|
||||
*emissivep++ = part.mGlow;
|
||||
*emissivep++ = part.mGlow;
|
||||
}
|
||||
|
||||
|
||||
if (!(part.mFlags & LLPartData::LL_PART_EMISSIVE_MASK))
|
||||
|
|
@ -873,8 +880,17 @@ void LLParticlePartition::getGeometry(LLSpatialGroup* group)
|
|||
LLStrider<LLColor4U> cur_col = colorsp + geom_idx;
|
||||
LLStrider<LLColor4U> cur_glow = emissivep + geom_idx;
|
||||
|
||||
LLColor4U* start_glow = cur_glow.get();
|
||||
|
||||
object->getGeometry(facep->getTEOffset(), cur_vert, cur_norm, cur_tc, cur_col, cur_glow, cur_idx);
|
||||
|
||||
BOOL has_glow = FALSE;
|
||||
|
||||
if (cur_glow.get() != start_glow)
|
||||
{
|
||||
has_glow = TRUE;
|
||||
}
|
||||
|
||||
llassert(facep->getGeomCount() == 4);
|
||||
llassert(facep->getIndicesCount() == 6);
|
||||
|
||||
|
|
@ -894,26 +910,32 @@ void LLParticlePartition::getGeometry(LLSpatialGroup* group)
|
|||
|
||||
object->getBlendFunc(facep->getTEOffset(), bf_src, bf_dst);
|
||||
|
||||
if (idx >= 0 &&
|
||||
draw_vec[idx]->mTexture == facep->getTexture() &&
|
||||
draw_vec[idx]->mFullbright == fullbright &&
|
||||
draw_vec[idx]->mBlendFuncDst == bf_dst &&
|
||||
draw_vec[idx]->mBlendFuncSrc == bf_src)
|
||||
|
||||
if (idx >= 0)
|
||||
{
|
||||
if (draw_vec[idx]->mEnd == facep->getGeomIndex()-1)
|
||||
LLDrawInfo* info = draw_vec[idx];
|
||||
|
||||
if (info->mTexture == facep->getTexture() &&
|
||||
info->mHasGlow == has_glow &&
|
||||
info->mFullbright == fullbright &&
|
||||
info->mBlendFuncDst == bf_dst &&
|
||||
info->mBlendFuncSrc == bf_src)
|
||||
{
|
||||
batched = true;
|
||||
draw_vec[idx]->mCount += facep->getIndicesCount();
|
||||
draw_vec[idx]->mEnd += facep->getGeomCount();
|
||||
draw_vec[idx]->mVSize = llmax(draw_vec[idx]->mVSize, vsize);
|
||||
}
|
||||
else if (draw_vec[idx]->mStart == facep->getGeomIndex()+facep->getGeomCount()+1)
|
||||
{
|
||||
batched = true;
|
||||
draw_vec[idx]->mCount += facep->getIndicesCount();
|
||||
draw_vec[idx]->mStart -= facep->getGeomCount();
|
||||
draw_vec[idx]->mOffset = facep->getIndicesStart();
|
||||
draw_vec[idx]->mVSize = llmax(draw_vec[idx]->mVSize, vsize);
|
||||
if (draw_vec[idx]->mEnd == facep->getGeomIndex()-1)
|
||||
{
|
||||
batched = true;
|
||||
info->mCount += facep->getIndicesCount();
|
||||
info->mEnd += facep->getGeomCount();
|
||||
info->mVSize = llmax(draw_vec[idx]->mVSize, vsize);
|
||||
}
|
||||
else if (draw_vec[idx]->mStart == facep->getGeomIndex()+facep->getGeomCount()+1)
|
||||
{
|
||||
batched = true;
|
||||
info->mCount += facep->getIndicesCount();
|
||||
info->mStart -= facep->getGeomCount();
|
||||
info->mOffset = facep->getIndicesStart();
|
||||
info->mVSize = llmax(draw_vec[idx]->mVSize, vsize);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -932,6 +954,8 @@ void LLParticlePartition::getGeometry(LLSpatialGroup* group)
|
|||
info->mVSize = vsize;
|
||||
info->mBlendFuncDst = bf_dst;
|
||||
info->mBlendFuncSrc = bf_src;
|
||||
info->mHasGlow = has_glow;
|
||||
info->mParticle = TRUE;
|
||||
draw_vec.push_back(info);
|
||||
//for alpha sorting
|
||||
facep->setDrawInfo(info);
|
||||
|
|
|
|||
Loading…
Reference in New Issue