In FreezeTime mode, keep avatars that TP away.
If an avatar TP's away (or quits), he will not disappear anymore from a frozen scene. Unfreezing makes him disappear of course (and clean up). Known bug: if during Freeze Time mode someone TPs away and then back, then he becomes a cloud after Freeze Time is ended, which can only be reset by another teleport (or relog) from either the cloud or the one seeing him as cloud. I decided not to fix this, cause there are things with a higher priority and this - if it happens at all - is rare and easy to recognize and work around.
This commit is contained in:
@@ -50,7 +50,7 @@ BOOL LLCharacter::sAllowInstancesChange = TRUE ;
|
||||
// LLCharacter()
|
||||
// Class Constructor
|
||||
//-----------------------------------------------------------------------------
|
||||
LLCharacter::LLCharacter(bool freeze_time)
|
||||
LLCharacter::LLCharacter()
|
||||
:
|
||||
mPreferredPelvisHeight( 0.f ),
|
||||
mSex( SEX_FEMALE ),
|
||||
@@ -62,7 +62,6 @@ LLCharacter::LLCharacter(bool freeze_time)
|
||||
|
||||
mMotionController.setCharacter( this );
|
||||
mPauseRequest = new LLPauseRequestHandle();
|
||||
mFreezeTimeHidden = freeze_time;
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -62,7 +62,7 @@ class LLCharacter
|
||||
{
|
||||
public:
|
||||
// Constructor
|
||||
LLCharacter(bool freeze_time);
|
||||
LLCharacter();
|
||||
|
||||
// Destructor
|
||||
virtual ~LLCharacter();
|
||||
@@ -277,8 +277,6 @@ public:
|
||||
static std::vector< LLCharacter* > sInstances;
|
||||
static BOOL sAllowInstancesChange ; //debug use
|
||||
|
||||
void resetFreezeTimeHidden() { mFreezeTimeHidden = false; }
|
||||
|
||||
protected:
|
||||
LLMotionController mMotionController;
|
||||
|
||||
@@ -290,7 +288,6 @@ protected:
|
||||
U32 mAppearanceSerialNum;
|
||||
U32 mSkeletonSerialNum;
|
||||
LLAnimPauseRequest mPauseRequest;
|
||||
bool mFreezeTimeHidden; // True when this object was created during snapshot FreezeTime mode, and that mode is STILL active.
|
||||
|
||||
private:
|
||||
// visual parameter stuff
|
||||
|
||||
@@ -71,6 +71,7 @@
|
||||
#include "lltoolmgr.h"
|
||||
#include "llworld.h"
|
||||
#include "llagentui.h"
|
||||
#include "llvoavatar.h"
|
||||
|
||||
#include "llgl.h"
|
||||
#include "llglheaders.h"
|
||||
@@ -1523,16 +1524,14 @@ void LLFloaterSnapshot::Impl::updateLayout(LLFloaterSnapshot* floaterp)
|
||||
previewp->setEnabled(TRUE);
|
||||
}
|
||||
|
||||
//RN: freeze all avatars
|
||||
LLCharacter* avatarp;
|
||||
// Freeze all avatars.
|
||||
for (std::vector<LLCharacter*>::iterator iter = LLCharacter::sInstances.begin();
|
||||
iter != LLCharacter::sInstances.end(); ++iter)
|
||||
{
|
||||
avatarp = *iter;
|
||||
sInstance->impl.mAvatarPauseHandles.push_back(avatarp->requestPause());
|
||||
sInstance->impl.mAvatarPauseHandles.push_back((*iter)->requestPause());
|
||||
}
|
||||
|
||||
// freeze everything else
|
||||
// Freeze everything else.
|
||||
gSavedSettings.setBOOL("FreezeTime", TRUE);
|
||||
|
||||
if (LLToolMgr::getInstance()->getCurrentToolset() != gCameraToolset)
|
||||
@@ -1551,15 +1550,17 @@ void LLFloaterSnapshot::Impl::updateLayout(LLFloaterSnapshot* floaterp)
|
||||
previewp->setEnabled(FALSE);
|
||||
}
|
||||
|
||||
//RN: thaw all avatars
|
||||
sInstance->impl.mAvatarPauseHandles.clear();
|
||||
// Thaw everything except avatars.
|
||||
gSavedSettings.setBOOL("FreezeTime", FALSE);
|
||||
|
||||
// Thaw all avatars.
|
||||
LLVOAvatar* avatarp;
|
||||
for (std::vector<LLCharacter*>::iterator iter = LLCharacter::sInstances.begin(); iter != LLCharacter::sInstances.end(); ++iter)
|
||||
{
|
||||
(*iter)->resetFreezeTimeHidden();
|
||||
avatarp = static_cast<LLVOAvatar*>(*iter);
|
||||
avatarp->resetFreezeTime();
|
||||
}
|
||||
|
||||
// thaw everything else
|
||||
gSavedSettings.setBOOL("FreezeTime", FALSE);
|
||||
sInstance->impl.mAvatarPauseHandles.clear();
|
||||
|
||||
// restore last tool (e.g. pie menu, etc)
|
||||
if (sInstance->impl.mLastToolset)
|
||||
|
||||
@@ -1006,12 +1006,13 @@ LLVOAvatar::LLVOAvatar(const LLUUID& id,
|
||||
const LLPCode pcode,
|
||||
LLViewerRegion* regionp) :
|
||||
LLViewerObject(id, pcode, regionp),
|
||||
LLCharacter(freeze_time),
|
||||
mIsDummy(FALSE),
|
||||
mSpecialRenderMode(0),
|
||||
mAttachmentGeometryBytes(0),
|
||||
mAttachmentSurfaceArea(0.f),
|
||||
mTurning(FALSE),
|
||||
mFreezeTimeHidden(freeze_time),
|
||||
mFreezeTimeDead(false),
|
||||
mPelvisToFoot(0.f),
|
||||
mLastSkeletonSerialNum( 0 ),
|
||||
mHeadOffset(),
|
||||
@@ -1236,6 +1237,13 @@ LLVOAvatar::~LLVOAvatar()
|
||||
|
||||
void LLVOAvatar::markDead()
|
||||
{
|
||||
static const LLCachedControl<bool> freeze_time("FreezeTime", false);
|
||||
if (freeze_time && !mFreezeTimeHidden)
|
||||
{
|
||||
// Delay the call to this function until FreezeTime is reset, otherwise avatars disappear from the frozen scene.
|
||||
mFreezeTimeDead = true;
|
||||
return;
|
||||
}
|
||||
if (mNameText)
|
||||
{
|
||||
mNameText->markDead();
|
||||
@@ -4099,6 +4107,16 @@ bool LLVOAvatar::isVisuallyMuted() const
|
||||
(mAttachmentSurfaceArea > max_attachment_area && max_attachment_area > 0.f);
|
||||
}
|
||||
|
||||
void LLVOAvatar::resetFreezeTime()
|
||||
{
|
||||
bool dead = mFreezeTimeDead;
|
||||
mFreezeTimeHidden = mFreezeTimeDead = false;
|
||||
if (dead)
|
||||
{
|
||||
markDead();
|
||||
}
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------
|
||||
// updateCharacter()
|
||||
// called on both your avatar and other avatars
|
||||
@@ -7572,7 +7590,7 @@ void LLVOAvatar::updateRuthTimer(bool loading)
|
||||
return;
|
||||
}
|
||||
|
||||
if (mPreviousFullyLoaded)
|
||||
if (mPreviousFullyLoaded || mFreezeTimeHidden)
|
||||
{
|
||||
mRuthTimer.reset();
|
||||
debugAvatarRezTime("AvatarRezCloudNotification","became cloud");
|
||||
|
||||
@@ -358,6 +358,8 @@ private:
|
||||
S32 mVisualComplexity;
|
||||
LLFrameTimer mFullyLoadedTimer;
|
||||
LLFrameTimer mRuthTimer;
|
||||
bool mFreezeTimeHidden; // True when this object was created during snapshot FreezeTime mode, and that mode is STILL active.
|
||||
bool mFreezeTimeDead; // True when the avatar was marked dead (ie, TP-ed away) while in FreezeTime mode.
|
||||
protected:
|
||||
LLFrameTimer mInvisibleTimer;
|
||||
|
||||
@@ -453,6 +455,7 @@ private:
|
||||
public:
|
||||
U32 renderImpostor(LLColor4U color = LLColor4U(255,255,255,255), S32 diffuse_channel = 0);
|
||||
bool isVisuallyMuted() const;
|
||||
void resetFreezeTime();
|
||||
|
||||
U32 renderRigid();
|
||||
U32 renderSkinned(EAvatarRenderPass pass);
|
||||
|
||||
Reference in New Issue
Block a user