summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--indra/newview/llheroprobemanager.cpp66
-rw-r--r--indra/newview/llheroprobemanager.h8
-rw-r--r--indra/newview/llpanelvolume.cpp4
-rw-r--r--indra/newview/llviewerobject.cpp34
-rw-r--r--indra/newview/llviewerobject.h4
-rw-r--r--indra/newview/llvovolume.cpp22
-rw-r--r--indra/newview/llvovolume.h1
7 files changed, 107 insertions, 32 deletions
diff --git a/indra/newview/llheroprobemanager.cpp b/indra/newview/llheroprobemanager.cpp
index c385c9a99f..166321930f 100644
--- a/indra/newview/llheroprobemanager.cpp
+++ b/indra/newview/llheroprobemanager.cpp
@@ -109,16 +109,16 @@ void LLHeroProbeManager::update()
// Get the nearest hero.
float distance = F32_MAX;
- if (mNearestHero.notNull())
+ if (mNearestHero != nullptr)
{
- distance = mNearestHero->mDistanceWRTCamera;
+ distance = mNearestHero->mDrawable->mDistanceWRTCamera;
}
- for (auto drawable : mHeroList)
+ for (auto drawable : mHeroVOList)
{
- if (drawable.notNull() && drawable != mNearestHero)
+ if (drawable != nullptr && drawable != mNearestHero && drawable->mDrawable.notNull())
{
- if (drawable->mDistanceWRTCamera < distance)
+ if (drawable->mDrawable->mDistanceWRTCamera < distance)
{
mIsInTransition = true;
mNearestHero = drawable;
@@ -133,8 +133,41 @@ void LLHeroProbeManager::update()
}
else
{
- if (mNearestHero.notNull())
- probe_pos.set(mNearestHero->mXform.getPosition().mV[0], mNearestHero->mXform.getPosition().mV[1], camera_pos.mV[2]);
+
+ if (mNearestHero != nullptr && mNearestHero->mDrawable.notNull())
+ {
+
+ LLVector3 hero_pos = mNearestHero->mDrawable->mXform.getPosition();
+ switch (mNearestHero->mirrorPlacementMode()) {
+ case 0:
+ probe_pos.set(camera_pos.mV[0], hero_pos.mV[1], hero_pos.mV[2]);
+ break;
+ case 1:
+
+ probe_pos.set(hero_pos.mV[0], camera_pos.mV[1], hero_pos.mV[2]);
+ break;
+ case 2:
+
+ probe_pos.set(hero_pos.mV[0], hero_pos.mV[1], camera_pos.mV[2]);
+ break;
+
+ case 3:
+ // Find the nearest point relative to the camera on the VOVolume.
+ LLVector4a hit_pos;
+ bool hit = mNearestHero->lineSegmentIntersect(LLVector4a(camera_pos.mV[0], camera_pos.mV[1], camera_pos.mV[2]),
+ LLVector4a(hero_pos.mV[0], hero_pos.mV[1], hero_pos.mV[2]),
+ -1,
+ FALSE,
+ FALSE,
+ FALSE,
+ NULL,
+ &hit_pos);
+ if (hit)
+ probe_pos = hit_pos;
+
+ break;
+ }
+ }
if (mHeroProbeStrength < 1.f)
@@ -505,7 +538,7 @@ void LLHeroProbeManager::cleanup()
glDeleteBuffers(1, &mUBO);
mUBO = 0;
- mHeroList.clear();
+ mHeroVOList.clear();
mNearestHero = nullptr;
}
@@ -523,18 +556,19 @@ void LLHeroProbeManager::doOcclusion()
}
}
-void LLHeroProbeManager::registerHeroDrawable(LLDrawable* drawablep)
+void LLHeroProbeManager::registerHeroDrawable(LLVOVolume* drawablep)
{
- if (mHeroList.find(drawablep) == mHeroList.end())
- {
- mHeroList.insert(drawablep);
- }
+ if (mHeroVOList.find(drawablep) == mHeroVOList.end())
+ {
+ mHeroVOList.insert(drawablep);
+ LL_INFOS() << "Mirror drawable registered." << LL_ENDL;
+ }
}
-void LLHeroProbeManager::unregisterHeroDrawable(LLDrawable *drawablep)
+void LLHeroProbeManager::unregisterHeroDrawable(LLVOVolume* drawablep)
{
- if (mHeroList.find(drawablep) != mHeroList.end())
+ if (mHeroVOList.find(drawablep) != mHeroVOList.end())
{
- mHeroList.erase(drawablep);
+ mHeroVOList.erase(drawablep);
}
}
diff --git a/indra/newview/llheroprobemanager.h b/indra/newview/llheroprobemanager.h
index 24246af3d3..b817b2396f 100644
--- a/indra/newview/llheroprobemanager.h
+++ b/indra/newview/llheroprobemanager.h
@@ -68,8 +68,8 @@ public:
// perform occlusion culling on all active reflection probes
void doOcclusion();
- void registerHeroDrawable(LLDrawable* drawablep);
- void unregisterHeroDrawable(LLDrawable* drawablep);
+ void registerHeroDrawable(LLVOVolume* drawablep);
+ void unregisterHeroDrawable(LLVOVolume* drawablep);
private:
friend class LLPipeline;
@@ -128,7 +128,7 @@ private:
// if true, reset all probe render state on the next update (for teleports and sky changes)
bool mReset = false;
- LLDrawable::ordered_drawable_set_t mHeroList;
- LLPointer<LLDrawable> mNearestHero;
+ std::set<LLVOVolume*> mHeroVOList;
+ LLVOVolume* mNearestHero;
};
diff --git a/indra/newview/llpanelvolume.cpp b/indra/newview/llpanelvolume.cpp
index d62a640b5c..74c02099f8 100644
--- a/indra/newview/llpanelvolume.cpp
+++ b/indra/newview/llpanelvolume.cpp
@@ -755,10 +755,6 @@ void LLPanelVolume::sendIsMirror()
}
LLVOVolume *volobjp = (LLVOVolume *)objectp;
- // Quick hack to set the mirror locally.
-
- gPipeline.mHeroProbeManager.registerHeroDrawable(volobjp->mDrawable);
-
BOOL value = getChild<LLUICtrl>("Mirror Checkbox Ctrl")->getValue();
volobjp->setIsMirror(value);
LL_INFOS() << "update mirror sent" << LL_ENDL;
diff --git a/indra/newview/llviewerobject.cpp b/indra/newview/llviewerobject.cpp
index 59a61f0c63..7032ce41d5 100644
--- a/indra/newview/llviewerobject.cpp
+++ b/indra/newview/llviewerobject.cpp
@@ -1524,11 +1524,43 @@ U32 LLViewerObject::processUpdateMessage(LLMessageSystem *mesgsys,
std::string temp_string;
mesgsys->getStringFast(_PREHASH_ObjectData, _PREHASH_Text, temp_string, block_num );
+ std::stringstream ss(temp_string);
+ std::string word;
+ bool mirror_detected = false;
+ while (ss >> word)
+ {
+ if (word == "Mirror")
+ {
+ mirror_detected = true;
+ mIsMirror = true;
+ }
+ else if (word == "XAlign" && mIsMirror)
+ {
+ mMirrorPlacementMode = 0;
+ }
+ else if (word == "YAlign" && mIsMirror)
+ {
+ mMirrorPlacementMode = 1;
+ }
+ else if (word == "ZAlign" && mIsMirror)
+ {
+ mMirrorPlacementMode = 2;
+ }
+ else if (word == "NearestPoint" && mIsMirror)
+ {
+ mMirrorPlacementMode = 3;
+ }
+ }
+
LLColor4U coloru;
mesgsys->getBinaryDataFast(_PREHASH_ObjectData, _PREHASH_TextColor, coloru.mV, 4, block_num);
-
+
// alpha was flipped so that it zero encoded better
coloru.mV[3] = 255 - coloru.mV[3];
+
+ if (mirror_detected)
+ coloru.mV[3] = 0;
+
mText->setColor(LLColor4(coloru));
mText->setString(temp_string);
diff --git a/indra/newview/llviewerobject.h b/indra/newview/llviewerobject.h
index 7175b088d9..c165f164a8 100644
--- a/indra/newview/llviewerobject.h
+++ b/indra/newview/llviewerobject.h
@@ -258,6 +258,7 @@ public:
virtual BOOL hasLightTexture() const { return FALSE; }
virtual BOOL isReflectionProbe() const { return FALSE; }
virtual BOOL isMirror() const { return FALSE; }
+ virtual U8 mirrorPlacementMode() const { return 0; }
// This method returns true if the object is over land owned by
// the agent, one of its groups, or it encroaches and
@@ -878,6 +879,9 @@ protected:
F32 mPhysicsCost;
F32 mLinksetPhysicsCost;
+ bool mIsMirror;
+ U8 mMirrorPlacementMode;
+
// If true, "shrink wrap" this volume in its spatial partition. See "shrinkWrap"
bool mShouldShrinkWrap = false;
diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp
index 3c3d8d5123..23580c4ec0 100644
--- a/indra/newview/llvovolume.cpp
+++ b/indra/newview/llvovolume.cpp
@@ -249,6 +249,9 @@ LLVOVolume::~LLVOVolume()
mTextureAnimp = NULL;
delete mVolumeImpl;
mVolumeImpl = NULL;
+
+ if (mIsMirror)
+ gPipeline.mHeroProbeManager.unregisterHeroDrawable(this);
gMeshRepo.unregisterMesh(this);
@@ -1045,9 +1048,9 @@ LLDrawable *LLVOVolume::createDrawable(LLPipeline *pipeline)
updateReflectionProbePtr();
}
- //if (isMirror())
+ if (isMirror())
{
- gPipeline.mHeroProbeManager.registerHeroDrawable(mDrawable);
+ gPipeline.mHeroProbeManager.registerHeroDrawable(this);
}
updateRadius();
@@ -3396,17 +3399,22 @@ void LLVOVolume::updateMirrorDrawable()
{
if (isMirror())
{
- gPipeline.mHeroProbeManager.registerHeroDrawable(mDrawable);
+ gPipeline.mHeroProbeManager.registerHeroDrawable(this);
}
else
{
- gPipeline.mHeroProbeManager.unregisterHeroDrawable(mDrawable);
+ gPipeline.mHeroProbeManager.unregisterHeroDrawable(this);
}
}
BOOL LLVOVolume::isMirror() const
{
- return getParameterEntryInUse(LLNetworkData::PARAMS_REFLECTION_PROBE);
+ return mIsMirror;
+}
+
+U8 LLVOVolume::mirrorPlacementMode() const
+{
+ return mMirrorPlacementMode;
}
BOOL LLVOVolume::isReflectionProbe() const
@@ -4461,9 +4469,9 @@ void LLVOVolume::parameterChanged(U16 param_type, LLNetworkData* data, BOOL in_u
updateReflectionProbePtr();
if (isMirror())
- gPipeline.mHeroProbeManager.registerHeroDrawable(mDrawable);
+ gPipeline.mHeroProbeManager.registerHeroDrawable(this);
else
- gPipeline.mHeroProbeManager.unregisterHeroDrawable(mDrawable);
+ gPipeline.mHeroProbeManager.unregisterHeroDrawable(this);
}
void LLVOVolume::updateReflectionProbePtr()
diff --git a/indra/newview/llvovolume.h b/indra/newview/llvovolume.h
index 32c89ddae2..848f455e2a 100644
--- a/indra/newview/llvovolume.h
+++ b/indra/newview/llvovolume.h
@@ -298,6 +298,7 @@ public:
// Mirrors
bool setIsMirror(BOOL is_mirror);
void updateMirrorDrawable();
+ U8 mirrorPlacementMode() const override;
// Reflection Probes
bool setIsReflectionProbe(BOOL is_probe);