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:
Aleric Inglewood
2012-12-15 21:53:08 +01:00
parent e0c0da7dff
commit a9963bcdb3
5 changed files with 37 additions and 19 deletions

View File

@@ -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;
}

View File

@@ -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

View File

@@ -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)

View File

@@ -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");

View File

@@ -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);