Merge branch 'master' into DRTVWR-483

master
Andrey Lihatskiy 2020-09-23 01:48:13 +03:00
commit f4bfaeb45e
169 changed files with 1481 additions and 754 deletions

View File

@ -76,9 +76,9 @@
<key>archive</key>
<map>
<key>hash</key>
<string>d670d00aa732b97d105d287b62582762</string>
<string>9b8bcc3be6dbe40a04c9c81c313f70dc</string>
<key>url</key>
<string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/55065/512118/apr_suite-1.4.5.539073-darwin64-539073.tar.bz2</string>
<string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/68333/658209/apr_suite-1.4.5.548882-darwin64-548882.tar.bz2</string>
</map>
<key>name</key>
<string>darwin64</string>
@ -112,9 +112,9 @@
<key>archive</key>
<map>
<key>hash</key>
<string>83b4a047db5f7ee462753d91e6277cba</string>
<string>6bdf460c18ee004b41a46afc80041a92</string>
<key>url</key>
<string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/55143/512317/apr_suite-1.4.5.539073-windows-539073.tar.bz2</string>
<string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/68334/658225/apr_suite-1.4.5.548882-windows-548882.tar.bz2</string>
</map>
<key>name</key>
<string>windows</string>
@ -124,16 +124,16 @@
<key>archive</key>
<map>
<key>hash</key>
<string>b3bbf168b39e25c08cc1febddeb33332</string>
<string>83104bfa4dabb77cd70d185e38a95b49</string>
<key>url</key>
<string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/55139/512304/apr_suite-1.4.5.539073-windows64-539073.tar.bz2</string>
<string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/68332/658215/apr_suite-1.4.5.548882-windows64-548882.tar.bz2</string>
</map>
<key>name</key>
<string>windows64</string>
</map>
</map>
<key>version</key>
<string>1.4.5.539073</string>
<string>1.4.5.548882</string>
</map>
<key>boost</key>
<map>
@ -2187,16 +2187,16 @@
<key>archive</key>
<map>
<key>hash</key>
<string>8501cbaa7e0f254614694da784a9c61c</string>
<string>b677ee43822212f0a27c838dc8bf3623</string>
<key>url</key>
<string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/64944/606925/llca-202008010216.546021-common-546021.tar.bz2</string>
<string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/67622/646614/llca-202009010215.548269-common-548269.tar.bz2</string>
</map>
<key>name</key>
<string>common</string>
</map>
</map>
<key>version</key>
<string>202008010216.546021</string>
<string>202009010215.548269</string>
</map>
<key>llphysicsextensions_source</key>
<map>
@ -3906,9 +3906,9 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors</string>
<array>
<string>-G</string>
<string>${AUTOBUILD_WIN_CMAKE_GEN|NOTWIN}</string>
<string>-DUNATTENDED:BOOL=ON</string>
<string>-DINSTALL_PROPRIETARY=FALSE</string>
<string>-DUSE_KDU=FALSE</string>
<string>-DOPENAL:BOOL=ON</string>
</array>
</map>
<key>name</key>
@ -3979,6 +3979,7 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors</string>
<string>-DUNATTENDED:BOOL=ON</string>
<string>-DINSTALL_PROPRIETARY=FALSE</string>
<string>-DUSE_KDU=FALSE</string>
<string>-DOPENAL:BOOL=ON</string>
</array>
</map>
<key>name</key>

View File

@ -259,6 +259,8 @@ Beansy Twine
Benja Kepler
VWR-746
Benjamin Bigdipper
Beq Janus
BUG-227094
Beth Walcher
Bezilon Kasei
Biancaluce Robbiani
@ -831,6 +833,7 @@ Khyota Wulluf
Kimar Coba
Kithrak Kirkorian
Kitty Barnett
BUG-228665
VWR-19699
STORM-288
STORM-799
@ -1303,6 +1306,7 @@ Shyotl Kuhr
MAINT-2334
MAINT-6913
STORM-2143
SL-11625
Siana Gearz
STORM-960
STORM-1088
@ -1342,6 +1346,7 @@ Sovereign Engineer
MAINT-7343
SL-11079
OPEN-343
SL-11625
SpacedOut Frye
VWR-34
VWR-45
@ -1447,6 +1452,8 @@ Thickbrick Sleaford
STORM-956
STORM-1147
STORM-1325
Thoys Pan
SL-12396
Thraxis Epsilon
SVC-371
VWR-383

View File

@ -82,6 +82,10 @@ if(WINDOWS)
set(release_files ${release_files} fmod.dll)
endif (FMODSTUDIO)
if (OPENAL)
list(APPEND release_files openal32.dll alut.dll)
endif (OPENAL)
#*******************************
# Copy MS C runtime dlls, required for packaging.
if (MSVC80)

View File

