# Conflicts:
#	indra/newview/llfloaterspellchecksettings.h
#	indra/newview/llpaneleditwearable.cpp
#	indra/newview/llviewertexture.cpp
#	indra/newview/llviewertexture.h
master
Ansariel 2024-07-16 10:44:38 +02:00
commit 76f2b1f48c
24 changed files with 106 additions and 86 deletions

View File

@ -1743,11 +1743,11 @@
<key>creds</key>
<string>github</string>
<key>hash</key>
<string>755a3de464149ae88b048f976828a8c0c46e3bdb</string>
<string>9e59c93c7110e87b4ff3db330f11a23c50e5000f</string>
<key>hash_algorithm</key>
<string>sha1</string>
<key>url</key>
<string>https://api.github.com/repos/secondlife/llphysicsextensions_source/releases/assets/172966323</string>
<string>https://api.github.com/repos/secondlife/llphysicsextensions_source/releases/assets/178910560</string>
</map>
<key>name</key>
<string>darwin64</string>
@ -1759,11 +1759,11 @@
<key>creds</key>
<string>github</string>
<key>hash</key>
<string>813e7b5e294d7958e3d69e2252752ff346953b0c</string>
<string>7ed994db5bafa9a7ad09a1b53da850a84715c65e</string>
<key>hash_algorithm</key>
<string>sha1</string>
<key>url</key>
<string>https://api.github.com/repos/secondlife/llphysicsextensions_source/releases/assets/172966322</string>
<string>https://api.github.com/repos/secondlife/llphysicsextensions_source/releases/assets/178910561</string>
</map>
<key>name</key>
<string>linux64</string>
@ -1775,18 +1775,18 @@
<key>creds</key>
<string>github</string>
<key>hash</key>
<string>67f647538b1b49d0152fd9d03cfb9bdf978e33d1</string>
<string>66824c02e0e5eabbfbe37bfb173360195f89697c</string>
<key>hash_algorithm</key>
<string>sha1</string>
<key>url</key>
<string>https://api.github.com/repos/secondlife/llphysicsextensions_source/releases/assets/172966328</string>
<string>https://api.github.com/repos/secondlife/llphysicsextensions_source/releases/assets/178910562</string>
</map>
<key>name</key>
<string>windows64</string>
</map>
</map>
<key>version</key>
<string>1.0.b8b1f73</string>
<string>1.0.66e6919</string>
</map>
<key>llphysicsextensions_stub</key>
<map>

View File

@ -44,6 +44,8 @@ The PBR terrain texture transform flag should be set automatically when logging
When the PBR terrain texture transform feature is enabled, the UI of the Terrain tab should be overhauled. Availability of features depends on the type of terrain.
**Known issue:** The Region/Estate floater may have to be closed/reopened a second time in order for the UI overhaul to take effect, after teleporting between regions that do and do not have the feature flag set.
When "PBR Metallic Roughness" is checked:
- There should be a way for the user to change the texture transforms for the terrain in the current region

View File

@ -31,8 +31,9 @@
#include "llexception.h"
#include <boost/fiber/fss.hpp>
#include <boost/fiber/future/promise.hpp>
#include <boost/fiber/future/future.hpp>
#include <boost/fiber/future/promise.hpp>
#include <boost/fiber/recursive_mutex.hpp>
#include "mutex.h"
#include "llsingleton.h"
#include "llinstancetracker.h"
@ -307,6 +308,12 @@ public:
// use mutex, lock, condition_variable suitable for coroutines
using Mutex = boost::fibers::mutex;
using RMutex = boost::fibers::recursive_mutex;
// With C++17, LockType is deprecated: at this point we can directly
// declare 'std::unique_lock lk(some_mutex)' without explicitly stating
// the mutex type. Sadly, making LockType an alias template for
// std::unique_lock doesn't work the same way: Class Template Argument
// Deduction only works for class templates, not alias templates.
using LockType = std::unique_lock<Mutex>;
using cv_status = boost::fibers::cv_status;
using ConditionVariable = boost::fibers::condition_variable;

View File

@ -55,7 +55,6 @@
#include "llsingleton.h"
#include "llstl.h"
#include "lltimer.h"
#include <boost/fiber/recursive_mutex.hpp>
// On Mac, got:
// #error "Boost.Stacktrace requires `_Unwind_Backtrace` function. Define
@ -512,7 +511,7 @@ namespace
LLError::TimeFunction mTimeFunction;
Recorders mRecorders;
boost::fibers::recursive_mutex mRecorderMutex;
LLCoros::RMutex mRecorderMutex;
int mShouldLogCallCounter;

