summaryrefslogtreecommitdiff
path: root/indra/newview/llheroprobemanager.cpp
diff options
context:
space:
mode:
authorJonathan "Geenz" Goodman <geenz@geenzo.com>2024-02-06 02:53:57 -0800
committerJonathan "Geenz" Goodman <geenz@geenzo.com>2024-02-06 02:53:57 -0800
commit739ff27c0649af9c74e00f31934d89405ff14373 (patch)
tree1047c3ec7a9c06f94509479940e461fdfbf94bad /indra/newview/llheroprobemanager.cpp
parent086249191078bcfb81d2697509c325fb34ffaf94 (diff)
#740 Make sure we evaluate if the probe is a mirror probe or not.
#682 Re-enable gaussian filtering, and reduce the mirror resolution back to 1024. Also just generally clean up the code a bit.
Diffstat (limited to 'indra/newview/llheroprobemanager.cpp')
-rw-r--r--indra/newview/llheroprobemanager.cpp65
1 files changed, 35 insertions, 30 deletions
diff --git a/indra/newview/llheroprobemanager.cpp b/indra/newview/llheroprobemanager.cpp
index 39f5bdec5a..c9728b8d93 100644
--- a/indra/newview/llheroprobemanager.cpp
+++ b/indra/newview/llheroprobemanager.cpp
@@ -127,38 +127,22 @@ void LLHeroProbeManager::update()
else
{
// Valid drawables only please. Unregister this one.
- unregisterHeroDrawable(vo);
+ unregisterViewerObject(vo);
}
}
else
{
- unregisterHeroDrawable(vo);
+ unregisterViewerObject(vo);
}
}
if (mNearestHero != nullptr && mNearestHero->mDrawable.notNull())
{
- U8 mode = mNearestHero->mirrorFace();
- mode = llmin(mNearestHero->mDrawable->getNumFaces() - 1, mode);
-
- mCurrentFace = mNearestHero->mDrawable->getFace(mode);
- LLVector3 hero_pos = mCurrentFace->getPositionAgent();
-
-
- // Calculate the average normal.
- LLVector4a *posp = mCurrentFace->getViewerObject()->getVolume()->getVolumeFace(mCurrentFace->getTEOffset()).mPositions;
- U16 *indp = mCurrentFace->getViewerObject()->getVolume()->getVolumeFace(mCurrentFace->getTEOffset()).mIndices;
- // get first three vertices (first triangle)
- LLVector4a v0 = posp[indp[0]];
- LLVector4a v1 = posp[indp[1]];
- LLVector4a v2 = posp[indp[2]];
-
- v1.sub(v0);
- v2.sub(v0);
- LLVector3 face_normal = LLVector3(v1[0], v1[1], v1[2]) % LLVector3(v2[0], v2[1], v2[2]);
+ LLVector3 hero_pos = mNearestHero->getPositionAgent();
+ LLVector3 face_normal = LLVector3(0, 0, 1);
+ face_normal *= mNearestHero->mDrawable->getXform()->getWorldRotation();
face_normal.normalize();
- face_normal *= mCurrentFace->getXform()->getWorldRotation();
LLVector3 offset = camera_pos - hero_pos;
LLVector3 project = face_normal * (offset * face_normal);
@@ -166,7 +150,7 @@ void LLHeroProbeManager::update()
LLVector3 point = (reject - project) + hero_pos;
mCurrentClipPlane.setVec(hero_pos, face_normal);
- mMirrorPosition = mNearestHero->getPositionAgent();
+ mMirrorPosition = hero_pos;
mMirrorNormal = face_normal;
@@ -254,6 +238,30 @@ void LLHeroProbeManager::updateProbeFace(LLReflectionMap* probe, U32 face, F32 n
LLRenderTarget *screen_rt = &gPipeline.mHeroProbeRT.screen;
LLRenderTarget *depth_rt = &gPipeline.mHeroProbeRT.deferredScreen;
+
+ // perform a gaussian blur on the super sampled render before downsampling
+ {
+ gGaussianProgram.bind();
+ gGaussianProgram.uniform1f(resScale, 1.f / (mProbeResolution * 2));
+ S32 diffuseChannel = gGaussianProgram.enableTexture(LLShaderMgr::DEFERRED_DIFFUSE, LLTexUnit::TT_TEXTURE);
+
+ // horizontal
+ gGaussianProgram.uniform2f(direction, 1.f, 0.f);
+ gGL.getTexUnit(diffuseChannel)->bind(screen_rt);
+ mRenderTarget.bindTarget();
+ gPipeline.mScreenTriangleVB->setBuffer();
+ gPipeline.mScreenTriangleVB->drawArrays(LLRender::TRIANGLES, 0, 3);
+ mRenderTarget.flush();
+
+ // vertical
+ gGaussianProgram.uniform2f(direction, 0.f, 1.f);
+ gGL.getTexUnit(diffuseChannel)->bind(&mRenderTarget);
+ screen_rt->bindTarget();
+ gPipeline.mScreenTriangleVB->setBuffer();
+ gPipeline.mScreenTriangleVB->drawArrays(LLRender::TRIANGLES, 0, 3);
+ screen_rt->flush();
+ gGaussianProgram.unbind();
+ }
S32 mips = log2((F32)mProbeResolution) + 0.5f;
@@ -527,24 +535,21 @@ void LLHeroProbeManager::doOcclusion()
}
}
-void LLHeroProbeManager::registerHeroDrawable(LLVOVolume* drawablep)
+void LLHeroProbeManager::registerViewerObject(LLVOVolume* drawablep)
{
+ llassert(drawablep != nullptr);
+
if (mHeroVOList.find(drawablep) == mHeroVOList.end())
{
+ // Probe isn't in our list for consideration. Add it.
mHeroVOList.insert(drawablep);
- LL_INFOS() << "Mirror drawable registered." << LL_ENDL;
}
}
-void LLHeroProbeManager::unregisterHeroDrawable(LLVOVolume* drawablep)
+void LLHeroProbeManager::unregisterViewerObject(LLVOVolume* drawablep)
{
if (mHeroVOList.find(drawablep) != mHeroVOList.end())
{
mHeroVOList.erase(drawablep);
}
}
-
-bool LLHeroProbeManager::isViableMirror(LLFace* face) const
-{
- return face == mCurrentFace;
-}