@ -60,6 +60,10 @@ if (FMODSTUDIO)
endif (FMODSTUDIO)
if (OPENAL)
include_directories(
${OPENAL_LIBRARIES}
)
list(APPEND llaudio_SOURCE_FILES
llaudioengine_openal.cpp
lllistener_openal.cpp

View File

@ -55,7 +55,7 @@ LLAudioEngine_OpenAL::~LLAudioEngine_OpenAL()
bool LLAudioEngine_OpenAL::init(const S32 num_channels, void* userdata, const std::string &app_title)
{
mWindGen = NULL;
LLAudioEngine::init(num_channels, userdata);
LLAudioEngine::init(num_channels, userdata, app_title);
if(!alutInit(NULL, NULL))
{

View File

@ -1007,11 +1007,20 @@ CURLcode HttpOpRequest::curlSslCtxCallback(CURL *curl, void *sslctx, void *userd
{
HttpOpRequest::ptr_t op(HttpOpRequest::fromHandle<HttpOpRequest>(userdata));
if (op->mCallbackSSLVerify)
{
SSL_CTX * ctx = (SSL_CTX *)sslctx;
// disable any default verification for server certs
SSL_CTX_set_verify(ctx, SSL_VERIFY_NONE, NULL);
if (op->mCallbackSSLVerify)
{
SSL_CTX * ctx = (SSL_CTX *)sslctx;
if (op->mReqOptions && op->mReqOptions->getSSLVerifyPeer())
{
// verification for ssl certs
SSL_CTX_set_verify(ctx, SSL_VERIFY_PEER, NULL);
}
else
{
// disable any default verification for server certs
// Ex: setting urls (assume non-SL) for parcel media in LLFloaterURLEntry
SSL_CTX_set_verify(ctx, SSL_VERIFY_NONE, NULL);
}
// set the verification callback.
SSL_CTX_set_cert_verify_callback(ctx, sslCertVerifyCallback, userdata);
// the calls are void

View File

@ -46,10 +46,10 @@ class LLRotation;
// of this writing, July 08, 2010) about getting it implemented before you resort to
// LLVector3/LLVector4.
/////////////////////////////////
class LLVector4a;
struct LLVector4a;
LL_ALIGN_PREFIX(16)
class LLVector4a
struct LLVector4a
{
public:
@ -92,6 +92,7 @@ public:
// CONSTRUCTORS
////////////////////////////////////
//LLVector4a is plain data which should never have a default constructor or destructor(malloc&free won't trigger it)
LLVector4a()
{ //DO NOT INITIALIZE -- The overhead is completely unnecessary
ll_assert_aligned(this,16);

View File

@ -77,12 +77,12 @@ public:
///
inline size_t countActive() const
{
return mActiveCoprocs.size();
return mActiveCoprocsCount;
}
/// Returns the total number of coprocedures either queued or in active processing.
///
inline size_t count() const
inline S32 count() const
{
return countPending() + countActive();
}
@ -113,12 +113,10 @@ private:
// because the consuming coroutine might outlive this LLCoprocedurePool
// instance.
typedef boost::shared_ptr<CoprocQueue_t> CoprocQueuePtr;
typedef std::map<LLUUID, LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t> ActiveCoproc_t;
std::string mPoolName;
size_t mPoolSize, mPending{0};
size_t mPoolSize, mActiveCoprocsCount, mPending;
CoprocQueuePtr mPendingCoprocs;
ActiveCoproc_t mActiveCoprocs;
LLTempBoundListener mStatusListener;
typedef std::map<std::string, LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t> CoroAdapterMap_t;
@ -191,8 +189,13 @@ LLUUID LLCoprocedureManager::enqueueCoprocedure(const std::string &pool, const s
void LLCoprocedureManager::setPropertyMethods(SettingQuery_t queryfn, SettingUpdate_t updatefn)
{
// functions to discover and store the pool sizes
mPropertyQueryFn = queryfn;
mPropertyDefineFn = updatefn;
// workaround until we get mutex into initializePool
initializePool("VAssetStorage");
initializePool("Upload");
}
//-------------------------------------------------------------------------
@ -276,6 +279,8 @@ void LLCoprocedureManager::close(const std::string &pool)
LLCoprocedurePool::LLCoprocedurePool(const std::string &poolName, size_t size):
mPoolName(poolName),
mPoolSize(size),
mActiveCoprocsCount(0),
mPending(0),
mPendingCoprocs(boost::make_shared<CoprocQueue_t>(DEFAULT_QUEUE_SIZE)),
mHTTPPolicy(LLCore::HttpRequest::DEFAULT_POLICY_ID),
mCoroMapping()
@ -401,8 +406,7 @@ void LLCoprocedurePool::coprocedureInvokerCoro(
}
// we actually popped an item
--mPending;
ActiveCoproc_t::iterator itActive = mActiveCoprocs.insert(ActiveCoproc_t::value_type(coproc->mId, httpAdapter)).first;
mActiveCoprocsCount++;
LL_DEBUGS("CoProcMgr") << "Dequeued and invoking coprocedure(" << coproc->mName << ") with id=" << coproc->mId.asString() << " in pool \"" << mPoolName << "\" (" << mPending << " left)" << LL_ENDL;
@ -410,19 +414,25 @@ void LLCoprocedurePool::coprocedureInvokerCoro(
{
coproc->mProc(httpAdapter, coproc->mId);
}
catch (const LLCoros::Stop &e)
{
LL_INFOS("LLCoros") << "coprocedureInvokerCoro terminating because "
<< e.what() << LL_ENDL;
throw; // let toplevel handle this as LLContinueError
}
catch (...)
{
LOG_UNHANDLED_EXCEPTION(STRINGIZE("Coprocedure('" << coproc->mName
<< "', id=" << coproc->mId.asString()
<< ") in pool '" << mPoolName << "'"));
// must NOT omit this or we deplete the pool
mActiveCoprocs.erase(itActive);
mActiveCoprocsCount--;
continue;
}
LL_DEBUGS("CoProcMgr") << "Finished coprocedure(" << coproc->mName << ")" << " in pool \"" << mPoolName << "\"" << LL_ENDL;
mActiveCoprocs.erase(itActive);
mActiveCoprocsCount--;
}
}

View File

@ -85,15 +85,15 @@ const F64 LLExperienceCache::DEFAULT_EXPIRATION = 600.0;
const S32 LLExperienceCache::DEFAULT_QUOTA = 128; // this is megabytes
const int LLExperienceCache::SEARCH_PAGE_SIZE = 30;
bool LLExperienceCache::sShutdown = false;
//=========================================================================
LLExperienceCache::LLExperienceCache():
mShutdown(false)
LLExperienceCache::LLExperienceCache()
{
}
LLExperienceCache::~LLExperienceCache()
{
}
void LLExperienceCache::initSingleton()
@ -122,7 +122,7 @@ void LLExperienceCache::cleanup()
{
cache_stream << (*this);
}
mShutdown = true;
sShutdown = true;
}
//-------------------------------------------------------------------------
@ -344,7 +344,7 @@ void LLExperienceCache::requestExperiences()
ostr << urlBase << "?page_size=" << PAGE_SIZE1;
RequestQueue_t requests;
while (!mRequestQueue.empty())
while (!mRequestQueue.empty() && !sShutdown)
{
RequestQueue_t::iterator it = mRequestQueue.begin();
LLUUID key = (*it);
@ -398,8 +398,6 @@ void LLExperienceCache::idleCoro()
LL_INFOS("ExperienceCache") << "Launching Experience cache idle coro." << LL_ENDL;
do
{
llcoro::suspendUntilTimeout(SECS_BETWEEN_REQUESTS);
if (mEraseExpiredTimer.checkExpirationAndReset(ERASE_EXPIRED_TIMEOUT))
{
eraseExpired();
@ -410,7 +408,9 @@ void LLExperienceCache::idleCoro()
requestExperiences();
}
} while (!mShutdown);
llcoro::suspendUntilTimeout(SECS_BETWEEN_REQUESTS);
} while (!sShutdown);
// The coroutine system will likely be shut down by the time we get to this point
// (or at least no further cycling will occur on it since the user has decided to quit.)

View File

@ -142,7 +142,7 @@ private:
LLFrameTimer mEraseExpiredTimer; // Periodically clean out expired entries from the cache
CapabilityQuery_t mCapability;
std::string mCacheFileName;
bool mShutdown;
static bool sShutdown; // control for coroutines, they exist out of LLExperienceCache's scope, so they need a static control
void idleCoro();
void eraseExpired();

View File

@ -44,6 +44,8 @@ const U32 TELEPORT_FLAGS_VIA_REGION_ID = 1 << 12;
const U32 TELEPORT_FLAGS_IS_FLYING = 1 << 13;
const U32 TELEPORT_FLAGS_SHOW_RESET_HOME = 1 << 14;
const U32 TELEPORT_FLAGS_FORCE_REDIRECT = 1 << 15; // used to force a redirect to some random location - used when kicking someone from land.
const U32 TELEPORT_FLAGS_VIA_GLOBAL_COORDS = 1 << 16;
const U32 TELEPORT_FLAGS_WITHIN_REGION = 1 << 17;
const U32 TELEPORT_FLAGS_MASK_VIA = TELEPORT_FLAGS_VIA_LURE
| TELEPORT_FLAGS_VIA_LANDMARK

View File

@ -655,6 +655,37 @@ void LLAccordionCtrl::onScrollPosChangeCallback(S32, LLScrollbar*)
{
updateLayout(getRect().getWidth(),getRect().getHeight());
}
// virtual
void LLAccordionCtrl::onUpdateScrollToChild(const LLUICtrl *cntrl)
{
if (mScrollbar && mScrollbar->getVisible())
{
// same as scrollToShowRect
LLRect rect;
cntrl->localRectToOtherView(cntrl->getLocalRect(), &rect, this);
// Translate to parent coordinatess to check if we are in visible rectangle
rect.translate(getRect().mLeft, getRect().mBottom);
if (!getRect().contains(rect))
{
// for accordition's scroll, height is in pixels
// Back to local coords and calculate position for scroller
S32 bottom = mScrollbar->getDocPos() - rect.mBottom + getRect().mBottom;
S32 top = mScrollbar->getDocPos() - rect.mTop + getRect().mTop;
S32 scroll_pos = llclamp(mScrollbar->getDocPos(),
bottom, // min vertical scroll
top); // max vertical scroll
mScrollbar->setDocPos(scroll_pos);
}
}
LLUICtrl::onUpdateScrollToChild(cntrl);
}
void LLAccordionCtrl::onOpen (const LLSD& key)
{
for(size_t i=0;i<mAccordionTabs.size();++i)

View File

@ -111,6 +111,7 @@ public:
void draw();
void onScrollPosChangeCallback(S32, LLScrollbar*);
virtual void onUpdateScrollToChild(const LLUICtrl * cntrl);
void onOpen (const LLSD& key);
S32 notifyParent(const LLSD& info);

View File

@ -452,6 +452,35 @@ void LLAccordionCtrlTab::onVisibilityChange(BOOL new_visibility)
notifyParent(LLSD().with("child_visibility_change", new_visibility));
}
// virtual
void LLAccordionCtrlTab::onUpdateScrollToChild(const LLUICtrl *cntrl)
{
if (mScrollbar && mScrollbar->getVisible())
{
LLRect rect;
cntrl->localRectToOtherView(cntrl->getLocalRect(), &rect, this);
// Translate to parent coordinatess to check if we are in visible rectangle
rect.translate(getRect().mLeft, getRect().mBottom);
if (!getRect().contains(rect))
{
// for accordition's scroll, height is in pixels
// Back to local coords and calculate position for scroller
S32 bottom = mScrollbar->getDocPos() - rect.mBottom + getRect().mBottom;
S32 top = mScrollbar->getDocPos() - rect.mTop + getRect().mTop;
S32 scroll_pos = llclamp(mScrollbar->getDocPos(),
bottom, // min vertical scroll
top); // max vertical scroll
mScrollbar->setDocPos(scroll_pos);
}
}
LLUICtrl::onUpdateScrollToChild(cntrl);
}
BOOL LLAccordionCtrlTab::handleMouseDown(S32 x, S32 y, MASK mask)
{
if(mCollapsible && mHeaderVisible && mCanOpenClose)

View File

@ -159,6 +159,7 @@ public:
* Raises notifyParent event with "child_visibility_change" = new_visibility
*/
void onVisibilityChange(BOOL new_visibility);
virtual void onUpdateScrollToChild(const LLUICtrl * cntrl);
// Changes expand/collapse state and triggers expand/collapse callbacks
virtual BOOL handleMouseDown(S32 x, S32 y, MASK mask);

View File

@ -56,6 +56,14 @@ void LLBadgeOwner::initBadgeParams(const LLBadge::Params& p)
}
}
void LLBadgeOwner::reshapeBadge(const LLRect& new_rect)
{
if (mBadge)
{
mBadge->setShape(new_rect);
}
}
void LLBadgeOwner::setBadgeVisibility(bool visible)
{
if (mBadge)

View File

@ -46,6 +46,7 @@ public:
bool hasBadgeHolderParent() const { return mHasBadgeHolderParent; };
void setBadgeVisibility(bool visible);
void setDrawBadgeAtTop(bool draw_at_top);
void reshapeBadge(const LLRect& new_rect);
private:

View File

@ -514,6 +514,14 @@ S32 LLComboBox::getCurrentIndex() const
return -1;
}
void LLComboBox::setEnabledByValue(const LLSD& value, BOOL enabled)
{
LLScrollListItem *found = mList->getItem(value);
if (found)
{
found->setEnabled(enabled);
}
}
void LLComboBox::createLineEditor(const LLComboBox::Params& p)
{

View File

@ -158,6 +158,8 @@ public:
BOOL setCurrentByIndex( S32 index );
S32 getCurrentIndex() const;
void setEnabledByValue(const LLSD& value, BOOL enabled);
void createLineEditor(const Params&);
//========================================================================

View File

@ -2151,6 +2151,7 @@ void LLLineEditor::clear()
void LLLineEditor::onTabInto()
{
selectAll();
LLUICtrl::onTabInto();
}
//virtual

View File

@ -509,6 +509,7 @@ void LLMultiSliderCtrl::onTabInto()
{
mEditor->onTabInto();
}
LLF32UICtrl::onTabInto();
}
void LLMultiSliderCtrl::reportInvalidData()

View File

@ -255,7 +255,7 @@ LLNotificationForm::LLNotificationForm(const LLSD& sd)
}
else
{
LL_WARNS() << "Invalid form data " << sd << LL_ENDL;
LL_WARNS("Notifications") << "Invalid form data " << sd << LL_ENDL;
mFormData = LLSD::emptyArray();
}
}
@ -448,11 +448,11 @@ LLNotificationTemplate::LLNotificationTemplate(const LLNotificationTemplate::Par
mUniqueContext.push_back(context.value);
}
LL_DEBUGS() << "notification \"" << mName << "\": tag count is " << p.tags.size() << LL_ENDL;
LL_DEBUGS("Notifications") << "notification \"" << mName << "\": tag count is " << p.tags.size() << LL_ENDL;
BOOST_FOREACH(const LLNotificationTemplate::Tag& tag, p.tags)
{
LL_DEBUGS() << " tag \"" << std::string(tag.value) << "\"" << LL_ENDL;
LL_DEBUGS("Notifications") << " tag \"" << std::string(tag.value) << "\"" << LL_ENDL;
mTags.push_back(tag.value);
}
@ -1398,8 +1398,14 @@ void LLNotifications::initSingleton()
createDefaultChannels();
}
void LLNotifications::cleanupSingleton()
{
clear();
}
void LLNotifications::createDefaultChannels()
{
LL_INFOS("Notifications") << "Generating default notification channels" << LL_ENDL;
// now construct the various channels AFTER loading the notifications,
// because the history channel is going to rewrite the stored notifications file
mDefaultChannels.push_back(new LLNotificationChannel("Enabled", "",
@ -1455,7 +1461,7 @@ void LLNotifications::forceResponse(const LLNotification::Params& params, S32 op
if (selected_item.isUndefined())
{
LL_WARNS() << "Invalid option" << option << " for notification " << (std::string)params.name << LL_ENDL;
LL_WARNS("Notifications") << "Invalid option" << option << " for notification " << (std::string)params.name << LL_ENDL;
return;
}
response[selected_item["name"].asString()] = true;
@ -1489,12 +1495,12 @@ void replaceSubstitutionStrings(LLXMLNodePtr node, StringMap& replacements)
if (found != replacements.end())
{
replacement = found->second;
LL_DEBUGS() << "replaceSubstitutionStrings: value: \"" << value << "\" repl: \"" << replacement << "\"." << LL_ENDL;
LL_DEBUGS("Notifications") << "replaceSubstitutionStrings: value: \"" << value << "\" repl: \"" << replacement << "\"." << LL_ENDL;
it->second->setValue(replacement);
}
else
{
LL_WARNS() << "replaceSubstitutionStrings FAILURE: could not find replacement \"" << value << "\"." << LL_ENDL;
LL_WARNS("Notifications") << "replaceSubstitutionStrings FAILURE: could not find replacement \"" << value << "\"." << LL_ENDL;
}
}
}
@ -1533,7 +1539,7 @@ void addPathIfExists(const std::string& new_path, std::vector<std::string>& path
bool LLNotifications::loadTemplates()
{
LL_INFOS() << "Reading notifications template" << LL_ENDL;
LL_INFOS("Notifications") << "Reading notifications template" << LL_ENDL;
// Passing findSkinnedFilenames(constraint=LLDir::ALL_SKINS) makes it
// output all relevant pathnames instead of just the ones from the most
// specific skin.
@ -1604,7 +1610,7 @@ bool LLNotifications::loadTemplates()
mTemplates[notification.name] = LLNotificationTemplatePtr(new LLNotificationTemplate(notification));
}
LL_INFOS() << "...done" << LL_ENDL;
LL_INFOS("Notifications") << "...done" << LL_ENDL;
return true;
}
@ -1832,7 +1838,7 @@ bool LLNotifications::isVisibleByRules(LLNotificationPtr n)
for(it = mVisibilityRules.begin(); it != mVisibilityRules.end(); it++)
{
// An empty type/tag/name string will match any notification, so only do the comparison when the string is non-empty in the rule.
LL_DEBUGS()
LL_DEBUGS("Notifications")
<< "notification \"" << n->getName() << "\" "
<< "testing against " << ((*it)->mVisible?"show":"hide") << " rule, "
<< "name = \"" << (*it)->mName << "\" "
@ -1877,7 +1883,7 @@ bool LLNotifications::isVisibleByRules(LLNotificationPtr n)
if((*it)->mResponse.empty())
{
// Response property is empty. Cancel this notification.
LL_DEBUGS() << "cancelling notification " << n->getName() << LL_ENDL;
LL_DEBUGS("Notifications") << "cancelling notification " << n->getName() << LL_ENDL;
cancel(n);
}
@ -1888,7 +1894,7 @@ bool LLNotifications::isVisibleByRules(LLNotificationPtr n)
// TODO: verify that the response template has an item with the correct name
response[(*it)->mResponse] = true;
LL_DEBUGS() << "responding to notification " << n->getName() << " with response = " << response << LL_ENDL;
LL_DEBUGS("Notifications") << "responding to notification " << n->getName() << " with response = " << response << LL_ENDL;
n->respond(response);
}
@ -1900,7 +1906,7 @@ bool LLNotifications::isVisibleByRules(LLNotificationPtr n)
break;
}
LL_DEBUGS() << "allowing notification " << n->getName() << LL_ENDL;
LL_DEBUGS("Notifications") << "allowing notification " << n->getName() << LL_ENDL;
return true;
}
@ -1961,7 +1967,7 @@ void LLPostponedNotification::onAvatarNameCache(const LLUUID& agent_id,
// from PE merge - we should figure out if this is the right thing to do
if (name.empty())
{
LL_WARNS() << "Empty name received for Id: " << agent_id << LL_ENDL;
LL_WARNS("Notifications") << "Empty name received for Id: " << agent_id << LL_ENDL;
name = SYSTEM_FROM;
}

View File

@ -957,6 +957,7 @@ public:
private:
/*virtual*/ void initSingleton();
/*virtual*/ void cleanupSingleton();
void loadPersistentNotifications();
@ -1069,6 +1070,7 @@ public:
LLPersistentNotificationChannel()
: LLNotificationChannel("Persistent", "Visible", &notificationFilter)
{}
virtual ~LLPersistentNotificationChannel() {}
typedef std::vector<LLNotificationPtr> history_list_t;
history_list_t::iterator beginHistory() { sortHistory(); return mHistory.begin(); }

View File

@ -479,6 +479,7 @@ void LLSliderCtrl::onTabInto()
{
mEditor->onTabInto();
}
LLF32UICtrl::onTabInto();
}
void LLSliderCtrl::reportInvalidData()

View File

@ -442,7 +442,8 @@ void LLSpinCtrl::setAllowEdit(BOOL allow_edit)
void LLSpinCtrl::onTabInto()
{
mEditor->onTabInto();
mEditor->onTabInto();
LLF32UICtrl::onTabInto();
}

View File

@ -1059,7 +1059,38 @@ BOOL LLTextBase::handleMouseDown(S32 x, S32 y, MASK mask)
// handle triple click
if (!mTripleClickTimer.hasExpired())
{
selectAll();
S32 real_line = getLineNumFromDocIndex(mCursorPos, false);
S32 line_start = -1;
S32 line_end = -1;
for (line_list_t::const_iterator it = mLineInfoList.begin(), end_it = mLineInfoList.end();
it != end_it;
++it)
{
if (it->mLineNum < real_line)
{
continue;
}
if (it->mLineNum > real_line)
{
break;
}
if (line_start == -1)
{
line_start = it->mDocIndexStart;
}
line_end = it->mDocIndexEnd;
line_end = llclamp(line_end, 0, getLength());
}
if (line_start == -1)
{
return TRUE;
}
mSelectionEnd = line_start;
mSelectionStart = line_end;
setCursorPos(line_start);
return TRUE;
}

View File

@ -721,8 +721,9 @@ void LLUICtrl::resetDirty()
}
// virtual
void LLUICtrl::onTabInto()
void LLUICtrl::onTabInto()
{
onUpdateScrollToChild(this);
}
// virtual

View File

@ -645,6 +645,16 @@ void LLView::onVisibilityChange ( BOOL new_visibility )
}
}
// virtual
void LLView::onUpdateScrollToChild(const LLUICtrl * cntrl)
{
LLView* parent_view = getParent();
if (parent_view)
{
parent_view->onUpdateScrollToChild(cntrl);
}
}
// virtual
void LLView::translate(S32 x, S32 y)
{

View File

@ -301,6 +301,7 @@ public:
virtual BOOL setLabelArg( const std::string& key, const LLStringExplicit& text );
virtual void onVisibilityChange ( BOOL new_visibility );
virtual void onUpdateScrollToChild(const LLUICtrl * cntrl);
void pushVisible(BOOL visible) { mLastVisible = mVisible; setVisible(visible); }
void popVisible() { setVisible(mLastVisible); }

View File

@ -359,10 +359,10 @@ attributedStringInfo getSegments(NSAttributedString *str)
callRightMouseDown(mMousePos, [theEvent modifierFlags]);
mSimulatedRightClick = true;
} else {
if ([theEvent clickCount] >= 2)
if ([theEvent clickCount] == 2)
{
callDoubleClick(mMousePos, [theEvent modifierFlags]);
} else if ([theEvent clickCount] == 1) {
} else if ([theEvent clickCount] >= 1) {
callLeftMouseDown(mMousePos, [theEvent modifierFlags]);
}
}

View File

@ -1620,6 +1620,10 @@ if (WINDOWS)
# causes those systems to run in a Windows 8 compatibility mode, which works.
LIST(APPEND viewer_SOURCE_FILES windows.manifest)
endif (ADDRESS_SIZE EQUAL 64)
if (OPENAL)
LIST(APPEND viewer_LIBRARIES ${OPENAL_LIBRARIES})
endif (OPENAL)
endif (WINDOWS)
# Add the xui files. This is handy for searching for xui elements
@ -1721,6 +1725,12 @@ if (FMODSTUDIO)
endif (FMODSTUDIO)
set_source_files_properties(llstartup.cpp PROPERTIES COMPILE_FLAGS "${LLSTARTUP_COMPILE_FLAGS}")
if (HAVOK OR HAVOK_TPV)
set(LLSTARTUP_COMPILE_FLAGS "${LLSTARTUP_COMPILE_FLAGS} -DLL_HAVOK")
endif (HAVOK OR HAVOK_TPV)
# progress view disables/enables icons based on available packages
set_source_files_properties(llprogressview.cpp PROPERTIES COMPILE_FLAGS "${LLSTARTUP_COMPILE_FLAGS}")
list(APPEND viewer_SOURCE_FILES ${viewer_HEADER_FILES})
@ -1843,6 +1853,13 @@ if (WINDOWS)
)
endif (FMODSTUDIO)
if (OPENAL)
list(APPEND COPY_INPUT_DEPENDENCIES
${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/OpenAL32.dll
${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/alut.dll
)
endif (OPENAL)
add_custom_command(
OUTPUT ${CMAKE_CFG_INTDIR}/copy_touched.bat
COMMAND ${PYTHON_EXECUTABLE}
@ -1853,6 +1870,7 @@ if (WINDOWS)
--artwork=${ARTWORK_DIR}
"--bugsplat=${BUGSPLAT_DB}"
"--fmodstudio=${FMODSTUDIO}"
"--openal=${OPENAL}"
--build=${CMAKE_CURRENT_BINARY_DIR}
--buildtype=${CMAKE_BUILD_TYPE}
"--channel=${VIEWER_CHANNEL}"
@ -1915,6 +1933,7 @@ if (WINDOWS)
--artwork=${ARTWORK_DIR}
"--bugsplat=${BUGSPLAT_DB}"
"--fmodstudio=${FMODSTUDIO}"
"--openal=${OPENAL}"
--build=${CMAKE_CURRENT_BINARY_DIR}
--buildtype=${CMAKE_BUILD_TYPE}
"--channel=${VIEWER_CHANNEL}"
@ -2062,6 +2081,7 @@ if (LINUX)
--artwork=${ARTWORK_DIR}
"--bugsplat=${BUGSPLAT_DB}"
"--fmodstudio=${FMODSTUDIO}"
"--openal=${OPENAL}"
--build=${CMAKE_CURRENT_BINARY_DIR}
--buildtype=${CMAKE_BUILD_TYPE}
"--channel=${VIEWER_CHANNEL}"
@ -2089,6 +2109,7 @@ if (LINUX)
--artwork=${ARTWORK_DIR}
"--bugsplat=${BUGSPLAT_DB}"
"--fmodstudio=${FMODSTUDIO}"
"--openal=${OPENAL}"
--build=${CMAKE_CURRENT_BINARY_DIR}
--buildtype=${CMAKE_BUILD_TYPE}
"--channel=${VIEWER_CHANNEL}"
@ -2166,6 +2187,7 @@ if (DARWIN)
--artwork=${ARTWORK_DIR}
"--bugsplat=${BUGSPLAT_DB}"
"--fmodstudio=${FMODSTUDIO}"
"--openal=${OPENAL}"
--build=${CMAKE_CURRENT_BINARY_DIR}
--buildtype=${CMAKE_BUILD_TYPE}
--bundleid=${MACOSX_BUNDLE_GUI_IDENTIFIER}
@ -2201,6 +2223,7 @@ if (DARWIN)
--artwork=${ARTWORK_DIR}
"--bugsplat=${BUGSPLAT_DB}"
"--fmodstudio=${FMODSTUDIO}"
"--openal=${OPENAL}"
--build=${CMAKE_CURRENT_BINARY_DIR}
--buildtype=${CMAKE_BUILD_TYPE}
"--channel=${VIEWER_CHANNEL}"

View File

@ -1 +1 @@
6.4.8
6.4.9

View File

@ -14420,7 +14420,7 @@
<key>VoiceCallsFriendsOnly</key>
<map>
<key>Comment</key>
<string>Only accept voice calls from residents on your friends list</string>
<string>(Deprecated) Only accept voice calls from residents on your friends list</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>

View File

@ -220,6 +220,17 @@
<key>Value</key>
<integer>1</integer>
</map>
<key>VoiceCallsFriendsOnly</key>
<map>
<key>Comment</key>
<string>Only accept voice calls and receive IMs from residents on your friends list</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>0</integer>
</map>
<key>VoiceEffectDefault</key>
<map>
<key>Comment</key>

View File

@ -867,9 +867,7 @@ void LLAgent::setRegion(LLViewerRegion *regionp)
if (mRegionp != regionp)
{
std::string ip = regionp->getHost().getString();
LL_INFOS("AgentLocation") << "Moving agent into region: " << regionp->getName()
<< " located at " << ip << LL_ENDL;
LL_INFOS("AgentLocation") << "Moving agent into region: " << regionp->getName() << LL_ENDL;
if (mRegionp)
{
// We've changed regions, we're now going to change our agent coordinate frame.

View File

@ -354,6 +354,18 @@ void LLAgentCamera::resetView(BOOL reset_camera, BOOL change_camera)
resetPanDiff();
resetOrbitDiff();
mHUDTargetZoom = 1.f;
if (LLSelectMgr::getInstance()->mAllowSelectAvatar)
{
// resetting camera also resets position overrides in debug mode 'AllowSelectAvatar'
LLObjectSelectionHandle selected_handle = LLSelectMgr::getInstance()->getSelection();
if (selected_handle->getObjectCount() == 1
&& selected_handle->getFirstObject() != NULL
&& selected_handle->getFirstObject()->isAvatar())
{
LLSelectMgr::getInstance()->resetObjectOverrides(selected_handle);
}
}
}
// Allow camera to be moved somewhere other than behind avatar.

View File

@ -522,20 +522,20 @@ void LLAppCoreHttp::refreshSettings(bool initial)
LLCore::HttpStatus LLAppCoreHttp::sslVerify(const std::string &url,
const LLCore::HttpHandler::ptr_t &handler, void *appdata)
{
X509_STORE_CTX *ctx = static_cast<X509_STORE_CTX *>(appdata);
LLCore::HttpStatus result;
LLPointer<LLCertificateStore> store = gSecAPIHandler->getCertificateStore("");
LLPointer<LLCertificateChain> chain = gSecAPIHandler->getCertificateChain(ctx);
LLSD validation_params = LLSD::emptyMap();
LLURI uri(url);
LLCore::HttpStatus result;
try
{
X509_STORE_CTX *ctx = static_cast<X509_STORE_CTX *>(appdata);
LLPointer<LLCertificateStore> store = gSecAPIHandler->getCertificateStore("");
LLPointer<LLCertificateChain> chain = gSecAPIHandler->getCertificateChain(ctx);
LLSD validation_params = LLSD::emptyMap();
LLURI uri(url);
validation_params[CERT_HOSTNAME] = uri.hostName();
validation_params[CERT_HOSTNAME] = uri.hostName();
// *TODO: In the case of an exception while validating the cert, we need a way
// to pass the offending(?) cert back out. *Rider*
// *TODO: In the case of an exception while validating the cert, we need a way
// to pass the offending(?) cert back out. *Rider*
try
{
// don't validate hostname. Let libcurl do it instead. That way, it'll handle redirects
store->validate(VALIDATION_POLICY_SSL & (~VALIDATION_POLICY_HOSTNAME), chain, validation_params);
}

View File

@ -294,6 +294,7 @@ struct AttachmentInfo
std::vector<AttachmentInfo> info{
AttachmentInfo(metadata.logFilePathname, "text/plain"),
AttachmentInfo(metadata.userSettingsPathname, "text/xml"),
AttachmentInfo(metadata.accountSettingsPathname, "text/xml"),
AttachmentInfo(metadata.staticDebugPathname, "text/xml")
};

View File

@ -3582,6 +3582,10 @@ void LLAppearanceMgr::serverAppearanceUpdateCoro(LLCoreHttpUtil::HttpCoroutineAd
}
llcoro::suspend();
if (LLApp::isQuitting())
{
return;
}
S32 retryCount(0);
bool bRetry;
do
@ -3645,6 +3649,11 @@ void LLAppearanceMgr::serverAppearanceUpdateCoro(LLCoreHttpUtil::HttpCoroutineAd
LLSD result = httpAdapter->postAndSuspend(httpRequest, url, postData);
if (LLApp::isQuitting())
{
return;
}
LLSD httpResults = result[LLCoreHttpUtil::HttpCoroutineAdapter::HTTP_RESULTS];
LLCore::HttpStatus status = LLCoreHttpUtil::HttpCoroutineAdapter::getStatusFromLLSD(httpResults);
@ -3680,6 +3689,10 @@ void LLAppearanceMgr::serverAppearanceUpdateCoro(LLCoreHttpUtil::HttpCoroutineAd
LL_WARNS("Avatar") << "Bake retry #" << retryCount << " in " << timeout << " seconds." << LL_ENDL;
llcoro::suspendUntilTimeout(timeout);
if (LLApp::isQuitting())
{
return;
}
bRetry = true;
continue;
}

View File

@ -3122,8 +3122,9 @@ LLSD LLAppViewer::getViewerInfo() const
info["POSITION"] = ll_sd_from_vector3d(pos);
info["POSITION_LOCAL"] = ll_sd_from_vector3(gAgent.getPosAgentFromGlobal(pos));
info["REGION"] = gAgent.getRegion()->getName();
info["HOSTNAME"] = gAgent.getRegion()->getHost().getHostName();
info["HOSTIP"] = gAgent.getRegion()->getHost().getString();
boost::regex regex("\\.(secondlife|lindenlab)\\..*");
info["HOSTNAME"] = boost::regex_replace(gAgent.getRegion()->getHost().getHostName(), regex, "");
info["SERVER_VERSION"] = gLastVersionChannel;
LLSLURL slurl;
LLAgentUI::buildSLURL(slurl);
@ -3991,6 +3992,7 @@ static LLNotificationFunctorRegistration finish_quit_reg("ConfirmQuit", finish_q
void LLAppViewer::userQuit()
{
LL_INFOS() << "User requested quit" << LL_ENDL;
if (gDisconnected
|| !gViewerWindow
|| !gViewerWindow->getProgressView()
@ -4851,13 +4853,14 @@ void LLAppViewer::idle()
{
return;
}
gViewerWindow->updateUI();
if (gTeleportDisplay)
{
return;
}
gViewerWindow->updateUI();
///////////////////////////////////////
// Agent and camera movement
//

View File

@ -52,10 +52,12 @@ LLAppViewerListener::LLAppViewerListener(const LLAppViewerGetter& getter):
void LLAppViewerListener::requestQuit(const LLSD& event)
{
LL_INFOS() << "Listener requested quit" << LL_ENDL;
mAppViewerGetter()->requestQuit();
}
void LLAppViewerListener::forceQuit(const LLSD& event)
{
LL_INFOS() << "Listener requested force quit" << LL_ENDL;
mAppViewerGetter()->forceQuit();
}

View File

@ -41,6 +41,7 @@ struct CrashMetadata
{
std::string logFilePathname;
std::string userSettingsPathname;
std::string accountSettingsPathname;
std::string staticDebugPathname;
std::string OSInfo;
std::string agentFullname;

View File

@ -199,10 +199,11 @@ CrashMetadataSingleton::CrashMetadataSingleton()
else
{
LL_INFOS() << "Metadata from '" << staticDebugPathname << "':" << LL_ENDL;
logFilePathname = get_metadata(info, "SLLog");
userSettingsPathname = get_metadata(info, "SettingsFilename");
OSInfo = get_metadata(info, "OSInfo");
agentFullname = get_metadata(info, "LoginName");
logFilePathname = get_metadata(info, "SLLog");
userSettingsPathname = get_metadata(info, "SettingsFilename");
accountSettingsPathname = get_metadata(info, "PerAccountSettingsFilename");
OSInfo = get_metadata(info, "OSInfo");
agentFullname = get_metadata(info, "LoginName");
// Translate underscores back to spaces
LLStringUtil::replaceChar(agentFullname, '_', ' ');
regionName = get_metadata(info, "CurrentRegion");

View File

@ -139,6 +139,9 @@ namespace
{
// user name, when we have it
sBugSplatSender->setDefaultUserName(WCSTR(gAgentAvatarp->getFullname()));
sBugSplatSender->sendAdditionalFile(
WCSTR(gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, "settings_per_account.xml")));
}
// LL_ERRS message, when there is one

View File

@ -1092,6 +1092,10 @@ void LLScriptChiclet::onMenuItemClicked(const LLSD& user_data)
{
LLScriptFloaterManager::instance().removeNotification(getSessionId());
}
else if ("close all" == action)
{
LLIMWellWindow::getInstance()->closeAll();
}
}
void LLScriptChiclet::createPopupMenu()

View File

@ -347,6 +347,13 @@ void LLFloaterCompileQueue::processExperienceIdResults(LLSD result, LLUUID paren
bool LLFloaterCompileQueue::processScript(LLHandle<LLFloaterCompileQueue> hfloater,
const LLPointer<LLViewerObject> &object, LLInventoryObject* inventory, LLEventPump &pump)
{
if (LLApp::isQuitting())
{
// Reply from coroutine came on shutdown
// We are quiting, don't start any more coroutines!
return true;
}
LLSD result;
LLCheckedHandle<LLFloaterCompileQueue> floater(hfloater);
// Dereferencing floater may fail. If they do they throw LLExeceptionStaleHandle.
@ -381,6 +388,8 @@ bool LLFloaterCompileQueue::processScript(LLHandle<LLFloaterCompileQueue> hfloat
result = llcoro::suspendUntilEventOnWithTimeout(pump, fetch_timeout,
LLSDMap("timeout", LLSD::Boolean(true)));
floater.check();
if (result.has("timeout"))
{ // A timeout filed in the result will always be true if present.
LLStringUtil::format_map_t args;
@ -404,6 +413,12 @@ bool LLFloaterCompileQueue::processScript(LLHandle<LLFloaterCompileQueue> hfloat
}
if (!gAssetStorage)
{
// viewer likely is shutting down
return true;
}
{
HandleScriptUserData userData(pump.getName());
@ -468,6 +483,8 @@ bool LLFloaterCompileQueue::processScript(LLHandle<LLFloaterCompileQueue> hfloat
result = llcoro::suspendUntilEventOnWithTimeout(pump, fetch_timeout, LLSDMap("timeout", LLSD::Boolean(true)));
floater.check();
if (result.has("timeout"))
{ // A timeout filed in the result will always be true if present.
LLStringUtil::format_map_t args;
@ -797,6 +814,7 @@ void LLFloaterScriptQueue::objectScriptProcessingQueueCoro(std::string action, L
// but offers no guarantee of doing so.
llcoro::suspend();
}
floater.check();
}
floater->addStringMessage("Done");

View File

@ -482,6 +482,10 @@ bool LLConversationLog::saveToFile(const std::string& filename)
conv_it->getSessionID().toString(conversation_id);
conv_it->getParticipantID().toString(participant_id);
bool is_adhoc = (conv_it->getConversationType() == LLIMModel::LLIMSession::ADHOC_SESSION);
std::string conv_name = is_adhoc ? conv_it->getConversationName() : LLURI::escape(conv_it->getConversationName());
std::string file_name = is_adhoc ? conv_it->getHistoryFileName() : LLURI::escape(conv_it->getHistoryFileName());
// examples of two file entries
// [1343221177] 0 1 0 John Doe| 7e4ec5be-783f-49f5-71dz-16c58c64c145 4ec62a74-c246-0d25-2af6-846beac2aa55 john.doe|
// [1343222639] 2 0 0 Ad-hoc Conference| c3g67c89-c479-4c97-b21d-32869bcfe8rc 68f1c33e-4135-3e3e-a897-8c9b23115c09 Ad-hoc Conference hash597394a0-9982-766d-27b8-c75560213b9a|
@ -490,10 +494,10 @@ bool LLConversationLog::saveToFile(const std::string& filename)
(S32)conv_it->getConversationType(),
(S32)0,
(S32)conv_it->hasOfflineMessages(),
LLURI::escape(conv_it->getConversationName()).c_str(),
conv_name.c_str(),
participant_id.c_str(),
conversation_id.c_str(),
LLURI::escape(conv_it->getHistoryFileName()).c_str());
file_name.c_str());
}
fclose(fp);
return true;
@ -541,14 +545,18 @@ bool LLConversationLog::loadFromFile(const std::string& filename)
conv_id_buffer,
history_file_name);
bool is_adhoc = ((SessionType)stype == LLIMModel::LLIMSession::ADHOC_SESSION);
std::string conv_name = is_adhoc ? conv_name_buffer : LLURI::unescape(conv_name_buffer);
std::string file_name = is_adhoc ? history_file_name : LLURI::unescape(history_file_name);
ConversationParams params;
params.time(LLUnits::Seconds::fromValue(time))
.conversation_type((SessionType)stype)
.has_offline_ims(has_offline_ims)
.conversation_name(LLURI::unescape(conv_name_buffer))
.conversation_name(conv_name)
.participant_id(LLUUID(part_id_buffer))
.session_id(LLUUID(conv_id_buffer))
.history_filename(LLURI::unescape(history_file_name));
.history_filename(file_name);
LLConversation conversation(params);

View File

@ -138,24 +138,24 @@ public:
PASS_POST_BUMP,
PASS_MATERIAL,
PASS_MATERIAL_ALPHA,
PASS_MATERIAL_ALPHA_MASK,
PASS_MATERIAL_ALPHA_MASK, // Diffuse texture used as alpha mask
PASS_MATERIAL_ALPHA_EMISSIVE,
PASS_SPECMAP,
PASS_SPECMAP_BLEND,
PASS_SPECMAP_MASK,
PASS_SPECMAP_MASK, // Diffuse texture used as alpha mask and specular texture(map)
PASS_SPECMAP_EMISSIVE,
PASS_NORMMAP,
PASS_NORMMAP_BLEND,
PASS_NORMMAP_MASK,
PASS_NORMMAP_MASK, // Diffuse texture used as alpha mask and normal map
PASS_NORMMAP_EMISSIVE,
PASS_NORMSPEC,
PASS_NORMSPEC_BLEND,
PASS_NORMSPEC_MASK,
PASS_NORMSPEC_MASK, // Diffuse texture used as alpha mask with normal and specular map
PASS_NORMSPEC_EMISSIVE,
PASS_GLOW,
PASS_ALPHA,
PASS_ALPHA_MASK,
PASS_FULLBRIGHT_ALPHA_MASK,
PASS_FULLBRIGHT_ALPHA_MASK, // Diffuse texture used as alpha mask and fullbright
PASS_ALPHA_INVISIBLE,
NUM_RENDER_TYPES,
};

View File

@ -314,11 +314,15 @@ void LLDrawPoolAlpha::render(S32 pass)
LLVertexBuffer::MAP_TEXCOORD0);
pushBatches(LLRenderPass::PASS_ALPHA_MASK, LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_TEXCOORD0, FALSE);
pushBatches(LLRenderPass::PASS_FULLBRIGHT_ALPHA_MASK, LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_TEXCOORD0, FALSE);
pushBatches(LLRenderPass::PASS_ALPHA_INVISIBLE, LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_TEXCOORD0, FALSE);
// Material alpha mask
gGL.diffuseColor4f(0, 0, 1, 1);
pushBatches(LLRenderPass::PASS_MATERIAL_ALPHA_MASK, LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_TEXCOORD0, FALSE);
pushBatches(LLRenderPass::PASS_NORMMAP_MASK, LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_TEXCOORD0, FALSE);
pushBatches(LLRenderPass::PASS_SPECMAP_MASK, LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_TEXCOORD0, FALSE);
pushBatches(LLRenderPass::PASS_NORMSPEC_MASK, LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_TEXCOORD0, FALSE);
pushBatches(LLRenderPass::PASS_FULLBRIGHT_ALPHA_MASK, LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_TEXCOORD0, FALSE);
gGL.diffuseColor4f(0, 1, 0, 1);
pushBatches(LLRenderPass::PASS_INVISIBLE, LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_TEXCOORD0, FALSE);

View File

@ -1741,11 +1741,16 @@ void LLDrawPoolAvatar::getRiggedGeometry(
LLVolume* volume,
const LLVolumeFace& vol_face)
{
face->setGeomIndex(0);
face->setIndicesIndex(0);
//rigged faces do not batch textures
face->setTextureIndex(255);
face->setGeomIndex(0);
face->setIndicesIndex(0);
if (face->getTextureIndex() != FACE_DO_NOT_BATCH_TEXTURES)
{
face->setDrawInfo(NULL);
}
//rigged faces do not batch textures
face->setTextureIndex(FACE_DO_NOT_BATCH_TEXTURES);
if (buffer.isNull() || buffer->getTypeMask() != data_mask || !buffer->isWriteable())
{

View File

@ -153,7 +153,7 @@ void LLFace::init(LLDrawable* drawablep, LLViewerObject* objp)
}
mTEOffset = -1;
mTextureIndex = 255;
mTextureIndex = FACE_DO_NOT_BATCH_TEXTURES;
setDrawable(drawablep);
mVObjp = objp;
@ -184,6 +184,7 @@ void LLFace::destroy()
if(mTexture[i].notNull())
{
mTexture[i]->removeFace(i, this) ;
mTexture[i] = NULL;
}
}
@ -203,7 +204,6 @@ void LLFace::destroy()
{
mDrawPoolp->removeFace(this);
}
mDrawPoolp = NULL;
}
@ -212,7 +212,7 @@ void LLFace::destroy()
delete mTextureMatrix;
mTextureMatrix = NULL;
if (mDrawablep.notNull())
if (mDrawablep)
{
LLSpatialGroup* group = mDrawablep->getSpatialGroup();
if (group)
@ -224,7 +224,7 @@ void LLFace::destroy()
}
setDrawInfo(NULL);
mDrawablep = NULL;
mVObjp = NULL;
}
@ -456,13 +456,13 @@ void LLFace::setTextureIndex(U8 index)
{
mTextureIndex = index;
if (mTextureIndex != 255)
if (mTextureIndex != FACE_DO_NOT_BATCH_TEXTURES)
{
mDrawablep->setState(LLDrawable::REBUILD_POSITION);
}
else
{
if (mDrawInfo && mDrawInfo->mTextureList.size() <= 1)
if (mDrawInfo && !mDrawInfo->mTextureList.empty())
{
LL_ERRS() << "Face with no texture index references indexed texture draw info." << LL_ENDL;
}
@ -535,7 +535,7 @@ void LLFace::updateCenterAgent()
void LLFace::renderSelected(LLViewerTexture *imagep, const LLColor4& color)
{
if (mDrawablep->getSpatialGroup() == NULL)
if (mDrawablep == NULL || mDrawablep->getSpatialGroup() == NULL)
{
return;
}
@ -543,7 +543,7 @@ void LLFace::renderSelected(LLViewerTexture *imagep, const LLColor4& color)
mDrawablep->getSpatialGroup()->rebuildGeom();
mDrawablep->getSpatialGroup()->rebuildMesh();
if(mDrawablep.isNull() || mVertexBuffer.isNull())
if(mVertexBuffer.isNull())
{
return;
}
@ -1539,7 +1539,7 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume,
mVertexBuffer->bindForFeedback(0, LLVertexBuffer::TYPE_VERTEX, mGeomIndex, mGeomCount);
U8 index = mTextureIndex < 255 ? mTextureIndex : 0;
U8 index = mTextureIndex < FACE_DO_NOT_BATCH_TEXTURES ? mTextureIndex : 0;
S32 val = 0;
U8* vp = (U8*) &val;
@ -2072,7 +2072,7 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume,
LLVector4a texIdx;
S32 index = mTextureIndex < 255 ? mTextureIndex : 0;
S32 index = mTextureIndex < FACE_DO_NOT_BATCH_TEXTURES ? mTextureIndex : 0;
F32 val = 0.f;
S32* vp = (S32*) &val;
@ -2673,7 +2673,7 @@ S32 LLFace::renderElements(const U16 *index_array) const
S32 LLFace::renderIndexed()
{
if(mDrawablep.isNull() || mDrawPoolp == NULL)
if(mDrawablep == NULL || mDrawPoolp == NULL)
{
return 0;
}

View File

@ -52,6 +52,7 @@ class LLDrawInfo;
const F32 MIN_ALPHA_SIZE = 1024.f;
const F32 MIN_TEX_ANIM_SIZE = 512.f;
const U8 FACE_DO_NOT_BATCH_TEXTURES = 255;
class LLFace : public LLTrace::MemTrackableNonVirtual<LLFace, 16>
{
@ -279,8 +280,13 @@ private:
LLXformMatrix* mXform;
LLPointer<LLViewerTexture> mTexture[LLRender::NUM_TEXTURE_CHANNELS];
LLPointer<LLDrawable> mDrawablep;
// mDrawablep is not supposed to be null, don't use LLPointer because
// mDrawablep owns LLFace and LLPointer is a good way to either cause a
// memory leak or a 'delete each other' situation if something deletes
// drawable wrongly.
LLDrawable* mDrawablep;
// LLViewerObject technically owns drawable, but also it should be strictly managed
LLPointer<LLViewerObject> mVObjp;
S32 mTEOffset;

View File

@ -74,7 +74,6 @@ public:
void onClickBuy();
void onClickCancel();
void onClickErrorWeb();
};
LLFloater* LLFloaterBuyCurrency::buildFloater(const LLSD& key)
@ -132,7 +131,6 @@ BOOL LLFloaterBuyCurrencyUI::postBuild()
getChild<LLUICtrl>("buy_btn")->setCommitCallback( boost::bind(&LLFloaterBuyCurrencyUI::onClickBuy, this));
getChild<LLUICtrl>("cancel_btn")->setCommitCallback( boost::bind(&LLFloaterBuyCurrencyUI::onClickCancel, this));
getChild<LLUICtrl>("error_web")->setCommitCallback( boost::bind(&LLFloaterBuyCurrencyUI::onClickErrorWeb, this));
center();
@ -173,7 +171,6 @@ void LLFloaterBuyCurrencyUI::updateUI()
// hide most widgets - we'll turn them on as needed next
getChildView("info_buying")->setVisible(FALSE);
getChildView("info_cannot_buy")->setVisible(FALSE);
getChildView("info_need_more")->setVisible(FALSE);
getChildView("purchase_warning_repurchase")->setVisible(FALSE);
getChildView("purchase_warning_notenough")->setVisible(FALSE);
@ -183,32 +180,16 @@ void LLFloaterBuyCurrencyUI::updateUI()
if (hasError)
{
// display an error from the server
getChildView("normal_background")->setVisible(FALSE);
getChildView("error_background")->setVisible(TRUE);
getChildView("info_cannot_buy")->setVisible(TRUE);
getChildView("cannot_buy_message")->setVisible(TRUE);
getChildView("balance_label")->setVisible(FALSE);
getChildView("balance_amount")->setVisible(FALSE);
getChildView("buying_label")->setVisible(FALSE);
getChildView("buying_amount")->setVisible(FALSE);
getChildView("total_label")->setVisible(FALSE);
getChildView("total_amount")->setVisible(FALSE);
LLTextBox* message = getChild<LLTextBox>("cannot_buy_message");
if (message)
{
message->setText(mManager.errorMessage());
}
getChildView("error_web")->setVisible( !mManager.errorURI().empty());
LLSD args;
args["TITLE"] = getString("info_cannot_buy");
args["MESSAGE"] = mManager.errorMessage();
LLNotificationsUtil::add("CouldNotBuyCurrency", args);
closeFloater();
}
else
{
// display the main Buy L$ interface
getChildView("normal_background")->setVisible(TRUE);
getChildView("error_background")->setVisible(FALSE);
getChildView("cannot_buy_message")->setVisible(FALSE);
getChildView("error_web")->setVisible(FALSE);
if (mHasTarget)
{
@ -278,14 +259,6 @@ void LLFloaterBuyCurrencyUI::onClickCancel()
LLStatusBar::sendMoneyBalanceRequest();
}
void LLFloaterBuyCurrencyUI::onClickErrorWeb()
{
LLWeb::loadURL(mManager.errorURI());
closeFloater();
// Update L$ balance
LLStatusBar::sendMoneyBalanceRequest();
}
// static
void LLFloaterBuyCurrency::buyCurrency()
{

View File

@ -84,10 +84,7 @@ BOOL LLFloaterConversationPreview::postBuild()
file = "chat";
}
mChatHistoryFileName = file;
if (mIsGroup)
{
mChatHistoryFileName += GROUP_CHAT_SUFFIX;
}
LLStringUtil::format_map_t args;
args["[NAME]"] = name;
std::string title = getString("Title", args);

View File

@ -35,6 +35,7 @@
#include "llagent.h"
#include "llbutton.h"
#include "llcheckboxctrl.h"
#include "llcombobox.h"
#include "lldrawable.h"
#include "lldrawpoolavatar.h"
@ -115,8 +116,14 @@ BOOL LLFloaterImagePreview::postBuild()
mSculptedPreview = new LLImagePreviewSculpted(256, 256);
mSculptedPreview->setPreviewTarget(mRawImagep, 2.0f);
if (mRawImagep->getWidth() * mRawImagep->getHeight () <= LL_IMAGE_REZ_LOSSLESS_CUTOFF * LL_IMAGE_REZ_LOSSLESS_CUTOFF)
getChildView("lossless_check")->setEnabled(TRUE);
if (mRawImagep->getWidth() * mRawImagep->getHeight() <= LL_IMAGE_REZ_LOSSLESS_CUTOFF * LL_IMAGE_REZ_LOSSLESS_CUTOFF)
{
// We want "lossless_check" to be unchecked when it is disabled, regardless of
// LosslessJ2CUpload state, so only assign control when enabling checkbox
LLCheckBoxCtrl* check_box = getChild<LLCheckBoxCtrl>("lossless_check");
check_box->setEnabled(TRUE);
check_box->setControlVariable(gSavedSettings.getControl("LosslessJ2CUpload"));
}
}
else
{

View File

@ -455,7 +455,7 @@ void LLFloaterIMContainer::idleUpdate()
while (current_participant_model != end_participant_model)
{
LLConversationItemParticipant* participant_model = dynamic_cast<LLConversationItemParticipant*>(*current_participant_model);
participant_model->setModeratorOptionsVisible(is_moderator && participant_model->getUUID() != gAgentID);
participant_model->setModeratorOptionsVisible(is_moderator);
participant_model->setGroupBanVisible(can_ban && participant_model->getUUID() != gAgentID);
current_participant_model++;
@ -1409,12 +1409,21 @@ bool LLFloaterIMContainer::enableContextMenuItem(const std::string& item, uuid_v
{
return is_single_select;
}
// Beyond that point, if only the user agent is selected, everything is disabled
if (is_single_select && (single_id == gAgentID))
{
return false;
}
bool is_moderator_option = ("can_moderate_voice" == item) || ("can_allow_text_chat" == item) || ("can_mute" == item) || ("can_unmute" == item);
// Beyond that point, if only the user agent is selected, everything is disabled
if (is_single_select && (single_id == gAgentID))
{
if (is_moderator_option)
{
return enableModerateContextMenuItem(item, true);
}
else
{
return false;
}
}
// If the user agent is selected with others, everything is disabled
for (uuid_vec_t::const_iterator id = uuids.begin(); id != uuids.end(); ++id)
@ -1480,11 +1489,11 @@ bool LLFloaterIMContainer::enableContextMenuItem(const std::string& item, uuid_v
{
return canBanSelectedMember(single_id);
}
else if (("can_moderate_voice" == item) || ("can_allow_text_chat" == item) || ("can_mute" == item) || ("can_unmute" == item))
{
// *TODO : get that out of here...
return enableModerateContextMenuItem(item);
}
else if (is_moderator_option)
{
// *TODO : get that out of here...
return enableModerateContextMenuItem(item);
}
// By default, options that not explicitely disabled are enabled
return true;
@ -1854,7 +1863,7 @@ LLConversationViewParticipant* LLFloaterIMContainer::createConversationViewParti
return LLUICtrlFactory::create<LLConversationViewParticipant>(params);
}
bool LLFloaterIMContainer::enableModerateContextMenuItem(const std::string& userdata)
bool LLFloaterIMContainer::enableModerateContextMenuItem(const std::string& userdata, bool is_self)
{
// only group moderators can perform actions related to this "enable callback"
if (!isGroupModerator())
@ -1874,7 +1883,7 @@ bool LLFloaterIMContainer::enableModerateContextMenuItem(const std::string& user
{
return voice_channel;
}
else if ("can_mute" == userdata)
else if (("can_mute" == userdata) && !is_self)
{
return voice_channel && !isMuted(getCurSelectedViewModelItem()->getUUID());
}
@ -1884,7 +1893,7 @@ bool LLFloaterIMContainer::enableModerateContextMenuItem(const std::string& user
}
// The last invoke is used to check whether the "can_allow_text_chat" will enabled
return LLVoiceClient::getInstance()->isParticipantAvatar(getCurSelectedViewModelItem()->getUUID());
return LLVoiceClient::getInstance()->isParticipantAvatar(getCurSelectedViewModelItem()->getUUID()) && !is_self;
}
bool LLFloaterIMContainer::isGroupModerator()

View File

@ -164,7 +164,7 @@ private:
void doToSelectedGroup(const LLSD& userdata);
static void confirmMuteAllCallback(const LLSD& notification, const LLSD& response);
bool enableModerateContextMenuItem(const std::string& userdata);
bool enableModerateContextMenuItem(const std::string& userdata, bool is_self = false);
LLSpeaker * getSpeakerOfSelectedParticipant(LLSpeakerMgr * speaker_managerp);
LLSpeakerMgr * getSpeakerMgrForSelectedParticipant();
bool isGroupModerator();

View File

@ -66,6 +66,11 @@ void LLFloaterLoadPrefPreset::onOpen(const LLSD& key)
EDefaultOptions option = DEFAULT_TOP;
LLPresetsManager::getInstance()->setPresetNamesInComboBox(mSubdirectory, combo, option);
std::string preset_graphic_active = gSavedSettings.getString("PresetGraphicActive");
if (!preset_graphic_active.empty())
{
combo->setSimple(preset_graphic_active);
}
}
void LLFloaterLoadPrefPreset::onPresetsListChange()
@ -74,6 +79,11 @@ void LLFloaterLoadPrefPreset::onPresetsListChange()
EDefaultOptions option = DEFAULT_TOP;
LLPresetsManager::getInstance()->setPresetNamesInComboBox(mSubdirectory, combo, option);
std::string preset_graphic_active = gSavedSettings.getString("PresetGraphicActive");
if (!preset_graphic_active.empty())
{
combo->setSimple(preset_graphic_active);
}
}
void LLFloaterLoadPrefPreset::onBtnCancel()

View File

@ -178,7 +178,6 @@ void LLFloaterPermsDefault::sendInitialPerms()
if(!mCapSent)
{
updateCap();
setCapSent(true);
}
}
@ -240,7 +239,7 @@ void LLFloaterPermsDefault::updateCapCoro(std::string url)
{
const std::string& reason = status.toString();
// Do not display the same error more than once in a row
if (reason != previousReason)
if ((reason != previousReason) && mCapSent)
{
previousReason = reason;
LLSD args;

View File

@ -1094,6 +1094,7 @@ void LLFloaterPreference::onBtnCancel(const LLSD& userdata)
if (userdata.asString() == "closeadvanced")
{
LLFloaterReg::hideInstance("prefs_graphics_advanced");
updateMaxComplexity();
}
else
{
@ -1926,6 +1927,8 @@ void LLFloaterPreference::setPersonalInfo(const std::string& visibility, bool im
getChildView("log_path_button")->setEnabled(TRUE);
getChildView("chat_font_size")->setEnabled(TRUE);
getChildView("conversation_log_combo")->setEnabled(TRUE);
getChild<LLUICtrl>("voice_call_friends_only_check")->setEnabled(TRUE);
getChild<LLUICtrl>("voice_call_friends_only_check")->setValue(gSavedPerAccountSettings.getBOOL("VoiceCallsFriendsOnly"));
}
@ -2034,6 +2037,14 @@ void LLFloaterPreference::updateMaxComplexity()
LLAvatarComplexityControls::updateMax(
getChild<LLSliderCtrl>("IndirectMaxComplexity"),
getChild<LLTextBox>("IndirectMaxComplexityText"));
LLFloaterPreferenceGraphicsAdvanced* floater_graphics_advanced = LLFloaterReg::findTypedInstance<LLFloaterPreferenceGraphicsAdvanced>("prefs_graphics_advanced");
if (floater_graphics_advanced)
{
LLAvatarComplexityControls::updateMax(
floater_graphics_advanced->getChild<LLSliderCtrl>("IndirectMaxComplexity"),
floater_graphics_advanced->getChild<LLTextBox>("IndirectMaxComplexityText"));
}
}
bool LLFloaterPreference::loadFromFilename(const std::string& filename, std::map<std::string, std::string> &label_map)
@ -2081,6 +2092,14 @@ void LLFloaterPreferenceGraphicsAdvanced::updateMaxComplexity()
LLAvatarComplexityControls::updateMax(
getChild<LLSliderCtrl>("IndirectMaxComplexity"),
getChild<LLTextBox>("IndirectMaxComplexityText"));
LLFloaterPreference* floater_preferences = LLFloaterReg::findTypedInstance<LLFloaterPreference>("preferences");
if (floater_preferences)
{
LLAvatarComplexityControls::updateMax(
floater_preferences->getChild<LLSliderCtrl>("IndirectMaxComplexity"),
floater_preferences->getChild<LLTextBox>("IndirectMaxComplexityText"));
}
}
void LLFloaterPreference::onChangeMaturity()
@ -2554,9 +2573,13 @@ void LLPanelPreference::showMultipleViewersWarning(LLUICtrl* checkbox, const LLS
void LLPanelPreference::showFriendsOnlyWarning(LLUICtrl* checkbox, const LLSD& value)
{
if (checkbox && checkbox->getValue())
if (checkbox)
{
LLNotificationsUtil::add("FriendsAndGroupsOnly");
gSavedPerAccountSettings.setBOOL("VoiceCallsFriendsOnly", checkbox->getValue().asBoolean());
if (checkbox->getValue())
{
LLNotificationsUtil::add("FriendsAndGroupsOnly");
}
}
}
@ -2659,7 +2682,6 @@ class LLPanelPreferencePrivacy : public LLPanelPreference
public:
LLPanelPreferencePrivacy()
{
mAccountIndependentSettings.push_back("VoiceCallsFriendsOnly");
mAccountIndependentSettings.push_back("AutoDisengageMic");
}
@ -2916,6 +2938,7 @@ void LLFloaterPreferenceGraphicsAdvanced::onClickCloseBtn(bool app_quitting)
{
instance->cancel();
}
updateMaxComplexity();
}
LLFloaterPreferenceProxy::~LLFloaterPreferenceProxy()

View File

@ -930,7 +930,7 @@ void LLFloaterReporter::takeNewSnapshot()
// Take a screenshot, but don't draw this floater.
setVisible(FALSE);
if (!gViewerWindow->rawSnapshot(mImageRaw, IMAGE_WIDTH, IMAGE_HEIGHT, TRUE, FALSE, gSavedSettings.getBOOL("RenderHUDInSnapshot"), TRUE, FALSE))
if (!gViewerWindow->rawSnapshot(mImageRaw,IMAGE_WIDTH, IMAGE_HEIGHT, TRUE, FALSE, TRUE /*UI*/, TRUE, FALSE))
{
LL_WARNS() << "Unable to take screenshot" << LL_ENDL;
setVisible(TRUE);

View File

@ -86,7 +86,10 @@ void LLFloaterSavePrefPreset::onBtnSave()
{
std::string name = mPresetCombo->getSimple();
if ((name == LLTrans::getString(PRESETS_DEFAULT)) || (name == PRESETS_DEFAULT))
std::string upper_name(name);
LLStringUtil::toUpper(upper_name);
if ((name == LLTrans::getString(PRESETS_DEFAULT)) || (upper_name == PRESETS_DEFAULT_UPPER))
{
LLNotificationsUtil::add("DefaultPresetNotSaved");
}

View File

@ -947,7 +947,7 @@ static void formatDateString(std::string &date_string)
// static
void LLGroupMgr::processGroupMembersReply(LLMessageSystem* msg, void** data)
{
LL_DEBUGS() << "LLGroupMgr::processGroupMembersReply" << LL_ENDL;
LL_DEBUGS("GrpMgr") << "LLGroupMgr::processGroupMembersReply" << LL_ENDL;
LLUUID agent_id;
msg->getUUIDFast(_PREHASH_AgentData, _PREHASH_AgentID, agent_id );
if (gAgent.getID() != agent_id)
@ -1053,7 +1053,7 @@ void LLGroupMgr::processGroupMembersReply(LLMessageSystem* msg, void** data)
//static
void LLGroupMgr::processGroupPropertiesReply(LLMessageSystem* msg, void** data)
{
LL_DEBUGS() << "LLGroupMgr::processGroupPropertiesReply" << LL_ENDL;
LL_DEBUGS("GrpMgr") << "LLGroupMgr::processGroupPropertiesReply" << LL_ENDL;
if (!msg)
{
LL_ERRS() << "Can't access the messaging system" << LL_ENDL;
@ -1119,13 +1119,22 @@ void LLGroupMgr::processGroupPropertiesReply(LLMessageSystem* msg, void** data)
group_datap->mGroupPropertiesDataComplete = true;
group_datap->mChanged = TRUE;
properties_request_map_t::iterator request = LLGroupMgr::getInstance()->mPropRequests.find(group_id);
if (request != LLGroupMgr::getInstance()->mPropRequests.end())
{
LLGroupMgr::getInstance()->mPropRequests.erase(request);
}
else
{
LL_DEBUGS("GrpMgr") << "GroupPropertyResponse received with no pending request. Response was slow." << LL_ENDL;
}
LLGroupMgr::getInstance()->notifyObservers(GC_PROPERTIES);
}
// static
void LLGroupMgr::processGroupRoleDataReply(LLMessageSystem* msg, void** data)
{
LL_DEBUGS() << "LLGroupMgr::processGroupRoleDataReply" << LL_ENDL;
LL_DEBUGS("GrpMgr") << "LLGroupMgr::processGroupRoleDataReply" << LL_ENDL;
LLUUID agent_id;
msg->getUUIDFast(_PREHASH_AgentData, _PREHASH_AgentID, agent_id );
if (gAgent.getID() != agent_id)
@ -1186,7 +1195,7 @@ void LLGroupMgr::processGroupRoleDataReply(LLMessageSystem* msg, void** data)
LL_DEBUGS() << "Adding role data: " << name << " {" << role_id << "}" << LL_ENDL;
LL_DEBUGS("GrpMgr") << "Adding role data: " << name << " {" << role_id << "}" << LL_ENDL;
LLGroupRoleData* rd = new LLGroupRoleData(role_id,name,title,desc,powers,member_count);
group_datap->mRoles[role_id] = rd;
}
@ -1210,7 +1219,7 @@ void LLGroupMgr::processGroupRoleDataReply(LLMessageSystem* msg, void** data)
// static
void LLGroupMgr::processGroupRoleMembersReply(LLMessageSystem* msg, void** data)
{
LL_DEBUGS() << "LLGroupMgr::processGroupRoleMembersReply" << LL_ENDL;
LL_DEBUGS("GrpMgr") << "LLGroupMgr::processGroupRoleMembersReply" << LL_ENDL;
LLUUID agent_id;
msg->getUUIDFast(_PREHASH_AgentData, _PREHASH_AgentID, agent_id );
if (gAgent.getID() != agent_id)
@ -1271,7 +1280,7 @@ void LLGroupMgr::processGroupRoleMembersReply(LLMessageSystem* msg, void** data)
if (rd && md)
{
LL_DEBUGS() << "Adding role-member pair: " << role_id << ", " << member_id << LL_ENDL;
LL_DEBUGS("GrpMgr") << "Adding role-member pair: " << role_id << ", " << member_id << LL_ENDL;
rd->addMember(member_id);
md->addRole(role_id,rd);
}
@ -1323,7 +1332,7 @@ void LLGroupMgr::processGroupRoleMembersReply(LLMessageSystem* msg, void** data)
// static
void LLGroupMgr::processGroupTitlesReply(LLMessageSystem* msg, void** data)
{
LL_DEBUGS() << "LLGroupMgr::processGroupTitlesReply" << LL_ENDL;
LL_DEBUGS("GrpMgr") << "LLGroupMgr::processGroupTitlesReply" << LL_ENDL;
LLUUID agent_id;
msg->getUUIDFast(_PREHASH_AgentData, _PREHASH_AgentID, agent_id );
if (gAgent.getID() != agent_id)
@ -1356,7 +1365,7 @@ void LLGroupMgr::processGroupTitlesReply(LLMessageSystem* msg, void** data)
if (!title.mTitle.empty())
{
LL_DEBUGS() << "LLGroupMgr adding title: " << title.mTitle << ", " << title.mRoleID << ", " << (title.mSelected ? 'Y' : 'N') << LL_ENDL;
LL_DEBUGS("GrpMgr") << "LLGroupMgr adding title: " << title.mTitle << ", " << title.mRoleID << ", " << (title.mSelected ? 'Y' : 'N') << LL_ENDL;
group_datap->mTitles.push_back(title);
}
}
@ -1368,7 +1377,7 @@ void LLGroupMgr::processGroupTitlesReply(LLMessageSystem* msg, void** data)
// static
void LLGroupMgr::processEjectGroupMemberReply(LLMessageSystem* msg, void ** data)
{
LL_DEBUGS() << "processEjectGroupMemberReply" << LL_ENDL;
LL_DEBUGS("GrpMgr") << "processEjectGroupMemberReply" << LL_ENDL;
LLUUID group_id;
msg->getUUIDFast(_PREHASH_GroupData, _PREHASH_GroupID, group_id);
BOOL success;
@ -1384,7 +1393,7 @@ void LLGroupMgr::processEjectGroupMemberReply(LLMessageSystem* msg, void ** data
// static
void LLGroupMgr::processJoinGroupReply(LLMessageSystem* msg, void ** data)
{
LL_DEBUGS() << "processJoinGroupReply" << LL_ENDL;
LL_DEBUGS("GrpMgr") << "processJoinGroupReply" << LL_ENDL;
LLUUID group_id;
BOOL success;
msg->getUUIDFast(_PREHASH_GroupData, _PREHASH_GroupID, group_id);
@ -1404,7 +1413,7 @@ void LLGroupMgr::processJoinGroupReply(LLMessageSystem* msg, void ** data)
// static
void LLGroupMgr::processLeaveGroupReply(LLMessageSystem* msg, void ** data)
{
LL_DEBUGS() << "processLeaveGroupReply" << LL_ENDL;
LL_DEBUGS("GrpMgr") << "processLeaveGroupReply" << LL_ENDL;
LLUUID group_id;
BOOL success;
msg->getUUIDFast(_PREHASH_GroupData, _PREHASH_GroupID, group_id);
@ -1488,6 +1497,28 @@ LLGroupMgrGroupData* LLGroupMgr::createGroupData(const LLUUID& id)
return group_datap;
}
bool LLGroupMgr::hasPendingPropertyRequest(const LLUUID & id)
{
properties_request_map_t::iterator existing_req = LLGroupMgr::getInstance()->mPropRequests.find(id);
if (existing_req != LLGroupMgr::getInstance()->mPropRequests.end())
{
if (gFrameTime - existing_req->second < MIN_GROUP_PROPERTY_REQUEST_FREQ)
{
return true;
}
else
{
LLGroupMgr::getInstance()->mPropRequests.erase(existing_req);
}
}
return false;
}
void LLGroupMgr::addPendingPropertyRequest(const LLUUID& id)
{
LLGroupMgr::getInstance()->mPropRequests[id] = gFrameTime;
}
void LLGroupMgr::notifyObservers(LLGroupChange gc)
{
for (group_map_t::iterator gi = mGroups.begin(); gi != mGroups.end(); ++gi)
@ -1566,10 +1597,17 @@ void LLGroupMgr::addGroup(LLGroupMgrGroupData* group_datap)
void LLGroupMgr::sendGroupPropertiesRequest(const LLUUID& group_id)
{
LL_DEBUGS() << "LLGroupMgr::sendGroupPropertiesRequest" << LL_ENDL;
LL_DEBUGS("GrpMgr") << "LLGroupMgr::sendGroupPropertiesRequest" << LL_ENDL;
// This will happen when we get the reply
//LLGroupMgrGroupData* group_datap = createGroupData(group_id);
if (LLGroupMgr::getInstance()->hasPendingPropertyRequest(group_id))
{
LL_DEBUGS("GrpMgr") << "LLGroupMgr::sendGroupPropertiesRequest suppressed repeat for " << group_id << LL_ENDL;
return;
}
LLGroupMgr::getInstance()->addPendingPropertyRequest(group_id);
LLMessageSystem* msg = gMessageSystem;
msg->newMessage("GroupProfileRequest");
msg->nextBlock("AgentData");
@ -1582,7 +1620,7 @@ void LLGroupMgr::sendGroupPropertiesRequest(const LLUUID& group_id)
void LLGroupMgr::sendGroupMembersRequest(const LLUUID& group_id)
{
LL_DEBUGS() << "LLGroupMgr::sendGroupMembersRequest" << LL_ENDL;
LL_DEBUGS("GrpMgr") << "LLGroupMgr::sendGroupMembersRequest" << LL_ENDL;
LLGroupMgrGroupData* group_datap = createGroupData(group_id);
if (group_datap->mMemberRequestID.isNull())
{
@ -1604,7 +1642,7 @@ void LLGroupMgr::sendGroupMembersRequest(const LLUUID& group_id)
void LLGroupMgr::sendGroupRoleDataRequest(const LLUUID& group_id)
{
LL_DEBUGS() << "LLGroupMgr::sendGroupRoleDataRequest" << LL_ENDL;
LL_DEBUGS("GrpMgr") << "LLGroupMgr::sendGroupRoleDataRequest" << LL_ENDL;
LLGroupMgrGroupData* group_datap = createGroupData(group_id);
if (group_datap->mRoleDataRequestID.isNull())
{
@ -1625,7 +1663,7 @@ void LLGroupMgr::sendGroupRoleDataRequest(const LLUUID& group_id)
void LLGroupMgr::sendGroupRoleMembersRequest(const LLUUID& group_id)
{
LL_DEBUGS() << "LLGroupMgr::sendGroupRoleMembersRequest" << LL_ENDL;
LL_DEBUGS("GrpMgr") << "LLGroupMgr::sendGroupRoleMembersRequest" << LL_ENDL;
LLGroupMgrGroupData* group_datap = createGroupData(group_id);
if (group_datap->mRoleMembersRequestID.isNull())
@ -1635,7 +1673,7 @@ void LLGroupMgr::sendGroupRoleMembersRequest(const LLUUID& group_id)
|| !group_datap->isRoleDataComplete())
{
// *TODO: KLW FIXME: Should we start a member or role data request?
LL_INFOS() << " Pending: " << (group_datap->mPendingRoleMemberRequest ? "Y" : "N")
LL_INFOS("GrpMgr") << " Pending: " << (group_datap->mPendingRoleMemberRequest ? "Y" : "N")
<< " MemberDataComplete: " << (group_datap->mMemberDataComplete ? "Y" : "N")
<< " RoleDataComplete: " << (group_datap->mRoleDataComplete ? "Y" : "N") << LL_ENDL;
group_datap->mPendingRoleMemberRequest = TRUE;
@ -1659,7 +1697,7 @@ void LLGroupMgr::sendGroupRoleMembersRequest(const LLUUID& group_id)
void LLGroupMgr::sendGroupTitlesRequest(const LLUUID& group_id)
{
LL_DEBUGS() << "LLGroupMgr::sendGroupTitlesRequest" << LL_ENDL;
LL_DEBUGS("GrpMgr") << "LLGroupMgr::sendGroupTitlesRequest" << LL_ENDL;
LLGroupMgrGroupData* group_datap = createGroupData(group_id);
group_datap->mTitles.clear();
@ -1678,7 +1716,7 @@ void LLGroupMgr::sendGroupTitlesRequest(const LLUUID& group_id)
void LLGroupMgr::sendGroupTitleUpdate(const LLUUID& group_id, const LLUUID& title_role_id)
{
LL_DEBUGS() << "LLGroupMgr::sendGroupTitleUpdate" << LL_ENDL;
LL_DEBUGS("GrpMgr") << "LLGroupMgr::sendGroupTitleUpdate" << LL_ENDL;
LLMessageSystem* msg = gMessageSystem;
msg->newMessage("GroupTitleUpdate");
@ -1737,7 +1775,7 @@ void LLGroupMgr::sendCreateGroupRequest(const std::string& name,
void LLGroupMgr::sendUpdateGroupInfo(const LLUUID& group_id)
{
LL_DEBUGS() << "LLGroupMgr::sendUpdateGroupInfo" << LL_ENDL;
LL_DEBUGS("GrpMgr") << "LLGroupMgr::sendUpdateGroupInfo" << LL_ENDL;
LLGroupMgrGroupData* group_datap = createGroupData(group_id);
LLMessageSystem* msg = gMessageSystem;
@ -1766,7 +1804,7 @@ void LLGroupMgr::sendUpdateGroupInfo(const LLUUID& group_id)
void LLGroupMgr::sendGroupRoleMemberChanges(const LLUUID& group_id)
{
LL_DEBUGS() << "LLGroupMgr::sendGroupRoleMemberChanges" << LL_ENDL;
LL_DEBUGS("GrpMgr") << "LLGroupMgr::sendGroupRoleMemberChanges" << LL_ENDL;
LLGroupMgrGroupData* group_datap = createGroupData(group_id);
if (group_datap->mRoleMemberChanges.empty()) return;
@ -2313,7 +2351,7 @@ void LLGroupMgr::processCapGroupMembersRequest(const LLSD& content)
void LLGroupMgr::sendGroupRoleChanges(const LLUUID& group_id)
{
LL_DEBUGS() << "LLGroupMgr::sendGroupRoleChanges" << LL_ENDL;
LL_DEBUGS("GrpMgr") << "LLGroupMgr::sendGroupRoleChanges" << LL_ENDL;
LLGroupMgrGroupData* group_datap = getGroupData(group_id);
if (group_datap && group_datap->pendingRoleChanges())
@ -2328,7 +2366,7 @@ void LLGroupMgr::sendGroupRoleChanges(const LLUUID& group_id)
void LLGroupMgr::cancelGroupRoleChanges(const LLUUID& group_id)
{
LL_DEBUGS() << "LLGroupMgr::cancelGroupRoleChanges" << LL_ENDL;
LL_DEBUGS("GrpMgr") << "LLGroupMgr::cancelGroupRoleChanges" << LL_ENDL;
LLGroupMgrGroupData* group_datap = getGroupData(group_id);
if (group_datap) group_datap->cancelRoleChanges();
@ -2362,7 +2400,7 @@ bool LLGroupMgr::parseRoleActions(const std::string& xml_filename)
std::string action_set_name;
if (action_set->getAttributeString("name", action_set_name))
{
LL_DEBUGS() << "Loading action set " << action_set_name << LL_ENDL;
LL_DEBUGS("GrpMgr") << "Loading action set " << action_set_name << LL_ENDL;
role_action_data->mName = action_set_name;
}
else
@ -2403,7 +2441,7 @@ bool LLGroupMgr::parseRoleActions(const std::string& xml_filename)
std::string action_name;
if (action->getAttributeString("name", action_name))
{
LL_DEBUGS() << "Loading action " << action_name << LL_ENDL;
LL_DEBUGS("GrpMgr") << "Loading action " << action_name << LL_ENDL;
role_action->mName = action_name;
}
else

View File

@ -448,6 +448,8 @@ private:
void notifyObserver(const LLUUID& group_id, LLGroupChange gc);
void addGroup(LLGroupMgrGroupData* group_datap);
LLGroupMgrGroupData* createGroupData(const LLUUID &id);
bool hasPendingPropertyRequest(const LLUUID& id);
void addPendingPropertyRequest(const LLUUID& id);
typedef std::multimap<LLUUID,LLGroupMgrObserver*> observer_multimap_t;
observer_multimap_t mObservers;
@ -455,6 +457,10 @@ private:
typedef std::map<LLUUID, LLGroupMgrGroupData*> group_map_t;
group_map_t mGroups;
const U64MicrosecondsImplicit MIN_GROUP_PROPERTY_REQUEST_FREQ = 100000;//100ms between requests should be enough to avoid spamming.
typedef std::map<LLUUID, U64MicrosecondsImplicit> properties_request_map_t;
properties_request_map_t mPropRequests;
typedef std::set<LLParticularGroupObserver*> observer_set_t;
typedef std::map<LLUUID,observer_set_t> observer_map_t;
observer_map_t mParticularObservers;

View File

@ -415,7 +415,8 @@ void LLHUDNameTag::clearString()
void LLHUDNameTag::addLine(const std::string &text_utf8,
const LLColor4& color,
const LLFontGL::StyleFlags style,
const LLFontGL* font)
const LLFontGL* font,
const bool use_ellipses)
{
LLWString wline = utf8str_to_wstring(text_utf8);
if (!wline.empty())
@ -432,18 +433,52 @@ void LLHUDNameTag::addLine(const std::string &text_utf8,
tokenizer tokens(wline, sep);
tokenizer::iterator iter = tokens.begin();
while (iter != tokens.end())
{
U32 line_length = 0;
do
{
F32 max_pixels = HUD_TEXT_MAX_WIDTH;
S32 segment_length = font->maxDrawableChars(iter->substr(line_length).c_str(), max_pixels, wline.length(), LLFontGL::WORD_BOUNDARY_IF_POSSIBLE);
LLHUDTextSegment segment(iter->substr(line_length, segment_length), style, color, font);
mTextSegments.push_back(segment);
line_length += segment_length;
}
while (line_length != iter->size());
const F32 max_pixels = HUD_TEXT_MAX_WIDTH;
while (iter != tokens.end())
{
U32 line_length = 0;
if (use_ellipses)
{
// "QualityAssuranceAssuresQuality1" will end up like "QualityAssuranceAssuresQual..."
// "QualityAssuranceAssuresQuality QualityAssuranceAssuresQuality" will end up like "QualityAssuranceAssuresQual..."
// "QualityAssurance AssuresQuality1" will end up as "QualityAssurance AssuresQua..." because we are enforcing single line
do
{
S32 segment_length = font->maxDrawableChars(iter->substr(line_length).c_str(), max_pixels, wline.length(), LLFontGL::ANYWHERE);
if (segment_length + line_length < wline.length()) // since we only draw one string, line_length should be 0
{
// token does does not fit into signle line, need to draw "...".
// Use four dots for ellipsis width to generate padding
const LLWString dots_pad(utf8str_to_wstring(std::string("....")));
S32 elipses_width = font->getWidthF32(dots_pad.c_str());
// truncated string length
segment_length = font->maxDrawableChars(iter->substr(line_length).c_str(), max_pixels - elipses_width, wline.length(), LLFontGL::ANYWHERE);
const LLWString dots(utf8str_to_wstring(std::string("...")));
LLHUDTextSegment segment(iter->substr(line_length, segment_length) + dots, style, color, font);
mTextSegments.push_back(segment);
break; // consider it to be complete
}
else
{
// token fits fully into string
LLHUDTextSegment segment(iter->substr(line_length, segment_length), style, color, font);
mTextSegments.push_back(segment);
line_length += segment_length;
}
} while (line_length != iter->size());
}
else
{
// "QualityAssuranceAssuresQuality 1" will be split into two lines "QualityAssuranceAssuresQualit" and "y 1"
// "QualityAssurance AssuresQuality 1" will be split into two lines "QualityAssurance" and "AssuresQuality"
do
{
S32 segment_length = font->maxDrawableChars(iter->substr(line_length).c_str(), max_pixels, wline.length(), LLFontGL::WORD_BOUNDARY_IF_POSSIBLE);
LLHUDTextSegment segment(iter->substr(line_length, segment_length), style, color, font);
mTextSegments.push_back(segment);
line_length += segment_length;
} while (line_length != iter->size());
}
++iter;
}
}

View File

@ -92,7 +92,7 @@ public:
void clearString();
// Add text a line at a time, allowing custom formatting
void addLine(const std::string &text_utf8, const LLColor4& color, const LLFontGL::StyleFlags style = LLFontGL::NORMAL, const LLFontGL* font = NULL);
void addLine(const std::string &text_utf8, const LLColor4& color, const LLFontGL::StyleFlags style = LLFontGL::NORMAL, const LLFontGL* font = NULL, const bool use_ellipses = false);
// For bubble chat, set the part above the chat text
void setLabel(const std::string& label_utf8);

View File

@ -450,7 +450,7 @@ void LLIMProcessing::processNewMessage(LLUUID from_id,
|| (dialog == IM_FROM_TASK && LLMuteList::getInstance()->isMuted(session_id));
BOOL is_owned_by_me = FALSE;
BOOL is_friend = (LLAvatarTracker::instance().getBuddyInfo(from_id) == NULL) ? false : true;
BOOL accept_im_from_only_friend = gSavedSettings.getBOOL("VoiceCallsFriendsOnly");
BOOL accept_im_from_only_friend = gSavedPerAccountSettings.getBOOL("VoiceCallsFriendsOnly");
BOOL is_linden = chat.mSourceType != CHAT_SOURCE_OBJECT &&
LLMuteList::getInstance()->isLinden(name);
@ -1164,7 +1164,7 @@ void LLIMProcessing::processNewMessage(LLUUID from_id,
{
return;
}
else if (gSavedSettings.getBOOL("VoiceCallsFriendsOnly") && (LLAvatarTracker::instance().getBuddyInfo(from_id) == NULL))
else if (gSavedPerAccountSettings.getBOOL("VoiceCallsFriendsOnly") && (LLAvatarTracker::instance().getBuddyInfo(from_id) == NULL))
{
return;
}

View File

@ -515,6 +515,7 @@ LLIMModel::LLIMModel()
{
addNewMsgCallback(boost::bind(&LLFloaterIMSession::newIMCallback, _1));
addNewMsgCallback(boost::bind(&on_new_message, _1));
LLCallDialogManager::instance();
}
LLIMModel::LLIMSession::LLIMSession(const LLUUID& session_id, const std::string& name, const EInstantMessage& type, const LLUUID& other_participant_id, const uuid_vec_t& ids, bool voice, bool has_offline_msg)
@ -2683,7 +2684,7 @@ void LLIMMgr::addMessage(
}
bool skip_message = false;
bool from_linden = LLMuteList::getInstance()->isLinden(from);
if (gSavedSettings.getBOOL("VoiceCallsFriendsOnly") && !from_linden)
if (gSavedPerAccountSettings.getBOOL("VoiceCallsFriendsOnly") && !from_linden)
{
// Evaluate if we need to skip this message when that setting is true (default is false)
skip_message = (LLAvatarTracker::instance().getBuddyInfo(other_participant_id) == NULL); // Skip non friends...
@ -2742,7 +2743,7 @@ void LLIMMgr::addMessage(
}
//Play sound for new conversations
if (!gAgent.isDoNotDisturb() && (gSavedSettings.getBOOL("PlaySoundNewConversation") == TRUE))
if (!skip_message & !gAgent.isDoNotDisturb() && (gSavedSettings.getBOOL("PlaySoundNewConversation") == TRUE))
{
make_ui_sound("UISndNewIncomingIMSession");
}
@ -3072,7 +3073,7 @@ void LLIMMgr::inviteToSession(
if (voice_invite)
{
bool isRejectGroupCall = (gSavedSettings.getBOOL("VoiceCallsRejectGroup") && (notify_box_type == "VoiceInviteGroup"));
bool isRejectNonFriendCall = (gSavedSettings.getBOOL("VoiceCallsFriendsOnly") && (LLAvatarTracker::instance().getBuddyInfo(caller_id) == NULL));
bool isRejectNonFriendCall = (gSavedPerAccountSettings.getBOOL("VoiceCallsFriendsOnly") && (LLAvatarTracker::instance().getBuddyInfo(caller_id) == NULL));
if (isRejectGroupCall || isRejectNonFriendCall || gAgent.isDoNotDisturb())
{
if (gAgent.isDoNotDisturb() && !isRejectGroupCall && !isRejectNonFriendCall)

View File

@ -4101,12 +4101,6 @@ void LLFolderBridge::buildContextMenuOptions(U32 flags, menuentry_vec_t& items
items.push_back(std::string("New Body Parts"));
items.push_back(std::string("New Settings"));
items.push_back(std::string("upload_def"));
if (!LLEnvironment::instance().isInventoryEnabled())
{
disabled_items.push_back("New Settings");
}
}
}
getClipboardEntries(false, items, disabled_items, flags);

View File

@ -192,10 +192,15 @@ bool LLInventoryFilter::checkFolder(const LLUUID& folder_id) const
// when applying a filter, matching folders get their contents downloaded first
// but make sure we are not interfering with pre-download
if (isNotDefault()
&& !gInventory.isCategoryComplete(folder_id)
&& LLStartUp::getStartupState() > STATE_WEARABLES_WAIT)
{
LLInventoryModelBackgroundFetch::instance().start(folder_id);
{
LLViewerInventoryCategory* cat = gInventory.getCategory(folder_id);
if (!cat || (cat->getVersion() == LLViewerInventoryCategory::VERSION_UNKNOWN))
{
// At the moment background fetch only cares about VERSION_UNKNOWN,
// so do not check isCategoryComplete that compares descendant count
LLInventoryModelBackgroundFetch::instance().start(folder_id);
}
}
// Marketplace folder filtering
@ -287,21 +292,34 @@ bool LLInventoryFilter::checkAgainstFilterType(const LLFolderViewModelItemInvent
// Pass if this item's type is of the correct filter type
if (filterTypes & FILTERTYPE_OBJECT)
{
// If it has no type, pass it, unless it's a link.
if (object_type == LLInventoryType::IT_NONE)
{
if (object && object->getIsLinkType())
{
return FALSE;
}
}
else if ((1LL << object_type & mFilterOps.mFilterObjectTypes) == U64(0))
{
return FALSE;
}
switch (object_type)
{
case LLInventoryType::IT_NONE:
// If it has no type, pass it, unless it's a link.
if (object && object->getIsLinkType())
{
return FALSE;
}
break;
case LLInventoryType::IT_UNKNOWN:
{
// Unknows are only shown when we show every type.
// Unknows are 255 and won't fit in 64 bits.
if (mFilterOps.mFilterObjectTypes != 0xffffffffffffffffULL)
{
return FALSE;
}
break;
}
default:
if ((1LL << object_type & mFilterOps.mFilterObjectTypes) == U64(0))
{
return FALSE;
}
break;
}
}
if(filterTypes & FILTERTYPE_WORN)
{
if (!get_is_item_worn(object_id))
@ -426,18 +444,32 @@ bool LLInventoryFilter::checkAgainstFilterType(const LLInventoryItem* item) cons
// Pass if this item's type is of the correct filter type
if (filterTypes & FILTERTYPE_OBJECT)
{
// If it has no type, pass it, unless it's a link.
if (object_type == LLInventoryType::IT_NONE)
{
if (item && item->getIsLinkType())
{
return false;
}
}
else if ((1LL << object_type & mFilterOps.mFilterObjectTypes) == U64(0))
{
return false;
}
switch (object_type)
{
case LLInventoryType::IT_NONE:
// If it has no type, pass it, unless it's a link.
if (item && item->getIsLinkType())
{
return FALSE;
}
break;
case LLInventoryType::IT_UNKNOWN:
{
// Unknows are only shown when we show every type.
// Unknows are 255 and won't fit in 64 bits.
if (mFilterOps.mFilterObjectTypes != 0xffffffffffffffffULL)
{
return FALSE;
}
break;
}
default:
if ((1LL << object_type & mFilterOps.mFilterObjectTypes) == U64(0))
{
return FALSE;
}
break;
}
}
////////////////////////////////////////////////////////////////////////////////

View File

@ -1755,41 +1755,7 @@ LLInventoryRecentItemsPanel::LLInventoryRecentItemsPanel( const Params& params)
/************************************************************************/
/* Asset Pre-Filtered Inventory Panel related class */
/* Exchanges filter's flexibility for speed of generation and */
/* improved performance */
/************************************************************************/
class LLAssetFilteredInventoryPanel : public LLInventoryPanel
{
public:
struct Params
: public LLInitParam::Block<Params, LLInventoryPanel::Params>
{
Mandatory<std::string> filter_asset_type;
Params() : filter_asset_type("filter_asset_type") {}
};
void initFromParams(const Params& p);
protected:
LLAssetFilteredInventoryPanel(const Params& p) : LLInventoryPanel(p) {}
friend class LLUICtrlFactory;
public:
~LLAssetFilteredInventoryPanel() {}
/*virtual*/ BOOL handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop,
EDragAndDropType cargo_type,
void* cargo_data,
EAcceptance* accept,
std::string& tooltip_msg) override;
protected:
/*virtual*/ LLFolderViewItem* buildNewViews(const LLUUID& id) override;
/*virtual*/ void itemChanged(const LLUUID& item_id, U32 mask, const LLInventoryObject* model_item) override;
private:
LLAssetType::EType mAssetType;
};
void LLAssetFilteredInventoryPanel::initFromParams(const Params& p)
{

View File

@ -338,4 +338,42 @@ private:
bool mViewsInitialized; // Views have been generated
};
/************************************************************************/
/* Asset Pre-Filtered Inventory Panel related class */
/* Exchanges filter's flexibility for speed of generation and */
/* improved performance */
/************************************************************************/
class LLAssetFilteredInventoryPanel : public LLInventoryPanel
{
public:
struct Params
: public LLInitParam::Block<Params, LLInventoryPanel::Params>
{
Mandatory<std::string> filter_asset_type;
Params() : filter_asset_type("filter_asset_type") {}
};
void initFromParams(const Params& p);
protected:
LLAssetFilteredInventoryPanel(const Params& p) : LLInventoryPanel(p) {}
friend class LLUICtrlFactory;
public:
~LLAssetFilteredInventoryPanel() {}
/*virtual*/ BOOL handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop,
EDragAndDropType cargo_type,
void* cargo_data,
EAcceptance* accept,
std::string& tooltip_msg) override;
protected:
/*virtual*/ LLFolderViewItem* buildNewViews(const LLUUID& id) override;
/*virtual*/ void itemChanged(const LLUUID& item_id, U32 mask, const LLInventoryObject* model_item) override;
private:
LLAssetType::EType mAssetType;
};
#endif // LL_LLINVENTORYPANEL_H

View File

@ -39,6 +39,11 @@
// Globals
LLLandmarkList gLandmarkList;
// number is mostly arbitrary, but it should be below DEFAULT_QUEUE_SIZE pool size,
// which is 4096, to not overfill the pool if user has more than 4K of landmarks,
// and low number helps with not flooding server with requests
const S32 MAX_SIMULTANEOUS_REQUESTS = 512;
////////////////////////////////////////////////////////////////////////////
// LLLandmarkList
@ -69,6 +74,11 @@ LLLandmark* LLLandmarkList::getAsset(const LLUUID& asset_uuid, loaded_callback_t
{
return NULL;
}
if ( mWaitList.find(asset_uuid) != mWaitList.end() )
{
// Landmark is sheduled for download, but not requested yet
return NULL;
}
landmark_requested_list_t::iterator iter = mRequestedList.find(asset_uuid);
if (iter != mRequestedList.end())
@ -86,6 +96,13 @@ LLLandmark* LLLandmarkList::getAsset(const LLUUID& asset_uuid, loaded_callback_t
mLoadedCallbackMap.insert(vt);
}
if (mRequestedList.size() > MAX_SIMULTANEOUS_REQUESTS)
{
// Postpone download till queu is emptier
mWaitList.insert(asset_uuid);
return NULL;
}
gAssetStorage->getAssetData(asset_uuid,
LLAssetType::AT_LANDMARK,
LLLandmarkList::processGetAssetReply,
@ -155,8 +172,22 @@ void LLLandmarkList::processGetAssetReply(
}
gLandmarkList.mBadList.insert(uuid);
gLandmarkList.mRequestedList.erase(uuid); //mBadList effectively blocks any load, so no point keeping id in requests
// todo: this should clean mLoadedCallbackMap!
}
if (!gLandmarkList.mWaitList.empty())
{
// start new download from wait list
landmark_uuid_list_t::iterator iter = gLandmarkList.mWaitList.begin();
LLUUID asset_uuid = *iter;
gLandmarkList.mWaitList.erase(iter);
gAssetStorage->getAssetData(asset_uuid,
LLAssetType::AT_LANDMARK,
LLLandmarkList::processGetAssetReply,
NULL);
gLandmarkList.mRequestedList[asset_uuid] = gFrameTimeSeconds;
}
}
BOOL LLLandmarkList::isAssetInLoadedCallbackMap(const LLUUID& asset_uuid)

View File

@ -70,9 +70,10 @@ protected:
typedef std::map<LLUUID, LLLandmark*> landmark_list_t;
landmark_list_t mList;
typedef std::set<LLUUID> landmark_bad_list_t;
landmark_bad_list_t mBadList;
typedef std::set<LLUUID> landmark_uuid_list_t;
landmark_uuid_list_t mBadList;
landmark_uuid_list_t mWaitList;
typedef std::map<LLUUID,F32> landmark_requested_list_t;
landmark_requested_list_t mRequestedList;

View File

@ -761,8 +761,8 @@ bool LLLogChat::isTranscriptExist(const LLUUID& avatar_id, bool is_group)
{
std::string file_name;
gCacheName->getGroupName(avatar_id, file_name);
file_name = makeLogFileName(file_name);
return isTranscriptFileFound(makeLogFileName(file_name));
file_name = makeLogFileName(file_name + GROUP_CHAT_SUFFIX);
return isTranscriptFileFound(file_name);
}
return false;
}

View File

@ -447,6 +447,7 @@ BOOL LLManipRotate::handleMouseDownOnPart( S32 x, S32 y, MASK mask )
}
mMouseCur = mMouseDown;
mAgentSelfAtAxis = gAgent.getAtAxis(); // no point checking if avatar was selected, just save the value
// Route future Mouse messages here preemptively. (Release on mouse up.)
setMouseCapture( TRUE );
@ -610,6 +611,26 @@ void LLManipRotate::drag( S32 x, S32 y )
else
{
object->setRotation(new_rot, damped);
LLVOAvatar* avatar = object->asAvatar();
if (avatar && avatar->isSelf()
&& LLSelectMgr::getInstance()->mAllowSelectAvatar
&& !object->getParent())
{
// Normal avatars use object's orienttion, but self uses
// separate LLCoordFrame
// See LVOAvatar::updateOrientation()
if (gAgentCamera.getFocusOnAvatar())
{
//Don't rotate camera with avatar
gAgentCamera.setFocusOnAvatar(false, false, false);
}
LLVector3 at_axis = mAgentSelfAtAxis;
at_axis *= mRotation;
at_axis.mV[VZ] = 0.f;
at_axis.normalize();
gAgent.resetAxes(at_axis);
}
rebuild(object);
}
@ -717,7 +738,7 @@ void LLManipRotate::drag( S32 x, S32 y )
LLViewerObject *root_object = (cur == NULL) ? NULL : cur->getRootEdit();
if( cur->permModify() && cur->permMove() && !cur->isPermanentEnforced() &&
((root_object == NULL) || !root_object->isPermanentEnforced()) &&
!cur->isAvatar())
(!cur->isAvatar() || LLSelectMgr::getInstance()->mAllowSelectAvatar))
{
selectNode->mLastRotation = cur->getRotation();
selectNode->mLastPositionLocal = cur->getPosition();

View File

@ -95,6 +95,7 @@ private:
LLVector3 mMouseDown;
LLVector3 mMouseCur;
LLVector3 mAgentSelfAtAxis; // Own agent uses separate rotation method
F32 mRadiusMeters;
LLVector3 mCenterToCam;

View File

@ -1553,7 +1553,7 @@ bool LLMeshRepoThread::fetchMeshPhysicsShape(const LLUUID& mesh_id)
if (!zero)
{ //attempt to parse
if (physicsShapeReceived(mesh_id, buffer, size))
if (physicsShapeReceived(mesh_id, buffer, size) == MESH_OK)
{
delete[] buffer;
return true;
@ -1647,7 +1647,7 @@ bool LLMeshRepoThread::fetchMeshHeader(const LLVolumeParams& mesh_params, bool c
LLMeshRepository::sCacheBytesRead += bytes;
++LLMeshRepository::sCacheReads;
file.read(buffer, bytes);
if (headerReceived(mesh_params, buffer, bytes))
if (headerReceived(mesh_params, buffer, bytes) == MESH_OK)
{
// Found mesh in VFS cache
return true;
@ -1794,7 +1794,7 @@ bool LLMeshRepoThread::fetchMeshLOD(const LLVolumeParams& mesh_params, S32 lod,
return retval;
}
bool LLMeshRepoThread::headerReceived(const LLVolumeParams& mesh_params, U8* data, S32 data_size)
EMeshProcessingResult LLMeshRepoThread::headerReceived(const LLVolumeParams& mesh_params, U8* data, S32 data_size)
{
const LLUUID mesh_id = mesh_params.getSculptID();
LLSD header;
@ -1802,30 +1802,39 @@ bool LLMeshRepoThread::headerReceived(const LLVolumeParams& mesh_params, U8* dat
U32 header_size = 0;
if (data_size > 0)
{
std::string res_str((char*) data, data_size);
std::istringstream stream;
try
{
std::string res_str((char*)data, data_size);
std::string deprecated_header("<? LLSD/Binary ?>");
std::string deprecated_header("<? LLSD/Binary ?>");
if (res_str.substr(0, deprecated_header.size()) == deprecated_header)
{
res_str = res_str.substr(deprecated_header.size()+1, data_size);
header_size = deprecated_header.size()+1;
}
data_size = res_str.size();
if (res_str.substr(0, deprecated_header.size()) == deprecated_header)
{
res_str = res_str.substr(deprecated_header.size() + 1, data_size);
header_size = deprecated_header.size() + 1;
}
data_size = res_str.size();
std::istringstream stream(res_str);
stream.str(res_str);
}
catch (std::bad_alloc&)
{
// out of memory, we won't be able to process this mesh
return MESH_OUT_OF_MEMORY;
}
if (!LLSDSerialize::fromBinary(header, stream, data_size))
{
LL_WARNS(LOG_MESH) << "Mesh header parse error. Not a valid mesh asset! ID: " << mesh_id
<< LL_ENDL;
return false;
return MESH_PARSE_FAILURE;
}
if (!header.isMap())
{
LL_WARNS(LOG_MESH) << "Mesh header is invalid for ID: " << mesh_id << LL_ENDL;
return false;
return MESH_INVALID;
}
if (header.has("version") && header["version"].asInteger() > MAX_MESH_VERSION)
@ -1871,7 +1880,7 @@ bool LLMeshRepoThread::headerReceived(const LLVolumeParams& mesh_params, U8* dat
}
}
return true;
return MESH_OK;
}
EMeshProcessingResult LLMeshRepoThread::lodReceived(const LLVolumeParams& mesh_params, S32 lod, U8* data, S32 data_size)
@ -1916,18 +1925,25 @@ bool LLMeshRepoThread::skinInfoReceived(const LLUUID& mesh_id, U8* data, S32 dat
if (data_size > 0)
{
std::string res_str((char*) data, data_size);
try
{
std::string res_str((char*)data, data_size);
std::istringstream stream(res_str);
std::istringstream stream(res_str);
U32 uzip_result = LLUZipHelper::unzip_llsd(skin, stream, data_size);
if (uzip_result != LLUZipHelper::ZR_OK)
{
LL_WARNS(LOG_MESH) << "Mesh skin info parse error. Not a valid mesh asset! ID: " << mesh_id
<< " uzip result" << uzip_result
<< LL_ENDL;
return false;
}
U32 uzip_result = LLUZipHelper::unzip_llsd(skin, stream, data_size);
if (uzip_result != LLUZipHelper::ZR_OK)
{
LL_WARNS(LOG_MESH) << "Mesh skin info parse error. Not a valid mesh asset! ID: " << mesh_id
<< " uzip result" << uzip_result
<< LL_ENDL;
return false;
}
}
catch (std::bad_alloc&)
{
LL_WARNS(LOG_MESH) << "Out of memory for mesh ID " << mesh_id << " of size: " << data_size << LL_ENDL;
return false;
}
}
{
@ -1949,19 +1965,26 @@ bool LLMeshRepoThread::decompositionReceived(const LLUUID& mesh_id, U8* data, S3
LLSD decomp;
if (data_size > 0)
{
std::string res_str((char*) data, data_size);
{
try
{
std::string res_str((char*)data, data_size);
std::istringstream stream(res_str);
std::istringstream stream(res_str);
U32 uzip_result = LLUZipHelper::unzip_llsd(decomp, stream, data_size);
if (uzip_result != LLUZipHelper::ZR_OK)
{
LL_WARNS(LOG_MESH) << "Mesh decomposition parse error. Not a valid mesh asset! ID: " << mesh_id
<< " uzip result: " << uzip_result
<< LL_ENDL;
return false;
}
U32 uzip_result = LLUZipHelper::unzip_llsd(decomp, stream, data_size);
if (uzip_result != LLUZipHelper::ZR_OK)
{
LL_WARNS(LOG_MESH) << "Mesh decomposition parse error. Not a valid mesh asset! ID: " << mesh_id
<< " uzip result: " << uzip_result
<< LL_ENDL;
return false;
}
}
catch (std::bad_alloc&)
{
LL_WARNS(LOG_MESH) << "Out of memory for mesh ID " << mesh_id << " of size: " << data_size << LL_ENDL;
return false;
}
}
{
@ -1976,7 +1999,7 @@ bool LLMeshRepoThread::decompositionReceived(const LLUUID& mesh_id, U8* data, S3
return true;
}
bool LLMeshRepoThread::physicsShapeReceived(const LLUUID& mesh_id, U8* data, S32 data_size)
EMeshProcessingResult LLMeshRepoThread::physicsShapeReceived(const LLUUID& mesh_id, U8* data, S32 data_size)
{
LLSD physics_shape;
@ -1993,8 +2016,19 @@ bool LLMeshRepoThread::physicsShapeReceived(const LLUUID& mesh_id, U8* data, S32
volume_params.setType(LL_PCODE_PROFILE_SQUARE, LL_PCODE_PATH_LINE);
volume_params.setSculptID(mesh_id, LL_SCULPT_TYPE_MESH);
LLPointer<LLVolume> volume = new LLVolume(volume_params,0);
std::string mesh_string((char*) data, data_size);
std::istringstream stream(mesh_string);
std::istringstream stream;
try
{
std::string mesh_string((char*)data, data_size);
stream.str(mesh_string);
}
catch (std::bad_alloc&)
{
// out of memory, we won't be able to process this mesh
delete d;
return MESH_OUT_OF_MEMORY;
}
if (volume->unpackVolumeFaces(stream, data_size))
{
@ -2033,7 +2067,7 @@ bool LLMeshRepoThread::physicsShapeReceived(const LLUUID& mesh_id, U8* data, S32
LLMutexLock lock(mMutex);
mDecompositionQ.push_back(d);
}
return true;
return MESH_OK;
}
LLMeshUploadThread::LLMeshUploadThread(LLMeshUploadThread::instance_list& data, LLVector3& scale, bool upload_textures,
@ -3142,15 +3176,21 @@ void LLMeshHeaderHandler::processData(LLCore::BufferArray * /* body */, S32 /* b
U8 * data, S32 data_size)
{
LLUUID mesh_id = mMeshParams.getSculptID();
bool success = (! MESH_HEADER_PROCESS_FAILED)
&& ((data != NULL) == (data_size > 0)) // if we have data but no size or have size but no data, something is wrong
&& gMeshRepo.mThread->headerReceived(mMeshParams, data, data_size);
bool success = (!MESH_HEADER_PROCESS_FAILED)
&& ((data != NULL) == (data_size > 0)); // if we have data but no size or have size but no data, something is wrong;
llassert(success);
EMeshProcessingResult res = MESH_UNKNOWN;
if (success)
{
res = gMeshRepo.mThread->headerReceived(mMeshParams, data, data_size);
success = (res == MESH_OK);
}
if (! success)
{
// *TODO: Get real reason for parse failure here. Might we want to retry?
LL_WARNS(LOG_MESH) << "Unable to parse mesh header. ID: " << mesh_id
<< ", Unknown reason. Not retrying."
<< ", Size: " << data_size
<< ", Reason: " << res << " Not retrying."
<< LL_ENDL;
// Can't get the header so none of the LODs will be available
@ -3430,7 +3470,7 @@ void LLMeshPhysicsShapeHandler::processData(LLCore::BufferArray * /* body */, S3
{
if ((!MESH_PHYS_SHAPE_PROCESS_FAILED)
&& ((data != NULL) == (data_size > 0)) // if we have data but no size or have size but no data, something is wrong
&& gMeshRepo.mThread->physicsShapeReceived(mMeshID, data, data_size))
&& gMeshRepo.mThread->physicsShapeReceived(mMeshID, data, data_size) == MESH_OK)
{
// good fetch from sim, write to VFS for caching
LLVFile file(gVFS, mMeshID, LLAssetType::AT_MESH, LLVFile::WRITE);

View File

@ -57,6 +57,8 @@ typedef enum e_mesh_processing_result_enum
MESH_NO_DATA = 1,
MESH_OUT_OF_MEMORY,
MESH_HTTP_REQUEST_FAILED,
MESH_PARSE_FAILURE,
MESH_INVALID,
MESH_UNKNOWN
} EMeshProcessingResult;
@ -336,11 +338,11 @@ public:
bool fetchMeshHeader(const LLVolumeParams& mesh_params, bool can_retry = true);
bool fetchMeshLOD(const LLVolumeParams& mesh_params, S32 lod, bool can_retry = true);
bool headerReceived(const LLVolumeParams& mesh_params, U8* data, S32 data_size);
EMeshProcessingResult headerReceived(const LLVolumeParams& mesh_params, U8* data, S32 data_size);
EMeshProcessingResult lodReceived(const LLVolumeParams& mesh_params, S32 lod, U8* data, S32 data_size);
bool skinInfoReceived(const LLUUID& mesh_id, U8* data, S32 data_size);
bool decompositionReceived(const LLUUID& mesh_id, U8* data, S32 data_size);
bool physicsShapeReceived(const LLUUID& mesh_id, U8* data, S32 data_size);
EMeshProcessingResult physicsShapeReceived(const LLUUID& mesh_id, U8* data, S32 data_size);
LLSD& getMeshHeader(const LLUUID& mesh_id);
void notifyLoadedMeshes();

View File

@ -1047,6 +1047,7 @@ void LLOutfitGallery::updateSnapshotFolderObserver()
void LLOutfitGallery::refreshOutfit(const LLUUID& category_id)
{
LLViewerInventoryCategory* category = gInventory.getCategory(category_id);
if (category)
{
bool photo_loaded = false;
LLInventoryModel::cat_array_t sub_cat_array;

View File

@ -93,9 +93,20 @@ void LLPanelExperiences::setExperienceList( const LLSD& experiences )
item->init(public_key);
mExperiencesList->addItem(item, public_key);
const LLSD& experience_details = LLExperienceCache::instance().get(public_key);
if (experience_details.isUndefined())
{
LLExperienceCache::instance().get(public_key, boost::bind(&LLPanelExperiences::sortExperiencesList, this));
}
}
mExperiencesList->sort();
sortExperiencesList();
}
void LLPanelExperiences::sortExperiencesList()
{
mExperiencesList->sort();
}
void LLPanelExperiences::getExperienceIdsList(std::vector<LLUUID>& result)

View File

@ -59,6 +59,8 @@ public:
void setExperienceList(const LLSD& experiences);
void getExperienceIdsList(std::vector<LLUUID>& result);
void sortExperiencesList();
LLExperienceItem* getSelectedExperienceItem();
void removeExperiences( const LLSD& ids );
void removeExperience( const LLUUID& id);

View File

@ -1109,6 +1109,7 @@ void LLPanelFace::updateUI(bool force_set_values /*false*/)
bool enabled = (editable && isIdenticalPlanarTexgen());
childSetValue("checkbox planar align", align_planar && enabled);
childSetVisible("checkbox planar align", enabled);
childSetEnabled("checkbox planar align", enabled);
childSetEnabled("button align textures", enabled && LLSelectMgr::getInstance()->getSelection()->getObjectCount() > 1);

View File

@ -36,12 +36,15 @@
#include "llpanellandmarks.h"
#include "llplacesinventorybridge.h"
#include "llviewerfoldertype.h"
#include "llsdserialize.h"
#define DEBUGGING_FRESHNESS 0
const LLColor4U DEFAULT_WHITE(255, 255, 255);
const std::string NEW_INBOX_FILENAME("inbox_new_items.xml");
//
// statics
//
@ -57,7 +60,9 @@ static LLDefaultChildRegistry::Register<LLInboxFolderViewItem> r3("inbox_folder_
LLInboxInventoryPanel::LLInboxInventoryPanel(const LLInboxInventoryPanel::Params& p)
: LLInventoryPanel(p)
{}
{
LLInboxNewItemsStorage::getInstance()->load();
}
LLInboxInventoryPanel::~LLInboxInventoryPanel()
{}
@ -127,7 +132,7 @@ void LLInboxFolderViewFolder::addItem(LLFolderViewItem* item)
}
// Compute freshness if our parent is the root folder for the inbox
if (mParentFolder == mRoot)
if ((mParentFolder == mRoot) && !mFresh)
{
computeFreshness();
}
@ -145,6 +150,12 @@ void LLInboxFolderViewFolder::draw()
setBadgeVisibility(mFresh);
LLFolderViewFolder::draw();
if (mFresh)
{
reshapeBadge(getRect());
}
}
BOOL LLInboxFolderViewFolder::handleMouseDown( S32 x, S32 y, MASK mask )
@ -167,11 +178,12 @@ void LLInboxFolderViewFolder::selectItem()
void LLInboxFolderViewFolder::computeFreshness()
{
LLFolderViewModelItemInventory* view_model = static_cast<LLFolderViewModelItemInventory*>(getViewModelItem());
const U32 last_expansion_utc = gSavedPerAccountSettings.getU32("LastInventoryInboxActivity");
if (last_expansion_utc > 0)
{
mFresh = (static_cast<LLFolderViewModelItemInventory*>(getViewModelItem())->getCreationDate() > last_expansion_utc);
mFresh = (view_model->getCreationDate() > last_expansion_utc) || LLInboxNewItemsStorage::getInstance()->isItemFresh(view_model->getUUID());
#if DEBUGGING_FRESHNESS
if (mFresh)
@ -184,6 +196,11 @@ void LLInboxFolderViewFolder::computeFreshness()
{
mFresh = true;
}
if (mFresh)
{
LLInboxNewItemsStorage::getInstance()->addFreshItem(view_model->getUUID());
}
}
void LLInboxFolderViewFolder::deFreshify()
@ -191,6 +208,7 @@ void LLInboxFolderViewFolder::deFreshify()
mFresh = false;
gSavedPerAccountSettings.setU32("LastInventoryInboxActivity", time_corrected());
LLInboxNewItemsStorage::getInstance()->removeItem(static_cast<LLFolderViewModelItemInventory*>(getViewModelItem())->getUUID());
}
//
@ -271,5 +289,55 @@ void LLInboxFolderViewItem::deFreshify()
gSavedPerAccountSettings.setU32("LastInventoryInboxActivity", time_corrected());
}
LLInboxNewItemsStorage::LLInboxNewItemsStorage()
{
}
// static
void LLInboxNewItemsStorage::destroyClass()
{
LLInboxNewItemsStorage::getInstance()->saveNewItemsIds();
}
void LLInboxNewItemsStorage::saveNewItemsIds()
{
std::string filename = gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, NEW_INBOX_FILENAME);
if (!filename.empty())
{
LLSD uuids_data;
for (std::set<LLUUID>::const_iterator it = mNewItemsIDs.begin(); it != mNewItemsIDs.end(); it++)
{
uuids_data.append((*it));
}
llofstream file;
file.open(filename.c_str());
if ( file.is_open() )
{
LLSDSerialize::toPrettyXML(uuids_data, file);
file.close();
}
}
}
void LLInboxNewItemsStorage::load()
{
std::string filename = gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, NEW_INBOX_FILENAME);
if (!filename.empty())
{
llifstream in_file;
in_file.open(filename.c_str());
LLSD uuids_data;
if (in_file.is_open())
{
LLSDSerialize::fromXML(uuids_data, in_file);
in_file.close();
for (LLSD::array_iterator i = uuids_data.beginArray(); i != uuids_data.endArray(); ++i)
{
mNewItemsIDs.insert((*i).asUUID());
}
}
}
}
// eof

View File

@ -113,4 +113,23 @@ protected:
bool mFresh;
};
class LLInboxNewItemsStorage : public LLSingleton<LLInboxNewItemsStorage>
, public LLDestroyClass<LLInboxNewItemsStorage>
{
LLSINGLETON(LLInboxNewItemsStorage);
LOG_CLASS(LLInboxNewItemsStorage);
public:
static void destroyClass();
void saveNewItemsIds();
void load();
void addFreshItem(const LLUUID& id) { mNewItemsIDs.insert(id); }
void removeItem(const LLUUID& id) { mNewItemsIDs.erase(id); }
bool isItemFresh(const LLUUID& id) { return (mNewItemsIDs.find(id) != mNewItemsIDs.end()); }
private:
std::set<LLUUID> mNewItemsIDs;
};
#endif //LL_INBOXINVENTORYPANEL_H

View File

@ -55,6 +55,7 @@ LLPanelOutfitsInventory::LLPanelOutfitsInventory() :
mMyOutfitsPanel(NULL),
mCurrentOutfitPanel(NULL),
mActivePanel(NULL),
mAppearanceTabs(NULL),
mInitialized(false)
{
gAgentWearables.addLoadedCallback(boost::bind(&LLPanelOutfitsInventory::onWearablesLoaded, this));
@ -312,6 +313,7 @@ void LLPanelOutfitsInventory::initTabPanels()
void LLPanelOutfitsInventory::onTabChange()
{
if (!mAppearanceTabs) return;
mActivePanel = dynamic_cast<LLPanelAppearanceTab*>(mAppearanceTabs->getCurrentPanel());
if (!mActivePanel) return;

View File

@ -73,6 +73,7 @@ bool get_hud_matrices(glh::matrix4f &proj, glh::matrix4f &model);
const LLPanelPrimMediaControls::EZoomLevel LLPanelPrimMediaControls::kZoomLevels[] = { ZOOM_NONE, ZOOM_MEDIUM };
const int LLPanelPrimMediaControls::kNumZoomLevels = 2;
const F32 EXCEEDING_ZOOM_DISTANCE = 0.5f;
//
// LLPanelPrimMediaControls
//
@ -93,6 +94,7 @@ LLPanelPrimMediaControls::LLPanelPrimMediaControls() :
mZoomObjectID(LLUUID::null),
mZoomObjectFace(0),
mVolumeSliderVisible(0),
mZoomedCameraPos(),
mWindowShade(NULL),
mHideImmediately(false),
mSecureURL(false),
@ -256,7 +258,7 @@ void LLPanelPrimMediaControls::focusOnTarget()
LLViewerMediaImpl* media_impl = getTargetMediaImpl();
if(media_impl)
{
if(!media_impl->hasFocus())
if (!media_impl->hasFocus())
{
// The current target doesn't have media focus -- focus on it.
LLViewerObject* objectp = getTargetObject();
@ -307,7 +309,8 @@ void LLPanelPrimMediaControls::updateShape()
bool can_navigate = parcel->getMediaAllowNavigate();
bool enabled = false;
bool is_zoomed = (mCurrentZoom != ZOOM_NONE) && (mTargetObjectID == mZoomObjectID) && (mTargetObjectFace == mZoomObjectFace);
bool is_zoomed = (mCurrentZoom != ZOOM_NONE) && (mTargetObjectID == mZoomObjectID) && (mTargetObjectFace == mZoomObjectFace) && !isZoomDistExceeding();
// There is no such thing as "has_focus" being different from normal controls set
// anymore (as of user feedback from bri 10/09). So we cheat here and force 'has_focus'
// to 'true' (or, actually, we use a setting)
@ -1141,7 +1144,7 @@ void LLPanelPrimMediaControls::updateZoom()
if (zoom_padding > 0.0f)
{
// since we only zoom into medium for now, always set zoom_in constraint to true
LLViewerMediaFocus::setCameraZoom(getTargetObject(), mTargetObjectNormal, zoom_padding, true);
mZoomedCameraPos = LLViewerMediaFocus::setCameraZoom(getTargetObject(), mTargetObjectNormal, zoom_padding, true);
}
// Remember the object ID/face we zoomed into, so we can update the zoom icon appropriately
@ -1401,6 +1404,10 @@ bool LLPanelPrimMediaControls::shouldVolumeSliderBeVisible()
return mVolumeSliderVisible > 0;
}
bool LLPanelPrimMediaControls::isZoomDistExceeding()
{
return (gAgentCamera.getCameraPositionGlobal() - mZoomedCameraPos).normalize() >= EXCEEDING_ZOOM_DISTANCE;
}
void LLPanelPrimMediaControls::clearFaceOnFade()
{

View File

@ -119,6 +119,8 @@ private:
void showVolumeSlider();
void hideVolumeSlider();
bool shouldVolumeSliderBeVisible();
bool isZoomDistExceeding();
static void onScrollUp(void* user_data);
static void onScrollUpHeld(void* user_data);
@ -183,6 +185,8 @@ private:
F32 mZoomMediumPadding;
F32 mZoomFarPadding;
S32 mTopWorldViewAvoidZone;
LLVector3d mZoomedCameraPos;
LLUICtrl *mMediaPanelScroll;
LLButton *mScrollUpCtrl;

View File

@ -43,9 +43,8 @@ static LLDefaultChildRegistry::Register<LLPlacesInventoryPanel> r("places_invent
static const LLPlacesInventoryBridgeBuilder PLACES_INVENTORY_BUILDER;
LLPlacesInventoryPanel::LLPlacesInventoryPanel(const Params& p) :
LLInventoryPanel(p),
LLAssetFilteredInventoryPanel(p),
mSavedFolderState(NULL)
{
mInvFVBridgeBuilder = &PLACES_INVENTORY_BUILDER;
mSavedFolderState = new LLSaveFolderState();

View File

@ -32,14 +32,16 @@
class LLLandmarksPanel;
class LLFolderView;
class LLPlacesInventoryPanel : public LLInventoryPanel
class LLPlacesInventoryPanel : public LLAssetFilteredInventoryPanel
{
public:
struct Params
: public LLInitParam::Block<Params, LLInventoryPanel::Params>
: public LLInitParam::Block<Params, LLAssetFilteredInventoryPanel::Params>
{
Params()
{}
{
filter_asset_type = "landmark";
}
};
LLPlacesInventoryPanel(const Params& p);

View File

@ -33,6 +33,7 @@
#include <map>
static const std::string PRESETS_DEFAULT = "Default";
static const std::string PRESETS_DEFAULT_UPPER = "DEFAULT";
static const std::string PRESETS_DIR = "presets";
static const std::string PRESETS_GRAPHIC = "graphic";
static const std::string PRESETS_CAMERA = "camera";

View File

@ -404,28 +404,30 @@ void LLProgressView::initLogos()
// with no internal paddings so it gets additional padding
icon_width = 77;
icon_height = 21;
S32 pad_y = 4;
S32 pad_fmod_y = 4;
texture_start_x++;
loadLogo(temp_str + "fmod_logo.png",
image_codec,
LLRect(texture_start_x, texture_start_y + pad_y + icon_height, texture_start_x + icon_width, texture_start_y + pad_y),
LLRect(texture_start_x, texture_start_y + pad_fmod_y + icon_height, texture_start_x + icon_width, texture_start_y + pad_fmod_y),
default_clip,
default_clip);
texture_start_x += icon_width + default_pad + 1;
#endif
#endif //LL_FMODSTUDIO
#ifdef LL_HAVOK
// original image size is 342x113, central element is on a larger side
// plus internal padding, so it gets slightly more height than desired 32
icon_width = 88;
icon_height = 29;
pad_y = -1;
S32 pad_havok_y = -1;
loadLogo(temp_str + "havok_logo.png",
image_codec,
LLRect(texture_start_x, texture_start_y + pad_y + icon_height, texture_start_x + icon_width, texture_start_y + pad_y),
LLRect(texture_start_x, texture_start_y + pad_havok_y + icon_height, texture_start_x + icon_width, texture_start_y + pad_havok_y),
default_clip,
default_clip);
texture_start_x += icon_width + default_pad;
#endif //LL_HAVOK
// 108x41
icon_width = 74;
@ -545,6 +547,7 @@ void LLProgressView::onCancelButtonClicked(void*)
// cancel is pressed while teleporting inside region (EXT-4911)
if (LLStartUp::getStartupState() < STATE_STARTED)
{
LL_INFOS() << "User requesting quit during login" << LL_ENDL;
LLAppViewer::instance()->requestQuit();
}
else

View File

@ -154,3 +154,10 @@ void LLCredential::authenticatorType(std::string &idType)
}
}
LLCertException::LLCertException(const LLSD& cert_data, const std::string& msg)
: LLException(msg),
mCertData(cert_data)
{
LL_WARNS("SECAPI") << "Certificate Error: " << msg << LL_ENDL;
}

View File

@ -75,6 +75,7 @@
#define CERT_EXTENDED_KEY_USAGE "extendedKeyUsage"
#define CERT_EKU_SERVER_AUTH SN_server_auth
#define CERT_EKU_TLS_SERVER_AUTH LN_server_auth
#define CERT_SUBJECT_KEY_IDENTFIER "subjectKeyIdentifier"
#define CERT_AUTHORITY_KEY_IDENTIFIER "authorityKeyIdentifier"
@ -334,17 +335,23 @@ std::ostream& operator <<(std::ostream& s, const LLCredential& cred);
class LLCertException: public LLException
{
public:
LLCertException(const LLSD& cert_data, const std::string& msg): LLException(msg),
mCertData(cert_data)
{
LL_WARNS("SECAPI") << "Certificate Error: " << msg << LL_ENDL;
}
LLCertException(const LLSD& cert_data, const std::string& msg);
virtual ~LLCertException() throw() {}
LLSD getCertData() const { return mCertData; }
protected:
LLSD mCertData;
};
class LLAllocationCertException : public LLCertException
{
public:
LLAllocationCertException(const LLSD& cert_data) : LLCertException(cert_data, "CertAllocationFailure")
{
}
virtual ~LLAllocationCertException() throw() {}
protected:
};
class LLInvalidCertificate : public LLCertException
{
public:

View File

@ -78,16 +78,16 @@ LLBasicCertificate::LLBasicCertificate(const std::string& pem_cert,
BIO * pem_bio = BIO_new_mem_buf((void*)pem_cert.c_str(), pem_cert.length());
if(pem_bio == NULL)
{
LL_WARNS("SECAPI") << "Could not allocate an openssl memory BIO." << LL_ENDL;
LLTHROW(LLInvalidCertificate(LLSD::emptyMap()));
LL_WARNS("SECAPI") << "Could not allocate an openssl memory BIO." << LL_ENDL;
LLTHROW(LLAllocationCertException(LLSD::emptyMap()));
}
mCert = NULL;
PEM_read_bio_X509(pem_bio, &mCert, 0, NULL);
BIO_free(pem_bio);
if (!mCert)
{
LL_WARNS("SECAPI") << "Could not decode certificate to x509." << LL_ENDL;
LLTHROW(LLInvalidCertificate(LLSD::emptyMap()));
LL_WARNS("SECAPI") << "Could not decode certificate to x509." << LL_ENDL;
LLTHROW(LLInvalidCertificate(LLSD::emptyMap()));
}
}
@ -924,9 +924,13 @@ void _validateCert(int validation_policy,
LLTHROW(LLCertKeyUsageValidationException(current_cert_info));
}
// only validate EKU if the cert has it
if(current_cert_info.has(CERT_EXTENDED_KEY_USAGE) && current_cert_info[CERT_EXTENDED_KEY_USAGE].isArray() &&
(!_LLSDArrayIncludesValue(current_cert_info[CERT_EXTENDED_KEY_USAGE],
LLSD((std::string)CERT_EKU_SERVER_AUTH))))
if(current_cert_info.has(CERT_EXTENDED_KEY_USAGE)
&& current_cert_info[CERT_EXTENDED_KEY_USAGE].isArray()
&& (!_LLSDArrayIncludesValue(current_cert_info[CERT_EXTENDED_KEY_USAGE],
LLSD((std::string)CERT_EKU_TLS_SERVER_AUTH)))
&& (!_LLSDArrayIncludesValue(current_cert_info[CERT_EXTENDED_KEY_USAGE],
LLSD((std::string)CERT_EKU_SERVER_AUTH)))
)
{
LLTHROW(LLCertKeyUsageValidationException(current_cert_info));
}

View File

@ -303,6 +303,27 @@ void LLSelectMgr::updateEffects()
}
}
void LLSelectMgr::resetObjectOverrides()
{
resetObjectOverrides(getSelection());
}
void LLSelectMgr::resetObjectOverrides(LLObjectSelectionHandle selected_handle)
{
struct f : public LLSelectedNodeFunctor
{
virtual bool apply(LLSelectNode* node)
{
node->mLastPositionLocal.setVec(0, 0, 0);
node->mLastRotation = LLQuaternion();
node->mLastScale.setVec(0, 0, 0);
return true;
}
} func;
selected_handle->applyToNodes(&func);
}
void LLSelectMgr::overrideObjectUpdates()
{
//override any position updates from simulator on objects being edited
@ -3910,11 +3931,11 @@ BOOL LLSelectMgr::selectGetAggregateTexturePermissions(LLAggregatePermissions& r
return TRUE;
}
BOOL LLSelectMgr::isSelfAvatarSelected()
BOOL LLSelectMgr::isMovableAvatarSelected()
{
if (mAllowSelectAvatar)
{
return (getSelection()->getObjectCount() == 1) && (getSelection()->getFirstRootObject() == gAgentAvatarp);
return (getSelection()->getObjectCount() == 1) && (getSelection()->getFirstRootObject()->isAvatar()) && getSelection()->getFirstMoveableNode(TRUE);
}
return FALSE;
}
@ -5130,18 +5151,27 @@ void LLSelectMgr::sendListToRegions(LLObjectSelectionHandle selected_handle,
bool link_operation = message_name == "ObjectLink";
//clear update override data (allow next update through)
struct f : public LLSelectedNodeFunctor
{
virtual bool apply(LLSelectNode* node)
{
node->mLastPositionLocal.setVec(0,0,0);
node->mLastRotation = LLQuaternion();
node->mLastScale.setVec(0,0,0);
return true;
}
} func;
selected_handle->applyToNodes(&func);
if (mAllowSelectAvatar)
{
if (selected_handle->getObjectCount() == 1
&& selected_handle->getFirstObject() != NULL
&& selected_handle->getFirstObject()->isAvatar())
{
// Server doesn't move avatars at the moment, it is a local debug feature,
// but server does update position regularly, so do not drop mLastPositionLocal
// Position override for avatar gets reset in LLAgentCamera::resetView().
}
else
{
// drop mLastPositionLocal (allow next update through)
resetObjectOverrides(selected_handle);
}
}
else
{
//clear update override data (allow next update through)
resetObjectOverrides(selected_handle);
}
std::queue<LLSelectNode*> nodes_to_send;
@ -6851,51 +6881,26 @@ void LLSelectMgr::pauseAssociatedAvatars()
mSelectedObjects->mSelectType = getSelectTypeForObject(object);
bool is_attached = false;
if (mSelectedObjects->mSelectType == SELECT_TYPE_ATTACHMENT &&
isAgentAvatarValid())
LLVOAvatar* parent_av = NULL;
if (mSelectedObjects->mSelectType == SELECT_TYPE_ATTACHMENT)
{
// Selection can be obsolete, confirm that this is an attachment
LLViewerObject* parent = (LLViewerObject*)object->getParent();
while (parent != NULL)
{
if (parent->isAvatar())
{
is_attached = true;
break;
}
else
{
parent = (LLViewerObject*)parent->getParent();
}
}
// and find parent avatar
parent_av = object->getAvatarAncestor();
}
if (is_attached)
// Can be both an attachment and animated object
if (parent_av)
{
if (object->isAnimatedObject())
{
// Is an animated object attachment.
// Pause both the control avatar and the avatar it's attached to.
if (object->getControlAvatar())
{
mPauseRequests.push_back(object->getControlAvatar()->requestPause());
}
mPauseRequests.push_back(gAgentAvatarp->requestPause());
}
else
{
// Is a regular attachment. Pause the avatar it's attached to.
mPauseRequests.push_back(gAgentAvatarp->requestPause());
}
// It's an attachment. Pause the avatar it's attached to.
mPauseRequests.push_back(parent_av->requestPause());
}
else if (object && object->isAnimatedObject() && object->getControlAvatar())
if (object->isAnimatedObject() && object->getControlAvatar())
{
// Is a non-attached animated object. Pause the control avatar.
// It's an animated object. Pause the control avatar.
mPauseRequests.push_back(object->getControlAvatar()->requestPause());
}
}
}

View File

@ -458,6 +458,13 @@ public:
void clearSelections();
void update();
void updateEffects(); // Update HUD effects
// When we edit object's position/rotation/scale we set local
// overrides and ignore any updates (override received valeus).
// When we send data to server, we send local values and reset
// overrides
void resetObjectOverrides();
void resetObjectOverrides(LLObjectSelectionHandle selected_handle);
void overrideObjectUpdates();
// Returns the previous value of mForceSelection
@ -725,7 +732,7 @@ public:
LLPermissions* findObjectPermissions(const LLViewerObject* object);
BOOL isSelfAvatarSelected();
BOOL isMovableAvatarSelected();
void selectDelete(); // Delete on simulator
void selectForceDelete(); // just delete, no into trash

View File

@ -3448,7 +3448,7 @@ public:
U8 index = facep->getTextureIndex();
if (facep->mDrawInfo)
{
if (index < 255)
if (index < FACE_DO_NOT_BATCH_TEXTURES)
{
if (facep->mDrawInfo->mTextureList.size() <= index)
{

View File

@ -917,9 +917,9 @@ bool idle_startup()
}
// Set PerAccountSettingsFile to the default value.
gSavedSettings.setString("PerAccountSettingsFile",
gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT,
LLAppViewer::instance()->getSettingsFilename("Default", "PerAccount")));
std::string settings_per_account = gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, LLAppViewer::instance()->getSettingsFilename("Default", "PerAccount"));
gSavedSettings.setString("PerAccountSettingsFile", settings_per_account);
gDebugInfo["PerAccountSettingsFilename"] = settings_per_account;
// Note: can't store warnings files per account because some come up before login
@ -1105,6 +1105,8 @@ bool idle_startup()
// Its either downloading or declined.
// If optional was skipped this case shouldn't
// be reached.
LL_INFOS("LLStartup") << "Forcing a quit due to update." << LL_ENDL;
LLLoginInstance::getInstance()->disconnect();
LLAppViewer::instance()->forceQuit();
}
@ -1125,7 +1127,24 @@ bool idle_startup()
{
// This was a certificate error, so grab the certificate
// and throw up the appropriate dialog.
LLPointer<LLCertificate> certificate = gSecAPIHandler->getCertificate(response["certificate"]);
LLPointer<LLCertificate> certificate;
try
{
certificate = gSecAPIHandler->getCertificate(response["certificate"]);
}
catch (LLCertException &cert_exception)
{
LL_WARNS("LLStartup", "SECAPI") << "Caught " << cert_exception.what() << " certificate expception on getCertificate("<< response["certificate"] << ")" << LL_ENDL;
LLSD args;
args["REASON"] = LLTrans::getString(cert_exception.what());
LLNotificationsUtil::add("GeneralCertificateErrorShort", args, response,
general_cert_done);
reset_login();
gSavedSettings.setBOOL("AutoLogin", FALSE);
show_connect_box = true;
}
if(certificate)
{
LLSD args = transform_cert_args(certificate);

View File

@ -140,17 +140,17 @@ void LLFloaterTexturePicker::setImageID(const LLUUID& image_id, bool set_selecti
if (LLAvatarAppearanceDefines::LLAvatarAppearanceDictionary::isBakedImageId(mImageAssetID))
{
if ( mBakeTextureEnabled && mModeSelector->getSelectedIndex() != 2)
if ( mBakeTextureEnabled && mModeSelector->getValue().asInteger() != 2)
{
mModeSelector->setSelectedIndex(2, 0);
mModeSelector->selectByValue(2);
onModeSelect(0,this);
}
}
else
{
if (mModeSelector->getSelectedIndex() == 2)
if (mModeSelector->getValue().asInteger() == 2)
{
mModeSelector->setSelectedIndex(0, 0);
mModeSelector->selectByValue(0);
onModeSelect(0,this);
}
@ -347,7 +347,7 @@ BOOL LLFloaterTexturePicker::postBuild()
}
mTentativeLabel = getChild<LLTextBox>("Multiple");
mResolutionLabel = getChild<LLTextBox>("unknown");
mResolutionLabel = getChild<LLTextBox>("size_lbl");
childSetAction("Default",LLFloaterTexturePicker::onBtnSetToDefault,this);
@ -363,9 +363,9 @@ BOOL LLFloaterTexturePicker::postBuild()
mInventoryPanel = getChild<LLInventoryPanel>("inventory panel");
mModeSelector = getChild<LLRadioGroup>("mode_selection");
mModeSelector = getChild<LLComboBox>("mode_selection");
mModeSelector->setCommitCallback(onModeSelect, this);
mModeSelector->setSelectedIndex(0, 0);
mModeSelector->selectByValue(0);
if(mInventoryPanel)
{
@ -756,7 +756,7 @@ void LLFloaterTexturePicker::onSelectionChange(const std::deque<LLFolderViewItem
void LLFloaterTexturePicker::onModeSelect(LLUICtrl* ctrl, void *userdata)
{
LLFloaterTexturePicker* self = (LLFloaterTexturePicker*) userdata;
int index = self->mModeSelector->getSelectedIndex();
int index = self->mModeSelector->getValue().asInteger();
self->getChild<LLButton>("Default")->setVisible(index == 0 ? TRUE : FALSE);
self->getChild<LLButton>("Blank")->setVisible(index == 0 ? TRUE : FALSE);
@ -1083,7 +1083,7 @@ void LLFloaterTexturePicker::onFilterEdit(const std::string& search_string )
void LLFloaterTexturePicker::setLocalTextureEnabled(BOOL enabled)
{
mModeSelector->setIndexEnabled(1,enabled);
mModeSelector->setEnabledByValue(1, enabled);
}
void LLFloaterTexturePicker::setBakeTextureEnabled(BOOL enabled)
@ -1091,18 +1091,18 @@ void LLFloaterTexturePicker::setBakeTextureEnabled(BOOL enabled)
BOOL changed = (enabled != mBakeTextureEnabled);
mBakeTextureEnabled = enabled;
mModeSelector->setIndexEnabled(2, enabled);
mModeSelector->setEnabledByValue(2, enabled);
if (!mBakeTextureEnabled && (mModeSelector->getSelectedIndex() == 2))
if (!mBakeTextureEnabled && (mModeSelector->getValue().asInteger() == 2))
{
mModeSelector->setSelectedIndex(0, 0);
mModeSelector->selectByValue(0);
}
if (changed && mBakeTextureEnabled && LLAvatarAppearanceDefines::LLAvatarAppearanceDictionary::isBakedImageId(mImageAssetID))
{
if (mModeSelector->getSelectedIndex() != 2)
if (mModeSelector->getValue().asInteger() != 2)
{
mModeSelector->setSelectedIndex(2, 0);
mModeSelector->selectByValue(2);
}
}
onModeSelect(0, this);

Some files were not shown because too many files have changed in this diff Show More