summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJonathan "Geenz" Goodman <geenz@geenzo.com>2023-09-29 04:11:25 -0700
committerJonathan "Geenz" Goodman <geenz@geenzo.com>2023-09-29 04:11:25 -0700
commit80df1d681e7fd83fe0806f51a3f96275b10c0a5a (patch)
treee845a0642c23616365874857853d546579d44d87
parent18b219cf83a1cd405cf36b9f58fc48f717409598 (diff)
Can you say, generic reflectors?
DRTVWR-583
-rw-r--r--indra/newview/llheroprobemanager.cpp100
1 files changed, 32 insertions, 68 deletions
diff --git a/indra/newview/llheroprobemanager.cpp b/indra/newview/llheroprobemanager.cpp
index fe9f669365..59345ca35f 100644
--- a/indra/newview/llheroprobemanager.cpp
+++ b/indra/newview/llheroprobemanager.cpp
@@ -92,7 +92,7 @@ void LLHeroProbeManager::update()
{
U32 res = mProbeResolution;
U32 count = log2((F32)res) + 0.5f;
-
+
mMipChain.resize(count);
for (int i = 0; i < count; ++i)
{
@@ -102,80 +102,44 @@ void LLHeroProbeManager::update()
}
llassert(mProbes[0] == mDefaultProbe);
-
+
LLVector4a probe_pos;
LLVector3 camera_pos = LLViewerCamera::instance().mOrigin;
if (mHeroVOList.size() > 0)
{
+ if (mNearestHero != nullptr && mNearestHero->mDrawable.notNull())
{
- if (mNearestHero != nullptr && mNearestHero->mDrawable.notNull())
- {
+ U8 mode = mNearestHero->mirrorPlacementMode();
+ mode = llmin(mNearestHero->mDrawable->getNumFaces() - 1, mode);
- LLVector3 hero_pos = mNearestHero->mDrawable->getFace(mNearestHero->mirrorPlacementMode())->getPositionAgent();
-
- LLVector4a hit_pos;
- LLVector3 focus_point;
- LLQuaternion camera_rot;
- F32 angleInRadians = 180 * DEG_TO_RAD;
-
- LLMatrix4 rotationMatrix;
-
- rotationMatrix.rotate(angleInRadians, LLVector4(mNearestHero->mDrawable->getFace(mNearestHero->mirrorPlacementMode())->getAverageNormal()));
-
- LLVector3 translatedPoint;
- LLVector3 rotatedTranslatedPoint;
- LLVector3 rotatedPoint;
-
- translatedPoint = camera_pos - hero_pos;
- rotatedTranslatedPoint = translatedPoint * rotationMatrix;
- rotatedPoint = rotatedTranslatedPoint + hero_pos;
-
- probe_pos.load3(rotatedPoint.mV);
-
- /*
- switch (mNearestHero->mirrorPlacementMode()) {
- case 0:
-
- hero_pos.mV[1] = camera_pos.mV[1];
-
- rotationMatrix.rotate(angleInRadians, LLVector4(1, 0, 0, 0));
-
- translatedPoint = camera_pos - hero_pos;
- rotatedTranslatedPoint = translatedPoint * rotationMatrix;
- rotatedPoint = rotatedTranslatedPoint + hero_pos;
-
- probe_pos.load3(rotatedPoint.mV);
- break;
- case 1:
-
- hero_pos.mV[2] = camera_pos.mV[2];
-
- rotationMatrix.rotate(angleInRadians, LLVector4(0, 1, 0, 0));
-
- translatedPoint = camera_pos - hero_pos;
- rotatedTranslatedPoint = translatedPoint * rotationMatrix;
- rotatedPoint = rotatedTranslatedPoint + hero_pos;
-
- probe_pos.load3(rotatedPoint.mV);
- break;
- case 2:
-
- hero_pos.mV[0] = camera_pos.mV[0];
-
- rotationMatrix.rotate(angleInRadians, LLVector4(0, 0, 1, 0));
-
- translatedPoint = camera_pos - hero_pos;
- rotatedTranslatedPoint = translatedPoint * rotationMatrix;
- rotatedPoint = rotatedTranslatedPoint + hero_pos;
-
- probe_pos.load3(rotatedPoint.mV);
- break;
- }
- */
- }
-
- mHeroProbeStrength = 1;
+ LLFace *face = mNearestHero->mDrawable->getFace(mode);
+ LLVector3 hero_pos = face->getPositionAgent();
+
+
+ // Calculate the average normal.
+ LLVector4a *posp = face->getViewerObject()->getVolume()->getVolumeFace(face->getTEOffset()).mPositions;
+ U16 *indp = face->getViewerObject()->getVolume()->getVolumeFace(face->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]);
+
+ face_normal.normalize();
+ face_normal *= face->getXform()->getWorldRotation();
+
+ LLVector3 offset = camera_pos - hero_pos;
+ LLVector3 project = face_normal * (offset * face_normal);
+ LLVector3 reject = offset - project;
+ LLVector3 point = (reject - project) + hero_pos;
+
+ probe_pos.load3(point.mV);
}
+
+ mHeroProbeStrength = 1;
}
else
{