View File

@ -5511,7 +5511,11 @@ bool LLVolumeFace::cacheOptimize(bool gen_tangents)
U32 stream_count = data.w.empty() ? 4 : 5;
S32 vert_count = static_cast<S32>(meshopt_generateVertexRemapMulti(&remap[0], nullptr, data.p.size(), data.p.size(), mos, stream_count));
S32 vert_count = 0;
if (!data.p.empty())
{
vert_count = static_cast<S32>(meshopt_generateVertexRemapMulti(&remap[0], nullptr, data.p.size(), data.p.size(), mos, stream_count));
}
if (vert_count < 65535 && vert_count != 0)
{

View File

@ -1385,7 +1385,7 @@ bool LLWindowWin32::switchContext(bool fullscreen, const LLCoordScreen& size, bo
gGLManager.initWGL();
if (wglChoosePixelFormatARB)
if (wglChoosePixelFormatARB && wglGetPixelFormatAttribivARB)
{
// OK, at this point, use the ARB wglChoosePixelFormatsARB function to see if we
// can get exactly what we want.

View File

@ -12830,7 +12830,7 @@ Change of this parameter will affect the layout of buttons in notification toast
<key>RenderTerrainPBREnabled</key>
<map>
<key>Comment</key>
<string>EXPERIMENTAL: Enable PBR Terrain features.</string>
<string>Enable PBR Terrain features.</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>

View File

@ -991,6 +991,12 @@ bool Image::prep(Asset& asset)
return false;
}
if (!asset.mFilename.empty())
{ // local preview, boost image so it doesn't discard and force to save raw image in case we save out or upload
mTexture->setBoostLevel(LLViewerTexture::BOOST_PREVIEW);
mTexture->forceToSaveRawImage(0, F32_MAX);
}
return true;
}

View File

@ -109,7 +109,7 @@ struct MikktMesh
for (U32 tri_idx = 0; tri_idx < U32(triangle_count); ++tri_idx)
{
U32 idx[3];
U32 idx[3] = {0, 0, 0};
if (prim->mMode == Primitive::Mode::TRIANGLES)
{

View File

@ -148,6 +148,16 @@ void GLTFSceneManager::uploadSelection()
raw = image.mTexture->getRawImage();
}
if (raw.isNull())
{
raw = image.mTexture->getSavedRawImage();
}
if (raw.isNull())
{
image.mTexture->readbackRawImage();
}
if (raw.notNull())
{
LLPointer<LLImageJ2C> j2c = LLViewerTextureList::convertToUploadFile(raw);

View File

@ -543,7 +543,7 @@ void LLFloaterRegionInfo::processRegionInfo(LLMessageSystem* msg)
panel->getChild<LLUICtrl>("block_fly_over_check")->setValue(is_flag_set(region_flags, REGION_FLAGS_BLOCK_FLYOVER));
panel->getChild<LLUICtrl>("allow_damage_check")->setValue(is_flag_set(region_flags, REGION_FLAGS_ALLOW_DAMAGE));
panel->getChild<LLUICtrl>("restrict_pushobject")->setValue(is_flag_set(region_flags, REGION_FLAGS_RESTRICT_PUSHOBJECT));
panel->getChild<LLUICtrl>("allow_land_resell_check")->setValue(is_flag_set(region_flags, REGION_FLAGS_BLOCK_LAND_RESELL));
panel->getChild<LLUICtrl>("allow_land_resell_check")->setValue(!is_flag_set(region_flags, REGION_FLAGS_BLOCK_LAND_RESELL));
panel->getChild<LLUICtrl>("allow_parcel_changes_check")->setValue(is_flag_set(region_flags, REGION_FLAGS_ALLOW_PARCEL_CHANGES));
panel->getChild<LLUICtrl>("block_parcel_search_check")->setValue(is_flag_set(region_flags, REGION_FLAGS_BLOCK_PARCEL_SEARCH));
panel->getChild<LLUICtrl>("agent_limit_spin")->setValue(LLSD((F32)agent_limit));

View File

@ -67,7 +67,11 @@ bool LLFloaterSpellCheckerSettings::postBuild(void)
LLSpellChecker::setSettingsChangeCallback(boost::bind(&LLFloaterSpellCheckerSettings::onSpellCheckSettingsChange, this));
getChild<LLUICtrl>("spellcheck_remove_btn")->setCommitCallback(boost::bind(&LLFloaterSpellCheckerSettings::onBtnRemove, this));
getChild<LLUICtrl>("spellcheck_import_btn")->setCommitCallback(boost::bind(&LLFloaterSpellCheckerSettings::onBtnImport, this));
getChild<LLUICtrl>("spellcheck_main_combo")->setCommitCallback(boost::bind(&LLFloaterSpellCheckerSettings::refreshDictionaries, this, false));
getChild<LLUICtrl>("spellcheck_main_combo")->setCommitCallback([this](LLUICtrl* ctrl, const LLSD& data)
{
mMainSelectionChanged = true;
refreshDictionaries(false);
});
getChild<LLUICtrl>("spellcheck_moveleft_btn")->setCommitCallback(boost::bind(&LLFloaterSpellCheckerSettings::onBtnMove, this, "spellcheck_active_list", "spellcheck_available_list"));
getChild<LLUICtrl>("spellcheck_moveright_btn")->setCommitCallback(boost::bind(&LLFloaterSpellCheckerSettings::onBtnMove, this, "spellcheck_available_list", "spellcheck_active_list"));
center();
@ -129,7 +133,7 @@ void LLFloaterSpellCheckerSettings::onBtnRemove()
void LLFloaterSpellCheckerSettings::onSpellCheckSettingsChange()
{
refreshDictionaries(true);
refreshDictionaries(!mMainSelectionChanged);
}
void LLFloaterSpellCheckerSettings::refreshDictionaries(bool from_settings)

View File

@ -46,6 +46,8 @@ protected:
void onSpellCheckSettingsChange();
void refreshDictionaries(bool from_settings);
bool mMainSelectionChanged{ false };
private:
void commitChanges();
};

View File

@ -411,8 +411,10 @@ void notify_of_message(const LLSD& msg, bool is_dnd_msg)
// 4. Toast
if ((("toast" == user_preferences) &&
(ON_TOP_AND_ITEM_IS_SELECTED != conversations_floater_status) &&
(!session_floater->isTornOff() || !LLFloater::isVisible(session_floater)))
|| !session_floater->isMessagePaneExpanded())
(!session_floater->isTornOff()
|| session_floater->isMinimized()
|| !LLFloater::isVisible(session_floater)))
|| !session_floater->isMessagePaneExpanded())
{
//Show IM toasts (upper right toasts)

View File

@ -304,14 +304,9 @@ LLEditWearableDictionary::Subparts::Subparts()
addEntry(SUBPART_UNDERSHIRT, new SubpartEntry(SUBPART_UNDERSHIRT, "mTorso", "undershirt", "undershirt_main_param_list", "undershirt_main_tab", LLVector3d(0.f, 0.f, 0.3f), LLVector3d(-1.f, 0.15f, 0.3f),SEX_BOTH));
addEntry(SUBPART_UNDERPANTS, new SubpartEntry(SUBPART_UNDERPANTS, "mPelvis", "underpants", "underpants_main_param_list", "underpants_main_tab", LLVector3d(0.f, 0.f, -0.5f), LLVector3d(-1.6f, 0.15f, -0.5f),SEX_BOTH));
addEntry(SUBPART_SKIRT, new SubpartEntry(SUBPART_SKIRT, "mPelvis", "skirt", "skirt_main_param_list", "skirt_main_tab", LLVector3d(0.f, 0.f, -0.5f), LLVector3d(-1.6f, 0.15f, -0.5f),SEX_BOTH));
// <FS:Ansariel> Alpha, tattoo and universal don't adhere to the usual panel layout and don't have a param list and main tab
//addEntry(SUBPART_ALPHA, new SubpartEntry(SUBPART_ALPHA, "mPelvis", "alpha", "alpha_main_param_list", "alpha_main_tab", LLVector3d(0.f, 0.f, 0.1f), LLVector3d(-2.5f, 0.5f, 0.8f),SEX_BOTH));
//addEntry(SUBPART_TATTOO, new SubpartEntry(SUBPART_TATTOO, "mPelvis", "tattoo", "tattoo_main_param_list", "tattoo_main_tab", LLVector3d(0.f, 0.f, 0.1f), LLVector3d(-2.5f, 0.5f, 0.8f),SEX_BOTH));
//addEntry(SUBPART_UNIVERSAL, new SubpartEntry(SUBPART_UNIVERSAL, "mPelvis", "universal", "universal_main_param_list", "universal_main_tab", LLVector3d(0.f, 0.f, 0.1f), LLVector3d(-2.5f, 0.5f, 0.8f), SEX_BOTH));
addEntry(SUBPART_ALPHA, new SubpartEntry(SUBPART_ALPHA, "mPelvis", "alpha", "", "", LLVector3d(0.f, 0.f, 0.1f), LLVector3d(-2.5f, 0.5f, 0.8f),SEX_BOTH));
addEntry(SUBPART_TATTOO, new SubpartEntry(SUBPART_TATTOO, "mPelvis", "tattoo", "", "", LLVector3d(0.f, 0.f, 0.1f), LLVector3d(-2.5f, 0.5f, 0.8f),SEX_BOTH));
addEntry(SUBPART_UNIVERSAL, new SubpartEntry(SUBPART_UNIVERSAL, "mPelvis", "universal", "", "", LLVector3d(0.f, 0.f, 0.1f), LLVector3d(-2.5f, 0.5f, 0.8f), SEX_BOTH));
// </FS:Ansariel>
// WT_PHYSIC
addEntry(SUBPART_PHYSICS_BREASTS_UPDOWN, new SubpartEntry(SUBPART_PHYSICS_BREASTS_UPDOWN, "mTorso", "physics_breasts_updown", "physics_breasts_updown_param_list", "physics_breasts_updown_tab", LLVector3d(0.f, 0.f, 0.3f), LLVector3d(0.f, 0.f, 0.f),SEX_FEMALE));
@ -821,19 +816,12 @@ bool LLPanelEditWearable::postBuild()
continue;
}
const std::string accordion_tab = subpart_entry->mAccordionTab;
// <FS:Ansariel> Alpha and tattoo don't adhere to the usual panel layout and don't have a param list and main tab
// We can safely skip here as the wearables having no accordion tabs only have one sub-part,
// so no camera switch is needed
//LLAccordionCtrlTab *tab = getChild<LLAccordionCtrlTab>(accordion_tab);
const std::string& accordion_tab = subpart_entry->mAccordionTab;
if (accordion_tab.empty())
{
continue;
}
LLAccordionCtrlTab *tab = findChild<LLAccordionCtrlTab>(accordion_tab);
// </FS:Ansariel>
if (!tab)
{
LL_WARNS() << "could not get llaccordionctrltab from UI with name: " << accordion_tab << LL_ENDL;
@ -1271,20 +1259,16 @@ void LLPanelEditWearable::showWearable(LLViewerWearable* wearable, bool show, bo
continue;
}
const std::string scrolling_panel = subpart_entry->mParamList;
const std::string accordion_tab = subpart_entry->mAccordionTab;
const std::string& scrolling_panel = subpart_entry->mParamList;
const std::string& accordion_tab = subpart_entry->mAccordionTab;
// <FS:Ansariel> Alpha and tattoo don't adhere to the usual panel layout and don't have a param list and main tab
// Since there are no sex-based differences, we can skip here
if (scrolling_panel.empty() || accordion_tab.empty())
{
continue;
}
// </FS:Ansariel>
LLScrollingPanelList *panel_list = getChild<LLScrollingPanelList>(scrolling_panel);
LLAccordionCtrlTab *tab = getChild<LLAccordionCtrlTab>(accordion_tab);
LLScrollingPanelList *panel_list = findChild<LLScrollingPanelList>(scrolling_panel);
LLAccordionCtrlTab *tab = findChild<LLAccordionCtrlTab>(accordion_tab);
if (!panel_list)
{
LL_WARNS() << "could not get scrolling panel list: " << scrolling_panel << LL_ENDL;

View File

@ -337,8 +337,8 @@ void LLSetKeyBindDialog::onCancel(void* user_data)
void LLSetKeyBindDialog::onBlank(void* user_data)
{
LLSetKeyBindDialog* self = (LLSetKeyBindDialog*)user_data;
// tmp needs 'no key' button
self->setKeyBind(CLICK_NONE, KEY_NONE, MASK_NONE, false);
self->setKeyBind(CLICK_NONE, KEY_NONE, MASK_NONE, self->pCheckBox->getValue().asBoolean());
self->closeFloater();
}

View File

@ -1683,6 +1683,11 @@ void render_ui_3d()
gObjectList.resetObjectBeacons();
gSky.addSunMoonBeacons();
}
else
{
// Make sure particle effects disappear
LLHUDObject::renderAllForTimer();
}
stop_glerror();
}

