summaryrefslogtreecommitdiff
path: root/indra/newview
diff options
context:
space:
mode:
Diffstat (limited to 'indra/newview')
-rw-r--r--indra/newview/llappviewer.cpp3
-rw-r--r--indra/newview/lldrawpool.h1
-rw-r--r--indra/newview/lldrawpoolalpha.cpp1
-rw-r--r--indra/newview/lldriverparam.cpp2
-rw-r--r--indra/newview/llfolderview.cpp50
-rw-r--r--indra/newview/llfolderviewitem.cpp8
-rw-r--r--indra/newview/llfolderviewitem.h3
-rw-r--r--indra/newview/llinventorybridge.cpp88
-rw-r--r--indra/newview/llinventoryfilter.cpp5
-rw-r--r--indra/newview/llinventoryfilter.h1
-rw-r--r--indra/newview/llinventoryfunctions.cpp16
-rw-r--r--indra/newview/llmarketplacefunctions.cpp15
-rw-r--r--indra/newview/llviewerwindow.cpp24
-rw-r--r--indra/newview/llvoavatarself.cpp5
-rw-r--r--indra/newview/llvoavatarself.h2
-rw-r--r--indra/newview/llvovolume.cpp10
-rw-r--r--indra/newview/llwearable.cpp2
-rw-r--r--indra/newview/skins/default/xui/en/floater_merchant_outbox.xml12
-rw-r--r--indra/newview/skins/default/xui/en/menu_viewer.xml9
-rw-r--r--indra/newview/skins/default/xui/en/sidepanel_inventory.xml4
-rw-r--r--indra/newview/skins/default/xui/en/strings.xml2
21 files changed, 154 insertions, 109 deletions
diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp
index 49fbdbf1df..1174d108d2 100644
--- a/indra/newview/llappviewer.cpp
+++ b/indra/newview/llappviewer.cpp
@@ -1487,6 +1487,9 @@ void LLAppViewer::flushVFSIO()
bool LLAppViewer::cleanup()
{
+ //ditch LLVOAvatarSelf instance
+ gAgentAvatarp = NULL;
+
// workaround for DEV-35406 crash on shutdown
LLEventPumps::instance().reset();
diff --git a/indra/newview/lldrawpool.h b/indra/newview/lldrawpool.h
index 5a2981e749..64774d06df 100644
--- a/indra/newview/lldrawpool.h
+++ b/indra/newview/lldrawpool.h
@@ -133,6 +133,7 @@ public:
PASS_ALPHA,
PASS_ALPHA_MASK,
PASS_FULLBRIGHT_ALPHA_MASK,
+ PASS_ALPHA_INVISIBLE,
NUM_RENDER_TYPES,
};
diff --git a/indra/newview/lldrawpoolalpha.cpp b/indra/newview/lldrawpoolalpha.cpp
index ddb7d3ceeb..5b62dbc560 100644
--- a/indra/newview/lldrawpoolalpha.cpp
+++ b/indra/newview/lldrawpoolalpha.cpp
@@ -337,6 +337,7 @@ void LLDrawPoolAlpha::render(S32 pass)
pushBatches(LLRenderPass::PASS_ALPHA_MASK, LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_TEXCOORD0, FALSE);
pushBatches(LLRenderPass::PASS_FULLBRIGHT_ALPHA_MASK, LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_TEXCOORD0, FALSE);
+ pushBatches(LLRenderPass::PASS_ALPHA_INVISIBLE, LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_TEXCOORD0, FALSE);
if(shaders)
{
diff --git a/indra/newview/lldriverparam.cpp b/indra/newview/lldriverparam.cpp
index 8f47d3c5e5..64eb11fc9b 100644
--- a/indra/newview/lldriverparam.cpp
+++ b/indra/newview/lldriverparam.cpp
@@ -139,7 +139,7 @@ void LLDriverParamInfo::toStream(std::ostream &out)
}
else
{
- llwarns << "could not get parameter " << driven.mDrivenID << " from avatar " << gAgentAvatarp << " for driver parameter " << getID() << llendl;
+ llwarns << "could not get parameter " << driven.mDrivenID << " from avatar " << gAgentAvatarp.get() << " for driver parameter " << getID() << llendl;
}
out << std::endl;
}
diff --git a/indra/newview/llfolderview.cpp b/indra/newview/llfolderview.cpp
index 068a6407f7..70899014cb 100644
--- a/indra/newview/llfolderview.cpp
+++ b/indra/newview/llfolderview.cpp
@@ -797,7 +797,7 @@ void LLFolderView::sanitizeSelection()
// if nothing selected after prior constraints...
if (mSelectedItems.empty())
{
- // ...select first available parent of original selection, or "My Inventory" otherwise
+ // ...select first available parent of original selection
LLFolderViewItem* new_selection = NULL;
if (original_selected_item)
{
@@ -2023,19 +2023,13 @@ void LLFolderView::deleteAllChildren()
void LLFolderView::scrollToShowSelection()
{
- // If items are filtered while background fetch is in progress
- // scrollbar resets to the first filtered item. See EXT-3981.
- // However we allow scrolling for folder views with mAutoSelectOverride
- // (used in Places SP) as an exception because the selection in them
- // is not reset during items filtering. See STORM-133.
- if ( (!LLInventoryModelBackgroundFetch::instance().folderFetchActive() || mAutoSelectOverride)
- && mSelectedItems.size() )
+ if ( mSelectedItems.size() )
{
mNeedsScroll = TRUE;
}
}
-// If the parent is scroll containter, scroll it to make the selection
+// If the parent is scroll container, scroll it to make the selection
// is maximally visible.
void LLFolderView::scrollToShowItem(LLFolderViewItem* item, const LLRect& constraint_rect)
{
@@ -2254,46 +2248,50 @@ void LLFolderView::doIdle()
arrangeAll();
}
+ if (mFilter->isModified() && mFilter->isNotDefault())
+ {
+ mNeedsAutoSelect = TRUE;
+ }
mFilter->clearModified();
- BOOL filter_modified_and_active = mCompletedFilterGeneration < mFilter->getCurrentGeneration() &&
- mFilter->isNotDefault();
- mNeedsAutoSelect = filter_modified_and_active &&
- !(gFocusMgr.childHasKeyboardFocus(this) || gFocusMgr.getMouseCapture());
- // filter to determine visiblity before arranging
+ // filter to determine visibility before arranging
filterFromRoot();
// automatically show matching items, and select first one if we had a selection
- // do this every frame until user puts keyboard focus into the inventory window
- // signaling the end of the automatic update
- // only do this when mNeedsFilter is set, meaning filtered items have
- // potentially changed
if (mNeedsAutoSelect)
{
LLFastTimer t3(FTM_AUTO_SELECT);
// select new item only if a filtered item not currently selected
LLFolderViewItem* selected_itemp = mSelectedItems.empty() ? NULL : mSelectedItems.back();
- if ((selected_itemp && !selected_itemp->getFiltered()) && !mAutoSelectOverride)
+ if (!mAutoSelectOverride && (!selected_itemp || !selected_itemp->potentiallyFiltered()))
{
- // select first filtered item
- LLSelectFirstFilteredItem filter;
- applyFunctorRecursively(filter);
+ applyFunctorRecursively(LLSelectFirstFilteredItem());
}
// Open filtered folders for folder views with mAutoSelectOverride=TRUE.
// Used by LLPlacesFolderView.
if (mAutoSelectOverride && !mFilter->getFilterSubString().empty())
{
- LLOpenFilteredFolders filter;
- applyFunctorRecursively(filter);
+ applyFunctorRecursively(LLOpenFilteredFolders());
}
scrollToShowSelection();
}
+ BOOL filter_finished = mCompletedFilterGeneration >= mFilter->getCurrentGeneration()
+ && !LLInventoryModelBackgroundFetch::instance().folderFetchActive();
+ if (filter_finished
+ || gFocusMgr.childHasKeyboardFocus(inventory_panel)
+ || gFocusMgr.childHasMouseCapture(inventory_panel))
+ {
+ // finishing the filter process, giving focus to the folder view, or dragging the scrollbar all stop the auto select process
+ mNeedsAutoSelect = FALSE;
+ }
+
+
// during filtering process, try to pin selected item's location on screen
// this will happen when searching your inventory and when new items arrive
- if (filter_modified_and_active)
+ if (!filter_finished)
{
// calculate rectangle to pin item to at start of animated rearrange
if (!mPinningSelectedItem && !mSelectedItems.empty())
@@ -2359,7 +2357,7 @@ void LLFolderView::doIdle()
{
scrollToShowItem(mSelectedItems.back(), constraint_rect);
// continue scrolling until animated layout change is done
- if (!filter_modified_and_active
+ if (filter_finished
&& (!needsArrange() || !is_visible))
{
mNeedsScroll = FALSE;
diff --git a/indra/newview/llfolderviewitem.cpp b/indra/newview/llfolderviewitem.cpp
index 712d3e4583..dce0981a3e 100644
--- a/indra/newview/llfolderviewitem.cpp
+++ b/indra/newview/llfolderviewitem.cpp
@@ -221,6 +221,11 @@ BOOL LLFolderViewItem::potentiallyVisible()
{
// we haven't been checked against min required filter
// or we have and we passed
+ return potentiallyFiltered();
+}
+
+BOOL LLFolderViewItem::potentiallyFiltered()
+{
return getLastFilterGeneration() < getRoot()->getFilter()->getMinRequiredGeneration() || getFiltered();
}
@@ -1375,7 +1380,8 @@ void LLFolderViewFolder::filter( LLInventoryFilter& filter)
&& !mPassedFilter) // and did not pass the filter
{
// go ahead and flag this folder as done
- mLastFilterGeneration = filter_generation;
+ mLastFilterGeneration = filter_generation;
+ mStringMatchOffset = std::string::npos;
}
else // filter self only on first pass through
{
diff --git a/indra/newview/llfolderviewitem.h b/indra/newview/llfolderviewitem.h
index 4e8dc2da16..3c7592046a 100644
--- a/indra/newview/llfolderviewitem.h
+++ b/indra/newview/llfolderviewitem.h
@@ -304,7 +304,8 @@ public:
BOOL isDescendantOf( const LLFolderViewFolder* potential_ancestor );
S32 getIndentation() { return mIndentation; }
- virtual BOOL potentiallyVisible(); // do we know for a fact that this item has been filtered out?
+ virtual BOOL potentiallyVisible(); // do we know for a fact that this item won't be displayed?
+ virtual BOOL potentiallyFiltered(); // do we know for a fact that this item has been filtered out?
virtual BOOL getFiltered();
virtual BOOL getFiltered(S32 filter_generation);
diff --git a/indra/newview/llinventorybridge.cpp b/indra/newview/llinventorybridge.cpp
index 8d3ac3e723..fbed8e31ff 100644
--- a/indra/newview/llinventorybridge.cpp
+++ b/indra/newview/llinventorybridge.cpp
@@ -73,7 +73,7 @@
#include "llwearablelist.h"
// Marketplace outbox current disabled
-#define ENABLE_MERCHANT_OUTBOX_CONTEXT_MENU 0
+#define ENABLE_MERCHANT_OUTBOX_CONTEXT_MENU 1
#define ENABLE_MERCHANT_SEND_TO_MARKETPLACE_CONTEXT_MENU 0
#define BLOCK_WORN_ITEMS_IN_OUTBOX 1
@@ -486,11 +486,11 @@ BOOL LLInvFVBridge::isClipboardPasteable() const
// Folders are pastable if all items in there are copyable
const LLInventoryCategory *cat = model->getCategory(item_id);
- if (cat)
+ if (cat)
{
LLFolderBridge cat_br(mInventoryPanel.get(), mRoot, item_id);
if (!cat_br.isItemCopyable())
- return FALSE;
+ return FALSE;
// Skip to the next item in the clipboard
continue;
}
@@ -498,8 +498,8 @@ BOOL LLInvFVBridge::isClipboardPasteable() const
// Each item must be copyable to be pastable
LLItemBridge item_br(mInventoryPanel.get(), mRoot, item_id);
if (!item_br.isItemCopyable())
- return FALSE;
- }
+ return FALSE;
+ }
return TRUE;
}
@@ -1770,7 +1770,7 @@ LLHandle<LLFolderBridge> LLFolderBridge::sSelf;
BOOL LLFolderBridge::isItemMovable() const
{
LLInventoryObject* obj = getInventoryObject();
- if (obj)
+ if(obj)
{
// If it's a protected type folder, we can't move it
if (LLFolderType::lookupIsProtectedType(((LLInventoryCategory*)obj)->getPreferredType()))
@@ -1856,20 +1856,20 @@ BOOL LLFolderBridge::isItemCopyable() const
LLItemBridge item_br(mInventoryPanel.get(), mRoot, item->getUUID());
if (!item_br.isItemCopyable())
return FALSE;
- }
-
+}
+
// Check the folders
LLInventoryModel::cat_array_t cat_array_copy = *cat_array;
for (LLInventoryModel::cat_array_t::iterator iter = cat_array_copy.begin(); iter != cat_array_copy.end(); iter++)
- {
+{
LLViewerInventoryCategory* category = *iter;
LLFolderBridge cat_br(mInventoryPanel.get(), mRoot, category->getUUID());
if (!cat_br.isItemCopyable())
return FALSE;
}
- return TRUE;
-}
+ return TRUE;
+ }
BOOL LLFolderBridge::isClipboardPasteable() const
{
@@ -2522,13 +2522,13 @@ void LLRightClickInventoryFetchDescendentsObserver::execute(bool clear_observer)
llwarns << "LLRightClickInventoryFetchDescendentsObserver::done with empty mCompleteFolders" << llendl;
if (clear_observer)
{
- dec_busy_count();
- gInventory.removeObserver(this);
- delete this;
+ dec_busy_count();
+ gInventory.removeObserver(this);
+ delete this;
}
return;
}
-
+
// Copy the list of complete fetched folders while "this" is still valid
uuid_vec_t completed_folder = mComplete;
@@ -2540,7 +2540,7 @@ void LLRightClickInventoryFetchDescendentsObserver::execute(bool clear_observer)
gInventory.removeObserver(this);
delete this;
}
-
+
for (uuid_vec_t::iterator current_folder = completed_folder.begin(); current_folder != completed_folder.end(); ++current_folder)
{
// Get the information on the fetched folder items and subfolders and fetch those
@@ -2553,9 +2553,9 @@ void LLRightClickInventoryFetchDescendentsObserver::execute(bool clear_observer)
// Move to next if current folder empty
if ((item_count == 0) && (cat_count == 0))
- {
+ {
continue;
- }
+ }
uuid_vec_t ids;
LLRightClickInventoryFetchObserver* outfit = NULL;
@@ -2583,23 +2583,23 @@ void LLRightClickInventoryFetchDescendentsObserver::execute(bool clear_observer)
// Perform the item fetch
if (outfit)
{
- outfit->startFetch();
+ outfit->startFetch();
outfit->execute(); // Not interested in waiting and this will be right 99% of the time.
delete outfit;
- // Uncomment the following code for laggy Inventory UI.
+//Uncomment the following code for laggy Inventory UI.
/*
if (outfit->isFinished())
- {
- // everything is already here - call done.
+ {
+ // everything is already here - call done.
outfit->execute();
delete outfit;
- }
- else
- {
+ }
+ else
+ {
// it's all on its way - add an observer, and the inventory
- // will call done for us when everything is here.
+ // will call done for us when everything is here.
inc_busy_count();
- gInventory.addObserver(outfit);
+ gInventory.addObserver(outfit);
}
*/
}
@@ -2957,7 +2957,7 @@ bool LLFolderBridge::removeItemResponse(const LLSD& notification, const LLSD& re
void LLFolderBridge::pasteFromClipboard()
{
LLInventoryModel* model = getInventoryModel();
- if (model && isClipboardPasteable())
+ if(model && isClipboardPasteable())
{
const LLUUID &current_outfit_id = model->findCategoryUUIDForType(LLFolderType::FT_CURRENT_OUTFIT, false);
const LLUUID &outbox_id = model->findCategoryUUIDForType(LLFolderType::FT_OUTBOX, false);
@@ -3041,15 +3041,15 @@ void LLFolderBridge::pasteFromClipboard()
}
}
else
+ {
+ LLViewerInventoryItem* viitem = dynamic_cast<LLViewerInventoryItem*>(item);
+ llassert(viitem);
+ if (viitem)
{
- LLViewerInventoryItem* viitem = dynamic_cast<LLViewerInventoryItem*>(item);
- llassert(viitem);
- if (viitem)
- {
- changeItemParent(model, viitem, parent_id, FALSE);
- }
+ changeItemParent(model, viitem, parent_id, FALSE);
}
}
+ }
else
{
// Do a "copy" to "paste" a regular copy clipboard
@@ -3062,19 +3062,19 @@ void LLFolderBridge::pasteFromClipboard()
copy_inventory_category(model, vicat, parent_id);
}
}
- else
- {
- copy_inventory_item(
- gAgent.getID(),
- item->getPermissions().getOwner(),
- item->getUUID(),
- parent_id,
- std::string(),
- LLPointer<LLInventoryCallback>(NULL));
- }
+ else
+ {
+ copy_inventory_item(
+ gAgent.getID(),
+ item->getPermissions().getOwner(),
+ item->getUUID(),
+ parent_id,
+ std::string(),
+ LLPointer<LLInventoryCallback>(NULL));
}
}
}
+ }
// Change mode to paste for next paste
LLClipboard::instance().setCutMode(false);
}
diff --git a/indra/newview/llinventoryfilter.cpp b/indra/newview/llinventoryfilter.cpp
index e859535d18..4d0af94f9f 100644
--- a/indra/newview/llinventoryfilter.cpp
+++ b/indra/newview/llinventoryfilter.cpp
@@ -402,6 +402,11 @@ std::string::size_type LLInventoryFilter::getStringMatchOffset() const
return mSubStringMatchOffset;
}
+BOOL LLInventoryFilter::isDefault() const
+{
+ return !isNotDefault();
+}
+
// has user modified default filter params?
BOOL LLInventoryFilter::isNotDefault() const
{
diff --git a/indra/newview/llinventoryfilter.h b/indra/newview/llinventoryfilter.h
index 1804637a04..9e600c036f 100644
--- a/indra/newview/llinventoryfilter.h
+++ b/indra/newview/llinventoryfilter.h
@@ -163,6 +163,7 @@ public:
// +-------------------------------------------------------------------+
// + Default
// +-------------------------------------------------------------------+
+ BOOL isDefault() const;
BOOL isNotDefault() const;
void markDefault();
void resetDefault();
diff --git a/indra/newview/llinventoryfunctions.cpp b/indra/newview/llinventoryfunctions.cpp
index 236c997ef6..f74a239fd3 100644
--- a/indra/newview/llinventoryfunctions.cpp
+++ b/indra/newview/llinventoryfunctions.cpp
@@ -1059,20 +1059,24 @@ void LLSaveFolderState::setApply(BOOL apply)
void LLSaveFolderState::doFolder(LLFolderViewFolder* folder)
{
LLMemType mt(LLMemType::MTYPE_INVENTORY_DO_FOLDER);
+ LLInvFVBridge* bridge = (LLInvFVBridge*)folder->getListener();
+ if(!bridge) return;
+
if(mApply)
{
// we're applying the open state
- LLInvFVBridge* bridge = (LLInvFVBridge*)folder->getListener();
- if(!bridge) return;
LLUUID id(bridge->getUUID());
if(mOpenFolders.find(id) != mOpenFolders.end())
{
- folder->setOpen(TRUE);
+ if (!folder->isOpen())
+ {
+ folder->setOpen(TRUE);
+ }
}
else
{
// keep selected filter in its current state, this is less jarring to user
- if (!folder->isSelected())
+ if (!folder->isSelected() && folder->isOpen())
{
folder->setOpen(FALSE);
}
@@ -1083,8 +1087,6 @@ void LLSaveFolderState::doFolder(LLFolderViewFolder* folder)
// we're recording state at this point
if(folder->isOpen())
{
- LLInvFVBridge* bridge = (LLInvFVBridge*)folder->getListener();
- if(!bridge) return;
mOpenFolders.insert(bridge->getUUID());
}
}
@@ -1120,7 +1122,6 @@ void LLSelectFirstFilteredItem::doItem(LLFolderViewItem *item)
{
item->getParentFolder()->setOpenArrangeRecursively(TRUE, LLFolderViewFolder::RECURSE_UP);
}
- item->getRoot()->scrollToShowSelection();
mItemSelected = TRUE;
}
}
@@ -1134,7 +1135,6 @@ void LLSelectFirstFilteredItem::doFolder(LLFolderViewFolder* folder)
{
folder->getParentFolder()->setOpenArrangeRecursively(TRUE, LLFolderViewFolder::RECURSE_UP);
}
- folder->getRoot()->scrollToShowSelection();
mItemSelected = TRUE;
}
}
diff --git a/indra/newview/llmarketplacefunctions.cpp b/indra/newview/llmarketplacefunctions.cpp
index a3f0a6062c..93dd82957f 100644
--- a/indra/newview/llmarketplacefunctions.cpp
+++ b/indra/newview/llmarketplacefunctions.cpp
@@ -30,6 +30,7 @@
#include "llagent.h"
#include "llhttpclient.h"
+#include "lltimer.h"
#include "lltrans.h"
#include "llviewercontrol.h"
#include "llviewermedia.h"
@@ -115,6 +116,9 @@ namespace LLMarketplaceImport
static U32 sImportResultStatus = 0;
static LLSD sImportResults = LLSD::emptyMap();
+ static LLTimer slmGetTimer;
+ static LLTimer slmPostTimer;
+
// Responders
class LLImportPostResponder : public LLHTTPClient::Responder
@@ -124,11 +128,15 @@ namespace LLMarketplaceImport
void completed(U32 status, const std::string& reason, const LLSD& content)
{
+ slmPostTimer.stop();
+
if (gSavedSettings.getBOOL("InventoryOutboxLogging"))
{
llinfos << " SLM POST status: " << status << llendl;
llinfos << " SLM POST reason: " << reason << llendl;
llinfos << " SLM POST content: " << content.asString() << llendl;
+
+ llinfos << " SLM POST timer: " << slmPostTimer.getElapsedTimeF32() << llendl;
}
if ((status == MarketplaceErrorCodes::IMPORT_REDIRECT) ||
@@ -167,11 +175,15 @@ namespace LLMarketplaceImport
void completed(U32 status, const std::string& reason, const LLSD& content)
{
+ slmGetTimer.stop();
+
if (gSavedSettings.getBOOL("InventoryOutboxLogging"))
{
llinfos << " SLM GET status: " << status << llendl;
llinfos << " SLM GET reason: " << reason << llendl;
llinfos << " SLM GET content: " << content.asString() << llendl;
+
+ llinfos << " SLM GET timer: " << slmGetTimer.getElapsedTimeF32() << llendl;
}
if ((status == MarketplaceErrorCodes::IMPORT_AUTHENTICATION_ERROR) ||
@@ -247,6 +259,7 @@ namespace LLMarketplaceImport
llinfos << " SLM GET: " << url << llendl;
}
+ slmGetTimer.start();
LLHTTPClient::get(url, new LLImportGetResponder(), LLViewerMedia::getHeaders());
return true;
@@ -277,6 +290,7 @@ namespace LLMarketplaceImport
llinfos << " SLM GET: " << url << llendl;
}
+ slmGetTimer.start();
LLHTTPClient::get(url, new LLImportGetResponder(), headers);
return true;
@@ -310,6 +324,7 @@ namespace LLMarketplaceImport
llinfos << " SLM POST: " << url << llendl;
}
+ slmPostTimer.start();
LLHTTPClient::post(url, LLSD(), new LLImportPostResponder(), headers);
return true;
diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp
index 9a9f8fd013..ecd76f5495 100644
--- a/indra/newview/llviewerwindow.cpp
+++ b/indra/newview/llviewerwindow.cpp
@@ -610,7 +610,7 @@ public:
addText(xpos, ypos, llformat("%d/%d Mesh HTTP Requests/Retries", LLMeshRepository::sHTTPRequestCount,
LLMeshRepository::sHTTPRetryCount));
ypos += y_inc;
-
+
addText(xpos, ypos, llformat("%d/%d Mesh LOD Pending/Processing", LLMeshRepository::sLODPending, LLMeshRepository::sLODProcessing));
ypos += y_inc;
@@ -1969,12 +1969,12 @@ void LLViewerWindow::shutdownViews()
gMorphView->setVisible(FALSE);
}
llinfos << "Global views cleaned." << llendl ;
-
+
// DEV-40930: Clear sModalStack. Otherwise, any LLModalDialog left open
// will crump with LL_ERRS.
LLModalDialog::shutdownModals();
llinfos << "LLModalDialog shut down." << llendl;
-
+
// destroy the nav bar, not currently part of gViewerWindow
// *TODO: Make LLNavigationBar part of gViewerWindow
if (LLNavigationBar::instanceExists())
@@ -1982,17 +1982,17 @@ void LLViewerWindow::shutdownViews()
delete LLNavigationBar::getInstance();
}
llinfos << "LLNavigationBar destroyed." << llendl ;
-
+
// destroy menus after instantiating navbar above, as it needs
// access to gMenuHolder
cleanup_menus();
llinfos << "menus destroyed." << llendl ;
-
+
// Delete all child views.
delete mRootView;
mRootView = NULL;
llinfos << "RootView deleted." << llendl ;
-
+
// Automatically deleted as children of mRootView. Fix the globals.
gStatusBar = NULL;
gIMMgr = NULL;
@@ -2017,6 +2017,12 @@ void LLViewerWindow::shutdownGL()
gSky.cleanup();
stop_glerror();
+ llinfos << "Cleaning up pipeline" << llendl;
+ gPipeline.cleanup();
+ stop_glerror();
+
+ //MUST clean up pipeline before cleaning up wearables
+ llinfos << "Cleaning up wearables" << llendl;
LLWearableList::instance().cleanup() ;
gTextureList.shutdown();
@@ -2027,10 +2033,6 @@ void LLViewerWindow::shutdownGL()
LLWorldMapView::cleanupTextures();
- llinfos << "Cleaning up pipeline" << llendl;
- gPipeline.cleanup();
- stop_glerror();
-
LLViewerTextureManager::cleanup() ;
LLImageGL::cleanupClass() ;
@@ -2162,7 +2164,7 @@ void LLViewerWindow::reshape(S32 width, S32 height)
LLCoordScreen window_rect;
if (mWindow->getSize(&window_rect))
{
- // Only save size if not maximized
+ // Only save size if not maximized
gSavedSettings.setU32("WindowWidth", window_rect.mX);
gSavedSettings.setU32("WindowHeight", window_rect.mY);
}
diff --git a/indra/newview/llvoavatarself.cpp b/indra/newview/llvoavatarself.cpp
index 8be9516ab6..f063653cc5 100644
--- a/indra/newview/llvoavatarself.cpp
+++ b/indra/newview/llvoavatarself.cpp
@@ -66,10 +66,11 @@
#include <boost/lexical_cast.hpp>
-LLVOAvatarSelf *gAgentAvatarp = NULL;
+LLPointer<LLVOAvatarSelf> gAgentAvatarp = NULL;
+
BOOL isAgentAvatarValid()
{
- return (gAgentAvatarp &&
+ return (gAgentAvatarp.notNull() &&
(gAgentAvatarp->getRegion() != NULL) &&
(!gAgentAvatarp->isDead()));
}
diff --git a/indra/newview/llvoavatarself.h b/indra/newview/llvoavatarself.h
index 54dbe81993..655fb3a012 100644
--- a/indra/newview/llvoavatarself.h
+++ b/indra/newview/llvoavatarself.h
@@ -383,7 +383,7 @@ private:
};
-extern LLVOAvatarSelf *gAgentAvatarp;
+extern LLPointer<LLVOAvatarSelf> gAgentAvatarp;
BOOL isAgentAvatarValid();
diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp
index 7492a06784..03d4c51aff 100644
--- a/indra/newview/llvovolume.cpp
+++ b/indra/newview/llvovolume.cpp
@@ -4433,10 +4433,10 @@ void LLVolumeGeometryManager::rebuildGeom(LLSpatialGroup* group)
else
{
if (te->getColor().mV[3] > 0.f)
- {
+ { //only treat as alpha in the pipeline if < 100% transparent
drawablep->setState(LLDrawable::HAS_ALPHA);
- alpha_faces.push_back(facep);
}
+ alpha_faces.push_back(facep);
}
}
else
@@ -4947,7 +4947,11 @@ void LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, std::
if (is_alpha)
{
// can we safely treat this as an alpha mask?
- if (facep->canRenderAsMask())
+ if (facep->getFaceColor().mV[3] <= 0.f)
+ { //100% transparent, don't render unless we're highlighting transparent
+ registerFace(group, facep, LLRenderPass::PASS_ALPHA_INVISIBLE);
+ }
+ else if (facep->canRenderAsMask())
{
if (te->getFullbright() || LLPipeline::sNoAlpha)
{
diff --git a/indra/newview/llwearable.cpp b/indra/newview/llwearable.cpp
index d8aa0b7d5c..0f7f63061b 100644
--- a/indra/newview/llwearable.cpp
+++ b/indra/newview/llwearable.cpp
@@ -221,7 +221,7 @@ void LLWearable::createVisualParams()
param->resetDrivenParams();
if(!param->linkDrivenParams(boost::bind(wearable_function,(LLWearable*)this, _1), false))
{
- if( !param->linkDrivenParams(boost::bind(avatar_function,gAgentAvatarp,_1 ), true))
+ if( !param->linkDrivenParams(boost::bind(avatar_function,gAgentAvatarp.get(),_1 ), true))
{
llwarns << "could not link driven params for wearable " << getName() << " id: " << param->getID() << llendl;
continue;
diff --git a/indra/newview/skins/default/xui/en/floater_merchant_outbox.xml b/indra/newview/skins/default/xui/en/floater_merchant_outbox.xml
index 90bd64a675..72d2281435 100644
--- a/indra/newview/skins/default/xui/en/floater_merchant_outbox.xml
+++ b/indra/newview/skins/default/xui/en/floater_merchant_outbox.xml
@@ -115,7 +115,7 @@
wrap="true"
halign="left"
valign="center"
- font="SansSerif"/>
+ font="SansSerif" />
<button
label="Send to Marketplace"
tool_tip="Push to my Marketplace Storefront"
@@ -132,16 +132,16 @@
</panel>
<layout_stack name="import_progress_indicator" orientation="vertical" left="0" height="440" top="0" width="333" follows="all" visible="false">
<layout_panel />
- <layout_panel height="45" auto_resize="false">
- <layout_stack orientation="horizontal" left="0" height="45" top="0" width="333" follows="all">
+ <layout_panel height="24" auto_resize="false">
+ <layout_stack orientation="horizontal" left="0" height="24" top="0" width="333" follows="all">
<layout_panel width="0" />
- <layout_panel width="45" auto_resize="false">
+ <layout_panel width="24" auto_resize="false">
<loading_indicator
- height="45"
+ height="24"
layout="topleft"
left="0"
top="0"
- width="45" />
+ width="24" />
</layout_panel>
<layout_panel width="0" />
</layout_stack>
diff --git a/indra/newview/skins/default/xui/en/menu_viewer.xml b/indra/newview/skins/default/xui/en/menu_viewer.xml
index 9ff2e233af..5ba566b175 100644
--- a/indra/newview/skins/default/xui/en/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/en/menu_viewer.xml
@@ -153,6 +153,13 @@
function="BuyCurrency" />
</menu_item_call>
<menu_item_call
+ label="Merchant Outbox..."
+ name="MerchantOutbox">
+ <menu_item_call.on_click
+ function="Floater.ToggleOrBringToFront"
+ parameter="outbox" />
+ </menu_item_call>
+ <menu_item_call
label="Account dashboard..."
name="Manage My Account">
<menu_item_call.on_click
@@ -3269,7 +3276,7 @@
function="Advanced.ToggleVisualLeakDetector" />
</menu_item_call>
- <menu_item_check
+ <menu_item_check
label="Output Debug Minidump"
name="Output Debug Minidump">
<menu_item_check.on_check
diff --git a/indra/newview/skins/default/xui/en/sidepanel_inventory.xml b/indra/newview/skins/default/xui/en/sidepanel_inventory.xml
index bd6e934703..6ecb57b41d 100644
--- a/indra/newview/skins/default/xui/en/sidepanel_inventory.xml
+++ b/indra/newview/skins/default/xui/en/sidepanel_inventory.xml
@@ -48,7 +48,7 @@
height="300"
width="330" />
</layout_panel>
- <layout_panel
+ <layout_panel
width="330"
layout="topleft"
auto_resize="false"
@@ -114,7 +114,7 @@
bg_opaque_color="InventoryBackgroundColor"
background_visible="true"
background_opaque="true"
- tool_tip="Drag and drop items to your inventory to manage and use them"
+ tool_tip="Drag and drop items to your inventory to use them"
>
<text
name="inbox_inventory_placeholder"
diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml
index 54d5559efc..f2dab9c49b 100644
--- a/indra/newview/skins/default/xui/en/strings.xml
+++ b/indra/newview/skins/default/xui/en/strings.xml
@@ -2037,7 +2037,7 @@ Returns a string with the requested data about the region
<string name="PlacesNoMatchingItems">Didn't find what you're looking for? Try [secondlife:///app/search/places/[SEARCH_TERM] Search].</string>
<string name="FavoritesNoMatchingItems">Drag a landmark here to add it to your favorites.</string>
<string name="InventoryNoTexture">You do not have a copy of this texture in your inventory</string>
- <string name="InventoryInboxNoItems">Certain items you receive, such as premium gifts, will appear here. You may then drag them into your inventory.</string>
+ <string name="InventoryInboxNoItems">Your Marketplace purchases will appear here. You may then drag them into your inventory to use them.</string>
<string name="MarketplaceURL">https://marketplace.[MARKETPLACE_DOMAIN_NAME]/</string>
<string name="MarketplaceURL_CreateStore">http://community.secondlife.com/t5/English-Knowledge-Base/Selling-in-the-Marketplace/ta-p/700193#Section_.4</string>
<string name="MarketplaceURL_Dashboard">https://marketplace.[MARKETPLACE_DOMAIN_NAME]/merchants/store/dashboard</string>