SL-19538 Clear probes on sky setting slam. Better probe update prioritization. Incidental decruft.
parent
de73cf7599
commit
413ce656c8
|
|
@ -1265,6 +1265,8 @@ void LLEnvironment::setEnvironment(LLEnvironment::EnvSelection_t env, LLEnvironm
|
|||
}
|
||||
}
|
||||
|
||||
gPipeline.mReflectionMapManager.reset();
|
||||
|
||||
if (!mSignalEnvChanged.empty())
|
||||
mSignalEnvChanged(env, env_version);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -169,7 +169,6 @@ void LLReflectionMap::autoAdjustOrigin()
|
|||
|
||||
bool LLReflectionMap::intersects(LLReflectionMap* other)
|
||||
{
|
||||
// TODO: incorporate getBox
|
||||
LLVector4a delta;
|
||||
delta.setSub(other->mOrigin, mOrigin);
|
||||
|
||||
|
|
@ -239,11 +238,13 @@ bool LLReflectionMap::getBox(LLMatrix4& box)
|
|||
scale.set_scale(glh::vec3f(s.mV));
|
||||
if (vobjp->mDrawable != nullptr)
|
||||
{
|
||||
// object to agent space (no scale)
|
||||
glh::matrix4f rm((F32*)vobjp->mDrawable->getWorldMatrix().mMatrix);
|
||||
|
||||
glh::matrix4f rt((F32*)vobjp->getRelativeXform().mMatrix);
|
||||
// construct object to camera space (with scale)
|
||||
mv = mv * rm * scale;
|
||||
|
||||
mv = mv * rm * scale; // *rt;
|
||||
// inverse is camera space to object unit cube
|
||||
mv = mv.inverse();
|
||||
|
||||
box = LLMatrix4(mv.m);
|
||||
|
|
|
|||
|
|
@ -75,6 +75,23 @@ struct CompareProbeDistance
|
|||
}
|
||||
};
|
||||
|
||||
// return true if a is higher priority for an update than b
|
||||
static bool check_priority(LLReflectionMap* a, LLReflectionMap* b)
|
||||
{
|
||||
if (!a->mComplete && !b->mComplete)
|
||||
{ //neither probe is complete, use distance
|
||||
return a->mDistance < b->mDistance;
|
||||
}
|
||||
else if (a->mComplete && b->mComplete)
|
||||
{ //both probes are complete, use combination of distance and last update time
|
||||
return (a->mDistance - (gFrameTimeSeconds - a->mLastUpdateTime)) <
|
||||
(b->mDistance - (gFrameTimeSeconds - b->mLastUpdateTime));
|
||||
}
|
||||
|
||||
// one of these probes is not complete, if b is complete, a is higher priority
|
||||
return b->mComplete;
|
||||
}
|
||||
|
||||
// helper class to seed octree with probes
|
||||
void LLReflectionMapManager::update()
|
||||
{
|
||||
|
|
@ -181,6 +198,12 @@ void LLReflectionMapManager::update()
|
|||
|
||||
LLVector4a d;
|
||||
|
||||
if (probe != mDefaultProbe)
|
||||
{
|
||||
d.setSub(camera_pos, probe->mOrigin);
|
||||
probe->mDistance = d.getLength3().getF32() - probe->mRadius;
|
||||
}
|
||||
|
||||
if (probe->mComplete)
|
||||
{
|
||||
probe->mFadeIn = llmin((F32) (probe->mFadeIn + gFrameIntervalSeconds), 1.f);
|
||||
|
|
@ -201,7 +224,7 @@ void LLReflectionMapManager::update()
|
|||
if (!did_update &&
|
||||
i < mReflectionProbeCount &&
|
||||
(oldestProbe == nullptr ||
|
||||
probe->mLastUpdateTime < oldestProbe->mLastUpdateTime))
|
||||
check_priority(probe, oldestProbe)))
|
||||
{
|
||||
oldestProbe = probe;
|
||||
}
|
||||
|
|
@ -214,12 +237,6 @@ void LLReflectionMapManager::update()
|
|||
{
|
||||
closestDynamic = probe;
|
||||
}
|
||||
|
||||
if (probe != mDefaultProbe)
|
||||
{
|
||||
d.setSub(camera_pos, probe->mOrigin);
|
||||
probe->mDistance = d.getLength3().getF32() - probe->mRadius;
|
||||
}
|
||||
}
|
||||
|
||||
if (realtime && closestDynamic != nullptr)
|
||||
|
|
@ -702,12 +719,9 @@ void LLReflectionMapManager::updateProbeFace(LLReflectionMap* probe, U32 face)
|
|||
}
|
||||
}
|
||||
|
||||
void LLReflectionMapManager::rebuild()
|
||||
void LLReflectionMapManager::reset()
|
||||
{
|
||||
for (auto& probe : mProbes)
|
||||
{
|
||||
probe->mLastUpdateTime = 0.f;
|
||||
}
|
||||
mReset = true;
|
||||
}
|
||||
|
||||
void LLReflectionMapManager::shift(const LLVector4a& offset)
|
||||
|
|
@ -950,12 +964,30 @@ void renderReflectionProbe(LLReflectionMap* probe)
|
|||
gGL.begin(gGL.LINES);
|
||||
for (auto& neighbor : probe->mNeighbors)
|
||||
{
|
||||
if (probe->mViewerObject && neighbor->mViewerObject)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
gGL.vertex3fv(po);
|
||||
gGL.vertex3fv(neighbor->mOrigin.getF32ptr());
|
||||
}
|
||||
gGL.end();
|
||||
gGL.flush();
|
||||
|
||||
gGL.diffuseColor4f(1, 1, 0, 1);
|
||||
gGL.begin(gGL.LINES);
|
||||
for (auto& neighbor : probe->mNeighbors)
|
||||
{
|
||||
if (probe->mViewerObject && neighbor->mViewerObject)
|
||||
{
|
||||
gGL.vertex3fv(po);
|
||||
gGL.vertex3fv(neighbor->mOrigin.getF32ptr());
|
||||
}
|
||||
}
|
||||
gGL.end();
|
||||
gGL.flush();
|
||||
|
||||
#if 0
|
||||
LLSpatialGroup* group = probe->mGroup;
|
||||
if (group)
|
||||
|
|
@ -1022,8 +1054,9 @@ void LLReflectionMapManager::initReflectionMaps()
|
|||
|
||||
U32 count = llclamp((S32) probe_count, 1, LL_MAX_REFLECTION_PROBE_COUNT);
|
||||
|
||||
if (mTexture.isNull() || mReflectionProbeCount != count)
|
||||
if (mTexture.isNull() || mReflectionProbeCount != count || mReset)
|
||||
{
|
||||
mReset = false;
|
||||
mReflectionProbeCount = count;
|
||||
mProbeResolution = nhpo2(llclamp(gSavedSettings.getU32("RenderReflectionProbeResolution"), (U32)64, (U32)512));
|
||||
mMaxProbeLOD = log2f(mProbeResolution) - 1.f; // number of mips - 1
|
||||
|
|
@ -1045,6 +1078,7 @@ void LLReflectionMapManager::initReflectionMaps()
|
|||
|
||||
for (auto& probe : mProbes)
|
||||
{
|
||||
probe->mLastUpdateTime = 0.f;
|
||||
probe->mComplete = false;
|
||||
probe->mProbeIndex = -1;
|
||||
probe->mCubeArray = nullptr;
|
||||
|
|
|
|||
|
|
@ -80,8 +80,8 @@ public:
|
|||
// Guaranteed to not return null
|
||||
LLReflectionMap* registerViewerObject(LLViewerObject* vobj);
|
||||
|
||||
// force an update of all probes
|
||||
void rebuild();
|
||||
// reset all state on the next update
|
||||
void reset();
|
||||
|
||||
// called on region crossing to "shift" probes into new coordinate frame
|
||||
void shift(const LLVector4a& offset);
|
||||
|
|
@ -190,5 +190,8 @@ private:
|
|||
|
||||
// amount to scale local lights during an irradiance map update (set during updateProbeFace and used by LLPipeline)
|
||||
F32 mLightScale = 1.f;
|
||||
|
||||
// if true, reset all probe render state on the next update (for teleports and sky changes)
|
||||
bool mReset = false;
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -8451,12 +8451,6 @@ void handle_cache_clear_immediately()
|
|||
LLNotificationsUtil::add("ConfirmClearCache", LLSD(), LLSD(), callback_clear_cache_immediately);
|
||||
}
|
||||
|
||||
void handle_rebuild_reflection_probes()
|
||||
{
|
||||
gPipeline.mReflectionMapManager.rebuild();
|
||||
}
|
||||
|
||||
|
||||
void handle_web_content_test(const LLSD& param)
|
||||
{
|
||||
std::string url = param.asString();
|
||||
|
|
@ -9550,9 +9544,7 @@ void initialize_menus()
|
|||
|
||||
//Develop (clear cache immediately)
|
||||
commit.add("Develop.ClearCache", boost::bind(&handle_cache_clear_immediately) );
|
||||
//Develop (override environment map)
|
||||
commit.add("Develop.RebuildReflectionProbes", boost::bind(&handle_rebuild_reflection_probes));
|
||||
|
||||
|
||||
// Admin >Object
|
||||
view_listener_t::addMenu(new LLAdminForceTakeCopy(), "Admin.ForceTakeCopy");
|
||||
view_listener_t::addMenu(new LLAdminHandleObjectOwnerSelf(), "Admin.HandleObjectOwnerSelf");
|
||||
|
|
|
|||
|
|
@ -3238,13 +3238,6 @@ function="World.EnvPreset"
|
|||
function="Advanced.HandleAttachedLightParticles"
|
||||
parameter="RenderAttachedParticles" />
|
||||
</menu_item_check>
|
||||
<menu_item_call
|
||||
enabled="true"
|
||||
label="Rebuild Reflection Probes"
|
||||
name="Rebuild Reflection Probes">
|
||||
<menu_item_call.on_click
|
||||
function="Develop.RebuildReflectionProbes" />
|
||||
</menu_item_call>
|
||||
<menu_item_separator />
|
||||
|
||||
<menu_item_call
|
||||
|
|
|
|||
Loading…
Reference in New Issue