summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRunitaiLinden <davep@lindenlab.com>2024-02-07 11:13:45 -0600
committerGitHub <noreply@github.com>2024-02-07 11:13:45 -0600
commit7b83294216d6d672d7a8657ebccd5ea29d7fd9c8 (patch)
tree0299ea6076cc510169accebc52dd13ba7ebf093e
parentb0c7dc653dc730f1f95aa95fc6df876dfe7b04a0 (diff)
parent4ddad4cd4365259d9ac90104c8fe946edabe025b (diff)
Merge pull request #748 from secondlife/geenz/mirror-masking
Add mirrors prototype UI + data model
-rw-r--r--indra/llprimitive/llprimitive.cpp47
-rw-r--r--indra/llprimitive/llprimitive.h14
-rw-r--r--indra/newview/app_settings/settings.xml2
-rw-r--r--indra/newview/llheroprobemanager.cpp65
-rw-r--r--indra/newview/llheroprobemanager.h7
-rw-r--r--indra/newview/llpanelvolume.cpp67
-rw-r--r--indra/newview/llpanelvolume.h4
-rw-r--r--indra/newview/llviewerobject.cpp46
-rw-r--r--indra/newview/llviewerobject.h5
-rw-r--r--indra/newview/llvovolume.cpp103
-rw-r--r--indra/newview/llvovolume.h9
-rw-r--r--indra/newview/skins/default/xui/en/floater_tools.xml47
12 files changed, 166 insertions, 250 deletions
diff --git a/indra/llprimitive/llprimitive.cpp b/indra/llprimitive/llprimitive.cpp
index f67959de5b..53d09df618 100644
--- a/indra/llprimitive/llprimitive.cpp
+++ b/indra/llprimitive/llprimitive.cpp
@@ -1825,40 +1825,6 @@ bool LLLightParams::fromLLSD(LLSD& sd)
//============================================================================
-LLMirrorParams::LLMirrorParams()
-{
- mType = PARAMS_MIRROR;
-}
-
-BOOL LLMirrorParams::pack(LLDataPacker &dp) const
-{
- return TRUE;
-}
-
-BOOL LLMirrorParams::unpack(LLDataPacker &dp)
-{
- return TRUE;
-}
-
-bool LLMirrorParams::operator==(const LLNetworkData& data) const
-{
- if (data.mType != PARAMS_REFLECTION_PROBE)
- {
- return false;
- }
- return true;
-}
-
-void LLMirrorParams::copy(const LLNetworkData& data)
-{
- const LLMirrorParams *param = (LLMirrorParams*)&data;
- mType = param->mType;
-}
-
-//============================================================================
-
-//============================================================================
-
LLReflectionProbeParams::LLReflectionProbeParams()
{
mType = PARAMS_REFLECTION_PROBE;
@@ -1968,6 +1934,19 @@ void LLReflectionProbeParams::setIsDynamic(bool is_dynamic)
}
}
+
+void LLReflectionProbeParams::setIsMirror(bool is_mirror)
+{
+ if (is_mirror)
+ {
+ mFlags |= FLAG_MIRROR;
+ }
+ else
+ {
+ mFlags &= ~FLAG_MIRROR;
+ }
+}
+
//============================================================================
LLFlexibleObjectData::LLFlexibleObjectData()
{
diff --git a/indra/llprimitive/llprimitive.h b/indra/llprimitive/llprimitive.h
index 88bac34ef2..5622483861 100644
--- a/indra/llprimitive/llprimitive.h
+++ b/indra/llprimitive/llprimitive.h
@@ -109,7 +109,6 @@ public:
PARAMS_EXTENDED_MESH = 0x70,
PARAMS_RENDER_MATERIAL = 0x80,
PARAMS_REFLECTION_PROBE = 0x90,
- PARAMS_MIRROR = 0x100,
};
public:
@@ -173,16 +172,6 @@ public:
F32 getCutoff() const { return mCutoff; }
};
-class LLMirrorParams : public LLNetworkData
-{
-public:
- LLMirrorParams();
- /*virtual*/ BOOL pack(LLDataPacker &dp) const;
- /*virtual*/ BOOL unpack(LLDataPacker &dp);
- /*virtual*/ bool operator==(const LLNetworkData& data) const;
- /*virtual*/ void copy(const LLNetworkData& data);
-};
-
extern const F32 REFLECTION_PROBE_MIN_AMBIANCE;
extern const F32 REFLECTION_PROBE_MAX_AMBIANCE;
extern const F32 REFLECTION_PROBE_DEFAULT_AMBIANCE;
@@ -197,6 +186,7 @@ public:
{
FLAG_BOX_VOLUME = 0x01, // use a box influence volume
FLAG_DYNAMIC = 0x02, // render dynamic objects (avatars) into this Reflection Probe
+ FLAG_MIRROR = 0x04, // This probe is used for reflections on realtime mirrors.
};
protected:
@@ -220,11 +210,13 @@ public:
void setClipDistance(F32 distance) { mClipDistance = llclamp(distance, REFLECTION_PROBE_MIN_CLIP_DISTANCE, REFLECTION_PROBE_MAX_CLIP_DISTANCE); }
void setIsBox(bool is_box);
void setIsDynamic(bool is_dynamic);
+ void setIsMirror(bool is_mirror);
F32 getAmbiance() const { return mAmbiance; }
F32 getClipDistance() const { return mClipDistance; }
bool getIsBox() const { return (mFlags & FLAG_BOX_VOLUME) != 0; }
bool getIsDynamic() const { return (mFlags & FLAG_DYNAMIC) != 0; }
+ bool getIsMirror() const { return (mFlags & FLAG_MIRROR) != 0; }
};
//-------------------------------------------------
diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml
index f2ba4ba29e..ef51c7f0dc 100644
--- a/indra/newview/app_settings/settings.xml
+++ b/indra/newview/app_settings/settings.xml
@@ -10421,7 +10421,7 @@
<key>Type</key>
<string>S32</string>
<key>Value</key>
- <integer>2048</integer>
+ <integer>1024</integer>
</map>
<key>RenderHeroProbeDistance</key>
<map>
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;
-}
diff --git a/indra/newview/llheroprobemanager.h b/indra/newview/llheroprobemanager.h
index 0b32768bb1..7485a8cd72 100644
--- a/indra/newview/llheroprobemanager.h
+++ b/indra/newview/llheroprobemanager.h
@@ -68,10 +68,8 @@ public:
// perform occlusion culling on all active reflection probes
void doOcclusion();
- void registerHeroDrawable(LLVOVolume* drawablep);
- void unregisterHeroDrawable(LLVOVolume* drawablep);
-
- bool isViableMirror(LLFace* face) const;
+ void registerViewerObject(LLVOVolume *drawablep);
+ void unregisterViewerObject(LLVOVolume* drawablep);
bool isMirrorPass() const { return mRenderingMirror; }
@@ -140,6 +138,5 @@ private:
std::set<LLVOVolume*> mHeroVOList;
LLVOVolume* mNearestHero;
- LLFace* mCurrentFace;
};
diff --git a/indra/newview/llpanelvolume.cpp b/indra/newview/llpanelvolume.cpp
index a306a0a9ac..e0d95c5386 100644
--- a/indra/newview/llpanelvolume.cpp
+++ b/indra/newview/llpanelvolume.cpp
@@ -114,11 +114,6 @@ BOOL LLPanelVolume::postBuild()
getChild<LLUICtrl>("FlexForceZ")->setValidateBeforeCommit(precommitValidate);
}
- // Mirror Parameters
- {
- childSetCommitCallback("Mirror Checkbox Ctrl", onCommitIsMirror, this);
- }
-
// LIGHT Parameters
{
childSetCommitCallback("Light Checkbox Ctrl",onCommitIsLight,this);
@@ -155,7 +150,7 @@ BOOL LLPanelVolume::postBuild()
// REFLECTION PROBE Parameters
{
childSetCommitCallback("Reflection Probe", onCommitIsReflectionProbe, this);
- childSetCommitCallback("Probe Dynamic", onCommitProbe, this);
+ childSetCommitCallback("Probe Update Type", onCommitProbe, this);
childSetCommitCallback("Probe Volume Type", onCommitProbe, this);
childSetCommitCallback("Probe Ambiance", onCommitProbe, this);
childSetCommitCallback("Probe Near Clip", onCommitProbe, this);
@@ -309,10 +304,6 @@ void LLPanelVolume::getState( )
getChildView("select_single")->setVisible(true);
getChildView("select_single")->setEnabled(true);
}
-
- BOOL is_mirror = volobjp && volobjp->isMirror();
- getChild<LLUICtrl>("Mirror Checkbox Ctrl")->setValue(is_mirror);
- getChildView("Mirror Checkbox Ctrl")->setEnabled(editable && single_volume && volobjp);
// Light properties
BOOL is_light = volobjp && volobjp->getIsLight();
@@ -401,17 +392,18 @@ void LLPanelVolume::getState( )
bool probe_enabled = is_probe && editable && single_volume;
- getChildView("Probe Dynamic")->setEnabled(probe_enabled);
+ getChildView("Probe Update Type")->setEnabled(probe_enabled);
getChildView("Probe Volume Type")->setEnabled(probe_enabled);
getChildView("Probe Ambiance")->setEnabled(probe_enabled);
getChildView("Probe Near Clip")->setEnabled(probe_enabled);
+ getChildView("Probe Update Label")->setEnabled(probe_enabled);
if (!probe_enabled)
{
getChild<LLComboBox>("Probe Volume Type", true)->clear();
getChild<LLSpinCtrl>("Probe Ambiance", true)->clear();
getChild<LLSpinCtrl>("Probe Near Clip", true)->clear();
- getChild<LLCheckBoxCtrl>("Probe Dynamic", true)->clear();
+ getChild<LLComboBox>("Probe Update Type", true)->clear();
}
else
{
@@ -425,10 +417,28 @@ void LLPanelVolume::getState( )
volume_type = "Sphere";
}
+ std::string update_type;
+ if (volobjp->getReflectionProbeIsDynamic())
+ {
+ update_type = "Dynamic";
+ }
+ else if (volobjp->getReflectionProbeIsMirror())
+ {
+ update_type = "Mirror";
+
+ }
+ else
+ {
+ update_type = "Static";
+ }
+
+ getChildView("Probe Ambiance")->setEnabled(update_type != "Mirror");
+ getChildView("Probe Near Clip")->setEnabled(update_type != "Mirror");
+
getChild<LLComboBox>("Probe Volume Type", true)->setValue(volume_type);
getChild<LLSpinCtrl>("Probe Ambiance", true)->setValue(volobjp->getReflectionProbeAmbiance());
getChild<LLSpinCtrl>("Probe Near Clip", true)->setValue(volobjp->getReflectionProbeNearClip());
- getChild<LLCheckBoxCtrl>("Probe Dynamic", true)->setValue(volobjp->getReflectionProbeIsDynamic());
+ getChild<LLComboBox>("Probe Update Type", true)->setValue(update_type);
}
// Animated Mesh
@@ -715,7 +725,7 @@ void LLPanelVolume::clearCtrls()
getChildView("Reflection Probe")->setEnabled(false);;
getChildView("Probe Volume Type")->setEnabled(false);
- getChildView("Probe Dynamic")->setEnabled(false);
+ getChildView("Probe Update Type")->setEnabled(false);
getChildView("Probe Ambiance")->setEnabled(false);
getChildView("Probe Near Clip")->setEnabled(false);
getChildView("Animated Mesh Checkbox Ctrl")->setEnabled(false);
@@ -755,20 +765,6 @@ void LLPanelVolume::sendIsLight()
LL_INFOS() << "update light sent" << LL_ENDL;
}
-void LLPanelVolume::sendIsMirror()
-{
- LLViewerObject* objectp = mObject;
- if (!objectp || (objectp->getPCode() != LL_PCODE_VOLUME))
- {
- return;
- }
- LLVOVolume *volobjp = (LLVOVolume *)objectp;
-
- BOOL value = getChild<LLUICtrl>("Mirror Checkbox Ctrl")->getValue();
- volobjp->setIsMirror(value);
- LL_INFOS() << "update mirror sent" << LL_ENDL;
-}
-
void notify_cant_select_reflection_probe()
{
if (!gSavedSettings.getBOOL("SelectReflectionProbes"))
@@ -1422,7 +1418,14 @@ void LLPanelVolume::onCommitProbe(LLUICtrl* ctrl, void* userdata)
volobjp->setReflectionProbeAmbiance((F32)self->getChild<LLUICtrl>("Probe Ambiance")->getValue().asReal());
volobjp->setReflectionProbeNearClip((F32)self->getChild<LLUICtrl>("Probe Near Clip")->getValue().asReal());
- volobjp->setReflectionProbeIsDynamic(self->getChild<LLUICtrl>("Probe Dynamic")->getValue().asBoolean());
+
+ std::string update_type = self->getChild<LLUICtrl>("Probe Update Type")->getValue().asString();
+
+ volobjp->setReflectionProbeIsDynamic(update_type == "Dynamic");
+ volobjp->setReflectionProbeIsMirror(update_type == "Mirror");
+
+ self->getChildView("Probe Ambiance")->setEnabled(update_type != "Mirror");
+ self->getChildView("Probe Near Clip")->setEnabled(update_type != "Mirror");
std::string shape_type = self->getChild<LLUICtrl>("Probe Volume Type")->getValue().asString();
@@ -1469,12 +1472,6 @@ void LLPanelVolume::onCommitIsLight( LLUICtrl* ctrl, void* userdata )
self->sendIsLight();
}
-void LLPanelVolume::onCommitIsMirror( LLUICtrl* ctrl, void* userdata )
-{
- LLPanelVolume* self = (LLPanelVolume*) userdata;
- self->sendIsMirror();
-}
-
// static
void LLPanelVolume::setLightTextureID(const LLUUID &asset_id, const LLUUID &item_id, LLVOVolume* volobjp)
{
diff --git a/indra/newview/llpanelvolume.h b/indra/newview/llpanelvolume.h
index a658351624..aafefa918f 100644
--- a/indra/newview/llpanelvolume.h
+++ b/indra/newview/llpanelvolume.h
@@ -57,8 +57,7 @@ public:
void refresh();
void sendIsLight();
-
- void sendIsMirror();
+
// when an object is becoming a refleciton probe, present a dialog asking for confirmation
// otherwise, send the reflection probe update immediately
void sendIsReflectionProbe();
@@ -72,7 +71,6 @@ public:
static void onCommitIsLight( LLUICtrl* ctrl, void* userdata);
static void onCommitLight( LLUICtrl* ctrl, void* userdata);
- static void onCommitIsMirror( LLUICtrl* ctrl, void* userdata);
static void onCommitIsReflectionProbe(LLUICtrl* ctrl, void* userdata);
static void onCommitProbe(LLUICtrl* ctrl, void* userdata);
void onCommitIsFlexible( LLUICtrl* ctrl, void* userdata);
diff --git a/indra/newview/llviewerobject.cpp b/indra/newview/llviewerobject.cpp
index 691a2e14d3..d71814bd3f 100644
--- a/indra/newview/llviewerobject.cpp
+++ b/indra/newview/llviewerobject.cpp
@@ -313,9 +313,7 @@ LLViewerObject::LLViewerObject(const LLUUID &id, const LLPCode pcode, LLViewerRe
mLastUpdateCached(FALSE),
mCachedMuteListUpdateTime(0),
mCachedOwnerInMuteList(false),
- mRiggedAttachedWarned(false),
- mIsMirror(false),
- mMirrorFace(3)
+ mRiggedAttachedWarned(false)
{
if (!is_global)
{
@@ -1149,39 +1147,6 @@ U32 LLViewerObject::extractSpatialExtents(LLDataPackerBinaryBuffer *dp, LLVector
return parent_id;
}
-void detectMirror(const std::string &str, bool &mirror, U8 &mode)
-{
-
- std::stringstream ss(str);
- std::string word;
- while (ss >> word)
- {
- if (word == "IsMirror")
- {
- mirror = true;
- }
-
- if (mirror)
- {
- bool num = false;
- std::string::const_iterator it = word.begin();
- while (it != word.end())
- {
- num = std::isdigit(*it);
- ++it;
-
- if (!num)
- break;
- }
-
- if (num)
- {
- mode = atoi(word.c_str());
- }
- }
- }
-}
-
U32 LLViewerObject::processUpdateMessage(LLMessageSystem *mesgsys,
void **user_data,
U32 block_num,
@@ -1557,8 +1522,6 @@ U32 LLViewerObject::processUpdateMessage(LLMessageSystem *mesgsys,
std::string temp_string;
mesgsys->getStringFast(_PREHASH_ObjectData, _PREHASH_Text, temp_string, block_num );
-
- detectMirror(temp_string, mIsMirror, mMirrorFace);
LLColor4U coloru;
mesgsys->getBinaryDataFast(_PREHASH_ObjectData, _PREHASH_TextColor, coloru.mV, 4, block_num);
@@ -1946,8 +1909,6 @@ U32 LLViewerObject::processUpdateMessage(LLMessageSystem *mesgsys,
std::string temp_string;
dp->unpackString(temp_string, "Text");
- detectMirror(temp_string, mIsMirror, mMirrorFace);
-
LLColor4U coloru;
dp->unpackBinaryDataFixed(coloru.mV, 4, "Color");
coloru.mV[3] = 255 - coloru.mV[3];
@@ -6328,11 +6289,6 @@ LLViewerObject::ExtraParameter* LLViewerObject::createNewParameterEntry(U16 para
new_block = new LLReflectionProbeParams();
break;
}
- case LLNetworkData::PARAMS_MIRROR:
- {
- new_block = new LLMirrorParams();
- break;
- }
default:
{
LL_INFOS_ONCE() << "Unknown param type: " << param_type << LL_ENDL;
diff --git a/indra/newview/llviewerobject.h b/indra/newview/llviewerobject.h
index f3c00e83dc..80da7b2f73 100644
--- a/indra/newview/llviewerobject.h
+++ b/indra/newview/llviewerobject.h
@@ -257,8 +257,6 @@ public:
virtual BOOL isRiggedMesh() const { return FALSE; }
virtual BOOL hasLightTexture() const { return FALSE; }
virtual BOOL isReflectionProbe() const { return FALSE; }
- virtual BOOL isMirror() const { return FALSE; }
- virtual U8 mirrorFace() 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
@@ -880,9 +878,6 @@ protected:
F32 mPhysicsCost;
F32 mLinksetPhysicsCost;
- bool mIsMirror;
- U8 mMirrorFace;
-
// 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 9813039145..54e0a0113d 100644
--- a/indra/newview/llvovolume.cpp
+++ b/indra/newview/llvovolume.cpp
@@ -249,9 +249,6 @@ LLVOVolume::~LLVOVolume()
mTextureAnimp = NULL;
delete mVolumeImpl;
mVolumeImpl = NULL;
-
- if (mIsMirror)
- gPipeline.mHeroProbeManager.unregisterHeroDrawable(this);
gMeshRepo.unregisterMesh(this);
@@ -1000,11 +997,6 @@ LLDrawable *LLVOVolume::createDrawable(LLPipeline *pipeline)
updateReflectionProbePtr();
}
- if (isMirror())
- {
- gPipeline.mHeroProbeManager.registerHeroDrawable(this);
- }
-
updateRadius();
bool force_update = true; // avoid non-alpha mDistance update being optimized away
mDrawable->updateDistance(*LLViewerCamera::getInstance(), force_update);
@@ -3327,48 +3319,6 @@ F32 LLVOVolume::getLightCutoff() const
}
}
-bool LLVOVolume::setIsMirror(BOOL is_mirror)
-{
- BOOL was_mirror = isMirror();
- if (is_mirror != was_mirror)
- {
- if (is_mirror)
- {
- setParameterEntryInUse(LLNetworkData::PARAMS_MIRROR, TRUE, true);
- }
- else
- {
- setParameterEntryInUse(LLNetworkData::PARAMS_MIRROR, FALSE, true);
- }
- }
-
- updateMirrorDrawable();
-
- return was_mirror != is_mirror;
-}
-
-void LLVOVolume::updateMirrorDrawable()
-{
- if (isMirror())
- {
- gPipeline.mHeroProbeManager.registerHeroDrawable(this);
- }
- else
- {
- gPipeline.mHeroProbeManager.unregisterHeroDrawable(this);
- }
-}
-
-BOOL LLVOVolume::isMirror() const
-{
- return mIsMirror;
-}
-
-U8 LLVOVolume::mirrorFace() const
-{
- return mMirrorFace;
-}
-
BOOL LLVOVolume::isReflectionProbe() const
{
return getParameterEntryInUse(LLNetworkData::PARAMS_REFLECTION_PROBE);
@@ -3458,6 +3408,22 @@ bool LLVOVolume::setReflectionProbeIsDynamic(bool is_dynamic)
return false;
}
+bool LLVOVolume::setReflectionProbeIsMirror(bool is_mirror)
+{
+ LLReflectionProbeParams *param_block = (LLReflectionProbeParams *) getParameterEntry(LLNetworkData::PARAMS_REFLECTION_PROBE);
+ if (param_block)
+ {
+ if (param_block->getIsMirror() != is_mirror)
+ {
+ param_block->setIsMirror(is_mirror);
+ parameterChanged(LLNetworkData::PARAMS_REFLECTION_PROBE, true);
+ return true;
+ }
+ }
+
+ return false;
+}
+
F32 LLVOVolume::getReflectionProbeAmbiance() const
{
const LLReflectionProbeParams* param_block = (const LLReflectionProbeParams*)getParameterEntry(LLNetworkData::PARAMS_REFLECTION_PROBE);
@@ -3506,6 +3472,18 @@ bool LLVOVolume::getReflectionProbeIsDynamic() const
return false;
}
+bool LLVOVolume::getReflectionProbeIsMirror() const
+{
+ const LLReflectionProbeParams *param_block =
+ (const LLReflectionProbeParams *) getParameterEntry(LLNetworkData::PARAMS_REFLECTION_PROBE);
+ if (param_block)
+ {
+ return param_block->getIsMirror();
+ }
+
+ return false;
+}
+
U32 LLVOVolume::getVolumeInterfaceID() const
{
if (mVolumeImpl)
@@ -4419,25 +4397,34 @@ void LLVOVolume::parameterChanged(U16 param_type, LLNetworkData* data, BOOL in_u
}
updateReflectionProbePtr();
-
- if (isMirror())
- gPipeline.mHeroProbeManager.registerHeroDrawable(this);
- else
- gPipeline.mHeroProbeManager.unregisterHeroDrawable(this);
}
void LLVOVolume::updateReflectionProbePtr()
{
if (isReflectionProbe())
{
- if (mReflectionProbe.isNull())
+ if (mReflectionProbe.isNull() && !getReflectionProbeIsMirror())
{
mReflectionProbe = gPipeline.mReflectionMapManager.registerViewerObject(this);
}
+ else if (mReflectionProbe.isNull() && getReflectionProbeIsMirror())
+ {
+ // Geenz: This is a special case - what we want here is a hero probe.
+ // What we want to do here is instantiate a hero probe from the hero probe manager.
+ gPipeline.mHeroProbeManager.registerViewerObject(this);
+ }
}
- else if (mReflectionProbe.notNull())
+ else if (mReflectionProbe.notNull() || getReflectionProbeIsMirror())
{
- mReflectionProbe = nullptr;
+ if (mReflectionProbe.notNull())
+ {
+ mReflectionProbe = nullptr;
+ }
+
+ if (getReflectionProbeIsMirror())
+ {
+ gPipeline.mHeroProbeManager.unregisterViewerObject(this);
+ }
}
}
diff --git a/indra/newview/llvovolume.h b/indra/newview/llvovolume.h
index b03fc4b862..cac09609b3 100644
--- a/indra/newview/llvovolume.h
+++ b/indra/newview/llvovolume.h
@@ -294,11 +294,6 @@ public:
F32 getLightRadius() const;
F32 getLightFalloff(const F32 fudge_factor = 1.f) const;
F32 getLightCutoff() const;
-
- // Mirrors
- bool setIsMirror(BOOL is_mirror);
- void updateMirrorDrawable();
- U8 mirrorFace() const override;
// Reflection Probes
bool setIsReflectionProbe(BOOL is_probe);
@@ -306,14 +301,14 @@ public:
bool setReflectionProbeNearClip(F32 near_clip);
bool setReflectionProbeIsBox(bool is_box);
bool setReflectionProbeIsDynamic(bool is_dynamic);
+ bool setReflectionProbeIsMirror(bool is_mirror);
BOOL isReflectionProbe() const override;
F32 getReflectionProbeAmbiance() const;
F32 getReflectionProbeNearClip() const;
bool getReflectionProbeIsBox() const;
bool getReflectionProbeIsDynamic() const;
-
- BOOL isMirror() const override;
+ bool getReflectionProbeIsMirror() const;
// Flexible Objects
U32 getVolumeInterfaceID() const;
diff --git a/indra/newview/skins/default/xui/en/floater_tools.xml b/indra/newview/skins/default/xui/en/floater_tools.xml
index 510351b471..4f4216c85a 100644
--- a/indra/newview/skins/default/xui/en/floater_tools.xml
+++ b/indra/newview/skins/default/xui/en/floater_tools.xml
@@ -2412,15 +2412,6 @@ even though the user gets a free copy.
width="278" />
<check_box
height="16"
- label="Mirror"
- layout="topleft"
- left="10"
- name="Mirror Checkbox Ctrl"
- tool_tip="Causes object to be a mirror"
- top_pad="8"
- width="60" />
- <check_box
- height="16"
label="Light"
layout="topleft"
left="10"
@@ -2568,15 +2559,39 @@ even though the user gets a free copy.
name="Box"
value="Box"/>
</combo_box>
- <check_box
- height="16"
- label="Dynamic"
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="10"
layout="topleft"
left="10"
- name="Probe Dynamic"
- tool_tip="When enabled, Avatars will appear in reflections within this probe's influence volume."
- bottom_delta="19"
- width="60" />
+ name="Probe Update Label"
+ text_readonly_color="LabelDisabledColor"
+ width="100">
+ Probe Update
+ </text>
+ <combo_box
+ height="19"
+ top_delta="0"
+ left="144"
+ follows="left|top"
+ name="Probe Update Type"
+ tool_tip="Determines how the probe updates. Static updates the slowest and without avatars. Dynamic updates more frequently, with avatars visible in the probes. Mirror turns this probe into a realtime planar projected mirror probe, but does not calculate ambiance."
+ width="108">
+ <combo_box.item
+ label="Static"
+ name="Static"
+ value="Static" />
+ <combo_box.item
+ label="Dynamic"
+ name="Dynamic"
+ value="Dynamic"/>
+ <combo_box.item
+ label="Mirror"
+ name="Mirror"
+ value="Mirror"/>
+ </combo_box>
<spinner bottom_delta="19"
decimal_digits="3"
follows="left|top"