SL-12743 Restored the commit lost during the merge

meow-7.2.2
Andrey Lihatskiy 2020-09-29 16:04:40 +03:00
parent a2cb61d9f4
commit fbd36e5bf0
1 changed files with 82 additions and 56 deletions

View File

@ -6061,25 +6061,18 @@ static F32 calc_light_dist(LLVOVolume* light, const LLVector3& cam_pos, F32 max_
{
return max_dist;
}
F32 radius = light->getLightRadius();
bool selected = light->isSelected();
LLVector3 dpos = light->getRenderPosition() - cam_pos;
F32 dist2 = dpos.lengthSquared();
if (!selected && dist2 > (max_dist + radius)*(max_dist + radius))
{
return max_dist;
}
F32 dist = (F32) sqrt(dist2);
dist *= 1.f / inten;
dist -= radius;
if (selected)
{
dist -= 10000.f; // selected lights get highest priority
return 0.f; // selected lights get highest priority
}
F32 radius = light->getLightRadius();
F32 dist = dist_vec(light->getRenderPosition(), cam_pos);
dist = llmax(dist - radius, 0.f);
if (light->mDrawable.notNull() && light->mDrawable->isState(LLDrawable::ACTIVE))
{
// moving lights get a little higher priority (too much causes artifacts)
dist -= light->getLightRadius()*0.25f;
dist = llmax(dist - light->getLightRadius()*0.25f, 0.f);
}
return dist;
}
@ -6098,13 +6091,18 @@ void LLPipeline::calcNearbyLights(LLCamera& camera)
// mNearbyLight (and all light_set_t's) are sorted such that
// begin() == the closest light and rbegin() == the farthest light
const S32 MAX_LOCAL_LIGHTS = 6;
// LLVector3 cam_pos = gAgent.getCameraPositionAgent();
LLVector3 cam_pos = LLViewerJoystick::getInstance()->getOverrideCamera() ?
camera.getOrigin() :
gAgent.getPositionAgent();
F32 max_dist = LIGHT_MAX_RADIUS * 4.f; // ignore enitrely lights > 4 * max light rad
LLVector3 cam_pos = camera.getOrigin();
F32 max_dist;
if (LLPipeline::sRenderDeferred)
{
max_dist = RenderFarClip;
}
else
{
max_dist = llmin(RenderFarClip, LIGHT_MAX_RADIUS * 4.f);
}
// UPDATE THE EXISTING NEARBY LIGHTS
light_set_t cur_nearby_lights;
for (light_set_t::iterator iter = mNearbyLights.begin();
@ -6138,8 +6136,38 @@ void LLPipeline::calcNearbyLights(LLCamera& camera)
continue;
}
F32 dist = calc_light_dist(volight, cam_pos, max_dist);
cur_nearby_lights.insert(Light(drawable, dist, light->fade));
F32 dist = calc_light_dist(volight, cam_pos, max_dist);
F32 fade = light->fade;
// actual fade gets decreased/increased by setupHWLights
// light->fade value is 'time'.
// >=0 and light will become visible as value increases
// <0 and light will fade out
if (dist < max_dist)
{
if (fade < 0)
{
// mark light to fade in
// if fade was -LIGHT_FADE_TIME - it was fully invisible
// if fade -0 - it was fully visible
// visibility goes up from 0 to LIGHT_FADE_TIME.
fade += LIGHT_FADE_TIME;
}
}
else
{
// mark light to fade out
// visibility goes down from -0 to -LIGHT_FADE_TIME.
if (fade >= LIGHT_FADE_TIME)
{
fade = -0.0001f; // was fully visible
}
else if (fade >= 0)
{
// 0.75 visible light should stay 0.75 visible, but should reverse direction
fade -= LIGHT_FADE_TIME;
}
}
cur_nearby_lights.insert(Light(drawable, dist, fade));
}
mNearbyLights = cur_nearby_lights;
@ -6158,17 +6186,23 @@ void LLPipeline::calcNearbyLights(LLCamera& camera)
{
continue; // no lighting from HUD objects
}
F32 dist = calc_light_dist(light, cam_pos, max_dist);
if (dist >= max_dist)
if (!sRenderAttachedLights && light && light->isAttachment())
{
continue;
}
if (!sRenderAttachedLights && light && light->isAttachment())
LLVOAvatar * av = light->getAvatar();
if (av && (av->isTooComplex() || av->isInMuteList()))
{
// avatars that are already in the list will be removed by removeMutedAVsLights
continue;
}
F32 dist = calc_light_dist(light, cam_pos, max_dist);
if (dist >= max_dist)
{
continue;
}
new_nearby_lights.insert(Light(drawable, dist, 0.f));
if (new_nearby_lights.size() > (U32)MAX_LOCAL_LIGHTS)
if (!LLPipeline::sRenderDeferred && new_nearby_lights.size() > (U32)MAX_LOCAL_LIGHTS)
{
new_nearby_lights.erase(--new_nearby_lights.end());
const Light& last = *new_nearby_lights.rbegin();
@ -6181,7 +6215,7 @@ void LLPipeline::calcNearbyLights(LLCamera& camera)
iter != new_nearby_lights.end(); iter++)
{
const Light* light = &(*iter);
if (mNearbyLights.size() < (U32)MAX_LOCAL_LIGHTS)
if (LLPipeline::sRenderDeferred || mNearbyLights.size() < (U32)MAX_LOCAL_LIGHTS)
{
mNearbyLights.insert(*light);
((LLDrawable*) light->drawable)->setState(LLDrawable::NEARBY_LIGHT);
@ -6194,10 +6228,22 @@ void LLPipeline::calcNearbyLights(LLCamera& camera)
Light* farthest_light = (const_cast<Light*>(&(*(mNearbyLights.rbegin()))));
if (light->dist < farthest_light->dist)
{
if (farthest_light->fade >= 0.f)
{
farthest_light->fade = -(gFrameIntervalSeconds.value());
}
// mark light to fade out
// visibility goes down from -0 to -LIGHT_FADE_TIME.
//
// This is a mess, but for now it needs to be in sync
// with fade code above. Ex: code above detects distance < max,
// sets fade time to positive, this code then detects closer
// lights and sets fade time negative, fully compensating
// for the code above
if (farthest_light->fade >= LIGHT_FADE_TIME)
{
farthest_light->fade = -0.0001f; // was fully visible
}
else if (farthest_light->fade >= 0)
{
farthest_light->fade -= LIGHT_FADE_TIME;
}
}
else
{
@ -6317,12 +6363,6 @@ void LLPipeline::setupHWLights(LLDrawPool* pool)
}
}
const LLViewerObject *vobj = drawable->getVObj();
if(vobj && vobj->getAvatar() && vobj->getAvatar()->isInMuteList())
{
continue;
}
if (drawable->isState(LLDrawable::ACTIVE))
{
mLightMovingMask |= (1<<cur_light);
@ -8694,11 +8734,13 @@ void LLPipeline::renderDeferredLighting(LLRenderTarget *screen_target)
mCubeVB->setBuffer(LLVertexBuffer::MAP_VERTEX);
LLGLDepthTest depth(GL_TRUE, GL_FALSE);
for (LLDrawable::drawable_set_t::iterator iter = mLights.begin(); iter != mLights.end(); ++iter)
// mNearbyLights already includes distance calculation and excludes muted avatars.
// It is calculated from mLights
// mNearbyLights also provides fade value to gracefully fade-out out of range lights
for (light_set_t::iterator iter = mNearbyLights.begin(); iter != mNearbyLights.end(); ++iter)
{
LLDrawable *drawablep = *iter;
LLVOVolume *volume = drawablep->getVOVolume();
LLDrawable * drawablep = iter->drawable;
LLVOVolume * volume = drawablep->getVOVolume();
if (!volume)
{
continue;
@ -8712,24 +8754,8 @@ void LLPipeline::renderDeferredLighting(LLRenderTarget *screen_target)
}
}
const LLViewerObject *vobj = drawablep->getVObj();
if (vobj)
{
LLVOAvatar *av = vobj->getAvatar();
if (av && (av->isTooComplex() || av->isInMuteList()))
{
continue;
}
}
const LLVector3 position = drawablep->getPositionAgent();
if (dist_vec(position, LLViewerCamera::getInstance()->getOrigin()) > RenderFarClip + volume->getLightRadius())
{
continue;
}
LLVector4a center;
center.load3(position.mV);
center.load3(drawablep->getPositionAgent().mV);
const F32 *c = center.getF32ptr();
F32 s = volume->getLightRadius() * 1.5f;