diff options
| -rw-r--r-- | indra/llprimitive/llprimitive.cpp | 47 | ||||
| -rw-r--r-- | indra/llprimitive/llprimitive.h | 14 | ||||
| -rw-r--r-- | indra/newview/app_settings/settings.xml | 2 | ||||
| -rw-r--r-- | indra/newview/llheroprobemanager.cpp | 65 | ||||
| -rw-r--r-- | indra/newview/llheroprobemanager.h | 7 | ||||
| -rw-r--r-- | indra/newview/llpanelvolume.cpp | 67 | ||||
| -rw-r--r-- | indra/newview/llpanelvolume.h | 4 | ||||
| -rw-r--r-- | indra/newview/llviewerobject.cpp | 46 | ||||
| -rw-r--r-- | indra/newview/llviewerobject.h | 5 | ||||
| -rw-r--r-- | indra/newview/llvovolume.cpp | 103 | ||||
| -rw-r--r-- | indra/newview/llvovolume.h | 9 | ||||
| -rw-r--r-- | indra/newview/skins/default/xui/en/floater_tools.xml | 47 | 
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" | 