View File

@ -3382,16 +3382,24 @@ void LLViewerRegion::unpackRegionHandshake()
compp->setParamsReady();
}
LLPBRTerrainFeatures::queueQuery(*this, [](LLUUID region_id, bool success, const LLModifyRegion& composition_changes)
std::string cap = getCapability("ModifyRegion"); // needed for queueQuery
if (cap.empty())
{
if (!success) { return; }
LLViewerRegion* region = LLWorld::getInstance()->getRegionFromID(region_id);
if (!region) { return; }
LLVLComposition* compp = region->getComposition();
if (!compp) { return; }
compp->apply(composition_changes);
LLFloaterRegionInfo::sRefreshFromRegion(region);
});
LLFloaterRegionInfo::sRefreshFromRegion(this);
}
else
{
LLPBRTerrainFeatures::queueQuery(*this, [](LLUUID region_id, bool success, const LLModifyRegion& composition_changes)
{
if (!success) { return; }
LLViewerRegion* region = LLWorld::getInstance()->getRegionFromID(region_id);
if (!region) { return; }
LLVLComposition* compp = region->getComposition();
if (!compp) { return; }
compp->apply(composition_changes);
LLFloaterRegionInfo::sRefreshFromRegion(region);
});
}
}

View File

@ -63,31 +63,21 @@
#include "llwindow.h"
///////////////////////////////////////////////////////////////////////////////
#include "llmimetypes.h"
// extern
const S32Megabytes gMinVideoRam(32);
// <FS:Ansariel> Texture memory management
//const S32Megabytes gMaxVideoRam(512);
S32Megabytes gMaxVideoRam(512);
// </FS:Ansariel>
// statics
LLPointer<LLViewerTexture> LLViewerTexture::sNullImagep = NULL;
LLPointer<LLViewerTexture> LLViewerTexture::sBlackImagep = NULL;
LLPointer<LLViewerTexture> LLViewerTexture::sCheckerBoardImagep = NULL;
LLPointer<LLViewerFetchedTexture> LLViewerFetchedTexture::sMissingAssetImagep = NULL;
LLPointer<LLViewerFetchedTexture> LLViewerFetchedTexture::sWhiteImagep = NULL;
LLPointer<LLViewerFetchedTexture> LLViewerFetchedTexture::sDefaultImagep = NULL;
LLPointer<LLViewerFetchedTexture> LLViewerFetchedTexture::sSmokeImagep = NULL;
LLPointer<LLViewerFetchedTexture> LLViewerFetchedTexture::sFlatNormalImagep = NULL;
LLPointer<LLViewerTexture> LLViewerTexture::sNullImagep = nullptr;
LLPointer<LLViewerTexture> LLViewerTexture::sBlackImagep = nullptr;
LLPointer<LLViewerTexture> LLViewerTexture::sCheckerBoardImagep = nullptr;
LLPointer<LLViewerFetchedTexture> LLViewerFetchedTexture::sMissingAssetImagep = nullptr;
LLPointer<LLViewerFetchedTexture> LLViewerFetchedTexture::sWhiteImagep = nullptr;
LLPointer<LLViewerFetchedTexture> LLViewerFetchedTexture::sDefaultImagep = nullptr;
LLPointer<LLViewerFetchedTexture> LLViewerFetchedTexture::sSmokeImagep = nullptr;
LLPointer<LLViewerFetchedTexture> LLViewerFetchedTexture::sFlatNormalImagep = nullptr;
LLPointer<LLViewerFetchedTexture> LLViewerFetchedTexture::sDefaultIrradiancePBRp;
// [SL:KB] - Patch: Render-TextureToggle (Catznip-4.0)
LLPointer<LLViewerFetchedTexture> LLViewerFetchedTexture::sDefaultDiffuseImagep = NULL;
// [/SL:KB]
LLViewerMediaTexture::media_map_t LLViewerMediaTexture::sMediaMap;
LLTexturePipelineTester* LLViewerTextureManager::sTesterp = NULL;
LLTexturePipelineTester* LLViewerTextureManager::sTesterp = nullptr;
F32 LLViewerFetchedTexture::sMaxVirtualSize = 8192.f*8192.f;
const std::string sTesterName("TextureTester");
@ -99,11 +89,11 @@ LLFrameTimer LLViewerTexture::sEvaluationTimer;
F32 LLViewerTexture::sDesiredDiscardBias = 0.f;
S32 LLViewerTexture::sMaxSculptRez = 128; //max sculpt image size
const S32 MAX_CACHED_RAW_IMAGE_AREA = 64 * 64;
constexpr S32 MAX_CACHED_RAW_IMAGE_AREA = 64 * 64;
const S32 MAX_CACHED_RAW_SCULPT_IMAGE_AREA = LLViewerTexture::sMaxSculptRez * LLViewerTexture::sMaxSculptRez;
const S32 MAX_CACHED_RAW_TERRAIN_IMAGE_AREA = 128 * 128;
const S32 DEFAULT_ICON_DIMENSIONS = 32;
const S32 DEFAULT_THUMBNAIL_DIMENSIONS = 256;
constexpr S32 MAX_CACHED_RAW_TERRAIN_IMAGE_AREA = 128 * 128;
constexpr S32 DEFAULT_ICON_DIMENSIONS = 32;
constexpr S32 DEFAULT_THUMBNAIL_DIMENSIONS = 256;
U32 LLViewerTexture::sMinLargeImageSize = 65536; //256 * 256.
U32 LLViewerTexture::sMaxSmallImageSize = MAX_CACHED_RAW_IMAGE_AREA;
bool LLViewerTexture::sFreezeImageUpdates = false;

