Merge pull request #748 from secondlife/geenz/mirror-masking
Add mirrors prototype UI + data modelmaster
commit
7b83294216
|
|
@ -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()
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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; }
|
||||
};
|
||||
|
||||
//-------------------------------------------------
|
||||
|
|
|
|||
|
|
@ -10421,7 +10421,7 @@
|
|||
<key>Type</key>
|
||||
<string>S32</string>
|
||||
<key>Value</key>
|
||||
<integer>2048</integer>
|
||||
<integer>1024</integer>
|
||||
</map>
|
||||
<key>RenderHeroProbeDistance</key>
|
||||
<map>
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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];
|
||||
|
|
@ -6327,11 +6288,6 @@ LLViewerObject::ExtraParameter* LLViewerObject::createNewParameterEntry(U16 para
|
|||
{
|
||||
new_block = new LLReflectionProbeParams();
|
||||
break;
|
||||
}
|
||||
case LLNetworkData::PARAMS_MIRROR:
|
||||
{
|
||||
new_block = new LLMirrorParams();
|
||||
break;
|
||||
}
|
||||
default:
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -2410,15 +2410,6 @@ even though the user gets a free copy.
|
|||
name="object_horizontal"
|
||||
top_pad="10"
|
||||
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"
|
||||
|
|
@ -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"
|
||||
|
|
|
|||
Loading…
Reference in New Issue