From d0c66e5efbef3f32657e1c943a6c09e8a418a9be Mon Sep 17 00:00:00 2001 From: Melanie Date: Mon, 19 May 2014 14:59:07 +0200 Subject: [PATCH 1/9] Actually hide the export box on SL. Must have been asleep when I coded that. --- indra/newview/llfloaterperms.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/indra/newview/llfloaterperms.cpp b/indra/newview/llfloaterperms.cpp index a85abb1a6..df815fd2f 100644 --- a/indra/newview/llfloaterperms.cpp +++ b/indra/newview/llfloaterperms.cpp @@ -82,7 +82,7 @@ BOOL LLFloaterPerms::postBuild() bool export_support = LFSimFeatureHandler::instance().simSupportsExport(); const U32 next_owner_perms = getNextOwnerPerms(); childSetEnabled("everyone_export", export_support && (next_owner_perms & PERM_ITEM_UNRESTRICTED) == PERM_ITEM_UNRESTRICTED); - if (!gHippoGridManager->getCurrentGrid()->isSecondLife()) + if (gHippoGridManager->getCurrentGrid()->isSecondLife()) childSetVisible("everyone_export", false); if (!(next_owner_perms & PERM_COPY)) From 43a9aedf7d9a29a570f020c84b8e7b8ada337e6b Mon Sep 17 00:00:00 2001 From: Inusaito Sayori Date: Thu, 4 Sep 2014 17:23:23 -0400 Subject: [PATCH 2/9] Sync with Upstream Alchemy Changes LLEnvManagerNew::setRegionChangeCallback to LLAgent::addRegionChangedCallback Cleans up some of the timeout policies that aren't necessary any longer. Modernizes parts of LLViewerKeyboard, updates llregistry.h Begins changeover from LLDynamicArray to std::vector Minor merge of newer, trivial SSA functions. Introduces LLAgent functions: addParcelChangedCallback and canJoinGroups Support for secondlife:///app/appearance SLapps. Cleans up older functions. --- indra/llcommon/llregistry.h | 8 +- indra/llmessage/aihttptimeoutpolicy.cpp | 13 - indra/llwindow/llkeyboard.h | 3 +- .../newview/app_settings/settings_ascent.xml | 11 + indra/newview/hbfloatergrouptitles.cpp | 4 +- indra/newview/lfsimfeaturehandler.cpp | 3 +- indra/newview/llagent.cpp | 333 ++++++++---------- indra/newview/llagent.h | 60 +++- indra/newview/llappearancemgr.cpp | 246 +++++++------ indra/newview/llappearancemgr.h | 12 +- indra/newview/llappviewer.cpp | 3 - indra/newview/llenvmanager.cpp | 78 ++-- indra/newview/llenvmanager.h | 46 +-- indra/newview/llestateinfomodel.cpp | 34 +- indra/newview/llestateinfomodel.h | 25 +- indra/newview/llfloaterdirectory.cpp | 3 +- indra/newview/llfloatergroups.cpp | 10 +- indra/newview/llfloaterland.cpp | 51 ++- indra/newview/llfloaterlandholdings.cpp | 28 +- indra/newview/llfloaterpathfindingobjects.cpp | 27 +- indra/newview/llfloaterregiondebugconsole.cpp | 6 - indra/newview/llfloaterregioninfo.cpp | 100 ++++-- indra/newview/llfloaterregioninfo.h | 6 + indra/newview/llfloaterregionrestarting.cpp | 53 +-- indra/newview/llfloaterregionrestarting.h | 3 +- indra/newview/llgroupactions.cpp | 3 +- .../llmenuoptionpathfindingrebakenavmesh.cpp | 76 ++-- indra/newview/llmutelist.cpp | 3 +- indra/newview/llpanelavatar.cpp | 4 +- indra/newview/llpathfindingmanager.cpp | 191 +++++----- indra/newview/llpathfindingnavmesh.cpp | 3 +- indra/newview/llpathfindingnavmesh.h | 2 +- indra/newview/llstatusbar.cpp | 3 +- indra/newview/llviewerkeyboard.cpp | 152 ++++---- indra/newview/llviewerkeyboard.h | 8 +- indra/newview/llviewermenu.cpp | 2 +- indra/newview/llviewermessage.cpp | 3 +- indra/newview/llviewerregion.cpp | 4 + indra/newview/llvoavatar.cpp | 192 +++++----- indra/newview/llvoavatar.h | 11 +- indra/newview/llvoavatarself.cpp | 155 +++----- indra/newview/rlvhandler.cpp | 6 +- indra/newview/rlvui.cpp | 6 +- .../skins/default/xui/en-us/strings.xml | 4 + indra/newview/viewer_manifest.py | 12 +- 45 files changed, 1035 insertions(+), 971 deletions(-) diff --git a/indra/llcommon/llregistry.h b/indra/llcommon/llregistry.h index ca6d76a98..bb0d60247 100644 --- a/indra/llcommon/llregistry.h +++ b/indra/llcommon/llregistry.h @@ -307,8 +307,10 @@ public: virtual ~StaticRegistrar() {} StaticRegistrar(ref_const_key_t key, ref_const_value_t value) { - if(!singleton_t::instance().mStaticScope) - mStaticScope = new ScopedRegistrar(); + if (singleton_t::instance().exists(key)) + { + llerrs << "Duplicate registry entry under key \"" << key << "\"" << llendl; + } singleton_t::instance().mStaticScope->add(key, value); } }; @@ -338,7 +340,7 @@ protected: virtual void initSingleton() { - //mStaticScope = new ScopedRegistrar(); + mStaticScope = new ScopedRegistrar(); } virtual ~LLRegistrySingleton() diff --git a/indra/llmessage/aihttptimeoutpolicy.cpp b/indra/llmessage/aihttptimeoutpolicy.cpp index a37a9f916..4434ef545 100644 --- a/indra/llmessage/aihttptimeoutpolicy.cpp +++ b/indra/llmessage/aihttptimeoutpolicy.cpp @@ -905,12 +905,8 @@ AIHTTPTimeoutPolicy const* AIHTTPTimeoutPolicy::getTimeoutPolicyByName(std::stri #define P2(n, b) AIHTTPTimeoutPolicy n##_timeout(#n, b) // Policy name Policy -//P(accountingCostResponder); -P(agentStateResponder); -P(appearanceChangeMetricsResponder); P(assetUploadResponder); P(assetReportHandler); -P(asyncConsoleResponder); P(avatarPickerResponder); P(authHandler); P(avatarNameResponder); @@ -918,15 +914,11 @@ P2(baseCapabilitiesComplete, transfer_18s_connect_5s); P(blockingLLSDPost); P(blockingLLSDGet); P(blockingRawGet); -P(charactersResponder); -P(checkAgentAppearanceServiceResponder); P(classifiedStatsResponder); -P(consoleResponder); P(createInventoryCategoryResponder); P(emeraldDicDownloader); P(environmentApplyResponder); P(environmentRequestResponder); -P(estateChangeInfoResponder); P2(eventPollResponder, reply_60s); P(fetchInventoryResponder); P(fetchScriptLimitsAttachmentInfoResponder); @@ -960,12 +952,8 @@ P2(meshPhysicsShapeResponder, connect_30s); P2(meshSkinInfoResponder, connect_30s); P(mimeDiscoveryResponder); P(moderationResponder); -P(navMeshRebakeResponder); -P(navMeshResponder); -P(navMeshStatusResponder); P(newAgentInventoryVariablePriceResponder); P(objectCostResponder); -P(objectLinksetsResponder); P(physicsFlagsResponder); P(productInfoRequestResponder); P(regionResponder); @@ -977,7 +965,6 @@ P(setDisplayNameResponder); P2(simulatorFeaturesReceived, transfer_22s_connect_10s); P(startConferenceChatResponder); P2(startGroupVoteResponder, transfer_300s); -P(terrainLinksetsResponder); P(translationReceiver); P(uploadModelPremissionsResponder); P(userReportResponder); diff --git a/indra/llwindow/llkeyboard.h b/indra/llwindow/llkeyboard.h index 80ac3acfc..c2def259b 100644 --- a/indra/llwindow/llkeyboard.h +++ b/indra/llwindow/llkeyboard.h @@ -28,6 +28,7 @@ #define LL_LLKEYBOARD_H #include +#include #include "string_table.h" #include "lltimer.h" @@ -40,7 +41,7 @@ enum EKeystate KEYSTATE_UP }; -typedef void (*LLKeyFunc)(EKeystate keystate); +typedef boost::function LLKeyFunc; enum EKeyboardInsertMode { diff --git a/indra/newview/app_settings/settings_ascent.xml b/indra/newview/app_settings/settings_ascent.xml index 8be48da2d..f37e477d6 100644 --- a/indra/newview/app_settings/settings_ascent.xml +++ b/indra/newview/app_settings/settings_ascent.xml @@ -124,6 +124,17 @@ Value 0 + AlchemyRainbowEffects + + Comment + Makes agent effects rainbows! + Persist + 1 + Type + Boolean + Value + 0 + AlchemyRegionRestartShake Comment diff --git a/indra/newview/hbfloatergrouptitles.cpp b/indra/newview/hbfloatergrouptitles.cpp index c96189de1..5efb69118 100644 --- a/indra/newview/hbfloatergrouptitles.cpp +++ b/indra/newview/hbfloatergrouptitles.cpp @@ -162,7 +162,7 @@ void HBFloaterGroupTitles::onActivate(void* userdata) void update_titles_list(HBFloaterGroupTitles* self) { S32 i; - S32 count = gAgent.mGroups.count(); + S32 count = gAgent.mGroups.size(); LLUUID id; LLUUID highlight_id = LLUUID::null; LLUUID current_group_id = gAgent.getGroupID(); @@ -178,7 +178,7 @@ void update_titles_list(HBFloaterGroupTitles* self) for (i = 0; i < count; ++i) { - group_datap = &gAgent.mGroups.get(i); + group_datap = &gAgent.mGroups[i]; id = group_datap->mID; if (self->mFirstUse) { diff --git a/indra/newview/lfsimfeaturehandler.cpp b/indra/newview/lfsimfeaturehandler.cpp index 2e6b55b37..e06fe5891 100644 --- a/indra/newview/lfsimfeaturehandler.cpp +++ b/indra/newview/lfsimfeaturehandler.cpp @@ -20,7 +20,6 @@ #include "lfsimfeaturehandler.h" #include "llagent.h" -#include "llenvmanager.h" #include "llviewerregion.h" #include "hippogridmanager.h" @@ -33,7 +32,7 @@ LFSimFeatureHandler::LFSimFeatureHandler() , mWhisperRange(10) { if (!gHippoGridManager->getCurrentGrid()->isSecondLife()) // Remove this line if we ever handle SecondLife sim features - LLEnvManagerNew::instance().setRegionChangeCallback(boost::bind(&LFSimFeatureHandler::handleRegionChange, this)); + gAgent.addRegionChangedCallback(boost::bind(&LFSimFeatureHandler::handleRegionChange, this)); } ExportPolicy LFSimFeatureHandler::exportPolicy() const diff --git a/indra/newview/llagent.cpp b/indra/newview/llagent.cpp index cf5e3a3c8..013c45c14 100644 --- a/indra/newview/llagent.cpp +++ b/indra/newview/llagent.cpp @@ -103,6 +103,7 @@ #include "lluictrlfactory.h" //For LLUICtrlFactory::getLayeredXMLNode +#include "hippolimits.h" // for getMaxAgentGroups // [RLVa:KB] - Checked: 2011-11-04 (RLVa-1.4.4a) #include "rlvactions.h" #include "rlvhandler.h" @@ -246,6 +247,7 @@ protected: private: }; + //-------------------------------------------------------------------- // Statics // @@ -272,11 +274,10 @@ void LLAgentFriendObserver::changed(U32 mask) } } -// static -void LLAgent::parcelChangedCallback() + +void LLAgent::setCanEditParcel() // called via mParcelChangedSignal { bool can_edit = LLToolMgr::getInstance()->canEdit(); - gAgent.mCanEditParcel = can_edit; } @@ -435,6 +436,8 @@ LLAgent::LLAgent() : mControlsTakenCount[i] = 0; mControlsTakenPassedOnCount[i] = 0; } + + addParcelChangedCallback(&setCanEditParcel); } // Requires gSavedSettings to be initialized. @@ -444,10 +447,10 @@ LLAgent::LLAgent() : void LLAgent::init() { + // *Note: this is where LLViewerCamera::getInstance() used to be constructed. + setFlying( gSavedSettings.getBOOL("FlyingAtExit") ); - - // LLDebugVarMessageBox::show("Camera Lag", &CAMERA_FOCUS_HALF_LIFE, 0.5f, 0.01f); *mEffectColor = gSavedSettings.getColor4("EffectColor"); @@ -458,8 +461,6 @@ void LLAgent::init() mLastKnownRequestMaturity = mLastKnownResponseMaturity; mIsDoSendMaturityPreferenceToServer = true; - LLViewerParcelMgr::getInstance()->addAgentParcelChangedCallback(boost::bind(&LLAgent::parcelChangedCallback)); - if (!mTeleportFinishedSlot.connected()) { mTeleportFinishedSlot = LLViewerParcelMgr::getInstance()->setTeleportFinishedCallback(boost::bind(&LLAgent::handleTeleportFinished, this)); @@ -706,8 +707,7 @@ BOOL LLAgent::canFly() // static const LLCachedControl ascent_fly_always_enabled("AscentFlyAlwaysEnabled",false); - if(ascent_fly_always_enabled) - return TRUE; + if(ascent_fly_always_enabled) return TRUE; // LLViewerRegion* regionp = getRegion(); @@ -759,10 +759,7 @@ void LLAgent::setFlying(BOOL fly) if (fly) { // [RLVa:KB] - Checked: 2010-03-02 (RLVa-1.2.0d) | Modified: RLVa-1.0.0c - if (gRlvHandler.hasBehaviour(RLV_BHVR_FLY)) - { - return; - } + if (gRlvHandler.hasBehaviour(RLV_BHVR_FLY)) return; // [/RLVa:KB] BOOL was_flying = getFlying(); @@ -858,22 +855,30 @@ void LLAgent::handleServerBakeRegionTransition(const LLUUID& region_id) } } +void LLAgent::changeParcels() +{ + LL_DEBUGS("AgentLocation") << "Calling ParcelChanged callbacks" << LL_ENDL; + // Notify anything that wants to know about parcel changes + mParcelChangedSignal(); +} + +boost::signals2::connection LLAgent::addParcelChangedCallback(parcel_changed_callback_t cb) +{ + return mParcelChangedSignal.connect(cb); +} + //----------------------------------------------------------------------------- // setRegion() //----------------------------------------------------------------------------- void LLAgent::setRegion(LLViewerRegion *regionp) { - bool teleport = true; - llassert(regionp); if (mRegionp != regionp) { - // std::string host_name; - // host_name = regionp->getHost().getHostName(); std::string ip = regionp->getHost().getString(); - llinfos << "Moving agent into region: " << regionp->getName() - << " located at " << ip << llendl; + LL_INFOS("AgentLocation") << "Moving agent into region: " << regionp->getName() + << " located at " << ip << LL_ENDL; if (mRegionp) { // NaCl - Antispam Registry @@ -905,9 +910,6 @@ void LLAgent::setRegion(LLViewerRegion *regionp) { gSky.mVOGroundp->setRegion(regionp); } - - // Notify windlight managers - teleport = (gAgent.getTeleportState() != LLAgent::TELEPORT_NONE); } else { @@ -929,6 +931,7 @@ void LLAgent::setRegion(LLViewerRegion *regionp) // Pass new region along to metrics components that care about this level of detail. LLAppViewer::metricsUpdateRegion(regionp->getHandle()); } + mRegionp = regionp; // Must shift hole-covering water object locations because local @@ -943,33 +946,18 @@ void LLAgent::setRegion(LLViewerRegion *regionp) LLSelectMgr::getInstance()->updateSelectionCenter(); - if (teleport) - { - LLEnvManagerNew::instance().onTeleport(); - } - else - { - LLEnvManagerNew::instance().onRegionCrossing(); - } - - // If the newly entered region is using server bakes, and our - // current appearance is non-baked, request appearance update from - // server. - if (mRegionp->capabilitiesReceived()) - { - handleServerBakeRegionTransition(mRegionp->getRegionID()); - } - else - { - // Need to handle via callback after caps arrive. - mRegionp->setCapabilitiesReceivedCallback(boost::bind(&LLAgent::handleServerBakeRegionTransition,this,_1)); - } + LL_DEBUGS("AgentLocation") << "Calling RegionChanged callbacks" << LL_ENDL; + mRegionChangedSignal(); } //----------------------------------------------------------------------------- // getRegion() //----------------------------------------------------------------------------- +LLViewerRegion *LLAgent::getRegion() const +{ + return mRegionp; +} const LLHost& LLAgent::getRegionHost() const { @@ -983,6 +971,16 @@ const LLHost& LLAgent::getRegionHost() const } } +boost::signals2::connection LLAgent::addRegionChangedCallback(const region_changed_signal_t::slot_type& cb) +{ + return mRegionChangedSignal.connect(cb); +} + +void LLAgent::removeRegionChangedCallback(boost::signals2::connection callback) +{ + mRegionChangedSignal.disconnect(callback); +} + //----------------------------------------------------------------------------- // inPrelude() //----------------------------------------------------------------------------- @@ -1906,12 +1904,6 @@ std::ostream& operator<<(std::ostream &s, const LLAgent &agent) return s; } - -// ------------------- Beginning of legacy LLCamera hack ---------------------- -// This section is included for legacy LLCamera support until -// it is no longer needed. Some legacy code must exist in -// non-legacy functions, and is labeled with "// legacy" comments. - // TRUE if your own avatar needs to be rendered. Usually only // in third person and build. //----------------------------------------------------------------------------- @@ -1950,8 +1942,8 @@ void LLAgent::startTyping() if (mChatTimer.getElapsedTimeF32() < 2.f) { - LLVOAvatar* chatter = gObjectList.findAvatar(mLastChatterID); - if (chatter) + LLViewerObject* chatter = gObjectList.findObject(mLastChatterID); + if (chatter && chatter->isAvatar()) { gAgentCamera.setLookAt(LOOKAT_TARGET_RESPOND, chatter, LLVector3::zero); } @@ -1961,7 +1953,8 @@ void LLAgent::startTyping() { sendAnimationRequest(ANIM_AGENT_TYPE, ANIM_REQUEST_START); } - gChatBar->sendChatFromViewer("", CHAT_TYPE_START, FALSE); + gChatBar-> + sendChatFromViewer("", CHAT_TYPE_START, FALSE); } //----------------------------------------------------------------------------- @@ -1973,7 +1966,8 @@ void LLAgent::stopTyping() { clearRenderState(AGENT_STATE_TYPING); sendAnimationRequest(ANIM_AGENT_TYPE, ANIM_REQUEST_STOP); - gChatBar->sendChatFromViewer("", CHAT_TYPE_STOP, FALSE); + gChatBar-> + sendChatFromViewer("", CHAT_TYPE_STOP, FALSE); } } @@ -2068,6 +2062,7 @@ void LLAgent::endAnimationUpdateUI() mViewsPushed = FALSE; } + gAgentCamera.setLookAt(LOOKAT_TARGET_CLEAR); if( gMorphView ) { @@ -2223,13 +2218,6 @@ void LLAgent::endAnimationUpdateUI() LLToolMgr::getInstance()->setCurrentToolset(gFaceEditToolset); LLFloaterMap::getInstance()->pushVisible(FALSE); - /* - LLView *view; - for (view = gFloaterView->getFirstChild(); view; view = gFloaterView->getNextChild()) - { - view->pushVisible(FALSE); - } - */ if( gMorphView ) { @@ -2567,28 +2555,30 @@ int LLAgent::convertTextToMaturity(char text) return LLAgentAccess::convertTextToMaturity(text); } -extern AIHTTPTimeoutPolicy maturityPreferences_timeout; class LLMaturityPreferencesResponder : public LLHTTPClient::ResponderWithResult { + LOG_CLASS(LLMaturityPreferencesResponder); public: LLMaturityPreferencesResponder(LLAgent *pAgent, U8 pPreferredMaturity, U8 pPreviousMaturity); virtual ~LLMaturityPreferencesResponder(); - /*virtual*/ void httpSuccess(void); - /*virtual*/ void httpFailure(void); +protected: + virtual void httpSuccess(); + virtual void httpFailure(); - /*virtual*/ AIHTTPTimeoutPolicy const& getHTTPTimeoutPolicy(void) const { return maturityPreferences_timeout; } /*virtual*/ char const* getName(void) const { return "LLMaturityPreferencesResponder"; } +protected: private: - U8 parseMaturityFromServerResponse(const LLSD &pContent); + U8 parseMaturityFromServerResponse(const LLSD &pContent) const; LLAgent *mAgent; U8 mPreferredMaturity; U8 mPreviousMaturity; }; -LLMaturityPreferencesResponder::LLMaturityPreferencesResponder(LLAgent *pAgent, U8 pPreferredMaturity, U8 pPreviousMaturity) : +LLMaturityPreferencesResponder::LLMaturityPreferencesResponder(LLAgent *pAgent, U8 pPreferredMaturity, U8 pPreviousMaturity) + : mAgent(pAgent), mPreferredMaturity(pPreferredMaturity), mPreviousMaturity(pPreviousMaturity) @@ -2599,75 +2589,49 @@ LLMaturityPreferencesResponder::~LLMaturityPreferencesResponder() { } -void LLMaturityPreferencesResponder::httpSuccess(void) +void LLMaturityPreferencesResponder::httpSuccess() { - U8 actualMaturity = parseMaturityFromServerResponse(mContent); + U8 actualMaturity = parseMaturityFromServerResponse(getContent()); if (actualMaturity != mPreferredMaturity) { - llwarns << "while attempting to change maturity preference from '" << LLViewerRegion::accessToString(mPreviousMaturity) - << "' to '" << LLViewerRegion::accessToString(mPreferredMaturity) << "', the server responded with '" - << LLViewerRegion::accessToString(actualMaturity) << "' [value:" << static_cast(actualMaturity) << ", llsd:" - << mContent << "]" << llendl; + llwarns << "while attempting to change maturity preference from '" + << LLViewerRegion::accessToString(mPreviousMaturity) + << "' to '" << LLViewerRegion::accessToString(mPreferredMaturity) + << "', the server responded with '" + << LLViewerRegion::accessToString(actualMaturity) + << "' [value:" << static_cast(actualMaturity) + << "], " << dumpResponse() << llendl; } mAgent->handlePreferredMaturityResult(actualMaturity); } -void LLMaturityPreferencesResponder::httpFailure(void) +void LLMaturityPreferencesResponder::httpFailure() { - llwarns << "while attempting to change maturity preference from '" << LLViewerRegion::accessToString(mPreviousMaturity) - << "' to '" << LLViewerRegion::accessToString(mPreferredMaturity) << "', we got an error because '" - << mReason << "' [status:" << mStatus << "]" << llendl; + llwarns << "while attempting to change maturity preference from '" + << LLViewerRegion::accessToString(mPreviousMaturity) + << "' to '" << LLViewerRegion::accessToString(mPreferredMaturity) + << "', " << dumpResponse() << llendl; mAgent->handlePreferredMaturityError(); } -U8 LLMaturityPreferencesResponder::parseMaturityFromServerResponse(const LLSD &pContent) +U8 LLMaturityPreferencesResponder::parseMaturityFromServerResponse(const LLSD &pContent) const { - // stinson 05/24/2012 Pathfinding regions have re-defined the response behavior. In the old server code, - // if you attempted to change the preferred maturity to the same value, the response content would be an - // undefined LLSD block. In the new server code with pathfinding, the response content should always be - // defined. Thus, the check for isUndefined() can be replaced with an assert after pathfinding is merged - // into server trunk and fully deployed. U8 maturity = SIM_ACCESS_MIN; - if (pContent.isUndefined()) + + llassert(pContent.isDefined()); + llassert(pContent.isMap()); + llassert(pContent.has("access_prefs")); + llassert(pContent.get("access_prefs").isMap()); + llassert(pContent.get("access_prefs").has("max")); + llassert(pContent.get("access_prefs").get("max").isString()); + if (pContent.isDefined() && pContent.isMap() && pContent.has("access_prefs") + && pContent.get("access_prefs").isMap() && pContent.get("access_prefs").has("max") + && pContent.get("access_prefs").get("max").isString()) { - maturity = mPreferredMaturity; - } - else - { - llassert(!pContent.isUndefined()); - llassert(pContent.isMap()); - - if (!pContent.isUndefined() && pContent.isMap()) - { - // stinson 05/24/2012 Pathfinding regions have re-defined the response syntax. The if statement catches - // the new syntax, and the else statement catches the old syntax. After pathfinding is merged into - // server trunk and fully deployed, we can remove the else statement. - if (pContent.has("access_prefs")) - { - llassert(pContent.has("access_prefs")); - llassert(pContent.get("access_prefs").isMap()); - llassert(pContent.get("access_prefs").has("max")); - llassert(pContent.get("access_prefs").get("max").isString()); - if (pContent.get("access_prefs").isMap() && pContent.get("access_prefs").has("max") && - pContent.get("access_prefs").get("max").isString()) - { - LLSD::String actualPreference = pContent.get("access_prefs").get("max").asString(); - LLStringUtil::trim(actualPreference); - maturity = LLViewerRegion::shortStringToAccess(actualPreference); - } - } - else if (pContent.has("max")) - { - llassert(pContent.get("max").isString()); - if (pContent.get("max").isString()) - { - LLSD::String actualPreference = pContent.get("max").asString(); - LLStringUtil::trim(actualPreference); - maturity = LLViewerRegion::shortStringToAccess(actualPreference); - } - } - } + LLSD::String actualPreference = pContent.get("access_prefs").get("max").asString(); + LLStringUtil::trim(actualPreference); + maturity = LLViewerRegion::shortStringToAccess(actualPreference); } return maturity; @@ -2802,7 +2766,7 @@ void LLAgent::sendMaturityPreferenceToServer(U8 pPreferredMaturity) mLastKnownRequestMaturity = pPreferredMaturity; // Create a response handler - boost::intrusive_ptr responderPtr = new LLMaturityPreferencesResponder(this, pPreferredMaturity, mLastKnownResponseMaturity); + boost::intrusive_ptr responderPtr = boost::intrusive_ptr(new LLMaturityPreferencesResponder(this, pPreferredMaturity, mLastKnownResponseMaturity)); // If we don't have a region, report it as an error if (getRegion() == NULL) @@ -2817,7 +2781,8 @@ void LLAgent::sendMaturityPreferenceToServer(U8 pPreferredMaturity) // If the capability is not defined, report it as an error if (url.empty()) { - responderPtr->failureResult(0U, "capability 'UpdateAgentInformation' is not defined for region", LLSD()); + responderPtr->failureResult(0U, + "capability 'UpdateAgentInformation' is not defined for region", LLSD()); } else { @@ -2881,12 +2846,11 @@ void LLAgent::handleMaturity(const LLSD &pNewValue) sendMaturityPreferenceToServer(static_cast(pNewValue.asInteger())); } +//---------------------------------------------------------------------------- + void LLAgent::buildFullname(std::string& name) const { - if (isAgentAvatarValid()) - { - name = gAgentAvatarp->getFullname(); - } + if (isAgentAvatarValid()) name = gAgentAvatarp->getFullname(); } void LLAgent::buildFullnameAndTitle(std::string& name) const @@ -2912,10 +2876,10 @@ BOOL LLAgent::isInGroup(const LLUUID& group_id, BOOL ignore_god_mode /* FALSE */ if (!ignore_god_mode && isGodlike()) return true; - S32 count = mGroups.count(); - for(S32 i = 0; i < count; ++i) + U32 count = mGroups.size(); + for(U32 i = 0; i < count; ++i) { - if(mGroups.get(i).mID == group_id) + if(mGroups[i].mID == group_id) { return TRUE; } @@ -2932,12 +2896,12 @@ BOOL LLAgent::hasPowerInGroup(const LLUUID& group_id, U64 power) const // GP_NO_POWERS can also mean no power is enough to grant an ability. if (GP_NO_POWERS == power) return FALSE; - S32 count = mGroups.count(); - for(S32 i = 0; i < count; ++i) + U32 count = mGroups.size(); + for(U32 i = 0; i < count; ++i) { - if(mGroups.get(i).mID == group_id) + if(mGroups[i].mID == group_id) { - return (BOOL)((mGroups.get(i).mPowers & power) > 0); + return (BOOL)((mGroups[i].mPowers & power) > 0); } } return FALSE; @@ -2953,12 +2917,12 @@ U64 LLAgent::getPowerInGroup(const LLUUID& group_id) const if (isGodlike()) return GP_ALL_POWERS; - S32 count = mGroups.count(); - for(S32 i = 0; i < count; ++i) + U32 count = mGroups.size(); + for(U32 i = 0; i < count; ++i) { - if(mGroups.get(i).mID == group_id) + if(mGroups[i].mID == group_id) { - return (mGroups.get(i).mPowers); + return (mGroups[i].mPowers); } } @@ -2967,12 +2931,12 @@ U64 LLAgent::getPowerInGroup(const LLUUID& group_id) const BOOL LLAgent::getGroupData(const LLUUID& group_id, LLGroupData& data) const { - S32 count = mGroups.count(); + S32 count = mGroups.size(); for(S32 i = 0; i < count; ++i) { - if(mGroups.get(i).mID == group_id) + if(mGroups[i].mID == group_id) { - data = mGroups.get(i); + data = mGroups[i]; return TRUE; } } @@ -2981,12 +2945,12 @@ BOOL LLAgent::getGroupData(const LLUUID& group_id, LLGroupData& data) const S32 LLAgent::getGroupContribution(const LLUUID& group_id) const { - S32 count = mGroups.count(); + S32 count = mGroups.size(); for(S32 i = 0; i < count; ++i) { - if(mGroups.get(i).mID == group_id) + if(mGroups[i].mID == group_id) { - S32 contribution = mGroups.get(i).mContribution; + S32 contribution = mGroups[i].mContribution; return contribution; } } @@ -2995,12 +2959,12 @@ S32 LLAgent::getGroupContribution(const LLUUID& group_id) const BOOL LLAgent::setGroupContribution(const LLUUID& group_id, S32 contribution) { - S32 count = mGroups.count(); + S32 count = mGroups.size(); for(S32 i = 0; i < count; ++i) { - if(mGroups.get(i).mID == group_id) + if(mGroups[i].mID == group_id) { - mGroups.get(i).mContribution = contribution; + mGroups[i].mContribution = contribution; LLMessageSystem* msg = gMessageSystem; msg->newMessage("SetGroupContribution"); msg->nextBlock("AgentData"); @@ -3018,14 +2982,13 @@ BOOL LLAgent::setGroupContribution(const LLUUID& group_id, S32 contribution) BOOL LLAgent::setUserGroupFlags(const LLUUID& group_id, BOOL accept_notices, BOOL list_in_profile) { - S32 count = mGroups.count(); + S32 count = mGroups.size(); for(S32 i = 0; i < count; ++i) { - LLGroupData &group = mGroups.get(i); - if(group.mID == group_id) + if(mGroups[i].mID == group_id) { - group.mAcceptNotices = accept_notices; - group.mListInProfile = list_in_profile; + mGroups[i].mAcceptNotices = accept_notices; + mGroups[i].mListInProfile = list_in_profile; LLMessageSystem* msg = gMessageSystem; msg->newMessage("SetGroupAcceptNotices"); msg->nextBlock("AgentData"); @@ -3038,7 +3001,7 @@ BOOL LLAgent::setUserGroupFlags(const LLUUID& group_id, BOOL accept_notices, BOO msg->addBOOL("ListInProfile", list_in_profile); sendReliableMessage(); - update_group_floaters(group.mID); + update_group_floaters(mGroups[i].mID); return TRUE; } @@ -3046,6 +3009,10 @@ BOOL LLAgent::setUserGroupFlags(const LLUUID& group_id, BOOL accept_notices, BOO return FALSE; } +BOOL LLAgent::canJoinGroups() const +{ + return (S32)mGroups.size() < gHippoLimits->getMaxAgentGroups(); +} LLQuaternion LLAgent::getHeadRotation() { @@ -3173,7 +3140,7 @@ void LLAgent::sendRevokePermissions(const LLUUID & target, U32 permissions) msg->nextBlockFast(_PREHASH_Data); msg->addUUIDFast(_PREHASH_ObjectID, target); // Must be in the region - msg->addU32Fast(_PREHASH_ObjectPermissions, permissions); + msg->addS32Fast(_PREHASH_ObjectPermissions, (S32) permissions); sendReliableMessage(); } @@ -3312,9 +3279,19 @@ void LLAgent::getName(std::string& name) } } -const LLColor4 &LLAgent::getEffectColor() +const LLColor4 LLAgent::getEffectColor() { - return *mEffectColor; + LLColor4 effect_color = *mEffectColor; + + // Rainbow Particle Effects + static LLCachedControl AlchemyRainbowEffects(gSavedSettings, "AlchemyRainbowEffects"); + if(AlchemyRainbowEffects) + { + LLColor3 rainbow; + rainbow.setHSL(fmodf((F32)LLFrameTimer::getElapsedSeconds()/4.f, 1.f), 1.f, 0.5f); + effect_color.set(rainbow, 1.0f); + } + return effect_color; } void LLAgent::setEffectColor(const LLColor4 &color) @@ -3364,6 +3341,7 @@ BOOL LLAgent::downGrabbed() const void update_group_floaters(const LLUUID& group_id) { + LLGroupActions::refresh(group_id); // update avatar info @@ -3394,10 +3372,10 @@ void LLAgent::processAgentDropGroup(LLMessageSystem *msg, void **) // Remove the group if it already exists remove it and add the new data to pick up changes. LLGroupData gd; gd.mID = group_id; - S32 index = gAgent.mGroups.find(gd); - if (index != -1) + std::vector::iterator found_it = std::find(gAgent.mGroups.begin(), gAgent.mGroups.end(), gd); + if (found_it != gAgent.mGroups.end()) { - gAgent.mGroups.remove(index); + gAgent.mGroups.erase(found_it); if (gAgent.getGroupID() == group_id) { gAgent.mGroupID.setNull(); @@ -3434,8 +3412,7 @@ class LLAgentDropGroupViewerNode : public LLHTTPNode !input.has("body") ) { //what to do with badly formed message? - response->statusUnknownError(400); - response->result(LLSD("Invalid message parameters")); + response->extendedResult(HTTP_BAD_REQUEST, "", LLSD("Invalid message parameters")); } LLSD body = input["body"]; @@ -3473,10 +3450,10 @@ class LLAgentDropGroupViewerNode : public LLHTTPNode // and add the new data to pick up changes. LLGroupData gd; gd.mID = group_id; - S32 index = gAgent.mGroups.find(gd); - if (index != -1) + std::vector::iterator found_it = std::find(gAgent.mGroups.begin(), gAgent.mGroups.end(), gd); + if (found_it != gAgent.mGroups.end()) { - gAgent.mGroups.remove(index); + gAgent.mGroups.erase(found_it); if (gAgent.getGroupID() == group_id) { gAgent.mGroupID.setNull(); @@ -3507,8 +3484,7 @@ class LLAgentDropGroupViewerNode : public LLHTTPNode else { //what to do with badly formed message? - response->statusUnknownError(400); - response->result(LLSD("Invalid message parameters")); + response->extendedResult(HTTP_BAD_REQUEST, "", LLSD("Invalid message parameters")); } } }; @@ -3532,7 +3508,6 @@ void LLAgent::processAgentGroupDataUpdate(LLMessageSystem *msg, void **) S32 count = msg->getNumberOfBlocksFast(_PREHASH_GroupData); LLGroupData group; - S32 index = -1; bool need_floater_update = false; for(S32 i = 0; i < count; ++i) { @@ -3547,12 +3522,12 @@ void LLAgent::processAgentGroupDataUpdate(LLMessageSystem *msg, void **) { need_floater_update = true; // Remove the group if it already exists remove it and add the new data to pick up changes. - index = gAgent.mGroups.find(group); - if (index != -1) + std::vector::iterator found_it = std::find(gAgent.mGroups.begin(), gAgent.mGroups.end(), group); + if (found_it != gAgent.mGroups.end()) { - gAgent.mGroups.remove(index); + gAgent.mGroups.erase(found_it); } - gAgent.mGroups.put(group); + gAgent.mGroups.push_back(group); } if (need_floater_update) { @@ -3591,7 +3566,6 @@ class LLAgentGroupDataUpdateViewerNode : public LLHTTPNode { LLGroupData group; - S32 index = -1; bool need_floater_update = false; group.mID = (*iter_group)["GroupID"].asUUID(); @@ -3608,12 +3582,12 @@ class LLAgentGroupDataUpdateViewerNode : public LLHTTPNode { need_floater_update = true; // Remove the group if it already exists remove it and add the new data to pick up changes. - index = gAgent.mGroups.find(group); - if (index != -1) + std::vector::iterator found_it = std::find(gAgent.mGroups.begin(), gAgent.mGroups.end(), group); + if (found_it != gAgent.mGroups.end()) { - gAgent.mGroups.remove(index); + gAgent.mGroups.erase(found_it); } - gAgent.mGroups.put(group); + gAgent.mGroups.push_back(group); } if (need_floater_update) { @@ -3692,12 +3666,9 @@ void LLAgent::processScriptControlChange(LLMessageSystem *msg, void **) total_count++; } } - + // Any control taken? If so, might be first time. - if (total_count > 0) - { - LLFirstUse::useOverrideKeys(); - } + if (total_count > 0) LLFirstUse::useOverrideKeys(); } else { @@ -3813,7 +3784,7 @@ void LLAgent::processAgentCachedTextureResponse(LLMessageSystem *mesgsys, void * return; } - if (isAgentAvatarValid() && gAgentAvatarp->isEditingAppearance()) + if (gAgentAvatarp->isEditingAppearance()) { // ignore baked textures when in customize mode return; diff --git a/indra/newview/llagent.h b/indra/newview/llagent.h index a66b375f4..6294d2e0a 100644 --- a/indra/newview/llagent.h +++ b/indra/newview/llagent.h @@ -36,7 +36,6 @@ #include #include "indra_constants.h" - #include "llevent.h" // LLObservable base class #include "llagentconstants.h" #include "llagentdata.h" // gAgentID, gAgentSessionID @@ -72,9 +71,12 @@ class LLSLURL; class LLSimInfo; class LLTeleportRequest; -typedef std::vector llvo_vec_t; typedef boost::shared_ptr LLTeleportRequestPtr; +//-------------------------------------------------------------------- +// Types +//-------------------------------------------------------------------- + enum EAnimRequest { ANIM_REQUEST_START, @@ -213,7 +215,7 @@ public: //-------------------------------------------------------------------- public: const LLCoordFrame& getFrameAgent() const { return mFrameAgent; } - void initOriginGlobal(const LLVector3d &origin_global); // Only to be used in ONE place! - djs 08/07/02 + void initOriginGlobal(const LLVector3d &origin_global); // Only to be used in ONE place void resetAxes(); void resetAxes(const LLVector3 &look_at); // Makes reasonable left and up // The following three get*Axis functions return direction avatar is looking, not camera. @@ -238,15 +240,52 @@ private: U64 mHomeRegionHandle; LLVector3 mHomePosRegion; + //-------------------------------------------------------------------- + // Parcel + //-------------------------------------------------------------------- +public: + void changeParcels(); // called by LLViewerParcelMgr when we cross a parcel boundary + + // Register a boost callback to be called when the agent changes parcels + typedef boost::function parcel_changed_callback_t; + boost::signals2::connection addParcelChangedCallback(parcel_changed_callback_t); + +private: + typedef boost::signals2::signal parcel_changed_signal_t; + parcel_changed_signal_t mParcelChangedSignal; + //-------------------------------------------------------------------- // Region //-------------------------------------------------------------------- public: void setRegion(LLViewerRegion *regionp); - LLViewerRegion *getRegion() const { return mRegionp; } + LLViewerRegion *getRegion() const; const LLHost& getRegionHost() const; BOOL inPrelude(); + /** + * Register a boost callback to be called when the agent changes regions + * Note that if you need to access a capability for the region, you may need to wait + * for the capabilities to be received, since in some cases your region changed + * callback will be called before the capabilities have been received. Your callback + * may need to look something like: + * + * LLViewerRegion* region = gAgent.getRegion(); + * if (region->capabilitiesReceived()) + * { + * useCapability(region); + * } + * else // Need to handle via callback after caps arrive. + * { + * region->setCapabilitiesReceivedCallback(boost::bind(&useCapability,region,_1)); + * // you may or may not want to remove that callback + * } + */ + typedef boost::signals2::signal region_changed_signal_t; + + boost::signals2::connection addRegionChangedCallback(const region_changed_signal_t::slot_type& cb); + void removeRegionChangedCallback(boost::signals2::connection callback); + // struct SHLureRequest { @@ -260,9 +299,10 @@ public: void showLureDestination(const std::string fromname, U64& handle, U32 x, U32 y, U32 z); void onFoundLureDestination(LLSimInfo *siminfo = NULL); // - + private: LLViewerRegion *mRegionp; + region_changed_signal_t mRegionChangedSignal; //-------------------------------------------------------------------- // History @@ -274,6 +314,7 @@ public: const LLVector3d &getLastPositionGlobal() const { return mLastPositionGlobal; } void setLastPositionGlobal(const LLVector3d &pos) { mLastPositionGlobal = pos; } + private: std::set mRegionsVisited; // Stat - what distinct regions has the avatar been to? F64 mDistanceTraveled; // Stat - how far has the avatar moved? @@ -654,6 +695,7 @@ private: void handleTeleportFinished(); void handleTeleportFailed(); +public: void handleServerBakeRegionTransition(const LLUUID& region_id); //-------------------------------------------------------------------- @@ -682,9 +724,10 @@ private: public: bool canEditParcel() const { return mCanEditParcel; } private: + static void setCanEditParcel(); bool mCanEditParcel; - static void parcelChangedCallback(); + /******************************************************************************** ** ** @@ -807,7 +850,7 @@ private: // HUD //-------------------------------------------------------------------- public: - const LLColor4 &getEffectColor(); + const LLColor4 getEffectColor(); void setEffectColor(const LLColor4 &color); private: LLColor4 *mEffectColor; @@ -831,6 +874,7 @@ public: BOOL setGroupContribution(const LLUUID& group_id, S32 contribution); BOOL setUserGroupFlags(const LLUUID& group_id, BOOL accept_notices, BOOL list_in_profile); const std::string &getGroupName() const { return mGroupName; } + BOOL canJoinGroups() const; private: std::string mGroupName; LLUUID mGroupID; @@ -845,7 +889,7 @@ protected: // Only used for building titles. BOOL isGroupMember() const { return !mGroupID.isNull(); } public: - LLDynamicArray mGroups; + std::vector mGroups; //-------------------------------------------------------------------- // Group Title diff --git a/indra/newview/llappearancemgr.cpp b/indra/newview/llappearancemgr.cpp index 6294e62af..bffaafd3c 100644 --- a/indra/newview/llappearancemgr.cpp +++ b/indra/newview/llappearancemgr.cpp @@ -113,7 +113,7 @@ public: }; // support for secondlife:///app/appearance SLapps -/*class LLAppearanceHandler : public LLCommandHandler +class LLAppearanceHandler : public LLCommandHandler { public: // requests will be throttled from a non-trusted browser @@ -121,6 +121,7 @@ public: bool handle(const LLSD& params, const LLSD& query_map, LLMediaCtrl* web) { + /* Singu Note: Nopenopenope. // support secondlife:///app/appearance/show, but for now we just // make all secondlife:///app/appearance SLapps behave this way if (!LLUI::sSettingGroups["config"]->getBOOL("EnableAppearance")) @@ -128,13 +129,14 @@ public: LLNotificationsUtil::add("NoAppearance", LLSD(), LLSD(), std::string("SwitchToStandardSkinAndQuit")); return true; } + */ - LLFloaterSidePanelContainer::showPanel("appearance", LLSD()); + LLFloaterCustomize::getInstance()->open(); return true; } }; -LLAppearanceHandler gAppearanceHandler;*/ +LLAppearanceHandler gAppearanceHandler; LLUUID findDescendentCategoryIDByName(const LLUUID& parent_id, const std::string& name) @@ -147,11 +149,11 @@ LLUUID findDescendentCategoryIDByName(const LLUUID& parent_id, const std::string item_array, LLInventoryModel::EXCLUDE_TRASH, has_name); - if (0 == cat_array.count()) + if (0 == cat_array.size()) return LLUUID(); else { - LLViewerInventoryCategory *cat = cat_array.get(0); + LLViewerInventoryCategory *cat = cat_array.at(0); if (cat) return cat->getUUID(); else @@ -215,11 +217,10 @@ public: // Request or re-request operation for specified item. void addItem(const LLUUID& item_id) { - LL_DEBUGS("Avatar") << "item_id " << item_id << llendl; - + LL_DEBUGS("Avatar") << "item_id " << item_id << LL_ENDL; if (!requestOperation(item_id)) { - LL_DEBUGS("Avatar") << "item_id " << item_id << " requestOperation false, skipping" << llendl; + LL_DEBUGS("Avatar") << "item_id " << item_id << " requestOperation false, skipping" << LL_ENDL; return; } @@ -249,7 +250,7 @@ public: } mPendingRequests--; F32 elapsed = timestamp.getElapsedTimeF32(); - LL_DEBUGS("Avatar") << "op done, src_id " << src_id << " dst_id " << dst_id << " after " << elapsed << " seconds" << llendl; + LL_DEBUGS("Avatar") << "op done, src_id " << src_id << " dst_id " << dst_id << " after " << elapsed << " seconds" << LL_ENDL; if (mWaitTimes.find(src_id) == mWaitTimes.end()) { // No longer waiting for this item - either serviced @@ -353,16 +354,16 @@ public: void reportStats() { - LL_DEBUGS("Avatar") << "Phase: " << mTrackingPhase << llendl; - LL_DEBUGS("Avatar") << "mFailCount: " << mFailCount << llendl; - LL_DEBUGS("Avatar") << "mRetryCount: " << mRetryCount << llendl; - LL_DEBUGS("Avatar") << "Times: n " << mTimeStats.getCount() << " min " << mTimeStats.getMinValue() << " max " << mTimeStats.getMaxValue() << llendl; - LL_DEBUGS("Avatar") << "Mean " << mTimeStats.getMean() << " stddev " << mTimeStats.getStdDev() << llendl; + LL_DEBUGS("Avatar") << "Phase: " << mTrackingPhase << LL_ENDL; + LL_DEBUGS("Avatar") << "mFailCount: " << mFailCount << LL_ENDL; + LL_DEBUGS("Avatar") << "mRetryCount: " << mRetryCount << LL_ENDL; + LL_DEBUGS("Avatar") << "Times: n " << mTimeStats.getCount() << " min " << mTimeStats.getMinValue() << " max " << mTimeStats.getMaxValue() << LL_ENDL; + LL_DEBUGS("Avatar") << "Mean " << mTimeStats.getMean() << " stddev " << mTimeStats.getStdDev() << LL_ENDL; } virtual ~LLCallAfterInventoryBatchMgr() { - LL_DEBUGS("Avatar") << "deleting" << llendl; + LL_DEBUGS("Avatar") << "deleting" << LL_ENDL; } protected: @@ -395,16 +396,22 @@ public: LLCallAfterInventoryBatchMgr(dst_cat_id, phase_name, on_completion_func, on_failure_func, retry_after, max_retries) { addItems(src_items); + sInstanceCount++; + } + + ~LLCallAfterInventoryCopyMgr() + { + sInstanceCount--; } virtual bool requestOperation(const LLUUID& item_id) { LLViewerInventoryItem *item = gInventory.getItem(item_id); llassert(item); - LL_DEBUGS("Avatar") << "copying item " << item_id << llendl; + LL_DEBUGS("Avatar") << "copying item " << item_id << LL_ENDL; if (ll_frand() < gSavedSettings.getF32("InventoryDebugSimulateOpFailureRate")) { - LL_DEBUGS("Avatar") << "simulating failure by not sending request for item " << item_id << llendl; + LL_DEBUGS("Avatar") << "simulating failure by not sending request for item " << item_id << LL_ENDL; return true; } copy_inventory_item( @@ -417,8 +424,15 @@ public: ); return true; } + + static S32 getInstanceCount() { return sInstanceCount; } + +private: + static S32 sInstanceCount; }; +S32 LLCallAfterInventoryCopyMgr::sInstanceCount = 0; + class LLCallAfterInventoryLinkMgr: public LLCallAfterInventoryBatchMgr { public: @@ -2635,6 +2649,11 @@ void LLAppearanceMgr::wearInventoryCategory(LLInventoryCategory* category, bool category->getUUID(), copy, append)); } +S32 LLAppearanceMgr::getActiveCopyOperations() const +{ + return LLCallAfterInventoryCopyMgr::getInstanceCount(); +} + void LLAppearanceMgr::wearCategoryFinal(LLUUID& cat_id, bool copy_items, bool append) { LL_INFOS("Avatar") << self_av_string() << "starting" << LL_ENDL; @@ -2733,6 +2752,7 @@ void LLAppearanceMgr::wearInventoryCategoryOnAvatar( LLInventoryCategory* catego LLAppearanceMgr::changeOutfit(TRUE, category->getUUID(), append); } +// FIXME do we really want to search entire inventory for matching name? void LLAppearanceMgr::wearOutfitByName(const std::string& name) { LL_INFOS("Avatar") << self_av_string() << "Wearing category " << name << LL_ENDL; @@ -2747,10 +2767,10 @@ void LLAppearanceMgr::wearOutfitByName(const std::string& name) has_name); bool copy_items = false; LLInventoryCategory* cat = NULL; - if (cat_array.count() > 0) + if (cat_array.size() > 0) { // Just wear the first one that matches - cat = cat_array.get(0); + cat = cat_array.at(0); } else { @@ -2759,9 +2779,9 @@ void LLAppearanceMgr::wearOutfitByName(const std::string& name) item_array, LLInventoryModel::EXCLUDE_TRASH, has_name); - if(cat_array.count() > 0) + if(cat_array.size() > 0) { - cat = cat_array.get(0); + cat = cat_array.at(0); copy_items = true; } } @@ -2775,8 +2795,6 @@ void LLAppearanceMgr::wearOutfitByName(const std::string& name) llwarns << "Couldn't find outfit " <getWearableType(); const bool is_body_part = (wearable_type == LLWearableType::WT_SHAPE) @@ -2958,18 +2976,24 @@ LLInventoryModel::item_array_t LLAppearanceMgr::findCOFItemLinks(const LLUUID& i cat_array, item_array, LLInventoryModel::EXCLUDE_TRASH); - for (S32 i=0; igetLinkedUUID() == vitem->getLinkedUUID()) { - result.put(item_array.get(i)); + result.push_back(item_array.at(i)); } } } return result; } +bool LLAppearanceMgr::isLinkedInCOF(const LLUUID& item_id) +{ + LLInventoryModel::item_array_t links = LLAppearanceMgr::instance().findCOFItemLinks(item_id); + return links.size() > 0; +} + void LLAppearanceMgr::removeAllClothesFromAvatar() { // Fetch worn clothes (i.e. the ones in COF). @@ -3035,27 +3059,13 @@ void LLAppearanceMgr::removeCOFItemLinks(const LLUUID& item_id) cat_array, item_array, LLInventoryModel::EXCLUDE_TRASH); - for (S32 i=0; igetIsLinkType() && item->getLinkedUUID() == item_id) { -#if 0 // LL_RELEASE_WITH_DEBUG_INFO || LL_DEBUG - // NOTE-RLVa: debug-only, can be removed down the line - if (rlv_handler_t::isEnabled()) - { - RLV_ASSERT(rlvPredCanRemoveItem(item)); - } -#endif // LL_RELEASE_WITH_DEBUG_INFO || LL_DEBUG gInventory.purgeObject(item->getUUID()); } -// [/RLVa:KB] -// const LLInventoryItem* item = item_array.get(i).get(); -// if (item->getIsLinkType() && item->getLinkedUUID() == item_id) -// { -// gInventory.purgeObject(item->getUUID()); -// } } } @@ -3072,16 +3082,6 @@ void LLAppearanceMgr::removeCOFLinksOfType(LLWearableType::EType type) const LLViewerInventoryItem* item = *it; if (item->getIsLinkType()) // we must operate on links only { -// [RLVa:KB] - Checked: 2013-02-12 (RLVa-1.4.8) -#if 0 // LL_RELEASE_WITH_DEBUG_INFO || LL_DEBUG - // NOTE-RLVa: debug-only, can be removed down the line - if (rlv_handler_t::isEnabled()) - { - RLV_ASSERT(rlvPredCanRemoveItem(item)); - } -#endif // LL_RELEASE_WITH_DEBUG_INFO || LL_DEBUG -// [/RLVa:KB] - gInventory.purgeObject(item->getUUID()); } } @@ -3091,7 +3091,7 @@ bool sort_by_linked_uuid(const LLViewerInventoryItem* item1, const LLViewerInven { if (!item1 || !item2) { - llwarning("item1, item2 cannot be null, something is very wrong", 0); + llwarns << "item1, item2 cannot be null, something is very wrong" << llendl; return true; } @@ -3133,8 +3133,9 @@ void LLAppearanceMgr::updateIsDirty() gInventory.collectDescendentsIf(base_outfit, outfit_cats, outfit_items, LLInventoryModel::EXCLUDE_TRASH, collector); - if(outfit_items.count() != cof_items.count()) + if(outfit_items.size() != cof_items.size()) { + LL_DEBUGS("Avatar") << "item count different - base " << outfit_items.size() << " cof " << cof_items.size() << LL_ENDL; // Current outfit folder should have one more item than the outfit folder. // this one item is the link back to the outfit folder itself. mOutfitIsDirty = true; @@ -3147,18 +3148,37 @@ void LLAppearanceMgr::updateIsDirty() for (U32 i = 0; i < cof_items.size(); ++i) { - LLViewerInventoryItem *item1 = cof_items.get(i); - LLViewerInventoryItem *item2 = outfit_items.get(i); + LLViewerInventoryItem *item1 = cof_items.at(i); + LLViewerInventoryItem *item2 = outfit_items.at(i); if (item1->getLinkedUUID() != item2->getLinkedUUID() || item1->getName() != item2->getName() || item1->getActualDescription() != item2->getActualDescription()) { + if (item1->getLinkedUUID() != item2->getLinkedUUID()) + { + LL_DEBUGS("Avatar") << "link id different " << LL_ENDL; + } + else + { + if (item1->getName() != item2->getName()) + { + LL_DEBUGS("Avatar") << "name different " << item1->getName() << " " << item2->getName() << LL_ENDL; + } + if (item1->getActualDescription() != item2->getActualDescription()) + { + LL_DEBUGS("Avatar") << "desc different " << item1->getActualDescription() + << " " << item2->getActualDescription() + << " names " << item1->getName() << " " << item2->getName() << LL_ENDL; + } + } mOutfitIsDirty = true; return; } } } + llassert(!mOutfitIsDirty); + LL_DEBUGS("Avatar") << "clean" << LL_ENDL; } // *HACK: Must match name in Library or agent inventory @@ -3240,23 +3260,6 @@ void LLAppearanceMgr::copyLibraryGestures() } } -void LLAppearanceMgr::autopopulateOutfits() -{ - // If this is the very first time the user has logged into viewer2+ (from a legacy viewer, or new account) - // then auto-populate outfits from the library into the My Outfits folder. - - LL_INFOS("Avatar") << self_av_string() << "avatar fully visible" << LL_ENDL; - - static bool check_populate_my_outfits = true; - if (check_populate_my_outfits && - (LLInventoryModel::getIsFirstTimeInViewer2() - || gSavedSettings.getBOOL("MyOutfitsAutofill"))) - { - gAgentWearables.populateMyOutfitsFolder(); - } - check_populate_my_outfits = false; -} - // Handler for anything that's deferred until avatar de-clouds. void LLAppearanceMgr::onFirstFullyVisible() { @@ -3264,10 +3267,6 @@ void LLAppearanceMgr::onFirstFullyVisible() gAgentAvatarp->reportAvatarRezTime(); gAgentAvatarp->debugAvatarVisible(); - // The auto-populate is failing at the point of generating outfits - // folders, so don't do the library copy until that is resolved. - // autopopulateOutfits(); - // If this is the first time we've ever logged in, // then copy default gestures from the library. if (gAgent.isFirstLogin()) { @@ -3293,6 +3292,7 @@ bool LLAppearanceMgr::updateBaseOutfit() llassert(!isOutfitLocked()); return false; } + setOutfitLocked(true); gAgentWearables.notifyLoadingStarted(); @@ -3319,12 +3319,12 @@ void LLAppearanceMgr::divvyWearablesByType(const LLInventoryModel::item_array_t& items_by_type.resize(LLWearableType::WT_COUNT); if (items.empty()) return; - for (S32 i=0; igetActualDescription(); const std::string& desc2 = item2->getActualDescription(); @@ -3376,8 +3370,10 @@ struct WearablesOrderComparator //items with ordering information but not for the associated wearables type if (!item1_valid && item2_valid) return false; + else if (item1_valid && !item2_valid) + return true; - return true; + return item1->getName() < item2->getName(); } U32 mControlSize; @@ -3408,7 +3404,6 @@ void LLAppearanceMgr::updateClothingOrderingInfo(LLUUID cat_id, bool update_base bool inventory_changed = false; for (U32 type = LLWearableType::WT_SHIRT; type < LLWearableType::WT_COUNT; type++) { - U32 size = items_by_type[type].size(); if (!size) continue; @@ -3428,7 +3423,7 @@ void LLAppearanceMgr::updateClothingOrderingInfo(LLUUID cat_id, bool update_base item->setComplete(TRUE); item->updateServer(FALSE); gInventory.updateItem(item); - + inventory_changed = true; } } @@ -3496,31 +3491,16 @@ class RequestAgentUpdateAppearanceResponder: public LLHTTPClient::ResponderWithR { public: virtual AIHTTPTimeoutPolicy const& getHTTPTimeoutPolicy(void) const { return requestAgentUpdateAppearance_timeout; } - RequestAgentUpdateAppearanceResponder() - { - mRetryPolicy = new LLAdaptiveRetryPolicy(1.0, 32.0, 2.0, 10); - } + RequestAgentUpdateAppearanceResponder(); - virtual ~RequestAgentUpdateAppearanceResponder() - { - } + virtual ~RequestAgentUpdateAppearanceResponder(); +protected: // Successful completion. - /* virtual */ void httpSuccess(void) - { - LL_DEBUGS("Avatar") << "content: " << ll_pretty_print_sd(mContent) << LL_ENDL; - if (mContent["success"].asBoolean()) - { - LL_DEBUGS("Avatar") << "OK" << LL_ENDL; - } - else - { - onFailure(200); - } - } + /* virtual */ void httpSuccess(); // Error - /*virtual*/ void httpFailure(void) + /*virtual*/ void httpFailure() { llwarns << "appearance update request failed, " << dumpResponse() << llendl; onFailure(mStatus); @@ -3548,6 +3528,15 @@ public: /*virtual*/ char const* getName(void) const { return "RequestAgentUpdateAppearanceResponder"; } }; +RequestAgentUpdateAppearanceResponder::RequestAgentUpdateAppearanceResponder() +{ + mRetryPolicy = new LLAdaptiveRetryPolicy(1.0, 32.0, 2.0, 10); +} + +RequestAgentUpdateAppearanceResponder::~RequestAgentUpdateAppearanceResponder() +{ +} + void LLAppearanceMgr::requestServerAppearanceUpdate(LLHTTPClient::ResponderPtr responder_ptr) { if (gAgentAvatarp->isEditingAppearance()) @@ -3638,6 +3627,41 @@ void scroll_to_folder(const LLUUID& folder_id) } } +/* virtual */ void RequestAgentUpdateAppearanceResponder::httpSuccess() +{ + const LLSD& content = getContent(); + if (!content.isMap()) + { + failureResult(400, "Malformed response contents", content); + return; + } + if (content["success"].asBoolean()) + { + LL_DEBUGS("Avatar") << "succeeded" << LL_ENDL; + static LLCachedControl debug_ava_appr_msg(gSavedSettings, "DebugAvatarAppearanceMessage"); + if (debug_ava_appr_msg) + { + dump_sequential_xml(gAgentAvatarp->getFullname() + "_appearance_request_ok", content); + } + + //onSuccess(); + } + else + { + failureResult(400, "Non-success response", content); + } +} + +std::string LLAppearanceMgr::getAppearanceServiceURL() const +{ + if (gSavedSettings.getString("AgentAppearanceServiceURL").empty()) + { + return mAppearanceServiceURL; + } + return gSavedSettings.getString("AgentAppearanceServiceURL"); // Singu TODO: Use "DebugAvatarAppearanceServiceURLOverride" +} + + class LLBoostFuncInventoryCallbackFireOnce : public LLBoostFuncInventoryCallback { public: diff --git a/indra/newview/llappearancemgr.h b/indra/newview/llappearancemgr.h index b3539de66..887e7991a 100644 --- a/indra/newview/llappearancemgr.h +++ b/indra/newview/llappearancemgr.h @@ -78,6 +78,8 @@ public: LLInventoryModel::item_array_t& items_to_kill); void enforceItemRestrictions(); + S32 getActiveCopyOperations() const; + // Copy all items and the src category itself. void shallowCopyCategory(const LLUUID& src_id, const LLUUID& dst_id, LLPointer cb); @@ -153,6 +155,7 @@ public: // Find COF entries referencing the given item. LLInventoryModel::item_array_t findCOFItemLinks(const LLUUID& item_id); + bool isLinkedInCOF(const LLUUID& item_id); // Remove COF entries void removeCOFItemLinks(const LLUUID& item_id); @@ -213,6 +216,13 @@ public: void requestServerAppearanceUpdate(LLHTTPClient::ResponderPtr responder_ptr = NULL); + void setAppearanceServiceURL(const std::string& url) { mAppearanceServiceURL = url; } + std::string getAppearanceServiceURL() const; + +private: + std::string mAppearanceServiceURL; + + protected: LLAppearanceMgr(); ~LLAppearanceMgr(); @@ -255,7 +265,7 @@ private: */ bool mOutfitLocked; - std::auto_ptr mUnlockOutfitTimer; + boost::scoped_ptr mUnlockOutfitTimer; // [SL:KB] - Patch: Appearance-SyncAttach | Checked: 2010-09-18 (Catznip-3.0.0a) | Modified: Catznip-2.1.2e public: diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp index caf66d6bc..50212e1c4 100644 --- a/indra/newview/llappviewer.cpp +++ b/indra/newview/llappviewer.cpp @@ -881,9 +881,6 @@ bool LLAppViewer::init() gGLManager.getGLInfo(gDebugInfo); gGLManager.printGLInfoString(); - //load key settings - bind_keyboard_functions(); - // Load Default bindings load_default_bindings(gSavedSettings.getBOOL("LiruUseZQSDKeys")); diff --git a/indra/newview/llenvmanager.cpp b/indra/newview/llenvmanager.cpp index 3033d4e07..8f31c6c6f 100644 --- a/indra/newview/llenvmanager.cpp +++ b/indra/newview/llenvmanager.cpp @@ -105,9 +105,11 @@ void LLEnvPrefs::setUseDayCycle(const std::string& name) } //============================================================================= -LLEnvManagerNew::LLEnvManagerNew() +LLEnvManagerNew::LLEnvManagerNew(): + mInterpNextChangeMessage(true), + mCurRegionUUID(LLUUID::null), + mLastReceivedID(LLUUID::null) { - mInterpNextChangeMessage = true; // Set default environment settings. mUserPrefs.mUseRegionSettings = true; @@ -115,6 +117,9 @@ LLEnvManagerNew::LLEnvManagerNew() mUserPrefs.mWaterPresetName = "Default"; mUserPrefs.mSkyPresetName = "Default"; mUserPrefs.mDayCycleName = "Default"; + + LL_DEBUGS("Windlight")<getRegionID() : LLUUID::null; - if (region_uuid == mCurRegionUUID) + if (region_uuid != mCurRegionUUID) { - return; + // Clear locally modified region settings. + mNewRegionPrefs.clear(); + + // *TODO: clear environment settings of the previous region? + + // Request environment settings of the new region. + mCurRegionUUID = region_uuid; + // for region crossings, interpolate the change; for teleports, don't + mInterpNextChangeMessage = (gAgent.getTeleportState() == LLAgent::TELEPORT_NONE); + LL_DEBUGS("Windlight") << (mInterpNextChangeMessage ? "Crossed" : "Teleported") + << " to new region: " << region_uuid + << LL_ENDL; + requestRegionSettings(); + } + else + { + LL_DEBUGS("Windlight") << "disregarding region change; interp: " + << (mInterpNextChangeMessage ? "true" : "false") + << " regionp: " << regionp + << " old: " << mCurRegionUUID + << " new: " << region_uuid + << LL_ENDL; } - - // Clear locally modified region settings. - mNewRegionPrefs.clear(); - - // *TODO: clear environment settings of the previous region? - - // Request environment settings of the new region. - LL_DEBUGS("Windlight") << "New viewer region: " << region_uuid << LL_ENDL; - mCurRegionUUID = region_uuid; - mInterpNextChangeMessage = interpolate; - requestRegionSettings(); - - // Let interested parties know agent region has been changed. - mRegionChangeSignal(); } // Aurora-sim windlight refresh @@ -729,7 +731,7 @@ class WindLightRefresh : public LLHTTPNode llinfos << "Windlight Refresh, interpolate:" << env->mInterpNextChangeMessage << llendl; env->requestRegionSettings(); - env->mRegionChangeSignal(); + env->onRegionChange(); } }; diff --git a/indra/newview/llenvmanager.h b/indra/newview/llenvmanager.h index 8d5317996..6d7efeab6 100644 --- a/indra/newview/llenvmanager.h +++ b/indra/newview/llenvmanager.h @@ -2,31 +2,25 @@ * @file llenvmanager.h * @brief Declaration of classes managing WindLight and water settings. * - * $LicenseInfo:firstyear=2009&license=viewergpl$ - * - * Copyright (c) 2009, Linden Research, Inc. - * + * $LicenseInfo:firstyear=2009&license=viewerlgpl$ * Second Life Viewer Source Code - * The source code in this file ("Source Code") is provided by Linden Lab - * to you under the terms of the GNU General Public License, version 2.0 - * ("GPL"), unless you have obtained a separate licensing agreement - * ("Other License"), formally executed by you and Linden Lab. Terms of - * the GPL can be found in doc/GPL-license.txt in this distribution, or - * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * Copyright (C) 2011, Linden Research, Inc. * - * There are special exceptions to the terms and conditions of the GPL as - * it is applied to this Source Code. View the full text of the exception - * in the file doc/FLOSS-exception.txt in this software distribution, or - * online at - * http://secondlifegrid.net/programs/open_source/licensing/flossexception + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License only. * - * By copying, modifying or distributing this software, you acknowledge - * that you have read and understood your obligations described above, - * and agree to abide by those obligations. + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. * - * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO - * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, - * COMPLETENESS OR PERFORMANCE. + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA * $/LicenseInfo$ */ @@ -39,7 +33,6 @@ class LLWLParamManager; class LLWaterParamManager; class LLWLAnimator; -class WindLightRefresh; // generic key struct LLEnvKey @@ -173,7 +166,6 @@ class LLEnvManagerNew : public LLSingleton public: typedef boost::signals2::signal prefs_change_signal_t; typedef boost::signals2::signal region_settings_change_signal_t; - typedef boost::signals2::signal region_change_signal_t; typedef boost::signals2::signal region_settings_applied_signal_t; LLEnvManagerNew(); @@ -229,15 +221,12 @@ public: bool sendRegionSettings(const LLEnvironmentSettings& new_settings); boost::signals2::connection setPreferencesChangeCallback(const prefs_change_signal_t::slot_type& cb); boost::signals2::connection setRegionSettingsChangeCallback(const region_settings_change_signal_t::slot_type& cb); - boost::signals2::connection setRegionChangeCallback(const region_change_signal_t::slot_type& cb); boost::signals2::connection setRegionSettingsAppliedCallback(const region_settings_applied_signal_t::slot_type& cb); static bool canEditRegionSettings(); /// @return true if we have access to editing region environment static const std::string getScopeString(LLEnvKey::EScope scope); // Public callbacks. - void onRegionCrossing(); - void onTeleport(); void onRegionSettingsResponse(const LLSD& content); void onRegionSettingsApplyResponse(bool ok); @@ -261,7 +250,7 @@ private: bool useDefaultSky(); bool useDefaultWater(); - void onRegionChange(bool interpolate); + void onRegionChange(); /// Emitted when user environment preferences change. prefs_change_signal_t mUsePrefsChangeSignal; @@ -269,9 +258,6 @@ private: /// Emitted when region environment settings update comes. region_settings_change_signal_t mRegionSettingsChangeSignal; - /// Emitted when agent region changes. Move to LLAgent? - region_change_signal_t mRegionChangeSignal; - /// Emitted when agent region changes. Move to LLAgent? region_settings_applied_signal_t mRegionSettingsAppliedSignal; diff --git a/indra/newview/llestateinfomodel.cpp b/indra/newview/llestateinfomodel.cpp index 09c05f3af..b15a1cced 100644 --- a/indra/newview/llestateinfomodel.cpp +++ b/indra/newview/llestateinfomodel.cpp @@ -38,9 +38,6 @@ #include "llfloaterregioninfo.h" // for invoice id #include "llviewerregion.h" -class AIHTTPTimeoutPolicy; -extern AIHTTPTimeoutPolicy estateChangeInfoResponder_timeout; - LLEstateInfoModel::LLEstateInfoModel() : mID(0) , mFlags(0) @@ -68,12 +65,12 @@ void LLEstateInfoModel::sendEstateInfo() } } -bool LLEstateInfoModel::getUseFixedSun() const { return mFlags & REGION_FLAGS_SUN_FIXED; } -bool LLEstateInfoModel::getIsExternallyVisible() const { return mFlags & REGION_FLAGS_EXTERNALLY_VISIBLE; } -bool LLEstateInfoModel::getAllowDirectTeleport() const { return mFlags & REGION_FLAGS_ALLOW_DIRECT_TELEPORT; } -bool LLEstateInfoModel::getDenyAnonymous() const { return mFlags & REGION_FLAGS_DENY_ANONYMOUS; } -bool LLEstateInfoModel::getDenyAgeUnverified() const { return mFlags & REGION_FLAGS_DENY_AGEUNVERIFIED; } -bool LLEstateInfoModel::getAllowVoiceChat() const { return mFlags & REGION_FLAGS_ALLOW_VOICE; } +bool LLEstateInfoModel::getUseFixedSun() const { return getFlag(REGION_FLAGS_SUN_FIXED); } +bool LLEstateInfoModel::getIsExternallyVisible() const { return getFlag(REGION_FLAGS_EXTERNALLY_VISIBLE); } +bool LLEstateInfoModel::getAllowDirectTeleport() const { return getFlag(REGION_FLAGS_ALLOW_DIRECT_TELEPORT); } +bool LLEstateInfoModel::getDenyAnonymous() const { return getFlag(REGION_FLAGS_DENY_ANONYMOUS); } +bool LLEstateInfoModel::getDenyAgeUnverified() const { return getFlag(REGION_FLAGS_DENY_AGEUNVERIFIED); } +bool LLEstateInfoModel::getAllowVoiceChat() const { return getFlag(REGION_FLAGS_ALLOW_VOICE); } void LLEstateInfoModel::setUseFixedSun(bool val) { setFlag(REGION_FLAGS_SUN_FIXED, val); } void LLEstateInfoModel::setIsExternallyVisible(bool val) { setFlag(REGION_FLAGS_EXTERNALLY_VISIBLE, val); } @@ -118,19 +115,18 @@ class LLEstateChangeInfoResponder : public LLHTTPClient::ResponderWithResult public: // if we get a normal response, handle it here - /*virtual*/ void httpSuccess(void) + virtual void httpSuccess() { llinfos << "Committed estate info" << llendl; LLEstateInfoModel::instance().notifyCommit(); } // if we get an error response - /*virtual*/ void httpFailure(void) + virtual void httpFailure() { - llwarns << "Failed to commit estate info (" << mStatus << "): " << mReason << llendl; + llwarns << "Failed to commit estate info [status:" << mStatus << "]: " << mReason << llendl; } - /*virtual*/ AIHTTPTimeoutPolicy const& getHTTPTimeoutPolicy(void) const { return estateChangeInfoResponder_timeout; } /*virtual*/ char const* getName(void) const { return "LLEstateChangeInfoResponder"; } }; @@ -205,18 +201,6 @@ void LLEstateInfoModel::commitEstateInfoDataserver() gAgent.sendMessage(); } -void LLEstateInfoModel::setFlag(U32 flag, bool val) -{ - if (val) - { - mFlags |= flag; - } - else - { - mFlags &= ~flag; - } -} - std::string LLEstateInfoModel::getInfoDump() { LLSD dump; diff --git a/indra/newview/llestateinfomodel.h b/indra/newview/llestateinfomodel.h index 30e83b140..b83d17f8d 100644 --- a/indra/newview/llestateinfomodel.h +++ b/indra/newview/llestateinfomodel.h @@ -86,19 +86,38 @@ protected: private: bool commitEstateInfoCaps(); void commitEstateInfoDataserver(); - U32 getFlags() const { return mFlags; } - void setFlag(U32 flag, bool val); + inline bool getFlag(U64 flag) const; + inline void setFlag(U64 flag, bool val); + U64 getFlags() const { return mFlags; } std::string getInfoDump(); // estate info std::string mName; /// estate name LLUUID mOwnerID; /// estate owner id U32 mID; /// estate id - U32 mFlags; /// estate flags + U64 mFlags; /// estate flags F32 mSunHour; /// estate sun hour update_signal_t mUpdateSignal; /// emitted when we receive update from sim update_signal_t mCommitSignal; /// emitted when our update gets applied to sim }; +inline bool LLEstateInfoModel::getFlag(U64 flag) const +{ + return ((mFlags & flag) != 0); +} + +inline void LLEstateInfoModel::setFlag(U64 flag, bool val) +{ + if (val) + { + mFlags |= flag; + } + else + { + mFlags &= ~flag; + } +} + + #endif // LL_LLESTATEINFOMODEL_H diff --git a/indra/newview/llfloaterdirectory.cpp b/indra/newview/llfloaterdirectory.cpp index ce2f71e16..ed01ff283 100644 --- a/indra/newview/llfloaterdirectory.cpp +++ b/indra/newview/llfloaterdirectory.cpp @@ -54,7 +54,6 @@ #include "hippogridmanager.h" #include "lfsimfeaturehandler.h" -#include "llenvmanager.h" #include "llnotificationsutil.h" #include "llviewerregion.h" @@ -279,7 +278,7 @@ LLFloaterDirectory::LLFloaterDirectory(const std::string& name) LLPanelDirMarket* marketp = static_cast(container->getPanelByName(market_panel)); container->removeTabPanel(marketp); // Until we get a MarketPlace URL, tab is removed. marketp->handleRegionChange(container); - LLEnvManagerNew::instance().setRegionChangeCallback(boost::bind(&LLPanelDirMarket::handleRegionChange, marketp, container)); + gAgent.addRegionChangedCallback(boost::bind(&LLPanelDirMarket::handleRegionChange, marketp, container)); } container->setCommitCallback(boost::bind(&LLFloaterDirectory::onTabChanged,_2)); } diff --git a/indra/newview/llfloatergroups.cpp b/indra/newview/llfloatergroups.cpp index 8cb6681ba..8be4611bf 100644 --- a/indra/newview/llfloatergroups.cpp +++ b/indra/newview/llfloatergroups.cpp @@ -185,7 +185,7 @@ LLPanelGroups::~LLPanelGroups() // clear the group list, and get a fresh set of info. void LLPanelGroups::reset() { - getChild("groupcount")->setTextArg("[COUNT]", llformat("%d",gAgent.mGroups.count())); + getChild("groupcount")->setTextArg("[COUNT]", llformat("%d",gAgent.mGroups.size())); getChild("groupcount")->setTextArg("[MAX]", llformat("%d", gHippoLimits->getMaxAgentGroups())); init_group_list(getChild("group list"), gAgent.getGroupID()); @@ -194,7 +194,7 @@ void LLPanelGroups::reset() BOOL LLPanelGroups::postBuild() { - getChild("groupcount")->setTextArg("[COUNT]", llformat("%d",gAgent.mGroups.count())); + getChild("groupcount")->setTextArg("[COUNT]", llformat("%d",gAgent.mGroups.size())); getChild("groupcount")->setTextArg("[MAX]", llformat("%d",gHippoLimits->getMaxAgentGroups())); LLScrollListCtrl *list = getChild("group list"); @@ -231,7 +231,7 @@ BOOL LLPanelGroups::postBuild() void LLPanelGroups::enableButtons() { - getChildView("Create")->setEnabled(gAgent.mGroups.count() < gHippoLimits->getMaxAgentGroups()); + getChildView("Create")->setEnabled(gAgent.canJoinGroups()); LLScrollListCtrl* group_list = getChild("group list"); if (!group_list) return; LLUUID group_id; @@ -368,7 +368,7 @@ LLSD create_group_element(const LLGroupData *group_datap, const LLUUID &active_g void init_group_list(LLScrollListCtrl* ctrl, const LLUUID& highlight_id, U64 powers_mask) { - S32 count = gAgent.mGroups.count(); + S32 count = gAgent.mGroups.size(); LLUUID id; LLCtrlListInterface *group_list = ctrl->getListInterface(); if (!group_list) return; @@ -381,7 +381,7 @@ void init_group_list(LLScrollListCtrl* ctrl, const LLUUID& highlight_id, U64 pow for(S32 i = 0; i < count; ++i) { - LLSD element = create_group_element(&gAgent.mGroups.get(i), highlight_id, powers_mask); + LLSD element = create_group_element(&gAgent.mGroups[i], highlight_id, powers_mask); if(element.size()) group_list->addElement(element, ADD_SORTED); } diff --git a/indra/newview/llfloaterland.cpp b/indra/newview/llfloaterland.cpp index 874e45c49..488f32186 100644 --- a/indra/newview/llfloaterland.cpp +++ b/indra/newview/llfloaterland.cpp @@ -165,19 +165,39 @@ LLParcel* LLFloaterLand::getCurrentSelectedParcel() //static LLPanelLandObjects* LLFloaterLand::getCurrentPanelLandObjects() { - return LLFloaterLand::getInstance()->mPanelObjects; + LLFloaterLand* land_instance = LLFloaterLand::getInstance(); + if (land_instance) + { + return land_instance->mPanelObjects; + } + else + { + return NULL; + } } //static LLPanelLandCovenant* LLFloaterLand::getCurrentPanelLandCovenant() { - return LLFloaterLand::getInstance()->mPanelCovenant; + LLFloaterLand* land_instance = LLFloaterLand::getInstance(); + if (land_instance) + { + return land_instance->mPanelCovenant; + } + else + { + return NULL; + } } // static void LLFloaterLand::refreshAll() { - LLFloaterLand::getInstance()->refresh(); + LLFloaterLand* land_instance = LLFloaterLand::getInstance(); + if (land_instance) + { + land_instance->refresh(); + } } void LLFloaterLand::onOpen() @@ -763,6 +783,7 @@ void LLPanelLandGeneral::refresh() BOOL use_pass = parcel->getOwnerID()!= gAgent.getID() && parcel->getParcelFlag(PF_USE_PASS_LIST) && !LLViewerParcelMgr::getInstance()->isCollisionBanned();; mBtnBuyPass->setEnabled(use_pass); + } } @@ -857,11 +878,13 @@ void LLPanelLandGeneral::onClickProfile() if (parcel->getIsGroupOwned()) { - LLGroupActions::show(parcel->getGroupID()); + const LLUUID& group_id = parcel->getGroupID(); + LLGroupActions::show(group_id); } else { - LLAvatarActions::showProfile(parcel->getOwnerID()); + const LLUUID& avatar_id = parcel->getOwnerID(); + LLAvatarActions::showProfile(avatar_id); } } @@ -1538,7 +1561,7 @@ void LLPanelLandObjects::processParcelObjectOwnersReply(LLMessageSystem *msg, vo BOOL is_group_owned; S32 object_count; U32 most_recent_time = 0; - BOOL is_online = 0; + BOOL is_online; std::string object_count_str; //BOOL b_need_refresh = FALSE; @@ -1553,7 +1576,7 @@ void LLPanelLandObjects::processParcelObjectOwnersReply(LLMessageSystem *msg, vo std::vector avatar_ids; std::vector positions; LLWorld::instance().getAvatars(&avatar_ids, &positions, mypos, F32_MAX); - + for(S32 i = 0; i < rows; ++i) { msg->getUUIDFast(_PREHASH_Data, _PREHASH_OwnerID, owner_id, i); @@ -2834,11 +2857,12 @@ void LLPanelLandAccess::onCommitAny(LLUICtrl *ctrl, void *userdata) void LLPanelLandAccess::onClickAddAccess() { + LLFloater* root_floater = gFloaterView->getParentFloater(this); LLFloaterAvatarPicker* picker = LLFloaterAvatarPicker::show( boost::bind(&LLPanelLandAccess::callbackAvatarCBAccess, this, _1)); if (picker) { - gFloaterView->getParentFloater(this)->addDependentFloater(picker); + root_floater->addDependentFloater(picker); } } @@ -2882,11 +2906,12 @@ void LLPanelLandAccess::onClickRemoveAccess(void* data) void LLPanelLandAccess::onClickAddBanned() { + LLFloater* root_floater = gFloaterView->getParentFloater(this); LLFloaterAvatarPicker* picker = LLFloaterAvatarPicker::show( boost::bind(&LLPanelLandAccess::callbackAvatarCBBanned, this, _1)); if (picker) { - gFloaterView->getParentFloater(this)->addDependentFloater(picker); + root_floater->addDependentFloater(picker); } } @@ -3064,15 +3089,15 @@ void LLFloaterLand::open() // Ideally we could just use LLViewerParcelMgr::isParcelOwnedByAgent(), but that has that sneaky exemption // for fake god like (aka View Admin Options) const LLUUID& idOwner = pParcel->getOwnerID(); - if ( (idOwner != gAgent.getID()) ) + if (idOwner != gAgentID) { // *sighs* LLAgent::hasPowerInGroup() has it too so copy/paste from there - S32 count = gAgent.mGroups.count(); bool fShow = false; + S32 count = gAgent.mGroups.size(); bool fShow = false; for (S32 i = 0; i < count; ++i) { - if (gAgent.mGroups.get(i).mID == idOwner) + if (gAgent.mGroups[i].mID == idOwner) { - fShow |= ((gAgent.mGroups.get(i).mPowers & GP_LAND_RETURN) > 0); + fShow |= ((gAgent.mGroups[i].mPowers & GP_LAND_RETURN) > 0); break; } } diff --git a/indra/newview/llfloaterlandholdings.cpp b/indra/newview/llfloaterlandholdings.cpp index 4949678c1..9046e768f 100644 --- a/indra/newview/llfloaterlandholdings.cpp +++ b/indra/newview/llfloaterlandholdings.cpp @@ -100,27 +100,26 @@ BOOL LLFloaterLandHoldings::postBuild() childSetAction("Teleport", onClickTeleport, this); childSetAction("Show on Map", onClickMap, this); - LLScrollListCtrl *grant_list = getChild("grant list"); - // Grant list + LLScrollListCtrl *grant_list = getChild("grant list"); grant_list->setDoubleClickCallback(boost::bind(LLGroupActions::show, boost::bind(&LLScrollListCtrl::getCurrentID, grant_list))); LLCtrlListInterface *list = grant_list->getListInterface(); if (!list) return TRUE; - S32 count = gAgent.mGroups.count(); + S32 count = gAgent.mGroups.size(); for(S32 i = 0; i < count; ++i) { - LLUUID id(gAgent.mGroups.get(i).mID); + LLUUID id(gAgent.mGroups.at(i).mID); LLSD element; element["id"] = id; element["columns"][0]["column"] = "group"; - element["columns"][0]["value"] = gAgent.mGroups.get(i).mName; + element["columns"][0]["value"] = gAgent.mGroups.at(i).mName; element["columns"][0]["font"] = "SANSSERIF"; LLUIString areastr = getString("area_string"); - areastr.setArg("[AREA]", llformat("%d", gAgent.mGroups.get(i).mContribution)); + areastr.setArg("[AREA]", llformat("%d", gAgent.mGroups.at(i).mContribution)); element["columns"][1]["column"] = "area"; element["columns"][1]["value"] = areastr; element["columns"][1]["font"] = "SANSSERIF"; @@ -128,6 +127,8 @@ BOOL LLFloaterLandHoldings::postBuild() list->addElement(element, ADD_SORTED); } + center(); + return TRUE; } @@ -157,8 +158,8 @@ void LLFloaterLandHoldings::refresh() enable_btns = TRUE; } - childSetEnabled("Teleport", enable_btns); - childSetEnabled("Show on Map", enable_btns); + getChildView("Teleport")->setEnabled(enable_btns); + getChildView("Show on Map")->setEnabled(enable_btns); refreshAggregates(); } @@ -291,15 +292,16 @@ void LLFloaterLandHoldings::buttonCore(S32 which) F64 global_z = gAgent.getPositionGlobal().mdV[VZ]; LLVector3d pos_global(global_x, global_y, global_z); + LLFloaterWorldMap* floater_world_map = gFloaterWorldMap; switch(which) { case 0: gAgent.teleportViaLocation(pos_global); - gFloaterWorldMap->trackLocation(pos_global); + if(floater_world_map) floater_world_map->trackLocation(pos_global); break; case 1: - gFloaterWorldMap->trackLocation(pos_global); + if(floater_world_map) floater_world_map->trackLocation(pos_global); LLFloaterWorldMap::show(true); break; default: @@ -329,7 +331,7 @@ void LLFloaterLandHoldings::refreshAggregates() S32 current_area = gStatusBar->getSquareMetersCommitted(); S32 available_area = gStatusBar->getSquareMetersLeft(); - childSetTextArg("allowed_text", "[AREA]", llformat("%d",allowed_area)); - childSetTextArg("current_text", "[AREA]", llformat("%d",current_area)); - childSetTextArg("available_text", "[AREA]", llformat("%d",available_area)); + getChild("allowed_text")->setTextArg("[AREA]", llformat("%d",allowed_area)); + getChild("current_text")->setTextArg("[AREA]", llformat("%d",current_area)); + getChild("available_text")->setTextArg("[AREA]", llformat("%d",available_area)); } diff --git a/indra/newview/llfloaterpathfindingobjects.cpp b/indra/newview/llfloaterpathfindingobjects.cpp index 7fe3311cb..f8c170063 100644 --- a/indra/newview/llfloaterpathfindingobjects.cpp +++ b/indra/newview/llfloaterpathfindingobjects.cpp @@ -41,7 +41,6 @@ #include "llavatarnamecache.h" #include "llbutton.h" #include "llcheckboxctrl.h" -#include "llenvmanager.h" #include "llfloater.h" #include "llfontgl.h" #include "llnotifications.h" @@ -84,7 +83,7 @@ void LLFloaterPathfindingObjects::onOpen(/*const LLSD &pKey*/) if (!mRegionBoundaryCrossingSlot.connected()) { - mRegionBoundaryCrossingSlot = LLEnvManagerNew::getInstance()->setRegionChangeCallback(boost::bind(&LLFloaterPathfindingObjects::onRegionBoundaryCrossed, this)); + mRegionBoundaryCrossingSlot = gAgent.addRegionChangedCallback(boost::bind(&LLFloaterPathfindingObjects::onRegionBoundaryCrossed, this)); } if (!mGodLevelChangeSlot.connected()) @@ -384,19 +383,31 @@ void LLFloaterPathfindingObjects::buildObjectsScrollList(const LLPathfindingObje void LLFloaterPathfindingObjects::addObjectToScrollList(const LLPathfindingObjectPtr pObjectPtr, const LLSD &pScrollListItemData) { - LLSD rowParams; - rowParams["id"] = pObjectPtr->getUUID(); + LLScrollListCell::Params cellParams; + //cellParams.font = LLFontGL::getFontSansSerif(); + + LLScrollListItem::Params rowParams; + rowParams.value = pObjectPtr->getUUID().asString(); llassert(pScrollListItemData.isArray()); - S32 idx = 0; for (LLSD::array_const_iterator cellIter = pScrollListItemData.beginArray(); cellIter != pScrollListItemData.endArray(); ++cellIter) { - rowParams["columns"][idx] = *cellIter; - idx++; + const LLSD &cellElement = *cellIter; + + llassert(cellElement.has("column")); + llassert(cellElement.get("column").isString()); + cellParams.column = cellElement.get("column").asString(); + + llassert(cellElement.has("value")); + llassert(cellElement.get("value").isString()); + cellParams.value = cellElement.get("value").asString(); + + rowParams.columns.add(cellParams); } - LLScrollListItem *scrollListItem = mObjectsScrollList->addElement(rowParams); + LLScrollListItem *scrollListItem = mObjectsScrollList->addRow(rowParams); + if (pObjectPtr->hasOwner() && !pObjectPtr->hasOwnerName()) { mMissingNameObjectsScrollListItems.insert(std::make_pair(pObjectPtr->getUUID().asString(), scrollListItem)); diff --git a/indra/newview/llfloaterregiondebugconsole.cpp b/indra/newview/llfloaterregiondebugconsole.cpp index 39404fa20..31699d9ea 100644 --- a/indra/newview/llfloaterregiondebugconsole.cpp +++ b/indra/newview/llfloaterregiondebugconsole.cpp @@ -37,10 +37,6 @@ #include "llviewerregion.h" #include "lluictrlfactory.h" -class AIHTTPTimeoutPolicy; -extern AIHTTPTimeoutPolicy asyncConsoleResponder_timeout; -extern AIHTTPTimeoutPolicy consoleResponder_timeout; - // Two versions of the sim console API are supported. // // SimConsole capability (deprecated): @@ -81,7 +77,6 @@ namespace { public: /*virtual*/ void httpFailure(void) { sConsoleReplySignal(UNABLE_TO_SEND_COMMAND); } - /*virtual*/ AIHTTPTimeoutPolicy const& getHTTPTimeoutPolicy(void) const { return asyncConsoleResponder_timeout; } /*virtual*/ char const* getName(void) const { return "AsyncConsoleResponder"; } }; @@ -111,7 +106,6 @@ namespace } } - /*virtual*/ AIHTTPTimeoutPolicy const& getHTTPTimeoutPolicy(void) const { return consoleResponder_timeout; } /*virtual*/ char const* getName(void) const { return "ConsoleResponder"; } LLTextEditor * mOutput; diff --git a/indra/newview/llfloaterregioninfo.cpp b/indra/newview/llfloaterregioninfo.cpp index 7df8e5272..23db2f4e8 100644 --- a/indra/newview/llfloaterregioninfo.cpp +++ b/indra/newview/llfloaterregioninfo.cpp @@ -61,6 +61,7 @@ #include "llfloatergodtools.h" // for send_sim_wide_deletes() #include "llfloatertopobjects.h" // added to fix SL-32336 #include "llfloatergroups.h" +#include "llfloaterregiondebugconsole.h" #include "llfloatertelehub.h" #include "llinventorymodel.h" #include "lllineeditor.h" @@ -94,9 +95,6 @@ const S32 TERRAIN_TEXTURE_COUNT = 4; const S32 CORNER_COUNT = 4; -class AIHTTPTimeoutPolicy; -extern AIHTTPTimeoutPolicy estateChangeInfoResponder_timeout; - ///---------------------------------------------------------------------------- /// Local class declaration ///---------------------------------------------------------------------------- @@ -252,7 +250,7 @@ BOOL LLFloaterRegionInfo::postBuild() &processEstateOwnerRequest); // Request region info when agent region changes. - LLEnvManagerNew::instance().setRegionChangeCallback(boost::bind(&LLFloaterRegionInfo::requestRegionInfo, this)); + gAgent.addRegionChangedCallback(boost::bind(&LLFloaterRegionInfo::requestRegionInfo, this)); return TRUE; } @@ -269,6 +267,7 @@ void LLFloaterRegionInfo::onOpen() refreshFromRegion(gAgent.getRegion()); requestRegionInfo(); + requestMeshRezInfo(); LLFloater::onOpen(); } @@ -650,9 +649,10 @@ void LLPanelRegionInfo::initCtrl(const std::string& name) getChild(name)->setCommitCallback(boost::bind(&LLPanelRegionInfo::onChangeAnything, this)); } +// Singu TODO: Make this a callback registrar function instead. void LLPanelRegionInfo::initHelpBtn(const std::string& name, const std::string& xml_alert) { - childSetAction(name, boost::bind(&LLPanelRegionInfo::onClickHelp, this, xml_alert)); + getChild(name)->setCommitCallback(boost::bind(&LLPanelRegionInfo::onClickHelp, this, xml_alert)); } void LLPanelRegionInfo::onClickHelp(const std::string& xml_alert) @@ -857,6 +857,46 @@ bool LLPanelRegionGeneralInfo::onMessageCommit(const LLSD& notification, const L return false; } +class ConsoleRequestResponder : public LLHTTPClient::ResponderIgnoreBody +{ + LOG_CLASS(ConsoleRequestResponder); +protected: + /*virtual*/ + void httpFailure() + { + llwarns << "error requesting mesh_rez_enabled " << dumpResponse() << llendl; + } + /*virtual*/ const char* getName() const { return "ConsoleRequestResponder"; } +}; + + +// called if this request times out. +class ConsoleUpdateResponder : public LLHTTPClient::ResponderIgnoreBody +{ + LOG_CLASS(ConsoleUpdateResponder); +protected: + /* virtual */ + void httpFailure() + { + llwarns << "error updating mesh enabled region setting " << dumpResponse() << llendl; + } +}; + +void LLFloaterRegionInfo::requestMeshRezInfo() +{ + std::string sim_console_url = gAgent.getRegion()->getCapability("SimConsoleAsync"); + + if (!sim_console_url.empty()) + { + std::string request_str = "get mesh_rez_enabled"; + + LLHTTPClient::post( + sim_console_url, + LLSD(request_str), + new ConsoleRequestResponder); + } +} + // setregioninfo // strings[0] = 'Y' - block terraform, 'N' - not // strings[1] = 'Y' - block fly, 'N' - not @@ -969,6 +1009,7 @@ BOOL LLPanelRegionDebugInfo::postBuild() childSetAction("top_scripts_btn", onClickTopScripts, this); childSetAction("restart_btn", onClickRestart, this); childSetAction("cancel_restart_btn", onClickCancelRestart, this); + childSetAction("region_debug_console_btn", onClickDebugConsole, this); return TRUE; } @@ -990,6 +1031,7 @@ bool LLPanelRegionDebugInfo::refreshFromRegion(LLViewerRegion* region) getChildView("top_scripts_btn")->setEnabled(allow_modify); getChildView("restart_btn")->setEnabled(allow_modify); getChildView("cancel_restart_btn")->setEnabled(allow_modify); + getChildView("region_debug_console_btn")->setEnabled(allow_modify); return LLPanelRegionInfo::refreshFromRegion(region); } @@ -1145,6 +1187,11 @@ void LLPanelRegionDebugInfo::onClickCancelRestart(void* data) self->sendEstateOwnerMessage(gMessageSystem, "restart", invoice, strings); } +// static +void LLPanelRegionDebugInfo::onClickDebugConsole(void* data) +{ + LLFloaterRegionDebugConsole::getInstance()->open(); +} BOOL LLPanelRegionTerrainInfo::validateTextureSizes() { @@ -1162,7 +1209,7 @@ BOOL LLPanelRegionTerrainInfo::validateTextureSizes() S32 width = img->getFullWidth(); S32 height = img->getFullHeight(); - //llinfos << "texture detail " << i << " is " << width << "x" << height << "x" << components << llendl; + //LL_INFOS() << "texture detail " << i << " is " << width << "x" << height << "x" << components << LL_ENDL; if (components != 3) { @@ -1173,7 +1220,7 @@ BOOL LLPanelRegionTerrainInfo::validateTextureSizes() return FALSE; } - if (width > 1024 || height > 1024) + if (width > 1024 || height > 1024) // { LLSD args; @@ -1590,7 +1637,7 @@ void LLPanelEstateInfo::onClickKickUser() void LLPanelEstateInfo::onKickUserCommit(const uuid_vec_t& ids, const std::vector& names) { if (names.empty() || ids.empty()) return; - + //check to make sure there is one valid user and id if( ids[0].isNull() ) { @@ -1794,7 +1841,7 @@ void LLPanelEstateInfo::accessAddCore3(const uuid_vec_t& ids, LLEstateAccessChan LLSD args; args["NUM_ADDED"] = llformat("%d",ids.size()); args["MAX_AGENTS"] = llformat("%d",ESTATE_MAX_ACCESS_IDS); - args["LIST_TYPE"] = "Allowed Residents"; + args["LIST_TYPE"] = LLTrans::getString("RegionInfoListTypeAllowedAgents"); args["NUM_EXCESS"] = llformat("%d",(ids.size()+currentCount)-ESTATE_MAX_ACCESS_IDS); LLNotificationsUtil::add("MaxAgentOnRegionBatch", args); delete change_info; @@ -1810,7 +1857,7 @@ void LLPanelEstateInfo::accessAddCore3(const uuid_vec_t& ids, LLEstateAccessChan LLSD args; args["NUM_ADDED"] = llformat("%d",ids.size()); args["MAX_AGENTS"] = llformat("%d",ESTATE_MAX_ACCESS_IDS); - args["LIST_TYPE"] = "Banned Residents"; + args["LIST_TYPE"] = LLTrans::getString("RegionInfoListTypeBannedAgents"); args["NUM_EXCESS"] = llformat("%d",(ids.size()+currentCount)-ESTATE_MAX_ACCESS_IDS); LLNotificationsUtil::add("MaxAgentOnRegionBatch", args); delete change_info; @@ -2337,16 +2384,18 @@ void LLPanelEstateInfo::getEstateOwner() class LLEstateChangeInfoResponder : public LLHTTPClient::ResponderWithResult { + LOG_CLASS(LLEstateChangeInfoResponder); public: LLEstateChangeInfoResponder(LLPanelEstateInfo* panel) { mpPanel = panel->getHandle(); } +protected: // if we get a normal response, handle it here - /*virtual*/ void httpSuccess(void) + virtual void httpSuccess() { - LL_INFOS("Windlight") << "Successfully committed estate info" << llendl; + LL_INFOS("Windlight") << "Successfully committed estate info" << LL_ENDL; // refresh the panel from the database LLPanelEstateInfo* panel = dynamic_cast(mpPanel.get()); @@ -2355,13 +2404,11 @@ public: } // if we get an error response - /*virtual*/ void httpFailure(void) + virtual void httpFailure() { - llinfos << "LLEstateChangeInfoResponder::error [status:" - << mStatus << "]: " << mReason << llendl; + LL_WARNS("Windlight") << dumpResponse() << LL_ENDL; } - /*virtual*/ AIHTTPTimeoutPolicy const& getHTTPTimeoutPolicy(void) const { return estateChangeInfoResponder_timeout; } /*virtual*/ char const* getName(void) const { return "LLEstateChangeInfoResponder"; } private: @@ -2931,9 +2978,10 @@ bool LLDispatchSetEstateAccess::operator()( } - std::string msg = llformat("Banned residents: (%d, max %d)", - totalBannedAgents, - ESTATE_MAX_ACCESS_IDS); + LLStringUtil::format_map_t args; + args["[BANNEDAGENTS]"] = llformat("%d", totalBannedAgents); + args["[MAXBANNED]"] = llformat("%d", ESTATE_MAX_ACCESS_IDS); + std::string msg = LLTrans::getString("RegionInfoBannedResidents", args); panel->getChild("ban_resident_label")->setValue(LLSD(msg)); if (banned_agent_name_list) @@ -2953,9 +3001,10 @@ bool LLDispatchSetEstateAccess::operator()( if (access_flags & ESTATE_ACCESS_MANAGERS) { - std::string msg = llformat("Estate Managers: (%d, max %d)", - num_estate_managers, - ESTATE_MAX_MANAGERS); + LLStringUtil::format_map_t args; + args["[ESTATEMANAGERS]"] = llformat("%d", num_estate_managers); + args["[MAXMANAGERS]"] = llformat("%d", ESTATE_MAX_MANAGERS); + std::string msg = LLTrans::getString("RegionInfoEstateManagers", args); panel->getChild("estate_manager_label")->setValue(LLSD(msg)); LLNameListCtrl* estate_manager_name_list = @@ -3586,12 +3635,9 @@ void LLFloaterRegionInfo::open() // We'll allow access to the estate tools for estate managers (and for the sim owner) if (gRlvHandler.hasBehaviour(RLV_BHVR_SHOWLOC)) { - LLViewerRegion* pRegion = gAgent.getRegion(); - if (!pRegion) - return; - + const LLViewerRegion* region(gAgent.getRegion()); // Should be able to call LLRegion::canManageEstate() but then we can fake god like - if ( (!pRegion->isEstateManager()) && (pRegion->getOwner() != gAgent.getID()) ) + if (!(region && region->isEstateManager() && region->getOwner() == gAgentID)) return; } diff --git a/indra/newview/llfloaterregioninfo.h b/indra/newview/llfloaterregioninfo.h index 00c672b9d..128deaebe 100644 --- a/indra/newview/llfloaterregioninfo.h +++ b/indra/newview/llfloaterregioninfo.h @@ -95,11 +95,15 @@ public: virtual void refresh(); void requestRegionInfo(); + void requestMeshRezInfo(); + +private: protected: LLFloaterRegionInfo(const LLSD& seed); ~LLFloaterRegionInfo(); +protected: void onTabSelected(const LLSD& param); void refreshFromRegion(LLViewerRegion* region); @@ -211,6 +215,7 @@ protected: static void onClickRestart(void* data); bool callbackRestart(const LLSD& notification, const LLSD& response); static void onClickCancelRestart(void* data); + static void onClickDebugConsole(void* data); private: LLUUID mTargetAvatar; @@ -229,6 +234,7 @@ public: virtual BOOL postBuild(); // LLPanel virtual bool refreshFromRegion(LLViewerRegion* region); // refresh local settings from region update from simulator + void setEnvControls(bool available); // Whether environment settings are available for this region BOOL validateTextureSizes(); diff --git a/indra/newview/llfloaterregionrestarting.cpp b/indra/newview/llfloaterregionrestarting.cpp index a5eeeeecc..98406389b 100644 --- a/indra/newview/llfloaterregionrestarting.cpp +++ b/indra/newview/llfloaterregionrestarting.cpp @@ -31,7 +31,6 @@ #include "lluictrlfactory.h" #include "llagent.h" #include "llagentcamera.h" -#include "llenvmanager.h" #include "llviewercontrol.h" #include "llviewerwindow.h" @@ -103,31 +102,49 @@ LLFloaterRegionRestarting::LLFloaterRegionRestarting(const LLSD& key) : { //buildFromFile("floater_region_restarting.xml"); LLUICtrlFactory::getInstance()->buildFloater(this, "floater_region_restarting.xml"); - - LLStringUtil::format_map_t args; - args["[NAME]"] = key["NAME"].asString(); - getChild("region_name")->setValue(getString("RegionName", args)); - mRestartSeconds = getChild("restart_seconds"); + mName = key["NAME"].asString(); // center(); - refresh(); - - mRegionChangedConnection = LLEnvManagerNew::instance().setRegionChangeCallback(boost::bind(&LLFloaterRegionRestarting::close, this, false)); - if (mSeconds <= 20) emergency_teleport(); // For emergency teleports } LLFloaterRegionRestarting::~LLFloaterRegionRestarting() { + if (sShakeState != SHAKE_DONE && sShakeState != SHAKE_START) // Finish shake if needed + { + gAgentCamera.resetView(TRUE, TRUE); + sShakeState = SHAKE_DONE; + } mRegionChangedConnection.disconnect(); } BOOL LLFloaterRegionRestarting::postBuild() { + mRegionChangedConnection = gAgent.addRegionChangedCallback(boost::bind(&LLFloaterRegionRestarting::regionChange, this)); + if (mSeconds <= 20) emergency_teleport(); // For emergency teleports + + LLStringUtil::format_map_t args; + std::string text; + + args["[NAME]"] = mName; + text = getString("RegionName", args); + LLTextBox* textbox = getChild("region_name"); + textbox->setValue(text); + + mRestartSeconds = getChild("restart_seconds"); + setBackgroundColor(gColors.getColor("NotifyCautionBoxColor")); sShakeState = SHAKE_START; + + refresh(); + return TRUE; } +void LLFloaterRegionRestarting::regionChange() +{ + close(); +} + BOOL LLFloaterRegionRestarting::tick() { refresh(); @@ -150,9 +167,9 @@ void LLFloaterRegionRestarting::draw() { LLFloater::draw(); - static const LLCachedControl alchemyRegionShake(gSavedSettings, "AlchemyRegionRestartShake", true); - if (!alchemyRegionShake || isMinimized()) // If we're minimized, leave the user alone - return; + static const LLCachedControl alchemyRegionShake(gSavedSettings, "AlchemyRegionRestartShake", true); + if (!alchemyRegionShake || isMinimized()) // If we're minimized, leave the user alone + return; const F32 SHAKE_INTERVAL = 0.025f; const F32 SHAKE_TOTAL_DURATION = 1.8f; // the length of the default alert tone for this @@ -213,16 +230,6 @@ void LLFloaterRegionRestarting::draw() } } -void LLFloaterRegionRestarting::onClose(bool app_quitting) -{ - if (sShakeState != SHAKE_DONE && sShakeState != SHAKE_START) // Finish shake if needed - { - gAgentCamera.resetView(TRUE, TRUE); - sShakeState = SHAKE_DONE; - } - LLFloater::onClose(app_quitting); -} - void LLFloaterRegionRestarting::updateTime(const U32& time) { mSeconds = time; diff --git a/indra/newview/llfloaterregionrestarting.h b/indra/newview/llfloaterregionrestarting.h index ee7cb1d30..663fe3809 100644 --- a/indra/newview/llfloaterregionrestarting.h +++ b/indra/newview/llfloaterregionrestarting.h @@ -45,10 +45,11 @@ private: virtual BOOL tick(); virtual void refresh(); virtual void draw(); - virtual void onClose(bool app_quitting); + virtual void regionChange(); class LLTextBox* mRestartSeconds; U32 mSeconds; + std::string mName; U32 mShakeIterations; F32 mShakeMagnitude; LLTimer mShakeTimer; diff --git a/indra/newview/llgroupactions.cpp b/indra/newview/llgroupactions.cpp index c93dbaa9d..7d6710b5a 100644 --- a/indra/newview/llgroupactions.cpp +++ b/indra/newview/llgroupactions.cpp @@ -40,7 +40,6 @@ #include "llpanelgroup.h" #include "llviewermessage.h" #include "groupchatlistener.h" -#include "hippolimits.h" // for getMaxAgentGroups // [RLVa:KB] - Checked: 2011-03-28 (RLVa-1.3.0) #include "llslurl.h" #include "rlvactions.h" @@ -239,7 +238,7 @@ void LLGroupActions::startCall(const LLUUID& group_id) // static void LLGroupActions::join(const LLUUID& group_id) { - if (gAgent.mGroups.count() >= gHippoLimits->getMaxAgentGroups()) //!gAgent.canJoinGroups() + if (!gAgent.canJoinGroups()) { LLNotificationsUtil::add("JoinedTooManyGroups"); return; diff --git a/indra/newview/llmenuoptionpathfindingrebakenavmesh.cpp b/indra/newview/llmenuoptionpathfindingrebakenavmesh.cpp index 0dea26fb7..4b08cae72 100644 --- a/indra/newview/llmenuoptionpathfindingrebakenavmesh.cpp +++ b/indra/newview/llmenuoptionpathfindingrebakenavmesh.cpp @@ -54,6 +54,8 @@ LLMenuOptionPathfindingRebakeNavmesh::LLMenuOptionPathfindingRebakeNavmesh() LLMenuOptionPathfindingRebakeNavmesh::~LLMenuOptionPathfindingRebakeNavmesh() { + if (mIsInitialized) + { if (mRebakeNavMeshMode == kRebakeNavMesh_RequestSent) { LL_WARNS("navmeshRebaking") << "During destruction of the LLMenuOptionPathfindingRebakeNavmesh " @@ -61,9 +63,6 @@ LLMenuOptionPathfindingRebakeNavmesh::~LLMenuOptionPathfindingRebakeNavmesh() << "to be received. This could contribute to a crash on exit." << LL_ENDL; } - llassert(!mIsInitialized); - if (mIsInitialized) - { quit(); } } @@ -80,7 +79,7 @@ void LLMenuOptionPathfindingRebakeNavmesh::initialize() if ( !mRegionCrossingSlot.connected() ) { - mRegionCrossingSlot = LLEnvManagerNew::getInstance()->setRegionChangeCallback(boost::bind(&LLMenuOptionPathfindingRebakeNavmesh::handleRegionBoundaryCrossed, this)); + mRegionCrossingSlot = gAgent.addRegionChangedCallback(boost::bind(&LLMenuOptionPathfindingRebakeNavmesh::handleRegionBoundaryCrossed, this)); } if (!mAgentStateSlot.connected()) @@ -93,8 +92,7 @@ void LLMenuOptionPathfindingRebakeNavmesh::initialize() void LLMenuOptionPathfindingRebakeNavmesh::quit() { - llassert(mIsInitialized); - if (mIsInitialized) + if (mIsInitialized) // Quitting from the login screen leaves this uninitialized { if (mNavMeshSlot.connected()) { @@ -174,51 +172,60 @@ void LLMenuOptionPathfindingRebakeNavmesh::handleAgentState(BOOL pCanRebakeRegio void LLMenuOptionPathfindingRebakeNavmesh::handleRebakeNavMeshResponse(bool pResponseStatus) { llassert(mIsInitialized); - if (getMode() == kRebakeNavMesh_RequestSent) + if (mIsInitialized) { - setMode(pResponseStatus ? kRebakeNavMesh_InProgress : kRebakeNavMesh_Default); - } + if (getMode() == kRebakeNavMesh_RequestSent) + { + setMode(pResponseStatus ? kRebakeNavMesh_InProgress : kRebakeNavMesh_Default); + } - if (!pResponseStatus) - { - LLNotificationsUtil::add("PathfindingCannotRebakeNavmesh"); + if (!pResponseStatus) + { + LLNotificationsUtil::add("PathfindingCannotRebakeNavmesh"); + } } } void LLMenuOptionPathfindingRebakeNavmesh::handleNavMeshStatus(const LLPathfindingNavMeshStatus &pNavMeshStatus) { llassert(mIsInitialized); - ERebakeNavMeshMode rebakeNavMeshMode = kRebakeNavMesh_Default; - if (pNavMeshStatus.isValid()) + if (mIsInitialized) { - switch (pNavMeshStatus.getStatus()) + ERebakeNavMeshMode rebakeNavMeshMode = kRebakeNavMesh_Default; + if (pNavMeshStatus.isValid()) { - case LLPathfindingNavMeshStatus::kPending : - case LLPathfindingNavMeshStatus::kRepending : - rebakeNavMeshMode = kRebakeNavMesh_Available; - break; - case LLPathfindingNavMeshStatus::kBuilding : - rebakeNavMeshMode = kRebakeNavMesh_InProgress; - break; - case LLPathfindingNavMeshStatus::kComplete : - rebakeNavMeshMode = kRebakeNavMesh_NotAvailable; - break; - default : - rebakeNavMeshMode = kRebakeNavMesh_Default; - llassert(0); - break; + switch (pNavMeshStatus.getStatus()) + { + case LLPathfindingNavMeshStatus::kPending : + case LLPathfindingNavMeshStatus::kRepending : + rebakeNavMeshMode = kRebakeNavMesh_Available; + break; + case LLPathfindingNavMeshStatus::kBuilding : + rebakeNavMeshMode = kRebakeNavMesh_InProgress; + break; + case LLPathfindingNavMeshStatus::kComplete : + rebakeNavMeshMode = kRebakeNavMesh_NotAvailable; + break; + default: + rebakeNavMeshMode = kRebakeNavMesh_Default; + llassert(0); + break; + } } - } - setMode(rebakeNavMeshMode); + setMode(rebakeNavMeshMode); + } } void LLMenuOptionPathfindingRebakeNavmesh::handleRegionBoundaryCrossed() { llassert(mIsInitialized); - createNavMeshStatusListenerForCurrentRegion(); - mCanRebakeRegion = FALSE; - LLPathfindingManager::getInstance()->requestGetAgentState(); + if (mIsInitialized) + { + createNavMeshStatusListenerForCurrentRegion(); + mCanRebakeRegion = FALSE; + LLPathfindingManager::getInstance()->requestGetAgentState(); + } } void LLMenuOptionPathfindingRebakeNavmesh::createNavMeshStatusListenerForCurrentRegion() @@ -235,3 +242,4 @@ void LLMenuOptionPathfindingRebakeNavmesh::createNavMeshStatusListenerForCurrent LLPathfindingManager::getInstance()->requestGetNavMeshForRegion(currentRegion, true); } } + diff --git a/indra/newview/llmutelist.cpp b/indra/newview/llmutelist.cpp index 99b541b23..723a9cc94 100644 --- a/indra/newview/llmutelist.cpp +++ b/indra/newview/llmutelist.cpp @@ -65,7 +65,6 @@ #include "lluistring.h" #include "llviewerobject.h" #include "llviewerobjectlist.h" -#include "llenvmanager.h" namespace { @@ -235,7 +234,7 @@ LLMuteList::LLMuteList() : gGenericDispatcher.addHandler("emptymutelist", &sDispatchEmptyMuteList); checkNewRegion(); - LLEnvManagerNew::instance().setRegionChangeCallback(boost::bind(&LLMuteList::checkNewRegion, this)); + gAgent.addRegionChangedCallback(boost::bind(&LLMuteList::checkNewRegion, this)); } //----------------------------------------------------------------------------- diff --git a/indra/newview/llpanelavatar.cpp b/indra/newview/llpanelavatar.cpp index 94cd97200..60e6768e9 100644 --- a/indra/newview/llpanelavatar.cpp +++ b/indra/newview/llpanelavatar.cpp @@ -1631,12 +1631,12 @@ void LLPanelAvatar::resetGroupList() group_list->deleteAllItems(); - S32 count = gAgent.mGroups.count(); + S32 count = gAgent.mGroups.size(); LLUUID id; for(S32 i = 0; i < count; ++i) { - LLGroupData group_data = gAgent.mGroups.get(i); + LLGroupData group_data = gAgent.mGroups[i]; id = group_data.mID; std::string group_string; /* Show group title? DUMMY_POWER for Don Grep diff --git a/indra/newview/llpathfindingmanager.cpp b/indra/newview/llpathfindingmanager.cpp index 79147655b..5e1bb5c6a 100644 --- a/indra/newview/llpathfindingmanager.cpp +++ b/indra/newview/llpathfindingmanager.cpp @@ -56,15 +56,6 @@ #include "llviewerregion.h" #include "llweb.h" -class AIHTTPTimeoutPolicy; -extern AIHTTPTimeoutPolicy navMeshStatusResponder_timeout; -extern AIHTTPTimeoutPolicy navMeshResponder_timeout; -extern AIHTTPTimeoutPolicy agentStateResponder_timeout; -extern AIHTTPTimeoutPolicy navMeshRebakeResponder_timeout; -extern AIHTTPTimeoutPolicy objectLinksetsResponder_timeout; -extern AIHTTPTimeoutPolicy terrainLinksetsResponder_timeout; -extern AIHTTPTimeoutPolicy charactersResponder_timeout; - #define CAP_SERVICE_RETRIEVE_NAVMESH "RetrieveNavMeshSrc" #define CAP_SERVICE_NAVMESH_STATUS "NavMeshGenerationStatus" @@ -112,19 +103,18 @@ LLHTTPRegistration gHTTPRegistrationAgentStateChangeNode class NavMeshStatusResponder : public LLHTTPClient::ResponderWithResult { + LOG_CLASS(NavMeshStatusResponder); public: - NavMeshStatusResponder(const std::string &pCapabilityURL, LLViewerRegion *pRegion, bool pIsGetStatusOnly); + NavMeshStatusResponder(LLViewerRegion *pRegion, bool pIsGetStatusOnly); virtual ~NavMeshStatusResponder(); - /*virtual*/ void httpSuccess(void); - /*virtual*/ void httpFailure(void); - /*virtual*/ AIHTTPTimeoutPolicy const& getHTTPTimeoutPolicy(void) const { return navMeshStatusResponder_timeout; } /*virtual*/ char const* getName(void) const { return "NavMeshStatusResponder"; } protected: + virtual void httpSuccess(); + virtual void httpFailure(); private: - std::string mCapabilityURL; LLViewerRegion *mRegion; LLUUID mRegionUUID; bool mIsGetStatusOnly; @@ -136,19 +126,18 @@ private: class NavMeshResponder : public LLHTTPClient::ResponderWithResult { + LOG_CLASS(NavMeshResponder); public: - NavMeshResponder(const std::string &pCapabilityURL, U32 pNavMeshVersion, LLPathfindingNavMeshPtr pNavMeshPtr); + NavMeshResponder(U32 pNavMeshVersion, LLPathfindingNavMeshPtr pNavMeshPtr); virtual ~NavMeshResponder(); - /*virtual*/ void httpSuccess(void); - /*virtual*/ void httpFailure(void); - /*virtual*/ AIHTTPTimeoutPolicy const& getHTTPTimeoutPolicy(void) const { return navMeshResponder_timeout; } /*virtual*/ char const* getName(void) const { return "NavMeshResponder"; } protected: + virtual void httpSuccess(); + virtual void httpFailure(); private: - std::string mCapabilityURL; U32 mNavMeshVersion; LLPathfindingNavMeshPtr mNavMeshPtr; }; @@ -159,19 +148,16 @@ private: class AgentStateResponder : public LLHTTPClient::ResponderWithResult { + LOG_CLASS(AgentStateResponder); public: - AgentStateResponder(const std::string &pCapabilityURL); + AgentStateResponder(); virtual ~AgentStateResponder(); - /*virtual*/ void httpSuccess(void); - /*virtual*/ void httpFailure(void); - /*virtual*/ AIHTTPTimeoutPolicy const& getHTTPTimeoutPolicy(void) const { return agentStateResponder_timeout; } /*virtual*/ char const* getName(void) const { return "AgentStateResponder"; } protected: - -private: - std::string mCapabilityURL; + virtual void httpSuccess(); + virtual void httpFailure(); }; @@ -180,19 +166,18 @@ private: //--------------------------------------------------------------------------- class NavMeshRebakeResponder : public LLHTTPClient::ResponderWithResult { + LOG_CLASS(NavMeshRebakeResponder); public: - NavMeshRebakeResponder(const std::string &pCapabilityURL, LLPathfindingManager::rebake_navmesh_callback_t pRebakeNavMeshCallback); + NavMeshRebakeResponder(LLPathfindingManager::rebake_navmesh_callback_t pRebakeNavMeshCallback); virtual ~NavMeshRebakeResponder(); - /*virtual*/ void httpSuccess(void); - /*virtual*/ void httpFailure(void); - /*virtual*/ AIHTTPTimeoutPolicy const& getHTTPTimeoutPolicy(void) const { return navMeshRebakeResponder_timeout; } /*virtual*/ char const* getName(void) const { return "NavMeshRebakeResponder"; } protected: + virtual void httpSuccess(); + virtual void httpFailure(); private: - std::string mCapabilityURL; LLPathfindingManager::rebake_navmesh_callback_t mRebakeNavMeshCallback; }; @@ -207,9 +192,9 @@ public: virtual ~LinksetsResponder(); void handleObjectLinksetsResult(const LLSD &pContent); - void handleObjectLinksetsError(U32 pStatus, const std::string &pReason, const std::string &pURL); + void handleObjectLinksetsError(); void handleTerrainLinksetsResult(const LLSD &pContent); - void handleTerrainLinksetsError(U32 pStatus, const std::string &pReason, const std::string &pURL); + void handleTerrainLinksetsError(); protected: @@ -241,19 +226,18 @@ typedef boost::shared_ptr LinksetsResponderPtr; //--------------------------------------------------------------------------- class ObjectLinksetsResponder : public LLHTTPClient::ResponderWithResult { + LOG_CLASS(ObjectLinksetsResponder); public: - ObjectLinksetsResponder(const std::string &pCapabilityURL, LinksetsResponderPtr pLinksetsResponsderPtr); + ObjectLinksetsResponder(LinksetsResponderPtr pLinksetsResponsderPtr); virtual ~ObjectLinksetsResponder(); - /*virtual*/ void httpSuccess(void); - /*virtual*/ void httpFailure(void); - /*virtual*/ AIHTTPTimeoutPolicy const& getHTTPTimeoutPolicy(void) const { return objectLinksetsResponder_timeout; } /*virtual*/ char const* getName(void) const { return "ObjectLinksetsResponder"; } protected: + virtual void httpSuccess(); + virtual void httpFailure(); private: - std::string mCapabilityURL; LinksetsResponderPtr mLinksetsResponsderPtr; }; @@ -262,19 +246,18 @@ private: //--------------------------------------------------------------------------- class TerrainLinksetsResponder : public LLHTTPClient::ResponderWithResult { + LOG_CLASS(TerrainLinksetsResponder); public: - TerrainLinksetsResponder(const std::string &pCapabilityURL, LinksetsResponderPtr pLinksetsResponsderPtr); + TerrainLinksetsResponder(LinksetsResponderPtr pLinksetsResponsderPtr); virtual ~TerrainLinksetsResponder(); - /*virtual*/ void httpSuccess(void); - /*virtual*/ void httpFailure(void); - /*virtual*/ AIHTTPTimeoutPolicy const& getHTTPTimeoutPolicy(void) const { return terrainLinksetsResponder_timeout; } /*virtual*/ char const* getName(void) const { return "TerrainLinksetsResponder"; } protected: + virtual void httpSuccess(); + virtual void httpFailure(); private: - std::string mCapabilityURL; LinksetsResponderPtr mLinksetsResponsderPtr; }; @@ -283,19 +266,18 @@ private: //--------------------------------------------------------------------------- class CharactersResponder : public LLHTTPClient::ResponderWithResult { + LOG_CLASS(TerrainLinksetsResponder); public: - CharactersResponder(const std::string &pCapabilityURL, LLPathfindingManager::request_id_t pRequestId, LLPathfindingManager::object_request_callback_t pCharactersCallback); + CharactersResponder(LLPathfindingManager::request_id_t pRequestId, LLPathfindingManager::object_request_callback_t pCharactersCallback); virtual ~CharactersResponder(); - /*virtual*/ void httpSuccess(void); - /*virtual*/ void httpFailure(void); - /*virtual*/ AIHTTPTimeoutPolicy const& getHTTPTimeoutPolicy(void) const { return charactersResponder_timeout; } /*virtual*/ char const* getName(void) const { return "CharactersResponder"; } protected: + virtual void httpSuccess(); + virtual void httpFailure(); private: - std::string mCapabilityURL; LLPathfindingManager::request_id_t mRequestId; LLPathfindingManager::object_request_callback_t mCharactersCallback; }; @@ -382,7 +364,7 @@ void LLPathfindingManager::requestGetNavMeshForRegion(LLViewerRegion *pRegion, b std::string navMeshStatusURL = getNavMeshStatusURLForRegion(pRegion); llassert(!navMeshStatusURL.empty()); navMeshPtr->handleNavMeshCheckVersion(); - LLHTTPClient::ResponderPtr navMeshStatusResponder = new NavMeshStatusResponder(navMeshStatusURL, pRegion, pIsGetStatusOnly); + LLHTTPClient::ResponderPtr navMeshStatusResponder = new NavMeshStatusResponder(pRegion, pIsGetStatusOnly); LLHTTPClient::get(navMeshStatusURL, navMeshStatusResponder); } } @@ -416,12 +398,12 @@ void LLPathfindingManager::requestGetLinksets(request_id_t pRequestId, object_re bool doRequestTerrain = isAllowViewTerrainProperties(); LinksetsResponderPtr linksetsResponderPtr(new LinksetsResponder(pRequestId, pLinksetsCallback, true, doRequestTerrain)); - LLHTTPClient::ResponderPtr objectLinksetsResponder = new ObjectLinksetsResponder(objectLinksetsURL, linksetsResponderPtr); + LLHTTPClient::ResponderPtr objectLinksetsResponder = new ObjectLinksetsResponder(linksetsResponderPtr); LLHTTPClient::get(objectLinksetsURL, objectLinksetsResponder); if (doRequestTerrain) { - LLHTTPClient::ResponderPtr terrainLinksetsResponder = new TerrainLinksetsResponder(terrainLinksetsURL, linksetsResponderPtr); + LLHTTPClient::ResponderPtr terrainLinksetsResponder = new TerrainLinksetsResponder(linksetsResponderPtr); LLHTTPClient::get(terrainLinksetsURL, terrainLinksetsResponder); } } @@ -465,13 +447,13 @@ void LLPathfindingManager::requestSetLinksets(request_id_t pRequestId, const LLP if (!objectPostData.isUndefined()) { - LLHTTPClient::ResponderPtr objectLinksetsResponder = new ObjectLinksetsResponder(objectLinksetsURL, linksetsResponderPtr); + LLHTTPClient::ResponderPtr objectLinksetsResponder = new ObjectLinksetsResponder(linksetsResponderPtr); LLHTTPClient::put(objectLinksetsURL, objectPostData, objectLinksetsResponder); } if (!terrainPostData.isUndefined()) { - LLHTTPClient::ResponderPtr terrainLinksetsResponder = new TerrainLinksetsResponder(terrainLinksetsURL, linksetsResponderPtr); + LLHTTPClient::ResponderPtr terrainLinksetsResponder = new TerrainLinksetsResponder(linksetsResponderPtr); LLHTTPClient::put(terrainLinksetsURL, terrainPostData, terrainLinksetsResponder); } } @@ -504,7 +486,7 @@ void LLPathfindingManager::requestGetCharacters(request_id_t pRequestId, object_ { pCharactersCallback(pRequestId, kRequestStarted, emptyCharacterListPtr); - LLHTTPClient::ResponderPtr charactersResponder = new CharactersResponder(charactersURL, pRequestId, pCharactersCallback); + LLHTTPClient::ResponderPtr charactersResponder = new CharactersResponder(pRequestId, pCharactersCallback); LLHTTPClient::get(charactersURL, charactersResponder); } } @@ -537,7 +519,7 @@ void LLPathfindingManager::requestGetAgentState() { std::string agentStateURL = getAgentStateURLForRegion(currentRegion); llassert(!agentStateURL.empty()); - LLHTTPClient::ResponderPtr responder = new AgentStateResponder(agentStateURL); + LLHTTPClient::ResponderPtr responder = new AgentStateResponder(); LLHTTPClient::get(agentStateURL, responder); } } @@ -561,7 +543,7 @@ void LLPathfindingManager::requestRebakeNavMesh(rebake_navmesh_callback_t pRebak llassert(!navMeshStatusURL.empty()); LLSD postData; postData["command"] = "rebuild"; - LLHTTPClient::ResponderPtr responder = new NavMeshRebakeResponder(navMeshStatusURL, pRebakeNavMeshCallback); + LLHTTPClient::ResponderPtr responder = new NavMeshRebakeResponder(pRebakeNavMeshCallback); LLHTTPClient::post(navMeshStatusURL, postData, responder); } } @@ -583,7 +565,7 @@ void LLPathfindingManager::sendRequestGetNavMeshForRegion(LLPathfindingNavMeshPt else { navMeshPtr->handleNavMeshStart(pNavMeshStatus); - LLHTTPClient::ResponderPtr responder = new NavMeshResponder(navMeshURL, pNavMeshStatus.getVersion(), navMeshPtr); + LLHTTPClient::ResponderPtr responder = new NavMeshResponder(pNavMeshStatus.getVersion(), navMeshPtr); LLSD postData; LLHTTPClient::post(navMeshURL, postData, responder); @@ -797,8 +779,8 @@ void LLAgentStateChangeNode::post(ResponsePtr pResponse, const LLSD &pContext, c // NavMeshStatusResponder //--------------------------------------------------------------------------- -NavMeshStatusResponder::NavMeshStatusResponder(const std::string &pCapabilityURL, LLViewerRegion *pRegion, bool pIsGetStatusOnly) : - mCapabilityURL(pCapabilityURL), +NavMeshStatusResponder::NavMeshStatusResponder(LLViewerRegion *pRegion, bool pIsGetStatusOnly) + : mRegion(pRegion), mRegionUUID(), mIsGetStatusOnly(pIsGetStatusOnly) @@ -813,15 +795,15 @@ NavMeshStatusResponder::~NavMeshStatusResponder() { } -void NavMeshStatusResponder::httpSuccess(void) +void NavMeshStatusResponder::httpSuccess() { - LLPathfindingNavMeshStatus navMeshStatus(mRegionUUID, mContent); + LLPathfindingNavMeshStatus navMeshStatus(mRegionUUID, getContent()); LLPathfindingManager::getInstance()->handleNavMeshStatusRequest(navMeshStatus, mRegion, mIsGetStatusOnly); } -void NavMeshStatusResponder::httpFailure(void) +void NavMeshStatusResponder::httpFailure() { - llwarns << "error with request to URL '" << mCapabilityURL << "' because " << mReason << " (statusCode:" << mStatus << ")" << llendl; + llwarns << dumpResponse() << llendl; LLPathfindingNavMeshStatus navMeshStatus(mRegionUUID); LLPathfindingManager::getInstance()->handleNavMeshStatusRequest(navMeshStatus, mRegion, mIsGetStatusOnly); } @@ -830,8 +812,8 @@ void NavMeshStatusResponder::httpFailure(void) // NavMeshResponder //--------------------------------------------------------------------------- -NavMeshResponder::NavMeshResponder(const std::string &pCapabilityURL, U32 pNavMeshVersion, LLPathfindingNavMeshPtr pNavMeshPtr) : - mCapabilityURL(pCapabilityURL), +NavMeshResponder::NavMeshResponder(U32 pNavMeshVersion, LLPathfindingNavMeshPtr pNavMeshPtr) + : mNavMeshVersion(pNavMeshVersion), mNavMeshPtr(pNavMeshPtr) { @@ -841,21 +823,22 @@ NavMeshResponder::~NavMeshResponder() { } -void NavMeshResponder::httpSuccess(void) +void NavMeshResponder::httpSuccess() { - mNavMeshPtr->handleNavMeshResult(mContent, mNavMeshVersion); + mNavMeshPtr->handleNavMeshResult(getContent(), mNavMeshVersion); } -void NavMeshResponder::httpFailure(void) +void NavMeshResponder::httpFailure() { - mNavMeshPtr->handleNavMeshError(mStatus, mReason, mCapabilityURL, mNavMeshVersion); + llwarns << dumpResponse() << llendl; + mNavMeshPtr->handleNavMeshError(mNavMeshVersion); } //--------------------------------------------------------------------------- // AgentStateResponder //--------------------------------------------------------------------------- -AgentStateResponder::AgentStateResponder(const std::string &pCapabilityURL) : mCapabilityURL(pCapabilityURL) +AgentStateResponder::AgentStateResponder() { } @@ -863,17 +846,18 @@ AgentStateResponder::~AgentStateResponder() { } -void AgentStateResponder::httpSuccess(void) +void AgentStateResponder::httpSuccess() { - llassert(mContent.has(AGENT_STATE_CAN_REBAKE_REGION_FIELD)); - llassert(mContent.get(AGENT_STATE_CAN_REBAKE_REGION_FIELD).isBoolean()); - BOOL canRebakeRegion = mContent.get(AGENT_STATE_CAN_REBAKE_REGION_FIELD).asBoolean(); + const LLSD& pContent = getContent(); + llassert(pContent.has(AGENT_STATE_CAN_REBAKE_REGION_FIELD)); + llassert(pContent.get(AGENT_STATE_CAN_REBAKE_REGION_FIELD).isBoolean()); + BOOL canRebakeRegion = pContent.get(AGENT_STATE_CAN_REBAKE_REGION_FIELD).asBoolean(); LLPathfindingManager::getInstance()->handleAgentState(canRebakeRegion); } -void AgentStateResponder::httpFailure(void) +void AgentStateResponder::httpFailure() { - llwarns << "error with request to URL '" << mCapabilityURL << "' because " << mReason << " (statusCode:" << mStatus << ")" << llendl; + llwarns << dumpResponse() << llendl; LLPathfindingManager::getInstance()->handleAgentState(FALSE); } @@ -881,8 +865,8 @@ void AgentStateResponder::httpFailure(void) //--------------------------------------------------------------------------- // navmesh rebake responder //--------------------------------------------------------------------------- -NavMeshRebakeResponder::NavMeshRebakeResponder(const std::string &pCapabilityURL, LLPathfindingManager::rebake_navmesh_callback_t pRebakeNavMeshCallback) : - mCapabilityURL(pCapabilityURL), +NavMeshRebakeResponder::NavMeshRebakeResponder(LLPathfindingManager::rebake_navmesh_callback_t pRebakeNavMeshCallback) + : mRebakeNavMeshCallback(pRebakeNavMeshCallback) { } @@ -891,14 +875,14 @@ NavMeshRebakeResponder::~NavMeshRebakeResponder() { } -void NavMeshRebakeResponder::httpSuccess(void) +void NavMeshRebakeResponder::httpSuccess() { mRebakeNavMeshCallback(true); } -void NavMeshRebakeResponder::httpFailure(void) +void NavMeshRebakeResponder::httpFailure() { - llwarns << "error with request to URL '" << mCapabilityURL << "' because " << mReason << " (statusCode:" << mStatus << ")" << llendl; + llwarns << dumpResponse() << llendl; mRebakeNavMeshCallback(false); } @@ -931,9 +915,9 @@ void LinksetsResponder::handleObjectLinksetsResult(const LLSD &pContent) } } -void LinksetsResponder::handleObjectLinksetsError(U32 pStatus, const std::string &pReason, const std::string &pURL) +void LinksetsResponder::handleObjectLinksetsError() { - llwarns << "error with request to URL '" << pURL << "' because " << pReason << " (statusCode:" << pStatus << ")" << llendl; + llwarns << "LinksetsResponder object linksets error" << llendl; mObjectMessagingState = kReceivedError; if (mTerrainMessagingState != kWaiting) { @@ -952,8 +936,9 @@ void LinksetsResponder::handleTerrainLinksetsResult(const LLSD &pContent) } } -void LinksetsResponder::handleTerrainLinksetsError(U32 pStatus, const std::string &pReason, const std::string &pURL) +void LinksetsResponder::handleTerrainLinksetsError() { + llwarns << "LinksetsResponder terrain linksets error" << llendl; mTerrainMessagingState = kReceivedError; if (mObjectMessagingState != kWaiting) { @@ -987,8 +972,8 @@ void LinksetsResponder::sendCallback() // ObjectLinksetsResponder //--------------------------------------------------------------------------- -ObjectLinksetsResponder::ObjectLinksetsResponder(const std::string &pCapabilityURL, LinksetsResponderPtr pLinksetsResponsderPtr) : - mCapabilityURL(pCapabilityURL), +ObjectLinksetsResponder::ObjectLinksetsResponder(LinksetsResponderPtr pLinksetsResponsderPtr) + : mLinksetsResponsderPtr(pLinksetsResponsderPtr) { } @@ -997,22 +982,23 @@ ObjectLinksetsResponder::~ObjectLinksetsResponder() { } -void ObjectLinksetsResponder::httpSuccess(void) +void ObjectLinksetsResponder::httpSuccess() { - mLinksetsResponsderPtr->handleObjectLinksetsResult(mContent); + mLinksetsResponsderPtr->handleObjectLinksetsResult(getContent()); } -void ObjectLinksetsResponder::httpFailure(void) +void ObjectLinksetsResponder::httpFailure() { - mLinksetsResponsderPtr->handleObjectLinksetsError(mStatus, mReason, mCapabilityURL); + llwarns << dumpResponse() << llendl; + mLinksetsResponsderPtr->handleObjectLinksetsError(); } //--------------------------------------------------------------------------- // TerrainLinksetsResponder //--------------------------------------------------------------------------- -TerrainLinksetsResponder::TerrainLinksetsResponder(const std::string &pCapabilityURL, LinksetsResponderPtr pLinksetsResponsderPtr) : - mCapabilityURL(pCapabilityURL), +TerrainLinksetsResponder::TerrainLinksetsResponder(LinksetsResponderPtr pLinksetsResponsderPtr) + : mLinksetsResponsderPtr(pLinksetsResponsderPtr) { } @@ -1021,22 +1007,23 @@ TerrainLinksetsResponder::~TerrainLinksetsResponder() { } -void TerrainLinksetsResponder::httpSuccess(void) +void TerrainLinksetsResponder::httpSuccess() { - mLinksetsResponsderPtr->handleTerrainLinksetsResult(mContent); + mLinksetsResponsderPtr->handleTerrainLinksetsResult(getContent()); } -void TerrainLinksetsResponder::httpFailure(void) +void TerrainLinksetsResponder::httpFailure() { - mLinksetsResponsderPtr->handleTerrainLinksetsError(mStatus, mReason, mCapabilityURL); + llwarns << dumpResponse() << llendl; + mLinksetsResponsderPtr->handleTerrainLinksetsError(); } //--------------------------------------------------------------------------- // CharactersResponder //--------------------------------------------------------------------------- -CharactersResponder::CharactersResponder(const std::string &pCapabilityURL, LLPathfindingManager::request_id_t pRequestId, LLPathfindingManager::object_request_callback_t pCharactersCallback) : - mCapabilityURL(pCapabilityURL), +CharactersResponder::CharactersResponder(LLPathfindingManager::request_id_t pRequestId, LLPathfindingManager::object_request_callback_t pCharactersCallback) + : mRequestId(pRequestId), mCharactersCallback(pCharactersCallback) { @@ -1046,15 +1033,15 @@ CharactersResponder::~CharactersResponder() { } -void CharactersResponder::httpSuccess(void) +void CharactersResponder::httpSuccess() { - LLPathfindingObjectListPtr characterListPtr = LLPathfindingObjectListPtr(new LLPathfindingCharacterList(mContent)); + LLPathfindingObjectListPtr characterListPtr = LLPathfindingObjectListPtr(new LLPathfindingCharacterList(getContent())); mCharactersCallback(mRequestId, LLPathfindingManager::kRequestCompleted, characterListPtr); } -void CharactersResponder::httpFailure(void) +void CharactersResponder::httpFailure() { - llwarns << "error with request to URL '" << mCapabilityURL << "' because " << mReason << " (statusCode:" << mStatus << ")" << llendl; + llwarns << dumpResponse() << llendl; LLPathfindingObjectListPtr characterListPtr = LLPathfindingObjectListPtr(new LLPathfindingCharacterList()); mCharactersCallback(mRequestId, LLPathfindingManager::kRequestError, characterListPtr); diff --git a/indra/newview/llpathfindingnavmesh.cpp b/indra/newview/llpathfindingnavmesh.cpp index e01dd3a15..555105cf4 100644 --- a/indra/newview/llpathfindingnavmesh.cpp +++ b/indra/newview/llpathfindingnavmesh.cpp @@ -184,9 +184,8 @@ void LLPathfindingNavMesh::handleNavMeshError() setRequestStatus(kNavMeshRequestError); } -void LLPathfindingNavMesh::handleNavMeshError(U32 pStatus, const std::string &pReason, const std::string &pURL, U32 pNavMeshVersion) +void LLPathfindingNavMesh::handleNavMeshError(U32 pNavMeshVersion) { - llwarns << "error with request to URL '" << pURL << "' because " << pReason << " (statusCode:" << pStatus << ")" << llendl; if (mNavMeshStatus.getVersion() == pNavMeshVersion) { handleNavMeshError(); diff --git a/indra/newview/llpathfindingnavmesh.h b/indra/newview/llpathfindingnavmesh.h index 7a844f54c..87f32b8d5 100644 --- a/indra/newview/llpathfindingnavmesh.h +++ b/indra/newview/llpathfindingnavmesh.h @@ -74,7 +74,7 @@ public: void handleNavMeshResult(const LLSD &pContent, U32 pNavMeshVersion); void handleNavMeshNotEnabled(); void handleNavMeshError(); - void handleNavMeshError(U32 pStatus, const std::string &pReason, const std::string &pURL, U32 pNavMeshVersion); + void handleNavMeshError(U32 pNavMeshVersion); protected: diff --git a/indra/newview/llstatusbar.cpp b/indra/newview/llstatusbar.cpp index d15900993..78ce1c0bd 100644 --- a/indra/newview/llstatusbar.cpp +++ b/indra/newview/llstatusbar.cpp @@ -38,7 +38,6 @@ #include "llagent.h" #include "llbutton.h" #include "llcommandhandler.h" -#include "llenvmanager.h" #include "llfloaterbuycurrency.h" #include "llfloaterchat.h" #include "llfloaterinventory.h" @@ -235,7 +234,7 @@ mIsNavMeshDirty(false) LLButton* buybtn = getChild("buycurrency"); buybtn->setLabelArg("[CURRENCY]", gHippoGridManager->getConnectedGrid()->getCurrencySymbol()); - mRegionCrossingSlot = LLEnvManagerNew::getInstance()->setRegionChangeCallback(boost::bind(&LLStatusBar::createNavMeshStatusListenerForCurrentRegion, this)); + mRegionCrossingSlot = gAgent.addRegionChangedCallback(boost::bind(&LLStatusBar::createNavMeshStatusListenerForCurrentRegion, this)); createNavMeshStatusListenerForCurrentRegion(); // Adding Net Stat Graph diff --git a/indra/newview/llviewerkeyboard.cpp b/indra/newview/llviewerkeyboard.cpp index 5104f7972..dd31b6990 100644 --- a/indra/newview/llviewerkeyboard.cpp +++ b/indra/newview/llviewerkeyboard.cpp @@ -45,7 +45,6 @@ #include "lltoolfocus.h" #include "llviewerwindow.h" #include "llvoavatarself.h" -#include "lllslconstants.h" // // Constants @@ -59,6 +58,11 @@ const S32 NUDGE_FRAMES = 2; const F32 ORBIT_NUDGE_RATE = 0.05f; // fraction of normal speed const F32 YAW_NUDGE_RATE = 0.05f; // fraction of normal speed +struct LLKeyboardActionRegistry +: public LLRegistrySingleton, LLKeyboardActionRegistry> +{ +}; + LLViewerKeyboard gViewerKeyboard; void agent_jump( EKeystate s ) @@ -66,6 +70,7 @@ void agent_jump( EKeystate s ) if( KEYSTATE_UP == s ) return; F32 time = gKeyboard->getCurKeyElapsedTime(); S32 frame_count = llround(gKeyboard->getCurKeyElapsedFrameCount()); + if( time < FLY_TIME || frame_count <= FLY_FRAMES || gAgent.upGrabbed() @@ -81,9 +86,9 @@ void agent_jump( EKeystate s ) } void agent_toggle_down( EKeystate s ) { - if(KEYSTATE_UP == s) return; - - if(KEYSTATE_DOWN == s && !gAgent.getFlying() && gSavedSettings.getBOOL("SGShiftCrouchToggle")) + if (KEYSTATE_UP == s) return; + + if (KEYSTATE_DOWN == s && !gAgent.getFlying() && gSavedSettings.getBOOL("SGShiftCrouchToggle")) { gAgent.toggleCrouch(); } @@ -242,7 +247,7 @@ void agent_toggle_fly( EKeystate s ) // Only catch the edge if (KEYSTATE_DOWN == s ) { - gAgent.toggleFlying(); + LLAgent::toggleFlying(); } } @@ -252,7 +257,7 @@ F32 get_orbit_rate() if( time < NUDGE_TIME ) { F32 rate = ORBIT_NUDGE_RATE + time * (1 - ORBIT_NUDGE_RATE)/ NUDGE_TIME; - //llinfos << rate << llendl; + //LL_INFOS() << rate << LL_ENDL; return rate; } else @@ -517,6 +522,11 @@ void stop_moving( EKeystate s ) void start_chat( EKeystate s ) { + if (LLAppViewer::instance()->quitRequested()) + { + return; // can't talk, gotta go, kthxbye! + } + // start chat gChatBar->startChat(NULL); } @@ -540,53 +550,51 @@ void start_gesture( EKeystate s ) } } -void bind_keyboard_functions() -{ - gViewerKeyboard.bindNamedFunction("jump", agent_jump); - gViewerKeyboard.bindNamedFunction("push_down", agent_push_down); - gViewerKeyboard.bindNamedFunction("push_forward", agent_push_forward); - gViewerKeyboard.bindNamedFunction("push_backward", agent_push_backward); - gViewerKeyboard.bindNamedFunction("look_up", agent_look_up); - gViewerKeyboard.bindNamedFunction("look_down", agent_look_down); - gViewerKeyboard.bindNamedFunction("toggle_down", agent_toggle_down); - gViewerKeyboard.bindNamedFunction("toggle_fly", agent_toggle_fly); - gViewerKeyboard.bindNamedFunction("turn_left", agent_turn_left); - gViewerKeyboard.bindNamedFunction("turn_right", agent_turn_right); - gViewerKeyboard.bindNamedFunction("slide_left", agent_slide_left); - gViewerKeyboard.bindNamedFunction("slide_right", agent_slide_right); - gViewerKeyboard.bindNamedFunction("spin_around_ccw", camera_spin_around_ccw); - gViewerKeyboard.bindNamedFunction("spin_around_cw", camera_spin_around_cw); - gViewerKeyboard.bindNamedFunction("spin_around_ccw_sitting", camera_spin_around_ccw_sitting); - gViewerKeyboard.bindNamedFunction("spin_around_cw_sitting", camera_spin_around_cw_sitting); - gViewerKeyboard.bindNamedFunction("spin_over", camera_spin_over); - gViewerKeyboard.bindNamedFunction("spin_under", camera_spin_under); - gViewerKeyboard.bindNamedFunction("spin_over_sitting", camera_spin_over_sitting); - gViewerKeyboard.bindNamedFunction("spin_under_sitting", camera_spin_under_sitting); - gViewerKeyboard.bindNamedFunction("move_forward", camera_move_forward); - gViewerKeyboard.bindNamedFunction("move_backward", camera_move_backward); - gViewerKeyboard.bindNamedFunction("move_forward_sitting", camera_move_forward_sitting); - gViewerKeyboard.bindNamedFunction("move_backward_sitting", camera_move_backward_sitting); - gViewerKeyboard.bindNamedFunction("pan_up", camera_pan_up); - gViewerKeyboard.bindNamedFunction("pan_down", camera_pan_down); - gViewerKeyboard.bindNamedFunction("pan_left", camera_pan_left); - gViewerKeyboard.bindNamedFunction("pan_right", camera_pan_right); - gViewerKeyboard.bindNamedFunction("pan_in", camera_pan_in); - gViewerKeyboard.bindNamedFunction("pan_out", camera_pan_out); - gViewerKeyboard.bindNamedFunction("move_forward_fast", camera_move_forward_fast); - gViewerKeyboard.bindNamedFunction("move_backward_fast", camera_move_backward_fast); - gViewerKeyboard.bindNamedFunction("edit_avatar_spin_ccw", edit_avatar_spin_ccw); - gViewerKeyboard.bindNamedFunction("edit_avatar_spin_cw", edit_avatar_spin_cw); - gViewerKeyboard.bindNamedFunction("edit_avatar_spin_over", edit_avatar_spin_over); - gViewerKeyboard.bindNamedFunction("edit_avatar_spin_under", edit_avatar_spin_under); - gViewerKeyboard.bindNamedFunction("edit_avatar_move_forward", edit_avatar_move_forward); - gViewerKeyboard.bindNamedFunction("edit_avatar_move_backward", edit_avatar_move_backward); - gViewerKeyboard.bindNamedFunction("stop_moving", stop_moving); - gViewerKeyboard.bindNamedFunction("start_chat", start_chat); - gViewerKeyboard.bindNamedFunction("start_gesture", start_gesture); -} +#define REGISTER_KEYBOARD_ACTION(KEY, ACTION) LLREGISTER_STATIC(LLKeyboardActionRegistry, KEY, ACTION); +REGISTER_KEYBOARD_ACTION("jump", agent_jump); +REGISTER_KEYBOARD_ACTION("push_down", agent_push_down); +REGISTER_KEYBOARD_ACTION("push_forward", agent_push_forward); +REGISTER_KEYBOARD_ACTION("push_backward", agent_push_backward); +REGISTER_KEYBOARD_ACTION("look_up", agent_look_up); +REGISTER_KEYBOARD_ACTION("look_down", agent_look_down); +REGISTER_KEYBOARD_ACTION("toggle_down", agent_toggle_down); +REGISTER_KEYBOARD_ACTION("toggle_fly", agent_toggle_fly); +REGISTER_KEYBOARD_ACTION("turn_left", agent_turn_left); +REGISTER_KEYBOARD_ACTION("turn_right", agent_turn_right); +REGISTER_KEYBOARD_ACTION("slide_left", agent_slide_left); +REGISTER_KEYBOARD_ACTION("slide_right", agent_slide_right); +REGISTER_KEYBOARD_ACTION("spin_around_ccw", camera_spin_around_ccw); +REGISTER_KEYBOARD_ACTION("spin_around_cw", camera_spin_around_cw); +REGISTER_KEYBOARD_ACTION("spin_around_ccw_sitting", camera_spin_around_ccw_sitting); +REGISTER_KEYBOARD_ACTION("spin_around_cw_sitting", camera_spin_around_cw_sitting); +REGISTER_KEYBOARD_ACTION("spin_over", camera_spin_over); +REGISTER_KEYBOARD_ACTION("spin_under", camera_spin_under); +REGISTER_KEYBOARD_ACTION("spin_over_sitting", camera_spin_over_sitting); +REGISTER_KEYBOARD_ACTION("spin_under_sitting", camera_spin_under_sitting); +REGISTER_KEYBOARD_ACTION("move_forward", camera_move_forward); +REGISTER_KEYBOARD_ACTION("move_backward", camera_move_backward); +REGISTER_KEYBOARD_ACTION("move_forward_sitting", camera_move_forward_sitting); +REGISTER_KEYBOARD_ACTION("move_backward_sitting", camera_move_backward_sitting); +REGISTER_KEYBOARD_ACTION("pan_up", camera_pan_up); +REGISTER_KEYBOARD_ACTION("pan_down", camera_pan_down); +REGISTER_KEYBOARD_ACTION("pan_left", camera_pan_left); +REGISTER_KEYBOARD_ACTION("pan_right", camera_pan_right); +REGISTER_KEYBOARD_ACTION("pan_in", camera_pan_in); +REGISTER_KEYBOARD_ACTION("pan_out", camera_pan_out); +REGISTER_KEYBOARD_ACTION("move_forward_fast", camera_move_forward_fast); +REGISTER_KEYBOARD_ACTION("move_backward_fast", camera_move_backward_fast); +REGISTER_KEYBOARD_ACTION("edit_avatar_spin_ccw", edit_avatar_spin_ccw); +REGISTER_KEYBOARD_ACTION("edit_avatar_spin_cw", edit_avatar_spin_cw); +REGISTER_KEYBOARD_ACTION("edit_avatar_spin_over", edit_avatar_spin_over); +REGISTER_KEYBOARD_ACTION("edit_avatar_spin_under", edit_avatar_spin_under); +REGISTER_KEYBOARD_ACTION("edit_avatar_move_forward", edit_avatar_move_forward); +REGISTER_KEYBOARD_ACTION("edit_avatar_move_backward", edit_avatar_move_backward); +REGISTER_KEYBOARD_ACTION("stop_moving", stop_moving); +REGISTER_KEYBOARD_ACTION("start_chat", start_chat); +REGISTER_KEYBOARD_ACTION("start_gesture", start_gesture); +#undef REGISTER_KEYBOARD_ACTION -LLViewerKeyboard::LLViewerKeyboard() : - mNamedFunctionCount(0) +LLViewerKeyboard::LLViewerKeyboard() { for (S32 i = 0; i < MODE_COUNT; i++) { @@ -604,16 +612,6 @@ LLViewerKeyboard::LLViewerKeyboard() : } } - -void LLViewerKeyboard::bindNamedFunction(const std::string& name, LLKeyFunc func) -{ - S32 i = mNamedFunctionCount; - mNamedFunctions[i].mName = name; - mNamedFunctions[i].mFunction = func; - mNamedFunctionCount++; -} - - BOOL LLViewerKeyboard::modeFromString(const std::string& string, S32 *mode) { if (string == "FIRST_PERSON") @@ -667,17 +665,21 @@ BOOL LLViewerKeyboard::handleKey(KEY translated_key, MASK translated_mask, BOOL return FALSE; } - lldebugst(LLERR_USER_INPUT) << "keydown -" << translated_key << "-" << llendl; + LL_DEBUGS("UserInput") << "keydown -" << translated_key << "-" << LL_ENDL; // skip skipped keys if(mKeysSkippedByUI.find(translated_key) != mKeysSkippedByUI.end()) { mKeyHandledByUI[translated_key] = FALSE; + LL_INFOS("Keyboard Handling") << "Key wasn't handled by UI!" << LL_ENDL; } else { // it is sufficient to set this value once per call to handlekey // without clearing it, as it is only used in the subsequent call to scanKey mKeyHandledByUI[translated_key] = gViewerWindow->handleKey(translated_key, translated_mask); + // mKeyHandledByUI is not what you think ... this indicates whether the UI has handled this keypress yet (any keypress) + // NOT whether some UI shortcut wishes to handle the keypress + } return mKeyHandledByUI[translated_key]; } @@ -686,8 +688,9 @@ BOOL LLViewerKeyboard::handleKey(KEY translated_key, MASK translated_mask, BOOL BOOL LLViewerKeyboard::bindKey(const S32 mode, const KEY key, const MASK mask, const std::string& function_name) { - S32 i,index; - void (*function)(EKeystate keystate) = NULL; + S32 index; + typedef boost::function function_t; + function_t function = NULL; std::string name; // Allow remapping of F2-F12 @@ -710,13 +713,11 @@ BOOL LLViewerKeyboard::bindKey(const S32 mode, const KEY key, const MASK mask, c } // Not remapped, look for a function - for (i = 0; i < mNamedFunctionCount; i++) + + function_t* result = LLKeyboardActionRegistry::getValue(function_name); + if (result) { - if (function_name == mNamedFunctions[i].mName) - { - function = mNamedFunctions[i].mFunction; - name = mNamedFunctions[i].mName; - } + function = *result; } if (!function) @@ -740,13 +741,12 @@ BOOL LLViewerKeyboard::bindKey(const S32 mode, const KEY key, const MASK mask, c if (mode >= MODE_COUNT) { - llerror("LLKeyboard::bindKey() - unknown mode passed", mode); + llerrs << "LLKeyboard::bindKey() - unknown mode passed" << mode << llendl; return FALSE; } mBindings[mode][index].mKey = key; mBindings[mode][index].mMask = mask; -// mBindings[mode][index].mName = name; mBindings[mode][index].mFunction = function; if (index == mBindingCount[mode]) @@ -911,18 +911,18 @@ void LLViewerKeyboard::scanKey(KEY key, BOOL key_down, BOOL key_up, BOOL key_lev if (key_down && !repeat) { // ...key went down this frame, call function - (*binding[i].mFunction)( KEYSTATE_DOWN ); + binding[i].mFunction( KEYSTATE_DOWN ); } else if (key_up) { // ...key went down this frame, call function - (*binding[i].mFunction)( KEYSTATE_UP ); + binding[i].mFunction( KEYSTATE_UP ); } else if (key_level) { // ...key held down from previous frame // Not windows, just call the function. - (*binding[i].mFunction)( KEYSTATE_LEVEL ); + binding[i].mFunction( KEYSTATE_LEVEL ); }//if }//if }//for diff --git a/indra/newview/llviewerkeyboard.h b/indra/newview/llviewerkeyboard.h index 56a31b18d..1893b6aee 100644 --- a/indra/newview/llviewerkeyboard.h +++ b/indra/newview/llviewerkeyboard.h @@ -61,7 +61,6 @@ typedef enum e_keyboard_mode void bind_keyboard_functions(); - class LLViewerKeyboard { public: @@ -69,10 +68,8 @@ public: BOOL handleKey(KEY key, MASK mask, BOOL repeated); - void bindNamedFunction(const std::string& name, LLKeyFunc func); - S32 loadBindings(const std::string& filename); // returns number bound, 0 on error - void unloadBindings(); + void unloadBindings(); EKeyboardMode getMode(); BOOL modeFromString(const std::string& string, S32 *mode); // False on failure @@ -80,8 +77,6 @@ public: void scanKey(KEY key, BOOL key_down, BOOL key_up, BOOL key_level); protected: BOOL bindKey(const S32 mode, const KEY key, const MASK mask, const std::string& function_name); - S32 mNamedFunctionCount; - LLNamedFunction mNamedFunctions[MAX_NAMED_FUNCTIONS]; // Hold all the ugly stuff torn out to make LLKeyboard non-viewer-specific here S32 mBindingCount[MODE_COUNT]; @@ -95,4 +90,5 @@ protected: extern LLViewerKeyboard gViewerKeyboard; void agent_push_forward(EKeystate s); + #endif // LL_LLVIEWERKEYBOARD_H diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp index fd3346160..d9c88d91e 100644 --- a/indra/newview/llviewermenu.cpp +++ b/indra/newview/llviewermenu.cpp @@ -755,7 +755,7 @@ void init_menus() ins = gMenuBarView->getChildView("insert_admin", true, false); ins->setVisible(false);*/ - LLEnvManagerNew::instance().setRegionChangeCallback(®ion_change); + gAgent.addRegionChangedCallback(®ion_change); } diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp index d1714d960..37ed70519 100644 --- a/indra/newview/llviewermessage.cpp +++ b/indra/newview/llviewermessage.cpp @@ -657,13 +657,14 @@ bool join_group_response(const LLSD& notification, const LLSD& response) LLNotificationsUtil::add("JoinGroup", args, notification["payload"]); return false; } + if(option == 0 && !group_id.isNull()) { // check for promotion or demotion. S32 max_groups = gHippoLimits->getMaxAgentGroups(); if(gAgent.isInGroup(group_id)) ++max_groups; - if(gAgent.mGroups.count() < max_groups) + if((S32)gAgent.mGroups.size() < max_groups) { accept_invite = true; } diff --git a/indra/newview/llviewerregion.cpp b/indra/newview/llviewerregion.cpp index cbc64d533..799513e93 100644 --- a/indra/newview/llviewerregion.cpp +++ b/indra/newview/llviewerregion.cpp @@ -358,6 +358,10 @@ LLViewerRegion::LLViewerRegion(const U64 &handle, // Create the object lists initStats(); initPartitions(); + // If the newly entered region is using server bakes, and our + // current appearance is non-baked, request appearance update from + // server. + setCapabilitiesReceivedCallback(boost::bind(&LLAgent::handleServerBakeRegionTransition, &gAgent, _1)); // Singu TODO: LLAvatarRenderInfoAccountant } void LLViewerRegion::initPartitions() diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp index 802105235..9e20f8ab8 100644 --- a/indra/newview/llvoavatar.cpp +++ b/indra/newview/llvoavatar.cpp @@ -111,7 +111,6 @@ #include "llsdutil.h" #include "llfloaterexploreanimations.h" -#include "aihttptimeoutpolicy.h" #include "aixmllindengenepool.h" #include "aifile.h" @@ -5033,7 +5032,7 @@ void LLVOAvatar::bakedTextureOriginCounts(S32 &sb_count, // server-bake, has ori std::string LLVOAvatar::bakedTextureOriginInfo() { std::string result; - + std::set baked_ids; collectBakedTextureUUIDs(baked_ids); for (std::set::const_iterator it = baked_ids.begin(); it != baked_ids.end(); ++it) @@ -5048,11 +5047,17 @@ std::string LLVOAvatar::bakedTextureOriginInfo() { has_host = true; } - if (has_url && !has_host) result += "u"; // server-bake texture with url - else if (has_host && !has_url) result += "h"; // old-style texture on sim - else if (has_host && has_url) result += "?"; // both origins? - else if (!has_host && !has_url) result += "n"; // no origin? + S32 discard = imagep->getDiscardLevel(); + if (has_url && !has_host) result += discard ? "u" : "U"; // server-bake texture with url + else if (has_host && !has_url) result += discard ? "h" : "H"; // old-style texture on sim + else if (has_host && has_url) result += discard ? "x" : "X"; // both origins? + else if (!has_host && !has_url) result += discard ? "n" : "N"; // no origin? + if (discard != 0) + { + result += llformat("(%d/%d)",discard,imagep->getDesiredDiscardLevel()); + } } + return result; } @@ -5177,7 +5182,7 @@ void LLVOAvatar::updateTextures() BOOL render_avatar = TRUE; - if (mIsDummy || gNoRender) + if (mIsDummy) { return; } @@ -5197,6 +5202,7 @@ void LLVOAvatar::updateTextures() } std::vector layer_baked; + // GL NOT ACTIVE HERE - *TODO for (U32 i = 0; i < mBakedTextureDatas.size(); i++) { layer_baked.push_back(isTextureDefined(mBakedTextureDatas[i].mTextureIndex)); @@ -5401,7 +5407,7 @@ const std::string LLVOAvatar::getImageURL(const U8 te, const LLUUID &uuid) std::string url = ""; if (isUsingServerBakes()) { - const std::string& appearance_service_url = gSavedSettings.getString("AgentAppearanceServiceURL"); + const std::string& appearance_service_url = LLAppearanceMgr::instance().getAppearanceServiceURL(); if (appearance_service_url.empty()) { // Probably a server-side issue if we get here: @@ -5488,8 +5494,6 @@ const LLUUID& LLVOAvatar::getStepSound() const //----------------------------------------------------------------------------- void LLVOAvatar::processAnimationStateChanges() { - if (gNoRender) return; - if ( isAnyAnimationSignaled(AGENT_WALK_ANIMS, NUM_AGENT_WALK_ANIMS) ) { startMotion(ANIM_AGENT_WALK_ADJUST); @@ -5518,7 +5522,7 @@ void LLVOAvatar::processAnimationStateChanges() } // clear all current animations - BOOL const AOEnabled = gSavedSettings.getBOOL("AOEnabled"); // Singu note: put this outside the loop. + const bool AOEnabled(gSavedSettings.getBOOL("AOEnabled")); // AnimIterator anim_it; for (anim_it = mPlayingAnimations.begin(); anim_it != mPlayingAnimations.end();) { @@ -5527,14 +5531,8 @@ void LLVOAvatar::processAnimationStateChanges() // playing, but not signaled, so stop if (found_anim == mSignaledAnimations.end()) { - if (AOEnabled && isSelf()) - { - if (LLFloaterAO::stopMotion(anim_it->first, FALSE)) // if the AO replaced this anim serverside then stop it serverside - { -// return TRUE; //no local stop needed - } - } + LLFloaterAO::stopMotion(anim_it->first, FALSE); // if the AO replaced this anim serverside then stop it serverside processSingleAnimationStateChange(anim_it->first, FALSE); // @@ -5877,29 +5875,6 @@ LLJoint *LLVOAvatar::getJoint( const std::string &name ) return jointp; } - -//----------------------------------------------------------------------------- -// resetSpecificJointPosition -//----------------------------------------------------------------------------- -void LLVOAvatar::resetSpecificJointPosition( const std::string& name ) -{ - LLJoint* pJoint = mRoot->findJoint( name ); - - if ( pJoint && pJoint->doesJointNeedToBeReset() ) - { - pJoint->restoreOldXform(); - pJoint->setId( LLUUID::null ); - //If we're reseting the pelvis position make sure not to apply offset - if ( name == "mPelvis" ) - { - mHasPelvisOffset = false; - } - } - else - { - llinfos<<"Did not find "<< name.c_str()<doesJointNeedToBeReset() ) + //Reset joints except for pelvis + if ( pJoint && pJoint != pJointPelvis && pJoint->doesJointNeedToBeReset() ) { pJoint->setId( LLUUID::null ); - //restore joints to default positions, however skip over the pelvis - // *TODO: How does this pointer check skip over pelvis? - if ( pJoint ) - { - pJoint->restoreOldXform(); - } + pJoint->restoreOldXform(); + } + else + if ( pJoint && pJoint == pJointPelvis && pJoint->doesJointNeedToBeReset() ) + { + pJoint->setId( LLUUID::null ); + pJoint->setPosition( LLVector3( 0.0f, 0.0f, 0.0f) ); + //pJoint->setJointResetFlag( false ); // Singu TODO } } + //make sure we don't apply the joint offset mHasPelvisOffset = false; mPelvisFixup = mLastPelvisFixup; @@ -5977,7 +5959,7 @@ void LLVOAvatar::getGround(const LLVector3 &in_pos_agent, LLVector3 &out_pos_age LLVector3d z_vec(0.0f, 0.0f, 1.0f); LLVector3d p0_global, p1_global; - if (gNoRender || mIsDummy) + if (mIsDummy) { outNorm.setVec(z_vec); out_pos_agent = in_pos_agent; @@ -6136,11 +6118,6 @@ BOOL LLVOAvatar::loadSkeletonNode () //----------------------------------------------------------------------------- void LLVOAvatar::updateVisualParams() { - if (gNoRender) - { - return; - } - setSex( (getVisualParamWeight( "male" ) > 0.5f) ? SEX_MALE : SEX_FEMALE ); LLCharacter::updateVisualParams(); @@ -6155,7 +6132,6 @@ void LLVOAvatar::updateVisualParams() dirtyMesh(); updateHeadOffset(); } - //----------------------------------------------------------------------------- // isActive() //----------------------------------------------------------------------------- @@ -6214,7 +6190,6 @@ BOOL LLVOAvatar::updateJointLODs() F32 avatar_num_factor = clamp_rescale((F32)sNumVisibleAvatars, 8, 25, 1.f, avatar_num_min_factor); F32 area_scale = 0.16f; - { if (isSelf()) { if(gAgentCamera.cameraCustomizeAvatar() || gAgentCamera.cameraMouselook()) @@ -6249,7 +6224,6 @@ BOOL LLVOAvatar::updateJointLODs() dirtyMesh(2); return TRUE; } - } return FALSE; } @@ -6378,19 +6352,18 @@ void LLVOAvatar::addChild(LLViewerObject *childp) LLViewerObject::addChild(childp); if (childp->mDrawable) { - if(isSelf()) + if (!attachObject(childp)) { - LL_INFOS("Attachment") << childp->getID() << " ("<getAttachmentPointName()<<") attached." << llendl; - llassert(std::find(mPendingAttachment.begin(), mPendingAttachment.end(), childp) == mPendingAttachment.end()); + llwarns << "addChild() failed for " + << childp->getID() + << " item " << childp->getAttachmentItemID() + << llendl; + // MAINT-3312 backout + // mPendingAttachment.push_back(childp); } - attachObject(childp); } else { - if(isSelf()) - { - LL_INFOS("Attachment") << childp->getID() << " ("<getAttachmentPointName()<<") pending." << llendl; - } mPendingAttachment.push_back(childp); } } @@ -6519,17 +6492,22 @@ void LLVOAvatar::lazyAttach() for (U32 i = 0; i < mPendingAttachment.size(); i++) { - if (mPendingAttachment[i]->mDrawable) + LLPointer cur_attachment = mPendingAttachment[i]; + if (cur_attachment->mDrawable) { - if(isSelf()) - { - LL_INFOS("Attachment") << mPendingAttachment[i]->getID() << " ("<getAttachmentPointName()<<") done pending. attached." << llendl; + if(!attachObject(cur_attachment)) + { // Drop it + llwarns << "attachObject() failed for " + << cur_attachment->getID() + << " item " << cur_attachment->getAttachmentItemID() + << llendl; + // MAINT-3312 backout + //still_pending.push_back(cur_attachment); } - attachObject(mPendingAttachment[i]); } else { - still_pending.push_back(mPendingAttachment[i]); + still_pending.push_back(cur_attachment); } } @@ -6538,6 +6516,7 @@ void LLVOAvatar::lazyAttach() void LLVOAvatar::resetHUDAttachments() { + for (attachment_map_t::iterator iter = mAttachmentPoints.begin(); iter != mAttachmentPoints.end(); ++iter) @@ -6612,6 +6591,7 @@ void LLVOAvatar::cleanupAttachedMesh( LLViewerObject* pVO ) //----------------------------------------------------------------------------- BOOL LLVOAvatar::detachObject(LLViewerObject *viewer_object) { + for (attachment_map_t::iterator iter = mAttachmentPoints.begin(); iter != mAttachmentPoints.end(); ++iter) @@ -6623,6 +6603,7 @@ BOOL LLVOAvatar::detachObject(LLViewerObject *viewer_object) vector_replace_with_last(mAttachedObjectsVector,std::make_pair(viewer_object,attachment)); cleanupAttachedMesh( viewer_object ); + attachment->removeObject(viewer_object); lldebugs << "Detaching object " << viewer_object->mID << " from " << attachment->getName() << llendl; return TRUE; @@ -7037,9 +7018,12 @@ void LLVOAvatar::clearPhases() void LLVOAvatar::startPhase(const std::string& phase_name) { - F32 elapsed; - bool completed; - if (getPhases().getPhaseValues(phase_name, elapsed, completed)) + F32 elapsed = 0.0; + bool completed = false; + bool found = getPhases().getPhaseValues(phase_name, elapsed, completed); + //LL_DEBUGS("Avatar") << avString() << " phase state " << phase_name + // << " found " << found << " elapsed " << elapsed << " completed " << completed << LL_ENDL; + if (found) { if (!completed) { @@ -7053,8 +7037,8 @@ void LLVOAvatar::startPhase(const std::string& phase_name) void LLVOAvatar::stopPhase(const std::string& phase_name, bool err_check) { - F32 elapsed; - bool completed; + F32 elapsed = 0.0; + bool completed = false; if (getPhases().getPhaseValues(phase_name, elapsed, completed)) { if (!completed) @@ -7240,8 +7224,8 @@ BOOL LLVOAvatar::isFullyLoaded() const bool LLVOAvatar::isTooComplex() const { - static const LLCachedControl render_avatar_complexity_limit("RenderAvatarComplexityLimit",0); - if (render_avatar_complexity_limit > 0 && mVisualComplexity >= render_avatar_complexity_limit) + static LLCachedControl ava_complexity_limit(gSavedSettings, "RenderAvatarComplexityLimit"); + if (ava_complexity_limit > 0 && mVisualComplexity >= ava_complexity_limit) { return true; } @@ -7262,7 +7246,8 @@ LLMotion* LLVOAvatar::findMotion(const LLUUID& id) const // colorized if using deferred rendering. void LLVOAvatar::debugColorizeSubMeshes(U32 i, const LLColor4& color) { - if (gSavedSettings.getBOOL("DebugAvatarCompositeBaked")) + static LLCachedControl debug_avatar_comp_baked(gSavedSettings, "DebugAvatarCompositeBaked"); + if (debug_avatar_comp_baked) { avatar_joint_mesh_list_t::iterator iter = mBakedTextureDatas[i].mJointMeshes.begin(); avatar_joint_mesh_list_t::iterator end = mBakedTextureDatas[i].mJointMeshes.end(); @@ -7278,6 +7263,7 @@ void LLVOAvatar::debugColorizeSubMeshes(U32 i, const LLColor4& color) } } } + //----------------------------------------------------------------------------- // updateMeshTextures() // Uses the current TE values to set the meshes' and layersets' textures. @@ -7592,7 +7578,6 @@ void LLVOAvatar::applyMorphMask(U8* tex_data, S32 width, S32 height, S32 num_com } } - // returns TRUE if morph masks are present and not valid for a given baked texture, FALSE otherwise BOOL LLVOAvatar::morphMaskNeedsUpdate(LLAvatarAppearanceDefines::EBakedTextureIndex index) { @@ -7775,7 +7760,7 @@ LLBBox LLVOAvatar::getHUDBBox() const //----------------------------------------------------------------------------- void LLVOAvatar::onFirstTEMessageReceived() { - LL_INFOS("Avatar") << avString() << LL_ENDL; + LL_DEBUGS("Avatar") << avString() << LL_ENDL; if( !mFirstTEMessageReceived ) { mFirstTEMessageReceived = TRUE; @@ -8017,13 +8002,13 @@ bool resolve_appearance_version(const LLAppearanceMessageContents& contents, S32 { appearance_version = contents.mParamAppearanceVersion; } - if (contents.mAppearanceVersion >= 0) + else if (contents.mAppearanceVersion > 0) { appearance_version = contents.mAppearanceVersion; } - if (appearance_version < 0) // still not set, go with 0. + else // still not set, go with 1. { - appearance_version = 0; + appearance_version = 1; } LL_DEBUGS("Avatar") << "appearance version info - field " << contents.mAppearanceVersion << " param: " << contents.mParamAppearanceVersion @@ -8061,6 +8046,7 @@ void LLVOAvatar::processAvatarAppearance( LLMessageSystem* mesgsys ) llwarns << "bad appearance version info, discarding" << llendl; return; } + S32 this_update_cof_version = contents.mCOFVersion; S32 last_update_request_cof_version = LLAppearanceMgr::instance().mLastUpdateRequestCOFVersion; @@ -8108,6 +8094,7 @@ void LLVOAvatar::processAvatarAppearance( LLMessageSystem* mesgsys ) return; } + // SUNSHINE CLEANUP - is this case OK now? S32 num_params = contents.mParamWeights.size(); if (num_params <= 1) { @@ -8132,9 +8119,15 @@ void LLVOAvatar::processAvatarAppearance( LLMessageSystem* mesgsys ) && mBakedTextureDatas[baked_index].mLastTextureID != IMG_DEFAULT && baked_index != BAKED_SKIRT) { + LL_DEBUGS("Avatar") << avString() << " baked_index " << (S32) baked_index << " using mLastTextureID " << mBakedTextureDatas[baked_index].mLastTextureID << LL_ENDL; setTEImage(mBakedTextureDatas[baked_index].mTextureIndex, LLViewerTextureManager::getFetchedTexture(mBakedTextureDatas[baked_index].mLastTextureID, TRUE, LLGLTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE)); } + else + { + LL_DEBUGS("Avatar") << avString() << " baked_index " << (S32) baked_index << " using texture id " + << getTE(mBakedTextureDatas[baked_index].mTextureIndex)->getID() << LL_ENDL; + } } // runway - was @@ -8162,6 +8155,7 @@ void LLVOAvatar::processAvatarAppearance( LLMessageSystem* mesgsys ) LL_DEBUGS("Avatar") << avString() << " handle visual params, num_params " << num_params << LL_ENDL; BOOL params_changed = FALSE; BOOL interp_params = FALSE; + S32 params_changed_count = 0; for( S32 i = 0; i < num_params; i++ ) { @@ -8176,8 +8170,11 @@ void LLVOAvatar::processAvatarAppearance( LLMessageSystem* mesgsys ) if (is_first_appearance_message || (param->getWeight() != newWeight)) { params_changed = TRUE; + params_changed_count++; + if(is_first_appearance_message) { + //LL_DEBUGS("Avatar") << "param slam " << i << " " << newWeight << LL_ENDL; param->setWeight(newWeight, FALSE); } else @@ -8193,6 +8190,7 @@ void LLVOAvatar::processAvatarAppearance( LLMessageSystem* mesgsys ) LL_DEBUGS("Avatar") << "Number of params in AvatarAppearance msg (" << num_params << ") does not match number of tweakable params in avatar xml file (" << expected_tweakable_count << "). Processing what we can. object: " << getID() << LL_ENDL; } + LL_DEBUGS("Avatar") << "Changed " << params_changed_count << " params" << LL_ENDL; if (params_changed) { if (interp_params) @@ -8242,35 +8240,36 @@ void LLVOAvatar::processAvatarAppearance( LLMessageSystem* mesgsys ) } updateMeshTextures(); - //if (enable_verbose_dumps) dumpArchetypeXML(dump_prefix + "process_end"); } // static -void LLVOAvatar::getAnimLabels( LLDynamicArray* labels ) +void LLVOAvatar::getAnimLabels( std::vector* labels ) { S32 i; + labels->reserve(gUserAnimStatesCount); for( i = 0; i < gUserAnimStatesCount; i++ ) { - labels->put( LLAnimStateLabels::getStateLabel( gUserAnimStates[i].mName ) ); + labels->push_back( LLAnimStateLabels::getStateLabel( gUserAnimStates[i].mName ) ); } // Special case to trigger away (AFK) state - labels->put( "Away From Keyboard" ); + labels->push_back( "Away From Keyboard" ); } // static -void LLVOAvatar::getAnimNames( LLDynamicArray* names ) +void LLVOAvatar::getAnimNames( std::vector* names ) { S32 i; + names->reserve(gUserAnimStatesCount); for( i = 0; i < gUserAnimStatesCount; i++ ) { - names->put( std::string(gUserAnimStates[i].mName) ); + names->push_back( std::string(gUserAnimStates[i].mName) ); } // Special case to trigger away (AFK) state - names->put( "enter_away_from_keyboard_state" ); + names->push_back( "enter_away_from_keyboard_state" ); } // static @@ -8423,7 +8422,7 @@ void LLVOAvatar::useBakedTexture( const LLUUID& id ) LLViewerTexture* image_baked = getImage( mBakedTextureDatas[i].mTextureIndex, 0 ); if (id == image_baked->getID()) { - LL_DEBUGS("Avatar") << avString() << " i " << i << " id " << id << LL_ENDL; + //LL_DEBUGS("Avatar") << avString() << " i " << i << " id " << id << LL_ENDL; mBakedTextureDatas[i].mIsLoaded = true; mBakedTextureDatas[i].mLastTextureID = id; mBakedTextureDatas[i].mIsUsed = true; @@ -8496,6 +8495,15 @@ std::string get_sequential_numbered_file_name(const std::string& prefix, return outfilename; } +void dump_sequential_xml(const std::string outprefix, const LLSD& content) +{ + std::string outfilename = get_sequential_numbered_file_name(outprefix,".xml"); + std::string fullpath = gDirUtilp->getExpandedFilename(LL_PATH_LOGS,outfilename); + std::ofstream ofs(fullpath.c_str(), std::ios_base::out); + ofs << LLSDOStreamer(content, LLSDFormatter::OPTIONS_PRETTY); + LL_DEBUGS("Avatar") << "results saved to: " << fullpath << LL_ENDL; +} + void LLVOAvatar::dumpArchetypeXML(const std::string& prefix, bool group_by_wearables ) { std::string outprefix(prefix); diff --git a/indra/newview/llvoavatar.h b/indra/newview/llvoavatar.h index b0bc08ab3..6dd1f0b71 100644 --- a/indra/newview/llvoavatar.h +++ b/indra/newview/llvoavatar.h @@ -250,7 +250,6 @@ public: virtual LLJoint* getJoint(const std::string &name); void resetJointPositionsToDefault( void ); - void resetSpecificJointPosition( const std::string& name ); /*virtual*/ const LLUUID& getID() const; /*virtual*/ void addDebugText(const std::string& text); @@ -916,11 +915,11 @@ private: **/ public: - /*virtual*/ std::string getFullname() const; // Returns "FirstName LastName" + std::string getFullname() const; // Returns "FirstName LastName" std::string avString() const; // Frequently used string in log messages "Avatar '* labels); - static void getAnimNames(LLDynamicArray* names); + static void getAnimLabels(std::vector* labels); + static void getAnimNames(std::vector* names); private: std::string mNameString; // UTF-8 title + name + status std::string mTitle; @@ -1074,8 +1073,10 @@ private: // }; // LLVOAvatar - extern const F32 SELF_ADDITIONAL_PRI; extern const S32 MAX_TEXTURE_VIRTUAL_SIZE_RESET_INTERVAL; +void dump_sequential_xml(const std::string outprefix, const LLSD& content); + #endif // LL_VOAVATAR_H + diff --git a/indra/newview/llvoavatarself.cpp b/indra/newview/llvoavatarself.cpp index f5cf396c3..c77914e36 100644 --- a/indra/newview/llvoavatarself.cpp +++ b/indra/newview/llvoavatarself.cpp @@ -620,12 +620,21 @@ void LLVOAvatarSelf::idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time) // virtual LLJoint *LLVOAvatarSelf::getJoint(const std::string &name) { - if (mScreenp) + // - findJoint Opt + LLJoint* jointp = LLVOAvatar::getJoint(name); + if (!jointp && mScreenp) { - LLJoint* jointp = mScreenp->findJoint(name); - if (jointp) return jointp; + jointp = mScreenp->findJoint(name); } - return LLVOAvatar::getJoint(name); + return jointp; + + // + //if (mScreenp) + //{ + // LLJoint* jointp = mScreenp->findJoint(name); + // if (jointp) return jointp; + //} + //return LLVOAvatar::getJoint(name); } // virtual BOOL LLVOAvatarSelf::setVisualParamWeight(const LLVisualParam *which_param, F32 weight, BOOL upload_bake ) @@ -663,14 +672,6 @@ BOOL LLVOAvatarSelf::setParamWeight(const LLViewerVisualParam *param, F32 weight return FALSE; } -#if 0 - // FIXME DRANO - kludgy way to avoid overwriting avatar state from wearables. - if (isUsingServerBakes() && !isUsingLocalAppearance()) - { - return FALSE; - } -#endif - if (param->getCrossWearable()) { LLWearableType::EType type = (LLWearableType::EType)param->getWearableType(); @@ -741,50 +742,9 @@ void LLVOAvatarSelf::stopMotionFromSource(const LLUUID& source_id) } //virtual -U32 LLVOAvatarSelf::processUpdateMessage(LLMessageSystem *mesgsys, - void **user_data, - U32 block_num, - const EObjectUpdateType update_type, - LLDataPacker *dp) +U32 LLVOAvatarSelf::processUpdateMessage(LLMessageSystem *mesgsys, void **user_data, U32 block_num, const EObjectUpdateType update_type, LLDataPacker *dp) { - U32 retval = LLVOAvatar::processUpdateMessage(mesgsys,user_data,block_num,update_type,dp); - -#if 0 - // DRANO - it's not clear this does anything useful. If we wait - // until an appearance message has been received, we already have - // the texture ids. If we don't wait, we don't yet know where to - // look for baked textures, because we haven't received the - // appearance version data from the appearance message. This looks - // like an old optimization that's incompatible with server-side - // texture baking. - - // FIXME DRANO - skipping in the case of !mFirstAppearanceMessageReceived prevents us from trying to - // load textures before we know where they come from (ie, from baking service or not); - // unknown impact on performance. - if (mInitialBakesLoaded == false && retval == 0x0 && mFirstAppearanceMessageReceived) - { - // call update textures to force the images to be created - updateMeshTextures(); - - // unpack the texture UUIDs to the texture slots - retval = unpackTEMessage(mesgsys, _PREHASH_ObjectData, (S32) block_num); - - // need to trigger a few operations to get the avatar to use the new bakes - for (U32 i = 0; i < mBakedTextureDatas.size(); i++) - { - const LLAvatarAppearanceDefines::ETextureIndex te = mBakedTextureDatas[i].mTextureIndex; - LLUUID texture_id = getTEImage(te)->getID(); - setNewBakedTexture(te, texture_id); - mInitialBakeIDs[i] = texture_id; - } - - onFirstTEMessageReceived(); - - mInitialBakesLoaded = true; - } -#endif - - return retval; + return LLVOAvatar::processUpdateMessage(mesgsys, user_data, block_num, update_type, dp); } void LLVOAvatarSelf::setLocalTextureTE(U8 te, LLViewerTexture* image, U32 index) @@ -824,7 +784,7 @@ void LLVOAvatarSelf::removeMissingBakedTextures() if (!tex || tex->isMissingAsset()) { LLViewerTexture *imagep = LLViewerTextureManager::getFetchedTexture(IMG_DEFAULT_AVATAR); - if (imagep) + if (imagep && imagep != tex) { setTEImage(te, imagep); removed = TRUE; @@ -863,9 +823,9 @@ void LLVOAvatarSelf::updateRegion(LLViewerRegion *regionp) // Diagnostic info //LLVector3d pos_from_new_region = getPositionGlobal(); - //llinfos << "pos_from_old_region is " << global_pos_from_old_region + //LL_INFOS() << "pos_from_old_region is " << global_pos_from_old_region // << " while pos_from_new_region is " << pos_from_new_region - // << llendl; + // << LL_ENDL; } if (!regionp || (regionp->getHandle() != mLastRegionHandle)) @@ -971,7 +931,6 @@ void LLVOAvatarSelf::idleUpdateTractorBeam() mBeam->setPositionGlobal(pick.mPosGlobal); } - } if (mBeamTimer.getElapsedTimeF32() > 0.25f) { @@ -988,7 +947,7 @@ void LLVOAvatarSelf::idleUpdateTractorBeam() // virtual void LLVOAvatarSelf::restoreMeshData() { - //llinfos << "Restoring" << llendl; + //LL_INFOS() << "Restoring" << LL_ENDL; mMeshValid = TRUE; updateJointLODs(); updateAttachmentVisibility(gAgentCamera.getCameraMode()); @@ -1069,13 +1028,13 @@ void LLVOAvatarSelf::wearableUpdated( LLWearableType::EType type, BOOL upload_re } } } - + // Physics type has no associated baked textures, but change of params needs to be sent to // other avatars. if (type == LLWearableType::WT_PHYSICS) - { - gAgent.sendAgentSetAppearance(); - } + { + gAgent.sendAgentSetAppearance(); + } } //----------------------------------------------------------------------------- @@ -1492,7 +1451,7 @@ BOOL LLVOAvatarSelf::isLocalTextureDataAvailable(const LLViewerTexLayerSet* laye //----------------------------------------------------------------------------- BOOL LLVOAvatarSelf::isLocalTextureDataFinal(const LLViewerTexLayerSet* layerset) const { - const U32 desired_tex_discard_level = gSavedSettings.getU32("TextureDiscardLevel"); + static LLCachedControl desired_tex_discard_level(gSavedSettings, "TextureDiscardLevel"); // const U32 desired_tex_discard_level = 0; // hack to not bake textures on lower discard levels. for (U32 i = 0; i < mBakedTextureDatas.size(); i++) @@ -1527,7 +1486,7 @@ BOOL LLVOAvatarSelf::isLocalTextureDataFinal(const LLViewerTexLayerSet* layerset BOOL LLVOAvatarSelf::isAllLocalTextureDataFinal() const { - const U32 desired_tex_discard_level = gSavedSettings.getU32("TextureDiscardLevel"); + static LLCachedControl desired_tex_discard_level(gSavedSettings, "TextureDiscardLevel"); // const U32 desired_tex_discard_level = 0; // hack to not bake textures on lower discard levels for (U32 i = 0; i < mBakedTextureDatas.size(); i++) @@ -1669,7 +1628,7 @@ void LLVOAvatarSelf::invalidateComposite( LLTexLayerSet* layerset, BOOL upload_r { return; } - // llinfos << "LLVOAvatar::invalidComposite() " << layerset->getBodyRegionName() << llendl; + // LL_INFOS() << "LLVOAvatar::invalidComposite() " << layerset->getBodyRegionName() << LL_ENDL; layer_set->requestUpdate(); layer_set->invalidateMorphMasks(); @@ -2101,7 +2060,10 @@ BOOL LLVOAvatarSelf::getIsCloud() const /*static*/ void LLVOAvatarSelf::debugOnTimingLocalTexLoaded(BOOL success, LLViewerFetchedTexture *src_vi, LLImageRaw* src, LLImageRaw* aux_src, S32 discard_level, BOOL final, void* userdata) { - gAgentAvatarp->debugTimingLocalTexLoaded(success, src_vi, src, aux_src, discard_level, final, userdata); + if (gAgentAvatarp.notNull()) + { + gAgentAvatarp->debugTimingLocalTexLoaded(success, src_vi, src, aux_src, discard_level, final, userdata); + } } void LLVOAvatarSelf::debugTimingLocalTexLoaded(BOOL success, LLViewerFetchedTexture *src_vi, LLImageRaw* src, LLImageRaw* aux_src, S32 discard_level, BOOL final, void* userdata) @@ -2214,7 +2176,7 @@ void LLVOAvatarSelf::dumpAllTextures() const if (!layerset_buffer) continue; vd_text += verboseDebugDumpLocalTextureDataInfo(layerset); } - LL_DEBUGS("Avatar") << vd_text << llendl; + LL_DEBUGS("Avatar") << vd_text << LL_ENDL; } const std::string LLVOAvatarSelf::debugDumpLocalTextureDataInfo(const LLViewerTexLayerSet* layerset) const @@ -2285,28 +2247,9 @@ const std::string LLVOAvatarSelf::debugDumpAllLocalTextureDataInfo() const return text; } - -#if 0 -// Dump avatar metrics data. -LLSD LLVOAvatarSelf::metricsData() -{ - // runway - add region info - LLSD result; - result["rez_status"] = LLVOAvatar::rezStatusToString(getRezzedStatus()); - result["timers"]["debug_existence"] = mDebugExistenceTimer.getElapsedTimeF32(); - result["timers"]["ruth_debug"] = mRuthDebugTimer.getElapsedTimeF32(); - result["timers"]["ruth"] = mRuthTimer.getElapsedTimeF32(); - result["timers"]["invisible"] = mInvisibleTimer.getElapsedTimeF32(); - result["timers"]["fully_loaded"] = mFullyLoadedTimer.getElapsedTimeF32(); - result["startup"] = LLStartUp::getPhases().dumpPhases(); - - return result; -} -#endif - -extern AIHTTPTimeoutPolicy appearanceChangeMetricsResponder_timeout; class ViewerAppearanceChangeMetricsResponder: public LLHTTPClient::ResponderWithResult { + LOG_CLASS(ViewerAppearanceChangeMetricsResponder); public: ViewerAppearanceChangeMetricsResponder( S32 expected_sequence, volatile const S32 & live_sequence, @@ -2317,7 +2260,8 @@ public: { } - /*virtual*/ void httpSuccess(void) +private: + /* virtual */ void httpSuccess() { LL_DEBUGS("Avatar") << "OK" << LL_ENDL; if (mLiveSequence == mExpectedSequence) @@ -2325,11 +2269,12 @@ public: mReportingStarted = true; } } - /*virtual*/ void httpFailure(void) + + /* virtual */ void httpFailure() { - LL_WARNS("Avatar") << "Failed " << mStatus << " reason " << mReason << LL_ENDL; + // if we add retry, this should be removed from the httpFailure case + LL_WARNS("Avatar") << dumpResponse() << LL_ENDL; } - /*virtual*/ AIHTTPTimeoutPolicy const& getHTTPTimeoutPolicy(void) const { return appearanceChangeMetricsResponder_timeout; } /*virtual*/ char const* getName(void) const { return "AppearanceChangeMetricsResponder"; } private: S32 mExpectedSequence; @@ -2481,19 +2426,14 @@ void LLVOAvatarSelf::sendViewerAppearanceChangeMetrics() } } -extern AIHTTPTimeoutPolicy checkAgentAppearanceServiceResponder_timeout; class CheckAgentAppearanceServiceResponder: public LLHTTPClient::ResponderHeadersOnly { public: - CheckAgentAppearanceServiceResponder() - { - } - - virtual ~CheckAgentAppearanceServiceResponder() - { - } + CheckAgentAppearanceServiceResponder() {} - /*virtual*/ void completedHeaders(void) + virtual ~CheckAgentAppearanceServiceResponder() {} + + /*virtual*/ void completedHeaders() { if (isGoodStatus(mStatus)) { @@ -2509,16 +2449,6 @@ public: } } - // Error - /*virtual*//* void httpFailure(void) - { - if (isAgentAvatarValid()) - { - LL_DEBUGS("Avatar") << "failed, will rebake" << llendl; - forceAppearanceUpdate(); - } - } */ - static void forceAppearanceUpdate() { // Trying to rebake immediately after crossing region boundary @@ -2527,7 +2457,6 @@ public: doAfterInterval(force_bake_all_textures, 5.0); } - /*virtual*/ AIHTTPTimeoutPolicy const& getHTTPTimeoutPolicy(void) const { return checkAgentAppearanceServiceResponder_timeout; } /*virtual*/ char const* getName(void) const { return "CheckAgentAppearanceServiceResponder"; } }; diff --git a/indra/newview/rlvhandler.cpp b/indra/newview/rlvhandler.cpp index 143ff6903..b44fd340e 100644 --- a/indra/newview/rlvhandler.cpp +++ b/indra/newview/rlvhandler.cpp @@ -1750,9 +1750,9 @@ ERlvCmdRet RlvHandler::onForceGroup(const RlvCommand& rlvCmd) const } else { - for (S32 idxGroup = 0, cntGroup = gAgent.mGroups.count(); (idxGroup < cntGroup) && (idGroup.isNull()); idxGroup++) - if (boost::iequals(gAgent.mGroups.get(idxGroup).mName, rlvCmd.getOption())) - idGroup = gAgent.mGroups.get(idxGroup).mID; + for (S32 idxGroup = 0, cntGroup = gAgent.mGroups.size(); (idxGroup < cntGroup) && (idGroup.isNull()); idxGroup++) + if (boost::iequals(gAgent.mGroups[idxGroup].mName, rlvCmd.getOption())) + idGroup = gAgent.mGroups[idxGroup].mID; fValid = (idGroup.notNull()) || ("none" == rlvCmd.getOption()); } diff --git a/indra/newview/rlvui.cpp b/indra/newview/rlvui.cpp index 46327d8c2..81c431453 100644 --- a/indra/newview/rlvui.cpp +++ b/indra/newview/rlvui.cpp @@ -488,12 +488,12 @@ bool RlvUIEnabler::canViewParcelProperties() const LLUUID& idOwner = pParcel->getOwnerID(); if ( (idOwner != gAgent.getID()) ) { - S32 count = gAgent.mGroups.count(); + S32 count = gAgent.mGroups.size(); for (S32 i = 0; i < count; ++i) { - if (gAgent.mGroups.get(i).mID == idOwner) + if (gAgent.mGroups[i].mID == idOwner) { - fShow = ((gAgent.mGroups.get(i).mPowers & GP_LAND_RETURN) > 0); + fShow = ((gAgent.mGroups[i].mPowers & GP_LAND_RETURN) > 0); break; } } diff --git a/indra/newview/skins/default/xui/en-us/strings.xml b/indra/newview/skins/default/xui/en-us/strings.xml index be50d389f..df9b9f732 100644 --- a/indra/newview/skins/default/xui/en-us/strings.xml +++ b/indra/newview/skins/default/xui/en-us/strings.xml @@ -3347,6 +3347,10 @@ The Allowed Residents: ([ALLOWEDAGENTS], max [MAXACCESS]) Allowed groups: ([ALLOWEDGROUPS], max [MAXACCESS]) + Estate Managers: ([ESTATEMANAGERS], max [MAXMANAGERS]) + Banned Residents: ([BANNEDAGENTS], max [MAXBANNED]) + Allowed Residents + Banned Residents Parcel Script Memory diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py index 82c26c99c..7aa74d66c 100755 --- a/indra/newview/viewer_manifest.py +++ b/indra/newview/viewer_manifest.py @@ -762,11 +762,7 @@ class LinuxManifest(ViewerManifest): else: installer_name += '_' + self.channel_oneword().upper() - if self.args['buildtype'].lower() in ['release', 'releasesse2']: - print "* Going strip-crazy on the packaged binaries, since this is a RELEASE build" - # makes some small assumptions about our packaged dir structure - self.run_command("find %(d)r/bin %(d)r/lib* -type f | xargs -d '\n' --no-run-if-empty strip --strip-unneeded" % {'d': self.get_dst_prefix()} ) - self.run_command("find %(d)r/bin %(d)r/lib* -type f -not -name \\*.so | xargs -d '\n' --no-run-if-empty strip -s" % {'d': self.get_dst_prefix()} ) + self.strip_binaries() # Fix access permissions self.run_command(""" @@ -797,6 +793,12 @@ class LinuxManifest(ViewerManifest): 'dst': self.get_dst_prefix(), 'inst': self.build_path_of(installer_name)}) + def strip_binaries(self): + if self.args['buildtype'].lower() in ['release', 'releasesse2']: + print "* Going strip-crazy on the packaged binaries, since this is a RELEASE build" + # makes some small assumptions about our packaged dir structure + self.run_command("find %(d)r/bin %(d)r/lib* -type f | xargs -d '\n' --no-run-if-empty strip --strip-unneeded" % {'d': self.get_dst_prefix()} ) + self.run_command("find %(d)r/bin %(d)r/lib* -type f -not -name \\*.so | xargs -d '\n' --no-run-if-empty strip -s" % {'d': self.get_dst_prefix()} ) class Linux_i686Manifest(LinuxManifest): def construct(self): From ab7acd71491e7bd3c805b4aec456e7732125b443 Mon Sep 17 00:00:00 2001 From: Inusaito Sayori Date: Thu, 4 Sep 2014 17:30:10 -0400 Subject: [PATCH 3/9] Modernize LLSingleton --- indra/llcommon/llsingleton.cpp | 1 - indra/llcommon/llsingleton.h | 169 ++++++++++++++------------------- 2 files changed, 70 insertions(+), 100 deletions(-) diff --git a/indra/llcommon/llsingleton.cpp b/indra/llcommon/llsingleton.cpp index eb8e2c945..9b49e5237 100644 --- a/indra/llcommon/llsingleton.cpp +++ b/indra/llcommon/llsingleton.cpp @@ -28,5 +28,4 @@ #include "llsingleton.h" -std::map * LLSingletonRegistry::sSingletonMap = NULL; diff --git a/indra/llcommon/llsingleton.h b/indra/llcommon/llsingleton.h index a780a6a24..0fad5a1fa 100644 --- a/indra/llcommon/llsingleton.h +++ b/indra/llcommon/llsingleton.h @@ -27,42 +27,9 @@ #include "llerror.h" // *TODO: eliminate this -#include #include #include -/// @brief A global registry of all singletons to prevent duplicate allocations -/// across shared library boundaries -class LL_COMMON_API LLSingletonRegistry { - private: - typedef std::map TypeMap; - static TypeMap * sSingletonMap; - - static void checkInit() - { - if(sSingletonMap == NULL) - { - sSingletonMap = new TypeMap(); - } - } - - public: - template static void * & get() - { - std::string name(typeid(T).name()); - - checkInit(); - - // the first entry of the pair returned by insert will be either the existing - // iterator matching our key, or the newly inserted NULL initialized entry - // see "Insert element" in http://www.sgi.com/tech/stl/UniqueAssociativeContainer.html - TypeMap::iterator result = - sSingletonMap->insert(std::make_pair(name, (void*)NULL)).first; - - return result->second; - } -}; - // LLSingleton implements the getInstance() method part of the Singleton // pattern. It can't make the derived class constructors protected, though, so // you have to do that yourself. @@ -101,21 +68,29 @@ private: DELETED } EInitState; - // stores pointer to singleton instance - // and tracks initialization state of singleton - struct SingletonInstanceData + static DERIVED_TYPE* constructSingleton() { - EInitState mInitState; - DERIVED_TYPE* mSingletonInstance; - - SingletonInstanceData() - : mSingletonInstance(NULL), - mInitState(UNINITIALIZED) - {} + return new DERIVED_TYPE(); + } - ~SingletonInstanceData() + // stores pointer to singleton instance + struct SingletonLifetimeManager + { + SingletonLifetimeManager() { - if (mInitState != DELETED) + construct(); + } + + static void construct() + { + sData.mInitState = CONSTRUCTING; + sData.mInstance = constructSingleton(); + sData.mInitState = INITIALIZING; + } + + ~SingletonLifetimeManager() + { + if (sData.mInitState != DELETED) { deleteSingleton(); } @@ -125,9 +100,8 @@ private: public: virtual ~LLSingleton() { - SingletonInstanceData& data = getData(); - data.mSingletonInstance = NULL; - data.mInitState = DELETED; + sData.mInstance = NULL; + sData.mInitState = DELETED; } /** @@ -152,37 +126,49 @@ public: */ static void deleteSingleton() { - DERIVED_TYPE* instance = getData().mSingletonInstance; - getData().mInitState = DELETED; - getData().mSingletonInstance = NULL; - delete instance; + delete sData.mInstance; + sData.mInstance = NULL; + sData.mInitState = DELETED; } - static SingletonInstanceData& getData() - { - // this is static to cache the lookup results - static void * & registry = LLSingletonRegistry::get(); - - // *TODO - look into making this threadsafe - if(NULL == registry) - { - static SingletonInstanceData data; - registry = &data; - } - - return *static_cast(registry); - } static DERIVED_TYPE* getInstance() { - SingletonInstanceData& data = getData(); + static SingletonLifetimeManager sLifeTimeMgr; - if (data.mInitState != INITIALIZED) + switch (sData.mInitState) { - createInstance(data); + case UNINITIALIZED: + // should never be uninitialized at this point + llassert(false); + return NULL; + case CONSTRUCTING: + llerrs << "Tried to access singleton " << typeid(DERIVED_TYPE).name() << " from singleton constructor!" << LL_ENDL; + return NULL; + case INITIALIZING: + // go ahead and flag ourselves as initialized so we can be reentrant during initialization + sData.mInitState = INITIALIZED; + // initialize singleton after constructing it so that it can reference other singletons which in turn depend on it, + // thus breaking cyclic dependencies + sData.mInstance->initSingleton(); + return sData.mInstance; + case INITIALIZED: + return sData.mInstance; + case DELETED: + llwarns << "Trying to access deleted singleton " << typeid(DERIVED_TYPE).name() << " creating new instance" << LL_ENDL; + SingletonLifetimeManager::construct(); + // same as first time construction + sData.mInitState = INITIALIZED; + sData.mInstance->initSingleton(); + return sData.mInstance; } - return data.mSingletonInstance; + return NULL; + } + + static DERIVED_TYPE* getIfExists() + { + return sData.mInstance; } // Reference version of getInstance() @@ -196,46 +182,31 @@ public: // Use this to avoid accessing singletons before the can safely be constructed static bool instanceExists() { - return getData().mInitState == INITIALIZED; + return sData.mInitState == INITIALIZED; } // Has this singleton already been deleted? // Use this to avoid accessing singletons from a static object's destructor static bool destroyed() { - return getData().mInitState == DELETED; + return sData.mInitState == DELETED; } private: - static void createInstance(SingletonInstanceData& data); + virtual void initSingleton() {} + + struct SingletonData + { + // explicitly has a default constructor so that member variables are zero initialized in BSS + // and only changed by singleton logic, not constructor running during startup + EInitState mInitState; + DERIVED_TYPE* mInstance; + }; + static SingletonData sData; }; - -// Moved this here cause it's too big to be inlined --Aleric. -template -void LLSingleton::createInstance(SingletonInstanceData& data) -{ - if (data.mInitState == CONSTRUCTING) - { - llerrs << "Tried to access singleton " << typeid(DERIVED_TYPE).name() << " from singleton constructor!" << llendl; - } - - if (data.mInitState == DELETED) - { - llwarns << "Trying to access deleted singleton " << typeid(DERIVED_TYPE).name() << " creating new instance" << llendl; - } - if (data.mInitState == INITIALIZING) - { - llerrs << "Tried to access singleton " << typeid(DERIVED_TYPE).name() << " from initSingleton(), using half-initialized object" << llendl; - return; - } - - data.mInitState = CONSTRUCTING; - data.mSingletonInstance = new DERIVED_TYPE(); - data.mInitState = INITIALIZING; - data.mSingletonInstance->initSingleton(); - data.mInitState = INITIALIZED; -} +template +typename LLSingleton::SingletonData LLSingleton::sData; #endif From 2338e8a18697d7a01f706b872d3df18f62bd0dc1 Mon Sep 17 00:00:00 2001 From: Inusaito Sayori Date: Thu, 4 Sep 2014 17:31:11 -0400 Subject: [PATCH 4/9] Fix Issue 1653: Using Search Box causes crash --- indra/newview/llfloaterdirectory.cpp | 10 ++++++++-- indra/newview/llfloaterdirectory.h | 1 + 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/indra/newview/llfloaterdirectory.cpp b/indra/newview/llfloaterdirectory.cpp index ed01ff283..e6606de36 100644 --- a/indra/newview/llfloaterdirectory.cpp +++ b/indra/newview/llfloaterdirectory.cpp @@ -454,13 +454,13 @@ void LLFloaterDirectory::requestClassifieds() void LLFloaterDirectory::searchInAll(const std::string& search_text) { + start(); LLPanelDirFindAllInterface::search(sInstance->mFindAllPanel, search_text); performQueryOn2("classified_panel", search_text); performQueryOn2("events_panel", search_text); performQueryOn2("groups_panel", search_text); performQueryOn2("people_panel", search_text); performQueryOn2("places_panel", search_text); - sInstance->open(); } void LLFloaterDirectory::showFindAll(const std::string& search_text) @@ -582,7 +582,7 @@ void LLFloaterDirectory::focusCurrentPanel() } // static -void LLFloaterDirectory::showPanel(const std::string& tabname) +void LLFloaterDirectory::start() { // This function gets called when web browser clicks are processed, // so we don't delete the existing panel, which would delete the @@ -592,6 +592,12 @@ void LLFloaterDirectory::showPanel(const std::string& tabname) sInstance = new LLFloaterDirectory("directory"); } sInstance->open(); /*Flawfinder: ignore*/ +} + +// static +void LLFloaterDirectory::showPanel(const std::string& tabname) +{ + start(); sInstance->childShowTab("Directory Tabs", tabname); sInstance->focusCurrentPanel(); } diff --git a/indra/newview/llfloaterdirectory.h b/indra/newview/llfloaterdirectory.h index 0f5f1b501..c36ce412b 100644 --- a/indra/newview/llfloaterdirectory.h +++ b/indra/newview/llfloaterdirectory.h @@ -94,6 +94,7 @@ public: private: static void performQueryOn(const std::string& name, const std::string& search_text); static void performQueryOn2(const std::string& name, const std::string& search_text); + static void start(); static void showPanel(const std::string& tabname); /*virtual*/ void onClose(bool app_quitting); void focusCurrentPanel(); From 2772daa964cdbd2722ba1fe266fb93090ea8a2ba Mon Sep 17 00:00:00 2001 From: Inusaito Sayori Date: Thu, 4 Sep 2014 18:35:28 -0400 Subject: [PATCH 5/9] Preload trash icon Solves the issue where the remove saved login button has nothing on it --- indra/newview/skins/default/textures/textures.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/indra/newview/skins/default/textures/textures.xml b/indra/newview/skins/default/textures/textures.xml index fb9c6c1e3..574f2b3a7 100644 --- a/indra/newview/skins/default/textures/textures.xml +++ b/indra/newview/skins/default/textures/textures.xml @@ -122,7 +122,7 @@ - + From f0f124a23a5e2a6eb1014b2726158b2d120973e0 Mon Sep 17 00:00:00 2001 From: Salvatore La Bua Date: Fri, 5 Sep 2014 15:40:09 +0200 Subject: [PATCH 6/9] Add skin Dark Green, based upon the Dark skin Little changes on fonts' and windows icons' colour. --- indra/newview/skins/DarkGreen.xml | 14 + indra/newview/skins/darkgreen/colors.xml | 207 ++++++++++ .../0098b015-3daf-4cfe-a72f-915369ea97c2.tga | Bin 0 -> 2870 bytes .../3c18c87e-5f50-14e2-e744-f44734aa365f.tga | Bin 0 -> 804 bytes .../5748decc-f629-461c-9a36-a35a221fe21f.tga | Bin 0 -> 3116 bytes .../7a0b1bdb-b5d9-4df5-bac2-ba230da93b5b.tga | Bin 0 -> 2694 bytes .../7dabc040-ec13-2309-ddf7-4f161f6de2f4.tga | Bin 0 -> 1068 bytes .../89e9fc7c-0b16-457d-be4f-136270759c4d.tga | Bin 0 -> 4140 bytes .../9cad3e6d-2d6d-107d-f8ab-5ba272b5bfe1.tga | Bin 0 -> 1068 bytes .../darkgreen/textures/active_speakers.tga | Bin 0 -> 1137 bytes .../darkgreen/textures/active_voice_tab.tga | Bin 0 -> 556 bytes .../skins/darkgreen/textures/arrow_down.tga | Bin 0 -> 1068 bytes .../skins/darkgreen/textures/arrow_up.tga | Bin 0 -> 418 bytes .../b4870163-6208-42a9-9801-93133bf9a6cd.tga | Bin 0 -> 2957 bytes .../skins/darkgreen/textures/black.tga | Bin 0 -> 3116 bytes .../skins/darkgreen/textures/btn_chatbar.tga | Bin 0 -> 820 bytes .../textures/btn_chatbar_selected.tga | Bin 0 -> 1900 bytes .../darkgreen/textures/button_anim_pause.tga | Bin 0 -> 940 bytes .../textures/button_anim_pause_selected.tga | Bin 0 -> 744 bytes .../darkgreen/textures/button_anim_play.tga | Bin 0 -> 937 bytes .../textures/button_anim_play_selected.tga | Bin 0 -> 761 bytes .../darkgreen/textures/button_anim_stop.tga | Bin 0 -> 864 bytes .../textures/button_anim_stop_selected.tga | Bin 0 -> 680 bytes .../textures/button_disabled_32x128.tga | Bin 0 -> 10284 bytes .../textures/button_enabled_32x128.tga | Bin 0 -> 7081 bytes .../button_enabled_selected_32x128.tga | Bin 0 -> 5468 bytes .../c1e21504-f136-451d-b8e9-929037812f1d.tga | Bin 0 -> 2949 bytes .../c63f124c-6340-4fbf-b59e-0869a44adb64.tga | Bin 0 -> 2713 bytes .../darkgreen/textures/cam_rotate_in.tga | Bin 0 -> 814 bytes .../darkgreen/textures/cam_rotate_out.tga | Bin 0 -> 5224 bytes .../darkgreen/textures/cam_tracking_in.tga | Bin 0 -> 946 bytes .../darkgreen/textures/cam_tracking_out.tga | Bin 0 -> 4816 bytes .../darkgreen/textures/cam_zoom_minus_in.tga | Bin 0 -> 1462 bytes .../skins/darkgreen/textures/cam_zoom_out.tga | Bin 0 -> 1434 bytes .../darkgreen/textures/cam_zoom_plus_in.tga | Bin 0 -> 1522 bytes .../ce15fd63-b0b6-463c-a37d-ea6393208b3e.tga | Bin 0 -> 2755 bytes .../textures/checkbox_disabled_false.tga | Bin 0 -> 1068 bytes .../textures/checkbox_disabled_true.tga | Bin 0 -> 1068 bytes .../textures/checkbox_enabled_false.tga | Bin 0 -> 657 bytes .../textures/checkbox_enabled_true.tga | Bin 0 -> 548 bytes .../skins/darkgreen/textures/circle.tga | Bin 0 -> 1068 bytes .../darkgreen/textures/close_in_blue.tga | Bin 0 -> 668 bytes .../darkgreen/textures/close_inactive.tga | Bin 0 -> 254 bytes .../textures/close_inactive_blue.tga | Bin 0 -> 254 bytes .../skins/darkgreen/textures/closebox.tga | Bin 0 -> 748 bytes .../darkgreen/textures/combobox_arrow.tga | Bin 0 -> 202 bytes .../skins/darkgreen/textures/darkgray.tga | Bin 0 -> 3116 bytes .../darkgreen/textures/eye_button_active.tga | Bin 0 -> 2552 bytes .../textures/eye_button_inactive.tga | Bin 0 -> 2889 bytes .../ff9a71eb-7414-4cf8-866e-a701deb7c3cf.tga | Bin 0 -> 804 bytes .../textures/ff_edit_mine_button.tga | Bin 0 -> 998 bytes .../textures/ff_edit_theirs_button.tga | Bin 0 -> 1081 bytes .../textures/ff_online_status_button.tga | Bin 0 -> 1076 bytes .../textures/ff_visible_map_button.tga | Bin 0 -> 853 bytes .../textures/ff_visible_online_button.tga | Bin 0 -> 1040 bytes .../darkgreen/textures/flyout_btn_left.tga | Bin 0 -> 504 bytes .../textures/flyout_btn_left_disabled.tga | Bin 0 -> 370 bytes .../textures/flyout_btn_left_selected.tga | Bin 0 -> 1561 bytes .../darkgreen/textures/flyout_btn_right.tga | Bin 0 -> 504 bytes .../textures/flyout_btn_right_disabled.tga | Bin 0 -> 370 bytes .../textures/flyout_btn_right_selected.tga | Bin 0 -> 1407 bytes .../skins/darkgreen/textures/folder_arrow.tga | Bin 0 -> 4140 bytes .../textures/icn_active-speakers-dot-lvl0.tga | Bin 0 -> 1068 bytes .../textures/icn_active-speakers-dot-lvl1.tga | Bin 0 -> 1068 bytes .../textures/icn_active-speakers-dot-lvl2.tga | Bin 0 -> 1068 bytes .../textures/icn_active-speakers-typing1.tga | Bin 0 -> 1068 bytes .../textures/icn_active-speakers-typing2.tga | Bin 0 -> 1068 bytes .../textures/icn_active-speakers-typing3.tga | Bin 0 -> 1068 bytes .../skins/darkgreen/textures/icn_chatbar.tga | Bin 0 -> 1075 bytes .../textures/icn_clear_lineeditor.tga | Bin 0 -> 1068 bytes .../textures/icn_media-pause_active.tga | Bin 0 -> 3168 bytes .../textures/icn_media-pause_disabled.tga | Bin 0 -> 2287 bytes .../textures/icn_media-pause_enabled.tga | Bin 0 -> 2705 bytes .../textures/icn_media-play_enabled.tga | Bin 0 -> 2540 bytes .../textures/icn_media-stop_enabled.tga | Bin 0 -> 2295 bytes .../skins/darkgreen/textures/icn_media.tga | Bin 0 -> 1811 bytes .../skins/darkgreen/textures/icn_music.tga | Bin 0 -> 2185 bytes .../darkgreen/textures/icn_scrollbar.tga | Bin 0 -> 1068 bytes .../darkgreen/textures/icn_scrollbar_bg.tga | Bin 0 -> 380 bytes .../textures/icn_scrollbar_thumb.tga | Bin 0 -> 490 bytes .../textures/icn_slide-groove_dark.tga | Bin 0 -> 170 bytes .../textures/icn_slide-highlight.tga | Bin 0 -> 261 bytes .../textures/icn_slide-thumb_dark.tga | Bin 0 -> 604 bytes .../textures/icn_speaker-muted_dark.tga | Bin 0 -> 710 bytes .../darkgreen/textures/icn_speaker_dark.tga | Bin 0 -> 752 bytes .../darkgreen/textures/icn_toolbar_build.tga | Bin 0 -> 949 bytes .../darkgreen/textures/icn_toolbar_fly.tga | Bin 0 -> 912 bytes .../textures/icn_toolbar_inventory.tga | Bin 0 -> 1209 bytes .../darkgreen/textures/icn_toolbar_map.tga | Bin 0 -> 904 bytes .../textures/icn_toolbar_minimap.tga | Bin 0 -> 1215 bytes .../darkgreen/textures/icn_toolbar_radar.tga | Bin 0 -> 2348 bytes .../darkgreen/textures/icn_toolbar_search.tga | Bin 0 -> 792 bytes .../textures/icn_toolbar_snapshot.tga | Bin 0 -> 988 bytes .../skins/darkgreen/textures/lightgray.tga | Bin 0 -> 3116 bytes .../skins/darkgreen/textures/minimize.tga | Bin 0 -> 476 bytes .../darkgreen/textures/minimize_inactive.tga | Bin 0 -> 194 bytes .../darkgreen/textures/minimize_pressed.tga | Bin 0 -> 380 bytes .../darkgreen/textures/move_backward_in.tga | Bin 0 -> 651 bytes .../darkgreen/textures/move_backward_out.tga | Bin 0 -> 769 bytes .../skins/darkgreen/textures/move_down_in.tga | Bin 0 -> 703 bytes .../darkgreen/textures/move_down_out.tga | Bin 0 -> 843 bytes .../darkgreen/textures/move_forward_in.tga | Bin 0 -> 693 bytes .../darkgreen/textures/move_forward_out.tga | Bin 0 -> 869 bytes .../skins/darkgreen/textures/move_left_in.tga | Bin 0 -> 580 bytes .../darkgreen/textures/move_left_out.tga | Bin 0 -> 660 bytes .../darkgreen/textures/move_right_in.tga | Bin 0 -> 598 bytes .../darkgreen/textures/move_right_out.tga | Bin 0 -> 674 bytes .../darkgreen/textures/move_turn_left_in.tga | Bin 0 -> 1032 bytes .../darkgreen/textures/move_turn_left_out.tga | Bin 0 -> 1166 bytes .../darkgreen/textures/move_turn_right_in.tga | Bin 0 -> 975 bytes .../textures/move_turn_right_out.tga | Bin 0 -> 1127 bytes .../skins/darkgreen/textures/move_up_in.tga | Bin 0 -> 703 bytes .../skins/darkgreen/textures/move_up_out.tga | Bin 0 -> 843 bytes .../skins/darkgreen/textures/mute_icon.tga | Bin 0 -> 1042 bytes .../skins/darkgreen/textures/notify_next.png | Bin 0 -> 3360 bytes .../skins/darkgreen/textures/preview.png | Bin 0 -> 21581 bytes .../darkgreen/textures/progress_fill.tga | Bin 0 -> 896 bytes .../darkgreen/textures/progressbar_fill.tga | Bin 0 -> 773 bytes .../darkgreen/textures/progressbar_track.tga | Bin 0 -> 486 bytes .../skins/darkgreen/textures/ptt_lock_off.tga | Bin 0 -> 670 bytes .../skins/darkgreen/textures/ptt_lock_on.tga | Bin 0 -> 1068 bytes .../darkgreen/textures/radio_active_false.tga | Bin 0 -> 683 bytes .../darkgreen/textures/radio_active_true.tga | Bin 0 -> 700 bytes .../textures/radio_inactive_false.tga | Bin 0 -> 1068 bytes .../textures/radio_inactive_true.tga | Bin 0 -> 1068 bytes .../resize_handle_bottom_right_blue.tga | Bin 0 -> 305 bytes .../skins/darkgreen/textures/restore.tga | Bin 0 -> 636 bytes .../darkgreen/textures/restore_inactive.tga | Bin 0 -> 194 bytes .../darkgreen/textures/restore_pressed.tga | Bin 0 -> 564 bytes .../darkgreen/textures/rounded_square.tga | Bin 0 -> 16428 bytes .../textures/rounded_square_soft.tga | Bin 0 -> 16428 bytes .../textures/scrollbutton_down_in_blue.tga | Bin 0 -> 672 bytes .../textures/scrollbutton_down_out_blue.tga | Bin 0 -> 919 bytes .../textures/scrollbutton_left_in_blue.tga | Bin 0 -> 745 bytes .../textures/scrollbutton_left_out_blue.tga | Bin 0 -> 951 bytes .../textures/scrollbutton_right_in_blue.tga | Bin 0 -> 751 bytes .../textures/scrollbutton_right_out_blue.tga | Bin 0 -> 956 bytes .../textures/scrollbutton_up_in_blue.tga | Bin 0 -> 694 bytes .../textures/scrollbutton_up_out_blue.tga | Bin 0 -> 929 bytes .../skins/darkgreen/textures/spacer24.tga | Bin 0 -> 2348 bytes .../skins/darkgreen/textures/spacer35.tga | Bin 0 -> 3404 bytes .../darkgreen/textures/spin_down_in_blue.tga | Bin 0 -> 340 bytes .../darkgreen/textures/spin_down_out_blue.tga | Bin 0 -> 365 bytes .../darkgreen/textures/spin_up_in_blue.tga | Bin 0 -> 336 bytes .../darkgreen/textures/spin_up_out_blue.tga | Bin 0 -> 387 bytes .../darkgreen/textures/square_btn_32x128.tga | Bin 0 -> 5488 bytes .../textures/square_btn_selected_32x128.tga | Bin 0 -> 4446 bytes .../textures/status_buy_currency.tga | Bin 0 -> 740 bytes .../textures/status_buy_currency_pressed.tga | Bin 0 -> 626 bytes .../darkgreen/textures/status_buy_land.tga | Bin 0 -> 762 bytes .../darkgreen/textures/tab_bottom_blue.tga | Bin 0 -> 653 bytes .../textures/tab_bottom_selected_blue.tga | Bin 0 -> 500 bytes .../skins/darkgreen/textures/tab_left.tga | Bin 0 -> 5826 bytes .../darkgreen/textures/tab_left_selected.tga | Bin 0 -> 5801 bytes .../skins/darkgreen/textures/tab_top_blue.tga | Bin 0 -> 654 bytes .../textures/tab_top_selected_blue.tga | Bin 0 -> 500 bytes .../skins/darkgreen/textures/tabarea.tga | Bin 0 -> 1340 bytes .../skins/darkgreen/textures/textures.xml | 389 ++++++++++++++++++ .../skins/darkgreen/textures/tool_dozer.tga | Bin 0 -> 3193 bytes .../darkgreen/textures/tool_dozer_active.tga | Bin 0 -> 3279 bytes .../skins/darkgreen/textures/tool_zoom.tga | Bin 0 -> 2626 bytes .../darkgreen/textures/tool_zoom_active.tga | Bin 0 -> 2869 bytes .../textures/toolbar_btn_disabled.tga | Bin 0 -> 12332 bytes .../textures/toolbar_btn_enabled.tga | Bin 0 -> 644 bytes .../textures/toolbar_btn_selected.tga | Bin 0 -> 2608 bytes .../skins/darkgreen/textures/toolbar_tab.tga | Bin 0 -> 18211 bytes .../skins/darkgreen/textures/white.tga | Bin 0 -> 3116 bytes 167 files changed, 610 insertions(+) create mode 100644 indra/newview/skins/DarkGreen.xml create mode 100644 indra/newview/skins/darkgreen/colors.xml create mode 100644 indra/newview/skins/darkgreen/textures/0098b015-3daf-4cfe-a72f-915369ea97c2.tga create mode 100644 indra/newview/skins/darkgreen/textures/3c18c87e-5f50-14e2-e744-f44734aa365f.tga create mode 100644 indra/newview/skins/darkgreen/textures/5748decc-f629-461c-9a36-a35a221fe21f.tga create mode 100644 indra/newview/skins/darkgreen/textures/7a0b1bdb-b5d9-4df5-bac2-ba230da93b5b.tga create mode 100644 indra/newview/skins/darkgreen/textures/7dabc040-ec13-2309-ddf7-4f161f6de2f4.tga create mode 100644 indra/newview/skins/darkgreen/textures/89e9fc7c-0b16-457d-be4f-136270759c4d.tga create mode 100644 indra/newview/skins/darkgreen/textures/9cad3e6d-2d6d-107d-f8ab-5ba272b5bfe1.tga create mode 100644 indra/newview/skins/darkgreen/textures/active_speakers.tga create mode 100644 indra/newview/skins/darkgreen/textures/active_voice_tab.tga create mode 100644 indra/newview/skins/darkgreen/textures/arrow_down.tga create mode 100644 indra/newview/skins/darkgreen/textures/arrow_up.tga create mode 100644 indra/newview/skins/darkgreen/textures/b4870163-6208-42a9-9801-93133bf9a6cd.tga create mode 100644 indra/newview/skins/darkgreen/textures/black.tga create mode 100644 indra/newview/skins/darkgreen/textures/btn_chatbar.tga create mode 100644 indra/newview/skins/darkgreen/textures/btn_chatbar_selected.tga create mode 100644 indra/newview/skins/darkgreen/textures/button_anim_pause.tga create mode 100644 indra/newview/skins/darkgreen/textures/button_anim_pause_selected.tga create mode 100644 indra/newview/skins/darkgreen/textures/button_anim_play.tga create mode 100644 indra/newview/skins/darkgreen/textures/button_anim_play_selected.tga create mode 100644 indra/newview/skins/darkgreen/textures/button_anim_stop.tga create mode 100644 indra/newview/skins/darkgreen/textures/button_anim_stop_selected.tga create mode 100644 indra/newview/skins/darkgreen/textures/button_disabled_32x128.tga create mode 100644 indra/newview/skins/darkgreen/textures/button_enabled_32x128.tga create mode 100644 indra/newview/skins/darkgreen/textures/button_enabled_selected_32x128.tga create mode 100644 indra/newview/skins/darkgreen/textures/c1e21504-f136-451d-b8e9-929037812f1d.tga create mode 100644 indra/newview/skins/darkgreen/textures/c63f124c-6340-4fbf-b59e-0869a44adb64.tga create mode 100644 indra/newview/skins/darkgreen/textures/cam_rotate_in.tga create mode 100644 indra/newview/skins/darkgreen/textures/cam_rotate_out.tga create mode 100644 indra/newview/skins/darkgreen/textures/cam_tracking_in.tga create mode 100644 indra/newview/skins/darkgreen/textures/cam_tracking_out.tga create mode 100644 indra/newview/skins/darkgreen/textures/cam_zoom_minus_in.tga create mode 100644 indra/newview/skins/darkgreen/textures/cam_zoom_out.tga create mode 100644 indra/newview/skins/darkgreen/textures/cam_zoom_plus_in.tga create mode 100644 indra/newview/skins/darkgreen/textures/ce15fd63-b0b6-463c-a37d-ea6393208b3e.tga create mode 100644 indra/newview/skins/darkgreen/textures/checkbox_disabled_false.tga create mode 100644 indra/newview/skins/darkgreen/textures/checkbox_disabled_true.tga create mode 100644 indra/newview/skins/darkgreen/textures/checkbox_enabled_false.tga create mode 100644 indra/newview/skins/darkgreen/textures/checkbox_enabled_true.tga create mode 100644 indra/newview/skins/darkgreen/textures/circle.tga create mode 100644 indra/newview/skins/darkgreen/textures/close_in_blue.tga create mode 100644 indra/newview/skins/darkgreen/textures/close_inactive.tga create mode 100644 indra/newview/skins/darkgreen/textures/close_inactive_blue.tga create mode 100644 indra/newview/skins/darkgreen/textures/closebox.tga create mode 100644 indra/newview/skins/darkgreen/textures/combobox_arrow.tga create mode 100644 indra/newview/skins/darkgreen/textures/darkgray.tga create mode 100644 indra/newview/skins/darkgreen/textures/eye_button_active.tga create mode 100644 indra/newview/skins/darkgreen/textures/eye_button_inactive.tga create mode 100644 indra/newview/skins/darkgreen/textures/ff9a71eb-7414-4cf8-866e-a701deb7c3cf.tga create mode 100644 indra/newview/skins/darkgreen/textures/ff_edit_mine_button.tga create mode 100644 indra/newview/skins/darkgreen/textures/ff_edit_theirs_button.tga create mode 100644 indra/newview/skins/darkgreen/textures/ff_online_status_button.tga create mode 100644 indra/newview/skins/darkgreen/textures/ff_visible_map_button.tga create mode 100644 indra/newview/skins/darkgreen/textures/ff_visible_online_button.tga create mode 100644 indra/newview/skins/darkgreen/textures/flyout_btn_left.tga create mode 100644 indra/newview/skins/darkgreen/textures/flyout_btn_left_disabled.tga create mode 100644 indra/newview/skins/darkgreen/textures/flyout_btn_left_selected.tga create mode 100644 indra/newview/skins/darkgreen/textures/flyout_btn_right.tga create mode 100644 indra/newview/skins/darkgreen/textures/flyout_btn_right_disabled.tga create mode 100644 indra/newview/skins/darkgreen/textures/flyout_btn_right_selected.tga create mode 100644 indra/newview/skins/darkgreen/textures/folder_arrow.tga create mode 100644 indra/newview/skins/darkgreen/textures/icn_active-speakers-dot-lvl0.tga create mode 100644 indra/newview/skins/darkgreen/textures/icn_active-speakers-dot-lvl1.tga create mode 100644 indra/newview/skins/darkgreen/textures/icn_active-speakers-dot-lvl2.tga create mode 100644 indra/newview/skins/darkgreen/textures/icn_active-speakers-typing1.tga create mode 100644 indra/newview/skins/darkgreen/textures/icn_active-speakers-typing2.tga create mode 100644 indra/newview/skins/darkgreen/textures/icn_active-speakers-typing3.tga create mode 100644 indra/newview/skins/darkgreen/textures/icn_chatbar.tga create mode 100644 indra/newview/skins/darkgreen/textures/icn_clear_lineeditor.tga create mode 100644 indra/newview/skins/darkgreen/textures/icn_media-pause_active.tga create mode 100644 indra/newview/skins/darkgreen/textures/icn_media-pause_disabled.tga create mode 100644 indra/newview/skins/darkgreen/textures/icn_media-pause_enabled.tga create mode 100644 indra/newview/skins/darkgreen/textures/icn_media-play_enabled.tga create mode 100644 indra/newview/skins/darkgreen/textures/icn_media-stop_enabled.tga create mode 100644 indra/newview/skins/darkgreen/textures/icn_media.tga create mode 100644 indra/newview/skins/darkgreen/textures/icn_music.tga create mode 100644 indra/newview/skins/darkgreen/textures/icn_scrollbar.tga create mode 100644 indra/newview/skins/darkgreen/textures/icn_scrollbar_bg.tga create mode 100644 indra/newview/skins/darkgreen/textures/icn_scrollbar_thumb.tga create mode 100644 indra/newview/skins/darkgreen/textures/icn_slide-groove_dark.tga create mode 100644 indra/newview/skins/darkgreen/textures/icn_slide-highlight.tga create mode 100644 indra/newview/skins/darkgreen/textures/icn_slide-thumb_dark.tga create mode 100644 indra/newview/skins/darkgreen/textures/icn_speaker-muted_dark.tga create mode 100644 indra/newview/skins/darkgreen/textures/icn_speaker_dark.tga create mode 100644 indra/newview/skins/darkgreen/textures/icn_toolbar_build.tga create mode 100644 indra/newview/skins/darkgreen/textures/icn_toolbar_fly.tga create mode 100644 indra/newview/skins/darkgreen/textures/icn_toolbar_inventory.tga create mode 100644 indra/newview/skins/darkgreen/textures/icn_toolbar_map.tga create mode 100644 indra/newview/skins/darkgreen/textures/icn_toolbar_minimap.tga create mode 100644 indra/newview/skins/darkgreen/textures/icn_toolbar_radar.tga create mode 100644 indra/newview/skins/darkgreen/textures/icn_toolbar_search.tga create mode 100644 indra/newview/skins/darkgreen/textures/icn_toolbar_snapshot.tga create mode 100644 indra/newview/skins/darkgreen/textures/lightgray.tga create mode 100644 indra/newview/skins/darkgreen/textures/minimize.tga create mode 100644 indra/newview/skins/darkgreen/textures/minimize_inactive.tga create mode 100644 indra/newview/skins/darkgreen/textures/minimize_pressed.tga create mode 100644 indra/newview/skins/darkgreen/textures/move_backward_in.tga create mode 100644 indra/newview/skins/darkgreen/textures/move_backward_out.tga create mode 100644 indra/newview/skins/darkgreen/textures/move_down_in.tga create mode 100644 indra/newview/skins/darkgreen/textures/move_down_out.tga create mode 100644 indra/newview/skins/darkgreen/textures/move_forward_in.tga create mode 100644 indra/newview/skins/darkgreen/textures/move_forward_out.tga create mode 100644 indra/newview/skins/darkgreen/textures/move_left_in.tga create mode 100644 indra/newview/skins/darkgreen/textures/move_left_out.tga create mode 100644 indra/newview/skins/darkgreen/textures/move_right_in.tga create mode 100644 indra/newview/skins/darkgreen/textures/move_right_out.tga create mode 100644 indra/newview/skins/darkgreen/textures/move_turn_left_in.tga create mode 100644 indra/newview/skins/darkgreen/textures/move_turn_left_out.tga create mode 100644 indra/newview/skins/darkgreen/textures/move_turn_right_in.tga create mode 100644 indra/newview/skins/darkgreen/textures/move_turn_right_out.tga create mode 100644 indra/newview/skins/darkgreen/textures/move_up_in.tga create mode 100644 indra/newview/skins/darkgreen/textures/move_up_out.tga create mode 100644 indra/newview/skins/darkgreen/textures/mute_icon.tga create mode 100644 indra/newview/skins/darkgreen/textures/notify_next.png create mode 100644 indra/newview/skins/darkgreen/textures/preview.png create mode 100644 indra/newview/skins/darkgreen/textures/progress_fill.tga create mode 100644 indra/newview/skins/darkgreen/textures/progressbar_fill.tga create mode 100644 indra/newview/skins/darkgreen/textures/progressbar_track.tga create mode 100644 indra/newview/skins/darkgreen/textures/ptt_lock_off.tga create mode 100644 indra/newview/skins/darkgreen/textures/ptt_lock_on.tga create mode 100644 indra/newview/skins/darkgreen/textures/radio_active_false.tga create mode 100644 indra/newview/skins/darkgreen/textures/radio_active_true.tga create mode 100644 indra/newview/skins/darkgreen/textures/radio_inactive_false.tga create mode 100644 indra/newview/skins/darkgreen/textures/radio_inactive_true.tga create mode 100644 indra/newview/skins/darkgreen/textures/resize_handle_bottom_right_blue.tga create mode 100644 indra/newview/skins/darkgreen/textures/restore.tga create mode 100644 indra/newview/skins/darkgreen/textures/restore_inactive.tga create mode 100644 indra/newview/skins/darkgreen/textures/restore_pressed.tga create mode 100644 indra/newview/skins/darkgreen/textures/rounded_square.tga create mode 100644 indra/newview/skins/darkgreen/textures/rounded_square_soft.tga create mode 100644 indra/newview/skins/darkgreen/textures/scrollbutton_down_in_blue.tga create mode 100644 indra/newview/skins/darkgreen/textures/scrollbutton_down_out_blue.tga create mode 100644 indra/newview/skins/darkgreen/textures/scrollbutton_left_in_blue.tga create mode 100644 indra/newview/skins/darkgreen/textures/scrollbutton_left_out_blue.tga create mode 100644 indra/newview/skins/darkgreen/textures/scrollbutton_right_in_blue.tga create mode 100644 indra/newview/skins/darkgreen/textures/scrollbutton_right_out_blue.tga create mode 100644 indra/newview/skins/darkgreen/textures/scrollbutton_up_in_blue.tga create mode 100644 indra/newview/skins/darkgreen/textures/scrollbutton_up_out_blue.tga create mode 100644 indra/newview/skins/darkgreen/textures/spacer24.tga create mode 100644 indra/newview/skins/darkgreen/textures/spacer35.tga create mode 100644 indra/newview/skins/darkgreen/textures/spin_down_in_blue.tga create mode 100644 indra/newview/skins/darkgreen/textures/spin_down_out_blue.tga create mode 100644 indra/newview/skins/darkgreen/textures/spin_up_in_blue.tga create mode 100644 indra/newview/skins/darkgreen/textures/spin_up_out_blue.tga create mode 100644 indra/newview/skins/darkgreen/textures/square_btn_32x128.tga create mode 100644 indra/newview/skins/darkgreen/textures/square_btn_selected_32x128.tga create mode 100644 indra/newview/skins/darkgreen/textures/status_buy_currency.tga create mode 100644 indra/newview/skins/darkgreen/textures/status_buy_currency_pressed.tga create mode 100644 indra/newview/skins/darkgreen/textures/status_buy_land.tga create mode 100644 indra/newview/skins/darkgreen/textures/tab_bottom_blue.tga create mode 100644 indra/newview/skins/darkgreen/textures/tab_bottom_selected_blue.tga create mode 100644 indra/newview/skins/darkgreen/textures/tab_left.tga create mode 100644 indra/newview/skins/darkgreen/textures/tab_left_selected.tga create mode 100644 indra/newview/skins/darkgreen/textures/tab_top_blue.tga create mode 100644 indra/newview/skins/darkgreen/textures/tab_top_selected_blue.tga create mode 100644 indra/newview/skins/darkgreen/textures/tabarea.tga create mode 100644 indra/newview/skins/darkgreen/textures/textures.xml create mode 100644 indra/newview/skins/darkgreen/textures/tool_dozer.tga create mode 100644 indra/newview/skins/darkgreen/textures/tool_dozer_active.tga create mode 100644 indra/newview/skins/darkgreen/textures/tool_zoom.tga create mode 100644 indra/newview/skins/darkgreen/textures/tool_zoom_active.tga create mode 100644 indra/newview/skins/darkgreen/textures/toolbar_btn_disabled.tga create mode 100644 indra/newview/skins/darkgreen/textures/toolbar_btn_enabled.tga create mode 100644 indra/newview/skins/darkgreen/textures/toolbar_btn_selected.tga create mode 100644 indra/newview/skins/darkgreen/textures/toolbar_tab.tga create mode 100644 indra/newview/skins/darkgreen/textures/white.tga diff --git a/indra/newview/skins/DarkGreen.xml b/indra/newview/skins/DarkGreen.xml new file mode 100644 index 000000000..4f32939ae --- /dev/null +++ b/indra/newview/skins/DarkGreen.xml @@ -0,0 +1,14 @@ + + + skin_name + Dark Green + author_name + JB Kraft, modified by SLB Wirefly + additional_author_names + Linden Lab + skin_info + + folder_name + darkgreen + + diff --git a/indra/newview/skins/darkgreen/colors.xml b/indra/newview/skins/darkgreen/colors.xml new file mode 100644 index 000000000..50dfe55d3 --- /dev/null +++ b/indra/newview/skins/darkgreen/colors.xml @@ -0,0 +1,207 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/indra/newview/skins/darkgreen/textures/0098b015-3daf-4cfe-a72f-915369ea97c2.tga b/indra/newview/skins/darkgreen/textures/0098b015-3daf-4cfe-a72f-915369ea97c2.tga new file mode 100644 index 0000000000000000000000000000000000000000..a563672f7bf909b31d5990a59eb2e45e9cbb1b37 GIT binary patch literal 2870 zcmZveSx;406vrd;Qn&Uu$odE68O=sLS{J z!us^-lPfkh_UD5K5B~LQa&od*e6hnnesOVeizz87(&Os-L;U#KyLa#JuEfMdvDvcH z($XY7JzX+0GsVuz$`U&}J6nD^di3b3fGZ&(K{lZn@zm5*sjRG&>gsAaefqSVJ$qKp zojWHrH8oOOTPvLn4Gj`>{``4qX=#y5mo7Z_`%6ynU8GY*6oj9@_8+uLPgVnP-c7UbQ#cly1wv?Sf#-D-$00FL@VWBI;) z`=q3#M9Rv_6sDr0LTqqc_~HdAxVgDmMn^|wetupK9Xcfb{{C|EfAfwzDWhpEyl;YxIIez@O0+p7Qeg@V-+%^+};o)JKo10S)fw+D9woFY;=}G)R zFg`whJ&Z4_lAD_=`T6-$P*9+dMMXuQ!M1_>6f(?;;{1gfak}x**~9;lqc;2Hs6g1mdUH>y?KOA8N=T08m@DY+1$hhvu(ezm^*} zZb(i}j@X>DA|oRmK!4*Mv4=fw_-O;}2J=g5ijZ8sd|4hpek?CvzI3PoP-tkVgoTAk zYip~#di6@HiZgDkw$N%a_k)4jv15lqB_$=PU+m)=7819ip&^~IzOS!Oo;`b}u#~j% z&%oNYt^ZNXAhuw>wR7iA2R6XKvU%df2^km|5c~S|>tglx_DWArk4#Tbi#;Q??Ual~&6+R<8z}k&6+_pi7cdaq zzJ0r9lQmh@A`3LMpw94}nB2Q}Ps_xIu?A$b0m06&^Oua;~e-kUCoZLNn^hlbTnzWabCvpj;J=}v9cZC6P=nM%_ z-i|^)nkuUnRu*3{YjAK-JlC#W6N_ucsBmoLlA=x_7`19_Y(vQgu0VE)JyN8vzrSBR zcy5vUbqa6Zys7b7Sy|DmVB5BB8r4=51`=O(NGK9Sl8ad#rSvWCA*1wLlPW_Uj)3}K zE)Y=$v*8B+BZoX}AhzCHw{D4r)H?MPI*%v%5T=L@mt z&!21K@{Wv*h{YSssQ&jQ8N@c-8@jvQZoRKy0Y9@ literal 0 HcmV?d00001 diff --git a/indra/newview/skins/darkgreen/textures/3c18c87e-5f50-14e2-e744-f44734aa365f.tga b/indra/newview/skins/darkgreen/textures/3c18c87e-5f50-14e2-e744-f44734aa365f.tga new file mode 100644 index 0000000000000000000000000000000000000000..f7841968a9f479689c58da177554298f1be651b8 GIT binary patch literal 804 zcmZ{jL283Q6ow}a38kwXp=94)p{o>y(n4)T5nW{?h@gq!R@;b)is#BDLKlS`s(q46-%I*tc@!GvZ%_v%PosV$d)|= eKMcoFHTV%keg$u@?sRMy%1%QDJsnUELqi zd3kw%4Gj&+`ue&oEG)?K^0KV0t;x#Difn9b$mZszUbnWkMMj*<_$oMBZB_&0t z%+AjK&*f87Qvz6WaGs<1#llrx1&ai>d%cwu;}7VKIx@tcvDmdwW|(Mn(j7 zme~+2vjYJpz>5!)lams(O@iJ^b#=7{VHiFM(A z+n-?+NPI)V&OyNd%MI=r2o2`>Ac>rrnUTJ}z7RIj=eUHtEZ>uEk15B z%yM{cATlsH!1qGuA}qXS0{RVx8`L{-hxIp1w73Hib2Jr@-_g+_-QC>+H#9JCg#<(| zFCvDAhm~V&Y)p!ai`Ao;n3xwXXL)(Kbai!!hq)GrAcr=BhqkshrO;sEa{z8&)m2gO z;S@Uo9znp6n3yPOX=%FA?d|O^dMw~%rpZXk3(=pm{oC|FouU;mDx zva&L?-pgzYM37-{^21UCxteKvXSn&q>tKse84yw-ln<)Iqk$fInD7~iR!d7uD5AGi zKQ=cvOR(igYiq0O5u1F_djA6l4=S1P%EXPJ>$%68S;wzEDgy%}>zK51B^t5-_mPLPjaD@w_`eKGq@) zry;`q{e3w&IM5FIMf(&v4KfTduW6|B#>Pga0JgTaR&&axW*4+tBJ3<9Haa>2P=5Q4 zAoeu@xq&T3MMVm3lh|>gpVCwk7pV=ft=|6*{3GDk*VnSNw4~cgj$jOxfO;+KNE=W}UMAFK-LySuy75NIbPBgvPQ zm8JT80Jus@N;G#!Ib`_x+$s=jLqHD?4?2uox<5b(2?^?=7oZ6Iqz_kBRjJn`7Fd1^ zv)Cjs0Q|(yO+Cl=`i7MKY(Fb4?u zdwYAeU$B_9=%c6e%r!19E(DH6Bp+vvK=4m2EPV&f{_X7SXmT5`bj2q-f<;~ zXkSR+9eWO7;QszzER1;v4KvEwb5aF0>?oeoc!1%G0egFUTK1GMWpi_LBLNJ43(Wxs z9*$3VhTAk9_-}7-^%*+U@hJxe6y~0to#~b503a4!fg27#u^hdCAx+o`@($a0CPtot zdkyoTFpOdaM=*=SUv_r3+WxG=Sir|T=-}`6(Qz_ZwckTW$L~R7CpkLWe}nx)EyL~s QcTe{(qrbX4Tk;(L0=pRs2><{9 literal 0 HcmV?d00001 diff --git a/indra/newview/skins/darkgreen/textures/7dabc040-ec13-2309-ddf7-4f161f6de2f4.tga b/indra/newview/skins/darkgreen/textures/7dabc040-ec13-2309-ddf7-4f161f6de2f4.tga new file mode 100644 index 0000000000000000000000000000000000000000..132b192ef10fb8eb9c9b1e5e030db0683b02caed GIT binary patch literal 1068 zcmb7^F-yZh6vq!Io$TV?S899Z=-?t` za`6L1KR|_kjOYCip1hnHOyJME``!E9ae+js8O2XURaABMd`&fVraDwIaNvHg218PV zNvXhri!&QTLOj`o#Fmeien`99($b_BLsBIoNJCK3h!KcUqL4s5;QEj-g}G#Vx+6StbOCz_k^y73}q2eIALjnhUWv#r(Zm@LTnE|-hx z&Ks=Vbt-;{N`o(SYSNCm}<3}$?@N<*f>2z{^bwxh z?N;>T@j;xcp}u^my@J)jVXQ37g8coB*%s;(wI6w^-KUsr&d+DEGe(UN*TvIvS!tMP zXaw<(;Md$F#_JmxM{dVvFfcvOOSMQoCs8?rp2v6{t$%?Rc-wl1aYTD2i&de^%ga;r z#d*oJ=^50Avp(E4D)XvPTcBX=b?kDVk7j41W5@lIkMm{G?9UdZjT`zE(nBC7*( leM;V6zb{kg^?#g~_-{aURgLF-#kq>gGdf>+h1a9!{s9mWmB#=8 literal 0 HcmV?d00001 diff --git a/indra/newview/skins/darkgreen/textures/9cad3e6d-2d6d-107d-f8ab-5ba272b5bfe1.tga b/indra/newview/skins/darkgreen/textures/9cad3e6d-2d6d-107d-f8ab-5ba272b5bfe1.tga new file mode 100644 index 0000000000000000000000000000000000000000..ceaaabab83e2a873f8e35321e6e5c838e4b3321c GIT binary patch literal 1068 zcmb7^Jxjw-6oxNOI@!g&v!Ihj6f_k{X;3USRfIaaIp}0)<09fDl;R*{(@n9-(7~mU zsf#}#`U5KTXB_VvIO*xNf+@V*bDwjbd|YUhnp6BMsDdiaUv8+X&RBaB)w#!<#L7_qVC%S!qy%ak$4E4qWyJtu=bPDrL`r8Vu=srL4!?^!pdf)YIYj zKn)iD!A<|=tVjs^yq63;=BEGDTq1;hb3cpA_YWG2gz%iKnPHW4(tkW$AcSXS%?zuY zlYY{zQq;1@4M%BE%e~~7#kHpVhnk)*3%^Y9ZDoq#8kkA+>@PoPQqtP1W^uJ!)6n9Q3^zAgL!8qJwF8uN4b&#Dq_H6Sm4$34#0pn+=TQftn35tcap1e1JA83WlASSct3+HY#Kr zC5kLU8WB{mv+z*{3kwN?Wtz2EBq!&)#?cJ~cHqvPbI$iT=iU+GzSum6;-NUacR@tr z3tqxvv5;CSm1wWq?NX=HA*Y)S3It{0?@pSd={Q5hE}8 zcbIUhYwSS-5wcPyB~94wqspAQz}Gs*5TnYkIXsP0Oco5l#bPn(SFhL6>wH}SIvR}< z+O^y5aGCEAF%+ik^?I~eEM%iPkp_c-Bo+z<+2Rfnj*&=&CX)%}^LY?=95b1WB!@zw zt>Y)m^X@Bcsxf;G=j`aif~89<#Kt%qBA}k4S2~kU}m(>ONt_v9m(?D z>2&%unM_i<-Co*kw)bAIx4~lK47LVD$f61q&?+iwDwPsK|B^Sb?o?5f%Vx8=YBU;s zrv4lbhZK*;U*>YTU)T{Nk2-L`OUZqfJmp1@hBEfQ@%oB&0~(LVRH;y4`!Oda5{YLxee8&lzc~T*`~BawTCL&p`J@3l&t|h%n+cFd9k{Il zY|#e9cX#A(8eDRB*R59ThuLhNVFH{vhQB8H;2ik>{x=txd-J@poE*PZ Rtjgd)_7Paq;nPGBocc9v`) z!6IZ~c+9++_tuXPGojBy%*AqUnx>GrOH>m00gsoTIgKhw5_DY$*L4wwAuP*!&myPJ zK7BIB89K{~x~`GuIXuq;PY?vivP@NS>g>};|95^IN42-_dz59VvdnP?Id$HHzN!2$ z42a_xZQCk8_or#9_A^hNefp;IMNxpTZJTR9o}Zk$_DtlfD2mWD4Se5+<2ZVUs^rw! er%&d;-{0TgPyY?)<7IO-PR3!sx^0c!W-XrQFH3m< literal 0 HcmV?d00001 diff --git a/indra/newview/skins/darkgreen/textures/arrow_down.tga b/indra/newview/skins/darkgreen/textures/arrow_down.tga new file mode 100644 index 0000000000000000000000000000000000000000..5b05df1c29832e0bb9f0884ea9a25ab78bd4a7bf GIT binary patch literal 1068 zcmZQzU}As)0R{mE1&$VH28L0LH4IvT;qn-WK{TmhRFxZM_?magpZ_2lsK1H?Gtw)3 zrCtip|L~7z>Hq&A8pH?cPbb0*pOOIOm$K7u{|4!WVGti`h7TSyG|T;DUTXL3{Rz{D zOoPOsW@zFtqrH66w6A$5|NpP(?fp{G+4i|1&g3=;CXy&%lf{0H+e&)?kNy6lrUVPNik*yrrC_xG*xt+lu3we#FB-HZRD{`c?S zy$KU0lun&G_3!%J++6uQF~gUn%*@QDyu3U$96EGJNjy!QIPp&}CnrY%Q+`1~feH%? zRa8`@V8)CY3W|%1RXcn3Y6u z8#iv$rcIl)dGlsfZr!?7{_IuV3rMix)b3_N?B&f3K@ouj<&b zW4d+gmKnWs=T0*)9wK{(D&jnvG-;BSELoyu%a$4C%9Se>!0F**C9J8(j~`b83j0(;-Rd$)q*PoC)G$B$xlR#sMP z!nhh#Qc|M1bLVRQ{P{+{aN)uq42WSt1mCx8*`mhAMzNw>w{Dg@d@M7U8p48(m;eO66I%!&TCrkxGbno6hJ%9dOPoF+D6$~CcSY5kz6(cDL z2t_KnBt|=S?63q;e5~l)xw9gXh$VrfUA%bFT!YEwKJ~ zaQjA0LeI!rOt^jfwz_obqWb!J5n!4Kl0gl~kP;(4Z{EDIcv8dQIRnC$F=WUPBfoR! zj&O_qL!j^uqXNZ$9`t2A{e0xe5tAA(=$u4BOy=o;G!IG)$zm+A#Ysop)&(A7tfM)w zkSZXQF_4=H+Yv(ACBHLg&ZtL^9_rJlkI9k_Ms|@P7y)cP$c`>7GA1c|R0`GQ%a>IS zW;0ck;@i7-uLZbg&z`ESt<{4E4@`t~V7hp$6-DR~dHM3?i{*-K6h3XQ*&_>P6lrzu z-dz*~Jqj;w-n?mTgniJK6BeJ^cb=rUz_p|?K%bL@AL02|zLF5arAwC*^FA7+3nPt+ z|3_igr_j{-p*zIDSiwXRZv?jTzv1XUE-(hyhQ>v*DPI5>sXohyL4N-HS(O}rKD%25 zffK<&nlPilwXB%ly?cih!#v+@rNOhelEU#pY6Xva9eg6jt!rY?ph1bKMyM0&g*DUz zKfE#$4mls+97)tAk{Wj;Eh_-sn57<1iTGnZvSnQeO>6f-anPX@IVgbc*RP+&mSa8y z^RV0^oy#tqAW_=SN62(X#r4QC#xpGB5XMqE3zPoyy zyWTH*>GS-p4=Bq1r;YMmBaTg{s@w@OJc7u)|G9~fr?O%x-G*8UL_2q8c YUSa<4nMK(J*?GAc#aY=onZJ4e03M00hX4Qo literal 0 HcmV?d00001 diff --git a/indra/newview/skins/darkgreen/textures/black.tga b/indra/newview/skins/darkgreen/textures/black.tga new file mode 100644 index 0000000000000000000000000000000000000000..e368ea49674e79a5f96f788212bb73fec02fe947 GIT binary patch literal 3116 zcmZQzU}As)1qKBM2^eRT9u0xf5Eu=C(GVC7fzc2c4S~@R7!85Z5Ewxr5E2yX8s-`7 P>F=i-;pXY%s>c8Tf>8xV literal 0 HcmV?d00001 diff --git a/indra/newview/skins/darkgreen/textures/btn_chatbar.tga b/indra/newview/skins/darkgreen/textures/btn_chatbar.tga new file mode 100644 index 0000000000000000000000000000000000000000..76008aef0ca13b437487c6f346150f98296fe1fa GIT binary patch literal 820 zcmaKr*{T{r6h*6=gyiN6@)&$iz9AqtAV!5u=0ODqR1^`M5FDW4I^qE8mw1yv)BkeG zi{G)+tBD4ENJAZV?Y+Uwqd1cPed-K}7dFezV5fiLouufhOaW)9F-xNP{l!uy!_^y{SE!Oyp-W8ClS^JD1DdxL2!{d=6+q z7dIOh+DWI=+HSY%^?LesWqg7AJfA|LphO~}{eG|Ydac1=pr4@~2hQgNq-L|Ja=EN{ zJRVkdAq@#XkStrgcZAJmqjtM3CQicB)9>(|OoGbe@mP--EKV|>ozuGAuK0$u^+28( zjYc{`Uz<5zzuylVOD2=x8!+%JnQZjt`BeX@w9Nr41;nL!y z)9L6DWZ^J4K{$~@;~qE80l}ak4{4nwk0b{KgM$2@i+=tqzI^(6|1I`8mP)?;{vr19 H{+;;)sTF&n literal 0 HcmV?d00001 diff --git a/indra/newview/skins/darkgreen/textures/btn_chatbar_selected.tga b/indra/newview/skins/darkgreen/textures/btn_chatbar_selected.tga new file mode 100644 index 0000000000000000000000000000000000000000..1698e72c2c144b314b4c16613d86f72fa876f8a7 GIT binary patch literal 1900 zcmai#>1rcK6op&rnJ~$~5J&>^GcS;U-ynY`UphN z83y|W@)*I-aiXs#)$TzF5lGxFb=`C7oO^G1-dCRc{N%m$zJC?X$;t6D-&p4R^da*j zR-XP@@gf8j6&3pEt^B135i9I?GAx;;r6qm2va+Jp)m5#nt!aIIU7MSm+S=OE&d!c@ zcXze7x2J=H1DT_vBSlY6PIP*DsZz+hrYhP03Qv; z#>N5-!ZyGoju0uz!KWU0a(Hi?o;5W!s;jG0eSN(e8ynTs)Fj8@-|*4EAi&G83yuX! zTw;fhA3Qn0ZyaEGdAaC}%F0SrRaL3Fx>~ihwU$IfLqkBIwYAj>(9zLhMZkox2nHuS zm|PAG4ar9go*W>}Xdg^rVWHj>6&0zZq(o(9WeQW^{J?YmFnrhp1BVDsK;jY>K0ff2 z4VRafr`P%U`6?(V5U|C?#TL4>wDdFR@W~C>9^xC+_kd3$fe$u8HV|)rfs{8lH@3!j zEnGK-!ihN14AwXf9m%3))uVmhaf9Lya;y&nMoWc zahe|SDGvgN^1`9eRWQa815D)Z?#>QIYi|TY$!AFDksoEl5nilh3&6&HZ8 z10X6c4oLL={@zZ#AWejgWHDs%DBc9aEKM8vj5LBQ`Yb{Up%VNXeRz1V(~~X6HXQ9| zXumk)=soiwP&=T=U?3UZCrRWzK0bcBE)0V+$>e;`(8%7))xmT@q9kHk`gbe`FF!W} zV||*r_Xkn-3m?0FppQdiOBs7-dz<5o-?jkEMhjB zkpMz4nM{z+=jE{5?V{iB3y>fZ(WakZ#--C~N%A0I20F={$zln+=NH zQIdr_gFc?K3QEUIvh6orYqc6Q3Z$0HCDdbQkd7i!AS(YKn8V@tBM-TyXo_V}w!fj$ zU5-JyTt>B8MKl@(i?moQh(sbtBob0SZ8q-SKw_Bt9T#4x*=#~J8Vx88gU+3}coT!n zrBVsmZ1z#Lw3TXdyr~vjrdq8Qo@mj_@uD^)<3Lv`6;Kc6e1Baogph(0zuWEPJK#ob sHX9h+u{L7JK?pVedVOCXKiVrj_rK9@b-XyuHuF!*XV*9LkC!jnZ|7d!00000 literal 0 HcmV?d00001 diff --git a/indra/newview/skins/darkgreen/textures/button_anim_pause_selected.tga b/indra/newview/skins/darkgreen/textures/button_anim_pause_selected.tga new file mode 100644 index 0000000000000000000000000000000000000000..f75b97d6d2cac9162992a5d92cefa224793429dd GIT binary patch literal 744 zcmZva&1%9x6op3@(solHp)b&a4`C$|8!$;Nf^Pgphj^ltO zIde^&dHTqZ&BO&7jRsn+7C6`Ib<}D#$Y!&NOr=tRWm!t?bUMlv<2;k9C9Bmcgl*g5 z=2E6;hh+8+#GEJ=i=kC&nifGSVm1l6g+d|n zUn8X@t&%q{cvz`6)o!<=`h&p$Dtia=eIMd#mECSPf_V9o**nnTa6np0iC(XV(P$J_ zPcIe=ESF2{_j^cslIZSuJl^D68+oVGDf%$~j_SYQ8lAB17zOf$@^>)K*Cstvi96XU S+xbt;)QpeUuXjz)zlnc+&tMM# literal 0 HcmV?d00001 diff --git a/indra/newview/skins/darkgreen/textures/button_anim_play.tga b/indra/newview/skins/darkgreen/textures/button_anim_play.tga new file mode 100644 index 0000000000000000000000000000000000000000..37e9c7ec1d9a325ccc6ae5380cdd8b861238a3cc GIT binary patch literal 937 zcmZ`&*@_xb6zoZyMCK*)3BmW|7xFYgF+|+rhKd`CJMO!7yYGq%_(}600Y9VCbq0qF zAr0O4o~7!ZTj#W*JSey4QF&B88}CdelUaYSOZ@{{S9(6_pWmHM2aCl5>-8Gj?H2p} z9;ed@$Kz2}+VnHdywz%jMxy~@Nr35eif*@ye!mY@RWTlqF&d39pU-8bO+VwzE0s!^ z&1NKk5KJZ$6pKX(rqgL;vsvWxdGvZcAs7q>vL~2%jFa@0fCimpb~qdo3w*&j)cDoS{hY<`0-@?d2 zZt|JUW{h~)eZ5|X)9HlI=L1iqfV>_XE=sD*P$TB zwu7t2jk?)vVBn7B5kn3_DDyY{eSZDRp6R*$iY|xy>6gW6vHkqw{cid3^i}x-Jw@F4 literal 0 HcmV?d00001 diff --git a/indra/newview/skins/darkgreen/textures/button_anim_play_selected.tga b/indra/newview/skins/darkgreen/textures/button_anim_play_selected.tga new file mode 100644 index 0000000000000000000000000000000000000000..21d1c6db9ad128caa0406911700c1b53af9899f3 GIT binary patch literal 761 zcmZvaO=<6{6l+;{~)??q2Nw&={<6c zT)}1JWnPOWkQwOi>U#ARJyj*dtvG!)VH5Y)7Q5ZvFxFvgY~bxc4~_5PaEP&(e8Dmr zjX;kuHb}Z|>h(HWtrm1$N4MKWuh&Dr-&ZH^^ix;Sin}9BHkZqxSS%u&%_5)AE4x~) zf+=gY8faH46_iRPrI8_fP7sgBkw_#E4u>%q43JKz5sSr;OeR%wCeCCsNTpIL?v#Lk zrCuOO3cueEdDZ#EWuZ_&BoaX=6hbr_Rkn(;{6_dw;RIYaQs0UjRu@fCnPl!gk2D2N%eeT48 zA=A)Rbx+-MZuP0#n)XGzKabj@_RVf{I2=yvy{)YQjBZ4}TEm}SuZPuYh3$5W{eF+* z@rd*JjMM2PGh^c1XWnMBL95jQxfH;BK1aXb$8b1=QVOPNVmh5-xm?Q3m^k;DSE*F6 zSS%<25tz+pD3{B!IT#Eu8jXZV5``EOCz*Nqd|rxB;DG}x5TtUUP=Md>M<5V@@_0OW zFbo4urxU4EO0sgf943>A)YnO8kj-XMDwU8(Bw${zSLj}^S5VUaOHU?~$Ye5zMx!t< zmkTteE5f$%c>G>F7K=&oU@!=ic8WGp(%+>s2!%qRkk99Xx!diab44^94vP^yG%xYh zrDn4UEfR_RJ9j)D7bEzYbnk;?dh_~`A0^w#;N{h7H8dIxq|<5e^W1JXTrL;rs$!ti z?7Qh?kok!No2Ap~K(*U#C|;nAD}i`kox0U(6~$ul?UZsE^oK1;CuqCscDt}MBFdIv zD^QG0Sg+TyUazI_XRGjy6iTp54~K)yV=k09$raB=4mC)jlRvHZ1TJZ0;UgNybu@v|kqS3IK@eaq;Wsj?)e2N3 znxH7%OePadr&G*kGx)xb#bSZwa;aCw)S1_`_TAA;Z>Q5iuh+w1Fu-Uu!gxG}=Xv0f zTp3emo*X^&=8^;I^*S1j25Pk$%H=X#*M+K9tH?Qyqa$Wpt(K+|JKvv z3sR|6VtXcy+O`cbP4k4(q^Mm$Nr_3O6g3p2Vuj?9u&w=$1@4j literal 0 HcmV?d00001 diff --git a/indra/newview/skins/darkgreen/textures/button_enabled_32x128.tga b/indra/newview/skins/darkgreen/textures/button_enabled_32x128.tga new file mode 100644 index 0000000000000000000000000000000000000000..acfa33e7f5674aa5ec02cea220904a9af794c649 GIT binary patch literal 7081 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 literal 0 HcmV?d00001 diff --git a/indra/newview/skins/darkgreen/textures/button_enabled_selected_32x128.tga b/indra/newview/skins/darkgreen/textures/button_enabled_selected_32x128.tga new file mode 100644 index 0000000000000000000000000000000000000000..3823bc19436e144ec47037555ac901a4a05069ce GIT binary patch literal 5468 zcmaKw%TJxx6~)i@UBGsf+JM2l-^O4twt3nZY-2EB%*)1r!8UL6e!riNa=x3Wl{)C8 zlcrN5Po) zOzh8xCe0L{H5-k_{D)_7&N?@_Hixgx%%?DN?ku8 zjlRNHi!6SDPlA{DT3_PJ=|ne)YG>EJ#KnsjS*b`(4b`Tmrs7;`Y6?$unu3%RX)02j zPeF1D&ysbX44a&sj7T!40&B{hrb{1?FO(ZKT6IoeVtW0FGg3QcJ z*bFw4nUR4YgYEr{j7yNYM7?y0dWlM(PEEg*9?n$x^mJBQI&4~c8qTC~N=r*)U5u;# zL1`D$aFJ(LgLhF6$>)md%{=#ze6S#e&8G0RlJsPHF%6;r*30od^>XJ~dN)1bZ}fJa z9z~Cnq?U5l3JMAlEhs2}Uyz@Vd{sd{tc;hRmxsLkJVf(oyxiP82Wt z8HYoD0Ro3Z9+}9?%MWodc`+0`eQsoCsA~kHaENM+`4Qx$K4NOf< zb?Ch6>S|PLlHqg{H(9~Wn>Ueg^X3iQxN#FVoYGV6jT<-MUuToKas4`i>ujd#dKH4I zsw$kn#^!htCGsq>6C-@ z0FpY0yea}CaO^d1oN-|>vjukORxbXI!3s3K_Fx-Da%YXc5*pAK)oatoi=;%Ou zM?1BhsyU_|u)6Tu+uQNb)k6diA3lWF#`f@G8*H0vZEZ+wWov6|MJubVwGFMUt$4t) zt*sB>KVW+bHxW0rl~{TNAd zGLIj#y1PQ{dWg-D3p~7fmy9YR0=)zOIx=Jf7O0{uOp)o~kr5<5r+fbVIfkDPzg6Ap zAQ&DVM#2!=(C`o|)IoYXI5dRl;Lsq>4h|0D+2Aw8^x3m#c=l|7X9F0JvH}@zVBjeR z1_ls)N@JfqeG2dClc#v{2!MPPZ{DW z>Lg!mZYf!Zk+x8x)=_(Vhg&|{L?Y_@Z{7 zarfc{$5Eb{QMzFC#VGvI(NT=hNQ05l5qKg>K#?k;MWQ0Zr&tY-glIXWelSF?hDngn z8YV6vM~H#I$tshKHEO;2H(NRZ!VigVxXgj?Jwt*v+j?w#`jMquB%U&s2!8fzVE^6P7`Yi#~1+uHgnODAiqu&Zp|>gpc&fz^}ge1V_h5tYcUid&p)E zkK~RH;T;|xLdG5(9w6b6P3GWm9|s4a+WmulB<%0+V}E}Sdj~8j=RhX1x3`B~*52MO zbr*JbcNb=dExNP21AlvG2ir8;yW5Cv?`$J!dwUBqTT+&EQ%Z~iL6f>kU}E$*)l7cG zkPr%00BH{4S#uimLTC*_$w8GUa#q)PB0VK(h2E~Ltsp@Zt*o%9%TiV#sv@FFJS|b> z9bEp>(h_$QPX(FKN?2S9x76E>wSYi~`3r&+2fOAM2^^wPmXY`yy*k| z-QMA`0zN`iDf@>egxATRU783f#D~x3)LK$hjjnVU%&8aQ%(Vb(iu6Q*{d?qQ}sq y=yCK??w6eA<4=E%uY11y7n}>vzWobQey#g6I55;c-1V%hzprYfqpPR=y7@145i)B4 literal 0 HcmV?d00001 diff --git a/indra/newview/skins/darkgreen/textures/c1e21504-f136-451d-b8e9-929037812f1d.tga b/indra/newview/skins/darkgreen/textures/c1e21504-f136-451d-b8e9-929037812f1d.tga new file mode 100644 index 0000000000000000000000000000000000000000..6430fce1813e0ad9695308634f4bc2f349c4fd0c GIT binary patch literal 2949 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 AVE_OC literal 0 HcmV?d00001 diff --git a/indra/newview/skins/darkgreen/textures/cam_rotate_out.tga b/indra/newview/skins/darkgreen/textures/cam_rotate_out.tga new file mode 100644 index 0000000000000000000000000000000000000000..f8f64f1df258eac9e8bb1fa0b2a4d2e74d875323 GIT binary patch literal 5224 zcmdUzyH8w46vlV%?gB}XbV-{gO68=8#5-bnvl3w5@3%1Tnl8n%UORpywh=^Fq~~8i zNY;i1(Lv-imQq0#5h{WxaG2cRH+xx-EX%TY6+*EZ&iTIYoS8Xu=H43$eH;q@Vxd^* zi=wo(HuR>S=Qtt<2M3?;?d^TFy}kYI`uh6t>gwuL!vDDwVT1(_2$16Z46$%$XXl&c z<>lGM#l`iRnVFYUQ&Z;?6BD+-zu)%u_S!^WU!N^xgar=>kT77PAgvVy3)a@wCKeVJ zUQA9-{t2zQx!J~IF#+u`A1o2aX+vxX5C`68e|!-9>9^qwHjTbu3b>aq#_#|Vpj z9w^YT#QzbI@bU5SC%*Qtot>SwtgI{puBoZ9V`F2=Q(_*uV8J87Flbn?QIXzbWwyV+ z|K;rL>~F+;NG=|eg3bmcWnqK`kHdh51zS3gF2(#Z_yfWtO^hmG7q$F`5f=G8P@oYJ z|Di;Vj*dR{>*)7Ok#Ia7w*vzMwzRZV(^OVrrild)h^#1VRHXMnqNk^)h4b_C+axYv zw6d~NlNuczwId@Vwzjr5yM|H3vETv0^kKLlsGx?b^z~!dFP8Z+Q;)J*4Gj$zFg4fR z-7QINQWSA4ctC)JA+A9MHR=AK8EkEBmHWr+Z}#%3)^>1k&^9$SWlD$<7Wq6-pkaxB z|LQWNiRgf=AhgEDMknMk!h*+PGSf{nUFqn@aCoTqXDX7n3khRD!xI0VGP=09Fn%Sy z;_$q)kOvwTZ0YF7&>yI;Wo5)+r#S(3Cxa0dJi-{zu*6R(qx19guzyfqurr!}n2qOz z`diMqbf+TB2n!w%ZmnR!Mn!r~ba!|6mfywxBJvYu*V58rr>CbaUGKgujIiKw7|^g_ zXT{9Q%E~ltQ6R&FdU|?XX&OdYoDURek?&qExZk3G;VinoM)H)NJELTQh(A zRU8J75f(hcC?qV$M+rq~dqg1`8>RRziNnLg&;0#+$r%^T;{mgkb85ZODRbt|Z6v1T#^hgMx( zZQ0eJuhRNx+)H#Cl`zLiJi|s2)?Jj0usC0^R^k<*5VTd4i9jS!L?#2rBP+7YCL84e zi1QJU2t;vbm!Hj{tuE0L^*rGUp6-l%_9n+7Ux@I+doWSBETbsuLN3i_RYDV%Y8OU!WB zzVi!%d!VXw3DMW!{yv_&iy#KUqZA&^JhQ<+Fl<^DQVTqGeV9OMIlCQt7+O& zOO|DQ-uS*R87+Kht4^r?O?X0PF)N#0009JswN)_iHn5>dx1kAh4@lpu>$;yL$#s@x zewwCNx~_k-u?GYO3LJ3q3>Q(B<(_GpKauOYl046o?fF2=38-)_4K+=(7RT}Z9d1zo zfnmcV;*jGwAGdtPK+JIwRaI>nhA|!SBoG+Z+AZgKe%YlEKwwyFR}cijdm9mG@sS9; z*evT;#76^xVZ#fDDvIJDvTeH|Am&~nL}3`dF&d-&yUhPd?c{8DuAZvLM>`k$>fvyg FegW9-Ig9`R literal 0 HcmV?d00001 diff --git a/indra/newview/skins/darkgreen/textures/cam_tracking_out.tga b/indra/newview/skins/darkgreen/textures/cam_tracking_out.tga new file mode 100644 index 0000000000000000000000000000000000000000..7835704d1ee44a20439d5033ce85cf78cb45fea2 GIT binary patch literal 4816 zcmd6ryH6Zf6vk)n?f_1abV=(ba%H=)#5-bnEU*&7h(~xog$b{kF2x$JZLp)*7$Pjv zQ{*2&NY;i1(Lv-imQq0#5h{Wxh`E{HH|#E!ENf-YhHNpqd+zsr=iJ9R_s%%ZXHMo9 zb7Ic*lC-tfdEetD9nt;${jYX+cW-QMZQWU0TN_+iS(!-sk9$#CSm*%(QkkZFhIKP4@Kk*kW2(=m7x|222#BwTxiV>gwv) z?Ck8T@$vCLp|!NM*jOxP%gV~^{nFA>n`~`u4O&Im=mP^54qP;(_8dv?`1ttR`uh6a z>FMb=eiU!x@wlz3s%n;ab-4O+5!^nwBn3pOg!d!`xN*x0D{eWeEm1}qZ9 z@(@9{va-?+4i4I6LqmggX<<=c6clJ!uu+lTkBFL7D)qe|$}!9ZiM6%0+0M>Ro76vA zSkz}gfrcgi4~RsLj*dR}wSVpC=&%(P6&K*Tx;i^DGNL#oW{3p~Jraz7h6NiH={;3s zdwY9dPfbnzhR;P}F$@Yi3otJWEiCi|7|^g_OXo>e%-;roKzO2ou}fG*O}|SEi~0;G z(1?h?D3Qa%!!P`O^m|q$l1L!O01bRTO3o12@JewzKwT0Ya<_V@SO=H}*$Ekp~8`V1)0 zu*83Kc^cAq41mlaw5Fz}K*-R-LQjCX7;c*3N=FZuR5mI90i8Ww+0$qYgIE}rmsDFDuMqE(40p$2fMK&!2-wd|TqU8D5iY=KNSwAjGx zyWkAT9F$p139U>CLj^TdQO673#C3^)NOFOBTsGK?84{!7%*#zDlT8U*WI`O=t4}T2 z485ST%j=?z*EjKx14*d9d`>NWlDb`iYP5COe_eHArP-@sP6xD@vl5B%vBc# z^PiVON^yaUypEJlJ(9vdBuz-icPJMMiI|YCIH6p+Bw{XZ!=HK$3@)brtIjumAwA`k z`iP5ZaCM%apHH^8w}*Xombf`RJuNEW<-Z`WEup+nh5CwDkeARZiU#vRYyW-y_IudtVZ}v1MTH?2ye*xffCNKa1 literal 0 HcmV?d00001 diff --git a/indra/newview/skins/darkgreen/textures/cam_zoom_minus_in.tga b/indra/newview/skins/darkgreen/textures/cam_zoom_minus_in.tga new file mode 100644 index 0000000000000000000000000000000000000000..a1da27bf892d313165253f83d960b17c221edca2 GIT binary patch literal 1462 zcmZQz;9`IQ0R{&K1&)3Y7bgK$+nbx4`yb3=1d$+Kx0#vQe@2)%RfL&fW`m6GOh`!h z&jez@>|jQg2FbRAWSBuLGL#Xpj4B?Yt|3hzU$%n$3}#U`>^QP`3n(2n zg3=+Fg_#a1SI`Ku0-U|UEKDm1DxlmA1WmvZJgCB;GK--X6j)#u&SDlU0agMeLV`kF S!#smM{rz+!+&q0;^%wwo8@ZMM literal 0 HcmV?d00001 diff --git a/indra/newview/skins/darkgreen/textures/cam_zoom_out.tga b/indra/newview/skins/darkgreen/textures/cam_zoom_out.tga new file mode 100644 index 0000000000000000000000000000000000000000..2e9519d72451c32b3d5c0f40770fda52a3ef3501 GIT binary patch literal 1434 zcmZQz;9`IQ0R{&K1&)3Y7bgK$+nbx4`yb3=1d$+Kx0#vQe@2)%U4$D!R)O&~9}g1iW3VS14?<499IYWc_ub{r|B1(XgOLFo|8!c2#hDq7*CvRtzLUf)O&~9}g1iW3VS14?<499IYWc_u_GVCmYfeZ=_zz}bCOEJ#14uz5II~lv zlnGXPz-|>egan1UhIs~i`upidxOw`x>M;NS6VlZF literal 0 HcmV?d00001 diff --git a/indra/newview/skins/darkgreen/textures/ce15fd63-b0b6-463c-a37d-ea6393208b3e.tga b/indra/newview/skins/darkgreen/textures/ce15fd63-b0b6-463c-a37d-ea6393208b3e.tga new file mode 100644 index 0000000000000000000000000000000000000000..046e69688104f6a3298cda281b632220ef095895 GIT binary patch literal 2755 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 Bl_CHD literal 0 HcmV?d00001 diff --git a/indra/newview/skins/darkgreen/textures/checkbox_enabled_false.tga b/indra/newview/skins/darkgreen/textures/checkbox_enabled_false.tga new file mode 100644 index 0000000000000000000000000000000000000000..c29ed89c64ece7d183afc8292a96ff1bf671a97c GIT binary patch literal 657 zcmZuv%T9wp6onGwBQfbG_yZ;;LfuGd)D*fBND~VfO$xc=h%1zLALHlE(zevpXk# zymz-NilFtme%uDh_-mQ$fehyvN z(e3KcjV>vHv@{F@O0Q=$y>jI(`(_{erfI^oOjxD`%OVUo20|PERVuG-+pz6xl(u6- zvK8%T%CQ~Fyf|9WWGGh!ZWwc9EDCsP1I_sLVJVQ?4niV;6LLpF~m=~B68ZWM! vyjnah{^^M9=*RJ}ck(wG55xX;IcH)r#7K$!&87Oi6s-%Li{G&lLnr75+zjSN literal 0 HcmV?d00001 diff --git a/indra/newview/skins/darkgreen/textures/checkbox_enabled_true.tga b/indra/newview/skins/darkgreen/textures/checkbox_enabled_true.tga new file mode 100644 index 0000000000000000000000000000000000000000..c8904bc603de58165888bc885bc058aa2eba67c8 GIT binary patch literal 548 zcmZQz;9`IQ0R{mE1&)3Yw+SrPS6`aev3mA|GYmi?tq~*!CK&VM0@DiPgFbWsMgB7_ z=x_c2Qh<<;a4|gtlIk!sGyBg3Vu4KoG9db4@=Xqo4*wal!rcD1fLM4`HhOz|{bvfW z)&GC*-h=Yu~1ma>^zyxzjLPGri7O?6GW%2(TL0nAL ztjMZCiYHYh{;#d8{oe@I`Ty22Tsj$HI$Pk%S*~xL_8(*qZa=gxSg-(MHZzEYTVdPw z?c4vefE)p0V5$qW)lCa=Fn~r_dWhSH_KI9^gf#&bGcbVUJHSp%4s?RVG&miA2>{l< B!H@s| literal 0 HcmV?d00001 diff --git a/indra/newview/skins/darkgreen/textures/circle.tga b/indra/newview/skins/darkgreen/textures/circle.tga new file mode 100644 index 0000000000000000000000000000000000000000..d7097e3a35bd45ead82ae4a0b4f5b0a6c7277f63 GIT binary patch literal 1068 zcmZQzU}As)0R{mE1&;s!|1%6y%m{Rs7!XSWF*}KFbOowk1jMI+_&gA=1L8O!W&>hE z{>=xfc@MIuLULF)lMafpVXK7#}DGN`m}`ZU)GY%kgQ1%3T1`;y{e99~4d? zzY+ppfeMU)7+t>vP>d4&ps=OH{UG;H5`HlM;ETU$Ks)foAIuC;`dJ9XCxQ4J5R;OA iU}jK~eqm+0f7+Pu7 zp(?b=u?0oeb$#4`mc={EAP6qF)u${~RVj;w7$3>#kE+_TEJ^cypZG)$WLZWM2s08i z2^aghSVd8g?s*=ER=W;_2o(05Mbb1S-F4lK2owvR--yJWYEcwzei}4(orU_o|7ZAB z<%ArDL7916#l>-a!L2@J8OM=Ck|f99$!L?qg>cN7rb!{Rxiil*w>cix{X!kqhjjpR XdVTM&ANx<^&3Jjf{dzE-_IKh3LmZ^@ literal 0 HcmV?d00001 diff --git a/indra/newview/skins/darkgreen/textures/close_inactive.tga b/indra/newview/skins/darkgreen/textures/close_inactive.tga new file mode 100644 index 0000000000000000000000000000000000000000..30f6e7b5ffa1e2ac19b03163685e10c8adb56d7a GIT binary patch literal 254 zcmZQz;9`IQ0R{mE1rCP)|Nk>|o;-Q-e+!7!4PrH;vKm2R45v<=`ris?fyKb;+TmhN zSoC5uuNkc4^y$<85hjDhz~&*uI|o;-Q-e+!7!4PrH;vKm2R45v<=`ris?fyKb;+TmhN zSoC5uuNkc4^y$<85hjDhz~&*uI5CJ63y)Q`*3Md5@3xC12InX`5d)c4f%XNT#pCT2!)NhDt7mH8MAWcDo&} zaz3A literal 0 HcmV?d00001 diff --git a/indra/newview/skins/darkgreen/textures/combobox_arrow.tga b/indra/newview/skins/darkgreen/textures/combobox_arrow.tga new file mode 100644 index 0000000000000000000000000000000000000000..d769d310554f0b0639624cabf2b65531717462dd GIT binary patch literal 202 zcmZQz;9`IQ0R{mE1&;nyV}1r~L_0`=0Z16PfmmRI3B(2B{~)>*Bn&3Ns+vIJU{(uA s0!+ZU5Q%2EL|b}##(yvuo7D(0m|H`FLS4f=gFXHIbR*n6eO&bz0GQ(}@Bjb+ literal 0 HcmV?d00001 diff --git a/indra/newview/skins/darkgreen/textures/darkgray.tga b/indra/newview/skins/darkgreen/textures/darkgray.tga new file mode 100644 index 0000000000000000000000000000000000000000..e69be08937e11769435b050d9ac1ce1ef3e5c367 GIT binary patch literal 3116 zcmZQzU}As)1qKBM2?mW(Fd71*Aut*OqaiRF0;3@?8UmvsFd71*AuwV>0M;7_2?})$ S^9=U%_tTAV^Yn4mV*mi%|K(Kx literal 0 HcmV?d00001 diff --git a/indra/newview/skins/darkgreen/textures/eye_button_active.tga b/indra/newview/skins/darkgreen/textures/eye_button_active.tga new file mode 100644 index 0000000000000000000000000000000000000000..cac3de53374bf3fa62c779f2a5194f188fef03a6 GIT binary patch literal 2552 zcmbW3S!h&O7{~A2$xLEmqD2Hj&>|{`wl9LB;%=hRkYF~W7T17^Mp5F5+nGs>*^_at z5#xpmD&nq);)?seKliNpPgNW>>Iv>eQ*aefzfB+uPNuh-WpeHu>4e0vy>#D4*RMVnGi{!J*>5=77dJ{G}Am8K1k1ejT zu~Gf|_gAl8y>#Qo4S`#}e7PFu&6_8G{P^(!F4f`2j2UCILq1QRK5e&<41;@-*49?_ z>(|c$3G>#iTUxSYi5h0jnk9ei*s%dH%>fZPFE7s~aqir?die06E?v5$O`A4-f;Kld zTWF6SJ**Hw%gf7EPd)jgM~@DmVFw*Ka-_(QAa@7~>F zZ{EBq9H^sueF#p=6o(x?e7MLkIWtsCnA~Tgm;78yi5H_ebY*4%%WwLYUPHQ7QJzYnR z9I;-+<8hh$_wUPFv0{bd-?lbq&K$8gR#jCc!;~=Fwrx{*_wL<#@#4ilvz+QorKP3W zKBi2E4jn3b@A>oRiqq&mQg;gL8-`NYfibpUxpL*RcF_$RHYgMdDKj%uJ$v?4BoeWm z|LWDN|6#~rDAQS@C)TcAYx@?NXh7fht&Z4a!n}X~UWX1HQbR+7?C!4zMp6RZJgk`7 z+FDiB)z#^{y?ggs8L6%5)2EBJphu}OTV0-KV{B<@u|tvk(V=Vx+)2jy^XChEj1`8F zW156w?OPo@c+lDc>Fh*Zb1q!C zP|$(H#zDhC@+j$Q`X>7FHq)$ literal 0 HcmV?d00001 diff --git a/indra/newview/skins/darkgreen/textures/eye_button_inactive.tga b/indra/newview/skins/darkgreen/textures/eye_button_inactive.tga new file mode 100644 index 0000000000000000000000000000000000000000..6ca8feec82df41a6a97d1c948359d2ab721b4913 GIT binary patch literal 2889 zcmbW3*-sQ%6vnHIZfKe%vJIeY0>%UahD8F15cVBp-(?4tMWUdhEZ**cutgYr;&EQ) z|1&f5I%n#4usRqg(F`QrT~+6N-}%0C?!9GM0n7c%v7CRueRXwZH8wVGK6vop@2lIl zZ;Q<@?(ig{uCDHntgI{<92}IlZ{Ld9-rg3^hYufQXJ<#u-rk;A`}_Oyn=wZ0(a}*M z+DTuF%FE09XJ}|hUc7iAOG`^KKR+)E3k$NixTx3W`Sa)E;pxiCid?L&u8O_9ysT8k z#l?Sl@7%c~YinyVGczNzv$G0d#>U3PH$FZt)6>&3H#aAwkPA={q%%dDnwpZAFJDS# zW~RiViwp9|>F@8CjEoE^FE5w2wl?YP?3BK~J{cJq(HIyFz!o(cP*14D1^^%clla)! z*w8HK5R167vNB0ePnXitQmLt_5ywMmX=#z3o*rdE0@b65cuY|qTsnkSjf4=2U)<{H z!PBQtg?uW#xVX^DJsywb zKDfXs@+K!IWq5d4=(RH#ij$C#Aj!$e5<+NXMMZ_GZE9*#PkVcNH3Q2G>6Y?AZj_Ib zT)uet@Bls@Pz)OJ?9-=D%84_y6VB@DYC$7j8~EcBvdR6a2=q0UhX zF7nK!kAfcfuC6X^(akbc0GcBykjAE_rb=yXtu!|`>-VEak0c0p40mZaPrAFi<;jyL zGB7Zp7J`E$IN*ZQ@9Jg((MnZJA|6l#)f&j7aW5?`O;S=)!thL$v({Ae5+*sI|3K%b@){=b9K$ zTtV=-2XyXqHQ-_gGsX~;2UZm)NE^LM;AF-CSeBkS}V7LJhN%PEA&Tv5u~|Qgl8>+C6b+; zEw^sn(iW>FA!0*e3bwqTkz{GHqVZ$UMGxXw zJi3Pm*{MA2WV&zaQURH9VOkMINKsLdE{I=sE5%fRA@~`VP?$yc5m@vbh>D8Rb-`&7 z7Z)e7v9a?17&ObzoKP_YXJ==+i{j6{d-o(dI$Gl6;vCH4_xp8^P_Z^HgNa4DSVN(Zq5%d)5P0kL>(^qqb@1xd zEAi5$f`S6!kR}L&4B!^%A!2Mw0u1D6K8}x%6&Wldwzjrpb8|EN&DnqW{{4ILaiVbo z0l|7?yP>m6;qiLCdNvqhZOQ{VEa3F?R4oA>$RMv18f)$D?#co06Orrd>$=b9=jUtj zoGeTiTT2ijUQSO!!3Pq2A0OxE=UOtbQ~;>Hq}Uu>j2quam>R>@Lb)6z2L}f_;dlju zZQJTRb%F`Do{677e^vt6wcTGK`F(hJs6ZHd%te4jgX#FgJY8O1>I?+}0gc825P{dD zfD3A;N*5A1(2kCd#NehgI42TKYkfYSBqk>6oN_1?78dGQA^khtckkXQ=1sh>aAI)r zlyUdJdGki@-@h+0F)?!Y?p=L3;{l3YOx?V>z+V^d8!U^IORTeRCPuMJNkkx`+$8u( zF{E4)Vbd*saOCUDBtXRdAP*P}aNZ&Rw4Gh;cNPPMUMVd0qRV+ZT5#WfC!KfRFX6Y} hFV2xV>9orkgzLY-{-NgK_JQ`^o}$r~_O9k)>tEAzSYrSH literal 0 HcmV?d00001 diff --git a/indra/newview/skins/darkgreen/textures/ff9a71eb-7414-4cf8-866e-a701deb7c3cf.tga b/indra/newview/skins/darkgreen/textures/ff9a71eb-7414-4cf8-866e-a701deb7c3cf.tga new file mode 100644 index 0000000000000000000000000000000000000000..8b9d012a9b82fbf1948d5cea62bed9901fb64bcd GIT binary patch literal 804 zcmZvbOKJi^6h+HOLdeJ^WCO|EQAP<7LIU}b?X;bl8xX`FIC136p`eH;x&=W*X#a=` zf*>z_UTHx{gsys?x~Hqlej0OSPM?^Gnd{3)JRW}xuOJl;!nXiIF>1Hll3Fg85}|^e zhl9-LbLsVZQY;q5_kEp{00Z$rQ7RBwoC}8ObSkY@OQp?bqjN5o6Ax(cJaCi>L>@27 z5CnnLYBiO-^?Ge%nM~#%N{+mfN28Hct5ubgtJO-**dv`z+uK2OS2ARsI2;b8QmJUn z=P-Iak4gpB$T(pz7)ZHXR^fXxnHsN!FJ= zo6Ur_@xveba5(6k&*#Mh+B1T6XApUIb}iQJcBN1#sK}fI7%JOhRG?FfY438U)MBx4 jEgOLE!mHyNyaPG?3*KKp?mrW6iI?Y_uZP6b{jK={<(K%> literal 0 HcmV?d00001 diff --git a/indra/newview/skins/darkgreen/textures/ff_edit_mine_button.tga b/indra/newview/skins/darkgreen/textures/ff_edit_mine_button.tga new file mode 100644 index 0000000000000000000000000000000000000000..01770a3c44616c79c573a07fa7d543d08474eb39 GIT binary patch literal 998 zcmZXTON$yo6otDXgkgw@h`4eQ+$Xpi23)up#}}jVO-4lqU#K7`3W}o89pBFpSMJ>U z1N?m_oNJUc2xZH_xE?HfQVc!2d~!)pU)@q^Z5*o4CVFp6@N%lsk=dV_T%FtG)=>Ly@syq zs8*}U=ko$MolZC$4$uV>jYgphrNIcnmF_PUAk2NT5(C;OXhBlrnNX0sU@ zcdC@!O8H+;dwJYwG(xM@g45}gGPBt%D7V|~@^3Pkpc_!%$fLa3Y|4?>${8CDhhh?Q zjYdNd7K_Dz)0kAbnv;mI-O!(C={UcWQND%F%-j}?(Xiu1NUq;3#-)%o6Uyd>FFtS=9wab6>|=Axtt{5 z+}xM~m&=8tqa)1cb5Pc7HYFz<4#Vs9g1jATG^8DPL2x_G4hDm*J4JU^avTna zSYnY>DuqNMfvc-41cO1Got+^R3JHhzl+)U0F8zKV$z)PQq!DJf+XeQ>i~V>!j@#Q? zoS&ZyLNTgSNBuq*&W=%5?2)244oj(2!t?X9G{$C(QS;Im_W|{@*-Sbvm&^G0_<&+f zEuYV$dw+iqOEel45FZjB1nZofoPd|ql3{`f*=#mgtybs?D4kA2nIMjsu6n&5YPA~N zZubsok2EF`q)5@(8$F0GRjE|Az0nRyOzw0#G96wTmMkPOfh2;suh(lCXCx8<-F55r zI&_XI7K=ggDXMC<3Y|g%WWomJ?d=VUh`smscQhIeVT@X>)<3})qinm~mXb`RhC3}V z&Nn;c!K@?SKc+i={5+dL?Fz3tFd16?;`NeX%+@7}o1AqS; W;?Z9hi9jsyGxYtpFK~JBL;C|JuLFtz literal 0 HcmV?d00001 diff --git a/indra/newview/skins/darkgreen/textures/ff_online_status_button.tga b/indra/newview/skins/darkgreen/textures/ff_online_status_button.tga new file mode 100644 index 0000000000000000000000000000000000000000..79f2918299a51baeebb0e379fd2179ac19611d7c GIT binary patch literal 1076 zcmZuxOG_JJ6rE98gQaxi59l9g_x=DAg0+z(m4JwDvXB@NRD9qoGl?-0sOwaPK0ral_X|bQ-6`kV4iq|zJKx+n=Y03O_sl3trtPfeRaL?3^}-hn29chZmxtNe zSy7Vz{`tz}VOrMn^}X>pJ{?Kc=RpFgG_Rxxv9fbar;4wY3%P?d^!i<074(pAR32 zDix@tGMt~E!kjY(}nwn5uT`fe`+uz@huC6YGLLm|5QQ0(&43%6%==Agy+VJo& z(zs(d9ERKNhOe}=6zS#V<*2Q#MR9SlbX6x#CBvYfot;5v2^rnp-O?u>f<39Mtc0d% zC@CqC`UIsCZ;&}*ZDnNzCN`FH;hZ>$NF*Wxb#--UXlQ`dYK2au;R@-(zXC-?MOa%~ z!|Lj)w2wxpsHhMzv)TMVf&2S=Xf%pxeSICdxw$wxI>Pn!wN$|)(J8T5?5zSKRdS3Y zJUl!=+uGWKX>)T^8g+1R0A720d*Txgw70hx7K;Tskt#Wcz~kd1w4I$Dn6|gK#T641 z6Jl(N(Bz3kLVU~WbRt!941uSoC+Pe8`^cD{o(BEQJFD2;-NnGb06ZR#G*(b5@do+% z`58Ko{QmIpP`(t7&2G2DX0xHNun=^Nj|hbbS*c_h5-%?=@SmKVKsi1>Mu;nwIRfM( m55B&>LT4(#mE_)j0e^lAPWz9X0;|Jn`~Jmcwtma`s{982J+5y6 literal 0 HcmV?d00001 diff --git a/indra/newview/skins/darkgreen/textures/ff_visible_map_button.tga b/indra/newview/skins/darkgreen/textures/ff_visible_map_button.tga new file mode 100644 index 0000000000000000000000000000000000000000..bce9a8c617c3d3a6e6200c1d71331649855e4fd3 GIT binary patch literal 853 zcmY*Y$%-OD5UpZF+M!R~<-4#gkX@ zKi~ArnklF{WJSD;_aZVfQc=Dt|GyXIMfvu04Fm#ExLmf|tzoHjce@=> zY&J0(jgZM?q=;aEN{%VO^g3ai!{NaFe#hhSfDl4vHVBpySF4qgkqyARr274S+-^5X zZ!{WkyWKFTj5c#EmrLlyViC4nE+=8;^m@IZFSw&J#w75lqEe~g3-=0z0_ZUBhK98j z`~4ofZnq1i-EQNZmP(9jb}n>?@;2C!U@(YiGz!5AL?{%3qG=kI7UnaVhrjVggMqvThO%Axd|vvbu^?j8 z=@d?<6AK2bWLYGJ!y(vDf7r1trI#)*TY(jsiUhwJrfSjHRS*nEC( VncV9iEvuz}f6xEae!c!s{sLbDeWL&X literal 0 HcmV?d00001 diff --git a/indra/newview/skins/darkgreen/textures/ff_visible_online_button.tga b/indra/newview/skins/darkgreen/textures/ff_visible_online_button.tga new file mode 100644 index 0000000000000000000000000000000000000000..c888b08c7ed85fdde7709e9b6a3da109dc218eb4 GIT binary patch literal 1040 zcmZ`&KS<(X82T+ahr-D1xt`DKM>m|q$MbvN=Xrd;_kBM}nvq_AbJCpj;r(xm z#R7>(`tI&-f@FT)-rgd0cz6hzh!GLKxw%2A)oMW|Qo`5Q*VwJs>zLZu*nr#Z#=^n^ z^m@I(u~-b*Y!-1c-qmU~5KyBSTwPsZr&_IIIvS0_YPG`Ua$$RW8(Ujj2m}HGGsYYZ z1zV<0F&Perh?mP{%&x7iVP$0nl}ZKeb{nBkNSJs$9{Bx!@M6r76Ap(_C=@^;9cZWH zF&GR`DwV*BmY0`B!Fc%{92{VMeH~`A8AhWKG)*RxObL#|;Xoph5L$ZBOU>ir;sW`6 z9yXf|xm*r$Dl~h0dx9>@GITnfunPu*ldPINyWK8y)GO6pUS5i_+3>g3@mifu2boL; z^Yiont&Ufw2Mv{p$B&MVFdKD67R5Hj zd%Ygi+$%=73S@|xQ6p2WSdB&_?3|vSVwxp#S4<`ov|24xDivN{qri+YM~-02)F~!U zPftko`+dknO8EKt8L9L0bI3#tPoDC4Jf5J*^ZxtfUCwW|?@M2ozI^`p!@lIOeUknF D5H)vk literal 0 HcmV?d00001 diff --git a/indra/newview/skins/darkgreen/textures/flyout_btn_left.tga b/indra/newview/skins/darkgreen/textures/flyout_btn_left.tga new file mode 100644 index 0000000000000000000000000000000000000000..3060d8016b2822fd3011850d4b828942fb637533 GIT binary patch literal 504 zcmY+B-D<)>5QV2+l|Df)i}&qI1Pek;G-*P_9}op4BzPf#fHg)*A}Z*G&*)P)aO&=2 zSr=wuKIR4VLI% zxY=yLgTX)(=6Me8_xm8rvXobrW#Hj(2r^AmYa)(g&0hBPjCQ*nSR&8!lyJY_gXi-( z$oG8>Efxz>J@M^Wv(D{4@i+-us>#1dnv4!|1 nh9xnXyh^Lpg51dEa*^cua*xaYI9|hVx=q{q48EIYJr9V;;MbHZ(B8Z~ULz{IKD$_MFPZwt3JM(l8 z(U#`-rXB4!YhBk#%}Y(&tHon7isLxuu4x(`@88u9bzLvyp{gomS(eD6D3E!cBeN_+ zrfG^yk_0KGL`G4B48sr^1Od|beWd4kNY`~IuGBAE%d)t49A}DtRR|%tvu%5c|2vyI Tycs`%c=MyS>06`HvpY_ss<0JJ((WLL7 z%_?i`KMX0!keNU8&$rk5_g*4(Vtz^aEMID^`uch)Uy1Vd@>c$X@81*tNU;Pz*T=`l z!H3PwO=vcog|)M@gWcU-9336u`1lwnCnq>P zJ;mAC8P3nop%)hy(96q9$ko*qO4rxdkkQdmuo{Q7zP=7yRpC#iQb?!M$Ye6u-rj!a z*W_|Jm>P)p(n(gLg={5UNLS*Y$d|#vK}V;W-vQDi@CWu5WKLk09{;MM2(kDINASc7t)n@rT34# zleV@t4~iDb@bEB{2UjyTHU`osCnqsAHRTk*LQE0L3jC~q78v<9D-f1YVhs|FMm>n` z?r!*KVqae$w7dw6x%3JRS#$^wB`c zqfCQzmHLg+p`oF7wPcsbmWGCg3MCT`hoO;31QvP3k*1_s#8qh%!j!aXV@m`}AQ13; z*zuTDXEc>YtCIxOt@K;yw^F&X;e6(>U+B7oLZQmnvfSh|-C;X!agTD3uc}3b$7S=l zZ1&0{J64*Tn=2p7@o0scoVIe_6~3!{SJ_?aPS-QrOK1?2&6)T-+fKQz9J>^IPZ@40 zPX80fPiSIg19Kql&V$W?%rFmZhJo7*ZB9wVBnkl1xrRcqyPW_ literal 0 HcmV?d00001 diff --git a/indra/newview/skins/darkgreen/textures/flyout_btn_right.tga b/indra/newview/skins/darkgreen/textures/flyout_btn_right.tga new file mode 100644 index 0000000000000000000000000000000000000000..0a2354ef5656266f36fb1258e16784ad3f00b7f5 GIT binary patch literal 504 zcmZvZ+iJo<5QcYiRr&;87Vq1a2o{9eLQnJ}3L$}rM7$6|h|whEfC(gE<`sR8znN*p zK)W!@w;%t&46D?wx}1R;sJj~)4u>$h>)h3@D@A#p!ra>ZOWEZ-&0_rIF{k)Y4zedg{7P>SdDzWwj{Mi?1!H2LQlopaE#(AFSd5R|cCK}@qha^s@e?%Nm5L6I< z2tG^kIaafdoRicBZhjo@`p&w0uf3J3Q07;uD%F?rY*kei-2C5L{)yxtl~d_IaCpoU z=jrJQM@L7H!^1)U)5psM46+_5aTU$damBQ-kDkPaqqHJYl1QV1a+9*@5}6oJHIF_cE5QH@<(T(oHC?(R-I z5i&m0i-8y?1W6u3hCxIk5iBe$K<4M?Q8qU>huPU#%*@PSdV1Qz)y>TfgnC7QcHuJ! zx*&ptVt`CdO~E%gIf;ph35<`AV{B{;qobo385yx?=j!T8%RTB#41l*&FVy>tm_h=E zhlepVG=#yyLG<_cL;Cvq;P&+NSgblfKYtesZ+A&BR}1AX^#cO~AM{;aUFhuWgmiRt zprpOM9c^uGmRfdpcBb7I8z98f26}sYK@)@sDK04lw6?ZFnwy(Z+SJs9#>Pf8G&ESO zIz2swP+dZKcXzi&SRbE^4`NzcT0oM4)YsReuC5N@a2QfsTMIW73Kh`D$H(s<;~0pL zqKMIsT;qrkA;l$ykYF$f2?PQVzuynXrdZdOWpzwrgtZmjSC&RtT*dAPt0U}@Vu|!e z3O~})oQsPK9X5~sR_wP)u4Udr)4s4vE77m9n+DT@!@b2yHEj*5=$I%iFX@bL%neWq&Vb-H@Io?3np81^!)sc?8(VV(b3Dx3o@*^%Tn1cyuQ97qX*Nju74Ng{|nSC X*x&wOb*Ls#^Xuo=@b{V@)!)=#ZyWGg literal 0 HcmV?d00001 diff --git a/indra/newview/skins/darkgreen/textures/folder_arrow.tga b/indra/newview/skins/darkgreen/textures/folder_arrow.tga new file mode 100644 index 0000000000000000000000000000000000000000..77d470731b1cf8234902560f7d7ddcc82a74dbb0 GIT binary patch literal 4140 zcmeI0O)ErE7=VwNhy_KmVL?(h6jmq;HFD*n%or^E4O#e#wVz`vA6Y3DR!U0pv9KTu zlscaGHm9y>t{HXCxv4qRbLPywxAVN`eb2o!jZ!IPTBqVwueDZH{zVQtsM91gCseOt zyvMMTkbeyC2b>mSX!0D#0KP|%b_rQ%0AKe{)Gv8BgPceIATG0hhG9FPml%B1VhGPu zX#Lrp^Kl01paxvkqtyD*>35L(Vi8=qW!^YHr^0qbpNB?p5l3A9LwTXQ;C%|xV7nHT z_&@O;g6zp!u$hNS{3yeALca{{U@L~d_$7#a7*ELmjCT!s67XN++=gzjxd+PKf9Uip zY=JxvQ(&w1GEX`G9oKAttlOs7%=Mf92Img6I&w=4ar^&;bDPitwsUUQF7LAb;_shZ zj;({MoEQ5aaG56cmYmDFqu03_%kPhSkoE?q-f70JoY8ql@qB^AunRVyEm2S0cm(Ga x>_HpEUFYg}FV0oy0$(|IwU+9<{`XJGoST0Ga`OwBe2@+1X8V>Vg6T}Z`UX--l%N0r literal 0 HcmV?d00001 diff --git a/indra/newview/skins/darkgreen/textures/icn_active-speakers-dot-lvl0.tga b/indra/newview/skins/darkgreen/textures/icn_active-speakers-dot-lvl0.tga new file mode 100644 index 0000000000000000000000000000000000000000..35846cef323fdb360a7ddfbdfeb884b439efe19f GIT binary patch literal 1068 zcmZQzU}As)0R{mE1&;s!|1*r@(J;V~2IPU_AWTjg$p`9#fqEc=R5RYgGy`c6n^gV# sk@SPur0VAf>gk7K5Svu}Lqa{QGzbX_bq(_j_VoADjd1hyan)l003FT_ApigX literal 0 HcmV?d00001 diff --git a/indra/newview/skins/darkgreen/textures/icn_active-speakers-dot-lvl1.tga b/indra/newview/skins/darkgreen/textures/icn_active-speakers-dot-lvl1.tga new file mode 100644 index 0000000000000000000000000000000000000000..1f9f564fa95c3b09779f46b027469c5fb2cbbbf6 GIT binary patch literal 1068 zcmeH{%?ZLl6oen1yd@p14QNX66d@ok_=h)3u!Jqa5-hv( zgj_T5m_IZB%diKB@DRM3(1hJ)UDxo>pWooX8!o?iM|qX;x1Z3tntlIOmsc6x6U^XV z=~T_W*Y7Q`wcAWjkYND%I+#prj)s4uFkeBlG8qaer(HIr<@3r2-;Jh~DMq4y&M)k| zq;>a^KLE_lNVCu2aAoVc4FnMfZFu740f1Hel&j<(~SZNRv6zUr08SLrrryJqs J>Eo)$000!N4od(4 literal 0 HcmV?d00001 diff --git a/indra/newview/skins/darkgreen/textures/icn_active-speakers-typing3.tga b/indra/newview/skins/darkgreen/textures/icn_active-speakers-typing3.tga new file mode 100644 index 0000000000000000000000000000000000000000..031b3ad34436e8d841c1db08c6ab88cbbfc02161 GIT binary patch literal 1068 zcmZQzU}As)0R{mE1&;s!|1&^wJdg%q7#~D~_#jM3%pRx)2JC?hka`de1NJ}$E-{d} zK1?B$O^O&uElfSg92lPzF=RcXY}7Cu4Ub_Q90 literal 0 HcmV?d00001 diff --git a/indra/newview/skins/darkgreen/textures/icn_chatbar.tga b/indra/newview/skins/darkgreen/textures/icn_chatbar.tga new file mode 100644 index 0000000000000000000000000000000000000000..94fd6dc8928265fed5fc56b3d48c38d311b91c41 GIT binary patch literal 1075 zcmZ9M$xB;N6vkhxiB<}Qu7qydKfo>pA>f3yfzm>1+Yl&pW7Lfk)P)P-Mcb%t7b+qZ zG){?PG>Q`nMw}I?g5pAq0~P1-PxyMi14e4#JKTHTJ-_qizI&fxBpA29L?h979^aIb zl49HoUgjQ3NEPLXVtz97ogr32YHn^WN=iy#v)Lf?uRo%XEi%f;%gaMB7({n>H@H-C z4YkoF4`h^_ot+J{zrP>WzP>(`mzQ%9^;Z-UeGxtWCc&s;h>?&i@;RMO)YsR;)6>%f zD?9l8ezdi4ZKqB^U~gm(d@e&!@}iVR(2L zlarH}nVG@-{5+PHmSC=|tRQZAc^L}}3kZk9+KRTh6Z!f1gl64ApUN~s7~dj|%+1YV zb#)b+o156$+Cn4}!S3!Z_V)I$v$LbQjg1X$M)yRQmX;Fx=?+V;!IqX5{e$$jzP_%g zgM$Mc9UbBH^c3d#`8ndw&dzXre2o45eQmn9xQLOF5x86~LX-Z7X1LvM%+AhYZEX$P z+uJxiJOmM!mzTJ@x`OBW`WlvtiwkW*DBXraA;QACkE71R#&n*mYkE56MbEFyPcIq+FH*#ZTB>WP&MXyCxy~6iydlP`$ ZZ-SBI_>lF{{@(uXZIbhq{Y}Zp!*4zI4*S{^)NY@USu(t95x!J{w$CI!Z3hM zEiN%+eIPb2b-2VS(GPPk$P8q2aM^_{4$}*wVdB`tU~=d*Of9kE=;}uKh;Sz=EMTQU WNKmM2m}ju3zn^Y|o2QSf9s>aK&nT+^ literal 0 HcmV?d00001 diff --git a/indra/newview/skins/darkgreen/textures/icn_media-pause_active.tga b/indra/newview/skins/darkgreen/textures/icn_media-pause_active.tga new file mode 100644 index 0000000000000000000000000000000000000000..8988829aa77d0f4152be5b33a62ed67c96a8e68c GIT binary patch literal 3168 zcmZXXS!_*f6vwwiaW!73wLQ>IMGnLd4bc-E|0;fjii@Vt5R+^VW7cj?ll?ur#F z+?6X=x~o>La$8rgUhNvdPyn!3b7%78$vFiD1>v%?vhdoqYu#()0KVL$sg?OGP+#Q4zd3kxJqN-QB ze*O9%yLa!F_V#u;dGch+oq;NXY~Q|JmMvQ*dP~a7%SD5bnKNffRGpEAqM{-RLDtaF zV8{bOoi=S6d8t-$dv@;JDQ#_Sa`x=m6zZS@2M);c<;$hAveFPsOG~Asq$G{(fgA<7 ze#VR$5`rC3a6D`3)Tv?p>MmKbB)N6#R^vT?{`^nf@L@T0=#X@FcFLA5Tf_t1*}QqPcvPK7 z_WEtwv`JJY@w7`)SwDXKxUmk?;3L`_y|7-na>YKLJ9kbfMtIk)TW8$bNA^3FaO>7B zxqtt@+`D(res5`Mu@K1~eq^2#1MzxV2r2s0r%xMGNJ}EVX3ZMmiUs_qcAOO$nZ$1# zPzOcJQ7FC#4<5+NmoKHeyW5f5uj z2JQ0Y%f^TN!V%N_;Q{(R4yY_(=4e}jOBRjCfK=r?Q^G3dZ|86c& z`N#@9vy3~L=O_-dhmRpDgQm2yQm7s}$ri~k2tHwTj+ zB{Jzb|3%LebNlw~6umwaT|m;y_`|T-yLYc;n(icOM8`!63n4S%^#QaA&TK`6%yWGl z&AngI2lOGGz;Pfcht$AnYHG4<6EA5&PNr-iFKzbW!v}f){=Jp!=+UF?wWF)){LJ$) zW5%S&E%QhpkPp-G8&TL^WW99hlEr`R+BI_qdUSzWAN2IoN8TvYhYufG4o8k0X=l*$ zu4JB%8Z|1_bod`a*?@ki%HpbINir5Z`^+#N3bG$OW9WnQ$UI`i2=RswA1?iJb8|(v zFR^xF50e<59BxG|*8h_ASO3BqZw&=VJhqU8=yQ4+1)?;rrO3fNio-E}bFiu7)G9ad zKU?>mux=@?mXO6jwk}@0Xfh@e3E>^0f^`wFp@SjSjPIHw$YPF|2<^ znzRG}5#qULjbJErVDxLz&c>1;Sg$qNu4cAIQ_!u^_o4*lL_Sf63a&%{CfdkTGRNq% z)zCp`Er~Ed)S~7yqF`|?<1X!_g#Pt40lo(2dn%RRq7;5K4Px7~8s-2*F#x0m9abY( rue$1ut1-EnBR8sUxy`yNxxxP+%1X-fDhf&qii`fP%r7X+%XR(*gaxna literal 0 HcmV?d00001 diff --git a/indra/newview/skins/darkgreen/textures/icn_media-pause_disabled.tga b/indra/newview/skins/darkgreen/textures/icn_media-pause_disabled.tga new file mode 100644 index 0000000000000000000000000000000000000000..4690f42561d13d8b68a3c9ef73dc078249de10fa GIT binary patch literal 2287 zcmZve%T6O#5Qh8UVTK{fGY|v9-0yb`=4PsnmCxW2ZF%wcY%u>i_?$Q+*oGYxLaD51#%ue3+S;@qXvy zWhRsH78Vwg*=#nqw6t`X%jM4U`FvqzWu@S+uC5j?*4EYvzY+Utettf!v2Qi@PGj#i z_CaI6YHX;XVM#;7^7{IE_$%>^v$L})y^5OmS@S~86U`G{l#!7U>FMc_wzf7&CX@2M zsi{cF@8Ci^0J`F`b>A0*4Pry?&&or>AfA`$;cJr_(YpFd%+= zd%GBn4i68DkL&lNqoZOVtfn_;cu}uM(x#@SY$^g>U0pVj6n|`NO#T`l9~XlYDyc(T zue9cT@=5eC?nCYoULw3QF)<+q=T!2F9BoHY(U289K}Zrg|JZP9MBQk3Qd#b-d>t^s z$h;%a+uGWa;Q07By7T`BD_KG^=mV|FX+8Jo(iGZ+IiEcWY%IHWdU`6s`T4mdj*gCO zKVztIs8uu&vA@_oROSaCy##itiPqHUbui@Q01ZsBvhG9=rH2D0N7$Xbd2UasN8WvbVP3(+S}pNFE3QHYS1WXUOow$d;A zSk!?)$;%M7MErdSF^_(4?d&H569xNB!*ncHn>JX+i?5&F4X$|+9{Gj4r x^$II6{h?01goY*6OHM-%Rpab$jW2v)$^GoS`6>Hzemno;M$a!x`L%4X_b)8^aUcKy literal 0 HcmV?d00001 diff --git a/indra/newview/skins/darkgreen/textures/icn_media-pause_enabled.tga b/indra/newview/skins/darkgreen/textures/icn_media-pause_enabled.tga new file mode 100644 index 0000000000000000000000000000000000000000..c01399e270a253a82eb91c48b0b93dae5a394257 GIT binary patch literal 2705 zcmZ9OSx*#e5Qe)MMCF8&oFh3gY7FBxpo058E>S^H1Z5M~ao@&mTt;#4X|@v)+!9U9 zc;XTz!NhwL{{lb2t4X*pM&rbI=S`h@s%>M0H2v`{_10T&RekL^#ZLHB=IHO3|5mM9 z<#h9B^qMtmoW{mRr@6T~+Sb-qyLe!hxF)beX@FVMA2mB%9XZ#;>3wEVZsEN zG-;CDn>=~4cpMp}%g$>3S-W=apdR~PQ&S`J=FJnYtgK85r%jtCOP4McT^02~nwpxV zU;P(X3E8Y!DOM{nHIh{azOPuZLT1gHB^a18Wr{3YwoH_+C`~zf^r(0m8YyI?agu`v z4~oW2G!XLd-o1MR%S)Clky89yzI?f(gwy(r;0T7NPMs>{<>k`a+A7#ObLNbsQYm|% zI(14;oH!vGPcsiF5C;w%Fo<4*fC|>e0ipiI)&IBnSyfdfu~^LBcy<2#dAWS~vRt}! zNiJNtAZO2>HJFnpPl~E#d|(m6c;NJK(%rmyvtj(DKwzXbF8TTM=NkoZaO>K&YjX4E zO?!8AbjZbv7Y!3Sr%#`j5C@tbA#*_U4j(=&-C(*~wrmjs{^z1ai=vAcFCNmj%$_}4 zX3m^xYI&X~zVH7;3E8C6X}N#@zPx(%O1zgZUrOPN7cZp0zu&?Kx4ynU@t;3`E)Js% z5p^}wE&oauE?ii-Tf2p`t|E_<;oR-SSFK^H*emE|Ni}Zi9CDu zOwOG-L`F;Xi7vW{DqASFc_* zgD@T(9Q*5e>uGr8qN86fnXpXZ>&AzDWcR0bwuE zv00Z+WFUmxrBChIvqy?l_k?zt94&|{Cf~7(-x(b97`aSCEI^<^f&ez54-gO;FFb18 zC7Ur=q={Us2*Y#c%(1pd!(h>zrnz{G3YenQc?T#oY66M_AO$G9cI^sy7z*<+8>QBx z8mu82GVLzx=^jiS^s!L^fUFVF0ERw-cA-xJ3=*TaXW=507%I}@cU1WFj2ScX+INg0 zEf&u+*o+V<;K**;LjXeZhep^DfN&=gKM!GC)^V?hn?R!$SD?4tdV1>`5Q1eu`UA?K zVTyZD?+npX)}$yc8dg|9gwdy^ID{^PZZ2Vi&p$xTojVt}w1#g)AcmkNJo~08j+ju0KA*1S^?muUC!gQqs0^>JAL}}?}}+ypH|NNulHoI!B7e)w1chbxyBO9sOcJb3+%6Y{d`_d&}5=i-BDP2h@u zLCR{1k02IJ6iGmWk$zbjI}g}GcrrupWe0wEB#_Xp!XaFzA6sA=@=zQ4JK8 jn$YdZd%7oO-FSbz5C?U1LLKdre(^b(Ql!4x1@y literal 0 HcmV?d00001 diff --git a/indra/newview/skins/darkgreen/textures/icn_media-play_enabled.tga b/indra/newview/skins/darkgreen/textures/icn_media-play_enabled.tga new file mode 100644 index 0000000000000000000000000000000000000000..accac38b029004a207dd7210febcdd6ebd0bc87b GIT binary patch literal 2540 zcmZ9ONlX-Z6vnFnQJKU{lu3*lL%V?sxbL_Nf+8rJxVHP&Ztc>FdsWlj65|YV@zhSD zF(K)bi6@tn7f*dP8e`g!XpBq8c=Ph+{T@?<2q~(l`q%fp?|aL?9H+zye##vE9r5qV zl`EYje}=DKz1nGNYI0gyT0-sZ?RC3%?+)+Zzdv&1$dTyrIO( zjg8g1ytB2nHM3*Kj;t=v?c2BS>!Cx3^2d%H%d=9);;A)K#FhFa z2M-<;^-RE63{?*Q`R#fzns_?9hO=BVJ99{mIY@Z`yprJ|xj+S=L#tTSiMNHiL? z^Qlv(+qJA1Yq);3T83j^68x4iVSFQ0sCC;jU%o7t zE?trf7cR)zvuEYx$&;d)GA$?wC_FfB@s_)J^Jc^UQ%S&&sVDh)^X6Ija1he9YuDuF z&6{@a?Cg|_7cUy$>C>kNIgsaJl>?J^`0!y#!RKz-vPCd@%)*5WLyHzI%IH~U&6*`M zX3VfGd7dZnczlo{P!Ws8Ohr#mk34$xNbcOZWB+3ss*+Ip*yn0lTd|E^uwX&m{Q2{< zDA2QLmM!XJGC9a`{rYvea^;Gk1h;(Om&cDE%bPcE+?_jj%KG)|Wt6r`L@obJNm1O`9s~{uK?UFlz$otZ_4SFL%jKl-_3PL2;K2h6 z2WcLeN?@cL4u_?#u1-d2T}JiDlar2)4hs+aVF<#983_Rk|37^AP~x9HeUieDA3w^I zCr?Z;@gxbvrKYIX5!0tnkLr=fd#VS2e-GaS*|Yb!x_|$^B))w4B5pRDHA9n7x|Gt^ zty^WdHc?cMd`(S_Rou`(2cdl2cF}$B-aScv|NdRv4<9~QLOt-}xaCqdG~{ps4M52? zKtmH32dV&28tU%dyOR9zpj5Xr)v412+!NhVDqXJL5ySs(mf#)dlD2)_6F6e|*%*a)P zs+Hj>+ly{*hCxPrDE>euG@$Sb8{e8WYpfJ-n*tB2iULeQA9ff({a;t>>-6Oluig45**f!V${Mh8o|;-{xho%&1pjE9zm z2SJ!Wlq--$ph1E_q{QG$q0b75mBulebSU;J<>`Zm3D0)`JnUvnI(AR=!H1^bc>-Nl z&~ey&=v-p3v|?Jx5T>-&Z$If_pt0-2gd+WDF?AlaMd;)XbC4Cp;ZZBL8FmqpUD;R7 z$p7)nweQHx3&qd#g+QO^MsM?)?+TB){)e$Q@bRS29o^fiHKtB=AfrcC-_7aq6%1{K wd=D2XWE8Pn4GXDJv|(76M|yQl)IQyUuesLdwwm_(minf~%8uIlhMFqpKQY|RrvLx| literal 0 HcmV?d00001 diff --git a/indra/newview/skins/darkgreen/textures/icn_media-stop_enabled.tga b/indra/newview/skins/darkgreen/textures/icn_media-stop_enabled.tga new file mode 100644 index 0000000000000000000000000000000000000000..d935fa31716fe4c94bee60c9340c45405c756b77 GIT binary patch literal 2295 zcmYjTTTfGI6g`KT0c1w!!Mhls3ZioH4uWWf04WARxe0iwR|G4ULM#G;o^uLlQHJ1^ zhcaG*VDJ~1_zz6OgDByt2@k|*Y>aQdtl8@;b%d0DeEq()*4}&VeX413TI455li%2X z4;?zBjk;Ve_aBXojjl_VE;-MiKkqnw`n0XCu1-6A_^>v>Bmc;eka_j$)ljtj`6B-X z3UO=JtU*#z5;8M0QBY6-`55i(?I4EGyghT~ zj7MlvYiepVOI=GyNWh;PH*Um+4I8k2{dy2$<;s=VwQCoutE!SRwQJWPyBMyjs={B#j~~a8BS#?Wv2Wi#C1c&Xb)YUe4p9wJ|Kq}i3sa{~ow5tI zW+)uL-;bL&Z({K5*|YFUR9GQ8A!Lw)Duxp$PAD-)j~>O&ojVa9AFqIS@7@goi~#%P zd}^YhRH zfdKB_y$g$QF@%#VU}~=e$g0k<_r>3SbGBN_w8+1Uw;C^3YgH3& z!Gi}d*%?Y3mHNJZ{R-{l$B!_?3@};y7_MkH7LYb!71$t>v5>snssaxmK7>gVtF*Cv zzHi^YA!=@JP9=$TwulhThNomYnoyfIZNkZuCqv?Pw>~j35tc2~E0LK)YuUtfY@73fKVTQqYtSIqyGEn5@}hh=$r zd7!MU%%P8sjbV6r7^eI{jX8=}K}OLROfof^EOrc6Toe@*sa&O}rz?+?l$1Xj_!or6@Y86K!_q&K-E!P|9iq zH)uR1SzKe_Z{|YHFTo`&XV2i^Aa38jt-_aZv32WKq@|@PIvIKk^705>c#5(;c*)BG zXjEm8Fp9Y&A^B7qR*;W$3?V{A8s28@rAWxm&Q>KZI*acI^K@0@*YM4;yT5gWVk) zX>a!DukFdgNBYa)Vi`Z>RN?q!EPU*8D$D#^$j#053!hzL3qNv4s3(q@W)WpujmaH5 zcBoYB*|R4k?eJDomQ9 zp`ZIZn(^1@i<&w^)`xL4*{70`mzI{+D6+D$2H@5c#KOWtOLTN}NESKBATtZiH+>Wr z7h7U*aL~bm5L2k6Q}I&Kv$L~9sHwb(^85Xkn4FxH?wE#{Pp~sGGPt)cDn<_hmGOkVTrFwh^Vfvw#3H9hSZ?>e7>crsj2Ab?CfkZy0*5~ z5_@}ljy5zjWSg6to5{%f`g%(oA0Im!eTr=!9v&tmo12?0aejX8X!G;)w)xtkIlakB zTU(nYZf|cLa&>jpHt+B6<9#Ck%6lrvRvzUr)Ya8xz0?yE6XEOY>*(0S!-ISe3!b+G zMd<|v1>IX)TlVPV<72#MUbo*#|44;%T2xfD6bJ-1`D2=ni|1D8f74g zZpzBatPmI#jK|{U$RD=-HY-(z9EcR(oiPYm125_jkxjD&{N|Or{<>MW~d8Ta} z4esynOQol$N1Cmzty1ai?3CFKE)L&t16Vely@CnqulLFw=BmqGZ{gM$NSV&M2g*4Nh~!OP1_sbDQl zplq>EgG!{nySw}BP*@v>T3%k3>{H2yB$mIXrb!KKp z!o!*disF1Ym~k2m(+VX?8r(~a^zaB8#pGaCbdyAkNF*Y)o0}VXc6KIFv&RJu3>7{H zarWZk;#U@5X~)JPh0lIf0V>r&g!GZ@0>xqPhqaP!@e5X4b(bc18@JO%8M`}t<^oRw Simw%)|M@fUcSWWDFXboofON|M literal 0 HcmV?d00001 diff --git a/indra/newview/skins/darkgreen/textures/icn_music.tga b/indra/newview/skins/darkgreen/textures/icn_music.tga new file mode 100644 index 0000000000000000000000000000000000000000..81da5abcf290d124618396feb4c99fd7b4d4f356 GIT binary patch literal 2185 zcmb7GSx8)G6uzTPs1~P`fb~J4h#EyKg8Cw;pr&rUEvdEWLj*1QBn;?-Fe-YjYeDLk zsBuf8j{CmrxGy6bx9j@gzC8Gz_tW$JiOr0akX$);{OA7XeE<2*Io};gvXySHA0+F@6Du3KAMdv|bfK>Pdq zw7a`YJ3BkHy}eDFo13(;u|cn2zqY{S9M$3BVGCZmySoK19UUFi*49R;si`K$l<#1E zh1}V~ot&KhWDeD6lvoo-3ftZ<@X}o1+eturCGBYzH7@3@$ zq=|_M8XFrUOGHsuAYy<}B^jtmNlCRzT3VVxxxT(8Ef>=q%G=J)E|!aYytlU}h)`9P zwzjqe5pUnVrPb9{T3=tk10`A(4Gbt}G`HwN`Cg0%{5VLf)y6VeDssO~{q*#dPEJnf z=;%m%$NS6(Eas)S-bdBko?MI)(nMU5rl+T;PGneLUvH9DR#tArIpF*m@dRzi1%-Ny z=zds*0PjoU6ta^TasSWoMA{l|98rre@+T% zs441cFc^+~e0=oCSGMLGVtKMTv1#$``MsuLJiyc5+5Vi{8v%$e~0I548#*d?RIjYcCWPyh*1prHFD2!jHJcvxCm zswN~P7y<$U@>vRwfemPQ--(Fa=dY;27@#{K28dzN@IzAPdve5 zdwV-!^dXB}ZBn2I8i-|YZ!alOP6-mK0N5IW3S8Q0m(|tP1nsP?tra@T zlOx_U=0~s$`Zq5nkokzsnGNr*Ac6AG#l=M*9v*H;OiVPf`rmMQsI07vpvX!^MFnXp zD=Y65=O1>LkUHW)J@AeWVUulaY+{|Ao%Nxip$2{*o6^(MZ&=sw_*d{&(V~z6ix_AC hvo84bj|N1+_4{uzPyUFAj`;N#uh^d=etzCdfcXFb literal 0 HcmV?d00001 diff --git a/indra/newview/skins/darkgreen/textures/icn_scrollbar_bg.tga b/indra/newview/skins/darkgreen/textures/icn_scrollbar_bg.tga new file mode 100644 index 0000000000000000000000000000000000000000..cd484c61e8e774511beef0d8fc46f6a0745a1856 GIT binary patch literal 380 zcmZvYJqm+B5JqRMLMo4t3naY6DzURN|3Fr>}*`vdXmpXW5{kX zym`YiyC2b-rsI-Jn-zJUNAauhNCKpk;;8F779bc0rLJq%TJysg!wv`rlkrwrmK+Vk zzydVuJkL4m`Q1jl&5NbfdH d(`Ad#%+p1HQ@WSa)xQPjAUtmG`{3a3=m{%2!D#>h literal 0 HcmV?d00001 diff --git a/indra/newview/skins/darkgreen/textures/icn_scrollbar_thumb.tga b/indra/newview/skins/darkgreen/textures/icn_scrollbar_thumb.tga new file mode 100644 index 0000000000000000000000000000000000000000..b11b1bdcdd06cf4802aed001ecaf5cf558f47493 GIT binary patch literal 490 zcmZ9J&uW7}5XRj@OX;O~guXy~ -B2&IMoqtDapzD7>DdG#g%AqGV8A|eR}6O9lx z2_)XW`UzH&g`L^&w==stJBo6vw4V~3bDwcpmceyhFqbDGO;bq6aUj;~HF0wRDCBH5gNWm}!xVBdnLtEQ z)L{y#>pH|@vFPx8K8Msa4I&J~4pYeScnlE)L5C^iXf%RgQRgo)3h{~j#`iT_P%@{<1Eo)$000AWDH{L) literal 0 HcmV?d00001 diff --git a/indra/newview/skins/darkgreen/textures/icn_slide-highlight.tga b/indra/newview/skins/darkgreen/textures/icn_slide-highlight.tga new file mode 100644 index 0000000000000000000000000000000000000000..0747e3ceb5e7230c6e0644b05522f1cd01952698 GIT binary patch literal 261 zcmX|+OA5k342CnhDPAF6^a6T|3I#EPFN)w%Dojf+A!t2;3&Dlw5MAruwJziQgY7`V zmoE<(q5-upp@@>Gc^=mEPy3wA>$o8wRn5%mIA$$DhB;PL!S_JWUB5HfbvQ!rYfYuK zqLo;y1ajh2pc3TZ`XZv%2Mi{|kO9Gls)rf$!x0=dpWBIiRJ&qZXdnmGd>uii2*;Fmr2tUS(akR z@(gyK=LUG$T!uM8_w^o!=76DYYS_(PV}KX$w!KFyTSzG(A5=U_ z1HO27eTVL;$Ji?|-1a~}$mqI9!gQv4`bo9u(k6rm`s&U^Z?5IXLuW5E&@z(wE0y!P T+1#$T#dT4N)7?dJxsKR3(>v&N literal 0 HcmV?d00001 diff --git a/indra/newview/skins/darkgreen/textures/icn_speaker-muted_dark.tga b/indra/newview/skins/darkgreen/textures/icn_speaker-muted_dark.tga new file mode 100644 index 0000000000000000000000000000000000000000..f53e8ccf3cbec644f574088aeb420b5b80602535 GIT binary patch literal 710 zcmZ`%OKJi^5N%B&;v#s22$DOuf=WJJQ7ctw~#guxGY?=*+jqJ$6~SgjfGAm5^#mXVKf>I zv|24xt5r;=QyUvSzkCPds#C@t4u=Ab$K#@PsZ@f4R(dtT&RVU8{eF*pK7X(XlS$O; zb;M#Z(K?sQ!EIGYV!2!fbvBy?WiS}XTj-O?1gwP#Q|n5l0{3V%k{^>s;V*g5WHR#R zUFfUTN^(yolcF_axR=YNO=o^TLomKgXQ#*GF;c0NXx(nN;jsFDD7#Q7NPuFocqp4) zgHET@a77{!FxS~^hHkfu&1UmQhmXhiX>GuKKF4;uwFxrn?`fGshbBsLWeEuCJSB^KY$Q;S|L1m5yeeK z)D;xO#qbt=f=<)?CU-Tf2lMC6%a3> zJv$}0!^#~l z0Fs%@jOh-Ea^?E%Cw=7GfSuU4JhZSBXRD$PS zrkkY>`7CghR;^Yko6U+eOQjO&uyV*c{F?7COZXm3PvFDhknlrP4r$u9O}nsez!Ck1 z&d66k1U#KirTlz8FVe&dI;VG%rx&ry#987bd2nSUj$?=F3nCjriMG{E5uOW&4he>0;OlF`BcUc-WV2bEo}PmD!a#T?-1#oSxXU0M3%>*egF)nSIn3vC zgu`Jt91bX@s3vqg`6j_Ql<-5i@cDcw7K>=LS}2uDm`k^R3WKgfy(d~9otJQFJcBa*ei#YK6{o05APN!4rH`->iiP2~TUg^QilgR{HtEjyi z2n68qc=m*|*$n-DADvD|FS$~wY=oaEyz;Mzdm0Xh==FM9RIOJ3D`FG$R<=dVG#-x; zkH-;<#lZFHmF_0Iv9IM8+wC@1s};`A&!K3b*wS4gyAE!Tbr}o>P>aO^ic%9xvz;M( zrBZOYT+}9YBbk@O$KlP`Y&JxrQ4|UVDAxCYcZoy-R;!hoiBQ#}cRAA)bt2EIR6(xKX zguxKzKoQIoVXy}ugc%`}{9p_!S4oirshz&(t})n!&-tBu&$;K`bME;Gaao*>2{9pV zj=!0jniA)PiZvz8h8HXZPm`=E9*-w!u~-O`ub=_$gG*o}4k5-Ez5`ns$gujg_(T3cH?z+R3jjz6Z}QK;!sXMFB$x$QMH*-MJ-s&jwQ+4S^}d*pm$V!Y&CgN%&e&P=KPMBG_y;w6?Y)D=Q1x z+1Ygte}m!~;OP9SM~eEb&KYPG_{2@@T8y+9=SU0ucU z@-mi|mabWeQC3%1SIlK!U!T_U8z&P>>Xm0e zlG$v&@)^$+CnqN{H8pkZ=TVe3JUo1hb$NM-NF;)@vojnW9qHLlOiaMz@#q=2naJ{l zv_|X^UH2x3RrLG)n46o!>FFtWrZY1$SXfxV?(VKuiH>eoJl4xf<9W8Uw5VTKNl6Kk z^Yim{{hJlv+uOtT_O|j?R#p%Whc!c4>a4xJ9W^yIsH&<$XJ;n@fq?b`f6L0sKs0y2 zim`G-Lqk|xT-2W68FEf(@f^{E!{N|wsb<3`@T^#0_FipmEt!AG)VD3Jyu4gzVw5Bq z8KO5LHqmd9=J7;FM@Qiz)kSJte}BKWbx%)^*89o_%WpiE@LXgU4Tz~@pU~NO;F?%(V*Tz0duS_R;*# P{5I#ME!}KQdu99sg?yK2 literal 0 HcmV?d00001 diff --git a/indra/newview/skins/darkgreen/textures/icn_toolbar_map.tga b/indra/newview/skins/darkgreen/textures/icn_toolbar_map.tga new file mode 100644 index 0000000000000000000000000000000000000000..a100f578423ae2e769cff7e5bd366c5ebfbadc94 GIT binary patch literal 904 zcmaKrJ8J?#6on^hVM5Yd<_{$Q!pDLSNQ{V$g`L=lg`{&Mh@z;3s2~UyB8Xz4_`psr zM6k3F#n#flaN?O@vYMEIot-^%=ey_5%nETMj?E-Y;@()YTCL)&OH$Jvy4S-4zSC5` zWlDlmr?Q38;ju`W0pgufoTDpt{L16dCnPi`O(_=oB9`4ErCk;!CGEEc7MUayBvr-N3jC3%TN0uF~m!}NN+r%a>P zCu5nJ%znR*Znul=b_`>2x}k zm8eXuXEaw`W-=qA#^W(2lL;1!1$Mg~R;!gfm!nU+-40bzl&{@nZ6{2DT>LMw_H*RmP#$>u-8{doeyfj#Mgzot+(Ivsp|{O@V%% zGcL>wKg|bad=`u4DG&%C6bhlgzaMV58|ic!)6>(4L?T#OSrG`vG5!xT$xl<;K`$ej zZ8DkA-Q5j`!-1uxB}|Tvj^b@J8kN&pz9YockILvsh~${d_`$(J3=a?E>gozxTU*HG za^h#q+S(e3#Jg&R=z?`5H_IbukH>?dp&^O(`~B$Y>A~#mte_^7No;Oz;`H^YPG`YbRv;R5UJWgdZZ?-a(;eZ^r3FdrgmIx zy4ULkIjpX(${GJ=2Nlv|14%ehX|g7#zP>)Gf+)AQx7gd;6C~9$x`eOUY?cnZ;3O)| z%*;s7eLf#pE!Xw+HI9#uh41$Ew)n@!#srB|#@H7+Ne@{w>t9${5R_`Qild_=oSd8> zpU;c$;NU*s*|~5-JBP$hldB@Q!bZLsZ?-wc7{TsAe=Z6yp>wMm@7Uh znedU3k*7M!`T4nI7mGz)US3KU*4NkJr`&I-zuj);o%|f?(R@3l>~$m z?eFh{1@Vj+s+i^@Yd&qG(Rjm2V<@Y*zrV-D#RWDtHo!SG7!1v){huF@SD&By2kPgK VU+urU3|-&#pN(I;zO{eR{sGh?iLn3x literal 0 HcmV?d00001 diff --git a/indra/newview/skins/darkgreen/textures/icn_toolbar_radar.tga b/indra/newview/skins/darkgreen/textures/icn_toolbar_radar.tga new file mode 100644 index 0000000000000000000000000000000000000000..d1a55ed74ff21c97fa7e918843e951c6a633ce45 GIT binary patch literal 2348 zcmeHJUr19?7(cY>l!3RWntzs=tOr*UwuO5zOT+AfZA&WxWp0k%bc$}6YfKZ@${~(v z;G-gw*^48#Km*4l{{F+TYM{1v)zJfWt8YD=VuI z4zGjL>4L5<9%^gric+bxZhwDYFvsEHA?cP?RdLDg?)%{NPQljJHtg&q!0&$rCX*RZ z|GZfJ)CU_I8w~Z`XlXJ0^m?Zu7K_mw=VR#g;Owlg*xGs%RI01Up$Dy2cQQ6NHv?*L zEG{mJ!aq7Xq8ua~$9*;!4A9ng3y6oJy}cb23Pl>%D-I40MB%5?X*y>OYW`t1KLDyH z3aTOW?HJd3mzS4CVUs^IGc&BRvT~}guOF;d8(1t>7#OgE-ToAsnwpL!5{Z-Qpi~n= z$FZ?7hTa5Su8EW08XtGU#KbeO*#j>k*iqegQaVM9hmAJ(%Ar zjzP**s6VtHb+X3B#yH&()MIM3dYk8Yme1$e=H@1|*=&rk_xAQg;m2Yz%Ha~$%_s5( z-&>>6s3@${@>^P3A`TVynuYG})ApTZKAX+5wY9ZBf_)ZUf8*QI-_XOJN1c!PUfyK9 M{^Ty--Kk-}0mhiqHvj+t literal 0 HcmV?d00001 diff --git a/indra/newview/skins/darkgreen/textures/icn_toolbar_search.tga b/indra/newview/skins/darkgreen/textures/icn_toolbar_search.tga new file mode 100644 index 0000000000000000000000000000000000000000..2da9704f1b30d6d78c55356d7ab10eaa678a0c10 GIT binary patch literal 792 zcmZuv-HTFD5I^+A;$N_j{R8!`h;LUAqM%GdR{RS@!EZFoRl5o6r4O&)YbXc`iiY7w z_!O}{h~`QZ2KulYvNs_mE|_g_nz<#5+YZcc&N*{_GiPQFAu_U-ZL&?SZ^h+uIXMTH z;7nu~hJsB-@xtXop|Ffbqg1QaN~bUI^omNQ+OO4WOP=ScPN$PR&(U)gVeO5_<5aKL zQ-wm2dWH`F204*PP=moBxu2qE7eTgWr&1|uG#W8BI*vh4Kyg0+9&pv=)HaLF=y7L4XK?E59MyD*xj$5tPLATrOj7Fo6-#~tX zwA*c@bwQOZz!~k>YPC{`I)EmynM{VOR;!JEzdsZNVYUKECX+}_Z_-XUj$4F6p#!(u zZFvY14u|<-vG{5@9DZIb7C*qA0`1EtjaDj^mECUtWU*L+P~#(q!x4-`B8g6?^L9F& z3Zf`Vb#KxJ*=&{u0)g*9YnV)?J+Qmbn!R$l{CYB(9KnNs{hy6})o#bU7wYEwd_p2y>%(2i5T-!Ir~wnM1(eZ5{EL5)bk+5PQg2v%eZ zU-7mbay1Mkg!_nv#+{diZ1cVhD$hy(Fq|M%hHq1f4M zmM&_oy0y%LwSgLQt%+V+f>3z6y1GKP+wJ1ISS-R$snu$MYMLcbSdy7FO%r>KMgxXn zARG?E<#Hhy4C3PA0@Q1FcXyE3XL{V;-a;D;1`rPq4=|R?C6s!-j?>dq=pK&;io@YR zCX<0i0KKvG9*@V+7K;T0C1bT(L8(+KppPC11fY1mUPPnOHR`4Ja5#iEolYShA0J`B z`u2E})9FOHTt+&b#>vSEd_Er{kq9)xb|RR~W@|kq$?=xCy4`N*x-Ro02RUzUZg>Ys z^PfoG(^jokW!=us&Lp0>rBW%Vs*2;|W62c?g}`2DL~LV{l8nOE>2#1tBoK?mo=~sI z!`PT3W4XV-hyK$4H9OgEx52XXdOb`g6U^uHC!8#nCd=0E_hDzsqtOWYe4YuJ&yOLh z@hI)=3BgoQ3&GN8d`zNHC_uZsyo8;pSw{I9t^d>eBV4@sOD##(XJ%@WSawBcD9YxZ zUv$iJvs;_2cP^JhJRXO}LfVqaB0M;7_2?})$ S^9=U%_tTAV^Yn4mV*mi%|K(Kx literal 0 HcmV?d00001 diff --git a/indra/newview/skins/darkgreen/textures/minimize.tga b/indra/newview/skins/darkgreen/textures/minimize.tga new file mode 100644 index 0000000000000000000000000000000000000000..35d2e9ada7c536ad03bbcd55d0c913c75e5452cd GIT binary patch literal 476 zcmZ9JyK00$7=;~dLaKd)yg<@hrP>f7B#;|-ib-CPO7Fdo;{%5?*$mWI$|Sq3@JGX#l-8sj)Z7DWL; zqS3kaeUCIv;W!QsmSsUF(eOmY+O|a)hG62bEDLlJ4Np|8X&MAU@Dt;(#b`LFSY6lf zeIK@M|6WR>;R$2gFIQCs>3JRmN$IjIAzjynASr!1ogkwqf*>i~bsc0J#}K5yI!Tg$ zdKd;s_9jRwy_J{e`K7$A^R4P>npD*-_5Hez>S2yF=hu6G{n&q+Z|2MM?bn0(w7=87 E0ZM!fLI3~& literal 0 HcmV?d00001 diff --git a/indra/newview/skins/darkgreen/textures/minimize_inactive.tga b/indra/newview/skins/darkgreen/textures/minimize_inactive.tga new file mode 100644 index 0000000000000000000000000000000000000000..8f09acda957317659835123d6680adb47fc94412 GIT binary patch literal 194 zcmZQz;9`IQ0R{mE1rCP)|Nk>|o;-Q-e+!7!4PrIZmW5_zKgc#T0_Mh$pitK^&tOk~ NKivp7Paju31^~b_av}f# literal 0 HcmV?d00001 diff --git a/indra/newview/skins/darkgreen/textures/minimize_pressed.tga b/indra/newview/skins/darkgreen/textures/minimize_pressed.tga new file mode 100644 index 0000000000000000000000000000000000000000..bc03952e7d2d5ee37ceec655ecbfced92018adeb GIT binary patch literal 380 zcmZXQO$viR429#abmb9xf%XbrSt^tY{i6r)BI3eDnX8D`@E!vSBBFwbi0Ncfb)Z>< z_q_>8CIDNQ!v-668_W0oa~Ou%M&L zN*;);}Qr1TyvX>C@3*#Z6$vKtH*(wzggeO8;&H68~9%#9tu(2E?B> zZ{FPY_wQfkUXa>Gu!c{cK8e@W)jb4CfA0hmU}wArnSA2Ji3EhgevllP3-)6>h>P$I y!>?bzIMBs_0Vy!l#J+$3&WmvKd{7XPM8FbTNKmM2m}ju3zn^Y|o2QSf9s>ZyYKSZV literal 0 HcmV?d00001 diff --git a/indra/newview/skins/darkgreen/textures/move_backward_out.tga b/indra/newview/skins/darkgreen/textures/move_backward_out.tga new file mode 100644 index 0000000000000000000000000000000000000000..1acce4b7b1a14bbd63a04758ecaa3ab9d3ad48bf GIT binary patch literal 769 zcmZQz;9`IQ1qLAGnE(I(e})ba!F1!s4d-3Ec2)lS_m6QhNTeM^Fn{~@jlZR(B92qB4pCGn7;P}eZeU{8NP-3T{NA6GpF09nnn-~a#s literal 0 HcmV?d00001 diff --git a/indra/newview/skins/darkgreen/textures/move_down_in.tga b/indra/newview/skins/darkgreen/textures/move_down_in.tga new file mode 100644 index 0000000000000000000000000000000000000000..904e9a8c8231fcc7a06dde22e16a688954ed76a9 GIT binary patch literal 703 zcmZQz;9`IQ1qLAGnE(I(e};At!SwInKgM0Vc2(ZEal?5ET$uUXxpQH8d3pa^T3T*? z`}U20GDxZwM6dyMFm2zyy}qQRTN6D<~-V1XTA8i2t_1H2iLD zZM_ckwM!pd1Jj8UCla8hzwQJp1oFPu)zv-x^y!m$FI*vWd3ia=@4tZ<7PG literal 0 HcmV?d00001 diff --git a/indra/newview/skins/darkgreen/textures/move_down_out.tga b/indra/newview/skins/darkgreen/textures/move_down_out.tga new file mode 100644 index 0000000000000000000000000000000000000000..39bcda4c3719d0fcccecf27b56befb17610be590 GIT binary patch literal 843 zcmZQz;9`IQ1qLAGnE(I(e};At!SwInKgM0Vc2(ZEal?5ET$uUXxpQH8d3pa^T3T*? z`}U20GDxZwM6dyMFm2zyy}qQR5zHVHw{G3qTwGlIJ|H0Ab0bJCi>aw8 zSQF6v9~~VXmv7#@=`;bM>GbK-(IE4~!^1xr8yo*?LeT`WskyoN4$vl{evqa{5W({I z?_cK4n>V)=6cl{&@$vZv)bqCuq>%~e%-^l8t=EC!;L-=zz;xooi3E@>DJdzhJHZNp zyzg~&bq_y%`Xt^9SIAagUj7a!^}DdJ@H5c#uerIoVAq3u(G1ea0ulkrd9FjS33m8ExV5ABl%t6>rvLveW(2NB+p%vsd23(Fo_bte6;HYE(g&a5~km{s% okdqj`fB()4_TYR_B#}hGGD}EMsB4&Ku&2MDZiJhskE({SB{RqYX{{3Uxx^-(aP|bTF{tRM(P5#l*(Q*0a&6`dL zKQo;9OlJ9jQDFE8&u(1e@7B*8x!F2w{ifpOQaU6nw;IZpuz&nJa|CCiYYP}eZeU{8NP M-3T{NA6GpF06~(Ts{jB1 literal 0 HcmV?d00001 diff --git a/indra/newview/skins/darkgreen/textures/move_forward_out.tga b/indra/newview/skins/darkgreen/textures/move_forward_out.tga new file mode 100644 index 0000000000000000000000000000000000000000..643c260667251729c581c74998848f1246c927ea GIT binary patch literal 869 zcmZQz;9`IQ1qLAGnE(I(e+Dqo3SzbA=H~uq`2PJn?*tGREXDv5Yc(@7`_Bksef#!J z08O$9B*|cEYWlwspEA5=&{>iRK?GZQ zdHK8i{QTdAg@vCB3JShrxQ_)S0+jh&TwMGG#BOhIzt{^mfa%1E6A3^A{->m*yzT^f zhzZF1URPK5@YAPH;s}K-fB*hv-n@Bp8_=vzK0ZF*fNKA?fi*-#MEq`TZM}Zu#toM~ zkjc#;g8B66)6pQ4!^6Wr85lq?rh-Hu!kag5Zp+Wl|DT(i z`yVXa0+M6-_wOIm>C>m93knK80i|A}N;7TUy0saq>supSt_h@-8Km{hnKO~a#l`P| zQlI)j@|_?lusqZD?c3|2dOw5pG5{6)>w&9c0VxF5o&F1y$lq?rh-Hu!kag5Zp+Wl|DT(i z`yVXa0+M6-_wOIm>C>m93knK8rKF_1Mw8yUb!#(7myeInH#0LcgzhGgZf20~GiT03 z78e)44-XIj)Cf}312Ur%Bo9`^w0-;bdXO0b0Rf-E3K-1I&Hr_Slrq4TvVhbBjbl7_ z?p#<&Ny)p2h=@Sy?|)!m;O7ab@~j~F8#it^x3sj} zjE;`}36chx(}$|A5u}dg+qZB0ot>Q*larJGz!dhPDg^t4<@W8{4nPxc0Zse?Q`m#5 zuo+|`)7P(G1v@%AE`v-&3lm7N-@JL#skyoN4$zmsK?Z=rp#!9~5$G5JhVS3M^MXUL z6(q(CG)}0swe>nM6u-kG2okM8PrB6A)jfm@w}W&re){xDyuH2sA~>e!gM=t1V5u%7 VDAYB~GuYGLPdCEN)5leh0RTE%b@u=O literal 0 HcmV?d00001 diff --git a/indra/newview/skins/darkgreen/textures/move_right_in.tga b/indra/newview/skins/darkgreen/textures/move_right_in.tga new file mode 100644 index 0000000000000000000000000000000000000000..c85c4c33584d8fea19693e5dc754b590e35589b7 GIT binary patch literal 598 zcmZQz;9`IQ1qLAGnE(I(e+Dqo3t}TH;r#sk|C={&ZbJyO zfK&tVYasq~`t<4OfB*h5^}uyCf}}wvegkRUx^-(aSgsMI04&!5l>5s7B>sT8Amjc5 z@h2dDf9A}YNRV+|VAUX^A1Dkq?lZ`^?c2B4BjhH4;mE)1xbu>-DmB3y4? zUf%y*yLMG#k^9-w(sJ|0jT_DgIk34PFZ}83?7aBx+c*ABxS4SG`~d2^b^G>h2ZVe2 zVD|m#=;*lo_3Kx`Zn!>%@87@kb^y&1VEgs!7Y9fjsQNQV2N3^mZf?GF^X5$_L^y){ z^#zE(x3;!k2bv`WjuS-0)Ya8J1UlOV5iyMI?d=yoeflKc4>El|RR~zR2?+{y4f724 P^!L+^aP#zW)nfnv;yh*d literal 0 HcmV?d00001 diff --git a/indra/newview/skins/darkgreen/textures/move_right_out.tga b/indra/newview/skins/darkgreen/textures/move_right_out.tga new file mode 100644 index 0000000000000000000000000000000000000000..729331d99ae98e0517668abf0a33ff9e1cd9a6b6 GIT binary patch literal 674 zcmZQz;9`IQ1qLAGnE(I(e+Dqo3t}TH;r#sk|C={&ZbJyO zfK;cXq`WRDDEM^x^y%n-|Nb%cz;%J8&CJaH`}p{L1L@wnb!#(Nx)G#?5u`gKBjbNZ zdV2a__RP%8KOhm11|a?$9v=RwxVZTJnKNf1LFRUW^nf*j9SKrqZf^d+2gG0s2nhHL zvSIu7?ez$S3?TFRK?;~7A|gJOl$5+XckWym&@{#lxM^TT6Tqef1_pl4%gg(}YuBzy zGzEPi1uUkfreOC)M@Ro`X=%B6oA?80 z;;q}aZ#y77&;#;7BiL;qlR7#&E`R;{Rj?aj()aJ*c{_ln3$XqA^@{@}4vdS>ARRy- z|88z>zH{^DO(#U0Fav}13oxXEl|RR~xb3<(N#4f724^!L+^aP#zW)nfnvvsQmC literal 0 HcmV?d00001 diff --git a/indra/newview/skins/darkgreen/textures/move_turn_left_in.tga b/indra/newview/skins/darkgreen/textures/move_turn_left_in.tga new file mode 100644 index 0000000000000000000000000000000000000000..970b7f2eca43a17399cdb583f4f5cba2b3de660b GIT binary patch literal 1032 zcma)5O^cFI6n^z}#;IS>vQ5j1XdOghU_?<((W;1|K>PwR33V}}IhG%(^8@A&xDr*0R&bj9v1>v+X|C|-*ySAfgn!qNG zmCk0fX%2@&*(4+DX(tgB!ZZv&leR!QaT|hHu-olRl>az;hwy@`s)kLh7K&Nkx9lyK z%g+MGc)1o`u~>ZJa=G@7V{AdCC&o(@h6EMhTEnSFj>X38?9a zURmpOI@h@S8+@thbgHY@>+5c}8`-#~FfBBZ45}OZe7>)xQt5dFd=`nBOeTa_I zAvnYi6?MDatI>tP&~CS{$6~Q6+=M-X%5RP=C~fTb`-hcEh*e8cuu(`#(uwlIgv;d$<5W%@4N+&?4w1pE*K1UYPH(q_sGT% zb4r$FV>BB5ME?1`G`u0TeK#Bqe@Um)+mp%UOac-fh}FSha4D5aeIyBTO)M6R+H5v& z(pZZr(0IahilVI0Xh7@+YT`VjtxER8-P%kYlIly8x z8V~F0>IA_A!%CoUGMNtB+uQdI2E&=vYEAa`_R3V9NhXswnZym<;`R0QXAXzshs9z! zX=rE=H8nM&ySw|8uB?+pgsAyUtcdeJ3G@@nRq<@fCuJ8M@9L3Ua_{erXLv@IUqN#>T!zA`z<>Kt`+Q=jW$D+R@Q*K(%SqPXVb$1bO02qsi^<5r{OP$GNO1)n1XYxq2wzi7$^77xk zIx%XsMxzmgJ|f->WOsIU?(tj2mR;N3-PHtx!7#b}Q>)d&oE$lo*X#91I-Tx>t}M+a z>vp^2u~^Lb9>P4jE7@$e#OL#U!jeE32gHmX~ul z94EP4?!)I<3?2)@dVuvYqOn*imD;6LltnO^ObRfEfU|5iyAjry`hLHE+itf@X0sV7 zeZV>35HLVt64-{Din#_rRWq5)W(XCiKz*rHdgF4r{-6se82uL@0!{%k1}hw%0B4#M z`i`pA>a!q9Q5wG4Y(BEtY$!9@2Q$r?PN%o_k?2Lk=kxjZZnyh4a0Wya;B@MAI>kz* zvObwiI6v}eCHPjW_3-L(qX4QRc?1wKS2CIO5!pw|#bWWT$K&aNdqCTxgA;b<1TYGR z!=*-}@t6YkFhFRx+YhePC7>Kr5El#ve@c=xA3zSVxpKMu+UxZ;u>-Om40hlcFaeAK zSoTFU8qIY&o%>WQMeA^-6N$tZzu*508hwbP+Ce@S3Wa{ivaF{Tl9_{b6Kb{E@;@WL zh{xmKyWQ?R8X6gfou*N6P*Qn39^asyAg55T*A1v2i^ab6dcC`}SmfeyV39~9j}f$$ e2Uy@tbNz>1UwdJAX?$*6eY*7OiE+hnhg|}n>^|54 literal 0 HcmV?d00001 diff --git a/indra/newview/skins/darkgreen/textures/move_turn_right_out.tga b/indra/newview/skins/darkgreen/textures/move_turn_right_out.tga new file mode 100644 index 0000000000000000000000000000000000000000..3105adb7b09503e987463e4a7d47baa7334e927f GIT binary patch literal 1127 zcmbVM-D^@|7(aS!uKEYM=%Sl0D5;-@w@Z)%TpC_~r8dOK#hxhROe!u7QNKt2~@pFM9zv)$$ zWhoyRs@-m%58$oS>708#afGZ^EBoV>nxCI%145yYrEE6a&kmEx^luI>FhEHl5U?wM zko;f3Gc1E)7+!Kx#tB+02;JD&FeLs8%5gfKhxvTo^zv7@SSVq^Po?JVvbKJ zoVB&J6|>pQ`mt&NA)H=ZTx4`QU57+D%H?uTViO9#)oNX|+wFae#ljek#+Fj4JXWbx zds?k_A0nUtj|gB(H5$!6L9^Lx))fU2>W@ZM(3-D`b6vBf+!etzNeSQ7u z3n2Kx(1k+5=<#?yLdpOOOa@PrqPxq>%k8bLEyZXw;)H>K>&V;P-Ms<%5=akNKnlTy zCbynit!_gSnM@{#q#!VPo12?Duh-ioBn$;4+*%%CG7^d85VDTNV#P|Oatnze%&}Ih zU59AI-JhMEJqSW1F6j>&iA3J_`~B(XfJ4UFQmLfz`~6kYpn+U2htpLk6bED*Mk0}D z2wc+EuZct=U$57%VK0z>8a}dgI{hjf4u2pM*@Lk{l0bodh(@FD27>_~`;BIbEHu5n zy?qCkL?)AUKsl94y=^oaS8>K@C>V64t&XE@=deZyn;K4 pE-p+r9*-A*f!nAlZiBi2-{de#sjefI^BrP-e13daiF;#?6gLZbD7J_%ijS#`5TBo1M$~( zkdK+6ye}Y5dwcuEUXWU_2Bs4yP9)^#=l=&vz3v3bGXaV3b#-+QKYjWnj!?+*_wQfk z&6_v30i{0y@i!p;3*vw^{BCV+y?*1y4VONU$<1J=oIZUz8fr2~!@m}o;y=yJ&3C?j z{VLRtQ2g)TKc=l)w>AUSya(dXAO_gv9~~VXmv7#@>4fkz)0s18B4H*s!W8~#X=%9y zG*u80QEVVnw{PEG4^#sR6;O!$?Ck8kc>DHkhe;sI+rch9ckWzRUS8gRpb0mD(aJv= sF2w{ifpOQaU6nw;IZpuz&nJa|CD4$dP}eZeU{8NP-3T{NA6GpF04#;3&Hw-a literal 0 HcmV?d00001 diff --git a/indra/newview/skins/darkgreen/textures/move_up_out.tga b/indra/newview/skins/darkgreen/textures/move_up_out.tga new file mode 100644 index 0000000000000000000000000000000000000000..777b221f80b450179201b6e46e9240341da42df5 GIT binary patch literal 843 zcmZQz;9`IQ1qLAGnE(I(e+Dqo3SzZSnlx!Y!}sssc_)ClU@?Z=+}!`IW@cvp89}UX z-@XZ;Nj8Bb8B9%0|2N`O1~vn1+C+rm`}glJXkEU1c>x26g(LxTNoz(%#(qW+3yZCI zokW%-JID!V&z^Mvxd)xb>%3pTesQ1$3Yu>lL0)DnFE4+WpP&D`u(0rRK|#S+P=JDh z3>0?FAO;Ia1Ss>lxVZQWh~3`aez6y%7i<92i4!LhfCl_eNlAI#3DUp>AS^`#vBb;4?V> z;hLhOqknXCbX>l9^QIFbblA_FITH!83FwedhK7c4^IKY4ZUM~~L?i+>konuUZ?7*Y zDR~zd82A}z;?K^`&WpEi-*%V;az;DY?dQ&&3(L#P`wukXCNQP&Plih|0Zm}swQE-; i(6`Q0K*IA$Az+y$Bq-E1%rn^2-%mHf&C|zKj{yJ$hTW6^ literal 0 HcmV?d00001 diff --git a/indra/newview/skins/darkgreen/textures/mute_icon.tga b/indra/newview/skins/darkgreen/textures/mute_icon.tga new file mode 100644 index 0000000000000000000000000000000000000000..879b9e6188bfc01fc538a3f8f7d72b2d64e790b0 GIT binary patch literal 1042 zcmdtfA&UY*6u|MpWEAAerEOv|`2{TZ0R)4{77>Gpcw7`&lSyo15W#3Oh(Q#QYt3~)k#dp&C8&yXI`I*-^AEk{mjGgzR95r&AqPnp;!TzBz_e_6Q+^C@1SXOTTN zXj(DNeGrrLrL0_^x%@kgNiX@Y0d$>?J~7$G(=)j BCEEZ1 literal 0 HcmV?d00001 diff --git a/indra/newview/skins/darkgreen/textures/notify_next.png b/indra/newview/skins/darkgreen/textures/notify_next.png new file mode 100644 index 0000000000000000000000000000000000000000..b57c26e2658abd4cb88172960a4bed7a29151733 GIT binary patch literal 3360 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 literal 0 HcmV?d00001 diff --git a/indra/newview/skins/darkgreen/textures/progress_fill.tga b/indra/newview/skins/darkgreen/textures/progress_fill.tga new file mode 100644 index 0000000000000000000000000000000000000000..bbdf5dd0b0da713f1f27f3131d8c4f0e57842567 GIT binary patch literal 896 zcmZ{j+fG_R6o%JmY7bX^guX!g7B(Si+SnG;5ThXwqFxCX-pIk(fC$P-l#>U<3)m`L zun|q4!g$f=`8)sY+KVRL$v;{1t+i&YIc$+P^878!TY2~DadUH1^6TsCqG`#-#)daB z11g3=3`5ykX7DuQR5ThDBhRhXYH+L7Du_H{wYIhX-SOm#AY}HiCS4%5hFaM(`j%961BRzDn`&O zzECI>u)n{LVzG!)sf2@r0~{V6qFgS+sZ=VMuzzbUkkQ8&#xjSwT*I#RI-AYHaU5u^ zvAesAOeOD8E-RRa1D0*Z(|NOrXrCDj70GX@s{-Y`8nj`;sUzY>%qCayoB!e`+G8_((9}EUiTU%Q&61Ba(Ek>TcySsxko6X?d-{0fs!^4AbS!TV3>2wMvcudmf mwnfa~J@VeIW!W$5`16Z>{~BCe4txuI`TYLJ$H1q>5AqvWwcx)1 literal 0 HcmV?d00001 diff --git a/indra/newview/skins/darkgreen/textures/progressbar_fill.tga b/indra/newview/skins/darkgreen/textures/progressbar_fill.tga new file mode 100644 index 0000000000000000000000000000000000000000..7070343c0e048b2d1323036eb84fa6ba54e57946 GIT binary patch literal 773 zcma)4$%P7tV+o}EsokyNQv zWW&sIUn-SE%VaWgRYJseyWLQx(`nhHQYpDlCX=GYS z%)`;uw!`5tw(<<^F+9rRWNgPY91dkP8VQfbV|l>V6f%KBOsQ@zdGK{H0@sa3Ltv#? zEIzh$yWPY-pO2oS<#M@{#bP1z`COe0f>*1Rd|$8E22$LMr>fa(Ce!IuT_c<^{Ae(A zoy_a?5+@P~W6h`2NqE2COZjj($dBXkXdoS&zT53Y-)^^0ZXTJO&1Q)Tg~H!=bRNUP rxm=F)d_GS<&-YJNB>__0KLeL%{`Ir%)^7e{{`B$fxA*1`x9{i=f-Zbf literal 0 HcmV?d00001 diff --git a/indra/newview/skins/darkgreen/textures/progressbar_track.tga b/indra/newview/skins/darkgreen/textures/progressbar_track.tga new file mode 100644 index 0000000000000000000000000000000000000000..3434330c149e0a56138d0471a5654774fd8cb922 GIT binary patch literal 486 zcmaKpKWl?P9ERnxln(t2{Q~VSnNtu-3;jpw7fe8LkSt;lApsXr%TLh7Ah;L^*#hG7 z)>opCr3ZIB_dJ})ou=Jt-xN(Nk3cZmorU!F>`LB{eBM)Y1- z?z(OeQkEqY6AjCdPp1>IEQ92E4n?Aw^5Jkm6h)9ENuWqHQ?Bb8yWI{Fh9MM*X3AAn zAqWDz!Tznbt P#_P+&_mlCwc+~y?a26mM literal 0 HcmV?d00001 diff --git a/indra/newview/skins/darkgreen/textures/ptt_lock_off.tga b/indra/newview/skins/darkgreen/textures/ptt_lock_off.tga new file mode 100644 index 0000000000000000000000000000000000000000..cb683446928d2ac8168cd70bd1183a28bef781f1 GIT binary patch literal 670 zcmZXSIcowz0EK7BLL`+xA%7t0tx_2fLISzSzlq0eB>`Vm%N?bX|l!49x{y?Kt~fZ3 zgHES|QmF(xm&-v=Wob!f23#x_Xt&!SWAFES2&ybC$;^PW*$k~#OM~0(HUw!&W(J&2 zr)V~t8eFYbAxKLyGvIhUMx)WtpyzoZNJ}y!XmN-@r4%NU2^6oY&-owbLfvi`l}ZJ+ zZ6nM3T=)C^V4rfiY-UoVxkd0Vecy-b^?Hc0b2^=Z1tQIvAt_T?E|*YTTrxhN&&W_% zR1}QJn8JF!h8he8x^TH%kg3&bu&7vIM8*_$yB*YUIE1WLt0)u-$l&j@2-9Ii#uN^R z1MJag1W~Wo^>MVKCz%>_v)LejJRTvbXp3U87(Owo=>5IFek4CrZ>g8(yRXO8Q}SN? E0tf7pUH||9 literal 0 HcmV?d00001 diff --git a/indra/newview/skins/darkgreen/textures/ptt_lock_on.tga b/indra/newview/skins/darkgreen/textures/ptt_lock_on.tga new file mode 100644 index 0000000000000000000000000000000000000000..5a7413bde582bad60de5bef238563afdacac4035 GIT binary patch literal 1068 zcmbW%u}cC`90%~H1r{MmHPj%flS@)VP&62k)`=!%iPjWBgpgPflu$O5mXUcVw&ajh zBw-OX1yPFxwb)QYK@|QWzxX})9ao$~9(;L^_xpa{-E@qp89h3tV}`oyg54VGWszz^ zmd#|Ln$SB{bI0(J=;yf(nBc&pRSeFkhladnJ`ZoP9-ho-J+MSsF*u_h8uHquOL*Dn z*P+TY*WT5uYF*7Nl&u z8o^U2L)6s-w8vH6K|{VfQ-Z54zm&MUg?n7(dwB;9`M$$fxJw75Bs{I$uZ6sT!EeDc zc?S*of!sSh9)+cxEf2!(bQgDMMV}t{Tu#M4pHE`|_4|DVD%5Cg>n5Ac zhS>dn&uzC`v0AO(GMNk+jYb5Y&u78{0tPC(-A<%SbNY#}-EK$BdcEe`?Y06Eipj_I zdL_W>Ca7#S8(ufCPNx&OTrRX+E~R8LsZJ&n@=13lCP2U}77NMH`u%_jCHMQCU=Xu_06--e462<@$2bTsm&=H0Hk&+6sH9RUJ!Kp8?Bnqu&?8{!ROC5px$Ac$abSe%7giOm_oLLr4B{wTDt zJP=z25fwzSveqlb>RM66$<7*IZee%7%*X0zeQ z=E;_1awuq#ek>e~DPo{uy>nR zGclXZ9-`4GG@DJ3x7#hSsL+C*`Ft*t)Es5#VVF!Ne6d(mF@$LN-0$~*RtlkKI-T;r z06QEGrBEoObvhkbEEdr1c0op(MTHjhV8mcBkaS?b-&gE*`-MD}Lcw4VWV6`}EGmT2 zgAu)6Ptk$(dR?*EZ2!SPAn*gCdVp4|^-`=B@py#O=>*s7mEKrd^pUOR^Lbr?jJaHnOQljG z$$B7VfYE3K=kpnEw;SwsJ4mO~;B-0O;@);TEYHNmks|OupHK37y^6=&k??qyTELhSWVoI9|+`qr6)1=ui1 zF2r8%#EwN1yU_Koo7U15Y^QtT{GpxIH%{&=xN&MfDh7&ypzIn0W(e?8v7$gRgOZ2kbx3Ikk!~L`BGBt~$JT_&5!tcPYrgzUD7rcG` z2#i5&kQhiVKf-O(jGA~n#Ns?Gb~I#$ z1@)ICV#FUPJZe&dgov_qrwZQ(7t}fiQ>-5(CMB)EwEkC>&k??qyTELhSWV zoI9|+`qr6)1^smelj?F}=YcSY4H5&%h1lzz*s*A07rOp+(^|TM?Q~C^KeV&@#>ssJ zeYN?MYO`bKfiQ>-5(CKv+v=WJH?0l1ucm+_$j32*dre>M}KpqC7Tbg2L~>uBLa-9~ZoR{s@dgY>*g8E+kck)I0&g!FGE4Vm&N2k1ghak4{^~<4Rj1o@^k1) t^tJB-(&1@A&YF3V9$4*#=^Y3fRvLr^g}R1$27CJZ=|;GD`nc*b005|8n704` literal 0 HcmV?d00001 diff --git a/indra/newview/skins/darkgreen/textures/resize_handle_bottom_right_blue.tga b/indra/newview/skins/darkgreen/textures/resize_handle_bottom_right_blue.tga new file mode 100644 index 0000000000000000000000000000000000000000..b40ef7305cbaa9518775193ded040e6fbb870bfd GIT binary patch literal 305 zcmZQz;9`IQ0R{mE1&;o(urLNRq8TK{3MBpmaRZ2h%x(m6z)D&`Qf$a_=xngER**6l zbSWUe0c=1UPHC|2c91kPx^A#k2S|z$CIvRE6GaHDstY6p_5qlS=2tKm79=4-p{`+` Q!Jhtpx)E-kKCXHU0PZhffB*mh literal 0 HcmV?d00001 diff --git a/indra/newview/skins/darkgreen/textures/restore.tga b/indra/newview/skins/darkgreen/textures/restore.tga new file mode 100644 index 0000000000000000000000000000000000000000..904797e7e6cfbb4fdcb46820bf46f3867b3d3e14 GIT binary patch literal 636 zcmY+C&1%9>5Jn>^l&*Y)zCgRrsw+zarG@^{_X)*?@1UD(T)A^8B!m!&uONs7;y(nl z2?%4(Xd(u3`Euq=xXB&ExHrnHWweZkyP9d5uf?5oi$!=!AcQy!L+S4Kd#RBiVA*cB z(w$DHQX@g?EbH}Jf*_DyuO}Vbwxv#jP^q*eNn|`83r6Q~I7poYp@P<6iQ`yCqmgQ9 zn#w;`gG8W$f!SnPEEX~x4zGqAziGK#itD|o;-Q-e+!7!4PrIZmW5_zKgc#T0_Mh$pitK^&tOk~ NKivp7Paju31^~b_av}f# literal 0 HcmV?d00001 diff --git a/indra/newview/skins/darkgreen/textures/restore_pressed.tga b/indra/newview/skins/darkgreen/textures/restore_pressed.tga new file mode 100644 index 0000000000000000000000000000000000000000..c8ce0f9b9fa2116b2c665a6a223a5fbc0ae2c732 GIT binary patch literal 564 zcmZXSL283g5QfLBLRUFLF3?;dtAq+Ag`^EVfERg4$)b1{7hb}92nr&if{2I{|Cwq< zT@3$x@Bj6^c@n+Q`0Qv$`>o|T&YSDH@$XRBf&!sIL|#=@EDD9avMi<5Vv3?*@_nBl zSQVvAS`?G#xtbq5Jo1)*rfrsG@>v-82Pq3m;#d=xTGKS;4Hia&yCMc;7DEc&5HVuSC>^?MmE=I|V_+g;-{^{f#e!$n2WZ zaWNSU>5F*pMPy|L(}Q3+O*bY!&!)5K?B+brldauu_iDS{&bhAt9oVdyyP?f|zu%WI zKO@|L&Dv&OK8K(Coc#z>ug_>R=R3bvG8^Rv_+3BBdGnn04dndm`xq_D`Hwd7`n);+ z`aVX>a{i-DygqNvzrK&rvYh{D6R*#k^RMq?v@GX8+QjSg=KSmX7%j{Bk2dl8ygC2+ zK1R!O{-aI2K5x#yzK_weVE#YK9h_P}JDw$4%LCs+eJ(t3mb2hM?}ax+^N0tYTx;MW z584`x`WfeW&C!+X?Ooc<7ys7lko^ARTY>Lx!6{m-%WAx?eelAm7mgn4ZN*yCim8qE z@)~>73!S{D_)cr4q6^Z!z4TVIdM$K)Q(Z(PKyh932Y z1GS&_@H)N-eI5HR#ijMpGf}IkK8<-E&%s9sM-6B^OF4_-OBl}oQ=x5rKBCXzL9hE- ze1^L4p_3~T_v)zk9%>DJtemgYe$>H5b$AptroZRN=?%ggYJ5t^AJs(9P}+y{|4?Yw zM~UGgZ24Mz)ME{I)%|%U-A7~ee~DM!pJ%o4N5B8y724MOBNA(l2W)9Ao;uKcctO>O zJyHjnuJ!PqqmS}%^g#274z_g9llS()qe$%Q$h}T(s4;%9$l?6o6#6pj?Ir!EdiVM* z)x3|~BhLa)4)%D}G^X}{VQcReZ_j1g;S>D*?`09zt`~n%yLQj4TQ{%P{B4HMkIQ0m zMfet4Jz5lNf7Pi0TiU65>OlG_qD8&X)NiqRBdy12PwhjD4zi!`Nv=LPtx;WLyyZCI z_rKA2qJF-Y&!bv6@3owThdo#2_BSh*Ld^sWBvue9HB_ zuS=hcPw@SZru~T7AM`x=TJ(K;eU^Hc`utv6r!hX|G&Y^wBem*LE{f@a=5zR^$b1iI z^S5_^^8K&sT82n?|EnA}-~Sw9;(rclv$vmpn>~wn0r{Pfczxdk*Z05q-vAyxczph3 S^Kf(j-mRy1Hh0f&Prm>sXZ7>| literal 0 HcmV?d00001 diff --git a/indra/newview/skins/darkgreen/textures/rounded_square_soft.tga b/indra/newview/skins/darkgreen/textures/rounded_square_soft.tga new file mode 100644 index 0000000000000000000000000000000000000000..0e5bc79ac3c6e283cbc5ec60a753ffd96f376a3f GIT binary patch literal 16428 zcmeI)KWh|G6o&DQK@kzsCtA#2*IG>KO(78i1w)i7WQdGAs@o@R-zxk zKFy-Ng$RO(#`gyqOcNcu%;gL`>~3-=Fy}ct_s+~Y8I6vOy6xF$JQ|n?mz;9TG1r`T^S$$e-0=I&upM^7oA5Tg3-60T#eg&JIOLL3 zZaJO=&gX)4fw^HN$Pwf0^C9epY4{jE6@!WaXVbtTmz-_~j=AQXdvk&H!K2_j@j4jK z_vi2>d@TkU1MWEFl2dLu=9+Wv=fkzI9=3u!ku&!D7QTlc#UNwA9fw?U$}PuSbI!eM z#7VGLv|cc0OoQC9|IhHN7-S5%qIq&Z6Eatsy25Uy^26KmVzVAKvwGA@@ z+;PYyr`&SPHRlWaxVPiF-Zh?ezWJj3CkO-I4*KVmTaLNry!af5UQn99sGB5u}EPl>dh1_Bgci-y=v34=Mi*%k6P!<-bRe8Xi*q8Osum5`f(`FJJ^ncj%pL+h=?(^+F&wuBW`c?nYW{pdq`VTcgRsYpyja#4kud4rS zv$oZIKMm@>)c&dc+727xVEyM@KC1;*5409GgK;~-K5B;4ja2>juwuX&cN}ubDYqO? z0_WW80jU0u_WE1Yd8zf=3V-YW&;z6w$T~n@h}@|DucP1NrH1P;{-^(IHh-u3KilhX zbx+54`Ct8?GZ`ZXx?VtYf;FM@fosFAM!2gLtk*wvlSe%k+;PYyr`>$dHRm(ke*?IG W_rcP`<$KF_ZeLoxxxBJ;dGs5BaS|E; literal 0 HcmV?d00001 diff --git a/indra/newview/skins/darkgreen/textures/scrollbutton_down_in_blue.tga b/indra/newview/skins/darkgreen/textures/scrollbutton_down_in_blue.tga new file mode 100644 index 0000000000000000000000000000000000000000..6a89d4ac748ad04d95ec440cc9e564da72e4583d GIT binary patch literal 672 zcmZWnO=`kG7@b6vwkwa&3$%L=pdgeM+NMNYC}yJ=(v?5Nq9&!5AQln9g(!Lo4^VXN z9eRYiY}$q@XkRx1p}#}~Bq zdJQrndch-gKAB7~o6Rtv&#_!CK{IXqa!#JQbjw_dVP<{b$6zo(5Cj;FMi`IB@VQ=+ zhzu1v=w>R8Hk(bf+ii3@9dx^0G#U+f^?DttR;z`6zb{#;bg4MIIaao98(OtmMWs@K z$NlP-WuaE9!EqdTQvVn8=+;Z65{kv5>`r#2vrjTqq(@WHq^d}{P$2!*q*XuziQgU2y zxY=wFFMgtTyWNRC9e=Rj@BbVv{b9LWc8}MEhzw~b8i)9D9muE~_;_z*pYjj+yW1-> Jm%qtgi(mfBP|5%R literal 0 HcmV?d00001 diff --git a/indra/newview/skins/darkgreen/textures/scrollbutton_down_out_blue.tga b/indra/newview/skins/darkgreen/textures/scrollbutton_down_out_blue.tga new file mode 100644 index 0000000000000000000000000000000000000000..04e158ebad3c753472fe1b0de089443a499948d0 GIT binary patch literal 919 zcmYLI$!c0r7`|;1k#3qt=nJ%aS6QVrP+I6jA4Y_$l&aN4P{EZ87m5S|qToV7Q6vs= zhy!XAUThM;hz8e)Ax@@lHN$W?^rsP-YH+HRH{$gfAnvAfZT|Zx7(v% ztJN@@&9GQ3uv)F~{QQjddX3FyBPe;wsi)m!GQsWbE$B-CjK^aX3I$ZFRWuq6wA*d; zdOZvV13}4CPCf0eudgv24haAOKqi??3T35ILA_o_v)L3*q~s~5Gwq_$DEj^W3ji4k ziF|W&gM2=ZKp+6C)e4)<2A|I-qB*+xe2yb_Myu7rZnwkZ@!;<6PDDMV8ySnm0*yw4Znuj+oX#Oj zQLEJ=eU6rv2Rw+ynx3AX@E6STR zjv}3hhXCxHVZkI%R$L;kjrE;NTpI@MDchWkw`==$Ug3LIu&ar7mG#6<#HKH z-neNTC&7qCj6@=_Umy{hQ`#*KyCQSdlw2EjfDE;S;|dXm$ucziKjJKx%ca=x9o6!p x;1Ia?qzu9&OQjNBM|?#m+ds8`Qz=Sz5AVmfpQpdhzMp;l^8WY7v(Kj=r2im*iK74j literal 0 HcmV?d00001 diff --git a/indra/newview/skins/darkgreen/textures/scrollbutton_left_in_blue.tga b/indra/newview/skins/darkgreen/textures/scrollbutton_left_in_blue.tga new file mode 100644 index 0000000000000000000000000000000000000000..4efaa9908d6c237d5b564f7719fbe9cece9870ee GIT binary patch literal 745 zcmZuvOKJi^5bZI9d^Yh2xj?e_00xARK#~aqE)-XyVn9(ugEFlMGAbg13-Py8cdk4@ zz_oYC5#loPGOt9l7zeti>eYMI-BqR3wK{x$Y zH;n0Y3L?tgU=zCPcDv~J`xp!c7>!0Cx!rD~SS-SE9KjhEw&-psrdDf>dcBTDqk&ed zg-)ju*Y&JtClM$S8@~ENq;*cPp&!bQ%pj0ZMTrMM*%OROe?$0_;Bocx$O4dQn zH|@_)rBd+4<8j1dG4O42NrPTGorcZ0;gQ*l`y!DD!r`#IS(BsaX~s@S7&9!(!f-f5 zRp|7z;GPq-X_`>1s8FkPPb3|W$1s}BrqsIn@%016s%yc$N$2x9j9#yYN~HoVbg=~Y z(5tJ}3I> r0He`paX)vo+^+2ir`@$ZPU)7&VU*uq%;0-+?$JYJx~kJr_*6>V^N_{~OMC&;16O?2T-;7Gw*uck?e43dQH?C+VgeC`r`3 zoo?03%S&`R9rXKs+}+(_G#cUl{vHnx58|XuJ?->swOTkoKL@c4fJUQ%v$Hc~G8tT5 zUE%ur8kI@~wOS3^+uJak%?O9X!cM>a{e9Hybq0V4K;huvKm8>T>`JR5J3>(GgBhPZ10TVK5jl91ijL_=xrObz!GpG#W*zR1yJR zlLm!IBqD;uVlg;PrZ;R;$r&x1nbG<&>zU)o!;Vm&=J8 z1&o5tW`o1w!1D4kBuRprPnA=mmR5_!0+yE-38J%1A08gU?RH~rZ4HCL04hwEd}Us9$?fLmMzozWnM^{NN~JK*I?PI}*Xu=WQrp|xdup&(#IhE%#$x7_Y}I+T z87pQonXtLJ2?l0=k|OC6$z)5cH9LV5FgsQJnd|j>Ld%nvkmSY11)&nB?Bn!HJk4B! bn%Q9f{Qhh4_tKB0Z(ra4`Ly(9@q_FyPBEov literal 0 HcmV?d00001 diff --git a/indra/newview/skins/darkgreen/textures/scrollbutton_right_in_blue.tga b/indra/newview/skins/darkgreen/textures/scrollbutton_right_in_blue.tga new file mode 100644 index 0000000000000000000000000000000000000000..484f0469b60d451511b9f058e1ea4f6486ebb2a8 GIT binary patch literal 751 zcmZvaOKJi^6h*5|LOzqYglr(0y8r`1NFa$paNutwN(T}Av_b7|5hNN!1P9`8Bsz2C z0)h&H;2yGsIE>u%Eu$G|Lsi#%_ny~XRZoZuv3=~qF0RfLhr{t^jrF@Vfzg^7E`GY* zF5bn*7nEMF2WEsdL1*f`R;!`WXrNRoA)QX6QmKG8LhW`N&1O^T(k;15!ekA@K(Sbq zXe<^(zu!kZ9*1d~VA*Q5D$B7nePqam zS*g;s#kr@=_oLA$L?94=LCqElg=863RiRT;_K{#P2;ud5{}AqwkoBMtK*r-Sj(PMX=JUC{29`Ie8~~=%DUR3zi^W3T-EcTWf!Uq;zjyTI zatYgLG?KT?cYzt5$0S{{4gG$(v!A+lGFAbUR;MPp*giYtOCg I&Uqt#0pP)fO8@`> literal 0 HcmV?d00001 diff --git a/indra/newview/skins/darkgreen/textures/scrollbutton_right_out_blue.tga b/indra/newview/skins/darkgreen/textures/scrollbutton_right_out_blue.tga new file mode 100644 index 0000000000000000000000000000000000000000..fca79181bcc65eecfc509825f13348efddbce5df GIT binary patch literal 956 zcmaJ=TT7a89Cm|hbhAFfzQA_h)vg*7#s)jFPZMQbC_}{q(M1R$SR@+dMd1NW5mU-T zAs&*^rkFOg2Ck;~<9 za&m$|Ab^#X73}Tp;o{-~XJ==kr=5PWSPb=godgg93j6!}V$5c8Zrn+1U|polXbM+9>- z*x10_+#D8I?wFz|n4O&!>+0$%I9`@0bq+h7NF)%C$6+)Yp~2u8Z?#%dCkZ(?4)Of_ z{QuB-LMI3{7z~m}Bog@tE;GKmx&oteJcoyeFqupQ%ZT{za=9cUj))||U=X!hP2#^~ z{x>%_vUc-FM@N|CRJoWIi$&U&N~MrYCWW4bMWfN@J9c|}D?7wpV)HmE?%D3{uC$2D z$sHp*_l$Wm=V9v<4xG!tYcM=D{29NyyAv%>hGC}1$H#;!ylU?UZ~X7Yi&Hbao!`Iy VnE9#xrvCEz?XM5&Pc!dSe*m`ft1kcm literal 0 HcmV?d00001 diff --git a/indra/newview/skins/darkgreen/textures/scrollbutton_up_in_blue.tga b/indra/newview/skins/darkgreen/textures/scrollbutton_up_in_blue.tga new file mode 100644 index 0000000000000000000000000000000000000000..d8fd0a7cc1efb22180db9382146df79a7cdcc3cf GIT binary patch literal 694 zcmZWnO=`kG7@etF+O9l8FVOBifQ3M5p>0aUjX&VB-ARbWn2}n7T0{gF;@{E}cmTn* zcjyu7vhtcYVQe9RnY?*FGnp@+5EsHcS&G$9~$J{%4)9*;4ZOfZ|xKr?N8b4{MQcI(_J!^|qB(CKs#h9Ua>J_dsU6!*&z zk)c8d-Ao;$^?Dty>!Q(UpxJDq)oO7&g$xlHDs-6Wi8-}at05?rN|5Dp8I?)}s#>ig zLqvuWJtmkk!D6wfZ}dSW#k-L)wzRPo3I#ZhgXwgNcdBV3GE|J6h1CmX+cpHN)TXA9 z=48Se%;$5+Uatqw^U!|Xd_xkEiM2#TtyU|@(P#wU_Yvp_5t&#^MB3~18iGd!y7WYv zOMXyyyWQeQ|20Lp+wK1SaNSK&S-rT4h@#scNWVm5e{8uu8Pk_f4|e|9dbIBEuACd| IHh(RC0cZkW?f?J) literal 0 HcmV?d00001 diff --git a/indra/newview/skins/darkgreen/textures/scrollbutton_up_out_blue.tga b/indra/newview/skins/darkgreen/textures/scrollbutton_up_out_blue.tga new file mode 100644 index 0000000000000000000000000000000000000000..9112d187e274597c18ea426281d2ff329f1ef62e GIT binary patch literal 929 zcmZuw%W7It6uoT{kxrUV=nu4WM;WD5C@u6wzec@E5fq=qQAXlKM8OYGR78B>Ga7v2 z`yFF626eXTI$$zrFWj@w+UM+b&R%;TNqQq4zjNtadZ&D)QmH;2{)zc8fM`O`+ru!d z)oNHSmsqdY*lae~ZnxO&cG&Ot!V=TZb?%$b=O~p*U@QqRola3K7E!HM(QG!+?RGI3 z3@{pvge9h*>)e-2CNUn5NdQ4WkV>V*;_dA%>h(HWt(FL)C8nRj+!u{TF&qwG2ngsT zb2ghrp-@1%T*l4Kjj+V@bDjG_p%8k#-U|VN+wF$QWP;gjhQ(rm)oO*!W)qf}ey$sh zMqFQCqtodKf)nP^Znt4D7_e9@V5D*qaj$&xShb`@!;y}3R& zevt(al5zMHoG~A-*Na#zhHyBHe!u_!@N_yYD0q&{NCjo_`Fx1S9(xAP@j)SqzdyA`y`oZ~mIY{r$aYFq!3(E0qeAoU!LvNb-@J9En8Y zxs`;#4-XHbRoF6APiE68iKq|(8;NvmCerY_Je7h^SX1iDUO!qrCyLc-CA_pegqLKC mF^cc$;_#=RUssx*;}iVx?dRn$^>_8xFYkYURDZtwApHf@Ta_gM literal 0 HcmV?d00001 diff --git a/indra/newview/skins/darkgreen/textures/spacer24.tga b/indra/newview/skins/darkgreen/textures/spacer24.tga new file mode 100644 index 0000000000000000000000000000000000000000..c7cab6b38c474431acebcd5cfb10b0b4e2a8720c GIT binary patch literal 2348 zcmZQzU}As)2?hxU1&;s!|1*r@(J&ZI1EXnRG!2ZVfzdQDng&Kv8i2KiLV`kF!#smM O{rz+!+&q0;^%wwaVZPu1 literal 0 HcmV?d00001 diff --git a/indra/newview/skins/darkgreen/textures/spacer35.tga b/indra/newview/skins/darkgreen/textures/spacer35.tga new file mode 100644 index 0000000000000000000000000000000000000000..b88bc6680a405a808a1d93ec03ec1a35460b3a93 GIT binary patch literal 3404 zcmZQzU}As)Wd;cb1&;s!|1*r@(J&ZI1EXnRG!2ZVfzdQDng&MGz-Ss6O#`E8U^ET< ahjo@1LV`kF!#smM{rz+!+&q0;^%wy2>(l@M literal 0 HcmV?d00001 diff --git a/indra/newview/skins/darkgreen/textures/spin_down_in_blue.tga b/indra/newview/skins/darkgreen/textures/spin_down_in_blue.tga new file mode 100644 index 0000000000000000000000000000000000000000..1f3dbfc3d8868d6c9ecf876c524621fe2501c600 GIT binary patch literal 340 zcmY+AL283Q6o%hqC0X?dxj?h`00{^sg)|8Tb>UhN575n|#x8{J+$kQz1Gw@Wy+W3e zKl9I^P+=bb``*W69Feum--~#%@s#iTU*=4eDPT8|h$)XE&vQtYWzcDwy5tzAbde+p zu3;ELMNxz}j-lJOg<>LcGg`E{6$Lw?rRDd}CC3&;cU^~7UDqhf62mayo9c>*gcIx7 zg|^sMRaJ#?9C4$rm`MJslkWQ-(liZzxX32Q%mpU?R%Xt9d5}BF{A#D;d3Omug7?Gg K=RSDbZRH6>)R|BK literal 0 HcmV?d00001 diff --git a/indra/newview/skins/darkgreen/textures/spin_down_out_blue.tga b/indra/newview/skins/darkgreen/textures/spin_down_out_blue.tga new file mode 100644 index 0000000000000000000000000000000000000000..6728a6d9f26dad8786b6aded783cc469f9d323ec GIT binary patch literal 365 zcmX|-J8Ohc5QVS%fF)IaLjFL~Tcz3%AtaC&`7I)XyQWI%1H?iL3&G9^b`mVaO$2cp zNiSGf1|i+a9hc3(4CkKn%`Jwp6Lzdqwqj>1K@`Pn-u)XNpjS^0tDk#{Jzr4f)qKF6h$%N zbB_1>{T@xz!1sOVrfFhh7zXB^=b^4^R8>W6Pq(?`z5Bn^j-2B;AMc;m&(ec*cYFSF JCEctq*dM%J!UzBW literal 0 HcmV?d00001 diff --git a/indra/newview/skins/darkgreen/textures/spin_up_in_blue.tga b/indra/newview/skins/darkgreen/textures/spin_up_in_blue.tga new file mode 100644 index 0000000000000000000000000000000000000000..4bb545e0c06b1a961d225869a8e34959f937234b GIT binary patch literal 336 zcmX|-O$viB5QRr^Azk$dy+FJ702YMOLjNd;3%3fz19X$x+C`x|cZzFI-~l{Jui&y_ znrDcC3@`6}GbACJky&$cY2jL)=iStnZ&es435Qhqi7d;Q(lq5)k|bJb52>RH$8pSI z7;+RvT-P-}>GNd=3JwwwATg11oCt9aP^;0KkbBcKY?o!pMNx3y_bhu-h&#>tN%r F=ntUUnM42p literal 0 HcmV?d00001 diff --git a/indra/newview/skins/darkgreen/textures/spin_up_out_blue.tga b/indra/newview/skins/darkgreen/textures/spin_up_out_blue.tga new file mode 100644 index 0000000000000000000000000000000000000000..4a5cbcb946a230aa3c376e1e577b20738bda60d1 GIT binary patch literal 387 zcmX|7yK00$6rHgMOR9WAejw?sQf-J363B~ui`Yy;Okr=Mg{5F;1htA-h#LeSjij>> ztixh`GFREXaPOQs4`#TGow7rnu?;)la8*@rWKWhHpxZGidK$P zvOoku0B)KlhGD?RJkQ{Sh*`A7wOW1Ohhp0{48uU*_jo6}LWmer1bG%W{RDZQLqt)O zDURd(=(_$pj^kcHmO_XaQWg)-vJ8}3qGeg)Eso$^HQf49^h& literal 0 HcmV?d00001 diff --git a/indra/newview/skins/darkgreen/textures/square_btn_32x128.tga b/indra/newview/skins/darkgreen/textures/square_btn_32x128.tga new file mode 100644 index 0000000000000000000000000000000000000000..495b05656370008e8821dfcb2cac8d2f1ed6b9fa GIT binary patch literal 5488 zcmY+|=~5ln6$Rk#zFaKXDG)PaMu=HV0tp02%%c!92!t2}h#4_Y0=azpqKX|SvQzn$ zIJT>j7s&5CR9+yJT3PG#z1ViuK6{;`lFHrt>tiFw`P_;9^Ock86x;&0DhL1j=eJiu za<%=(r%U`dAt3>-l1}2Z{QT_)+_{s)N@U%Exs%8xF)8o^fb)P#-lHFO7>vqHYx2RPEAIHJ3CvsX@|~bBJgdoK-S3nPhcN z#%LIx2BC>0B_|=GO(>X(W)RH5D7c!6CSnnCNr0m~LI*;&?3 zmO7DSSvBgi67(!Nya3nZ+sSf8~0n(4!S(bfqUSJS!qV*dX1 zd-x9@K7?EMunu($MmtkiR|l`It`@bdy4qU!wOmXMm)o^9HKV; zSFqT5;49oJCm z`vg<;Yd!8gov^M2$4HG+NH+F{@q!zMmk)cb{}5uL9yL=3M}mC8acj8GB+wI#?Fl_OM4&2U<%%F+s1R!@FmW#r3k;vz;7IWmoe zVQ477)AHk|uQ2rDIco?*Lqm9O>p7l3XAM2apt`L=o6X?!L72h8LBtOX4q$L#0O|wL z-p}6OKLFD|(2uzO{(khS2Kso~hrYf(m_7zaDbm~53%|Fw7oYX?_Mn%g-qX{A?w)S; zZuVerba1=7r_26|Bz03zcUK@veyl1PV)=p;>g?+HjVL2Yrk#tc)J{?nNpeKVGKy0=2LKBnYn3$M=HskDOd}17C zjEgfqK90!P_!!LS*eIN_v1l@*qoZ(jreH=!N8pW&j6gyCaAvuf*;li0 zXJ=FbeL=nU{FUU=-Y!FS%nd3fI#wrx8CrJ%y?1Y1){A&7?8K zvq_dOFh)*X(U@eJ01S}`ibW$U0^35|jyLcR<+;^PaF5h8DJXz=E?`Q@e|Al)+d-jO1?(VN#7qMs4* z^Y=d1*52anI!pa+&{u6=h5G91D*V;At8iAhL{?T;;4ZH$V|ir-M&a}28Cd4o60 zEd7f1%5UCaNu9OyW{LYH7=^f{r6nvfEWTNU&D@*CrA4@liwjs-T!dL*@D>)dTfjWa zU!WC7Xw3ZlJmRHBLH#wcs0+<&a%$|uj6`ceGNv6LT}gBZWyidz{rpDmTZ``kdmjQuu4c~g^2tWnz53?%Ty#iVkI@p zQAI|Z_`r}Xu_$JVU}D{up3vgb0v4%9f+Wco9(SIKtRUfuvt}6P7i5N=ZjA7RtRgy5 zmm7MSi(X6;Buz5IG6KX;>7$*_ZB6ILPv79|>=dVGXE;4qXPurz`zcONPZ2rcfp>Cx zjN_9NoUr`klViBY$459iK8An9;2s?v;gG=`GWdr_hwu&$4{^XcJUT$+;P3!u|KI@r z{=q&%`v-g2+h?)w@9)ECpF3cuT7@-Jl5QR)wD(t>C-Wr#+jWyOfjSxzlpeU@#O0*l@J)z+8 zS>+`ZTs-#DG4{TZ6;ZLfI3*oRiC(*2zx^wiAO8GD{OQA&{1Nkti&2Wd`tk}_AFgo8 z3i_qZmseLXmsghvU0(8p;XUi}l0TBZ=i*&(dH?=BE-v{~(#87=_!k%F@XooMUtF-x zVa_kk;GUiH88D}3CkSisCk#?xvz(fWdjz4=eF0&Xjdv^~8zyRlSBR1q zyHLc#=nlChBfGpuBqVmZ2#S1IECge(6;IcSUjNN3e*XSj{Oe{GpKSWTSs0DR*Cd>) z50~6BxqAIqv4J=mh|wfI+DX_cXcEB?E`lLw8o?0w{+%=KH~`K>Q*chXMD+Guz4TMQ zbYE}X(WhsW?0XL%^PAIax8EOUpnqpQ0E>TB`r}_d1?lEY=ab`8J<|gd10%y#Gra>t IJ=MZA>(A9d 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 literal 0 HcmV?d00001 diff --git a/indra/newview/skins/darkgreen/textures/status_buy_currency_pressed.tga b/indra/newview/skins/darkgreen/textures/status_buy_currency_pressed.tga new file mode 100644 index 0000000000000000000000000000000000000000..2b82aef0ff9d3cadf313ab20144c6a26e15f88dd GIT binary patch literal 626 zcmZva!A^rf6h+^3rLOu3{(vU^h)N(vQx!GDxT3p~mX?Gjw2NVyhK68RbihUkJ0SD*THc}9c5fU2JxgcQ?qxkO1HUrjYeG~-}j;AX*QdI zgMVwsZ9UHe#c_;Wc2AN7IXk;d?l=w(k(HlnN^db{1CH=oaO{)sNlHF`x+h*>Na zkc>SwpgxID5f!*aPqqtQTAtybZ( zqQXuAo6Tk*5uMLxxU8rYusDt}7z_m4aF`;tW+evp$k^QNc8gxGCkA~wo#1vl9eMJ7 zAFI_0Mr8~+^47fD?U3U-O;fntZWoKi0vi+m zx7*EFsF+^Ck|YT>^Z6V~G8rzFXb!tJT^5tCXczO}`sTa+`SDfxt_3yUdkNoa@0C|| E2jNX(=l}o! literal 0 HcmV?d00001 diff --git a/indra/newview/skins/darkgreen/textures/tab_bottom_blue.tga b/indra/newview/skins/darkgreen/textures/tab_bottom_blue.tga new file mode 100644 index 0000000000000000000000000000000000000000..65c9228db4a94b8fde2c39841e39d27c0faeb6dc GIT binary patch literal 653 zcmYL`yNeoe5XWctXK`E;(knjt3#PCW#A4Oe!`JE=8!fare1hT?isEB^zd-MQxhjx0 zkShN|ii4yHXoAAR+{_+#{@^>zZ@wR9=C=!Q4R5CpAHi{jE|&{r3KHp_^zBH&kSY8k zeI=!J3MO;!^ZEYd^Lae(_j|M~77J`N8W;=)p9y&&eHbz;D12vRx7#68hsk8}%5S$@ zWG5bv|0ODI@-k%xv(xDm|Bpr^6!ZDqt7k{(a;HlMWq1@~BkZ;`e;;+|hJlAS96ui0D>*YN)((8CGo=c?? z3SHMR91i~`YyEEXymPf$MZw+2<1u%Cdbek@8J=^w9ExVMiTqNs_(Ox_bUKZGzmNa2 z*({DSnG6cfxa9G846;FTI2=Z|+r=Z>dMcGd!5NqQe*ZJs50c$(H@NvBnM~q9(=>!c zB7uWgEQS`&xL&WIo4$){72J|EtMj{cgghCB tip3%vR8<9;kw72-ilV@f6TxNrDJH}0+eszU%AKmIvFOd0fO@NZf*0!@_>ceq literal 0 HcmV?d00001 diff --git a/indra/newview/skins/darkgreen/textures/tab_bottom_selected_blue.tga b/indra/newview/skins/darkgreen/textures/tab_bottom_selected_blue.tga new file mode 100644 index 0000000000000000000000000000000000000000..7507edabb01cd55a9d0c3c095074e8e92372ecd0 GIT binary patch literal 500 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 trHfZ0aZmA?N3&&0yxUI{xyhSgb5SCLVrN2 zAVS^U-C&{ZaG~F=t*!qVv$M0G0~M7agllVS|1*Y!g!}>7fDo>zsQAz5?(Y5=Mfg{7 zaq)kq)YR1fK;iAEQh9lK|C#*#{a*ovdr_sbvaW_E~v&!Km~?y%_o7J|BWC;pFxUPa&vS4=j7!4 zPf1Dn4>S$rxX>mb!N3G0GJyCs5dZ%Q(!lKC-~e(7IP8ElKU^InkOxwG0OXiIAf2EP g+Y7{@EkFVmsSF`Op{`+`!Jhtpx)E-kKCXHU09Q`H`2YX_ literal 0 HcmV?d00001 diff --git a/indra/newview/skins/darkgreen/textures/tabarea.tga b/indra/newview/skins/darkgreen/textures/tabarea.tga new file mode 100644 index 0000000000000000000000000000000000000000..5517aebfc8abbd617251bcb8ce590d11f277cf72 GIT binary patch literal 1340 zcmb`>-39_-6h`4)Lna*zA00$YI*6D_x`&C6(a_K6{%>SjqAO^;xd4IRUoj^RS*Z<92B U`R;jtbz^?y;nu#dx$jQ#0U)1humAu6 literal 0 HcmV?d00001 diff --git a/indra/newview/skins/darkgreen/textures/textures.xml b/indra/newview/skins/darkgreen/textures/textures.xml new file mode 100644 index 000000000..451b70062 --- /dev/null +++ b/indra/newview/skins/darkgreen/textures/textures.xml @@ -0,0 +1,389 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/indra/newview/skins/darkgreen/textures/tool_dozer.tga b/indra/newview/skins/darkgreen/textures/tool_dozer.tga new file mode 100644 index 0000000000000000000000000000000000000000..bc1cc7ade8d9a3ec205efee0320b0c0fb95f82be GIT binary patch literal 3193 zcmai%XJ}Pf6osERrq~iq%xLtF1ys-k5yg%O8Vu?LGsze=3hH3NuCW)m$%`6$?6KD< z_TGCh*n95<3zn!Lifi7tGcSb94-+`|o^#LLYwxx9UgtiKr?|)eSIOi14{;=UMvWSk z+Mz>-ui5qL)sw>=D?AAvJ$m#%jT<-Ck|j%YFMc8 zOG~pk>uc7mv3DU5_cFkAScM~yiZT$a-!q7Fw{G34z%5(02+tNST&T&DC(CtRjU78y zUSEC{$Q^LgrcKkzl`Dm-d-m*+7vG!}D^>{hupY)h$`&tPtel)2BM%>d#7jIMHf)%B z_3EXturQIs0Rsl8U%!3|4-c2iVsLVDvIY$rB+zkX)~s0;A8rDkwtf3{ITQj|V3uS! zdi1E~&6}sCOP6Z?{Q1hv%+#1MV>DvK2m`25qlU_qDWkZ!I5lnBR4x-YC@4s7XlST{ zD^#eU{{8zaH8oWuM~*aSvA1f~Dr3i8zkaDJoH2QnnN8sb~Ff#Q%&yf z-Mdxf=FOV|DUIb&-23|VtC}=vA{J`ZswH1b&>O(^K5(xpYd@Q#cV6;4sJmoHz|>({UK^XE?`CMK#{ zwQ8zdxpH3o4sqiaSIa^W476|G-WZ^^sTO(w%y0%2qFlLhnmTo=$;{KIPYsxwCF@ir z<^Jf=BYph%(I-(d>S#S2pt_=?qYFfT|Ni|vcLGUFN=k|q9u+{1foVcO#Jzj>7WAQW zL`Ex-53bAsegFQwHBeMklp-S|P3r(h6k=mzRkm!|Jh%{|2Hc;0pQLH{@ZnalBn;?C z2B2wr{GTvkf)R?A0>>4C$rSAa`DhQiLkze8q1Ucm(~KE2Ll(l&z@QLM?^&YN4h_Hw1MDIE`knWAUddE5qdaO*hB^?zckWY^4G6l28eO`5)lWO z)=5fAvU-_2cdl`Oqi|yN9zbG{S#ZD$E)1HGkYL;KvUcs-@&XtR@mH^2wIZY*0E>x< zF`1b?d$yW4Z*FtH_`_PUV#TaA3quAJhIFZ@0F%gV|! zN)ZjfF-~Q3MKY-Z9K!GBt z+qZUt0L6|gSFTuQ-Rsw{%R`^LNOnmeSmKZSDO0A{J()(SkqV@TXPk6Ert_wQHoSZH z&LHjl{qW&~#fUir;ETz_CzDHg7vZCcH%$;d0Hp&}lw%K~yLIbkF!ZgLk1GeVuu4Ei zDV<0p|N9OrN*1Ax{^YnXU%tFD%slVFLf^i9jX0?Ck|+mDJjJ{<2+fc8fEP5#ZkO&4 zfa8rDH>y*oPNvw_Hbs#}d?i;j7PaO@yc~GIDiC(CF@YES#4J`Z%I-IB-dNsX6?ndx z+O=z^9zA*}zf}S`R}n%AqI2iYwu`4;yl`&czMT(fN(12CyLSz&Fc5FJ5bS>X^hqJq z3<;vSC`%6Zo;`co;Y(83KAxQpGk;iCZcNCp9|2SO){7vX5S@;)TB_*tR;^lDAW$)p zCl0*(%?9)R!~`Z_$8QpUal*yoOm;XVo*U#Sm``u~W8ZJy!wjX#H@Cz0J_iwDWSd#? z)S^WT&g|v(Yr&V_6kp~)<^5XVjul^(`F~k>5)+bI{vG#MT>PKW$+2;5TE=+(1$H$f AumAu6 literal 0 HcmV?d00001 diff --git a/indra/newview/skins/darkgreen/textures/tool_dozer_active.tga b/indra/newview/skins/darkgreen/textures/tool_dozer_active.tga new file mode 100644 index 0000000000000000000000000000000000000000..6099823a8347d7caef0ddcd3de290a791d5977c9 GIT binary patch literal 3279 zcmZXXcW6~f7{yKBf5%}}I!nkYHsL{PZ%a$$W@hW@!_U+Z7LkD&0)JdH?cUG4! zUF3D`+EvLtdh}4Bd-v}0xbwPo>!t~I$GkvNQj+q3$5Xp@?c{l$($dm2X3Q9k8#hi9 zCQQ(zNs}~r@?=e&I@PWdCr-5c>C>lc%9JS@F=B+0lap;M{vwt#$wE!F=K{i&z`M0bLME~%$XWLe!K-VWXKSkO>hK8AZbJw zY~H-Nfq|3Pfh8s;iYdc~54UNfM~^l@mSYwW>FMdZckiB_J$t5CuU_fp%a?li@Sz`I zYHF$m4H~3j!-iRoK&KLLuxZn#K4heWjE|4kz<~obbm&l9g6Y7K1=&1#@fO6{`t<3O^5)H}1`Qg>`}Xad0tE^bkjJZtFJHdc7_z@`;erU4D)sBv&$6~O zNIe+h+y9|?xnji%&6_t*7cXAa?&2Nr2P5wLsZ4a#>z9)T)A@T_dI#>C?+OG z#fulW=qSj82M?^pM9{l;Z}sZcOMUwEu}FvG#rHL z)vL?fw{M@qZr;2p;F1k^+O%mRlEpuAjDIzUOgW;$^pB& z(n5&9%6010(dyN!wRY`VEnK)z`}gm+W>OpqQLbD$c?=ArOSIVniUw(jf0uRCTqZ5_hAD0^X%vqbU9Nd4?oJy-J?g3 z42&z!I0w;F`VAX4X!GXH<}w6;J72$kU32HoRoSv-MfI%MIq7}Y0JyJFqlOP2|NH7cE-Ux>2!WMWq53O^0zr=!cNVutJ3jW>WL#&o|oeyk*N4 z9Xxo@lph%xX`=iuq;DNS!ckPmpzq(m3pcM_yS9}x*`QCKK5e@L#YDP5voz0K*}mvM zVPVXufcHE@t*qH*bJ=377=*WI(IVwPeE6^hK(8@A?3U7EC8bN3R^`f-?Y)DKii$E( z(M9N2qC^R8-MZCwn&{|g;|5-MpC!hTZYdp&f1KkPusU| z*Nz=K#FD_#0o*)|^m3rdOP4NL>53F7V(q~5Q%E?-A}778K-r-T=Tk-@J$jdN^ypCq>8biX<}$J6!&sgLzo`>DfZ9t1Y+=hEF*&KBrMI@`rogB z0Q-Z-|B^XHhv81>c^YK4?}Pw0$JfL$^qKiJK}$l1w7={dBy`kj85;8@^BaUa-h{g7 bzE=YAjT2%MmoMx5`SZGX@uDtW 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 literal 0 HcmV?d00001 diff --git a/indra/newview/skins/darkgreen/textures/toolbar_btn_disabled.tga b/indra/newview/skins/darkgreen/textures/toolbar_btn_disabled.tga new file mode 100644 index 0000000000000000000000000000000000000000..59c57fc7cd6dba4d06f9be420f1b2ca82020f40d GIT binary patch literal 12332 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 Date: Sat, 6 Sep 2014 11:30:25 -0400 Subject: [PATCH 7/9] Fix teh Singletons to have a global registry --- indra/llcommon/llsingleton.cpp | 1 + indra/llcommon/llsingleton.h | 62 +++++++++++++++++++++++++++++----- 2 files changed, 54 insertions(+), 9 deletions(-) diff --git a/indra/llcommon/llsingleton.cpp b/indra/llcommon/llsingleton.cpp index 9b49e5237..3d32d4771 100644 --- a/indra/llcommon/llsingleton.cpp +++ b/indra/llcommon/llsingleton.cpp @@ -28,4 +28,5 @@ #include "llsingleton.h" +std::map* LLSingletonRegistry::sSingletonMap = NULL; diff --git a/indra/llcommon/llsingleton.h b/indra/llcommon/llsingleton.h index 0fad5a1fa..b1e17fc13 100644 --- a/indra/llcommon/llsingleton.h +++ b/indra/llcommon/llsingleton.h @@ -27,9 +27,33 @@ #include "llerror.h" // *TODO: eliminate this +#include #include #include +/// @brief A global registry of all singletons to prevent duplicate allocations +/// across shared library boundaries +class LL_COMMON_API LLSingletonRegistry +{ + typedef std::map TypeMap; + static TypeMap* sSingletonMap; + +public: + template static void * & get() + { + std::string name(typeid(T).name()); + if (!sSingletonMap) sSingletonMap = new TypeMap(); + + // the first entry of the pair returned by insert will be either the existing + // iterator matching our key, or the newly inserted NULL initialized entry + // see "Insert element" in http://www.sgi.com/tech/stl/UniqueAssociativeContainer.html + TypeMap::iterator result = + sSingletonMap->insert(std::make_pair(name, (void*)NULL)).first; + + return result->second; + } +}; + // LLSingleton implements the getInstance() method part of the Singleton // pattern. It can't make the derived class constructors protected, though, so // you have to do that yourself. @@ -57,7 +81,7 @@ template class LLSingleton : private boost::noncopyable { - + private: typedef enum e_init_state { @@ -67,12 +91,14 @@ private: INITIALIZED, DELETED } EInitState; - + static DERIVED_TYPE* constructSingleton() { return new DERIVED_TYPE(); } + struct SingletonData; + // stores pointer to singleton instance struct SingletonLifetimeManager { @@ -83,6 +109,7 @@ private: static void construct() { + SingletonData& sData(getData()); sData.mInitState = CONSTRUCTING; sData.mInstance = constructSingleton(); sData.mInitState = INITIALIZING; @@ -90,16 +117,18 @@ private: ~SingletonLifetimeManager() { + SingletonData& sData(getData()); if (sData.mInitState != DELETED) { deleteSingleton(); } } }; - + public: virtual ~LLSingleton() { + SingletonData& sData(getData()); sData.mInstance = NULL; sData.mInitState = DELETED; } @@ -126,15 +155,31 @@ public: */ static void deleteSingleton() { + SingletonData& sData(getData()); delete sData.mInstance; sData.mInstance = NULL; sData.mInitState = DELETED; } + static SingletonData& getData() + { + // this is static to cache the lookup results + static void * & registry = LLSingletonRegistry::get(); + + // *TODO - look into making this threadsafe + if (!registry) + { + static SingletonData data; + registry = &data; + } + + return *static_cast(registry); + } static DERIVED_TYPE* getInstance() { static SingletonLifetimeManager sLifeTimeMgr; + SingletonData& sData(getData()); switch (sData.mInitState) { @@ -168,6 +213,7 @@ public: static DERIVED_TYPE* getIfExists() { + SingletonData& sData(getData()); return sData.mInstance; } @@ -177,18 +223,20 @@ public: { return *getInstance(); } - + // Has this singleton been created uet? // Use this to avoid accessing singletons before the can safely be constructed static bool instanceExists() { + SingletonData& sData(getData()); return sData.mInitState == INITIALIZED; } - + // Has this singleton already been deleted? // Use this to avoid accessing singletons from a static object's destructor static bool destroyed() { + SingletonData& sData(getData()); return sData.mInitState == DELETED; } @@ -203,10 +251,6 @@ private: EInitState mInitState; DERIVED_TYPE* mInstance; }; - static SingletonData sData; }; - -template -typename LLSingleton::SingletonData LLSingleton::sData; #endif From 91b98bed0580751e69d49622b2c2327a844822ac Mon Sep 17 00:00:00 2001 From: Inusaito Sayori Date: Sat, 6 Sep 2014 18:42:24 -0400 Subject: [PATCH 8/9] Fix sex radio: Now let's hear some kinky tunes~ --- indra/newview/skins/default/xui/en-us/floater_customize.xml | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/indra/newview/skins/default/xui/en-us/floater_customize.xml b/indra/newview/skins/default/xui/en-us/floater_customize.xml index b4eeaf48f..bdd0065cd 100644 --- a/indra/newview/skins/default/xui/en-us/floater_customize.xml +++ b/indra/newview/skins/default/xui/en-us/floater_customize.xml @@ -47,12 +47,10 @@ name="Legs" scale_image="true" width="82" /> - + Female - + Male From 5072f983edf41c3f5e6d45af5f06b2e3cb7fc1d2 Mon Sep 17 00:00:00 2001 From: Inusaito Sayori Date: Sat, 6 Sep 2014 19:17:29 -0400 Subject: [PATCH 9/9] Fix up skins, remove poor line endings and remove a few nonexistent colors. --- indra/newview/skins/dark/colors.xml | 6 - indra/newview/skins/darkcatalan/colors.xml | 2 - indra/newview/skins/darkgred/colors.xml | 5 - indra/newview/skins/darkgreen/colors.xml | 6 - indra/newview/skins/darkorange/colors.xml | 6 - indra/newview/skins/emerald/colors.xml | 6 - indra/newview/skins/gred/colors.xml | 6 - indra/newview/skins/italia/colors.xml | 378 ++++++++--------- indra/newview/skins/kirstenLite2/colors.xml | 419 ++++++++++--------- indra/newview/skins/orangelife/colors.xml | 392 ++++++++--------- indra/newview/skins/ponyaquablue/colors.xml | 6 - indra/newview/skins/ponypurple/colors.xml | 5 - indra/newview/skins/pslgreen/colors.xml | 6 - indra/newview/skins/pslpurple/colors.xml | 6 - indra/newview/skins/ruby/colors.xml | 5 - indra/newview/skins/sapphire/colors.xml | 6 - indra/newview/skins/snowwhite/colors.xml | 405 +++++++++--------- indra/newview/skins/stpatrick/colors.xml | 383 +++++++++-------- indra/newview/skins/white_emerald/colors.xml | 6 - 19 files changed, 988 insertions(+), 1066 deletions(-) diff --git a/indra/newview/skins/dark/colors.xml b/indra/newview/skins/dark/colors.xml index 032351a88..c911a04f4 100644 --- a/indra/newview/skins/dark/colors.xml +++ b/indra/newview/skins/dark/colors.xml @@ -183,12 +183,6 @@ - - - - - - diff --git a/indra/newview/skins/darkcatalan/colors.xml b/indra/newview/skins/darkcatalan/colors.xml index e2579eeee..f8a009e0d 100644 --- a/indra/newview/skins/darkcatalan/colors.xml +++ b/indra/newview/skins/darkcatalan/colors.xml @@ -150,8 +150,6 @@ - - diff --git a/indra/newview/skins/darkgred/colors.xml b/indra/newview/skins/darkgred/colors.xml index 22034c252..c005b75fc 100644 --- a/indra/newview/skins/darkgred/colors.xml +++ b/indra/newview/skins/darkgred/colors.xml @@ -184,11 +184,6 @@ - - - - - diff --git a/indra/newview/skins/darkgreen/colors.xml b/indra/newview/skins/darkgreen/colors.xml index 50dfe55d3..4745c72dd 100644 --- a/indra/newview/skins/darkgreen/colors.xml +++ b/indra/newview/skins/darkgreen/colors.xml @@ -183,12 +183,6 @@ - - - - - - diff --git a/indra/newview/skins/darkorange/colors.xml b/indra/newview/skins/darkorange/colors.xml index f3ff107f0..07c97ce6e 100644 --- a/indra/newview/skins/darkorange/colors.xml +++ b/indra/newview/skins/darkorange/colors.xml @@ -186,12 +186,6 @@ - - - - - - diff --git a/indra/newview/skins/emerald/colors.xml b/indra/newview/skins/emerald/colors.xml index 57f34271a..9fd1a9c31 100644 --- a/indra/newview/skins/emerald/colors.xml +++ b/indra/newview/skins/emerald/colors.xml @@ -184,12 +184,6 @@ - - - - - - diff --git a/indra/newview/skins/gred/colors.xml b/indra/newview/skins/gred/colors.xml index 6ecb33e97..521f3fdb6 100644 --- a/indra/newview/skins/gred/colors.xml +++ b/indra/newview/skins/gred/colors.xml @@ -183,12 +183,6 @@ - - - - - - diff --git a/indra/newview/skins/italia/colors.xml b/indra/newview/skins/italia/colors.xml index a44b198bd..6f50ed257 100644 --- a/indra/newview/skins/italia/colors.xml +++ b/indra/newview/skins/italia/colors.xml @@ -1,195 +1,197 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - + + + + + - - - - - - - - - - + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + + + + + + + + diff --git a/indra/newview/skins/kirstenLite2/colors.xml b/indra/newview/skins/kirstenLite2/colors.xml index 45ed05b9d..0407e9c41 100644 --- a/indra/newview/skins/kirstenLite2/colors.xml +++ b/indra/newview/skins/kirstenLite2/colors.xml @@ -1,212 +1,213 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/indra/newview/skins/orangelife/colors.xml b/indra/newview/skins/orangelife/colors.xml index 296697ecb..dd6fdc37e 100644 --- a/indra/newview/skins/orangelife/colors.xml +++ b/indra/newview/skins/orangelife/colors.xml @@ -1,197 +1,197 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/indra/newview/skins/ponyaquablue/colors.xml b/indra/newview/skins/ponyaquablue/colors.xml index b48208f68..541777338 100644 --- a/indra/newview/skins/ponyaquablue/colors.xml +++ b/indra/newview/skins/ponyaquablue/colors.xml @@ -185,12 +185,6 @@ - - - - - - diff --git a/indra/newview/skins/ponypurple/colors.xml b/indra/newview/skins/ponypurple/colors.xml index 8cde4c258..07c97ce6e 100644 --- a/indra/newview/skins/ponypurple/colors.xml +++ b/indra/newview/skins/ponypurple/colors.xml @@ -186,11 +186,6 @@ - - - - - diff --git a/indra/newview/skins/pslgreen/colors.xml b/indra/newview/skins/pslgreen/colors.xml index 10647478b..4f1a5838a 100644 --- a/indra/newview/skins/pslgreen/colors.xml +++ b/indra/newview/skins/pslgreen/colors.xml @@ -183,12 +183,6 @@ - - - - - - diff --git a/indra/newview/skins/pslpurple/colors.xml b/indra/newview/skins/pslpurple/colors.xml index 10647478b..4f1a5838a 100644 --- a/indra/newview/skins/pslpurple/colors.xml +++ b/indra/newview/skins/pslpurple/colors.xml @@ -183,12 +183,6 @@ - - - - - - diff --git a/indra/newview/skins/ruby/colors.xml b/indra/newview/skins/ruby/colors.xml index f55f4c2e5..ae62cfda5 100644 --- a/indra/newview/skins/ruby/colors.xml +++ b/indra/newview/skins/ruby/colors.xml @@ -183,11 +183,6 @@ - - - - - diff --git a/indra/newview/skins/sapphire/colors.xml b/indra/newview/skins/sapphire/colors.xml index 0b5e343e1..53dd85540 100644 --- a/indra/newview/skins/sapphire/colors.xml +++ b/indra/newview/skins/sapphire/colors.xml @@ -190,12 +190,6 @@ - - - - - - diff --git a/indra/newview/skins/snowwhite/colors.xml b/indra/newview/skins/snowwhite/colors.xml index 85e2c6399..4cdecf112 100644 --- a/indra/newview/skins/snowwhite/colors.xml +++ b/indra/newview/skins/snowwhite/colors.xml @@ -1,210 +1,207 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - + + + + + + + + + + + + + + - - + + diff --git a/indra/newview/skins/stpatrick/colors.xml b/indra/newview/skins/stpatrick/colors.xml index a2acbaf9e..5bc5d22fd 100644 --- a/indra/newview/skins/stpatrick/colors.xml +++ b/indra/newview/skins/stpatrick/colors.xml @@ -1,197 +1,196 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/indra/newview/skins/white_emerald/colors.xml b/indra/newview/skins/white_emerald/colors.xml index 4cbe81f9d..bdb32f9eb 100644 --- a/indra/newview/skins/white_emerald/colors.xml +++ b/indra/newview/skins/white_emerald/colors.xml @@ -183,12 +183,6 @@ - - - - - -