View File

@ -42,12 +42,6 @@
#include <map>
#include <list>
extern const S32Megabytes gMinVideoRam;
// <FS:Ansariel> Texture memory management
//extern const S32Megabytes gMaxVideoRam;
extern S32Megabytes gMaxVideoRam;
// </FS:Ansariel>
// <FS:Ansariel> Max texture resolution
extern U32 DESIRED_NORMAL_TEXTURE_SIZE;

View File

@ -939,6 +939,7 @@ void LLViewerTextureList::updateImageDecodePriority(LLViewerFetchedTexture* imag
}
LL_PROFILE_ZONE_SCOPED_CATEGORY_TEXTURE;
bool onFace = false;
for (U32 i = 0; i < LLRender::NUM_TEXTURE_CHANNELS; ++i)
{
for (S32 fi = 0; fi < imagep->getNumFaces(i); ++fi)
@ -947,6 +948,7 @@ void LLViewerTextureList::updateImageDecodePriority(LLViewerFetchedTexture* imag
if (face && face->getViewerObject())
{
onFace = true;
F32 radius;
F32 cos_angle_to_view_dir;
bool in_frustum = face->calcPixelArea(cos_angle_to_view_dir, radius);
@ -1044,7 +1046,8 @@ void LLViewerTextureList::updateImageDecodePriority(LLViewerFetchedTexture* imag
imagep->getLastReferencedTimer()->reset();
//reset texture state.
imagep->setInactive();
if(!onFace)
imagep->setInactive();
}
}

View File

@ -235,8 +235,8 @@ public:
bool mForceResetTextureStats;
// to make "for (auto& imagep : gTextureList)" work
const image_list_t::iterator begin() const { return mImageList.begin(); }
const image_list_t::iterator end() const { return mImageList.end(); }
const image_list_t::const_iterator begin() const { return mImageList.cbegin(); }
const image_list_t::const_iterator end() const { return mImageList.cend(); }
// <FS:Ansariel> Fast cache stats
static U32 sNumFastCacheReads;

View File

@ -1024,7 +1024,7 @@ bool LLVOAvatarSelf::isValid() const
// virtual
void LLVOAvatarSelf::idleUpdate(LLAgent &agent, const F64 &time)
{
if (isValid())
if (isAgentAvatarValid())
{
LLVOAvatar::idleUpdate(agent, time);
idleUpdateTractorBeam();
@ -1771,7 +1771,7 @@ bool LLVOAvatarSelf::detachObject(LLViewerObject *viewer_object)
// Make sure the inventory is in sync with the avatar.
// Update COF contents, don't trigger appearance update.
if (!isValid())
if (!isAgentAvatarValid())
{
LL_INFOS() << "removeItemLinks skipped, avatar is under destruction" << LL_ENDL;
}

View File

@ -130,7 +130,7 @@ private:
public:
/*virtual*/ bool isSelf() const { return true; }
virtual bool isBuddy() const { return false; }
/*virtual*/ bool isValid() const;
/*virtual*/ bool isValid() const; // use isAgentAvatarValid, it's fuller
//--------------------------------------------------------------------
// Updates