Merge Firestorm LGPL
commit
31cc1ad792
1
.hgtags
1
.hgtags
|
|
@ -577,3 +577,4 @@ ad0e15543836d64d6399d28b32852510435e344a 5.1.0-release
|
|||
7b6b020fd5ad9a8dc3670c5c92d1ca92e55fc485 5.1.4-release
|
||||
2ea47f358b171178eb9a95503a1670d519c2886f 5.1.5-release
|
||||
04538b8157c1f5cdacd9403f0a395452d4a93689 5.1.6-release
|
||||
ac3b1332ad4f55b7182a8cbcc1254535a0069f75 5.1.7-release
|
||||
|
|
|
|||
|
|
@ -3566,9 +3566,9 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors</string>
|
|||
<key>archive</key>
|
||||
<map>
|
||||
<key>hash</key>
|
||||
<string>86f6708f393c162cd4f92426b0a3cde7</string>
|
||||
<string>f45c0a5e7b4601b355e163bf62f5718e</string>
|
||||
<key>url</key>
|
||||
<string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/15341/99062/viewer_manager-1.0.513570-darwin64-513570.tar.bz2</string>
|
||||
<string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/20587/147509/viewer_manager-1.0.517052-darwin64-517052.tar.bz2</string>
|
||||
</map>
|
||||
<key>name</key>
|
||||
<string>darwin64</string>
|
||||
|
|
@ -3602,9 +3602,9 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors</string>
|
|||
<key>archive</key>
|
||||
<map>
|
||||
<key>hash</key>
|
||||
<string>c4dec51062ad78c09b11f7432aff4d1d</string>
|
||||
<string>d2443caf062697430071d458a965f611</string>
|
||||
<key>url</key>
|
||||
<string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/17857/121832/viewer_manager-1.0.515286-windows-515286.tar.bz2</string>
|
||||
<string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/20588/147516/viewer_manager-1.0.517052-windows-517052.tar.bz2</string>
|
||||
</map>
|
||||
<key>name</key>
|
||||
<string>windows</string>
|
||||
|
|
@ -3615,7 +3615,7 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors</string>
|
|||
<key>source_type</key>
|
||||
<string>hg</string>
|
||||
<key>version</key>
|
||||
<string>1.0.515286</string>
|
||||
<string>1.0.517052</string>
|
||||
</map>
|
||||
<key>vlc-bin</key>
|
||||
<map>
|
||||
|
|
@ -3878,6 +3878,8 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors</string>
|
|||
</map>
|
||||
<key>package_description</key>
|
||||
<map>
|
||||
<key>canonical_repo</key>
|
||||
<string>https://bitbucket.org/lindenlab/viewer-release</string>
|
||||
<key>copyright</key>
|
||||
<string>Copyright (c) 2018, The Phoenix Firestorm Project, Inc.</string>
|
||||
<key>description</key>
|
||||
|
|
|
|||
|
|
@ -221,7 +221,6 @@ Ansariel Hiller
|
|||
STORM-2151
|
||||
MAINT-6917
|
||||
MAINT-8085
|
||||
STORM-2122
|
||||
Aralara Rajal
|
||||
Arare Chantilly
|
||||
CHUIBUG-191
|
||||
|
|
|
|||
|
|
@ -327,6 +327,7 @@ const U8 CLICK_ACTION_OPEN = 4;
|
|||
const U8 CLICK_ACTION_PLAY = 5;
|
||||
const U8 CLICK_ACTION_OPEN_MEDIA = 6;
|
||||
const U8 CLICK_ACTION_ZOOM = 7;
|
||||
const U8 CLICK_ACTION_DISABLED = 8;
|
||||
// DO NOT CHANGE THE SEQUENCE OF THIS LIST!!
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -35,6 +35,7 @@
|
|||
// external library headers
|
||||
#include <boost/bind.hpp>
|
||||
// other Linden headers
|
||||
#include "lltimer.h"
|
||||
#include "llevents.h"
|
||||
#include "llerror.h"
|
||||
#include "stringize.h"
|
||||
|
|
@ -280,6 +281,25 @@ void LLCoros::setStackSize(S32 stacksize)
|
|||
mStackSize = stacksize;
|
||||
}
|
||||
|
||||
void LLCoros::printActiveCoroutines()
|
||||
{
|
||||
LL_INFOS("LLCoros") << "Number of active coroutines: " << (S32)mCoros.size() << LL_ENDL;
|
||||
if (mCoros.size() > 0)
|
||||
{
|
||||
LL_INFOS("LLCoros") << "-------------- List of active coroutines ------------";
|
||||
CoroMap::iterator iter;
|
||||
CoroMap::iterator end = mCoros.end();
|
||||
F64 time = LLTimer::getTotalSeconds();
|
||||
for (iter = mCoros.begin(); iter != end; iter++)
|
||||
{
|
||||
F64 life_time = time - iter->second->mCreationTime;
|
||||
LL_CONT << LL_NEWLINE << "Name: " << iter->first << " life: " << life_time;
|
||||
}
|
||||
LL_CONT << LL_ENDL;
|
||||
LL_INFOS("LLCoros") << "-----------------------------------------------------" << LL_ENDL;
|
||||
}
|
||||
}
|
||||
|
||||
#if LL_WINDOWS
|
||||
|
||||
static const U32 STATUS_MSC_EXCEPTION = 0xE06D7363; // compiler specific
|
||||
|
|
@ -379,7 +399,8 @@ LLCoros::CoroData::CoroData(CoroData* prev, const std::string& name,
|
|||
mCoro(boost::bind(toplevel, _1, this, callable), stacksize),
|
||||
// don't consume events unless specifically directed
|
||||
mConsuming(false),
|
||||
mSelf(0)
|
||||
mSelf(0),
|
||||
mCreationTime(LLTimer::getTotalSeconds())
|
||||
{
|
||||
}
|
||||
|
||||
|
|
@ -388,7 +409,13 @@ std::string LLCoros::launch(const std::string& prefix, const callable_t& callabl
|
|||
std::string name(generateDistinctName(prefix));
|
||||
Current current;
|
||||
// pass the current value of Current as previous context
|
||||
CoroData* newCoro = new CoroData(current, name, callable, mStackSize);
|
||||
CoroData* newCoro = new(std::nothrow) CoroData(current, name, callable, mStackSize);
|
||||
if (newCoro == NULL)
|
||||
{
|
||||
// Out of memory?
|
||||
printActiveCoroutines();
|
||||
LL_ERRS("LLCoros") << "Failed to start coroutine: " << name << " Stacksize: " << mStackSize << " Total coroutines: " << mCoros.size() << LL_ENDL;
|
||||
}
|
||||
// Store it in our pointer map
|
||||
mCoros.insert(name, newCoro);
|
||||
// also set it as current
|
||||
|
|
|
|||
|
|
@ -151,6 +151,9 @@ public:
|
|||
/// for delayed initialization
|
||||
void setStackSize(S32 stacksize);
|
||||
|
||||
/// for delayed initialization
|
||||
void printActiveCoroutines();
|
||||
|
||||
/// get the current coro::self& for those who really really care
|
||||
static coro::self& get_self();
|
||||
|
||||
|
|
@ -223,6 +226,7 @@ private:
|
|||
// function signature down to that point -- and of course through every
|
||||
// other caller of every such function.
|
||||
LLCoros::coro::self* mSelf;
|
||||
F64 mCreationTime; // since epoch
|
||||
};
|
||||
typedef boost::ptr_map<std::string, CoroData> CoroMap;
|
||||
CoroMap mCoros;
|
||||
|
|
|
|||
|
|
@ -95,10 +95,12 @@ HttpService::~HttpService()
|
|||
if (! mThread->timedJoin(250))
|
||||
{
|
||||
// Failed to join, expect problems ahead so do a hard termination.
|
||||
mThread->cancel();
|
||||
LL_WARNS(LOG_CORE) << "Destroying HttpService with running thread. Expect problems." << LL_NEWLINE
|
||||
<< "State: " << S32(sState)
|
||||
<< " Last policy: " << U32(mLastPolicy)
|
||||
<< LL_ENDL;
|
||||
|
||||
LL_WARNS(LOG_CORE) << "Destroying HttpService with running thread. Expect problems."
|
||||
<< LL_ENDL;
|
||||
mThread->cancel();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -193,7 +193,13 @@ volatile U8* LLVBOPool::allocate(U32& name, U32 size, bool for_seed)
|
|||
ret = (U8*) ll_aligned_malloc<64>(size);
|
||||
if (!ret)
|
||||
{
|
||||
LL_ERRS() << "Failed to allocate for LLVBOPool buffer" << LL_ENDL;
|
||||
LL_ERRS() << "Failed to allocate "<< size << " bytes for LLVBOPool buffer " << name <<"." << LL_NEWLINE
|
||||
<< "Free list size: " << mFreeList.size() // this happens if we are out of memory so a solution might be to clear some from freelist
|
||||
<< " Allocated Bytes: " << LLVertexBuffer::sAllocatedBytes
|
||||
<< " Allocated Index Bytes: " << LLVertexBuffer::sAllocatedIndexBytes
|
||||
<< " Pooled Bytes: " << sBytesPooled
|
||||
<< " Pooled Index Bytes: " << sIndexBytesPooled
|
||||
<< LL_ENDL;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -209,7 +209,6 @@ set(viewer_SOURCE_FILES
|
|||
lggbeamscolors.cpp
|
||||
lggcontactsets.cpp
|
||||
lfsimfeaturehandler.cpp
|
||||
llfloaterauction.cpp
|
||||
llfloaterdisplayname.cpp
|
||||
llpanelopenregionsettings.cpp
|
||||
llviewerdisplayname.cpp
|
||||
|
|
@ -317,6 +316,7 @@ set(viewer_SOURCE_FILES
|
|||
llflickrconnect.cpp
|
||||
llfloaterabout.cpp
|
||||
llfloaterbvhpreview.cpp
|
||||
llfloaterauction.cpp
|
||||
llfloaterautoreplacesettings.cpp
|
||||
llfloateravatar.cpp
|
||||
llfloateravatarpicker.cpp
|
||||
|
|
@ -968,7 +968,6 @@ set(viewer_HEADER_FILES
|
|||
lggbeamscolors.h
|
||||
lggcontactsets.h
|
||||
lfsimfeaturehandler.h
|
||||
llfloaterauction.h
|
||||
llfloaterdisplayname.h
|
||||
llviewerdisplayname.h
|
||||
# <FS:Ansariel> [Legacy Bake]
|
||||
|
|
@ -1076,6 +1075,7 @@ set(viewer_HEADER_FILES
|
|||
llflickrconnect.h
|
||||
llfloaterabout.h
|
||||
llfloaterbvhpreview.h
|
||||
llfloaterauction.h
|
||||
llfloaterautoreplacesettings.h
|
||||
llfloateravatar.h
|
||||
llfloateravatarpicker.h
|
||||
|
|
|
|||
|
|
@ -5790,13 +5790,13 @@
|
|||
<key>FeatureManagerHTTPTable</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Base directory for HTTP feature/gpu table fetches</string>
|
||||
<string>Deprecated</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<integer>0</integer>
|
||||
<key>Type</key>
|
||||
<string>String</string>
|
||||
<key>Value</key>
|
||||
<string>http://viewer-settings.firestormviewer.org</string>
|
||||
<string></string>
|
||||
<key>Backup</key>
|
||||
<integer>0</integer>
|
||||
</map>
|
||||
|
|
@ -24703,17 +24703,6 @@ Change of this parameter will affect the layout of buttons in notification toast
|
|||
<key>Value</key>
|
||||
<integer>1</integer>
|
||||
</map>
|
||||
<key>FSUseReadOfflineMsgsCap</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>If enabled, use the ReadOfflineMsgsCap to request offline messages at login</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>Boolean</string>
|
||||
<key>Value</key>
|
||||
<integer>0</integer>
|
||||
</map>
|
||||
<key>FSExperimentalRegionCrossingMovementFix</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
|
|
|
|||
|
|
@ -1202,5 +1202,16 @@
|
|||
<key>Value</key>
|
||||
<integer>0</integer>
|
||||
</map>
|
||||
<key>FSRememberSnapshotPathSessions</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>If enabled, remember the path and filename of snapshots between sessions. Default (true)</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>Boolean</string>
|
||||
<key>Value</key>
|
||||
<integer>1</integer>
|
||||
</map>
|
||||
</map>
|
||||
</llsd>
|
||||
|
|
|
|||
|
|
@ -81,6 +81,7 @@
|
|||
#include "lltrans.h"
|
||||
#include "llversioninfo.h"
|
||||
#include "llviewercontrol.h"
|
||||
#include "llviewermenufile.h"
|
||||
#include "llviewernetwork.h"
|
||||
#include "llviewerregion.h"
|
||||
#include "llviewertexturelist.h"
|
||||
|
|
@ -196,14 +197,14 @@ void ColladaExportFloater::updateUI()
|
|||
|
||||
void ColladaExportFloater::onClickExport()
|
||||
{
|
||||
LLFilePicker& file_picker = LLFilePicker::instance();
|
||||
if (!file_picker.getSaveFile(LLFilePicker::FFSAVE_COLLADA, LLDir::getScrubbedFileName(mObjectName + ".dae")))
|
||||
{
|
||||
LL_INFOS() << "User closed the filepicker, aborting export!" << LL_ENDL;
|
||||
return;
|
||||
}
|
||||
mFilename = file_picker.getFirstFile();
|
||||
|
||||
(new LLFilePickerReplyThread(boost::bind(&ColladaExportFloater::onExportFileSelected, this, _1),
|
||||
LLFilePicker::FFSAVE_COLLADA, LLDir::getScrubbedFileName(mObjectName + ".dae")))->getFile();
|
||||
}
|
||||
|
||||
void ColladaExportFloater::onExportFileSelected(const std::vector<std::string>& filenames)
|
||||
{
|
||||
mFilename = filenames[0];
|
||||
|
||||
if (gSavedSettings.getBOOL("DAEExportTextures"))
|
||||
{
|
||||
saveTextures();
|
||||
|
|
|
|||
|
|
@ -131,6 +131,7 @@ private:
|
|||
void refresh();
|
||||
void dirty();
|
||||
void onClickExport();
|
||||
void onExportFileSelected(const std::vector<std::string>& filenames);
|
||||
void onTextureExportCheck();
|
||||
void onCommitTextureType();
|
||||
void saveTextures();
|
||||
|
|
|
|||
|
|
@ -561,10 +561,24 @@ public:
|
|||
registrar_enable.add("ObjectIcon.Visible", boost::bind(&FSChatHistoryHeader::onObjectIconContextMenuItemVisible, this, _2));
|
||||
|
||||
LLMenuGL* menu = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>("menu_avatar_icon.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());
|
||||
mPopupMenuHandleAvatar = menu->getHandle();
|
||||
if (menu)
|
||||
{
|
||||
mPopupMenuHandleAvatar = menu->getHandle();
|
||||
}
|
||||
else
|
||||
{
|
||||
LL_WARNS() << " Failed to create menu_avatar_icon.xml" << LL_ENDL;
|
||||
}
|
||||
|
||||
menu = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>("menu_object_icon.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());
|
||||
mPopupMenuHandleObject = menu->getHandle();
|
||||
if (menu)
|
||||
{
|
||||
mPopupMenuHandleObject = menu->getHandle();
|
||||
}
|
||||
else
|
||||
{
|
||||
LL_WARNS() << " Failed to create menu_object_icon.xml" << LL_ENDL;
|
||||
}
|
||||
|
||||
setDoubleClickCallback(boost::bind(&FSChatHistoryHeader::showInspector, this));
|
||||
|
||||
|
|
@ -671,6 +685,11 @@ public:
|
|||
}
|
||||
|
||||
mUserNameFont = mNameStyleParams.font();
|
||||
if (!mUserNameTextBox)
|
||||
{
|
||||
mUserNameTextBox = getChild<LLTextBox>("user_name");
|
||||
mTimeBoxTextBox = getChild<LLTextBox>("time_box");
|
||||
}
|
||||
mUserNameTextBox->setReadOnlyColor(mNameStyleParams.readonly_color());
|
||||
mUserNameTextBox->setColor(mNameStyleParams.color());
|
||||
mUserNameTextBox->setFont(mUserNameFont);
|
||||
|
|
|
|||
|
|
@ -55,8 +55,9 @@
|
|||
#include "llvfile.h"
|
||||
#include "llviewercontrol.h"
|
||||
#include "llviewerinventory.h"
|
||||
#include "llviewerpartsource.h"
|
||||
#include "llviewermenufile.h"
|
||||
#include "llviewernetwork.h"
|
||||
#include "llviewerpartsource.h"
|
||||
#include "llviewerregion.h"
|
||||
#include "llviewertexturelist.h"
|
||||
#include "llvovolume.h"
|
||||
|
|
@ -1082,14 +1083,14 @@ void FSFloaterObjectExport::updateUI()
|
|||
|
||||
void FSFloaterObjectExport::onClickExport()
|
||||
{
|
||||
LLFilePicker& file_picker = LLFilePicker::instance();
|
||||
if(!file_picker.getSaveFile(LLFilePicker::FFSAVE_EXPORT, LLDir::getScrubbedFileName(mObjectName + ".oxp")))
|
||||
{
|
||||
LL_INFOS() << "User closed the filepicker, aborting export!" << LL_ENDL;
|
||||
return;
|
||||
}
|
||||
mFilename = file_picker.getFirstFile();
|
||||
|
||||
(new LLFilePickerReplyThread(boost::bind(&FSFloaterObjectExport::onExportFileSelected, this, _1),
|
||||
LLFilePicker::FFSAVE_EXPORT, LLDir::getScrubbedFileName(mObjectName + ".oxp")))->getFile();
|
||||
}
|
||||
|
||||
void FSFloaterObjectExport::onExportFileSelected(const std::vector<std::string>& filenames)
|
||||
{
|
||||
mFilename = filenames[0];
|
||||
|
||||
LLUIString title = getString("title_working");
|
||||
title.setArg("[OBJECT]", mObjectName);
|
||||
setTitle(title);
|
||||
|
|
|
|||
|
|
@ -86,6 +86,7 @@ private:
|
|||
void addSelectedObjects();
|
||||
void populateObjectList();
|
||||
void onClickExport();
|
||||
void onExportFileSelected(const std::vector<std::string>& filenames);
|
||||
void addTexturePreview();
|
||||
S32 getNumExportableTextures();
|
||||
void addObject(const LLViewerObject* prim, const std::string name);
|
||||
|
|
|
|||
|
|
@ -325,15 +325,15 @@ LLSLURL::LLSLURL(const std::string& slurl)
|
|||
// (or its a slurl.com or maps.secondlife.com URL).
|
||||
std::string probe_grid;
|
||||
|
||||
std::string hyper = slurl_uri.hostNameAndPort();
|
||||
std::string hyper_trimmed = LLGridManager::getInstance()->trimHypergrid(hyper);
|
||||
if (hyper != hyper_trimmed)
|
||||
std::string hypergrid = slurl_uri.hostNameAndPort();
|
||||
std::string hyper_trimmed = LLGridManager::getInstance()->trimHypergrid(hypergrid);
|
||||
if (hypergrid != hyper_trimmed)
|
||||
{
|
||||
mHypergrid = true;
|
||||
path_array.insert(0,hyper);
|
||||
path_array.insert(0, hypergrid);
|
||||
}
|
||||
|
||||
probe_grid = LLGridManager::getInstance()->getGridByProbing(hyper);
|
||||
probe_grid = LLGridManager::getInstance()->getGridByProbing(hypergrid);
|
||||
if (probe_grid.empty())
|
||||
{
|
||||
probe_grid = LLGridManager::getInstance()->getGridByProbing(slurl_uri.hostName());
|
||||
|
|
@ -479,8 +479,8 @@ LLSLURL::LLSLURL(const std::string& slurl)
|
|||
}
|
||||
|
||||
// Create a slurl for the middle of the region
|
||||
LLSLURL::LLSLURL(const std::string& grid, const std::string& region, bool hyper)
|
||||
: mHypergrid(hyper)
|
||||
LLSLURL::LLSLURL(const std::string& grid, const std::string& region, bool hypergrid)
|
||||
: mHypergrid(hypergrid)
|
||||
{
|
||||
mGrid = grid;
|
||||
mRegion = region;
|
||||
|
|
@ -490,8 +490,8 @@ LLSLURL::LLSLURL(const std::string& grid, const std::string& region, bool hyper)
|
|||
|
||||
// create a slurl given the position. The position will be modded with the region
|
||||
// width handling global positions as well
|
||||
LLSLURL::LLSLURL(const std::string& grid, const std::string& region, const LLVector3& position, bool hyper)
|
||||
: mHypergrid(hyper)
|
||||
LLSLURL::LLSLURL(const std::string& grid, const std::string& region, const LLVector3& position, bool hypergrid)
|
||||
: mHypergrid(hypergrid)
|
||||
{
|
||||
mGrid = grid;
|
||||
mRegion = region;
|
||||
|
|
@ -516,15 +516,15 @@ LLSLURL::LLSLURL(const std::string& grid, const std::string& region, const LLVec
|
|||
}
|
||||
|
||||
// create a simstring
|
||||
LLSLURL::LLSLURL(const std::string& region, const LLVector3& position, bool hyper)
|
||||
: mHypergrid(hyper)
|
||||
LLSLURL::LLSLURL(const std::string& region, const LLVector3& position, bool hypergrid)
|
||||
: mHypergrid(hypergrid)
|
||||
{
|
||||
*this = LLSLURL(LLGridManager::getInstance()->getGrid(), region, position);
|
||||
}
|
||||
|
||||
// create a slurl from a global position
|
||||
LLSLURL::LLSLURL(const std::string& grid, const std::string& region, const LLVector3d& global_position, bool hyper)
|
||||
: mHypergrid(hyper)
|
||||
LLSLURL::LLSLURL(const std::string& grid, const std::string& region, const LLVector3d& global_position, bool hypergrid)
|
||||
: mHypergrid(hypergrid)
|
||||
{
|
||||
// <FS:CR> Aurora-sim var region teleports
|
||||
//*this = LLSLURL(grid,
|
||||
|
|
@ -540,8 +540,8 @@ LLSLURL::LLSLURL(const std::string& grid, const std::string& region, const LLVec
|
|||
}
|
||||
|
||||
// create a slurl from a global position
|
||||
LLSLURL::LLSLURL(const std::string& region, const LLVector3d& global_position, bool hyper)
|
||||
: mHypergrid(hyper)
|
||||
LLSLURL::LLSLURL(const std::string& region, const LLVector3d& global_position, bool hypergrid)
|
||||
: mHypergrid(hypergrid)
|
||||
{
|
||||
*this = LLSLURL(LLGridManager::getInstance()->getGrid(), region, global_position);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -70,11 +70,11 @@ public:
|
|||
|
||||
LLSLURL(): mType(INVALID) { }
|
||||
LLSLURL(const std::string& slurl);
|
||||
LLSLURL(const std::string& grid, const std::string& region, bool hyper = false);
|
||||
LLSLURL(const std::string& region, const LLVector3& position, bool hyper = false);
|
||||
LLSLURL(const std::string& grid, const std::string& region, const LLVector3& position, bool hyper = false);
|
||||
LLSLURL(const std::string& grid, const std::string& region, const LLVector3d& global_position, bool hyper = false);
|
||||
LLSLURL(const std::string& region, const LLVector3d& global_position, bool hyper = false);
|
||||
LLSLURL(const std::string& grid, const std::string& region, bool hypergrid = false);
|
||||
LLSLURL(const std::string& region, const LLVector3& position, bool hypergrid = false);
|
||||
LLSLURL(const std::string& grid, const std::string& region, const LLVector3& position, bool hypergrid = false);
|
||||
LLSLURL(const std::string& grid, const std::string& region, const LLVector3d& global_position, bool hypergrid = false);
|
||||
LLSLURL(const std::string& region, const LLVector3d& global_position, bool hypergrid = false);
|
||||
LLSLURL(const std::string& command, const LLUUID&id, const std::string& verb);
|
||||
LLSLURL(const LLSD& path_array, bool from_app);
|
||||
|
||||
|
|
|
|||
|
|
@ -83,6 +83,8 @@ const F32 AVATAR_ZOOM_MIN_Y_FACTOR = 0.7f;
|
|||
const F32 AVATAR_ZOOM_MIN_Z_FACTOR = 1.15f;
|
||||
|
||||
const F32 MAX_CAMERA_DISTANCE_FROM_AGENT = 50.f;
|
||||
const F32 MAX_CAMERA_DISTANCE_FROM_OBJECT = 496.f;
|
||||
const F32 CAMERA_FUDGE_FROM_OBJECT = 16.f;
|
||||
|
||||
const F32 MAX_CAMERA_SMOOTH_DISTANCE = 50.0f;
|
||||
|
||||
|
|
@ -767,10 +769,7 @@ F32 LLAgentCamera::getCameraZoomFraction()
|
|||
else
|
||||
{
|
||||
F32 min_zoom;
|
||||
const F32 DIST_FUDGE = 16.f; // meters
|
||||
F32 max_zoom = llmin(mDrawDistance - DIST_FUDGE,
|
||||
LLWorld::getInstance()->getRegionWidthInMeters() - DIST_FUDGE,
|
||||
MAX_CAMERA_DISTANCE_FROM_AGENT);
|
||||
F32 max_zoom = getCameraMaxZoomDistance();
|
||||
|
||||
F32 distance = (F32)mCameraFocusOffsetTarget.magVec();
|
||||
if (mFocusObject.notNull())
|
||||
|
|
@ -816,23 +815,17 @@ void LLAgentCamera::setCameraZoomFraction(F32 fraction)
|
|||
else
|
||||
{
|
||||
F32 min_zoom = LAND_MIN_ZOOM;
|
||||
const F32 DIST_FUDGE = 16.f; // meters
|
||||
F32 max_zoom = llmin(mDrawDistance - DIST_FUDGE,
|
||||
LLWorld::getInstance()->getRegionWidthInMeters() - DIST_FUDGE,
|
||||
MAX_CAMERA_DISTANCE_FROM_AGENT);
|
||||
F32 max_zoom = getCameraMaxZoomDistance();
|
||||
|
||||
if (mFocusObject.notNull())
|
||||
{
|
||||
if (mFocusObject.notNull())
|
||||
if (mFocusObject->isAvatar())
|
||||
{
|
||||
if (mFocusObject->isAvatar())
|
||||
{
|
||||
min_zoom = AVATAR_MIN_ZOOM;
|
||||
}
|
||||
else
|
||||
{
|
||||
min_zoom = OBJECT_MIN_ZOOM;
|
||||
}
|
||||
min_zoom = AVATAR_MIN_ZOOM;
|
||||
}
|
||||
else
|
||||
{
|
||||
min_zoom = OBJECT_MIN_ZOOM;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -949,12 +942,7 @@ void LLAgentCamera::cameraZoomIn(const F32 fraction)
|
|||
new_distance = llmax(new_distance, min_zoom);
|
||||
}
|
||||
|
||||
// Don't zoom too far back
|
||||
const F32 DIST_FUDGE = 16.f; // meters
|
||||
// Freeing the camera movement some more... ok, a lot -KC
|
||||
static LLCachedControl<bool> disable_constraints(gSavedSettings,"DisableCameraConstraints");
|
||||
F32 max_distance = disable_constraints ? INT_MAX : llmin(mDrawDistance - DIST_FUDGE,
|
||||
LLWorld::getInstance()->getRegionWidthInMeters() - DIST_FUDGE );
|
||||
F32 max_distance = getCameraMaxZoomDistance();
|
||||
|
||||
max_distance = llmin(max_distance, current_distance * 4.f); //Scaled max relative to current distance. MAINT-3154
|
||||
|
||||
|
|
@ -1031,17 +1019,12 @@ void LLAgentCamera::cameraOrbitIn(const F32 meters)
|
|||
new_distance = llmax(new_distance, min_zoom);
|
||||
}
|
||||
|
||||
// Don't zoom too far back
|
||||
const F32 DIST_FUDGE = 16.f; // meters
|
||||
// Freeing the camera movement some more... ok, a lot -KC
|
||||
static LLCachedControl<bool> disable_constraints(gSavedSettings,"DisableCameraConstraints");
|
||||
F32 max_distance = disable_constraints ? INT_MAX : llmin(mDrawDistance - DIST_FUDGE,
|
||||
LLWorld::getInstance()->getRegionWidthInMeters() - DIST_FUDGE );
|
||||
F32 max_distance = getCameraMaxZoomDistance();
|
||||
|
||||
if (new_distance > max_distance)
|
||||
{
|
||||
// Unless camera is unlocked
|
||||
if (!disable_constraints)
|
||||
if (!gSavedSettings.getBOOL("DisableCameraConstraints"))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
|
@ -2107,6 +2090,15 @@ LLVector3 LLAgentCamera::getCameraOffsetInitial()
|
|||
return convert_from_llsd<LLVector3>(mCameraOffsetInitial[mCameraPreset]->get(), TYPE_VEC3, "");
|
||||
}
|
||||
|
||||
F32 LLAgentCamera::getCameraMaxZoomDistance()
|
||||
{
|
||||
// Ignore "DisableCameraConstraints", we don't want to be out of draw range when we focus onto objects or avatars
|
||||
// Freeing the camera movement some more... ok, a lot -KC
|
||||
static LLCachedControl<bool> disable_constraints(gSavedSettings,"DisableCameraConstraints");
|
||||
return disable_constraints ? INT_MAX : llmin(MAX_CAMERA_DISTANCE_FROM_OBJECT,
|
||||
mDrawDistance - 1, // convenience, don't hit draw limit when focusing on something
|
||||
LLWorld::getInstance()->getRegionWidthInMeters() - CAMERA_FUDGE_FROM_OBJECT);
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// handleScrollWheel()
|
||||
|
|
|
|||
|
|
@ -117,6 +117,8 @@ public:
|
|||
private:
|
||||
/** Determines default camera offset depending on the current camera preset */
|
||||
LLVector3 getCameraOffsetInitial();
|
||||
/** Determines maximum camera distance from target for mouselook, opposite to LAND_MIN_ZOOM */
|
||||
F32 getCameraMaxZoomDistance();
|
||||
|
||||
/** Camera preset in Third Person Mode */
|
||||
ECameraPreset mCameraPreset;
|
||||
|
|
|
|||
|
|
@ -42,6 +42,7 @@
|
|||
#include "llagentlanguage.h"
|
||||
#include "llagentui.h"
|
||||
#include "llagentwearables.h"
|
||||
#include "lldirpicker.h"
|
||||
#include "llfloaterimcontainer.h"
|
||||
#include "llimprocessing.h"
|
||||
#include "llwindow.h"
|
||||
|
|
@ -1275,6 +1276,8 @@ bool LLAppViewer::init()
|
|||
}
|
||||
}
|
||||
|
||||
// don't nag developers who need to run the executable directly
|
||||
#if LL_RELEASE_FOR_DOWNLOAD
|
||||
// <FS:Ansariel> Disable VMP
|
||||
// MAINT-8305: If we're processing a SLURL, skip the launcher check.
|
||||
if (gSavedSettings.getString("CmdLineLoginLocation").empty() && !beingDebugged())
|
||||
|
|
@ -1293,6 +1296,7 @@ bool LLAppViewer::init()
|
|||
// }
|
||||
//}
|
||||
// </FS:Ansariel>
|
||||
#endif
|
||||
|
||||
#if LL_WINDOWS
|
||||
if (gGLManager.mGLVersion < LLFeatureManager::getInstance()->getExpectedGLVersion())
|
||||
|
|
@ -1862,12 +1866,10 @@ bool LLAppViewer::doFrame()
|
|||
saveFinalSnapshot();
|
||||
}
|
||||
|
||||
// <FS:Ansariel> Cut down wait on logout; Need to terminate voice here because we need gServicePump!
|
||||
if (LLVoiceClient::instanceExists())
|
||||
{
|
||||
LLVoiceClient::getInstance()->terminate();
|
||||
}
|
||||
// </FS:Ansariel>
|
||||
|
||||
delete gServicePump;
|
||||
|
||||
|
|
@ -1972,13 +1974,6 @@ bool LLAppViewer::cleanup()
|
|||
// Give any remaining SLPlugin instances a chance to exit cleanly.
|
||||
LLPluginProcessParent::shutdown();
|
||||
|
||||
// <FS:Ansariel> Cut down wait on logout; Need to terminate voice earlier because we need gServicePump!
|
||||
//if (LLVoiceClient::instanceExists())
|
||||
//{
|
||||
// LLVoiceClient::getInstance()->terminate();
|
||||
//}
|
||||
// </FS:Ansariel>
|
||||
|
||||
disconnectViewer();
|
||||
|
||||
LL_INFOS() << "Viewer disconnected" << LL_ENDL;
|
||||
|
|
@ -2143,6 +2138,8 @@ bool LLAppViewer::cleanup()
|
|||
// (Deleted observers should have already removed themselves)
|
||||
gInventory.cleanupInventory();
|
||||
|
||||
LLCoros::getInstance()->printActiveCoroutines();
|
||||
|
||||
LL_INFOS() << "Cleaning up Selections" << LL_ENDL;
|
||||
|
||||
// Clean up selection managers after UI is destroyed, as UI may be observing them.
|
||||
|
|
@ -2368,6 +2365,7 @@ bool LLAppViewer::cleanup()
|
|||
mAppCoreHttp.cleanup();
|
||||
|
||||
SUBSYSTEM_CLEANUP(LLFilePickerThread);
|
||||
SUBSYSTEM_CLEANUP(LLDirPickerThread);
|
||||
|
||||
//MUST happen AFTER SUBSYSTEM_CLEANUP(LLCurl)
|
||||
delete sTextureCache;
|
||||
|
|
@ -2538,6 +2536,7 @@ bool LLAppViewer::initThreads()
|
|||
gMeshRepo.init();
|
||||
|
||||
LLFilePickerThread::initClass();
|
||||
LLDirPickerThread::initClass();
|
||||
|
||||
// *FIX: no error handling here!
|
||||
return true;
|
||||
|
|
@ -5439,7 +5438,7 @@ void LLAppViewer::idle()
|
|||
LLSmoothInterpolation::updateInterpolants();
|
||||
LLMortician::updateClass();
|
||||
LLFilePickerThread::clearDead(); //calls LLFilePickerThread::notify()
|
||||
|
||||
LLDirPickerThread::clearDead();
|
||||
F32 dt_raw = idle_timer.getElapsedTimeAndResetF32();
|
||||
|
||||
// Cap out-of-control frame times
|
||||
|
|
|
|||
|
|
@ -541,10 +541,24 @@ public:
|
|||
registrar_enable.add("ObjectIcon.Visible", boost::bind(&LLChatHistoryHeader::onObjectIconContextMenuItemVisible, this, _2));
|
||||
|
||||
LLMenuGL* menu = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>("menu_avatar_icon.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());
|
||||
mPopupMenuHandleAvatar = menu->getHandle();
|
||||
if (menu)
|
||||
{
|
||||
mPopupMenuHandleAvatar = menu->getHandle();
|
||||
}
|
||||
else
|
||||
{
|
||||
LL_WARNS() << " Failed to create menu_avatar_icon.xml" << LL_ENDL;
|
||||
}
|
||||
|
||||
menu = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>("menu_object_icon.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());
|
||||
mPopupMenuHandleObject = menu->getHandle();
|
||||
if (menu)
|
||||
{
|
||||
mPopupMenuHandleObject = menu->getHandle();
|
||||
}
|
||||
else
|
||||
{
|
||||
LL_WARNS() << " Failed to create menu_object_icon.xml" << LL_ENDL;
|
||||
}
|
||||
|
||||
setDoubleClickCallback(boost::bind(&LLChatHistoryHeader::showInspector, this));
|
||||
|
||||
|
|
@ -636,7 +650,12 @@ public:
|
|||
}
|
||||
|
||||
mUserNameFont = style_params.font();
|
||||
LLTextBox* user_name = getChild<LLTextBox>("user_name");
|
||||
if (!mUserNameTextBox)
|
||||
{
|
||||
mUserNameTextBox = getChild<LLTextBox>("user_name");
|
||||
mTimeBoxTextBox = getChild<LLTextBox>("time_box");
|
||||
}
|
||||
LLTextBox* user_name = mUserNameTextBox;
|
||||
user_name->setReadOnlyColor(style_params.readonly_color());
|
||||
user_name->setColor(style_params.color());
|
||||
|
||||
|
|
|
|||
|
|
@ -77,6 +77,14 @@ LLDirPicker::LLDirPicker() :
|
|||
mFileName(NULL),
|
||||
mLocked(false)
|
||||
{
|
||||
bi.hwndOwner = NULL;
|
||||
bi.pidlRoot = NULL;
|
||||
bi.pszDisplayName = NULL;
|
||||
bi.lpszTitle = NULL;
|
||||
bi.ulFlags = BIF_USENEWUI;
|
||||
bi.lpfn = NULL;
|
||||
bi.lParam = NULL;
|
||||
bi.iImage = 0;
|
||||
}
|
||||
|
||||
LLDirPicker::~LLDirPicker()
|
||||
|
|
@ -84,7 +92,7 @@ LLDirPicker::~LLDirPicker()
|
|||
// nothing
|
||||
}
|
||||
|
||||
BOOL LLDirPicker::getDir(std::string* filename)
|
||||
BOOL LLDirPicker::getDir(std::string* filename, bool blocking)
|
||||
{
|
||||
if( mLocked )
|
||||
{
|
||||
|
|
@ -99,39 +107,39 @@ BOOL LLDirPicker::getDir(std::string* filename)
|
|||
|
||||
BOOL success = FALSE;
|
||||
|
||||
// Modal, so pause agent
|
||||
send_agent_pause();
|
||||
|
||||
if (blocking)
|
||||
{
|
||||
// Modal, so pause agent
|
||||
send_agent_pause();
|
||||
}
|
||||
|
||||
BROWSEINFO bi;
|
||||
memset(&bi, 0, sizeof(bi));
|
||||
bi.hwndOwner = (HWND)gViewerWindow->getPlatformWindow();
|
||||
|
||||
bi.ulFlags = BIF_USENEWUI;
|
||||
bi.hwndOwner = (HWND)gViewerWindow->getPlatformWindow();
|
||||
bi.lpszTitle = NULL;
|
||||
::OleInitialize(NULL);
|
||||
LPITEMIDLIST pIDL = ::SHBrowseForFolder(&bi);
|
||||
|
||||
::OleInitialize(NULL);
|
||||
if(pIDL != NULL)
|
||||
{
|
||||
WCHAR buffer[_MAX_PATH] = {'\0'};
|
||||
|
||||
LPITEMIDLIST pIDL = ::SHBrowseForFolder(&bi);
|
||||
if(::SHGetPathFromIDList(pIDL, buffer) != 0)
|
||||
{
|
||||
// Set the string value.
|
||||
|
||||
if(pIDL != NULL)
|
||||
{
|
||||
WCHAR buffer[_MAX_PATH] = {'\0'};
|
||||
mDir = utf16str_to_utf8str(llutf16string(buffer));
|
||||
success = TRUE;
|
||||
}
|
||||
// free the item id list
|
||||
CoTaskMemFree(pIDL);
|
||||
}
|
||||
|
||||
if(::SHGetPathFromIDList(pIDL, buffer) != 0)
|
||||
{
|
||||
// Set the string value.
|
||||
::OleUninitialize();
|
||||
|
||||
mDir = utf16str_to_utf8str(llutf16string(buffer));
|
||||
success = TRUE;
|
||||
}
|
||||
|
||||
// free the item id list
|
||||
CoTaskMemFree(pIDL);
|
||||
}
|
||||
|
||||
::OleUninitialize();
|
||||
|
||||
send_agent_resume();
|
||||
if (blocking)
|
||||
{
|
||||
send_agent_resume();
|
||||
}
|
||||
|
||||
// Account for the fact that the app has been stalled.
|
||||
LLFrameTimer::updateFrameTime();
|
||||
|
|
@ -167,7 +175,7 @@ void LLDirPicker::reset()
|
|||
|
||||
|
||||
//static
|
||||
BOOL LLDirPicker::getDir(std::string* filename)
|
||||
BOOL LLDirPicker::getDir(std::string* filename, bool blocking)
|
||||
{
|
||||
LLFilePicker::ELoadFilter filter=LLFilePicker::FFLOAD_DIRECTORY;
|
||||
|
||||
|
|
@ -201,7 +209,7 @@ void LLDirPicker::reset()
|
|||
mFilePicker->reset();
|
||||
}
|
||||
|
||||
BOOL LLDirPicker::getDir(std::string* filename)
|
||||
BOOL LLDirPicker::getDir(std::string* filename, bool blocking)
|
||||
{
|
||||
reset();
|
||||
|
||||
|
|
@ -256,7 +264,7 @@ void LLDirPicker::reset()
|
|||
{
|
||||
}
|
||||
|
||||
BOOL LLDirPicker::getDir(std::string* filename)
|
||||
BOOL LLDirPicker::getDir(std::string* filename, bool blocking)
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
|
|
@ -267,3 +275,94 @@ std::string LLDirPicker::getDirName()
|
|||
}
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
LLMutex* LLDirPickerThread::sMutex = NULL;
|
||||
std::queue<LLDirPickerThread*> LLDirPickerThread::sDeadQ;
|
||||
|
||||
void LLDirPickerThread::getFile()
|
||||
{
|
||||
#if LL_WINDOWS
|
||||
start();
|
||||
#else
|
||||
run();
|
||||
#endif
|
||||
}
|
||||
|
||||
//virtual
|
||||
void LLDirPickerThread::run()
|
||||
{
|
||||
#if LL_WINDOWS
|
||||
bool blocking = false;
|
||||
#else
|
||||
bool blocking = true; // modal
|
||||
#endif
|
||||
|
||||
LLDirPicker picker;
|
||||
|
||||
if (picker.getDir(&mProposedName, blocking))
|
||||
{
|
||||
mResponses.push_back(picker.getDirName());
|
||||
}
|
||||
|
||||
{
|
||||
LLMutexLock lock(sMutex);
|
||||
sDeadQ.push(this);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
//static
|
||||
void LLDirPickerThread::initClass()
|
||||
{
|
||||
sMutex = new LLMutex();
|
||||
}
|
||||
|
||||
//static
|
||||
void LLDirPickerThread::cleanupClass()
|
||||
{
|
||||
clearDead();
|
||||
|
||||
delete sMutex;
|
||||
sMutex = NULL;
|
||||
}
|
||||
|
||||
//static
|
||||
void LLDirPickerThread::clearDead()
|
||||
{
|
||||
if (!sDeadQ.empty())
|
||||
{
|
||||
LLMutexLock lock(sMutex);
|
||||
while (!sDeadQ.empty())
|
||||
{
|
||||
LLDirPickerThread* thread = sDeadQ.front();
|
||||
thread->notify(thread->mResponses);
|
||||
delete thread;
|
||||
sDeadQ.pop();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
LLDirPickerThread::LLDirPickerThread(const dir_picked_signal_t::slot_type& cb, const std::string &proposed_name)
|
||||
: LLThread("dir picker"),
|
||||
mFilePickedSignal(NULL)
|
||||
{
|
||||
mFilePickedSignal = new dir_picked_signal_t();
|
||||
mFilePickedSignal->connect(cb);
|
||||
}
|
||||
|
||||
LLDirPickerThread::~LLDirPickerThread()
|
||||
{
|
||||
delete mFilePickedSignal;
|
||||
}
|
||||
|
||||
void LLDirPickerThread::notify(const std::vector<std::string>& filenames)
|
||||
{
|
||||
if (!filenames.empty())
|
||||
{
|
||||
if (mFilePickedSignal)
|
||||
{
|
||||
(*mFilePickedSignal)(filenames, mProposedName);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -33,6 +33,13 @@
|
|||
|
||||
#include "stdtypes.h"
|
||||
|
||||
#include "llthread.h"
|
||||
#include <queue>
|
||||
|
||||
#if LL_WINDOWS
|
||||
#include <shlobj.h>
|
||||
#endif
|
||||
|
||||
#if LL_DARWIN
|
||||
|
||||
// AssertMacros.h does bad things.
|
||||
|
|
@ -53,7 +60,7 @@ public:
|
|||
// calling this before main() is undefined
|
||||
static LLDirPicker& instance( void ) { return sInstance; }
|
||||
|
||||
BOOL getDir(std::string* filename);
|
||||
BOOL getDir(std::string* filename, bool blocking = true);
|
||||
std::string getDirName();
|
||||
|
||||
// clear any lists of buffers or whatever, and make sure the dir
|
||||
|
|
@ -76,11 +83,15 @@ private:
|
|||
LLFilePicker *mFilePicker;
|
||||
#endif
|
||||
|
||||
|
||||
std::string* mFileName;
|
||||
std::string mDir;
|
||||
bool mLocked;
|
||||
|
||||
static LLDirPicker sInstance;
|
||||
#if LL_WINDOWS
|
||||
BROWSEINFO bi;
|
||||
#endif
|
||||
|
||||
public:
|
||||
// don't call these directly please.
|
||||
|
|
@ -88,4 +99,33 @@ public:
|
|||
~LLDirPicker();
|
||||
};
|
||||
|
||||
class LLDirPickerThread : public LLThread
|
||||
{
|
||||
public:
|
||||
|
||||
static std::queue<LLDirPickerThread*> sDeadQ;
|
||||
static LLMutex* sMutex;
|
||||
|
||||
static void initClass();
|
||||
static void cleanupClass();
|
||||
static void clearDead();
|
||||
|
||||
std::vector<std::string> mResponses;
|
||||
std::string mProposedName;
|
||||
|
||||
typedef boost::signals2::signal<void(const std::vector<std::string>& filenames, std::string proposed_name)> dir_picked_signal_t;
|
||||
|
||||
LLDirPickerThread(const dir_picked_signal_t::slot_type& cb, const std::string &proposed_name);
|
||||
~LLDirPickerThread();
|
||||
|
||||
void getFile();
|
||||
|
||||
virtual void run();
|
||||
|
||||
virtual void notify(const std::vector<std::string>& filenames);
|
||||
|
||||
private:
|
||||
dir_picked_signal_t* mFilePickedSignal;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -333,6 +333,9 @@ void LLDrawPoolAlpha::render(S32 pass)
|
|||
gGL.diffuseColor4f(0, 0, 1, 1);
|
||||
pushBatches(LLRenderPass::PASS_MATERIAL_ALPHA_MASK, LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_TEXCOORD0, FALSE);
|
||||
|
||||
gGL.diffuseColor4f(0, 1, 0, 1);
|
||||
pushBatches(LLRenderPass::PASS_INVISIBLE, LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_TEXCOORD0, FALSE);
|
||||
|
||||
if(shaders)
|
||||
{
|
||||
gHighlightProgram.unbind();
|
||||
|
|
|
|||
|
|
@ -67,13 +67,10 @@
|
|||
|
||||
#if LL_DARWIN
|
||||
const char FEATURE_TABLE_FILENAME[] = "featuretable_mac.txt";
|
||||
const char FEATURE_TABLE_VER_FILENAME[] = "featuretable_mac.%s.txt";
|
||||
#elif LL_LINUX
|
||||
const char FEATURE_TABLE_FILENAME[] = "featuretable_linux.txt";
|
||||
const char FEATURE_TABLE_VER_FILENAME[] = "featuretable_linux.%s.txt";
|
||||
#else
|
||||
const char FEATURE_TABLE_FILENAME[] = "featuretable.txt";
|
||||
const char FEATURE_TABLE_VER_FILENAME[] = "featuretable.%s.txt";
|
||||
#endif
|
||||
|
||||
#if 0 // consuming code in #if 0 below
|
||||
|
|
@ -278,33 +275,11 @@ bool LLFeatureManager::loadFeatureTables()
|
|||
app_path += gDirUtilp->getDirDelimiter();
|
||||
|
||||
std::string filename;
|
||||
std::string http_filename;
|
||||
filename = FEATURE_TABLE_FILENAME;
|
||||
http_filename = llformat(FEATURE_TABLE_VER_FILENAME, LLVersionInfo::getShortVersion().c_str()); // <FS:Techwolf Lupindo> use getShortVersion instead of getVersion.
|
||||
|
||||
app_path += filename;
|
||||
|
||||
// second table is downloaded with HTTP - note that this will only be used on the run _after_ it is downloaded
|
||||
std::string http_path = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, http_filename);
|
||||
|
||||
// use HTTP table if it exists
|
||||
std::string path;
|
||||
bool parse_ok = false;
|
||||
if (gDirUtilp->fileExists(http_path))
|
||||
{
|
||||
parse_ok = parseFeatureTable(http_path);
|
||||
if (!parse_ok)
|
||||
{
|
||||
// the HTTP table failed to parse, so delete it
|
||||
LLFile::remove(http_path);
|
||||
LL_WARNS("RenderInit") << "Removed invalid feature table '" << http_path << "'" << LL_ENDL;
|
||||
}
|
||||
}
|
||||
|
||||
if (!parse_ok)
|
||||
{
|
||||
parse_ok = parseFeatureTable(app_path);
|
||||
}
|
||||
bool parse_ok = parseFeatureTable(app_path);
|
||||
|
||||
return parse_ok;
|
||||
}
|
||||
|
|
@ -412,16 +387,22 @@ bool LLFeatureManager::loadGPUClass()
|
|||
if (!gSavedSettings.getBOOL("SkipBenchmark"))
|
||||
{
|
||||
//get memory bandwidth from benchmark
|
||||
|
||||
// <FS:ND> Allow to skip gpu_benchmark with -noprobe.
|
||||
// This can make sense for some Intel GPUs which can take 15+ Minutes or crash during gpu_benchmark
|
||||
|
||||
// F32 gbps = gpu_benchmark();
|
||||
F32 gbps = -1.0f;
|
||||
if( !gSavedSettings.getBOOL( "NoHardwareProbe" ) )
|
||||
gbps = gpu_benchmark();
|
||||
|
||||
// </FS:ND>
|
||||
F32 gbps;
|
||||
try
|
||||
{
|
||||
// <FS:ND> Allow to skip gpu_benchmark with -noprobe.
|
||||
// This can make sense for some Intel GPUs which can take 15+ Minutes or crash during gpu_benchmark
|
||||
// gbps = gpu_benchmark();
|
||||
gbps = -1.0f;
|
||||
if( !gSavedSettings.getBOOL( "NoHardwareProbe" ) )
|
||||
gbps = gpu_benchmark();
|
||||
// </FS:ND>
|
||||
}
|
||||
catch (const std::exception& e)
|
||||
{
|
||||
gbps = -1.f;
|
||||
LL_WARNS("RenderInit") << "GPU benchmark failed: " << e.what() << LL_ENDL;
|
||||
}
|
||||
|
||||
if (gbps < 0.f)
|
||||
{ //couldn't bench, use GLVersion
|
||||
|
|
@ -500,88 +481,6 @@ bool LLFeatureManager::loadGPUClass()
|
|||
return true; // indicates that a gpu value was established
|
||||
}
|
||||
|
||||
void LLFeatureManager::fetchFeatureTableCoro(std::string tableName)
|
||||
{
|
||||
LLCore::HttpRequest::policy_t httpPolicy(LLCore::HttpRequest::DEFAULT_POLICY_ID);
|
||||
LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t
|
||||
httpAdapter(new LLCoreHttpUtil::HttpCoroutineAdapter("FeatureManagerHTTPTable", httpPolicy));
|
||||
LLCore::HttpRequest::ptr_t httpRequest(new LLCore::HttpRequest);
|
||||
|
||||
const std::string base = gSavedSettings.getString("FeatureManagerHTTPTable");
|
||||
|
||||
// <FS:Ansariel> Re-enable feature table download
|
||||
//#if LL_WINDOWS
|
||||
// std::string os_string = LLOSInfo::instance().getOSStringSimple();
|
||||
// std::string filename;
|
||||
//
|
||||
// if (os_string.find("Microsoft Windows XP") == 0)
|
||||
// {
|
||||
// filename = llformat(tableName.c_str(), "_xp", LLVersionInfo::getVersion().c_str());
|
||||
// }
|
||||
// else
|
||||
// {
|
||||
// filename = llformat(tableName.c_str(), "", LLVersionInfo::getVersion().c_str());
|
||||
// }
|
||||
//#else
|
||||
// const std::string filename = llformat(tableName.c_str(), LLVersionInfo::getVersion().c_str());
|
||||
//#endif
|
||||
const std::string filename = llformat(tableName.c_str(), LLVersionInfo::getShortVersion().c_str());
|
||||
// </FS:Ansariel>
|
||||
|
||||
std::string url = base + "/" + filename;
|
||||
// testing url below
|
||||
//url = "http://viewer-settings.secondlife.com/featuretable.2.1.1.208406.txt";
|
||||
const std::string path = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, filename);
|
||||
|
||||
|
||||
// <FS:Ansariel> Re-enable feature table download
|
||||
//LL_INFOS() << "LLFeatureManager fetching " << url << " into " << path << LL_ENDL;
|
||||
|
||||
//LLSD result = httpAdapter->getRawAndSuspend(httpRequest, url);
|
||||
time_t last_modified = 0;
|
||||
llstat stat_data;
|
||||
if(!LLFile::stat(path, &stat_data))
|
||||
{
|
||||
last_modified = stat_data.st_mtime;
|
||||
}
|
||||
LLCore::HttpOptions::ptr_t httpOpts(new LLCore::HttpOptions);
|
||||
httpOpts->setWantHeaders(true);
|
||||
httpOpts->setLastModified((long)last_modified);
|
||||
LL_INFOS() << "LLFeatureManager fetching " << url << " with last modifed of " << last_modified << " into " << path << LL_ENDL;
|
||||
LLSD result = httpAdapter->getRawAndSuspend(httpRequest, url, httpOpts);
|
||||
// </FS:Ansariel>
|
||||
|
||||
LLSD httpResults = result[LLCoreHttpUtil::HttpCoroutineAdapter::HTTP_RESULTS];
|
||||
LLCore::HttpStatus status = LLCoreHttpUtil::HttpCoroutineAdapter::getStatusFromLLSD(httpResults);
|
||||
|
||||
// <FS:Ansariel> Re-enable feature table download
|
||||
//if (status)
|
||||
if (status == LLCore::HttpStatus(HTTP_OK))
|
||||
// </FS:Ansariel>
|
||||
{ // There was a newer feature table on the server. We've grabbed it and now should write it.
|
||||
// write to file
|
||||
const LLSD::Binary &raw = result[LLCoreHttpUtil::HttpCoroutineAdapter::HTTP_RESULTS_RAW].asBinary();
|
||||
|
||||
LL_INFOS() << "writing feature table to " << path << LL_ENDL;
|
||||
|
||||
S32 size = raw.size();
|
||||
if (size > 0)
|
||||
{
|
||||
// write to file
|
||||
LLAPRFile out(path, LL_APR_WB);
|
||||
out.write(raw.data(), size);
|
||||
out.close();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// fetch table(s) from a website (S3)
|
||||
void LLFeatureManager::fetchHTTPTables()
|
||||
{
|
||||
LLCoros::instance().launch("LLFeatureManager::fetchFeatureTableCoro",
|
||||
boost::bind(&LLFeatureManager::fetchFeatureTableCoro, this, FEATURE_TABLE_VER_FILENAME));
|
||||
}
|
||||
|
||||
void LLFeatureManager::cleanupFeatureTables()
|
||||
{
|
||||
std::for_each(mMaskList.begin(), mMaskList.end(), DeletePairedPointer());
|
||||
|
|
|
|||
|
|
@ -145,9 +145,6 @@ public:
|
|||
// in the skip list if true
|
||||
void applyFeatures(bool skipFeatures);
|
||||
|
||||
// load the dynamic GPU/feature table from a website
|
||||
void fetchHTTPTables();
|
||||
|
||||
LLSD getRecommendedSettingsMap();
|
||||
|
||||
protected:
|
||||
|
|
@ -158,8 +155,6 @@ protected:
|
|||
|
||||
void initBaseMask();
|
||||
|
||||
void fetchFeatureTableCoro(std::string name);
|
||||
|
||||
std::map<std::string, LLFeatureList *> mMaskList;
|
||||
std::set<std::string> mSkippedFeatures;
|
||||
BOOL mInited;
|
||||
|
|
|
|||
|
|
@ -45,6 +45,7 @@
|
|||
#include "llcombobox.h"
|
||||
#include "llfloaterreg.h"
|
||||
#include "llfloateravatarpicker.h"
|
||||
#include "llfloaterauction.h"
|
||||
#include "llfloatergroups.h"
|
||||
#include "llfloaterscriptlimits.h"
|
||||
#include "llavataractions.h"
|
||||
|
|
@ -78,7 +79,6 @@
|
|||
#include "llpanelexperiencelisteditor.h"
|
||||
#include "llpanelexperiencepicker.h"
|
||||
#include "llexperiencecache.h"
|
||||
#include "llweb.h"
|
||||
|
||||
#include "llgroupactions.h"
|
||||
#include "llsdutil_math.h"
|
||||
|
|
@ -567,7 +567,7 @@ void LLPanelLandGeneral::refresh()
|
|||
|
||||
mBtnDeedToGroup->setEnabled(FALSE);
|
||||
mBtnSetGroup->setEnabled(FALSE);
|
||||
mBtnStartAuction->setEnabled(LLGridManager::instance().isInSecondLife()); // <FS:Ansariel> Restore land auction floater for OpenSim
|
||||
mBtnStartAuction->setEnabled(FALSE);
|
||||
|
||||
mCheckDeedToGroup ->set(FALSE);
|
||||
mCheckDeedToGroup ->setEnabled(FALSE);
|
||||
|
|
@ -667,7 +667,7 @@ void LLPanelLandGeneral::refresh()
|
|||
mTextClaimDate->setEnabled(FALSE);
|
||||
mTextGroup->setText(getString("none_text"));
|
||||
mTextGroup->setEnabled(FALSE);
|
||||
mBtnStartAuction->setEnabled(LLGridManager::instance().isInSecondLife()); // <FS:Ansariel> Restore land auction floater for OpenSim
|
||||
mBtnStartAuction->setEnabled(FALSE);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
@ -723,12 +723,10 @@ void LLPanelLandGeneral::refresh()
|
|||
mTextClaimDate->setText(claim_date_str);
|
||||
mTextClaimDate->setEnabled(is_leased);
|
||||
|
||||
// <FS:Ansariel> Restore land auction floater for OpenSim
|
||||
BOOL enable_auction = (gAgent.getGodLevel() >= GOD_LIAISON)
|
||||
&& (owner_id == GOVERNOR_LINDEN_ID)
|
||||
&& (parcel->getAuctionID() == 0);
|
||||
mBtnStartAuction->setEnabled(enable_auction || LLGridManager::instance().isInSecondLife());
|
||||
// </FS:Ansariel>
|
||||
mBtnStartAuction->setEnabled(enable_auction);
|
||||
}
|
||||
|
||||
// Display options
|
||||
|
|
@ -1082,32 +1080,20 @@ void LLPanelLandGeneral::onClickBuyPass(void* data)
|
|||
// static
|
||||
void LLPanelLandGeneral::onClickStartAuction(void* data)
|
||||
{
|
||||
// <FS:Ansariel> Restore land auction floater for OpenSim
|
||||
//std::string auction_url = "https://places.[GRID]/auctions/";
|
||||
//LLWeb::loadURLExternal(LLWeb::expandURLSubstitutions(auction_url, LLSD()));
|
||||
if (LLGridManager::instance().isInSecondLife())
|
||||
LLPanelLandGeneral* panelp = (LLPanelLandGeneral*)data;
|
||||
LLParcel* parcelp = panelp->mParcel->getParcel();
|
||||
if(parcelp)
|
||||
{
|
||||
std::string auction_url = "https://places.[GRID]/auctions/";
|
||||
LLWeb::loadURLExternal(LLWeb::expandURLSubstitutions(auction_url, LLSD()));
|
||||
}
|
||||
else
|
||||
{
|
||||
LLPanelLandGeneral* panelp = (LLPanelLandGeneral*)data;
|
||||
LLParcel* parcelp = panelp->mParcel->getParcel();
|
||||
if (parcelp)
|
||||
if(parcelp->getForSale())
|
||||
{
|
||||
if (parcelp->getForSale())
|
||||
{
|
||||
LLNotificationsUtil::add("CannotStartAuctionAlreadyForSale");
|
||||
}
|
||||
else
|
||||
{
|
||||
//LLFloaterAuction::showInstance();
|
||||
LLFloaterReg::showInstance("auction");
|
||||
}
|
||||
LLNotificationsUtil::add("CannotStartAuctionAlreadyForSale");
|
||||
}
|
||||
else
|
||||
{
|
||||
//LLFloaterAuction::showInstance();
|
||||
LLFloaterReg::showInstance("auction");
|
||||
}
|
||||
}
|
||||
// </FS:Ansariel>
|
||||
}
|
||||
|
||||
// static
|
||||
|
|
|
|||
|
|
@ -412,7 +412,8 @@ void LLFloaterNotificationsTabbed::onStoreToast(LLPanel* info_panel, LLUUID id)
|
|||
p.notification_name = notify->getName();
|
||||
p.transaction_id = payload["transaction_id"];
|
||||
p.group_id = payload["group_id"];
|
||||
p.fee = payload["fee"];
|
||||
p.fee = payload["fee"];
|
||||
p.use_offline_cap = payload["use_offline_cap"].asInteger();
|
||||
p.subject = payload["subject"].asString();
|
||||
p.message = payload["message"].asString();
|
||||
// <FS:Ansariel> Unscrew avatar icon for transaction messages
|
||||
|
|
|
|||
|
|
@ -1661,16 +1661,15 @@ void LLFloaterPreference::onClickSetCache()
|
|||
|
||||
std::string proposed_name(cur_name);
|
||||
|
||||
LLDirPicker& picker = LLDirPicker::instance();
|
||||
if (! picker.getDir(&proposed_name ) )
|
||||
{
|
||||
return; //Canceled!
|
||||
}
|
||||
(new LLDirPickerThread(boost::bind(&LLFloaterPreference::changeCachePath, this, _1, _2), proposed_name))->getFile();
|
||||
}
|
||||
|
||||
std::string dir_name = picker.getDirName();
|
||||
if (!dir_name.empty() && dir_name != cur_name)
|
||||
void LLFloaterPreference::changeCachePath(const std::vector<std::string>& filenames, std::string proposed_name)
|
||||
{
|
||||
std::string dir_name = filenames[0];
|
||||
if (!dir_name.empty() && dir_name != proposed_name)
|
||||
{
|
||||
std::string new_top_folder(gDirUtilp->getBaseFileName(dir_name));
|
||||
std::string new_top_folder(gDirUtilp->getBaseFileName(dir_name));
|
||||
LLNotificationsUtil::add("CacheWillBeMoved");
|
||||
gSavedSettings.setString("NewCacheLocation", dir_name);
|
||||
gSavedSettings.setString("NewCacheLocationTopFolder", new_top_folder);
|
||||
|
|
@ -1722,14 +1721,13 @@ void LLFloaterPreference::onClickSetSoundCache()
|
|||
std::string cur_name(gSavedSettings.getString("FSSoundCacheLocation"));
|
||||
std::string proposed_name(cur_name);
|
||||
|
||||
LLDirPicker& picker = LLDirPicker::instance();
|
||||
if (! picker.getDir(&proposed_name ) )
|
||||
{
|
||||
return; //Canceled!
|
||||
}
|
||||
(new LLDirPickerThread(boost::bind(&LLFloaterPreference::changeSoundCachePath, this, _1, _2), proposed_name))->getFile();
|
||||
}
|
||||
|
||||
std::string dir_name = picker.getDirName();
|
||||
if (!dir_name.empty() && dir_name != cur_name)
|
||||
void LLFloaterPreference::changeSoundCachePath(const std::vector<std::string>& filenames, std::string proposed_name)
|
||||
{
|
||||
std::string dir_name = filenames[0];
|
||||
if (!dir_name.empty() && dir_name != proposed_name)
|
||||
{
|
||||
gSavedSettings.setString("FSSoundCacheLocation", dir_name);
|
||||
setSoundCacheLocation(dir_name);
|
||||
|
|
@ -1831,19 +1829,17 @@ void LLFloaterPreference::onClickClearSpamList()
|
|||
void LLFloaterPreference::setPreprocInclude()
|
||||
{
|
||||
std::string cur_name(gSavedSettings.getString("_NACL_PreProcHDDIncludeLocation"));
|
||||
|
||||
std::string proposed_name(cur_name);
|
||||
|
||||
LLDirPicker& picker = LLDirPicker::instance();
|
||||
if (! picker.getDir(&proposed_name ) )
|
||||
{
|
||||
return; //Canceled!
|
||||
}
|
||||
(new LLDirPickerThread(boost::bind(&LLFloaterPreference::changePreprocIncludePath, this, _1, _2), proposed_name))->getFile();
|
||||
}
|
||||
|
||||
std::string dir_name = picker.getDirName();
|
||||
if (!dir_name.empty() && dir_name != cur_name)
|
||||
void LLFloaterPreference::changePreprocIncludePath(const std::vector<std::string>& filenames, std::string proposed_name)
|
||||
{
|
||||
std::string dir_name = filenames[0];
|
||||
if (!dir_name.empty() && dir_name != proposed_name)
|
||||
{
|
||||
std::string new_top_folder(gDirUtilp->getBaseFileName(dir_name));
|
||||
std::string new_top_folder(gDirUtilp->getBaseFileName(dir_name));
|
||||
gSavedSettings.setString("_NACL_PreProcHDDIncludeLocation", dir_name);
|
||||
}
|
||||
}
|
||||
|
|
@ -2848,25 +2844,21 @@ void LLFloaterPreference::onClickLogPath()
|
|||
std::string proposed_name(gSavedPerAccountSettings.getString("InstantMessageLogPath"));
|
||||
mPriorInstantMessageLogPath.clear();
|
||||
|
||||
LLDirPicker& picker = LLDirPicker::instance();
|
||||
//Launches a directory picker and waits for feedback
|
||||
if (!picker.getDir(&proposed_name ) )
|
||||
{
|
||||
return; //Canceled!
|
||||
}
|
||||
|
||||
//Gets the path from the directory picker
|
||||
std::string dir_name = picker.getDirName();
|
||||
|
||||
//Path changed
|
||||
if(proposed_name != dir_name)
|
||||
{
|
||||
gSavedPerAccountSettings.setString("InstantMessageLogPath", dir_name);
|
||||
mPriorInstantMessageLogPath = proposed_name;
|
||||
|
||||
// enable/disable 'Delete transcripts button
|
||||
updateDeleteTranscriptsButton();
|
||||
(new LLDirPickerThread(boost::bind(&LLFloaterPreference::changeLogPath, this, _1, _2), proposed_name))->getFile();
|
||||
}
|
||||
|
||||
void LLFloaterPreference::changeLogPath(const std::vector<std::string>& filenames, std::string proposed_name)
|
||||
{
|
||||
//Path changed
|
||||
if (proposed_name != filenames[0])
|
||||
{
|
||||
gSavedPerAccountSettings.setString("InstantMessageLogPath", filenames[0]);
|
||||
mPriorInstantMessageLogPath = proposed_name;
|
||||
|
||||
// enable/disable 'Delete transcripts button
|
||||
updateDeleteTranscriptsButton();
|
||||
}
|
||||
//[FIX FIRE-2765 : SJ] Enable Reset button when own Chatlogdirectory is set
|
||||
getChildView("reset_logpath")->setEnabled(TRUE);
|
||||
}
|
||||
|
|
@ -4883,16 +4875,17 @@ BOOL FSPanelPreferenceBackup::postBuild()
|
|||
void FSPanelPreferenceBackup::onClickSetBackupSettingsPath()
|
||||
{
|
||||
std::string dir_name = gSavedSettings.getString("SettingsBackupPath");
|
||||
LLDirPicker& picker = LLDirPicker::instance();
|
||||
if (!picker.getDir(&dir_name))
|
||||
{
|
||||
// canceled
|
||||
return;
|
||||
}
|
||||
(new LLDirPickerThread(boost::bind(&FSPanelPreferenceBackup::changeBackupSettingsPath, this, _1, _2), dir_name))->getFile();
|
||||
}
|
||||
|
||||
dir_name = picker.getDirName();
|
||||
gSavedSettings.setString("SettingsBackupPath", dir_name);
|
||||
getChild<LLLineEditor>("settings_backup_path")->setValue(dir_name);
|
||||
void FSPanelPreferenceBackup::changeBackupSettingsPath(const std::vector<std::string>& filenames, std::string proposed_name)
|
||||
{
|
||||
std::string dir_name = filenames[0];
|
||||
if (!dir_name.empty() && dir_name != proposed_name)
|
||||
{
|
||||
gSavedSettings.setString("SettingsBackupPath", dir_name);
|
||||
getChild<LLLineEditor>("settings_backup_path")->setValue(dir_name);
|
||||
}
|
||||
}
|
||||
|
||||
void FSPanelPreferenceBackup::onClickBackupSettings()
|
||||
|
|
|
|||
|
|
@ -171,6 +171,7 @@ public:
|
|||
// <FS:Ansariel> Sound cache
|
||||
void setSoundCacheLocation(const LLStringExplicit& location);
|
||||
void onClickSetSoundCache();
|
||||
void changeSoundCachePath(const std::vector<std::string>& filenames, std::string proposed_name);
|
||||
void onClickBrowseSoundCache();
|
||||
void onClickResetSoundCache();
|
||||
// </FS:Ansariel>
|
||||
|
|
@ -179,6 +180,7 @@ public:
|
|||
void onClickResetVoice();
|
||||
|
||||
void onClickSetCache();
|
||||
void changeCachePath(const std::vector<std::string>& filenames, std::string proposed_name);
|
||||
void onClickBrowseCache();
|
||||
void onClickBrowseCrashLogs();
|
||||
void onClickBrowseChatLogDir();
|
||||
|
|
@ -195,11 +197,13 @@ public:
|
|||
// void onClickSetSounds(); //<FS:KC> Handled centrally now
|
||||
void onClickPreviewUISound(const LLSD& ui_sound_id); // <FS:PP> FIRE-8190: Preview function for "UI Sounds" Panel
|
||||
void setPreprocInclude();
|
||||
void changePreprocIncludePath(const std::vector<std::string>& filenames, std::string proposed_name);
|
||||
void onClickEnablePopup();
|
||||
void onClickDisablePopup();
|
||||
void resetAllIgnored();
|
||||
void setAllIgnored();
|
||||
void onClickLogPath();
|
||||
void changeLogPath(const std::vector<std::string>& filenames, std::string proposed_name);
|
||||
bool moveTranscriptsAndLog();
|
||||
//[FIX FIRE-2765 : SJ] Making sure Reset button resets works
|
||||
void onClickResetLogPath();
|
||||
|
|
@ -472,6 +476,7 @@ public:
|
|||
protected:
|
||||
// <FS:Zi> Backup settings
|
||||
void onClickSetBackupSettingsPath();
|
||||
void changeBackupSettingsPath(const std::vector<std::string>& filenames, std::string proposed_name);
|
||||
void onClickSelectAll();
|
||||
void onClickDeselectAll();
|
||||
void onClickBackupSettings();
|
||||
|
|
|
|||
|
|
@ -91,17 +91,15 @@ void LLFloaterScriptEdPrefs::getUIColor(LLUICtrl* ctrl, const LLSD& param)
|
|||
void LLFloaterScriptEdPrefs::setPreprocInclude()
|
||||
{
|
||||
std::string cur_name(gSavedSettings.getString("_NACL_PreProcHDDIncludeLocation"));
|
||||
|
||||
std::string proposed_name(cur_name);
|
||||
|
||||
LLDirPicker& picker = LLDirPicker::instance();
|
||||
if (!picker.getDir(&proposed_name ))
|
||||
{
|
||||
return; //Canceled!
|
||||
}
|
||||
|
||||
std::string dir_name = picker.getDirName();
|
||||
if (!dir_name.empty() && dir_name != cur_name)
|
||||
|
||||
(new LLDirPickerThread(boost::bind(&LLFloaterScriptEdPrefs::changePreprocIncludePath, this, _1, _2), proposed_name))->getFile();
|
||||
}
|
||||
|
||||
void LLFloaterScriptEdPrefs::changePreprocIncludePath(const std::vector<std::string>& filenames, std::string proposed_name)
|
||||
{
|
||||
std::string dir_name = filenames[0];
|
||||
if (!dir_name.empty() && dir_name != proposed_name)
|
||||
{
|
||||
std::string new_top_folder(gDirUtilp->getBaseFileName(dir_name));
|
||||
gSavedSettings.setString("_NACL_PreProcHDDIncludeLocation", dir_name);
|
||||
|
|
|
|||
|
|
@ -47,6 +47,7 @@ private:
|
|||
|
||||
// <FS:Ansariel> Port old FS script prefs
|
||||
void setPreprocInclude();
|
||||
void changePreprocIncludePath(const std::vector<std::string>& filenames, std::string proposed_name);
|
||||
|
||||
LLScriptEditor* mEditor;
|
||||
};
|
||||
|
|
|
|||
|
|
@ -1495,30 +1495,15 @@ void LLFloaterSnapshot::saveTexture()
|
|||
previewp->saveTexture();
|
||||
}
|
||||
|
||||
// <FS:Ansariel> Threaded filepickers
|
||||
//BOOL LLFloaterSnapshot::saveLocal()
|
||||
void LLFloaterSnapshot::saveLocal(boost::function<void(bool)> callback)
|
||||
// </FS:Ansariel>
|
||||
void LLFloaterSnapshot::saveLocal(const snapshot_saved_signal_t::slot_type& success_cb, const snapshot_saved_signal_t::slot_type& failure_cb)
|
||||
{
|
||||
LL_DEBUGS() << "saveLocal" << LL_ENDL;
|
||||
LLSnapshotLivePreview* previewp = getPreviewView();
|
||||
if (!previewp)
|
||||
llassert(previewp != NULL);
|
||||
if (previewp)
|
||||
{
|
||||
llassert(previewp != NULL);
|
||||
// <FS:Ansariel> Threaded filepickers
|
||||
//return FALSE;
|
||||
if (callback)
|
||||
{
|
||||
callback(false);
|
||||
}
|
||||
return;
|
||||
// </FS:Ansariel>
|
||||
previewp->saveLocal(success_cb, failure_cb);
|
||||
}
|
||||
|
||||
// <FS:Ansariel> Threaded filepickers
|
||||
//return previewp->saveLocal();
|
||||
previewp->saveLocal(callback);
|
||||
// </FS:Ansariel>
|
||||
}
|
||||
|
||||
void LLFloaterSnapshotBase::postSave()
|
||||
|
|
|
|||
|
|
@ -159,10 +159,9 @@ public:
|
|||
static LLFloaterSnapshot* getInstance();
|
||||
static LLFloaterSnapshot* findInstance();
|
||||
/*virtual*/ void saveTexture();
|
||||
// <FS:Ansariel> Threaded filepickers
|
||||
//BOOL saveLocal();
|
||||
void saveLocal(boost::function<void(bool)> callback);
|
||||
// </FS:Ansariel>
|
||||
|
||||
typedef boost::signals2::signal<void(void)> snapshot_saved_signal_t;
|
||||
void saveLocal(const snapshot_saved_signal_t::slot_type& success_cb, const snapshot_saved_signal_t::slot_type& failure_cb);
|
||||
static void setAgentEmail(const std::string& email);
|
||||
|
||||
BOOL isWaitingState();
|
||||
|
|
|
|||
|
|
@ -1106,15 +1106,6 @@ private:
|
|||
//-----------------------------------------------------------------------------
|
||||
F32 gpu_benchmark()
|
||||
{
|
||||
#if LL_WINDOWS
|
||||
if (gGLManager.mIsIntel
|
||||
&& std::string::npos != LLOSInfo::instance().getOSStringSimple().find("Microsoft Windows 8")) // or 8.1
|
||||
{ // don't run benchmark on Windows 8/8.1 based PCs with Intel GPU (MAINT-8197)
|
||||
LL_WARNS() << "Skipping gpu_benchmark() for Intel graphics on Windows 8." << LL_ENDL;
|
||||
return -1.f;
|
||||
}
|
||||
#endif
|
||||
|
||||
if (!gGLManager.mHasShaderObjects || !gGLManager.mHasTimerQuery)
|
||||
{ // don't bother benchmarking the fixed function
|
||||
// or venerable drivers which don't support accurate timing anyway
|
||||
|
|
|
|||
|
|
@ -1284,10 +1284,11 @@ void LLIMProcessing::processNewMessage(LLUUID from_id,
|
|||
|
||||
LLSD payload;
|
||||
payload["transaction_id"] = session_id;
|
||||
payload["group_id"] = from_id;
|
||||
payload["group_id"] = from_group ? from_id : aux_id;
|
||||
payload["name"] = name;
|
||||
payload["message"] = message;
|
||||
payload["fee"] = membership_fee;
|
||||
payload["use_offline_cap"] = session_id.isNull() && (offline == IM_OFFLINE);
|
||||
|
||||
LLSD args;
|
||||
args["MESSAGE"] = message;
|
||||
|
|
@ -2118,8 +2119,12 @@ void LLIMProcessing::requestOfflineMessages()
|
|||
// Auto-accepted inventory items may require the avatar object
|
||||
// to build a correct name. Likewise, inventory offers from
|
||||
// muted avatars require the mute list to properly mute.
|
||||
if (cap_url.empty() || !gSavedSettings.getBOOL("FSUseReadOfflineMsgsCap"))
|
||||
if (cap_url.empty()
|
||||
|| gAgent.getRegionCapability("AcceptFriendship").empty()
|
||||
|| gAgent.getRegionCapability("AcceptGroupInvite").empty())
|
||||
{
|
||||
// Offline messages capability provides no session/transaction ids for message AcceptFriendship and IM_GROUP_INVITATION to work
|
||||
// So make sure we have the caps before using it.
|
||||
requestOfflineMessagesLegacy();
|
||||
}
|
||||
else
|
||||
|
|
@ -2220,7 +2225,7 @@ void LLIMProcessing::requestOfflineMessagesCoro(std::string url)
|
|||
message_data["to_agent_id"].asUUID(),
|
||||
IM_OFFLINE,
|
||||
(EInstantMessage)message_data["dialog"].asInteger(),
|
||||
LLUUID::null, // session id, fix this for friendship offers to work
|
||||
LLUUID::null, // session id, since there is none we can only use frienship/group invite caps
|
||||
message_data["timestamp"].asInteger(),
|
||||
message_data["from_agent_name"].asString(),
|
||||
message_data["message"].asString(),
|
||||
|
|
|
|||
|
|
@ -324,38 +324,15 @@ void LLGroupInviteNotificationListItem::onClickJoinBtn()
|
|||
return;
|
||||
}
|
||||
|
||||
if(mParams.fee > 0)
|
||||
{
|
||||
LLSD args;
|
||||
args["COST"] = llformat("%d", mParams.fee);
|
||||
// Set the fee for next time to 0, so that we don't keep
|
||||
// asking about a fee.
|
||||
LLSD next_payload;
|
||||
next_payload["group_id"]= mParams.group_id;
|
||||
next_payload["transaction_id"]= mParams.transaction_id;
|
||||
next_payload["fee"] = 0;
|
||||
LLNotificationsUtil::add("JoinGroupCanAfford", args, next_payload);
|
||||
}
|
||||
else
|
||||
{
|
||||
send_improved_im(mParams.group_id,
|
||||
std::string("name"),
|
||||
std::string("message"),
|
||||
IM_ONLINE,
|
||||
IM_GROUP_INVITATION_ACCEPT,
|
||||
mParams.transaction_id);
|
||||
}
|
||||
send_join_group_response(mParams.group_id, mParams.transaction_id, true, mParams.fee, mParams.use_offline_cap);
|
||||
|
||||
LLNotificationListItem::onClickCloseBtn();
|
||||
}
|
||||
|
||||
void LLGroupInviteNotificationListItem::onClickDeclineBtn()
|
||||
{
|
||||
send_improved_im(mParams.group_id,
|
||||
std::string("name"),
|
||||
std::string("message"),
|
||||
IM_ONLINE,
|
||||
IM_GROUP_INVITATION_DECLINE,
|
||||
mParams.transaction_id);
|
||||
send_join_group_response(mParams.group_id, mParams.transaction_id, false, mParams.fee, mParams.use_offline_cap);
|
||||
|
||||
LLNotificationListItem::onClickCloseBtn();
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -60,6 +60,7 @@ public:
|
|||
// </FS:Ansariel>
|
||||
std::string sender;
|
||||
S32 fee;
|
||||
U8 use_offline_cap;
|
||||
LLDate time_stamp;
|
||||
LLDate received_time;
|
||||
LLSD inventory_offer;
|
||||
|
|
|
|||
|
|
@ -1180,72 +1180,72 @@ void LLOutfitGallery::refreshTextures(const LLUUID& category_id)
|
|||
|
||||
void LLOutfitGallery::uploadPhoto(LLUUID outfit_id)
|
||||
{
|
||||
outfit_map_t::iterator outfit_it = mOutfitMap.find(outfit_id);
|
||||
if (outfit_it == mOutfitMap.end() || outfit_it->first.isNull())
|
||||
{
|
||||
return;
|
||||
}
|
||||
outfit_map_t::iterator outfit_it = mOutfitMap.find(outfit_id);
|
||||
if (outfit_it == mOutfitMap.end() || outfit_it->first.isNull())
|
||||
{
|
||||
return;
|
||||
}
|
||||
(new LLFilePickerReplyThread(boost::bind(&LLOutfitGallery::uploadOutfitImage, this, _1, outfit_id), LLFilePicker::FFLOAD_IMAGE, false))->getFile();
|
||||
}
|
||||
|
||||
LLFilePicker& picker = LLFilePicker::instance();
|
||||
if (picker.getOpenFile(LLFilePicker::FFLOAD_IMAGE))
|
||||
void LLOutfitGallery::uploadOutfitImage(const std::vector<std::string>& filenames, LLUUID outfit_id)
|
||||
{
|
||||
std::string filename = filenames[0];
|
||||
LLLocalBitmap* unit = new LLLocalBitmap(filename);
|
||||
if (unit->getValid())
|
||||
{
|
||||
std::string filename = picker.getFirstFile();
|
||||
LLLocalBitmap* unit = new LLLocalBitmap(filename);
|
||||
if (unit->getValid())
|
||||
std::string exten = gDirUtilp->getExtension(filename);
|
||||
U32 codec = LLImageBase::getCodecFromExtension(exten);
|
||||
|
||||
LLImageDimensionsInfo image_info;
|
||||
std::string image_load_error;
|
||||
if (!image_info.load(filename, codec))
|
||||
{
|
||||
std::string exten = gDirUtilp->getExtension(filename);
|
||||
U32 codec = LLImageBase::getCodecFromExtension(exten);
|
||||
|
||||
LLImageDimensionsInfo image_info;
|
||||
std::string image_load_error;
|
||||
if (!image_info.load(filename, codec))
|
||||
{
|
||||
image_load_error = image_info.getLastError();
|
||||
}
|
||||
|
||||
S32 max_width = MAX_OUTFIT_PHOTO_WIDTH;
|
||||
S32 max_height = MAX_OUTFIT_PHOTO_HEIGHT;
|
||||
|
||||
if ((image_info.getWidth() > max_width) || (image_info.getHeight() > max_height))
|
||||
{
|
||||
LLStringUtil::format_map_t args;
|
||||
args["WIDTH"] = llformat("%d", max_width);
|
||||
args["HEIGHT"] = llformat("%d", max_height);
|
||||
|
||||
image_load_error = LLTrans::getString("outfit_photo_load_dimensions_error", args);
|
||||
}
|
||||
|
||||
if (!image_load_error.empty())
|
||||
{
|
||||
LLSD subst;
|
||||
subst["REASON"] = image_load_error;
|
||||
LLNotificationsUtil::add("OutfitPhotoLoadError", subst);
|
||||
return;
|
||||
}
|
||||
|
||||
S32 expected_upload_cost = LLGlobalEconomy::getInstance()->getPriceUpload(); // kinda hack - assumes that unsubclassed LLFloaterNameDesc is only used for uploading chargeable assets, which it is right now (it's only used unsubclassed for the sound upload dialog, and THAT should be a subclass).
|
||||
void *nruserdata = NULL;
|
||||
nruserdata = (void *)&outfit_id;
|
||||
|
||||
LLViewerInventoryCategory *outfit_cat = gInventory.getCategory(outfit_id);
|
||||
if (!outfit_cat) return;
|
||||
updateSnapshotFolderObserver();
|
||||
checkRemovePhoto(outfit_id);
|
||||
std::string upload_pending_name = outfit_id.asString();
|
||||
std::string upload_pending_desc = "";
|
||||
LLAssetStorage::LLStoreAssetCallback callback = NULL;
|
||||
LLUUID photo_id = upload_new_resource(filename, // file
|
||||
upload_pending_name,
|
||||
upload_pending_desc,
|
||||
0, LLFolderType::FT_NONE, LLInventoryType::IT_NONE,
|
||||
LLFloaterPerms::getNextOwnerPerms("Uploads"),
|
||||
LLFloaterPerms::getGroupPerms("Uploads"),
|
||||
LLFloaterPerms::getEveryonePerms("Uploads"),
|
||||
upload_pending_name, callback, expected_upload_cost, nruserdata);
|
||||
mOutfitLinkPending = outfit_id;
|
||||
image_load_error = image_info.getLastError();
|
||||
}
|
||||
delete unit;
|
||||
|
||||
S32 max_width = MAX_OUTFIT_PHOTO_WIDTH;
|
||||
S32 max_height = MAX_OUTFIT_PHOTO_HEIGHT;
|
||||
|
||||
if ((image_info.getWidth() > max_width) || (image_info.getHeight() > max_height))
|
||||
{
|
||||
LLStringUtil::format_map_t args;
|
||||
args["WIDTH"] = llformat("%d", max_width);
|
||||
args["HEIGHT"] = llformat("%d", max_height);
|
||||
|
||||
image_load_error = LLTrans::getString("outfit_photo_load_dimensions_error", args);
|
||||
}
|
||||
|
||||
if (!image_load_error.empty())
|
||||
{
|
||||
LLSD subst;
|
||||
subst["REASON"] = image_load_error;
|
||||
LLNotificationsUtil::add("OutfitPhotoLoadError", subst);
|
||||
return;
|
||||
}
|
||||
|
||||
S32 expected_upload_cost = LLGlobalEconomy::getInstance()->getPriceUpload(); // kinda hack - assumes that unsubclassed LLFloaterNameDesc is only used for uploading chargeable assets, which it is right now (it's only used unsubclassed for the sound upload dialog, and THAT should be a subclass).
|
||||
void *nruserdata = NULL;
|
||||
nruserdata = (void *)&outfit_id;
|
||||
|
||||
LLViewerInventoryCategory *outfit_cat = gInventory.getCategory(outfit_id);
|
||||
if (!outfit_cat) return;
|
||||
updateSnapshotFolderObserver();
|
||||
checkRemovePhoto(outfit_id);
|
||||
std::string upload_pending_name = outfit_id.asString();
|
||||
std::string upload_pending_desc = "";
|
||||
LLAssetStorage::LLStoreAssetCallback callback = NULL;
|
||||
LLUUID photo_id = upload_new_resource(filename, // file
|
||||
upload_pending_name,
|
||||
upload_pending_desc,
|
||||
0, LLFolderType::FT_NONE, LLInventoryType::IT_NONE,
|
||||
LLFloaterPerms::getNextOwnerPerms("Uploads"),
|
||||
LLFloaterPerms::getGroupPerms("Uploads"),
|
||||
LLFloaterPerms::getEveryonePerms("Uploads"),
|
||||
upload_pending_name, callback, expected_upload_cost, nruserdata);
|
||||
mOutfitLinkPending = outfit_id;
|
||||
}
|
||||
delete unit;
|
||||
}
|
||||
|
||||
void LLOutfitGallery::linkPhotoToOutfit(LLUUID photo_id, LLUUID outfit_id)
|
||||
|
|
|
|||
|
|
@ -130,6 +130,7 @@ protected:
|
|||
private:
|
||||
void loadPhotos();
|
||||
void uploadPhoto(LLUUID outfit_id);
|
||||
void uploadOutfitImage(const std::vector<std::string>& filenames, LLUUID outfit_id);
|
||||
void updateSnapshotFolderObserver();
|
||||
LLUUID getPhotoAssetId(const LLUUID& outfit_id);
|
||||
LLUUID getDefaultPhoto();
|
||||
|
|
|
|||
|
|
@ -206,6 +206,7 @@ LLPanelLogin::LLPanelLogin(const LLRect &rect,
|
|||
|
||||
// change z sort of clickable text to be behind buttons
|
||||
sendChildToBack(getChildView("forgot_password_text"));
|
||||
sendChildToBack(getChildView("sign_up_text"));
|
||||
|
||||
LLComboBox* favorites_combo = getChild<LLComboBox>("start_location_combo");
|
||||
updateLocationSelectorsVisibility(); // separate so that it can be called from preferences
|
||||
|
|
@ -273,6 +274,9 @@ LLPanelLogin::LLPanelLogin(const LLRect &rect,
|
|||
LLTextBox* forgot_password_text = getChild<LLTextBox>("forgot_password_text");
|
||||
forgot_password_text->setClickedCallback(onClickForgotPassword, NULL);
|
||||
|
||||
LLTextBox* sign_up_text = getChild<LLTextBox>("sign_up_text");
|
||||
sign_up_text->setClickedCallback(onClickSignUp, NULL);
|
||||
|
||||
// get the web browser control
|
||||
LLMediaCtrl* web_browser = getChild<LLMediaCtrl>("login_html");
|
||||
web_browser->addObserver(this);
|
||||
|
|
@ -923,6 +927,15 @@ void LLPanelLogin::onClickForgotPassword(void*)
|
|||
}
|
||||
}
|
||||
|
||||
//static
|
||||
void LLPanelLogin::onClickSignUp(void*)
|
||||
{
|
||||
if (sInstance)
|
||||
{
|
||||
LLWeb::loadURLExternal(sInstance->getString("sign_up_url"));
|
||||
}
|
||||
}
|
||||
|
||||
// static
|
||||
void LLPanelLogin::onPassKey(LLLineEditor* caller, void* user_data)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -101,6 +101,7 @@ private:
|
|||
static void onClickNewAccount(void*);
|
||||
static void onClickVersion(void*);
|
||||
static void onClickForgotPassword(void*);
|
||||
static void onClickSignUp(void*);
|
||||
static void onPassKey(LLLineEditor* caller, void* user_data);
|
||||
static void updateServerCombo();
|
||||
|
||||
|
|
|
|||
|
|
@ -1244,12 +1244,12 @@ void LLPanelNearByMedia::onClickSelectedMediaMute()
|
|||
F32 volume = impl->getVolume();
|
||||
if(volume > 0.0)
|
||||
{
|
||||
impl->setVolume(0.0);
|
||||
impl->setMute(true);
|
||||
}
|
||||
else if (mVolumeSlider->getValueF32() == 0.0)
|
||||
{
|
||||
impl->setVolume(1.0);
|
||||
mVolumeSlider->setValue(1.0);
|
||||
impl->setMute(false);
|
||||
mVolumeSlider->setValue(impl->getVolume());
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
|
|||
|
|
@ -134,6 +134,10 @@ U8 string_value_to_click_action(std::string p_value)
|
|||
{
|
||||
return CLICK_ACTION_ZOOM;
|
||||
}
|
||||
if (p_value == "None")
|
||||
{
|
||||
return CLICK_ACTION_DISABLED;
|
||||
}
|
||||
return CLICK_ACTION_TOUCH;
|
||||
}
|
||||
|
||||
|
|
@ -160,6 +164,9 @@ std::string click_action_to_string_value( U8 action)
|
|||
case CLICK_ACTION_ZOOM:
|
||||
return "Zoom";
|
||||
break;
|
||||
case CLICK_ACTION_DISABLED:
|
||||
return "None";
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -1430,34 +1437,45 @@ void LLPanelPermissions::setAllSaleInfo()
|
|||
LLSaleInfo new_sale_info(sale_type, price);
|
||||
LLSelectMgr::getInstance()->selectionSetObjectSaleInfo(new_sale_info);
|
||||
|
||||
struct f : public LLSelectedObjectFunctor
|
||||
{
|
||||
virtual bool apply(LLViewerObject* object)
|
||||
{
|
||||
return object->getClickAction() == CLICK_ACTION_BUY
|
||||
|| object->getClickAction() == CLICK_ACTION_TOUCH;
|
||||
}
|
||||
} check_actions;
|
||||
// Note: won't work right if a root and non-root are both single-selected (here and other places).
|
||||
BOOL is_perm_modify = (LLSelectMgr::getInstance()->getSelection()->getFirstRootNode()
|
||||
&& LLSelectMgr::getInstance()->selectGetRootsModify())
|
||||
|| LLSelectMgr::getInstance()->selectGetModify();
|
||||
BOOL is_nonpermanent_enforced = (LLSelectMgr::getInstance()->getSelection()->getFirstRootNode()
|
||||
&& LLSelectMgr::getInstance()->selectGetRootsNonPermanentEnforced())
|
||||
|| LLSelectMgr::getInstance()->selectGetNonPermanentEnforced();
|
||||
|
||||
// Selection should only contain objects that are of target
|
||||
// action already or of action we are aiming to remove.
|
||||
bool default_actions = LLSelectMgr::getInstance()->getSelection()->applyToObjects(&check_actions);
|
||||
|
||||
if (default_actions && old_sale_info.isForSale() != new_sale_info.isForSale())
|
||||
if (is_perm_modify && is_nonpermanent_enforced)
|
||||
{
|
||||
// <FS:Ansariel> FIRE-5273: Change default click action to buy only for modifiable objects
|
||||
//U8 new_click_action = new_sale_info.isForSale() ? CLICK_ACTION_BUY : CLICK_ACTION_TOUCH;
|
||||
struct f : public LLSelectedObjectFunctor
|
||||
{
|
||||
virtual bool apply(LLViewerObject* object)
|
||||
{
|
||||
return object->permModify();
|
||||
return object->getClickAction() == CLICK_ACTION_BUY
|
||||
|| object->getClickAction() == CLICK_ACTION_TOUCH;
|
||||
}
|
||||
} modify_checks;
|
||||
bool allow_modify = LLSelectMgr::getInstance()->getSelection()->applyToObjects(&modify_checks);
|
||||
U8 new_click_action = (new_sale_info.isForSale() && allow_modify) ? CLICK_ACTION_BUY : CLICK_ACTION_TOUCH;
|
||||
// </FS:Ansariel>
|
||||
LLSelectMgr::getInstance()->selectionSetClickAction(new_click_action);
|
||||
} check_actions;
|
||||
|
||||
// Selection should only contain objects that are of target
|
||||
// action already or of action we are aiming to remove.
|
||||
bool default_actions = LLSelectMgr::getInstance()->getSelection()->applyToObjects(&check_actions);
|
||||
|
||||
if (default_actions && old_sale_info.isForSale() != new_sale_info.isForSale())
|
||||
{
|
||||
// <FS:Ansariel> FIRE-5273: Change default click action to buy only for modifiable objects
|
||||
//U8 new_click_action = new_sale_info.isForSale() ? CLICK_ACTION_BUY : CLICK_ACTION_TOUCH;
|
||||
struct f : public LLSelectedObjectFunctor
|
||||
{
|
||||
virtual bool apply(LLViewerObject* object)
|
||||
{
|
||||
return object->permModify();
|
||||
}
|
||||
} modify_checks;
|
||||
bool allow_modify = LLSelectMgr::getInstance()->getSelection()->applyToObjects(&modify_checks);
|
||||
U8 new_click_action = (new_sale_info.isForSale() && allow_modify) ? CLICK_ACTION_BUY : CLICK_ACTION_TOUCH;
|
||||
// </FS:Ansariel>
|
||||
LLSelectMgr::getInstance()->selectionSetClickAction(new_click_action);
|
||||
}
|
||||
}
|
||||
|
||||
showMarkForSale(FALSE);
|
||||
|
|
|
|||
|
|
@ -63,14 +63,14 @@ private:
|
|||
/*virtual*/ LLSnapshotModel::ESnapshotType getSnapshotType();
|
||||
/*virtual*/ void updateControls(const LLSD& info);
|
||||
|
||||
// <FS:Ansariel> Threaded filepickers
|
||||
void saveLocalCallback(bool success);
|
||||
|
||||
S32 mLocalFormat;
|
||||
|
||||
void onFormatComboCommit(LLUICtrl* ctrl);
|
||||
void onQualitySliderCommit(LLUICtrl* ctrl);
|
||||
void onSaveFlyoutCommit(LLUICtrl* ctrl);
|
||||
|
||||
void onLocalSaved();
|
||||
void onLocalCanceled();
|
||||
};
|
||||
|
||||
static LLPanelInjector<LLPanelSnapshotLocal> panel_class("llpanelsnapshotlocal");
|
||||
|
|
@ -185,22 +185,22 @@ void LLPanelSnapshotLocal::onSaveFlyoutCommit(LLUICtrl* ctrl)
|
|||
LLFloaterSnapshot* floater = LLFloaterSnapshot::getInstance();
|
||||
|
||||
floater->notify(LLSD().with("set-working", true));
|
||||
// <FS:Ansariel> Threaded filepickers
|
||||
//BOOL saved = floater->saveLocal();
|
||||
//if (saved)
|
||||
//{
|
||||
// LLFloaterSnapshot::postSave();
|
||||
// floater->notify(LLSD().with("set-finished", LLSD().with("ok", true).with("msg", "local")));
|
||||
//}
|
||||
//else
|
||||
//{
|
||||
// cancel();
|
||||
// floater->notify(LLSD().with("set-finished", LLSD().with("ok", false).with("msg", "local")));
|
||||
//}
|
||||
floater->saveLocal(boost::bind(&LLPanelSnapshotLocal::saveLocalCallback, this, _1));
|
||||
// </FS:Ansariel>
|
||||
floater->saveLocal((boost::bind(&LLPanelSnapshotLocal::onLocalSaved, this)), (boost::bind(&LLPanelSnapshotLocal::onLocalCanceled, this)));
|
||||
}
|
||||
|
||||
void LLPanelSnapshotLocal::onLocalSaved()
|
||||
{
|
||||
mSnapshotFloater->postSave();
|
||||
LLFloaterSnapshot::getInstance()->notify(LLSD().with("set-finished", LLSD().with("ok", true).with("msg", "local")));
|
||||
}
|
||||
|
||||
void LLPanelSnapshotLocal::onLocalCanceled()
|
||||
{
|
||||
//cancel(); // <FS:Ansariel> Don't go back to selection
|
||||
LLFloaterSnapshot::getInstance()->notify(LLSD().with("set-finished", LLSD().with("ok", false).with("msg", "local")));
|
||||
}
|
||||
|
||||
|
||||
// <FS:Ansariel> Store settings at logout
|
||||
LLPanelSnapshotLocal::~LLPanelSnapshotLocal()
|
||||
{
|
||||
|
|
@ -208,24 +208,6 @@ LLPanelSnapshotLocal::~LLPanelSnapshotLocal()
|
|||
gSavedSettings.setS32("LastSnapshotToDiskWidth", getTypedPreviewWidth());
|
||||
gSavedSettings.setS32("LastSnapshotToDiskHeight", getTypedPreviewHeight());
|
||||
}
|
||||
// </FS:Ansariel>
|
||||
|
||||
// <FS:Ansariel> Threaded filepickers
|
||||
void LLPanelSnapshotLocal::saveLocalCallback(bool success)
|
||||
{
|
||||
LLFloaterSnapshot* floater = LLFloaterSnapshot::getInstance();
|
||||
|
||||
if (success)
|
||||
{
|
||||
mSnapshotFloater->postSave();
|
||||
floater->notify(LLSD().with("set-finished", LLSD().with("ok", true).with("msg", "local")));
|
||||
}
|
||||
else
|
||||
{
|
||||
LLNotificationsUtil::add("CannotSaveSnapshot");
|
||||
floater->notify(LLSD().with("set-ready", true));
|
||||
}
|
||||
}
|
||||
|
||||
LLSnapshotModel::ESnapshotType LLPanelSnapshotLocal::getSnapshotType()
|
||||
{
|
||||
|
|
|
|||
|
|
@ -2463,14 +2463,22 @@ void LLPreviewLSL::onLoadComplete( LLVFS *vfs, const LLUUID& asset_uuid, LLAsset
|
|||
buffer[file_length] = 0;
|
||||
preview->mScriptEd->setScriptText(LLStringExplicit(&buffer[0]), TRUE);
|
||||
preview->mScriptEd->mEditor->makePristine();
|
||||
|
||||
std::string script_name = DEFAULT_SCRIPT_NAME;
|
||||
LLInventoryItem* item = gInventory.getItem(*item_uuid);
|
||||
BOOL is_modifiable = FALSE;
|
||||
if(item
|
||||
&& gAgent.allowOperation(PERM_MODIFY, item->getPermissions(),
|
||||
GP_OBJECT_MANIPULATE))
|
||||
if (item)
|
||||
{
|
||||
is_modifiable = TRUE;
|
||||
if (!item->getName().empty())
|
||||
{
|
||||
script_name = item->getName();
|
||||
}
|
||||
if (gAgent.allowOperation(PERM_MODIFY, item->getPermissions(), GP_OBJECT_MANIPULATE))
|
||||
{
|
||||
is_modifiable = TRUE;
|
||||
}
|
||||
}
|
||||
preview->mScriptEd->setScriptName(script_name);
|
||||
preview->mScriptEd->setEnableEditing(is_modifiable);
|
||||
preview->mAssetStatus = PREVIEW_ASSET_LOADED;
|
||||
|
||||
|
|
|
|||
|
|
@ -1159,6 +1159,8 @@ static U8 string_value_to_click_action(std::string p_value)
|
|||
return CLICK_ACTION_OPEN;
|
||||
if (p_value == "Zoom")
|
||||
return CLICK_ACTION_ZOOM;
|
||||
if (p_value == "None")
|
||||
return CLICK_ACTION_DISABLED;
|
||||
return CLICK_ACTION_TOUCH;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -70,6 +70,7 @@ S32 BORDER_WIDTH = 6;
|
|||
const S32 MAX_TEXTURE_SIZE = 512 ; //max upload texture size 512 * 512
|
||||
|
||||
std::set<LLSnapshotLivePreview*> LLSnapshotLivePreview::sList;
|
||||
LLPointer<LLImageFormatted> LLSnapshotLivePreview::sSaveLocalImage = NULL;
|
||||
|
||||
LLSnapshotLivePreview::LLSnapshotLivePreview (const LLSnapshotLivePreview::Params& p)
|
||||
: LLView(p),
|
||||
|
|
@ -135,6 +136,7 @@ LLSnapshotLivePreview::~LLSnapshotLivePreview()
|
|||
|
||||
// gIdleCallbacks.deleteFunction( &LLSnapshotLivePreview::onIdle, (void*)this );
|
||||
sList.erase(this);
|
||||
sSaveLocalImage = NULL;
|
||||
}
|
||||
|
||||
void LLSnapshotLivePreview::setMaxImageSize(S32 size)
|
||||
|
|
@ -1193,77 +1195,19 @@ void LLSnapshotLivePreview::saveTexture(BOOL outfit_snapshot, std::string name)
|
|||
mDataSize = 0;
|
||||
}
|
||||
|
||||
// <FS:Ansariel> Threaded filepickers
|
||||
//BOOL LLSnapshotLivePreview::saveLocal()
|
||||
//{
|
||||
// // Update mFormattedImage if necessary
|
||||
// getFormattedImage();
|
||||
//
|
||||
// // Save the formatted image
|
||||
// BOOL success = saveLocal(mFormattedImage);
|
||||
//
|
||||
// if(success)
|
||||
// {
|
||||
// gViewerWindow->playSnapshotAnimAndSound();
|
||||
// }
|
||||
// return success;
|
||||
//}
|
||||
//
|
||||
////Check if failed due to insufficient memory
|
||||
//BOOL LLSnapshotLivePreview::saveLocal(LLPointer<LLImageFormatted> mFormattedImage)
|
||||
//{
|
||||
// BOOL insufficient_memory;
|
||||
// BOOL success = gViewerWindow->saveImageNumbered(mFormattedImage, FALSE, insufficient_memory);
|
||||
//
|
||||
// if (insufficient_memory)
|
||||
// {
|
||||
// std::string lastSnapshotDir = LLViewerWindow::getLastSnapshotDir();
|
||||
//
|
||||
//#ifdef LL_WINDOWS
|
||||
// boost::filesystem::path b_path(utf8str_to_utf16str(lastSnapshotDir));
|
||||
//#else
|
||||
// boost::filesystem::path b_path(lastSnapshotDir);
|
||||
//#endif
|
||||
// boost::filesystem::space_info b_space = boost::filesystem::space(b_path);
|
||||
// if (b_space.free < mFormattedImage->getDataSize())
|
||||
// {
|
||||
// LLSD args;
|
||||
// args["PATH"] = lastSnapshotDir;
|
||||
//
|
||||
// std::string needM_bytes_string;
|
||||
// LLResMgr::getInstance()->getIntegerString(needM_bytes_string, (mFormattedImage->getDataSize()) >> 10);
|
||||
// args["NEED_MEMORY"] = needM_bytes_string;
|
||||
//
|
||||
// std::string freeM_bytes_string;
|
||||
// LLResMgr::getInstance()->getIntegerString(freeM_bytes_string, (b_space.free) >> 10);
|
||||
// args["FREE_MEMORY"] = freeM_bytes_string;
|
||||
//
|
||||
// LLNotificationsUtil::add("SnapshotToComputerFailed", args);
|
||||
// return false;
|
||||
// }
|
||||
// }
|
||||
// return success;
|
||||
//}
|
||||
|
||||
void LLSnapshotLivePreview::saveLocal(boost::function<void(bool)> callback)
|
||||
void LLSnapshotLivePreview::saveLocal(const snapshot_saved_signal_t::slot_type& success_cb, const snapshot_saved_signal_t::slot_type& failure_cb)
|
||||
{
|
||||
// Update mFormattedImage if necessary
|
||||
getFormattedImage();
|
||||
|
||||
// Save the formatted image
|
||||
gViewerWindow->saveImageNumbered(mFormattedImage, false, boost::bind(&LLSnapshotLivePreview::saveLocalCallback, this, _1, callback));
|
||||
// Update mFormattedImage if necessary
|
||||
getFormattedImage();
|
||||
|
||||
// Save the formatted image
|
||||
saveLocal(mFormattedImage, success_cb, failure_cb);
|
||||
}
|
||||
|
||||
void LLSnapshotLivePreview::saveLocalCallback(bool success, boost::function<void(bool)> callback)
|
||||
//Check if failed due to insufficient memory
|
||||
void LLSnapshotLivePreview::saveLocal(LLPointer<LLImageFormatted> image, const snapshot_saved_signal_t::slot_type& success_cb, const snapshot_saved_signal_t::slot_type& failure_cb)
|
||||
{
|
||||
if(success)
|
||||
{
|
||||
gViewerWindow->playSnapshotAnimAndSound();
|
||||
}
|
||||
sSaveLocalImage = image;
|
||||
|
||||
if (callback)
|
||||
{
|
||||
callback(success);
|
||||
}
|
||||
gViewerWindow->saveImageNumbered(sSaveLocalImage, FALSE, success_cb, failure_cb);
|
||||
}
|
||||
// </FS:Ansariel>
|
||||
|
|
|
|||
|
|
@ -40,8 +40,9 @@ class LLSnapshotLivePreview : public LLView
|
|||
{
|
||||
LOG_CLASS(LLSnapshotLivePreview);
|
||||
public:
|
||||
typedef boost::signals2::signal<void(void)> snapshot_saved_signal_t;
|
||||
|
||||
//static BOOL saveLocal(LLPointer<LLImageFormatted>); // <FS:Ansariel> Threaded filepickers
|
||||
static void saveLocal(LLPointer<LLImageFormatted> image, const snapshot_saved_signal_t::slot_type& success_cb = snapshot_saved_signal_t(), const snapshot_saved_signal_t::slot_type& failure_cb = snapshot_saved_signal_t());
|
||||
struct Params : public LLInitParam::Block<Params, LLView::Params>
|
||||
{
|
||||
Params()
|
||||
|
|
@ -104,11 +105,7 @@ public:
|
|||
std::string getFilter() const { return mFilterName; }
|
||||
void updateSnapshot(BOOL new_snapshot, BOOL new_thumbnail = FALSE, F32 delay = 0.f);
|
||||
void saveTexture(BOOL outfit_snapshot = FALSE, std::string name = "");
|
||||
// <FS:Ansariel> Threaded filepickers
|
||||
//BOOL saveLocal();
|
||||
void saveLocal(boost::function<void(bool)> callback);
|
||||
void saveLocalCallback(bool success, boost::function<void(bool)> callback);
|
||||
// </FS:Ansariel>
|
||||
void saveLocal(const snapshot_saved_signal_t::slot_type& success_cb, const snapshot_saved_signal_t::slot_type& failure_cb);
|
||||
|
||||
LLPointer<LLImageFormatted> getFormattedImage();
|
||||
LLPointer<LLImageRaw> getEncodedImage();
|
||||
|
|
@ -184,7 +181,9 @@ private:
|
|||
LLQuaternion mCameraRot;
|
||||
BOOL mSnapshotActive;
|
||||
LLSnapshotModel::ESnapshotLayerType mSnapshotBufferType;
|
||||
std::string mFilterName;
|
||||
std::string mFilterName;
|
||||
|
||||
static LLPointer<LLImageFormatted> sSaveLocalImage;
|
||||
|
||||
public:
|
||||
static std::set<LLSnapshotLivePreview*> sList;
|
||||
|
|
|
|||
|
|
@ -294,6 +294,7 @@ static bool mLoginStatePastUI = false;
|
|||
|
||||
const S32 DEFAULT_MAX_AGENT_GROUPS = 42;
|
||||
const S32 ALLOWED_MAX_AGENT_GROUPS = 500;
|
||||
const F32 STATE_AGENT_WAIT_TIMEOUT = 240; //seconds
|
||||
|
||||
boost::scoped_ptr<LLEventPump> LLStartUp::sStateWatcher(new LLEventStream("StartupState"));
|
||||
boost::scoped_ptr<LLStartupListener> LLStartUp::sListener(new LLStartupListener());
|
||||
|
|
@ -697,9 +698,6 @@ bool idle_startup()
|
|||
gSavedSettings.setS32("LastFeatureVersion", LLFeatureManager::getInstance()->getVersion());
|
||||
gSavedSettings.setString("LastGPUString", thisGPU);
|
||||
|
||||
// <FS:Ansariel> Re-enable feature table download
|
||||
LLFeatureManager::getInstance()->fetchHTTPTables();
|
||||
|
||||
std::string xml_file = LLUI::locateSkin("xui_version.xml");
|
||||
LLXMLNodePtr root;
|
||||
bool xml_ok = false;
|
||||
|
|
@ -1468,6 +1466,14 @@ bool idle_startup()
|
|||
gSavedPerAccountSettings.setString("InstantMessageLogPath", gDirUtilp->getChatLogsDir());
|
||||
}
|
||||
// </FS:KC>
|
||||
|
||||
// <FS:LO> FIRE-22853 Make snapshots to disk not remember path and filename if the user doesnt want them to.
|
||||
if (!gSavedPerAccountSettings.getBOOL("FSRememberSnapshotPathSessions"))
|
||||
{
|
||||
gSavedPerAccountSettings.setString("SnapshotBaseDir", gSavedPerAccountSettings.getControl("SnapshotBaseDir")->getDefault().asString());
|
||||
gSavedPerAccountSettings.setString("SnapshotBaseName", gSavedPerAccountSettings.getControl("SnapshotBaseName")->getDefault().asString());
|
||||
}
|
||||
// </FS:LO>
|
||||
// <FS:CR> Seperate user directories per grid on OS build
|
||||
#ifdef OPENSIM
|
||||
gDirUtilp->setPerAccountChatLogsDir(userid, gridlabel);
|
||||
|
|
@ -2333,6 +2339,13 @@ bool idle_startup()
|
|||
LLStartUp::setStartupState( STATE_INVENTORY_SEND );
|
||||
}
|
||||
display_startup();
|
||||
|
||||
if (!gAgentMovementCompleted && timeout.getElapsedTimeF32() > STATE_AGENT_WAIT_TIMEOUT)
|
||||
{
|
||||
LL_WARNS("AppInit") << "Backing up to login screen!" << LL_ENDL;
|
||||
LLNotificationsUtil::add("LoginPacketNeverReceived", LLSD(), LLSD(), login_alert_status);
|
||||
reset_login();
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -615,7 +615,7 @@ bool LLTextureCacheRemoteWorker::doWrite()
|
|||
if(idx >= 0)
|
||||
{
|
||||
// write to the fast cache.
|
||||
if(!mCache->writeToFastCache(idx, mRawImage, mRawDiscardLevel))
|
||||
if(!mCache->writeToFastCache(mID, idx, mRawImage, mRawDiscardLevel))
|
||||
{
|
||||
LL_WARNS() << "writeToFastCache failed" << LL_ENDL;
|
||||
mDataSize = -1; // failed
|
||||
|
|
@ -2036,8 +2036,48 @@ LLPointer<LLImageRaw> LLTextureCache::readFromFastCache(const LLUUID& id, S32& d
|
|||
return raw;
|
||||
}
|
||||
|
||||
#if LL_WINDOWS
|
||||
|
||||
static const U32 STATUS_MSC_EXCEPTION = 0xE06D7363; // compiler specific
|
||||
|
||||
U32 exception_dupe_filter(U32 code, struct _EXCEPTION_POINTERS *exception_infop)
|
||||
{
|
||||
if (code == STATUS_MSC_EXCEPTION)
|
||||
{
|
||||
// C++ exception, go on
|
||||
return EXCEPTION_CONTINUE_SEARCH;
|
||||
}
|
||||
else
|
||||
{
|
||||
// handle it
|
||||
return EXCEPTION_EXECUTE_HANDLER;
|
||||
}
|
||||
}
|
||||
|
||||
//due to unwinding
|
||||
void dupe(LLPointer<LLImageRaw> &raw)
|
||||
{
|
||||
raw = raw->duplicate();
|
||||
}
|
||||
|
||||
void logExceptionDupplicate(LLPointer<LLImageRaw> &raw)
|
||||
{
|
||||
__try
|
||||
{
|
||||
dupe(raw);
|
||||
}
|
||||
__except (exception_dupe_filter(GetExceptionCode(), GetExceptionInformation()))
|
||||
{
|
||||
// convert to C++ styled exception
|
||||
char integer_string[32];
|
||||
sprintf(integer_string, "SEH, code: %lu\n", GetExceptionCode());
|
||||
throw std::exception(integer_string);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
//return the fast cache location
|
||||
bool LLTextureCache::writeToFastCache(S32 id, LLPointer<LLImageRaw> raw, S32 discardlevel)
|
||||
bool LLTextureCache::writeToFastCache(LLUUID image_id, S32 id, LLPointer<LLImageRaw> raw, S32 discardlevel)
|
||||
{
|
||||
//rescale image if needed
|
||||
if (raw.isNull() || raw->isBufferInvalid() || !raw->getData())
|
||||
|
|
@ -2065,7 +2105,31 @@ bool LLTextureCache::writeToFastCache(S32 id, LLPointer<LLImageRaw> raw, S32 dis
|
|||
if(w * h *c > 0) //valid
|
||||
{
|
||||
//make a duplicate to keep the original raw image untouched.
|
||||
raw = raw->duplicate();
|
||||
|
||||
try
|
||||
{
|
||||
#if LL_WINDOWS
|
||||
// Temporary diagnostics for scale/duplicate crash
|
||||
logExceptionDupplicate(raw);
|
||||
#else
|
||||
raw = raw->duplicate();
|
||||
#endif
|
||||
}
|
||||
catch (...)
|
||||
{
|
||||
removeFromCache(image_id);
|
||||
LL_ERRS() << "Failed to cache image: " << image_id
|
||||
<< " local id: " << id
|
||||
<< " Exception: " << boost::current_exception_diagnostic_information()
|
||||
<< " Image new width: " << w
|
||||
<< " Image new height: " << h
|
||||
<< " Image new components: " << c
|
||||
<< " Image discard difference: " << i
|
||||
<< LL_ENDL;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
if (raw->isBufferInvalid())
|
||||
{
|
||||
LL_WARNS() << "Invalid image duplicate buffer" << LL_ENDL;
|
||||
|
|
|
|||
|
|
@ -179,7 +179,7 @@ private:
|
|||
|
||||
void openFastCache(bool first_time = false);
|
||||
void closeFastCache(bool forced = false);
|
||||
bool writeToFastCache(S32 id, LLPointer<LLImageRaw> raw, S32 discardlevel);
|
||||
bool writeToFastCache(LLUUID image_id, S32 cache_id, LLPointer<LLImageRaw> raw, S32 discardlevel);
|
||||
|
||||
private:
|
||||
// Internal
|
||||
|
|
|
|||
|
|
@ -271,7 +271,7 @@ LLToolDragAndDrop::LLDragAndDropDictionary::LLDragAndDropDictionary()
|
|||
addEntry(DAD_CLOTHING, new DragAndDropEntry(&LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dWearItem, &LLToolDragAndDrop::dad3dGiveInventory, &LLToolDragAndDrop::dad3dUpdateInventory, &LLToolDragAndDrop::dad3dNULL));
|
||||
addEntry(DAD_OBJECT, new DragAndDropEntry(&LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dRezAttachmentFromInv, &LLToolDragAndDrop::dad3dGiveInventoryObject, &LLToolDragAndDrop::dad3dRezObjectOnObject, &LLToolDragAndDrop::dad3dRezObjectOnLand));
|
||||
addEntry(DAD_NOTECARD, new DragAndDropEntry(&LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dGiveInventory, &LLToolDragAndDrop::dad3dUpdateInventory, &LLToolDragAndDrop::dad3dNULL));
|
||||
addEntry(DAD_CATEGORY, new DragAndDropEntry(&LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dWearCategory, &LLToolDragAndDrop::dad3dGiveInventoryCategory, &LLToolDragAndDrop::dad3dUpdateInventoryCategory, &LLToolDragAndDrop::dad3dNULL));
|
||||
addEntry(DAD_CATEGORY, new DragAndDropEntry(&LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dWearCategory, &LLToolDragAndDrop::dad3dGiveInventoryCategory, &LLToolDragAndDrop::dad3dRezCategoryOnObject, &LLToolDragAndDrop::dad3dNULL));
|
||||
addEntry(DAD_ROOT_CATEGORY, new DragAndDropEntry(&LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dNULL));
|
||||
addEntry(DAD_BODYPART, new DragAndDropEntry(&LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dWearItem, &LLToolDragAndDrop::dad3dGiveInventory, &LLToolDragAndDrop::dad3dUpdateInventory, &LLToolDragAndDrop::dad3dNULL));
|
||||
addEntry(DAD_ANIMATION, new DragAndDropEntry(&LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dGiveInventory, &LLToolDragAndDrop::dad3dUpdateInventory, &LLToolDragAndDrop::dad3dNULL));
|
||||
|
|
@ -2421,6 +2421,21 @@ EAcceptance LLToolDragAndDrop::dad3dUpdateInventoryCategory(
|
|||
return rv;
|
||||
}
|
||||
|
||||
|
||||
EAcceptance LLToolDragAndDrop::dad3dRezCategoryOnObject(
|
||||
LLViewerObject* obj, S32 face, MASK mask, BOOL drop)
|
||||
{
|
||||
if ((mask & MASK_CONTROL))
|
||||
{
|
||||
return dad3dUpdateInventoryCategory(obj, face, mask, drop);
|
||||
}
|
||||
else
|
||||
{
|
||||
return ACCEPT_NO;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
BOOL LLToolDragAndDrop::dadUpdateInventoryCategory(LLViewerObject* obj,
|
||||
BOOL drop)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -162,6 +162,8 @@ protected:
|
|||
MASK mask, BOOL drop);
|
||||
EAcceptance dad3dRezObjectOnObject(LLViewerObject* obj, S32 face,
|
||||
MASK mask, BOOL drop);
|
||||
EAcceptance dad3dRezCategoryOnObject(LLViewerObject* obj, S32 face,
|
||||
MASK mask, BOOL drop);
|
||||
EAcceptance dad3dRezScript(LLViewerObject* obj, S32 face,
|
||||
MASK mask, BOOL drop);
|
||||
EAcceptance dad3dTextureObject(LLViewerObject* obj, S32 face,
|
||||
|
|
|
|||
|
|
@ -325,6 +325,8 @@ BOOL LLToolPie::handleLeftClickPick()
|
|||
}
|
||||
}
|
||||
return TRUE;
|
||||
case CLICK_ACTION_DISABLED:
|
||||
return TRUE;
|
||||
default:
|
||||
// nothing
|
||||
break;
|
||||
|
|
@ -509,6 +511,8 @@ ECursorType LLToolPie::cursorFromObject(LLViewerObject* object)
|
|||
case CLICK_ACTION_OPEN_MEDIA:
|
||||
cursor = cursor_from_parcel_media(click_action);
|
||||
break;
|
||||
case CLICK_ACTION_DISABLED:
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
|
@ -574,6 +578,8 @@ void LLToolPie::selectionPropertiesReceived()
|
|||
case CLICK_ACTION_OPEN:
|
||||
LLFloaterReg::showInstance("openobject");
|
||||
break;
|
||||
case CLICK_ACTION_DISABLED:
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -34,6 +34,7 @@
|
|||
#include "llcompilequeue.h"
|
||||
#include "llfasttimerview.h"
|
||||
#include "llfloaterabout.h"
|
||||
#include "llfloaterauction.h"
|
||||
#include "llfloaterautoreplacesettings.h"
|
||||
#include "llfloateravatar.h"
|
||||
#include "llfloateravatarpicker.h"
|
||||
|
|
@ -200,7 +201,6 @@
|
|||
#include "fspanelclassified.h"
|
||||
#include "lggbeamcolormapfloater.h"
|
||||
#include "lggbeammapfloater.h"
|
||||
#include "llfloaterauction.h"
|
||||
#include "llfloaterdisplayname.h"
|
||||
#include "llfloaterscriptrecover.h"
|
||||
#include "llfloatersearchreplace.h"
|
||||
|
|
@ -241,6 +241,7 @@ void LLViewerFloaterReg::registerFloaters()
|
|||
LLFloaterReg::add("about_land", "floater_about_land.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterLand>);
|
||||
LLFloaterReg::add("appearance", "floater_my_appearance.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterSidePanelContainer>);
|
||||
LLFloaterReg::add("associate_listing", "floater_associate_listing.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterAssociateListing>);
|
||||
LLFloaterReg::add("auction", "floater_auction.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterAuction>);
|
||||
LLFloaterReg::add("avatar", "floater_avatar.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterAvatar>);
|
||||
LLFloaterReg::add("avatar_picker", "floater_avatar_picker.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterAvatarPicker>);
|
||||
// <FS:Ansariel> [FS Persisted Avatar Render Settings]
|
||||
|
|
@ -453,7 +454,6 @@ void LLViewerFloaterReg::registerFloaters()
|
|||
LLFloaterReg::add("animation_explorer", "floater_animation_explorer.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<AnimationExplorer>);
|
||||
LLFloaterReg::add("animation_overrider", "floater_ao.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<FloaterAO>);
|
||||
LLFloaterReg::add("area_search", "floater_fs_area_search.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<FSAreaSearch>);
|
||||
LLFloaterReg::add("auction", "floater_auction.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterAuction>);
|
||||
LLFloaterReg::add("export_collada", "floater_export_collada.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<ColladaExportFloater>);
|
||||
LLFloaterReg::add("delete_queue", "floater_script_queue.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterDeleteQueue>);
|
||||
LLFloaterReg::add("floater_profile", "floater_profile_view.xml",&LLFloaterReg::build<FSFloaterProfile>);
|
||||
|
|
|
|||
|
|
@ -1583,6 +1583,7 @@ LLViewerMediaImpl::LLViewerMediaImpl( const LLUUID& texture_id,
|
|||
mNavigateServerRequest(false),
|
||||
mMediaSourceFailed(false),
|
||||
mRequestedVolume(1.0f),
|
||||
mPreviousVolume(1.0f),
|
||||
mIsMuted(false),
|
||||
mNeedsMuteCheck(false),
|
||||
mPreviousMediaState(MEDIA_NONE),
|
||||
|
|
@ -2126,6 +2127,20 @@ void LLViewerMediaImpl::setVolume(F32 volume)
|
|||
updateVolume();
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////////////////
|
||||
void LLViewerMediaImpl::setMute(bool mute)
|
||||
{
|
||||
if (mute)
|
||||
{
|
||||
mPreviousVolume = mRequestedVolume;
|
||||
setVolume(0.0);
|
||||
}
|
||||
else
|
||||
{
|
||||
setVolume(mPreviousVolume);
|
||||
}
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////////////////
|
||||
void LLViewerMediaImpl::updateVolume()
|
||||
{
|
||||
|
|
|
|||
|
|
@ -216,6 +216,7 @@ public:
|
|||
void skipBack(F32 step_scale);
|
||||
void skipForward(F32 step_scale);
|
||||
void setVolume(F32 volume);
|
||||
void setMute(bool mute);
|
||||
void updateVolume();
|
||||
F32 getVolume();
|
||||
void focus(bool focus);
|
||||
|
|
@ -448,6 +449,7 @@ private:
|
|||
bool mNavigateServerRequest;
|
||||
bool mMediaSourceFailed;
|
||||
F32 mRequestedVolume;
|
||||
F32 mPreviousVolume;
|
||||
bool mIsMuted;
|
||||
bool mNeedsMuteCheck;
|
||||
int mPreviousMediaState;
|
||||
|
|
|
|||
|
|
@ -138,6 +138,7 @@
|
|||
#include "llpathfindingmanager.h"
|
||||
#include "llstartup.h"
|
||||
#include "boost/unordered_map.hpp"
|
||||
#include <boost/regex.hpp>
|
||||
#include "llcleanup.h"
|
||||
// [RLVa:KB] - Checked: 2011-05-22 (RLVa-1.3.1a)
|
||||
#include "fsavatarrenderpersistence.h"
|
||||
|
|
@ -4548,12 +4549,19 @@ class LLSelfSitDown : public view_listener_t
|
|||
}
|
||||
};
|
||||
|
||||
|
||||
|
||||
bool show_sitdown_self()
|
||||
{
|
||||
return isAgentAvatarValid() && !gAgentAvatarp->isSitting();
|
||||
}
|
||||
|
||||
bool enable_sitdown_self()
|
||||
{
|
||||
// [RLVa:KB] - Checked: 2010-08-28 (RLVa-1.2.1a) | Added: RLVa-1.2.1a
|
||||
return isAgentAvatarValid() && !gAgentAvatarp->isSitting() && !gAgentAvatarp->isEditingAppearance() && !gAgent.getFlying() && !gRlvHandler.hasBehaviour(RLV_BHVR_SIT);
|
||||
return show_sitdown_self() && !gAgentAvatarp->isEditingAppearance() && !gAgent.getFlying() && !gRlvHandler.hasBehaviour(RLV_BHVR_SIT);
|
||||
// [/RLVa:KB]
|
||||
// return isAgentAvatarValid() && !gAgentAvatarp->isSitting() && !gAgentAvatarp->isEditingAppearance() && !gAgent.getFlying();
|
||||
// return show_sitdown_self() && !gAgentAvatarp->isEditingAppearance() && !gAgent.getFlying();
|
||||
}
|
||||
|
||||
// Force sit -KC
|
||||
|
|
@ -10254,11 +10262,15 @@ void handle_report_bug(const LLSD& param)
|
|||
|
||||
LLStringUtil::format_map_t replace;
|
||||
// <FS:Ansariel> FIRE-14001: JIRA report is being cut off when using Help -> Report Bug
|
||||
//replace["[ENVIRONMENT]"] = LLURI::escape(LLAppViewer::instance()->getViewerInfoString(true));
|
||||
//std::string environment = LLAppViewer::instance()->getViewerInfoString(true);
|
||||
//boost::regex regex;
|
||||
//regex.assign("</?nolink>");
|
||||
//std::string stripped_env = boost::regex_replace(environment, regex, "");
|
||||
|
||||
//replace["[ENVIRONMENT]"] = LLURI::escape(stripped_env);
|
||||
LLSD sysinfo = FSData::getSystemInfo();
|
||||
replace["[ENVIRONMENT]"] = LLURI::escape(sysinfo["Part1"].asString().substr(1) + sysinfo["Part2"].asString().substr(1));
|
||||
// </FS:Ansariel>
|
||||
|
||||
LLSLURL location_url;
|
||||
LLAgentUI::buildSLURL(location_url);
|
||||
replace["[LOCATION]"] = LLURI::escape(location_url.getSLURLString());
|
||||
|
|
@ -11613,7 +11625,8 @@ void initialize_menus()
|
|||
view_listener_t::addMenu(new LLSelfStandUp(), "Self.StandUp");
|
||||
enable.add("Self.EnableStandUp", boost::bind(&enable_standup_self));
|
||||
view_listener_t::addMenu(new LLSelfSitDown(), "Self.SitDown");
|
||||
enable.add("Self.EnableSitDown", boost::bind(&enable_sitdown_self));
|
||||
enable.add("Self.EnableSitDown", boost::bind(&enable_sitdown_self));
|
||||
enable.add("Self.ShowSitDown", boost::bind(&show_sitdown_self));
|
||||
view_listener_t::addMenu(new FSSelfForceSit(), "Self.ForceSit"); //KC
|
||||
enable.add("Self.EnableForceSit", boost::bind(&enable_forcesit_self)); //KC
|
||||
view_listener_t::addMenu(new FSSelfCheckForceSit(), "Self.getForceSit"); //KC
|
||||
|
|
|
|||
|
|
@ -209,38 +209,55 @@ void LLFilePickerThread::clearDead()
|
|||
}
|
||||
}
|
||||
|
||||
LLFilePickerReplyThread::LLFilePickerReplyThread(const file_picked_signal_t::slot_type& cb, LLFilePicker::ELoadFilter filter, bool get_multiple)
|
||||
LLFilePickerReplyThread::LLFilePickerReplyThread(const file_picked_signal_t::slot_type& cb, LLFilePicker::ELoadFilter filter, bool get_multiple, const file_picked_signal_t::slot_type& failure_cb)
|
||||
: LLFilePickerThread(filter, get_multiple),
|
||||
mLoadFilter(filter),
|
||||
mSaveFilter(LLFilePicker::FFSAVE_ALL),
|
||||
mFilePickedSignal(NULL)
|
||||
mFilePickedSignal(NULL),
|
||||
mFailureSignal(NULL)
|
||||
{
|
||||
mFilePickedSignal = new file_picked_signal_t();
|
||||
mFilePickedSignal->connect(cb);
|
||||
|
||||
mFailureSignal = new file_picked_signal_t();
|
||||
mFailureSignal->connect(failure_cb);
|
||||
}
|
||||
|
||||
LLFilePickerReplyThread::LLFilePickerReplyThread(const file_picked_signal_t::slot_type& cb, LLFilePicker::ESaveFilter filter, const std::string &proposed_name)
|
||||
LLFilePickerReplyThread::LLFilePickerReplyThread(const file_picked_signal_t::slot_type& cb, LLFilePicker::ESaveFilter filter, const std::string &proposed_name, const file_picked_signal_t::slot_type& failure_cb)
|
||||
: LLFilePickerThread(filter, proposed_name),
|
||||
mLoadFilter(LLFilePicker::FFLOAD_ALL),
|
||||
mSaveFilter(filter),
|
||||
mFilePickedSignal(NULL)
|
||||
mFilePickedSignal(NULL),
|
||||
mFailureSignal(NULL)
|
||||
{
|
||||
mFilePickedSignal = new file_picked_signal_t();
|
||||
mFilePickedSignal->connect(cb);
|
||||
|
||||
mFailureSignal = new file_picked_signal_t();
|
||||
mFailureSignal->connect(failure_cb);
|
||||
}
|
||||
|
||||
LLFilePickerReplyThread::~LLFilePickerReplyThread()
|
||||
{
|
||||
delete mFilePickedSignal;
|
||||
delete mFailureSignal;
|
||||
}
|
||||
|
||||
void LLFilePickerReplyThread::notify(const std::vector<std::string>& filenames)
|
||||
{
|
||||
if (filenames.empty()) return;
|
||||
|
||||
if (mFilePickedSignal)
|
||||
if (filenames.empty())
|
||||
{
|
||||
(*mFilePickedSignal)(filenames, mLoadFilter, mSaveFilter);
|
||||
if (mFailureSignal)
|
||||
{
|
||||
(*mFailureSignal)(filenames, mLoadFilter, mSaveFilter);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (mFilePickedSignal)
|
||||
{
|
||||
(*mFilePickedSignal)(filenames, mLoadFilter, mSaveFilter);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -597,18 +614,6 @@ class LLFileCloseAllWindows : public view_listener_t
|
|||
}
|
||||
};
|
||||
|
||||
// <FS:Ansariel> Threaded filepickers
|
||||
LLPointer<LLImageFormatted> sFormattedSnapshotImage = NULL;
|
||||
void take_snapshot_to_disk_callback(bool success)
|
||||
{
|
||||
sFormattedSnapshotImage = NULL;
|
||||
if (success)
|
||||
{
|
||||
gViewerWindow->playSnapshotAnimAndSound();
|
||||
}
|
||||
}
|
||||
// </FS:Ansariel>
|
||||
|
||||
class LLFileTakeSnapshotToDisk : public view_listener_t
|
||||
{
|
||||
bool handleEvent(const LLSD& userdata)
|
||||
|
|
@ -632,49 +637,26 @@ class LLFileTakeSnapshotToDisk : public view_listener_t
|
|||
gSavedSettings.getBOOL("RenderUIInSnapshot"),
|
||||
FALSE))
|
||||
{
|
||||
// <FS:Ansariel> Threaded filepickers
|
||||
//gViewerWindow->playSnapshotAnimAndSound();
|
||||
//LLPointer<LLImageFormatted> formatted;
|
||||
//LLSnapshotModel::ESnapshotFormat fmt = (LLSnapshotModel::ESnapshotFormat) gSavedSettings.getS32("SnapshotFormat");
|
||||
//switch (fmt)
|
||||
//{
|
||||
//case LLSnapshotModel::SNAPSHOT_FORMAT_JPEG:
|
||||
// formatted = new LLImageJPEG(gSavedSettings.getS32("SnapshotQuality"));
|
||||
// break;
|
||||
//default:
|
||||
// LL_WARNS() << "Unknown local snapshot format: " << fmt << LL_ENDL;
|
||||
//case LLSnapshotModel::SNAPSHOT_FORMAT_PNG:
|
||||
// formatted = new LLImagePNG;
|
||||
// break;
|
||||
//case LLSnapshotModel::SNAPSHOT_FORMAT_BMP:
|
||||
// formatted = new LLImageBMP;
|
||||
// break;
|
||||
//}
|
||||
//formatted->enableOverSize() ;
|
||||
//formatted->encode(raw, 0);
|
||||
//formatted->disableOverSize() ;
|
||||
//LLSnapshotLivePreview::saveLocal(formatted);
|
||||
|
||||
LLPointer<LLImageFormatted> formatted;
|
||||
LLSnapshotModel::ESnapshotFormat fmt = (LLSnapshotModel::ESnapshotFormat) gSavedSettings.getS32("SnapshotFormat");
|
||||
switch (fmt)
|
||||
{
|
||||
case LLSnapshotModel::SNAPSHOT_FORMAT_JPEG:
|
||||
sFormattedSnapshotImage = new LLImageJPEG(gSavedSettings.getS32("SnapshotQuality"));
|
||||
formatted = new LLImageJPEG(gSavedSettings.getS32("SnapshotQuality"));
|
||||
break;
|
||||
default:
|
||||
LL_WARNS() << "Unknown local snapshot format: " << fmt << LL_ENDL;
|
||||
case LLSnapshotModel::SNAPSHOT_FORMAT_PNG:
|
||||
sFormattedSnapshotImage = new LLImagePNG;
|
||||
formatted = new LLImagePNG;
|
||||
break;
|
||||
case LLSnapshotModel::SNAPSHOT_FORMAT_BMP:
|
||||
sFormattedSnapshotImage = new LLImageBMP;
|
||||
formatted = new LLImageBMP;
|
||||
break;
|
||||
}
|
||||
sFormattedSnapshotImage->enableOverSize() ;
|
||||
sFormattedSnapshotImage->encode(raw, 0);
|
||||
sFormattedSnapshotImage->disableOverSize() ;
|
||||
gViewerWindow->saveImageNumbered(sFormattedSnapshotImage, false, boost::bind(&take_snapshot_to_disk_callback, _1));
|
||||
// </FS:Ansariel>
|
||||
formatted->enableOverSize() ;
|
||||
formatted->encode(raw, 0);
|
||||
formatted->disableOverSize() ;
|
||||
LLSnapshotLivePreview::saveLocal(formatted);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -114,8 +114,8 @@ public:
|
|||
|
||||
typedef boost::signals2::signal<void(const std::vector<std::string>& filenames, LLFilePicker::ELoadFilter load_filter, LLFilePicker::ESaveFilter save_filter)> file_picked_signal_t;
|
||||
|
||||
LLFilePickerReplyThread(const file_picked_signal_t::slot_type& cb, LLFilePicker::ELoadFilter filter, bool get_multiple);
|
||||
LLFilePickerReplyThread(const file_picked_signal_t::slot_type& cb, LLFilePicker::ESaveFilter filter, const std::string &proposed_name);
|
||||
LLFilePickerReplyThread(const file_picked_signal_t::slot_type& cb, LLFilePicker::ELoadFilter filter, bool get_multiple, const file_picked_signal_t::slot_type& failure_cb = file_picked_signal_t());
|
||||
LLFilePickerReplyThread(const file_picked_signal_t::slot_type& cb, LLFilePicker::ESaveFilter filter, const std::string &proposed_name, const file_picked_signal_t::slot_type& failure_cb = file_picked_signal_t());
|
||||
~LLFilePickerReplyThread();
|
||||
|
||||
virtual void notify(const std::vector<std::string>& filenames);
|
||||
|
|
@ -124,6 +124,7 @@ private:
|
|||
LLFilePicker::ELoadFilter mLoadFilter;
|
||||
LLFilePicker::ESaveFilter mSaveFilter;
|
||||
file_picked_signal_t* mFilePickedSignal;
|
||||
file_picked_signal_t* mFailureSignal;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -185,6 +185,98 @@ const U8 AU_FLAGS_NONE = 0x00;
|
|||
const U8 AU_FLAGS_HIDETITLE = 0x01;
|
||||
const U8 AU_FLAGS_CLIENT_AUTOPILOT = 0x02;
|
||||
|
||||
void accept_friendship_coro(std::string url, LLSD notification)
|
||||
{
|
||||
LLCore::HttpRequest::policy_t httpPolicy(LLCore::HttpRequest::DEFAULT_POLICY_ID);
|
||||
LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t
|
||||
httpAdapter(new LLCoreHttpUtil::HttpCoroutineAdapter("friendshipResponceErrorProcessing", httpPolicy));
|
||||
LLCore::HttpRequest::ptr_t httpRequest(new LLCore::HttpRequest);
|
||||
if (url.empty())
|
||||
{
|
||||
LL_WARNS("Friendship") << "Empty capability!" << LL_ENDL;
|
||||
return;
|
||||
}
|
||||
|
||||
LLSD payload = notification["payload"];
|
||||
url += "?from=" + payload["from_id"].asString();
|
||||
url += "&agent_name=\"" + LLURI::escape(gAgentAvatarp->getFullname()) + "\"";
|
||||
|
||||
LLSD result = httpAdapter->getAndSuspend(httpRequest, url);
|
||||
|
||||
LLSD httpResults = result[LLCoreHttpUtil::HttpCoroutineAdapter::HTTP_RESULTS];
|
||||
LLCore::HttpStatus status = LLCoreHttpUtil::HttpCoroutineAdapter::getStatusFromLLSD(httpResults);
|
||||
|
||||
if (!status)
|
||||
{
|
||||
LL_WARNS("Friendship") << "HTTP status, " << status.toTerseString() <<
|
||||
". friendship offer accept failed." << LL_ENDL;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (!result.has("success") || result["success"].asBoolean() == false)
|
||||
{
|
||||
LL_WARNS("Friendship") << "Server failed to process accepted friendship. " << httpResults << LL_ENDL;
|
||||
}
|
||||
else
|
||||
{
|
||||
LL_DEBUGS("Friendship") << "Adding friend to list" << httpResults << LL_ENDL;
|
||||
// add friend to recent people list
|
||||
LLRecentPeople::instance().add(payload["from_id"]);
|
||||
|
||||
LLNotificationsUtil::add("FriendshipAcceptedByMe",
|
||||
notification["substitutions"], payload);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void decline_friendship_coro(std::string url, LLSD notification, S32 option)
|
||||
{
|
||||
if (url.empty())
|
||||
{
|
||||
LL_WARNS("Friendship") << "Empty capability!" << LL_ENDL;
|
||||
return;
|
||||
}
|
||||
LLCore::HttpRequest::policy_t httpPolicy(LLCore::HttpRequest::DEFAULT_POLICY_ID);
|
||||
LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t
|
||||
httpAdapter(new LLCoreHttpUtil::HttpCoroutineAdapter("friendshipResponceErrorProcessing", httpPolicy));
|
||||
LLCore::HttpRequest::ptr_t httpRequest(new LLCore::HttpRequest);
|
||||
|
||||
LLSD payload = notification["payload"];
|
||||
url += "?from=" + payload["from_id"].asString();
|
||||
|
||||
LLSD result = httpAdapter->getAndSuspend(httpRequest, url);
|
||||
|
||||
LLSD httpResults = result[LLCoreHttpUtil::HttpCoroutineAdapter::HTTP_RESULTS];
|
||||
LLCore::HttpStatus status = LLCoreHttpUtil::HttpCoroutineAdapter::getStatusFromLLSD(httpResults);
|
||||
|
||||
if (!status)
|
||||
{
|
||||
LL_WARNS("Friendship") << "HTTP status, " << status.toTerseString() <<
|
||||
". friendship offer decline failed." << LL_ENDL;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (!result.has("success") || result["success"].asBoolean() == false)
|
||||
{
|
||||
LL_WARNS("Friendship") << "Server failed to process declined friendship. " << httpResults << LL_ENDL;
|
||||
}
|
||||
else
|
||||
{
|
||||
LL_DEBUGS("Friendship") << "Friendship declined" << httpResults << LL_ENDL;
|
||||
if (option == 1)
|
||||
{
|
||||
LLNotificationsUtil::add("FriendshipDeclinedByMe",
|
||||
notification["substitutions"], payload);
|
||||
}
|
||||
else if (option == 2)
|
||||
{
|
||||
// start IM session
|
||||
LLAvatarActions::startIM(payload["from_id"].asUUID());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
bool friendship_offer_callback(const LLSD& notification, const LLSD& response)
|
||||
{
|
||||
S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
|
||||
|
|
@ -195,9 +287,6 @@ bool friendship_offer_callback(const LLSD& notification, const LLSD& response)
|
|||
// this will be skipped if the user offering friendship is blocked
|
||||
if (notification_ptr)
|
||||
{
|
||||
// add friend to recent people list
|
||||
LLRecentPeople::instance().add(payload["from_id"]);
|
||||
|
||||
switch(option)
|
||||
{
|
||||
case 0:
|
||||
|
|
@ -208,46 +297,79 @@ bool friendship_offer_callback(const LLSD& notification, const LLSD& response)
|
|||
const LLUUID fid = gInventory.findCategoryUUIDForType(LLFolderType::FT_CALLINGCARD);
|
||||
|
||||
// This will also trigger an onlinenotification if the user is online
|
||||
msg->newMessageFast(_PREHASH_AcceptFriendship);
|
||||
msg->nextBlockFast(_PREHASH_AgentData);
|
||||
msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
|
||||
msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
|
||||
msg->nextBlockFast(_PREHASH_TransactionBlock);
|
||||
msg->addUUIDFast(_PREHASH_TransactionID, payload["session_id"]);
|
||||
msg->nextBlockFast(_PREHASH_FolderData);
|
||||
msg->addUUIDFast(_PREHASH_FolderID, fid);
|
||||
msg->sendReliable(LLHost(payload["sender"].asString()));
|
||||
std::string url = gAgent.getRegionCapability("AcceptFriendship");
|
||||
LL_DEBUGS("Friendship") << "Cap string: " << url << LL_ENDL;
|
||||
if (!url.empty() && payload.has("online") && payload["online"].asBoolean() == false)
|
||||
{
|
||||
LL_DEBUGS("Friendship") << "Accepting friendship via capability" << LL_ENDL;
|
||||
LLCoros::instance().launch("LLMessageSystem::acceptFriendshipOffer",
|
||||
boost::bind(accept_friendship_coro, url, notification));
|
||||
}
|
||||
else if (payload.has("session_id") && payload["session_id"].asUUID().notNull())
|
||||
{
|
||||
LL_DEBUGS("Friendship") << "Accepting friendship via viewer message" << LL_ENDL;
|
||||
msg->newMessageFast(_PREHASH_AcceptFriendship);
|
||||
msg->nextBlockFast(_PREHASH_AgentData);
|
||||
msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
|
||||
msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
|
||||
msg->nextBlockFast(_PREHASH_TransactionBlock);
|
||||
msg->addUUIDFast(_PREHASH_TransactionID, payload["session_id"]);
|
||||
msg->nextBlockFast(_PREHASH_FolderData);
|
||||
msg->addUUIDFast(_PREHASH_FolderID, fid);
|
||||
msg->sendReliable(LLHost(payload["sender"].asString()));
|
||||
|
||||
LLSD payload = notification["payload"];
|
||||
LLNotificationsUtil::add("FriendshipAcceptedByMe",
|
||||
notification["substitutions"], payload);
|
||||
// add friend to recent people list
|
||||
LLRecentPeople::instance().add(payload["from_id"]);
|
||||
LLNotificationsUtil::add("FriendshipAcceptedByMe",
|
||||
notification["substitutions"], payload);
|
||||
}
|
||||
else
|
||||
{
|
||||
LL_WARNS("Friendship") << "Failed to accept friendship offer, neither capability nor transaction id are accessible" << LL_ENDL;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case 1: // Decline
|
||||
{
|
||||
LLSD payload = notification["payload"];
|
||||
LLNotificationsUtil::add("FriendshipDeclinedByMe",
|
||||
notification["substitutions"], payload);
|
||||
}
|
||||
// fall-through
|
||||
case 2: // Send IM - decline and start IM session
|
||||
{
|
||||
// decline
|
||||
// We no longer notify other viewers, but we DO still send
|
||||
// the rejection to the simulator to delete the pending userop.
|
||||
msg->newMessageFast(_PREHASH_DeclineFriendship);
|
||||
msg->nextBlockFast(_PREHASH_AgentData);
|
||||
msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
|
||||
msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
|
||||
msg->nextBlockFast(_PREHASH_TransactionBlock);
|
||||
msg->addUUIDFast(_PREHASH_TransactionID, payload["session_id"]);
|
||||
msg->sendReliable(LLHost(payload["sender"].asString()));
|
||||
// the rejection to the simulator to delete the pending userop.
|
||||
std::string url = gAgent.getRegionCapability("DeclineFriendship");
|
||||
LL_DEBUGS("Friendship") << "Cap string: " << url << LL_ENDL;
|
||||
if (!url.empty() && payload.has("online") && payload["online"].asBoolean() == false)
|
||||
{
|
||||
LL_DEBUGS("Friendship") << "Declining friendship via capability" << LL_ENDL;
|
||||
LLCoros::instance().launch("LLMessageSystem::declineFriendshipOffer",
|
||||
boost::bind(decline_friendship_coro, url, notification, option));
|
||||
}
|
||||
else if (payload.has("session_id") && payload["session_id"].asUUID().notNull())
|
||||
{
|
||||
LL_DEBUGS("Friendship") << "Declining friendship via viewer message" << LL_ENDL;
|
||||
msg->newMessageFast(_PREHASH_DeclineFriendship);
|
||||
msg->nextBlockFast(_PREHASH_AgentData);
|
||||
msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
|
||||
msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
|
||||
msg->nextBlockFast(_PREHASH_TransactionBlock);
|
||||
msg->addUUIDFast(_PREHASH_TransactionID, payload["session_id"]);
|
||||
msg->sendReliable(LLHost(payload["sender"].asString()));
|
||||
|
||||
// start IM session
|
||||
if(2 == option)
|
||||
{
|
||||
LLAvatarActions::startIM(payload["from_id"].asUUID());
|
||||
}
|
||||
if (option == 1) // due to fall-through
|
||||
{
|
||||
LLNotificationsUtil::add("FriendshipDeclinedByMe",
|
||||
notification["substitutions"], payload);
|
||||
}
|
||||
else if (option == 2)
|
||||
{
|
||||
// start IM session
|
||||
LLAvatarActions::startIM(payload["from_id"].asUUID());
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
LL_WARNS("Friendship") << "Failed to decline friendship offer, neither capability nor transaction id are accessible" << LL_ENDL;
|
||||
}
|
||||
}
|
||||
default:
|
||||
// close button probably, possibly timed out
|
||||
|
|
@ -653,6 +775,119 @@ void send_sound_trigger(const LLUUID& sound_id, F32 gain)
|
|||
static LLSD sSavedGroupInvite;
|
||||
static LLSD sSavedResponse;
|
||||
|
||||
void response_group_invitation_coro(std::string url, LLUUID group_id, bool notify_and_update)
|
||||
{
|
||||
if (url.empty())
|
||||
{
|
||||
LL_WARNS("GroupInvite") << "Empty capability!" << LL_ENDL;
|
||||
return;
|
||||
}
|
||||
|
||||
LLCore::HttpRequest::policy_t httpPolicy(LLCore::HttpRequest::DEFAULT_POLICY_ID);
|
||||
LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t
|
||||
httpAdapter(new LLCoreHttpUtil::HttpCoroutineAdapter("friendshipResponceErrorProcessing", httpPolicy));
|
||||
LLCore::HttpRequest::ptr_t httpRequest(new LLCore::HttpRequest);
|
||||
|
||||
LLSD payload;
|
||||
payload["group"] = group_id;
|
||||
|
||||
LLSD result = httpAdapter->postAndSuspend(httpRequest, url, payload);
|
||||
|
||||
LLSD httpResults = result[LLCoreHttpUtil::HttpCoroutineAdapter::HTTP_RESULTS];
|
||||
LLCore::HttpStatus status = LLCoreHttpUtil::HttpCoroutineAdapter::getStatusFromLLSD(httpResults);
|
||||
|
||||
if (!status)
|
||||
{
|
||||
LL_WARNS("GroupInvite") << "HTTP status, " << status.toTerseString() <<
|
||||
". Group " << group_id << " invitation response processing failed." << LL_ENDL;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (!result.has("success") || result["success"].asBoolean() == false)
|
||||
{
|
||||
LL_WARNS("GroupInvite") << "Server failed to process group " << group_id << " invitation response. " << httpResults << LL_ENDL;
|
||||
}
|
||||
else
|
||||
{
|
||||
LL_DEBUGS("GroupInvite") << "Successfully sent response to group " << group_id << " invitation" << LL_ENDL;
|
||||
if (notify_and_update)
|
||||
{
|
||||
LLNotificationsUtil::add("JoinGroupSuccess");
|
||||
gAgent.sendAgentDataUpdateRequest();
|
||||
|
||||
LLGroupMgr::getInstance()->clearGroupData(group_id);
|
||||
// refresh the floater for this group, if any.
|
||||
LLGroupActions::refresh(group_id);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void send_join_group_response(LLUUID group_id, LLUUID transaction_id, bool accept_invite, S32 fee, bool use_offline_cap, LLSD &payload)
|
||||
{
|
||||
if (accept_invite && fee > 0)
|
||||
{
|
||||
// If there is a fee to join this group, make
|
||||
// sure the user is sure they want to join.
|
||||
LLSD args;
|
||||
args["COST"] = llformat("%d", fee);
|
||||
// Set the fee for next time to 0, so that we don't keep
|
||||
// asking about a fee.
|
||||
LLSD next_payload = payload;
|
||||
next_payload["fee"] = 0;
|
||||
LLNotificationsUtil::add("JoinGroupCanAfford",
|
||||
args,
|
||||
next_payload);
|
||||
}
|
||||
else if (use_offline_cap)
|
||||
{
|
||||
std::string url;
|
||||
if (accept_invite)
|
||||
{
|
||||
url = gAgent.getRegionCapability("AcceptGroupInvite");
|
||||
}
|
||||
else
|
||||
{
|
||||
url = gAgent.getRegionCapability("DeclineGroupInvite");
|
||||
}
|
||||
|
||||
if (!url.empty())
|
||||
{
|
||||
LLCoros::instance().launch("LLMessageSystem::acceptGroupInvitation",
|
||||
boost::bind(response_group_invitation_coro, url, group_id, accept_invite));
|
||||
}
|
||||
else
|
||||
{
|
||||
// if sim has no this cap, we can do nothing - regular request will fail
|
||||
LL_WARNS("GroupInvite") << "No capability, can't reply to offline invitation!" << LL_ENDL;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
EInstantMessage type = accept_invite ? IM_GROUP_INVITATION_ACCEPT : IM_GROUP_INVITATION_DECLINE;
|
||||
|
||||
send_improved_im(group_id,
|
||||
std::string("name"),
|
||||
std::string("message"),
|
||||
IM_ONLINE,
|
||||
type,
|
||||
transaction_id);
|
||||
}
|
||||
}
|
||||
|
||||
void send_join_group_response(LLUUID group_id, LLUUID transaction_id, bool accept_invite, S32 fee, bool use_offline_cap)
|
||||
{
|
||||
LLSD payload;
|
||||
if (accept_invite)
|
||||
{
|
||||
payload["group_id"] = group_id;
|
||||
payload["transaction_id"] = transaction_id;
|
||||
payload["fee"] = fee;
|
||||
payload["use_offline_cap"] = use_offline_cap;
|
||||
}
|
||||
send_join_group_response(group_id, transaction_id, accept_invite, fee, use_offline_cap, payload);
|
||||
}
|
||||
|
||||
bool join_group_response(const LLSD& notification, const LLSD& response)
|
||||
{
|
||||
// A bit of variable saving and restoring is used to deal with the case where your group list is full and you
|
||||
|
|
@ -691,6 +926,7 @@ bool join_group_response(const LLSD& notification, const LLSD& response)
|
|||
std::string name = notification_adjusted["payload"]["name"].asString();
|
||||
std::string message = notification_adjusted["payload"]["message"].asString();
|
||||
S32 fee = notification_adjusted["payload"]["fee"].asInteger();
|
||||
U8 use_offline_cap = notification_adjusted["payload"]["use_offline_cap"].asInteger();
|
||||
|
||||
if (option == 2 && !group_id.isNull())
|
||||
{
|
||||
|
|
@ -735,42 +971,7 @@ bool join_group_response(const LLSD& notification, const LLSD& response)
|
|||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
if (accept_invite)
|
||||
{
|
||||
// If there is a fee to join this group, make
|
||||
// sure the user is sure they want to join.
|
||||
if (fee > 0)
|
||||
{
|
||||
LLSD args;
|
||||
args["COST"] = llformat("%d", fee);
|
||||
// Set the fee for next time to 0, so that we don't keep
|
||||
// asking about a fee.
|
||||
LLSD next_payload = notification_adjusted["payload"];
|
||||
next_payload["fee"] = 0;
|
||||
LLNotificationsUtil::add("JoinGroupCanAfford",
|
||||
args,
|
||||
next_payload);
|
||||
}
|
||||
else
|
||||
{
|
||||
send_improved_im(group_id,
|
||||
std::string("name"),
|
||||
std::string("message"),
|
||||
IM_ONLINE,
|
||||
IM_GROUP_INVITATION_ACCEPT,
|
||||
transaction_id);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
send_improved_im(group_id,
|
||||
std::string("name"),
|
||||
std::string("message"),
|
||||
IM_ONLINE,
|
||||
IM_GROUP_INVITATION_DECLINE,
|
||||
transaction_id);
|
||||
}
|
||||
send_join_group_response(group_id, transaction_id, accept_invite, fee, use_offline_cap, notification_adjusted["payload"]);
|
||||
|
||||
sSavedGroupInvite[id] = LLSD::emptyMap();
|
||||
sSavedResponse[id] = LLSD::emptyMap();
|
||||
|
|
@ -1804,7 +2005,7 @@ bool LLOfferInfo::inventory_offer_callback(const LLSD& notification, const LLSD&
|
|||
//don't spam them if they are getting flooded
|
||||
if (check_offer_throttle(mFromName, true))
|
||||
{
|
||||
log_message = chatHistory_string + " " + LLTrans::getString("InvOfferGaveYou") + " " + mDesc + LLTrans::getString(".");
|
||||
log_message = "<nolink>" + chatHistory_string + "</nolink> " + LLTrans::getString("InvOfferGaveYou") + " " + getSanitizedDescription() + LLTrans::getString(".");
|
||||
LLSD args;
|
||||
args["MESSAGE"] = log_message;
|
||||
LLNotificationsUtil::add("SystemMessageTip", args);
|
||||
|
|
@ -2079,7 +2280,7 @@ bool LLOfferInfo::inventory_task_offer_callback(const LLSD& notification, const
|
|||
//don't spam them if they are getting flooded
|
||||
if (check_offer_throttle(mFromName, true))
|
||||
{
|
||||
log_message = chatHistory_string + " " + LLTrans::getString("InvOfferGaveYou") + " " + mDesc + LLTrans::getString(".");
|
||||
log_message = "<nolink>" + chatHistory_string + "</nolink> " + LLTrans::getString("InvOfferGaveYou") + " " + getSanitizedDescription() + LLTrans::getString(".");
|
||||
LLSD args;
|
||||
args["MESSAGE"] = log_message;
|
||||
LLNotificationsUtil::add("SystemMessageTip", args);
|
||||
|
|
@ -2163,6 +2364,23 @@ bool LLOfferInfo::inventory_task_offer_callback(const LLSD& notification, const
|
|||
return false;
|
||||
}
|
||||
|
||||
std::string LLOfferInfo::getSanitizedDescription()
|
||||
{
|
||||
// currently we get description from server as: 'Object' ( Location )
|
||||
// object name shouldn't be shown as a hyperlink
|
||||
std::string description = mDesc;
|
||||
|
||||
std::size_t start = mDesc.find_first_of("'");
|
||||
std::size_t end = mDesc.find_last_of("'");
|
||||
if ((start != std::string::npos) && (end != std::string::npos))
|
||||
{
|
||||
description.insert(start, "<nolink>");
|
||||
description.insert(end + 8, "</nolink>");
|
||||
}
|
||||
return description;
|
||||
}
|
||||
|
||||
|
||||
void LLOfferInfo::initRespondFunctionMap()
|
||||
{
|
||||
if(mRespondFunctions.empty())
|
||||
|
|
@ -4035,6 +4253,110 @@ void send_agent_update(BOOL force_send, BOOL send_reliable)
|
|||
}
|
||||
|
||||
|
||||
// sounds can arrive before objects, store them for a short time
|
||||
// Note: this is a workaround for MAINT-4743, real fix would be to make
|
||||
// server send sound along with object update that creates (rezes) the object
|
||||
class PostponedSoundData
|
||||
{
|
||||
public:
|
||||
PostponedSoundData() :
|
||||
mExpirationTime(0)
|
||||
{}
|
||||
PostponedSoundData(const LLUUID &object_id, const LLUUID &sound_id, const LLUUID& owner_id, const F32 gain, const U8 flags);
|
||||
bool hasExpired() { return LLFrameTimer::getTotalSeconds() > mExpirationTime; }
|
||||
|
||||
LLUUID mObjectId;
|
||||
LLUUID mSoundId;
|
||||
LLUUID mOwnerId;
|
||||
F32 mGain;
|
||||
U8 mFlags;
|
||||
static const F64 MAXIMUM_PLAY_DELAY;
|
||||
|
||||
private:
|
||||
F64 mExpirationTime; //seconds since epoch
|
||||
};
|
||||
const F64 PostponedSoundData::MAXIMUM_PLAY_DELAY = 15.0;
|
||||
static F64 postponed_sounds_update_expiration = 0.0;
|
||||
static std::map<LLUUID, PostponedSoundData> postponed_sounds;
|
||||
|
||||
void set_attached_sound(LLViewerObject *objectp, const LLUUID &object_id, const LLUUID &sound_id, const LLUUID& owner_id, const F32 gain, const U8 flags)
|
||||
{
|
||||
if (LLMuteList::getInstance()->isMuted(object_id)) return;
|
||||
|
||||
if (LLMuteList::getInstance()->isMuted(owner_id, LLMute::flagObjectSounds)) return;
|
||||
|
||||
// Don't play sounds from a region with maturity above current agent maturity
|
||||
LLVector3d pos = objectp->getPositionGlobal();
|
||||
if (!gAgent.canAccessMaturityAtGlobal(pos))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
objectp->setAttachedSound(sound_id, owner_id, gain, flags);
|
||||
}
|
||||
|
||||
PostponedSoundData::PostponedSoundData(const LLUUID &object_id, const LLUUID &sound_id, const LLUUID& owner_id, const F32 gain, const U8 flags)
|
||||
:
|
||||
mObjectId(object_id),
|
||||
mSoundId(sound_id),
|
||||
mOwnerId(owner_id),
|
||||
mGain(gain),
|
||||
mFlags(flags),
|
||||
mExpirationTime(LLFrameTimer::getTotalSeconds() + MAXIMUM_PLAY_DELAY)
|
||||
{
|
||||
}
|
||||
|
||||
// static
|
||||
void update_attached_sounds()
|
||||
{
|
||||
if (postponed_sounds.empty())
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
std::map<LLUUID, PostponedSoundData>::iterator iter = postponed_sounds.begin();
|
||||
std::map<LLUUID, PostponedSoundData>::iterator end = postponed_sounds.end();
|
||||
while (iter != end)
|
||||
{
|
||||
std::map<LLUUID, PostponedSoundData>::iterator cur_iter = iter++;
|
||||
PostponedSoundData* data = &cur_iter->second;
|
||||
if (data->hasExpired())
|
||||
{
|
||||
postponed_sounds.erase(cur_iter);
|
||||
}
|
||||
else
|
||||
{
|
||||
LLViewerObject *objectp = gObjectList.findObject(data->mObjectId);
|
||||
if (objectp)
|
||||
{
|
||||
set_attached_sound(objectp, data->mObjectId, data->mSoundId, data->mOwnerId, data->mGain, data->mFlags);
|
||||
postponed_sounds.erase(cur_iter);
|
||||
}
|
||||
}
|
||||
}
|
||||
postponed_sounds_update_expiration = LLFrameTimer::getTotalSeconds() + 2 * PostponedSoundData::MAXIMUM_PLAY_DELAY;
|
||||
}
|
||||
|
||||
//static
|
||||
void clear_expired_postponed_sounds()
|
||||
{
|
||||
if (postponed_sounds_update_expiration > LLFrameTimer::getTotalSeconds())
|
||||
{
|
||||
return;
|
||||
}
|
||||
std::map<LLUUID, PostponedSoundData>::iterator iter = postponed_sounds.begin();
|
||||
std::map<LLUUID, PostponedSoundData>::iterator end = postponed_sounds.end();
|
||||
while (iter != end)
|
||||
{
|
||||
std::map<LLUUID, PostponedSoundData>::iterator cur_iter = iter++;
|
||||
PostponedSoundData* data = &cur_iter->second;
|
||||
if (data->hasExpired())
|
||||
{
|
||||
postponed_sounds.erase(cur_iter);
|
||||
}
|
||||
}
|
||||
postponed_sounds_update_expiration = LLFrameTimer::getTotalSeconds() + 2 * PostponedSoundData::MAXIMUM_PLAY_DELAY;
|
||||
}
|
||||
|
||||
// *TODO: Remove this dependency, or figure out a better way to handle
|
||||
// this hack.
|
||||
|
|
@ -4053,7 +4375,12 @@ void process_object_update(LLMessageSystem *mesgsys, void **user_data)
|
|||
}
|
||||
|
||||
// Update the object...
|
||||
S32 old_num_objects = gObjectList.mNumNewObjects;
|
||||
gObjectList.processObjectUpdate(mesgsys, user_data, OUT_FULL);
|
||||
if (old_num_objects != gObjectList.mNumNewObjects)
|
||||
{
|
||||
update_attached_sounds();
|
||||
}
|
||||
}
|
||||
|
||||
void process_compressed_object_update(LLMessageSystem *mesgsys, void **user_data)
|
||||
|
|
@ -4069,7 +4396,12 @@ void process_compressed_object_update(LLMessageSystem *mesgsys, void **user_data
|
|||
}
|
||||
|
||||
// Update the object...
|
||||
S32 old_num_objects = gObjectList.mNumNewObjects;
|
||||
gObjectList.processCompressedObjectUpdate(mesgsys, user_data, OUT_FULL_COMPRESSED);
|
||||
if (old_num_objects != gObjectList.mNumNewObjects)
|
||||
{
|
||||
update_attached_sounds();
|
||||
}
|
||||
}
|
||||
|
||||
void process_cached_object_update(LLMessageSystem *mesgsys, void **user_data)
|
||||
|
|
@ -4100,7 +4432,12 @@ void process_terse_object_update_improved(LLMessageSystem *mesgsys, void **user_
|
|||
gObjectData += (U32Bytes)mesgsys->getReceiveSize();
|
||||
}
|
||||
|
||||
S32 old_num_objects = gObjectList.mNumNewObjects;
|
||||
gObjectList.processCompressedObjectUpdate(mesgsys, user_data, OUT_TERSE_IMPROVED);
|
||||
if (old_num_objects != gObjectList.mNumNewObjects)
|
||||
{
|
||||
update_attached_sounds();
|
||||
}
|
||||
}
|
||||
|
||||
static LLTrace::BlockTimerStatHandle FTM_PROCESS_OBJECTS("Process Kill Objects");
|
||||
|
|
@ -4457,27 +4794,27 @@ void process_attached_sound(LLMessageSystem *msg, void **user_data)
|
|||
msg->getU8Fast(_PREHASH_DataBlock, _PREHASH_Flags, flags);
|
||||
|
||||
LLViewerObject *objectp = gObjectList.findObject(object_id);
|
||||
if (!objectp)
|
||||
if (objectp)
|
||||
{
|
||||
// we don't know about this object, just bail
|
||||
return;
|
||||
set_attached_sound(objectp, object_id, sound_id, owner_id, gain, flags);
|
||||
}
|
||||
|
||||
if (LLMuteList::getInstance()->isMuted(object_id)) return;
|
||||
|
||||
if (LLMuteList::getInstance()->isMuted(owner_id, LLMute::flagObjectSounds)) return;
|
||||
|
||||
// Don't play sounds from a region with maturity above current agent maturity
|
||||
LLVector3d pos = objectp->getPositionGlobal();
|
||||
if( !gAgent.canAccessMaturityAtGlobal(pos) )
|
||||
else if (sound_id.notNull())
|
||||
{
|
||||
return;
|
||||
// we don't know about this object yet, probably it has yet to arrive
|
||||
// std::map for dupplicate prevention.
|
||||
postponed_sounds[object_id] = (PostponedSoundData(object_id, sound_id, owner_id, gain, flags));
|
||||
clear_expired_postponed_sounds();
|
||||
}
|
||||
else
|
||||
{
|
||||
std::map<LLUUID, PostponedSoundData>::iterator iter = postponed_sounds.find(object_id);
|
||||
if (iter != postponed_sounds.end())
|
||||
{
|
||||
postponed_sounds.erase(iter);
|
||||
}
|
||||
}
|
||||
|
||||
objectp->setAttachedSound(sound_id, owner_id, gain, flags);
|
||||
}
|
||||
|
||||
|
||||
void process_attached_sound_gain_change(LLMessageSystem *mesgsys, void **user_data)
|
||||
{
|
||||
F32 gain = 0;
|
||||
|
|
|
|||
|
|
@ -74,6 +74,11 @@ enum InventoryOfferResponse
|
|||
BOOL can_afford_transaction(S32 cost);
|
||||
void give_money(const LLUUID& uuid, LLViewerRegion* region, S32 amount, BOOL is_group = FALSE,
|
||||
S32 trx_type = TRANS_GIFT, const std::string& desc = LLStringUtil::null);
|
||||
void send_join_group_response(LLUUID group_id,
|
||||
LLUUID transaction_id,
|
||||
bool accept_invite,
|
||||
S32 fee,
|
||||
bool use_offline_cap);
|
||||
|
||||
void process_logout_reply(LLMessageSystem* msg, void**);
|
||||
void process_layer_data(LLMessageSystem *mesgsys, void **user_data);
|
||||
|
|
@ -279,6 +284,7 @@ public:
|
|||
private:
|
||||
|
||||
void initRespondFunctionMap();
|
||||
std::string getSanitizedDescription();
|
||||
|
||||
typedef boost::function<bool (const LLSD&, const LLSD&)> respond_function_t;
|
||||
typedef std::map<std::string, respond_function_t> respond_function_map_t;
|
||||
|
|
|
|||
|
|
@ -1990,7 +1990,10 @@ void LLViewerRegion::updateNetStats()
|
|||
mLastPacketsLost = mPacketsLost;
|
||||
|
||||
mPacketsIn = cdp->getPacketsIn();
|
||||
// <FS:Ansariel> FIRE-17071: UDP network data measuring is wrong
|
||||
//mBitsIn = 8 * cdp->getBytesIn();
|
||||
mBitsIn = cdp->getBytesIn();
|
||||
// </FS:Ansariel>
|
||||
mPacketsOut = cdp->getPacketsOut();
|
||||
mPacketsLost = cdp->getPacketsLost();
|
||||
mPingDelay = cdp->getPingDelay();
|
||||
|
|
@ -3039,6 +3042,8 @@ void LLViewerRegion::unpackRegionHandshake()
|
|||
void LLViewerRegionImpl::buildCapabilityNames(LLSD& capabilityNames)
|
||||
{
|
||||
capabilityNames.append("AbuseCategories");
|
||||
//capabilityNames.append("AcceptFriendship");
|
||||
capabilityNames.append("AcceptGroupInvite"); // ReadOfflineMsgs recieved messages only!!!
|
||||
capabilityNames.append("AgentPreferences");
|
||||
capabilityNames.append("AgentState");
|
||||
capabilityNames.append("AttachmentResources");
|
||||
|
|
@ -3048,6 +3053,8 @@ void LLViewerRegionImpl::buildCapabilityNames(LLSD& capabilityNames)
|
|||
capabilityNames.append("ChatSessionRequest");
|
||||
capabilityNames.append("CopyInventoryFromNotecard");
|
||||
capabilityNames.append("CreateInventoryCategory");
|
||||
//capabilityNames.append("DeclineFriendship");
|
||||
capabilityNames.append("DeclineGroupInvite"); // ReadOfflineMsgs recieved messages only!!!
|
||||
capabilityNames.append("DispatchRegionInfo");
|
||||
capabilityNames.append("DirectDelivery");
|
||||
capabilityNames.append("EnvironmentSettings");
|
||||
|
|
@ -3111,7 +3118,7 @@ void LLViewerRegionImpl::buildCapabilityNames(LLSD& capabilityNames)
|
|||
capabilityNames.append("ParcelVoiceInfoRequest");
|
||||
capabilityNames.append("ProductInfoRequest");
|
||||
capabilityNames.append("ProvisionVoiceAccountRequest");
|
||||
capabilityNames.append("ReadOfflineMsgs");
|
||||
capabilityNames.append("ReadOfflineMsgs"); // Only use with AcceptGroupInvite AcceptFriendship
|
||||
capabilityNames.append("RemoteParcelRequest");
|
||||
capabilityNames.append("RenderMaterials");
|
||||
capabilityNames.append("RequestTextureDownload");
|
||||
|
|
|
|||
|
|
@ -200,6 +200,7 @@
|
|||
#include "llviewerdisplay.h"
|
||||
#include "llspatialpartition.h"
|
||||
#include "llviewerjoystick.h"
|
||||
#include "llviewermenufile.h" // LLFilePickerReplyThread
|
||||
#include "llviewernetwork.h"
|
||||
#include "llpostprocess.h"
|
||||
// <FS:Ansariel> [FS communication UI]
|
||||
|
|
@ -293,38 +294,6 @@ static LLCachedControl<std::string> sSnapshotDir(LLCachedControl<std::string>(gS
|
|||
|
||||
LLTrace::SampleStatHandle<> LLViewerWindow::sMouseVelocityStat("Mouse Velocity");
|
||||
|
||||
// <FS:Ansariel> Threaded filepickers
|
||||
class FSSnapshotSaveFilePicker : public LLFilePickerThread
|
||||
{
|
||||
public:
|
||||
FSSnapshotSaveFilePicker(LLFilePicker::ESaveFilter filter, const std::string& default_name, boost::function<void (const std::string&)> notify_slot)
|
||||
: LLFilePickerThread(filter, default_name)
|
||||
{
|
||||
mSignal.connect(notify_slot);
|
||||
}
|
||||
|
||||
virtual void notify(const std::vector<std::string>& filenames)
|
||||
{
|
||||
if (!filenames.empty())
|
||||
{
|
||||
mSignal(filenames[0]);
|
||||
}
|
||||
else
|
||||
{
|
||||
mSignal(std::string());
|
||||
}
|
||||
}
|
||||
|
||||
static void open(LLFilePicker::ESaveFilter filter, const std::string& default_name, boost::function<void (const std::string&)> notify_slot)
|
||||
{
|
||||
(new FSSnapshotSaveFilePicker(filter, default_name, notify_slot))->getFile();
|
||||
}
|
||||
|
||||
protected:
|
||||
boost::signals2::signal<void (const std::string&)> mSignal;
|
||||
};
|
||||
// </FS:Ansariel>
|
||||
|
||||
class RecordToChatConsoleRecorder : public LLError::Recorder
|
||||
{
|
||||
public:
|
||||
|
|
@ -5569,204 +5538,141 @@ BOOL LLViewerWindow::mousePointOnLandGlobal(const S32 x, const S32 y, LLVector3d
|
|||
return FALSE;
|
||||
}
|
||||
|
||||
// <FS:Ansariel> Threaded filepickers
|
||||
void do_save_image(LLImageFormatted* image, const std::string& snapshot_dir, const std::string& base_name, const std::string& extension, boost::function<void(bool)> callback)
|
||||
// Saves an image to the harddrive as "SnapshotX" where X >= 1.
|
||||
void LLViewerWindow::saveImageNumbered(LLImageFormatted *image, BOOL force_picker, const snapshot_saved_signal_t::slot_type& success_cb, const snapshot_saved_signal_t::slot_type& failure_cb)
|
||||
{
|
||||
if (snapshot_dir.empty() || !LLFile::isdir(snapshot_dir))
|
||||
if (!image)
|
||||
{
|
||||
if (callback)
|
||||
{
|
||||
callback(false);
|
||||
}
|
||||
LL_WARNS() << "No image to save" << LL_ENDL;
|
||||
return;
|
||||
}
|
||||
std::string extension("." + image->getExtension());
|
||||
LLImageFormatted* formatted_image = image;
|
||||
// Get a base file location if needed.
|
||||
if (force_picker || !isSnapshotLocSet())
|
||||
{
|
||||
std::string proposed_name(sSnapshotBaseName);
|
||||
|
||||
// getSaveFile will append an appropriate extension to the proposed name, based on the ESaveFilter constant passed in.
|
||||
LLFilePicker::ESaveFilter pick_type;
|
||||
|
||||
if (extension == ".j2c")
|
||||
pick_type = LLFilePicker::FFSAVE_J2C;
|
||||
else if (extension == ".bmp")
|
||||
pick_type = LLFilePicker::FFSAVE_BMP;
|
||||
else if (extension == ".jpg")
|
||||
pick_type = LLFilePicker::FFSAVE_JPEG;
|
||||
else if (extension == ".png")
|
||||
pick_type = LLFilePicker::FFSAVE_PNG;
|
||||
else if (extension == ".tga")
|
||||
pick_type = LLFilePicker::FFSAVE_TGA;
|
||||
else
|
||||
pick_type = LLFilePicker::FFSAVE_ALL;
|
||||
|
||||
(new LLFilePickerReplyThread(boost::bind(&LLViewerWindow::onDirectorySelected, this, _1, formatted_image, success_cb, failure_cb), pick_type, proposed_name,
|
||||
boost::bind(&LLViewerWindow::onSelectionFailure, this, failure_cb)))->getFile();
|
||||
}
|
||||
else
|
||||
{
|
||||
saveImageLocal(formatted_image, success_cb, failure_cb);
|
||||
}
|
||||
}
|
||||
|
||||
void LLViewerWindow::onDirectorySelected(const std::vector<std::string>& filenames, LLImageFormatted *image, const snapshot_saved_signal_t::slot_type& success_cb, const snapshot_saved_signal_t::slot_type& failure_cb)
|
||||
{
|
||||
// Copy the directory + file name
|
||||
std::string filepath = filenames[0];
|
||||
|
||||
gSavedPerAccountSettings.setString("SnapshotBaseName", gDirUtilp->getBaseFileName(filepath, true));
|
||||
gSavedPerAccountSettings.setString("SnapshotBaseDir", gDirUtilp->getDirName(filepath));
|
||||
saveImageLocal(image, success_cb, failure_cb);
|
||||
}
|
||||
|
||||
void LLViewerWindow::onSelectionFailure(const snapshot_saved_signal_t::slot_type& failure_cb)
|
||||
{
|
||||
failure_cb();
|
||||
}
|
||||
|
||||
|
||||
void LLViewerWindow::saveImageLocal(LLImageFormatted *image, const snapshot_saved_signal_t::slot_type& success_cb, const snapshot_saved_signal_t::slot_type& failure_cb)
|
||||
{
|
||||
std::string lastSnapshotDir = LLViewerWindow::getLastSnapshotDir();
|
||||
if (lastSnapshotDir.empty())
|
||||
{
|
||||
failure_cb();
|
||||
return;
|
||||
}
|
||||
|
||||
// Check if there is enough free space to save snapshot
|
||||
#ifdef LL_WINDOWS
|
||||
boost::filesystem::space_info b_space = boost::filesystem::space(utf8str_to_utf16str(snapshot_dir));
|
||||
boost::filesystem::path b_path(utf8str_to_utf16str(lastSnapshotDir));
|
||||
#else
|
||||
boost::filesystem::space_info b_space = boost::filesystem::space(snapshot_dir);
|
||||
boost::filesystem::path b_path(lastSnapshotDir);
|
||||
#endif
|
||||
if (b_space.free < image->getDataSize())
|
||||
if (!boost::filesystem::is_directory(b_path))
|
||||
{
|
||||
if (callback)
|
||||
{
|
||||
callback(false);
|
||||
}
|
||||
LLSD args;
|
||||
args["PATH"] = lastSnapshotDir;
|
||||
LLNotificationsUtil::add("SnapshotToLocalDirNotExist", args);
|
||||
resetSnapshotLoc();
|
||||
failure_cb();
|
||||
return;
|
||||
}
|
||||
boost::filesystem::space_info b_space = boost::filesystem::space(b_path);
|
||||
if (b_space.free < image->getDataSize())
|
||||
{
|
||||
LLSD args;
|
||||
args["PATH"] = lastSnapshotDir;
|
||||
|
||||
std::string needM_bytes_string;
|
||||
LLResMgr::getInstance()->getIntegerString(needM_bytes_string, (image->getDataSize()) >> 10);
|
||||
args["NEED_MEMORY"] = needM_bytes_string;
|
||||
|
||||
std::string freeM_bytes_string;
|
||||
LLResMgr::getInstance()->getIntegerString(freeM_bytes_string, (b_space.free) >> 10);
|
||||
args["FREE_MEMORY"] = freeM_bytes_string;
|
||||
|
||||
LLNotificationsUtil::add("SnapshotToComputerFailed", args);
|
||||
|
||||
failure_cb();
|
||||
}
|
||||
|
||||
// Look for an unused file name
|
||||
BOOL is_snapshot_name_loc_set = isSnapshotLocSet();
|
||||
std::string filepath;
|
||||
S32 i = 1;
|
||||
S32 err = 0;
|
||||
|
||||
std::string extension("." + image->getExtension());
|
||||
do
|
||||
{
|
||||
filepath = snapshot_dir;
|
||||
filepath = sSnapshotDir;
|
||||
filepath += gDirUtilp->getDirDelimiter();
|
||||
filepath += base_name;
|
||||
filepath += llformat("_%.3d",i);
|
||||
filepath += sSnapshotBaseName;
|
||||
|
||||
if (is_snapshot_name_loc_set)
|
||||
{
|
||||
filepath += llformat("_%.3d",i);
|
||||
}
|
||||
|
||||
filepath += extension;
|
||||
|
||||
llstat stat_info;
|
||||
err = LLFile::stat( filepath, &stat_info );
|
||||
i++;
|
||||
}
|
||||
while( -1 != err ); // search until the file is not found (i.e., stat() gives an error).
|
||||
while( -1 != err // Search until the file is not found (i.e., stat() gives an error).
|
||||
&& is_snapshot_name_loc_set); // Or stop if we are rewriting.
|
||||
|
||||
LL_INFOS() << "Saving snapshot to " << filepath << LL_ENDL;
|
||||
|
||||
if (gSavedSettings.getBOOL("FSLogSnapshotsToLocal"))
|
||||
if (image->save(filepath))
|
||||
{
|
||||
LLStringUtil::format_map_t args;
|
||||
args["FILENAME"] = filepath;
|
||||
report_to_nearby_chat(LLTrans::getString("SnapshotSavedToDisk", args));
|
||||
playSnapshotAnimAndSound();
|
||||
success_cb();
|
||||
}
|
||||
|
||||
bool success = image->save(filepath);
|
||||
if (callback)
|
||||
{
|
||||
callback(success);
|
||||
}
|
||||
}
|
||||
|
||||
void LLViewerWindow::saveImageCallback(const std::string& filename, LLImageFormatted* image, const std::string& extension, boost::function<void(bool)> callback)
|
||||
{
|
||||
if (!filename.empty())
|
||||
{
|
||||
gSavedPerAccountSettings.setString("SnapshotBaseName", gDirUtilp->getBaseFileName(filename, true));
|
||||
gSavedPerAccountSettings.setString("SnapshotBaseDir", gDirUtilp->getDirName(filename));
|
||||
|
||||
do_save_image(image, sSnapshotDir, sSnapshotBaseName, extension, callback);
|
||||
return;
|
||||
}
|
||||
|
||||
if (callback)
|
||||
{
|
||||
callback(false);
|
||||
}
|
||||
}
|
||||
// </FS:Ansariel>
|
||||
|
||||
// Saves an image to the harddrive as "SnapshotX" where X >= 1.
|
||||
// <FS:Ansariel> Threaded filepickers
|
||||
//BOOL LLViewerWindow::saveImageNumbered(LLImageFormatted *image, BOOL force_picker, BOOL& insufficient_memory)
|
||||
void LLViewerWindow::saveImageNumbered(LLImageFormatted *image, bool force_picker, boost::function<void(bool)> callback)
|
||||
// </FS:Ansariel>
|
||||
{
|
||||
// <FS:Ansariel> Threaded filepickers
|
||||
//insufficient_memory = FALSE;
|
||||
|
||||
if (!image)
|
||||
{
|
||||
LL_WARNS() << "No image to save" << LL_ENDL;
|
||||
// <FS:Ansariel> Threaded filepickers
|
||||
//return FALSE;
|
||||
if (callback)
|
||||
{
|
||||
callback(false);
|
||||
return;
|
||||
}
|
||||
// </FS:Ansariel>
|
||||
}
|
||||
|
||||
LLFilePicker::ESaveFilter pick_type;
|
||||
std::string extension("." + image->getExtension());
|
||||
if (extension == ".j2c")
|
||||
pick_type = LLFilePicker::FFSAVE_J2C;
|
||||
else if (extension == ".bmp")
|
||||
pick_type = LLFilePicker::FFSAVE_BMP;
|
||||
else if (extension == ".jpg")
|
||||
pick_type = LLFilePicker::FFSAVE_JPEG;
|
||||
else if (extension == ".png")
|
||||
pick_type = LLFilePicker::FFSAVE_PNG;
|
||||
else if (extension == ".tga")
|
||||
pick_type = LLFilePicker::FFSAVE_TGA;
|
||||
else
|
||||
pick_type = LLFilePicker::FFSAVE_ALL; // ???
|
||||
|
||||
// <FS:Ansariel> Threaded filepickers
|
||||
//BOOL is_snapshot_name_loc_set = isSnapshotLocSet();
|
||||
|
||||
//// Get a base file location if needed.
|
||||
//if (force_picker || !isSnapshotLocSet())
|
||||
//{
|
||||
// std::string proposed_name( sSnapshotBaseName );
|
||||
|
||||
// // getSaveFile will append an appropriate extension to the proposed name, based on the ESaveFilter constant passed in.
|
||||
|
||||
// // pick a directory in which to save
|
||||
// LLFilePicker& picker = LLFilePicker::instance();
|
||||
// if (!picker.getSaveFile(pick_type, proposed_name))
|
||||
// {
|
||||
// // Clicked cancel
|
||||
// return FALSE;
|
||||
// }
|
||||
|
||||
// // Copy the directory + file name
|
||||
// std::string filepath = picker.getFirstFile();
|
||||
|
||||
// gSavedPerAccountSettings.setString("SnapshotBaseName", gDirUtilp->getBaseFileName(filepath, true));
|
||||
// gSavedPerAccountSettings.setString("SnapshotBaseDir", gDirUtilp->getDirName(filepath));
|
||||
//}
|
||||
|
||||
//std::string snapshot_dir = sSnapshotDir;
|
||||
//if(snapshot_dir.empty())
|
||||
//{
|
||||
// return FALSE;
|
||||
//}
|
||||
|
||||
// Check if there is enough free space to save snapshot
|
||||
//#ifdef LL_WINDOWS
|
||||
// boost::filesystem::space_info b_space = boost::filesystem::space(utf8str_to_utf16str(snapshot_dir));
|
||||
//#else
|
||||
// boost::filesystem::space_info b_space = boost::filesystem::space(snapshot_dir);
|
||||
//#endif
|
||||
// if (b_space.free < image->getDataSize())
|
||||
// {
|
||||
// insufficient_memory = TRUE;
|
||||
// return FALSE;
|
||||
// }
|
||||
//// Look for an unused file name
|
||||
//std::string filepath;
|
||||
//S32 i = 1;
|
||||
//S32 err = 0;
|
||||
|
||||
//do
|
||||
//{
|
||||
// filepath = sSnapshotDir;
|
||||
// filepath += gDirUtilp->getDirDelimiter();
|
||||
// filepath += sSnapshotBaseName;
|
||||
|
||||
// if (is_snapshot_name_loc_set)
|
||||
// {
|
||||
// filepath += llformat("_%.3d",i);
|
||||
// }
|
||||
|
||||
// filepath += extension;
|
||||
|
||||
// llstat stat_info;
|
||||
// err = LLFile::stat( filepath, &stat_info );
|
||||
// i++;
|
||||
//}
|
||||
//while( -1 != err // Search until the file is not found (i.e., stat() gives an error).
|
||||
// && is_snapshot_name_loc_set); // Or stop if we are rewriting.
|
||||
|
||||
//LL_INFOS() << "Saving snapshot to " << filepath << LL_ENDL;
|
||||
//return image->save(filepath);
|
||||
|
||||
// Get a base file location if needed.
|
||||
if (force_picker || !isSnapshotLocSet() || !LLFile::isdir(sSnapshotDir()))
|
||||
{
|
||||
std::string proposed_name( sSnapshotBaseName );
|
||||
|
||||
FSSnapshotSaveFilePicker::open(pick_type, proposed_name, boost::bind(&LLViewerWindow::saveImageCallback, this, _1, image, extension, callback));
|
||||
return;
|
||||
failure_cb();
|
||||
}
|
||||
|
||||
do_save_image(image, sSnapshotDir, sSnapshotBaseName, extension, callback);
|
||||
// </FS:Ansariel>
|
||||
}
|
||||
|
||||
void LLViewerWindow::resetSnapshotLoc()
|
||||
|
|
|
|||
|
|
@ -353,11 +353,13 @@ public:
|
|||
BOOL thumbnailSnapshot(LLImageRaw *raw, S32 preview_width, S32 preview_height, BOOL show_ui, BOOL do_rebuild, LLSnapshotModel::ESnapshotLayerType type);
|
||||
BOOL isSnapshotLocSet() const;
|
||||
void resetSnapshotLoc() const;
|
||||
// <FS:Ansariel> Threaded filepickers
|
||||
BOOL saveImageNumbered(LLImageFormatted *image, BOOL force_picker, BOOL& insufficient_memory);
|
||||
void saveImageNumbered(LLImageFormatted *image, bool force_picker = false, boost::function<void(bool)> callback = NULL);
|
||||
void saveImageCallback(const std::string& filename, LLImageFormatted* image, const std::string& extension, boost::function<void(bool)> callback);
|
||||
// </FS:Ansariel>
|
||||
|
||||
typedef boost::signals2::signal<void(void)> snapshot_saved_signal_t;
|
||||
|
||||
void saveImageNumbered(LLImageFormatted *image, BOOL force_picker, const snapshot_saved_signal_t::slot_type& success_cb, const snapshot_saved_signal_t::slot_type& failure_cb);
|
||||
void onDirectorySelected(const std::vector<std::string>& filenames, LLImageFormatted *image, const snapshot_saved_signal_t::slot_type& success_cb, const snapshot_saved_signal_t::slot_type& failure_cb);
|
||||
void saveImageLocal(LLImageFormatted *image, const snapshot_saved_signal_t::slot_type& success_cb, const snapshot_saved_signal_t::slot_type& failure_cb);
|
||||
void onSelectionFailure(const snapshot_saved_signal_t::slot_type& failure_cb);
|
||||
|
||||
// Reset the directory where snapshots are saved.
|
||||
// Client will open directory picker on next snapshot save.
|
||||
|
|
|
|||
|
|
@ -593,12 +593,10 @@ void LLVivoxVoiceClient::connectorShutdown()
|
|||
|
||||
writeString(stream.str());
|
||||
}
|
||||
// <FS:Ansariel> Cut down wait on logout
|
||||
else
|
||||
{
|
||||
mShutdownComplete = true;
|
||||
}
|
||||
// </FS:Ansariel>
|
||||
}
|
||||
|
||||
void LLVivoxVoiceClient::userAuthorized(const std::string& user_id, const LLUUID &agentID)
|
||||
|
|
@ -1169,17 +1167,26 @@ bool LLVivoxVoiceClient::breakVoiceConnection(bool corowait)
|
|||
retval = result.has("connector");
|
||||
}
|
||||
else
|
||||
{ // If we are not doing a corowait then we must sleep until the connector has responded
|
||||
{
|
||||
mRelogRequested = false; //stop the control coro
|
||||
// If we are not doing a corowait then we must sleep until the connector has responded
|
||||
// otherwise we may very well close the socket too early.
|
||||
#if LL_WINDOWS
|
||||
int count = 0;
|
||||
while (!mShutdownComplete && 10 > count++)
|
||||
{ // Rider: This comes out to a max wait time of 10 seconds.
|
||||
// The situation that brings us here is a call from ::terminate()
|
||||
// and so the viewer is attempting to go away. Don't slow it down
|
||||
// longer than this.
|
||||
if (!mShutdownComplete)
|
||||
{
|
||||
// The situation that brings us here is a call from ::terminate()
|
||||
// At this point message system is already down so we can't wait for
|
||||
// the message, yet we need to receive "connector shutdown response".
|
||||
// Either wait a bit and emulate it or check gMessageSystem for specific message
|
||||
_sleep(1000);
|
||||
// <FS:Ansariel> Cut down wait on logout
|
||||
//if (mConnected)
|
||||
//{
|
||||
// mConnected = false;
|
||||
// LLSD vivoxevent(LLSDMap("connector", LLSD::Boolean(false)));
|
||||
// LLEventPumps::instance().post("vivoxClientPump", vivoxevent);
|
||||
//}
|
||||
//mShutdownComplete = true;
|
||||
// Need to check messages on the service pump for the connector shutdown response
|
||||
// which sets mShutdownComplete to true!
|
||||
while (gMessageSystem->checkAllMessages(gFrameCount, gServicePump))
|
||||
|
|
@ -3405,7 +3412,7 @@ void LLVivoxVoiceClient::connectorShutdownResponse(int statusCode, std::string &
|
|||
}
|
||||
|
||||
mConnected = false;
|
||||
mShutdownComplete = true; // <FS:Ansariel> Cut down wait on logout
|
||||
mShutdownComplete = true;
|
||||
|
||||
LLSD vivoxevent(LLSDMap("connector", LLSD::Boolean(false)));
|
||||
|
||||
|
|
@ -6378,6 +6385,7 @@ void LLVivoxVoiceClient::expireVoiceFonts()
|
|||
|
||||
LLSD args;
|
||||
args["URL"] = LLTrans::getString("voice_morphing_url");
|
||||
args["PREMIUM_URL"] = LLTrans::getString("premium_voice_morphing_url");
|
||||
|
||||
// Give a notification if any voice fonts have expired.
|
||||
if (have_expired)
|
||||
|
|
|
|||
|
|
@ -275,6 +275,12 @@ bool LLWeb::useExternalBrowser(const std::string &url)
|
|||
boost::match_results<std::string::const_iterator> matches;
|
||||
return !(boost::regex_search(uri_string, matches, pattern));
|
||||
}
|
||||
else
|
||||
{
|
||||
boost::regex pattern = boost::regex("^mailto:", boost::regex::perl | boost::regex::icase);
|
||||
boost::match_results<std::string::const_iterator> matches;
|
||||
return boost::regex_search(url, matches, pattern);
|
||||
}
|
||||
return false;
|
||||
#endif
|
||||
}
|
||||
|
|
|
|||
|
|
@ -31,7 +31,7 @@
|
|||
<text name="AvatarPhysicsDetailText">
|
||||
Niedrig
|
||||
</text>
|
||||
<text name="ShadersText">
|
||||
<text name="HardwareText">
|
||||
Hardware
|
||||
</text>
|
||||
<slider label="Texturen-Cache (MB):" name="GraphicsCardTextureMemory" tool_tip="Speicherplatz, der für Texturen zur Verfügung steht. In der Regel handelt es sich um Grafikkartenspeicher. Ein kleinerer Wert kann die Geschwindigkeit erhöhen, aber auch zu Texturunschärfen führen."/>
|
||||
|
|
@ -56,6 +56,9 @@
|
|||
<text name="antialiasing restart">
|
||||
(Neustart erforderlich)
|
||||
</text>
|
||||
<text name="MeshText">
|
||||
Netz
|
||||
</text>
|
||||
<slider label="Gitterdetails Terrain:" name="TerrainMeshDetail"/>
|
||||
<text name="TerrainMeshDetailText">
|
||||
Niedrig
|
||||
|
|
@ -72,6 +75,9 @@
|
|||
<text name="FlexibleMeshDetailText">
|
||||
Niedrig
|
||||
</text>
|
||||
<text name="ShadersText">
|
||||
Shader
|
||||
</text>
|
||||
<check_box initial_value="true" label="Transparentes Wasser" name="TransparentWater"/>
|
||||
<check_box initial_value="true" label="Bumpmapping und Glanz" name="BumpShiny"/>
|
||||
<check_box initial_value="true" label="Lokale Lichtquellen" name="LocalLights"/>
|
||||
|
|
@ -111,5 +117,6 @@
|
|||
<button label="Auf empfohlene Einstellungen zurücksetzen" name="Defaults"/>
|
||||
<button label="OK" label_selected="OK" name="OK"/>
|
||||
<button label="Abbrechen" label_selected="Abbrechen" name="Cancel"/>
|
||||
<check_box label="RenderAvatarMaxComplexity" name="RenderAvatarMaxNonImpostors"/>
|
||||
<check_box label="RenderAvatarMaxComplexity" name="RenderAvatarMaxComplexity"/>
|
||||
<check_box label="RenderAvatarMaxNonImpostors" name="RenderAvatarMaxNonImpostors"/>
|
||||
</floater>
|
||||
|
|
|
|||
|
|
@ -40,10 +40,10 @@
|
|||
Fehler beim Senden der E-Mail.
|
||||
</string>
|
||||
<string name="inventory_failed_str">
|
||||
Fehler beim Speichern im Inventar.
|
||||
Fehler beim Speichern.
|
||||
</string>
|
||||
<string name="local_failed_str">
|
||||
Fehler beim Speichern auf dem Computer.
|
||||
Fehler beim Speichern.
|
||||
</string>
|
||||
<view name="controls_container">
|
||||
<button name="new_snapshot_btn" label="Aktualisieren"/>
|
||||
|
|
|
|||
|
|
@ -227,6 +227,7 @@
|
|||
<combo_box.item label="Objekt bezahlen" name="Payobject"/>
|
||||
<combo_box.item label="Öffnen" name="Open"/>
|
||||
<combo_box.item label="Zoom" name="Zoom"/>
|
||||
<combo_box.item label="Keine Aktion" name="None"/>
|
||||
</combo_box>
|
||||
<check_box label="Zum Verkauf:" name="checkbox for sale"/>
|
||||
<spinner label="Preis: L$" name="Edit Cost"/>
|
||||
|
|
|
|||
|
|
@ -3358,14 +3358,20 @@ Klicken Sie auf 'Akzeptieren ', um dem Chat beizutreten, oder auf &a
|
|||
<notification name="VoiceEffectsExpired">
|
||||
Ein oder mehrere Ihrer Voice-Morph-Abos ist/sind abgelaufen.
|
||||
[[URL] Hier klicken], um Ihr Abo zu erneuern.
|
||||
|
||||
Falls Sie Premium-Mitglied sind, klicken Sie [[PREMIUM_URL] hier], um Ihren Voice-Morph-Vorteil zu erhalten.
|
||||
</notification>
|
||||
<notification name="VoiceEffectsExpiredInUse">
|
||||
Das aktive Voice-Morph-Abo ist abgelaufen. Ihre normalen Voice-Einstellungen werden angewendet.
|
||||
[[URL] Hier klicken], um Ihr Abo zu erneuern.
|
||||
|
||||
Falls Sie Premium-Mitglied sind, klicken Sie [[PREMIUM_URL] hier], um Ihren Voice-Morph-Vorteil zu erhalten.
|
||||
</notification>
|
||||
<notification name="VoiceEffectsWillExpire">
|
||||
Ein oder mehrere Ihrer Voice-Morph-Abos werden in weniger als [INTERVAL] Tagen ablaufen.
|
||||
[[URL] Hier klicken], um Ihr Abo zu erneuern.
|
||||
|
||||
Falls Sie Premium-Mitglied sind, klicken Sie [[PREMIUM_URL] hier], um Ihren Voice-Morph-Vorteil zu erhalten.
|
||||
</notification>
|
||||
<notification name="VoiceEffectsNew">
|
||||
Neue Voice-Morph-Effekte sind erhältlich!
|
||||
|
|
@ -3417,6 +3423,9 @@ Diese werden für ein paar Sekunden sicherheitshalber gesperrt.
|
|||
<notification name="SnapshotToComputerFailed">
|
||||
Fehler beim Speichern des Bildes unter [PATH]: Zu wenig Speicherplatz auf dem Medium. [NEED_MEMORY]KB werden benötigt, es stehen jedoch nur [FREE_MEMORY]KB zur Verfügung.
|
||||
</notification>
|
||||
<notification name="SnapshotToLocalDirNotExist">
|
||||
Fehler beim Speichern des Bildes unter [PATH]: Verzeichnis existiert nicht.
|
||||
</notification>
|
||||
<notification name="PresetNotSaved">
|
||||
Fehler beim Speichern der Voreinstellung [NAME].
|
||||
</notification>
|
||||
|
|
@ -4533,7 +4542,7 @@ Wählen Sie eine kleinere Landfläche aus.
|
|||
Aufgrund eines internen Fehlers konnte Ihr Viewer nicht ordnungsgemäß aktualisiert werden. Der in Ihrem Viewer angezeigte L$-Kontostand oder Parzellenbesitz stimmt möglicherweise nicht mit dem aktuellen Stand auf den Servern überein.
|
||||
</notification>
|
||||
<notification name="LargePrimAgentIntersect">
|
||||
Große Prims, die sich mit anderen Einwohnern überschneiden, können nicht erstellt werden. Bitte erneut versuchen, wenn sich die anderen Einwohnern bewegt haben.
|
||||
Große Prims, die sich mit anderen Einwohnern überschneiden, können nicht erstellt werden. Bitte erneut versuchen, wenn sich die anderen Einwohner fort bewegt haben.
|
||||
</notification>
|
||||
<notification name="RLVaChangeStrings">
|
||||
Änderungen werden erst nach einem Neustart von [APP_NAME] aktiv.
|
||||
|
|
@ -4977,10 +4986,6 @@ Aktueller Simulator: [NEWVERSION]
|
|||
Vorheriger Simulator: [OLDVERSION]
|
||||
</notification>
|
||||
|
||||
<notification name="CannotSaveSnapshot">
|
||||
Foto konnte nicht gespeichert werden.
|
||||
</notification>
|
||||
|
||||
<notification name="RegExFail">
|
||||
Fehler im Regulären Ausdruck:
|
||||
[EWHAT]
|
||||
|
|
|
|||
|
|
@ -15,7 +15,7 @@
|
|||
<panel.string name="log_in_to_change">
|
||||
Anmelden, um Änderungen vorzunehmen
|
||||
</panel.string>
|
||||
<button label="Cache leeren" name="clear_cache" tool_tip="Bild bei Anmeldung, letzter Standort, Teleport-Liste, Internet- und Texturen-Cache löschen"/>
|
||||
<button label="Cache leeren" name="clear_cache" tool_tip="Anmeldungsbild, letzten Standort, Teleport-Liste, Internet- und Texturen-Cache löschen"/>
|
||||
<text name="cache_size_label">
|
||||
(Standorte, Bilder, Web, Suchverlauf)
|
||||
</text>
|
||||
|
|
|
|||
|
|
@ -23,7 +23,7 @@
|
|||
Web-Browser:
|
||||
</text>
|
||||
<radio_group name="preferred_browser_behavior">
|
||||
<radio_item label="Standard-Webbrowser des Systems für alle Links verwenden" name="new_external" tool_tip="Standard-Webbrowser des Systems verwenden, um die Hilfe, Weblinks usw. anzuzeigen. Bei Vollbildmodus nicht empfohlen."/>
|
||||
<radio_item label="Standard-Systembrowser für alle Links verwenden" name="new_external" tool_tip="Standard-Browser für Hilfe, Weblinks usw. verwenden. Im Vollbildmodus nicht empfohlen."/>
|
||||
<radio_item label="Integrierten Browser nur für Second-Life-Links verwenden" name="new_internal" tool_tip="Integrierten Webbrowser verwenden, um die Hilfe, Weblinks usw. anzuzeigen. Dieser Browser öffnet als neues Fenster innerhalb von [APP_NAME]."/>
|
||||
<radio_item label="Integrierten Browser für alle Links verwenden" name="new_internal_all" tool_tip="Integrierten Webbrowser verwenden, um die Hilfe, Weblinks usw. anzuzeigen. Dieser Browser öffnet als neues Fenster innerhalb von [APP_NAME]."/>
|
||||
</radio_group>
|
||||
|
|
|
|||
|
|
@ -12,6 +12,9 @@
|
|||
<text name="title_animation">
|
||||
Animationen
|
||||
</text>
|
||||
<text name="title_model">
|
||||
Modelle
|
||||
</text>
|
||||
<text name="upload_help">
|
||||
Um einen Zielordner zu ändern, klicken Sie im Inventar mit der rechten Maustaste auf den Ordner und wählen Sie „Als Standard verwenden für“.
|
||||
</text>
|
||||
|
|
|
|||
|
|
@ -24,6 +24,9 @@
|
|||
<combo_box.item label="BMP (verlustfrei)" name="BMP"/>
|
||||
</combo_box>
|
||||
<slider label="Qualität:" name="image_quality_slider"/>
|
||||
<text name="local_remember_location_sessions_text">
|
||||
Ort und Dateiname zwischen Sitzungen speichern
|
||||
</text>
|
||||
<button label="▶ Auswahl" name="cancel_btn"/>
|
||||
<flyout_button label="Speichern" name="save_btn" tool_tip="Bild als Datei speichern">
|
||||
<flyout_button.item label="Speichern" name="save_item"/>
|
||||
|
|
|
|||
|
|
@ -34,6 +34,7 @@
|
|||
<combo_box.item label="Bezahlen" name="Payobject"/>
|
||||
<combo_box.item label="Öffnen" name="Open"/>
|
||||
<combo_box.item label="Zoomen" name="Zoom"/>
|
||||
<combo_box.item label="Keine Aktion" name="None"/>
|
||||
</combo_box>
|
||||
<panel name="perms_inv">
|
||||
<text name="perm_modify">Sie können dieses Objekt bearbeiten.</text>
|
||||
|
|
|
|||
|
|
@ -524,6 +524,7 @@ Loading...
|
|||
name="Buy Land..."
|
||||
width="130" />
|
||||
<button
|
||||
enabled="false"
|
||||
follows="left|top"
|
||||
height="23"
|
||||
label="Linden Sale"
|
||||
|
|
|
|||
|
|
@ -1179,6 +1179,10 @@
|
|||
label="Zoom"
|
||||
name="Zoom"
|
||||
value="Zoom" />
|
||||
<combo_box.item
|
||||
label="None"
|
||||
name="None"
|
||||
value="None" />
|
||||
</combo_box>
|
||||
<view_border
|
||||
left="5"
|
||||
|
|
|
|||
|
|
@ -139,10 +139,23 @@
|
|||
shortcut="alt|shift|S"
|
||||
name="Sit Down Here">
|
||||
<menu_item_call.on_click
|
||||
function="Self.SitDown"
|
||||
parameter="" />
|
||||
function="Self.SitDown"/>
|
||||
<menu_item_call.on_visible
|
||||
function="Self.ShowSitDown"/>
|
||||
<menu_item_call.on_enable
|
||||
function="Self.EnableSitDown" />
|
||||
</menu_item_call>
|
||||
<menu_item_call
|
||||
label="Stand Up"
|
||||
layout="topleft"
|
||||
shortcut="alt|shift|S"
|
||||
name="Stand up">
|
||||
<menu_item_call.on_click
|
||||
function="Self.StandUp"/>
|
||||
<menu_item_call.on_visible
|
||||
function="Self.EnableStandUp"/>
|
||||
<menu_item_call.on_enable
|
||||
function="Self.EnableStandUp" />
|
||||
</menu_item_call>
|
||||
<menu_item_check
|
||||
label="Fly"
|
||||
|
|
|
|||
|
|
@ -8742,6 +8742,8 @@ Failed to connect to [VOICE_CHANNEL_NAME], please try again later. You will now
|
|||
<unique/>
|
||||
One or more of your subscribed Voice Morphs has expired.
|
||||
[[URL] Click here] to renew your subscription.
|
||||
|
||||
If you are a Premium Member, [[PREMIUM_URL] click here] to receive your voice morphing perk.
|
||||
<tag>fail</tag>
|
||||
<tag>voice</tag>
|
||||
</notification>
|
||||
|
|
@ -8755,6 +8757,8 @@ One or more of your subscribed Voice Morphs has expired.
|
|||
<unique/>
|
||||
The active Voice Morph has expired, your normal voice settings have been applied.
|
||||
[[URL] Click here] to renew your subscription.
|
||||
|
||||
If you are a Premium Member, [[PREMIUM_URL] click here] to receive your voice morphing perk.
|
||||
<tag>fail</tag>
|
||||
<tag>voice</tag>
|
||||
</notification>
|
||||
|
|
@ -8768,6 +8772,8 @@ The active Voice Morph has expired, your normal voice settings have been applied
|
|||
<unique/>
|
||||
One or more of your Voice Morphs will expire in less than [INTERVAL] days.
|
||||
[[URL] Click here] to renew your subscription.
|
||||
|
||||
If you are a Premium Member, [[PREMIUM_URL] click here] to receive your voice morphing perk.
|
||||
<tag>fail</tag>
|
||||
<tag>voice</tag>
|
||||
</notification>
|
||||
|
|
@ -8900,6 +8906,11 @@ Failed to save appearance to XML.
|
|||
Failed to save snapshot to [PATH]: Disk is full. [NEED_MEMORY]KB is required but only [FREE_MEMORY]KB is free.
|
||||
</notification>
|
||||
|
||||
<notification icon="notifytip.tga"
|
||||
name="SnapshotToLocalDirNotExist" type="notifytip">
|
||||
Failed to save snapshot to [PATH]: Directory does not exist.
|
||||
</notification>
|
||||
|
||||
<notification
|
||||
icon="notifytip.tga"
|
||||
name="PresetNotSaved"
|
||||
|
|
@ -12409,14 +12420,6 @@ Current simulator: [NEWVERSION]
|
|||
Previous simulator: [OLDVERSION]
|
||||
</notification>
|
||||
|
||||
<notification
|
||||
icon="alertmodal.tga"
|
||||
name="CannotSaveSnapshot"
|
||||
type="alertmodal">
|
||||
Unable to save snapshot.
|
||||
<tag>fail</tag>
|
||||
</notification>
|
||||
|
||||
<notification
|
||||
icon="alertmodal.tga"
|
||||
name="RegExFail"
|
||||
|
|
|
|||
|
|
@ -12,6 +12,10 @@
|
|||
name="forgot_password_url">
|
||||
http://secondlife.com/account/request.php
|
||||
</panel.string>
|
||||
<panel.string
|
||||
name="sign_up_url">
|
||||
https://join.secondlife.com/
|
||||
</panel.string>
|
||||
<layout_stack
|
||||
follows="left|right|top"
|
||||
height="172"
|
||||
|
|
@ -149,7 +153,18 @@
|
|||
label="Select grid"
|
||||
layout="topleft"
|
||||
name="server_combo"
|
||||
width="149" />
|
||||
width="149" />
|
||||
<text
|
||||
follows="left|top"
|
||||
font="SansSerifMedium"
|
||||
text_color="EmphasisColor"
|
||||
height="16"
|
||||
name="sign_up_text"
|
||||
left="778"
|
||||
bottom_delta="-10"
|
||||
width="200">
|
||||
Sign up
|
||||
</text>
|
||||
</layout_panel>
|
||||
<layout_panel
|
||||
height="172"
|
||||
|
|
|
|||
|
|
@ -12,6 +12,10 @@
|
|||
name="forgot_password_url">
|
||||
http://secondlife.com/account/request.php
|
||||
</panel.string>
|
||||
<panel.string
|
||||
name="sign_up_url">
|
||||
https://join.secondlife.com/
|
||||
</panel.string>
|
||||
<layout_stack
|
||||
follows="left|right|top|bottom"
|
||||
width="1024"
|
||||
|
|
@ -168,6 +172,17 @@
|
|||
width="200">
|
||||
Forgotten password
|
||||
</text>
|
||||
<text
|
||||
follows="left|top"
|
||||
font="SansSerifLarge"
|
||||
text_color="EmphasisColor"
|
||||
height="16"
|
||||
name="sign_up_text"
|
||||
left="432"
|
||||
top="34"
|
||||
width="200">
|
||||
Sign up
|
||||
</text>
|
||||
</layout_panel>
|
||||
<layout_panel
|
||||
height="100"
|
||||
|
|
|
|||
|
|
@ -165,6 +165,26 @@
|
|||
name="image_quality_slider"
|
||||
top_pad="6"
|
||||
width="203" />
|
||||
<check_box
|
||||
top_pad="8"
|
||||
follows="left|top"
|
||||
layout="topleft"
|
||||
left="10"
|
||||
width="20"
|
||||
name="local_remember_location_sessions"
|
||||
control_name="FSRememberSnapshotPathSessions"/>
|
||||
<text
|
||||
layout="topleft"
|
||||
follows="top|left"
|
||||
height="140"
|
||||
length="1"
|
||||
name="local_remember_location_sessions_text"
|
||||
top_delta="-6"
|
||||
left_delta="20"
|
||||
width="200"
|
||||
wrap="true">
|
||||
Save location and filename between sessions
|
||||
</text>
|
||||
<button
|
||||
follows="right|bottom"
|
||||
height="23"
|
||||
|
|
|
|||
|
|
@ -303,10 +303,14 @@
|
|||
label="Open"
|
||||
name="Open"
|
||||
value="Open" />
|
||||
<combo_box.item
|
||||
label="Zoom"
|
||||
name="Zoom"
|
||||
value="Zoom" />
|
||||
<combo_box.item
|
||||
label="Zoom"
|
||||
name="Zoom"
|
||||
value="Zoom" />
|
||||
<combo_box.item
|
||||
label="None"
|
||||
name="None"
|
||||
value="None" />
|
||||
</combo_box>
|
||||
<panel
|
||||
border="false"
|
||||
|
|
|
|||
|
|
@ -31,7 +31,7 @@
|
|||
<text name="AvatarPhysicsDetailText">
|
||||
Bajo
|
||||
</text>
|
||||
<text name="ShadersText">
|
||||
<text name="HardwareText">
|
||||
Hardware
|
||||
</text>
|
||||
<slider label="Memoria para texturas (MB):" name="GraphicsCardTextureMemory" tool_tip="Cantidad de memoria asignada a las texturas. Por defecto es la memoria de la tarjeta de vídeo. Reducir esta cantidad puede mejorar el rendimiento, pero también hacer que las texturas se vean borrosas."/>
|
||||
|
|
@ -56,6 +56,9 @@
|
|||
<text name="antialiasing restart">
|
||||
(requiere reiniciar)
|
||||
</text>
|
||||
<text name="MeshText">
|
||||
Malla
|
||||
</text>
|
||||
<slider label="Detalle de la malla del terreno:" name="TerrainMeshDetail"/>
|
||||
<text name="TerrainMeshDetailText">
|
||||
Bajo
|
||||
|
|
@ -72,6 +75,9 @@
|
|||
<text name="FlexibleMeshDetailText">
|
||||
Bajo
|
||||
</text>
|
||||
<text name="ShadersText">
|
||||
Shaders
|
||||
</text>
|
||||
<check_box initial_value="true" label="Agua transparente" name="TransparentWater"/>
|
||||
<check_box initial_value="true" label="Efecto de relieve y brillo" name="BumpShiny"/>
|
||||
<check_box initial_value="true" label="Puntos de luz locales" name="LocalLights"/>
|
||||
|
|
@ -111,5 +117,6 @@
|
|||
<button label="Restablecer la configuración recomendada" name="Defaults"/>
|
||||
<button label="OK" label_selected="OK" name="OK"/>
|
||||
<button label="Cancelar" label_selected="Cancelar" name="Cancel"/>
|
||||
<check_box label="RenderAvatarMaxComplexity" name="RenderAvatarMaxNonImpostors"/>
|
||||
<check_box label="RenderAvatarMaxComplexity" name="RenderAvatarMaxComplexity"/>
|
||||
<check_box label="RenderAvatarMaxNonImpostors" name="RenderAvatarMaxNonImpostors"/>
|
||||
</floater>
|
||||
|
|
|
|||
|
|
@ -3,6 +3,7 @@
|
|||
<menu_item_call label="Desbloquear" name="unblock"/>
|
||||
<menu_item_check label="Bloquear la voz" name="BlockVoice"/>
|
||||
<menu_item_check label="Bloquear el texto" name="MuteText"/>
|
||||
<menu_item_check label="Bloquear partículas" name="MuteParticles"/>
|
||||
<menu_item_check label="Bloquear los sonidos de objeto" name="BlockObjectSounds"/>
|
||||
<menu_item_call label="Perfil..." name="profile"/>
|
||||
</toggleable_menu>
|
||||
|
|
|
|||
|
|
@ -4547,7 +4547,7 @@ Prueba a seleccionar un terreno más pequeño.
|
|||
Un error interno nos ha impedido actualizar tu visor correctamente. El saldo en L$ o las parcelas en propiedad presentadas en el visor podrían no coincidir con tu saldo real en los servidores.
|
||||
</notification>
|
||||
<notification name="LargePrimAgentIntersect">
|
||||
No se pueden crear prims grandes que intersecten con otros residentes. Reinténtalo cuando se hayan movido otros residentes.
|
||||
No se pudo crear primitivas grandes que se crucen con otros residentes. Por favor, vuelve a intentar cuando otros residentes se hayan desplazado.
|
||||
</notification>
|
||||
<notification name="PreferenceChatClearLog">
|
||||
Esto eliminará los registros de conversaciones anteriores y las copias de seguridad de ese archivo.
|
||||
|
|
@ -5471,9 +5471,6 @@ Intento cancelado.
|
|||
Simulador actual: [NEWVERSION]
|
||||
Simulador anterior: [OLDVERSION]
|
||||
</notification>
|
||||
<notification name="CannotSaveSnapshot">
|
||||
No se ha podido guardar la fotografía.
|
||||
</notification>
|
||||
<notification name="RegExFail">
|
||||
Error en la expresión regular:
|
||||
[EWHAT]
|
||||
|
|
|
|||
|
|
@ -77,6 +77,11 @@ Selecciona varios nombres manteniendo pulsada la tecla Ctrl y pulsando en cada u
|
|||
</text>
|
||||
<scroll_list name="member_allowed_actions" tool_tip="Para más detalles de cada capacidad, ver la pestaña Capacidades"/>
|
||||
</panel>
|
||||
<panel name="members_header">
|
||||
<text_editor name="member_action_description">
|
||||
Esta habilidad es 'Expulsar miembros de este grupo'. Sólo un propietario puede expulsar a otro propietario.
|
||||
</text_editor>
|
||||
</panel>
|
||||
<panel name="roles_footer">
|
||||
<text name="role_name_label" width="90">
|
||||
Nombre del rol:
|
||||
|
|
@ -100,6 +105,11 @@ Selecciona varios nombres manteniendo pulsada la tecla Ctrl y pulsando en cada u
|
|||
<scroll_list name="role_allowed_actions" tool_tip="Para más detalles de cada capacidad, ver la pestaña Capacidades"/>
|
||||
</panel>
|
||||
</panel>
|
||||
<panel name="roles_header">
|
||||
<text_editor name="role_action_description">
|
||||
Esta habilidad es 'Expulsar miembros de este grupo'. Sólo un propietario puede expulsar a otro propietario.
|
||||
</text_editor>
|
||||
</panel>
|
||||
<panel name="actions_footer">
|
||||
<panel name="action_description_panel">
|
||||
<text_editor name="action_description">
|
||||
|
|
|
|||
|
|
@ -12,6 +12,9 @@
|
|||
<text name="title_animation">
|
||||
Animaciones
|
||||
</text>
|
||||
<text name="title_model">
|
||||
Modelos
|
||||
</text>
|
||||
<text name="upload_help">
|
||||
Para cambiar una carpeta de destino, pulsa con el botón derecho en ella en el inventario y elige
|
||||
"Usar como valor predeterminado para"
|
||||
|
|
|
|||
|
|
@ -1,19 +1,19 @@
|
|||
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
|
||||
<role_actions>
|
||||
<action_set description="Estas capacidades incluyen poderes para añadir o quitar miembros del grupo, y para pemitir que se sumen nuevos miembros sin necesidad de invitación." name="Membership">
|
||||
<action description="Invitar personas al grupo" longdescription="Invitar a gente a este grupo usando el botón 'Invitar' en la sección Roles > pestaña Miembros." name="member invite" value="1"/>
|
||||
<action description="Expulsar a miembros del grupo" longdescription="Expulsar a miembros de este grupo usando el botón 'Expulsar' en la sección Roles > pestaña Miembros. Un propietario puede expulsar a cualquiera, excepto a otro propietario. Si no eres un propietario, un miembro puede ser expulsado única y exclusivamente si está en el rol de Cualquiera y NO en otros roles. Para quitar roles a los miembros, tienes que tener la capacidad de 'Quitar roles a los miembros'." name="member eject" value="2"/>
|
||||
<action description="Invitar personas al grupo" longdescription="Invitar a gente a este grupo usando el botón 'Invitar' en la sección Roles y Miembros > pestaña Miembros." name="member invite" value="1"/>
|
||||
<action description="Expulsar miembros que pertenecen al rol 'Todos' en este grupo." longdescription="Expulsar a miembros de este grupo usando el botón 'Expulsar' en la sección Roles y Miembros > pestaña Miembros. Un propietario puede expulsar a cualquiera, excepto a otro propietario. Si no eres un propietario, un miembro puede ser expulsado única y exclusivamente si está en el rol de Todos y NO en otros roles. Para quitar roles a los miembros, tienes que tener la capacidad de 'Quitar roles a los miembros'." name="member eject" value="2"/>
|
||||
<action description="Administra la lista de expulsados" longdescription="Permite que el miembro del grupo expulse a residentes de este grupo o los readmita." name="allow ban" value="51"/>
|
||||
<action description="Cambiar 'Inscripción abierta' y 'Cuota de inscripción'" longdescription="En la sección General, cambiar la 'Inscripción abierta' -que permite entrar al grupo sin invitación- y la 'Cuota de inscripción'." name="member options" value="3"/>
|
||||
</action_set>
|
||||
<action_set description="Estas habilidades incluyen el poder añadir, quitar y cambiar roles, asignarlos a miembros, y darles capacidades." name="Roles">
|
||||
<action description="Crear nuevos roles" longdescription="Crear roles nuevos en la sección Roles > pestaña Roles." name="role create" value="4"/>
|
||||
<action description="Borrar roles" longdescription="Borrar roles en la sección Roles > pestaña Roles." name="role delete" value="5"/>
|
||||
<action description="Cambiar el nombre, la etiqueta y la descripción de los roles, así como qué miembros se muestran públicamente en ese rol" longdescription="Cambiar el nombre, la etiqueta y la descripción de los roles, así como qué miembros se muestran públicamente en ese rol. Se hace seleccionando el rol, dentro de la sección Roles > pestaña Roles." name="role properties" value="6"/>
|
||||
<action description="Designar miembros para el rol del asignador" longdescription="Añadir miembros a los roles en la lista de Roles asignados (sección Roles > pestaña Miembros). Un miembro con esta capacidad sólo puede añadir miembros a los roles que tenga él mismo." name="role assign member limited" value="7"/>
|
||||
<action description="Designar miembros para cualquier rol" longdescription="Designar miembros para cualquier rol en la lista de Roles asignados (sección Roles > pestaña Miembros). *AVISO* Todos los miembros que tengan un rol con esta capacidad podrán asignarse a sí mismos -y a otros miembros que no sean los propietarios- roles con mayores poderes de los que actualmente tienen. Potencialmente, podrían elevarse hasta poderes cercanos a los del propietario. Asegúrate de lo que estás haciendo antes de otorgar esta capacidad." name="role assign member" value="8"/>
|
||||
<action description="Quitar capacidades a los miembros" longdescription="Quitar miembros de los roles en la lista de roles asignados (sección Roles > pestaña Miembros). No se puede quitar a los Propietarios." name="role remove member" value="9"/>
|
||||
<action description="Añadir o quitar capacidades a los roles" longdescription="Asignar y quitar capacidades a cada rol en la lista de capacidades permitidas (sección Roles > pestaña Roles). *AVISO* Todos los miembros que tengan un rol con esta capacidad podrán asignarse a sí mismos -y a otros miembros que no sean los propietarios- todas las capacidades. Potencialmente, podrían elevarse hasta poderes cercanos a los del propietario. Asegúrate de lo que estás haciendo antes de otorgar esta capacidad." name="role change actions" value="10"/>
|
||||
<action description="Crear nuevos roles" longdescription="Crear roles nuevos en la sección Roles y Miembros > pestaña Roles." name="role create" value="4"/>
|
||||
<action description="Borrar roles" longdescription="Borrar roles en la sección Roles y Miembros > pestaña Roles." name="role delete" value="5"/>
|
||||
<action description="Cambiar el nombre, la etiqueta y la descripción de los roles, así como qué miembros se muestran públicamente en ese rol" longdescription="Cambiar el nombre, la etiqueta y la descripción de los roles, y si los miembros se muestran públicamente en ese rol. Esto se hace al final de la sección Roles y Miembros > pestaña Roles, luego de seleccionar un Rol." name="role properties" value="6"/>
|
||||
<action description="Designar miembros para el rol del asignador" longdescription="Añadir miembros a los roles en la lista de Roles asignados (sección Roles y Miembros > pestaña Miembros). Un miembro con esta capacidad sólo puede añadir miembros a los roles que tenga él mismo." name="role assign member limited" value="7"/>
|
||||
<action description="Designar miembros para cualquier rol" longdescription="Asignar miembros a cualquier rol en la lista de roles asignados (Sección Roles y miembros > pestaña Miembros) *AVISO* Todos los miembros que tengan un rol con esta capacidad podrán asignarse a sí mismos -y a otros miembros que no sean los propietarios- roles con mayores poderes de los que actualmente tienen. Potencialmente, podrían elevarse hasta poderes cercanos a los del propietario. Asegúrate de lo que estás haciendo antes de otorgar esta capacidad." name="role assign member" value="8"/>
|
||||
<action description="Quitar capacidades a los miembros" longdescription="Quitar miembros de los roles en la lista de roles asignados (sección Roles y Miembros > pestaña Miembros). No se puede quitar a los Propietarios." name="role remove member" value="9"/>
|
||||
<action description="Añadir o quitar capacidades a los roles" longdescription="Asignar y quitar habilidades para cada Rol en la lista de capacidades permitidas (Sección Roles y Miembros > pestaña Roles). *AVISO* Todos los miembros que tengan un rol con esta capacidad podrán asignarse a sí mismos -y a otros miembros que no sean los propietarios- todas las capacidades. Potencialmente, podrían elevarse hasta poderes cercanos a los del propietario. Asegúrate de lo que estás haciendo antes de otorgar esta capacidad." name="role change actions" value="10"/>
|
||||
</action_set>
|
||||
<action_set description="Estas capacidades incluyen poderes para modificar la identidad del grupo, como su visibilidad pública, su carta o su emblema." name="Group Identity">
|
||||
<action description="Cambiar la carta, emblema, 'Mostrar en la búsqueda', y qué miembros serán visibles en la información del grupo" longdescription="Cambia la carta, emblema y 'Mostrar en la búsqueda'. Se hace en la sección General." name="group change identity" value="11"/>
|
||||
|
|
|
|||
|
|
@ -31,7 +31,7 @@
|
|||
<text name="AvatarPhysicsDetailText">
|
||||
Faible
|
||||
</text>
|
||||
<text name="ShadersText">
|
||||
<text name="HardwareText">
|
||||
Matériel
|
||||
</text>
|
||||
<slider label="Mémoire textures (Mo) :" name="GraphicsCardTextureMemory" tool_tip="Quantité de mémoire à affecter aux textures. Utilise la mémoire de la carte vidéo par défaut. Si vous réduisez ce paramètre, cela peut améliorer les performances, mais les textures risquent d’être floues."/>
|
||||
|
|
@ -56,6 +56,9 @@
|
|||
<text name="antialiasing restart">
|
||||
(redémarrage requis)
|
||||
</text>
|
||||
<text name="MeshText">
|
||||
Maillage
|
||||
</text>
|
||||
<slider label="Détails des rendus des terrains :" name="TerrainMeshDetail"/>
|
||||
<text name="TerrainMeshDetailText">
|
||||
Faible
|
||||
|
|
@ -72,6 +75,9 @@
|
|||
<text name="FlexibleMeshDetailText">
|
||||
Faible
|
||||
</text>
|
||||
<text name="ShadersText">
|
||||
Effets
|
||||
</text>
|
||||
<check_box initial_value="true" label="Eau transparente" name="TransparentWater"/>
|
||||
<check_box initial_value="true" label="Placage de relief et brillance" name="BumpShiny"/>
|
||||
<check_box initial_value="true" label="Lumières locales" name="LocalLights"/>
|
||||
|
|
@ -111,5 +117,6 @@
|
|||
<button label="Réinitialiser les paramètres recommandés" name="Defaults"/>
|
||||
<button label="OK" label_selected="OK" name="OK"/>
|
||||
<button label="Annuler" label_selected="Annuler" name="Cancel"/>
|
||||
<check_box label="RenderAvatarMaxComplexity" name="RenderAvatarMaxNonImpostors"/>
|
||||
<check_box label="RenderAvatarMaxComplexity" name="RenderAvatarMaxComplexity"/>
|
||||
<check_box label="RenderAvatarMaxNonImpostors" name="RenderAvatarMaxNonImpostors"/>
|
||||
</floater>
|
||||
|
|
|
|||
|
|
@ -1,5 +1,9 @@
|
|||
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
|
||||
<toggleable_menu name="menu_blocked_gear">
|
||||
<menu_item_call label="Cesser d'ignorer" name="unblock"/>
|
||||
<menu_item_call label="Profil" name="profile"/>
|
||||
<menu_item_call label="Ne plus ignorer" name="unblock"/>
|
||||
<menu_item_check label="Bloquer le chat vocal" name="BlockVoice"/>
|
||||
<menu_item_check label="Ignorer le texte" name="MuteText"/>
|
||||
<menu_item_check label="Ignorez les particules" name="MuteParticles"/>
|
||||
<menu_item_check label="Bloquer les sons des objets" name="BlockObjectSounds"/>
|
||||
<menu_item_call label="Profil..." name="profile"/>
|
||||
</toggleable_menu>
|
||||
|
|
|
|||
|
|
@ -4275,7 +4275,7 @@ Veuillez sélectionner un terrain plus petit.
|
|||
Une erreur interne nous a empêchés de mettre votre client à jour correctement. Le solde de L$ et le patrimoine affichés dans votre client peuvent ne pas correspondre à votre solde réel sur les serveurs.
|
||||
</notification>
|
||||
<notification name="LargePrimAgentIntersect">
|
||||
Impossible de créer de grandes prims qui coupent d'autres joueurs. Réessayez une fois que les autres joueurs se seront déplacés.
|
||||
Impossible de créer de grands prims qui rejoignent d'autres résidents. Veuillez essayer à nouveau lorsque les autres résidents seront partis.
|
||||
</notification>
|
||||
<notification name="PreferenceChatClearLog">
|
||||
Cela supprimera les journaux des conversations précédentes, ainsi que toute copie de sauvegarde de ce fichier.
|
||||
|
|
|
|||
|
|
@ -63,6 +63,11 @@
|
|||
<text name="static2">Droits accordés</text>
|
||||
<scroll_list tool_tip="Consultez l'onglet des droits pour les détails des droits accordés" name="member_allowed_actions"/>
|
||||
</panel>
|
||||
<panel name="members_header">
|
||||
<text_editor name="member_action_description">
|
||||
Ce pouvoir permet « d'expulser des membres de ce groupe ». Seul un propriétaire peut expulser un autre propriétaire.
|
||||
</text_editor>
|
||||
</panel>
|
||||
<panel name="roles_footer">
|
||||
<text name="role_name_label">Nom du rôle</text>
|
||||
<text name="role_title_label">Titre du rôle</text>
|
||||
|
|
@ -76,6 +81,11 @@
|
|||
<scroll_list name="role_allowed_actions" tool_tip="Consulter l'onglet des droits pour les détails de chaque droit accordé"/>
|
||||
</panel>
|
||||
</panel>
|
||||
<panel name="roles_header">
|
||||
<text_editor name="role_action_description">
|
||||
Ce pouvoir permet « d'expulser des membres de ce groupe ». Seul un propriétaire peut expulser un autre propriétaire.
|
||||
</text_editor>
|
||||
</panel>
|
||||
<panel name="actions_footer">
|
||||
<panel name="action_description_panel">
|
||||
<text_editor name="action_description">Ce droit est 'Éjecter des membres de ce groupe'. Seul un propriétaire peut en éjecter un autre.</text_editor>
|
||||
|
|
|
|||
|
|
@ -12,6 +12,9 @@
|
|||
<text name="title_animation">
|
||||
Animations
|
||||
</text>
|
||||
<text name="title_model">
|
||||
Modèles
|
||||
</text>
|
||||
<text name="upload_help">
|
||||
Pour modifier un dossier de destination, cliquez-droit sur ce dossier dans l’inventaire et faites votre choix
|
||||
"Utiliser comme défaut pour"
|
||||
|
|
|
|||
|
|
@ -31,7 +31,7 @@
|
|||
<text name="AvatarPhysicsDetailText">
|
||||
Basso
|
||||
</text>
|
||||
<text name="ShadersText">
|
||||
<text name="HardwareText">
|
||||
Hardware
|
||||
</text>
|
||||
<slider label="Memoria texture (MB):" name="GraphicsCardTextureMemory" tool_tip="Spazio di memoria da assegnare alle texture. Utilizza la memoria della scheda video come impostazione predefinita. La riduzione di questa impostazione potrebbe migliorare il rendimento ma potrebbe anche rendere le texture poco definite."/>
|
||||
|
|
@ -56,6 +56,9 @@
|
|||
<text name="antialiasing restart">
|
||||
(richiede il riavvio)
|
||||
</text>
|
||||
<text name="MeshText">
|
||||
Mesh
|
||||
</text>
|
||||
<slider label="Dettagli mesh terreno:" name="TerrainMeshDetail"/>
|
||||
<text name="TerrainMeshDetailText">
|
||||
Basso
|
||||
|
|
@ -72,6 +75,9 @@
|
|||
<text name="FlexibleMeshDetailText">
|
||||
Basso
|
||||
</text>
|
||||
<text name="ShadersText">
|
||||
Shader
|
||||
</text>
|
||||
<check_box initial_value="true" label="Acqua trasparente" name="TransparentWater"/>
|
||||
<check_box initial_value="true" label="Mappatura urti e brillantezza" name="BumpShiny"/>
|
||||
<check_box initial_value="true" label="Luci locali" name="LocalLights"/>
|
||||
|
|
@ -111,5 +117,6 @@
|
|||
<button label="Ripristina impostazioni consigliate" name="Defaults"/>
|
||||
<button label="OK" label_selected="OK" name="OK"/>
|
||||
<button label="Annulla" label_selected="Annulla" name="Cancel"/>
|
||||
<check_box label="RenderAvatarMaxComplexity" name="RenderAvatarMaxNonImpostors"/>
|
||||
<check_box label="RenderAvatarMaxComplexity" name="RenderAvatarMaxComplexity"/>
|
||||
<check_box label="RenderAvatarMaxNonImpostors" name="RenderAvatarMaxNonImpostors"/>
|
||||
</floater>
|
||||
|
|
|
|||
|
|
@ -3,6 +3,7 @@
|
|||
<menu_item_call label="Sblocca" name="unblock"/>
|
||||
<menu_item_check label="Blocca voce" name="BlockVoice"/>
|
||||
<menu_item_check label="Blocca testo" name="MuteText"/>
|
||||
<menu_item_check label="Blocca Particelle" name="MuteParticles"/>
|
||||
<menu_item_check label="Blocca suoni oggetto" name="BlockObjectSounds"/>
|
||||
<menu_item_call label="Profilo..." name="profile"/>
|
||||
</toggleable_menu>
|
||||
|
|
|
|||
|
|
@ -4254,7 +4254,7 @@ Prova a selezionare un pezzo di terreno più piccolo.
|
|||
Un errore interno ha impedito l'aggiornamento del Viewer. Il saldo in L$ o i lotti posseduti mostrati nel Viewer potrebbero non corrispondere ai valori correnti sui server.
|
||||
</notification>
|
||||
<notification name="LargePrimAgentIntersect">
|
||||
Non puoi creare prim grandi che intersecano altri giocatori. Riprova quando gli altri giocatori si sono spostati.
|
||||
Impossibile creare prim larghi che si intersechino con altri residenti. Si prega di riprovare quando gli altri residenti si saranno mossi.
|
||||
</notification>
|
||||
<notification name="PreferenceChatClearLog">
|
||||
Verranno cancellati i registri delle conversazioni precedenti e tutti gli eventuali backup di quel file.
|
||||
|
|
|
|||
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue