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() // LLCharacter()
// Class Constructor // Class Constructor
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
LLCharacter::LLCharacter(bool freeze_time) LLCharacter::LLCharacter()
: :
mPreferredPelvisHeight( 0.f ), mPreferredPelvisHeight( 0.f ),
mSex( SEX_FEMALE ), mSex( SEX_FEMALE ),
@@ -62,7 +62,6 @@ LLCharacter::LLCharacter(bool freeze_time)
mMotionController.setCharacter( this ); mMotionController.setCharacter( this );
mPauseRequest = new LLPauseRequestHandle(); mPauseRequest = new LLPauseRequestHandle();
mFreezeTimeHidden = freeze_time;
} }

View File

@@ -62,7 +62,7 @@ class LLCharacter
{ {
public: public:
// Constructor // Constructor
LLCharacter(bool freeze_time); LLCharacter();
// Destructor // Destructor
virtual ~LLCharacter(); virtual ~LLCharacter();
@@ -277,8 +277,6 @@ public:
static std::vector< LLCharacter* > sInstances; static std::vector< LLCharacter* > sInstances;
static BOOL sAllowInstancesChange ; //debug use static BOOL sAllowInstancesChange ; //debug use
void resetFreezeTimeHidden() { mFreezeTimeHidden = false; }
protected: protected:
LLMotionController mMotionController; LLMotionController mMotionController;
@@ -290,7 +288,6 @@ protected:
U32 mAppearanceSerialNum; U32 mAppearanceSerialNum;
U32 mSkeletonSerialNum; U32 mSkeletonSerialNum;
LLAnimPauseRequest mPauseRequest; LLAnimPauseRequest mPauseRequest;
bool mFreezeTimeHidden; // True when this object was created during snapshot FreezeTime mode, and that mode is STILL active.
private: private:
// visual parameter stuff // visual parameter stuff

View File

@@ -71,6 +71,7 @@
#include "lltoolmgr.h" #include "lltoolmgr.h"
#include "llworld.h" #include "llworld.h"
#include "llagentui.h" #include "llagentui.h"
#include "llvoavatar.h"
#include "llgl.h" #include "llgl.h"
#include "llglheaders.h" #include "llglheaders.h"
@@ -1523,16 +1524,14 @@ void LLFloaterSnapshot::Impl::updateLayout(LLFloaterSnapshot* floaterp)
previewp->setEnabled(TRUE); previewp->setEnabled(TRUE);
} }
//RN: freeze all avatars // Freeze all avatars.
LLCharacter* avatarp;
for (std::vector<LLCharacter*>::iterator iter = LLCharacter::sInstances.begin(); for (std::vector<LLCharacter*>::iterator iter = LLCharacter::sInstances.begin();
iter != LLCharacter::sInstances.end(); ++iter) iter != LLCharacter::sInstances.end(); ++iter)
{ {
avatarp = *iter; sInstance->impl.mAvatarPauseHandles.push_back((*iter)->requestPause());
sInstance->impl.mAvatarPauseHandles.push_back(avatarp->requestPause());
} }
// freeze everything else // Freeze everything else.
gSavedSettings.setBOOL("FreezeTime", TRUE); gSavedSettings.setBOOL("FreezeTime", TRUE);
if (LLToolMgr::getInstance()->getCurrentToolset() != gCameraToolset) if (LLToolMgr::getInstance()->getCurrentToolset() != gCameraToolset)
@@ -1551,15 +1550,17 @@ void LLFloaterSnapshot::Impl::updateLayout(LLFloaterSnapshot* floaterp)
previewp->setEnabled(FALSE); previewp->setEnabled(FALSE);
} }
//RN: thaw all avatars // Thaw everything except avatars.
sInstance->impl.mAvatarPauseHandles.clear(); gSavedSettings.setBOOL("FreezeTime", FALSE);
// Thaw all avatars.
LLVOAvatar* avatarp;
for (std::vector<LLCharacter*>::iterator iter = LLCharacter::sInstances.begin(); iter != LLCharacter::sInstances.end(); ++iter) for (std::vector<LLCharacter*>::iterator iter = LLCharacter::sInstances.begin(); iter != LLCharacter::sInstances.end(); ++iter)
{ {
(*iter)->resetFreezeTimeHidden(); avatarp = static_cast<LLVOAvatar*>(*iter);
avatarp->resetFreezeTime();
} }
sInstance->impl.mAvatarPauseHandles.clear();
// thaw everything else
gSavedSettings.setBOOL("FreezeTime", FALSE);
// restore last tool (e.g. pie menu, etc) // restore last tool (e.g. pie menu, etc)
if (sInstance->impl.mLastToolset) if (sInstance->impl.mLastToolset)

View File

@@ -1006,12 +1006,13 @@ LLVOAvatar::LLVOAvatar(const LLUUID& id,
const LLPCode pcode, const LLPCode pcode,
LLViewerRegion* regionp) : LLViewerRegion* regionp) :
LLViewerObject(id, pcode, regionp), LLViewerObject(id, pcode, regionp),
LLCharacter(freeze_time),
mIsDummy(FALSE), mIsDummy(FALSE),
mSpecialRenderMode(0), mSpecialRenderMode(0),
mAttachmentGeometryBytes(0), mAttachmentGeometryBytes(0),
mAttachmentSurfaceArea(0.f), mAttachmentSurfaceArea(0.f),
mTurning(FALSE), mTurning(FALSE),
mFreezeTimeHidden(freeze_time),
mFreezeTimeDead(false),
mPelvisToFoot(0.f), mPelvisToFoot(0.f),
mLastSkeletonSerialNum( 0 ), mLastSkeletonSerialNum( 0 ),
mHeadOffset(), mHeadOffset(),
@@ -1236,6 +1237,13 @@ LLVOAvatar::~LLVOAvatar()
void LLVOAvatar::markDead() 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) if (mNameText)
{ {
mNameText->markDead(); mNameText->markDead();
@@ -4099,6 +4107,16 @@ bool LLVOAvatar::isVisuallyMuted() const
(mAttachmentSurfaceArea > max_attachment_area && max_attachment_area > 0.f); (mAttachmentSurfaceArea > max_attachment_area && max_attachment_area > 0.f);
} }
void LLVOAvatar::resetFreezeTime()
{
bool dead = mFreezeTimeDead;
mFreezeTimeHidden = mFreezeTimeDead = false;
if (dead)
{
markDead();
}
}
//------------------------------------------------------------------------ //------------------------------------------------------------------------
// updateCharacter() // updateCharacter()
// called on both your avatar and other avatars // called on both your avatar and other avatars
@@ -7572,7 +7590,7 @@ void LLVOAvatar::updateRuthTimer(bool loading)
return; return;
} }
if (mPreviousFullyLoaded) if (mPreviousFullyLoaded || mFreezeTimeHidden)
{ {
mRuthTimer.reset(); mRuthTimer.reset();
debugAvatarRezTime("AvatarRezCloudNotification","became cloud"); debugAvatarRezTime("AvatarRezCloudNotification","became cloud");

View File

@@ -358,6 +358,8 @@ private:
S32 mVisualComplexity; S32 mVisualComplexity;
LLFrameTimer mFullyLoadedTimer; LLFrameTimer mFullyLoadedTimer;
LLFrameTimer mRuthTimer; 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: protected:
LLFrameTimer mInvisibleTimer; LLFrameTimer mInvisibleTimer;
@@ -453,6 +455,7 @@ private:
public: public:
U32 renderImpostor(LLColor4U color = LLColor4U(255,255,255,255), S32 diffuse_channel = 0); U32 renderImpostor(LLColor4U color = LLColor4U(255,255,255,255), S32 diffuse_channel = 0);
bool isVisuallyMuted() const; bool isVisuallyMuted() const;
void resetFreezeTime();
U32 renderRigid(); U32 renderRigid();
U32 renderSkinned(EAvatarRenderPass pass); U32 renderSkinned(EAvatarRenderPass pass);