Merge Firestorm LGPL tip

Ansariel 2015-01-08 23:12:58 +01:00
commit e1ce6e3d58
412 changed files with 7612 additions and 3916 deletions

View File

@ -18,9 +18,9 @@ mailing list. We've created a non-KDU build target to make this easier. Everywhe
Available premade firestorm-specific build targets:
ReleaseFS (includes KDU, FMOD)
ReleaseFS_open (no KDU, no FMOD)
RelWithDebInfoFS_open (no KDU, no FMOD)
ReleaseFS (includes KDU, FMOD)
ReleaseFS_open (no KDU, no FMOD)
RelWithDebInfoFS_open (no KDU, no FMOD)
To build firestorm:
@ -41,10 +41,7 @@ Typical LL autobuild configure options should also work, as long as they don't d
already doing.
Logs:
Look for logs in build-linux-i686/logs
Output:
Look for output in build-linux-i686/newview/Release

View File

@ -32,16 +32,15 @@ build, using openjpeg instead of KDU.
Available premade firestorm-specific build targets:
ReleaseFS (includes KDU, FMOD)
ReleaseFS_open (no KDU, no FMOD)
RelWithDebInfo_open (no KDU, no FMOD)
ReleaseFS (includes KDU, FMOD)
ReleaseFS_open (no KDU, no FMOD)
RelWithDebInfo_open (no KDU, no FMOD)
To build firestorm:
autobuild build -c ReleaseFS
Other examples:
autobuild configure -c ReleaseFS # basic configuration step, don't build, just configure
autobuild configure -c ReleaseFS -- --clean # clean the output area first, then configure
autobuild configure -c ReleaseFS -- --chan Private-Yourname # configure with a custom channel

View File

@ -2,7 +2,7 @@ Before you start configuring your Windows build system, be aware of our tested c
Memory: You will need at least 2GB RAM, 4GB strongly recommended.
CPU: Multiple CPUs are strongly recommended.
A build can take over an hour.
Visual Studio 2010.
Visual Studio 2010 SP1.
Ensure you can build a stock viewer-development try as described in the SL wiki. Before asking for any help
compiling Firestorm, make sure you can build viewer-development first. If you try and skip this step, you may
@ -32,9 +32,9 @@ After launching the VS2010 cmd shell and navigating to your firestorm code repo:
Other build targets you may use are:
ReleaseFS (includes KDU, FMOD)
ReleaseFS_open (no KDU, no FMOD)
RelWithDebInfoFS_open (no KDU, no FMOD)
ReleaseFS (includes KDU, FMOD)
ReleaseFS_open (no KDU, no FMOD)
RelWithDebInfoFS_open (no KDU, no FMOD)
Other examples:
autobuild configure -c ReleaseFS # basic configuration step, don't build, just configure

View File

@ -1,7 +1,7 @@
This is WIP. Please change/expand when seeing fit.
1.1 Visual Studio 2010 Pro or better with installed 64 bit compiler.
1.2 Or Visual Studio Express and 'Microsoft Windows SDK for Windows 7 and .NET Framework 4'. Make sure to install at least the header and compiler.
1.2 Or Visual Studio Express and 'Microsoft Windows SDK for Windows 7 and .NET Framework 4'. Make sure to install at least the header and compiler with all the latest service packs.
2. autobuild from https://bitbucket.org/NickyD/autobuild
3. FMOD, if you want sound, please see https://bitbucket.org/NickyD/3p-fmodex

View File

@ -1872,9 +1872,9 @@
<key>archive</key>
<map>
<key>hash</key>
<string>4a98d727561cd1f4ac5ee02907411df1</string>
<string>3c2b6be4c78b2479c3fae612e1053d37</string>
<key>url</key>
<string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-llqtwebkit/rev/250147/arch/Darwin/installer/llqtwebkit-4.7.1-darwin-20120228.tar.bz2</string>
<string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/canonical_3p-llqtwebkit2/rev/295522/arch/Darwin/installer/llqtwebkit-4.7.1-darwin-20141015.tar.bz2</string>
</map>
<key>name</key>
<string>darwin</string>
@ -1884,9 +1884,9 @@
<key>archive</key>
<map>
<key>hash</key>
<string>f50e5f0cc880c55b3f0f7e67dc8f7221</string>
<string>d31358176b9ba8c676458cc061767c0b</string>
<key>url</key>
<string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-llqtwebkit/rev/250147/arch/Linux/installer/llqtwebkit-4.7.1-linux-20120228.tar.bz2</string>
<string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/canonical_3p-llqtwebkit2/rev/295522/arch/Linux/installer/llqtwebkit-4.7.1-linux-20141015.tar.bz2</string>
</map>
<key>name</key>
<string>linux</string>
@ -1908,9 +1908,9 @@
<key>archive</key>
<map>
<key>hash</key>
<string>5e3cd6af397e853a963a6de40d440ff4</string>
<string>bb4e8c8006c8a7aef6d3e3c36a8cebbf</string>
<key>url</key>
<string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-llqtwebkit/rev/250147/arch/CYGWIN/installer/llqtwebkit-4.7.1-windows-20120228.tar.bz2</string>
<string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/canonical_3p-llqtwebkit2/rev/295522/arch/CYGWIN/installer/llqtwebkit-4.7.1-windows-20141015.tar.bz2</string>
</map>
<key>name</key>
<string>windows</string>
@ -2404,9 +2404,9 @@
<key>archive</key>
<map>
<key>hash</key>
<string>6849432c00ee2db495016c45f0f30122</string>
<string>7dde5d6bfa45124a4c7b342a7a4f3f77</string>
<key>url</key>
<string>http://downloads.phoenixviewer.com/slplugin_x86-1.0-darwin-20140630.tar.bz2</string>
<string>http://downloads.phoenixviewer.com/slplugin_x86-4.6.9.42958-darwin-20141122.tar.bz2</string>
</map>
<key>name</key>
<string>darwin</string>

View File

@ -1 +1 @@
VERSION_VIEWER=4.6.8
VERSION_VIEWER=4.7.0

View File

@ -251,13 +251,6 @@ elseif(DARWIN)
libgrowl++.dylib
)
# <FS:ND> libllqtwebkit.dylib comes from a prebuild slplugin. It needs to be fetched from somewhere else
# when building x64/universal. Probably it's best to copy it in fs_viewer_manifest.py for those cases.
if( NOT ND_BUILD64BIT_ARCH )
set(release_files ${release_files} libllqtwebkit.dylib )
endif( NOT ND_BUILD64BIT_ARCH )
# </FS:ND>
# <FS:ND> We only ever need google breakpad when crash reporting is used
if(RELEASE_CRASH_REPORTING OR NON_RELEASE_CRASH_REPORTING)
set(release_files ${release_files} "libexception_handler.dylib")

View File

@ -53,8 +53,12 @@ if (WINDOWS)
)
elseif (DARWIN)
set(WEBKIT_PLUGIN_LIBRARIES
optimized ${ARCH_PREBUILT_DIRS_RELEASE}/libllqtwebkit.dylib
debug ${ARCH_PREBUILT_DIRS_RELEASE}/libllqtwebkit.dylib
${ARCH_PREBUILT_DIRS_RELEASE}/libllqtwebkit.a
${ARCH_PREBUILT_DIRS_RELEASE}/libQtWebKit.4.dylib
${ARCH_PREBUILT_DIRS_RELEASE}/libQtOpenGL.4.dylib
${ARCH_PREBUILT_DIRS_RELEASE}/libQtNetwork.4.dylib
${ARCH_PREBUILT_DIRS_RELEASE}/libQtGui.4.dylib
${ARCH_PREBUILT_DIRS_RELEASE}/libQtCore.4.dylib
)
elseif (LINUX)
# FIRE-6108, add missing if clause for standalone builds - TL
@ -74,7 +78,7 @@ elseif (LINUX)
QtGui
QtCore
jpeg
jscore
# jscore
fontconfig
X11
Xrender

View File

@ -89,6 +89,14 @@ struct LLCalcParser : grammar<LLCalcParser>
(str_p("ASIN") >> '(' >> expression[unary_func.value = bind(&LLCalcParser::_asin)(self,arg1)]) |
(str_p("ACOS") >> '(' >> expression[unary_func.value = bind(&LLCalcParser::_acos)(self,arg1)]) |
(str_p("ATAN") >> '(' >> expression[unary_func.value = bind(&LLCalcParser::_atan)(self,arg1)]) |
// <FS:Ansariel> FIRE-14618: Provide radian-based functions
(str_p("SINR") >> '(' >> expression[unary_func.value = bind(&LLCalcParser::_sinr)(self,arg1)]) |
(str_p("COSR") >> '(' >> expression[unary_func.value = bind(&LLCalcParser::_cosr)(self,arg1)]) |
(str_p("TANR") >> '(' >> expression[unary_func.value = bind(&LLCalcParser::_tanr)(self,arg1)]) |
(str_p("ASINR") >> '(' >> expression[unary_func.value = bind(&LLCalcParser::_asinr)(self,arg1)]) |
(str_p("ACOSR") >> '(' >> expression[unary_func.value = bind(&LLCalcParser::_acosr)(self,arg1)]) |
(str_p("ATANR") >> '(' >> expression[unary_func.value = bind(&LLCalcParser::_atanr)(self,arg1)]) |
// </FS:Ansariel>
(str_p("SQRT") >> '(' >> expression[unary_func.value = bind(&LLCalcParser::_sqrt)(self,arg1)]) |
(str_p("LOG") >> '(' >> expression[unary_func.value = bind(&LLCalcParser::_log)(self,arg1)]) |
(str_p("EXP") >> '(' >> expression[unary_func.value = bind(&LLCalcParser::_exp)(self,arg1)]) |
@ -169,9 +177,17 @@ private:
F32 _sin(const F32& a) const { return sin(DEG_TO_RAD * a); }
F32 _cos(const F32& a) const { return cos(DEG_TO_RAD * a); }
F32 _tan(const F32& a) const { return tan(DEG_TO_RAD * a); }
F32 _asin(const F32& a) const { return asin(a * RAD_TO_DEG); }
F32 _acos(const F32& a) const { return acos(a * RAD_TO_DEG); }
F32 _atan(const F32& a) const { return atan(a * RAD_TO_DEG); }
F32 _asin(const F32& a) const { return asin(a) * RAD_TO_DEG; }
F32 _acos(const F32& a) const { return acos(a) * RAD_TO_DEG; }
F32 _atan(const F32& a) const { return atan(a) * RAD_TO_DEG; }
// <FS:Ansariel> FIRE-14618: Provide radian-based functions
F32 _sinr(const F32& a) const { return sin(a); }
F32 _cosr(const F32& a) const { return cos(a); }
F32 _tanr(const F32& a) const { return tan(a); }
F32 _asinr(const F32& a) const { return asin(a); }
F32 _acosr(const F32& a) const { return acos(a); }
F32 _atanr(const F32& a) const { return atan(a); }
// </FS:Ansariel>
F32 _sqrt(const F32& a) const { return sqrt(a); }
F32 _log(const F32& a) const { return log(a); }
F32 _exp(const F32& a) const { return exp(a); }

View File

@ -87,6 +87,7 @@ LLShaderFeatures::LLShaderFeatures()
, mIndexedTextureChannels(0)
, disableTextureIndex(false)
, hasAlphaMask(false)
, attachNothing(false)
{
}
@ -119,28 +120,31 @@ struct LLGLSLShaderCompareTimeElapsed
};
//static
void LLGLSLShader::finishProfile()
void LLGLSLShader::finishProfile(bool emit_report)
{
sProfileEnabled = false;
std::vector<LLGLSLShader*> sorted;
for (std::set<LLGLSLShader*>::iterator iter = sInstances.begin(); iter != sInstances.end(); ++iter)
if (emit_report)
{
sorted.push_back(*iter);
}
std::vector<LLGLSLShader*> sorted;
std::sort(sorted.begin(), sorted.end(), LLGLSLShaderCompareTimeElapsed());
for (std::set<LLGLSLShader*>::iterator iter = sInstances.begin(); iter != sInstances.end(); ++iter)
{
sorted.push_back(*iter);
}
for (std::vector<LLGLSLShader*>::iterator iter = sorted.begin(); iter != sorted.end(); ++iter)
{
(*iter)->dumpStats();
}
std::sort(sorted.begin(), sorted.end(), LLGLSLShaderCompareTimeElapsed());
for (std::vector<LLGLSLShader*>::iterator iter = sorted.begin(); iter != sorted.end(); ++iter)
{
(*iter)->dumpStats();
}
LL_INFOS() << "-----------------------------------" << LL_ENDL;
LL_INFOS() << "Total rendering time: " << llformat("%.4f ms", sTotalTimeElapsed/1000000.f) << LL_ENDL;
LL_INFOS() << "Total samples drawn: " << llformat("%.4f million", sTotalSamplesDrawn/1000000.f) << LL_ENDL;
LL_INFOS() << "Total triangles drawn: " << llformat("%.3f million", sTotalTrianglesDrawn/1000000.f) << LL_ENDL;
}
}
void LLGLSLShader::clearStats()
@ -175,7 +179,7 @@ void LLGLSLShader::dumpStats()
}
}
LL_INFOS() << "=============================================" << LL_ENDL;
F32 ms = mTimeElapsed/1000000.f;
F32 seconds = ms/1000.f;
@ -210,7 +214,7 @@ void LLGLSLShader::startProfile()
//static
void LLGLSLShader::stopProfile(U32 count, U32 mode)
{
if (sProfileEnabled)
if (sProfileEnabled && sCurBoundShaderPtr)
{
sCurBoundShaderPtr->readProfileQuery(count, mode);
}
@ -221,6 +225,7 @@ void LLGLSLShader::placeProfileQuery()
#if !LL_DARWIN
if (mTimerQuery == 0)
{
glGenQueriesARB(1, &mSamplesQuery);
glGenQueriesARB(1, &mTimerQuery);
}
@ -257,7 +262,7 @@ void LLGLSLShader::placeProfileQuery()
}
glBeginQueryARB(GL_SAMPLES_PASSED, 1);
glBeginQueryARB(GL_SAMPLES_PASSED, mSamplesQuery);
glBeginQueryARB(GL_TIME_ELAPSED, mTimerQuery);
#endif
}
@ -275,7 +280,7 @@ void LLGLSLShader::readProfileQuery(U32 count, U32 mode)
//U64 samples_passed = 0;
GLuint64 samples_passed = 0;
glGetQueryObjectui64v(1, GL_QUERY_RESULT, &samples_passed);
glGetQueryObjectui64v(mSamplesQuery, GL_QUERY_RESULT, &samples_passed);
sTotalTimeElapsed += time_elapsed;
mTimeElapsed += time_elapsed;
@ -310,14 +315,15 @@ LLGLSLShader::LLGLSLShader()
mShaderLevel(0),
mShaderGroup(SG_DEFAULT),
mUniformsDirty(FALSE),
mTimerQuery(0)
mTimerQuery(0),
mSamplesQuery(0)
{
}
LLGLSLShader::~LLGLSLShader()
{
}
void LLGLSLShader::unload()
@ -352,6 +358,18 @@ void LLGLSLShader::unload()
mProgramObject = 0;
}
if (mTimerQuery)
{
glDeleteQueriesARB(1, &mTimerQuery);
mTimerQuery = 0;
}
if (mSamplesQuery)
{
glDeleteQueriesARB(1, &mSamplesQuery);
mSamplesQuery = 0;
}
//hack to make apple not complain
glGetError();

View File

@ -51,6 +51,7 @@ public:
S32 mIndexedTextureChannels;
bool disableTextureIndex;
bool hasAlphaMask;
bool attachNothing;
// char numLights;
@ -80,7 +81,7 @@ public:
static bool sNoFixedFunction;
static void initProfile();
static void finishProfile();
static void finishProfile(bool emit_report = true);
static void startProfile();
static void stopProfile(U32 count, U32 mode);
@ -184,6 +185,7 @@ public:
//statistcis for profiling shader performance
U32 mTimerQuery;
U32 mSamplesQuery;
U64 mTimeElapsed;
static U64 sTotalTimeElapsed;
U32 mTrianglesDrawn;

View File

@ -192,7 +192,10 @@ protected:
protected:
LLGLTextureState mTextureState ;
// <FS>ND> Expose mipmap generation so we can check it for texture memory tax
public:
bool getUseMipMaps() const { return mUseMipMaps; }
// </FS:ND>
};
#endif // LL_GL_TEXTURE_H

View File

@ -388,6 +388,7 @@ void LLRenderTarget::release()
//
if (mFBO && (mTex.size() > 1))
{
glBindFramebuffer(GL_FRAMEBUFFER, mFBO);
S32 z;
for (z = mTex.size() - 1; z >= 1; z--)
{

View File

@ -73,7 +73,11 @@ BOOL LLShaderMgr::attachShaderFeatures(LLGLSLShader * shader)
{
llassert_always(shader != NULL);
LLShaderFeatures *features = & shader->mFeatures;
if (features->attachNothing)
{
return TRUE;
}
//////////////////////////////////////
// Attach Vertex Shader Features First
//////////////////////////////////////

View File

@ -53,6 +53,7 @@ LLChatEntry::LLChatEntry(const Params& p)
mCurrentHistoryLine = mLineHistory.begin();
mAutoIndent = false;
keepSelectionOnReturn(true);
}
LLChatEntry::~LLChatEntry()
@ -185,15 +186,6 @@ BOOL LLChatEntry::handleSpecialKey(const KEY key, const MASK mask)
{
BOOL handled = FALSE;
// In the case of a chat entry, pressing RETURN when something is selected
// should NOT erase the selection (unlike a notecard, for example)
if (key == KEY_RETURN)
{
endOfDoc();
startSelection();
endSelection();
}
LLTextEditor::handleSpecialKey(key, mask);
switch(key)

View File

@ -937,7 +937,10 @@ void LLComboBox::updateSelection()
mTextEntry->setTentative(FALSE);
mLastSelectedIndex = mList->getFirstSelectedIndex();
}
else if (mList->selectItemByPrefix(left_wstring, FALSE))
// <FS:Ansariel> Allow fulltext search in comboboxes
//else if (mList->selectItemByPrefix(left_wstring, FALSE))
else if (!LLControlGroup::getInstance("Global")->getBOOL("FSComboboxSubstringSearch") && mList->selectItemByPrefix(left_wstring, FALSE))
// </FS:Ansariel>
{
LLWString selected_item = utf8str_to_wstring(getSelectedItemLabel());
LLWString wtext = left_wstring + selected_item.substr(left_wstring.size(), selected_item.size());
@ -948,6 +951,18 @@ void LLComboBox::updateSelection()
mHasAutocompletedText = TRUE;
mLastSelectedIndex = mList->getFirstSelectedIndex();
}
// <FS:Ansariel> Allow fulltext search in comboboxes
else if (LLControlGroup::getInstance("Global")->getBOOL("FSComboboxSubstringSearch") && mList->selectItemBySubstring(left_wstring, FALSE))
{
LLWString selected_item = utf8str_to_wstring(getSelectedItemLabel());
mTextEntry->setText(wstring_to_utf8str(left_wstring) + " (" + getSelectedItemLabel() + ")");
mTextEntry->setSelection(left_wstring.size(), mTextEntry->getWText().size());
mTextEntry->endSelection();
mTextEntry->setTentative(FALSE);
mHasAutocompletedText = TRUE;
mLastSelectedIndex = mList->getFirstSelectedIndex();
}
// </FS:Ansariel>
else // no matching items found
{
mList->deselectAllItems();

View File

@ -2429,7 +2429,10 @@ void LLFloaterView::restoreAll()
for ( child_list_const_iter_t child_it = getChildList()->begin(); child_it != getChildList()->end(); ++child_it)
{
LLFloater* floaterp = (LLFloater*)*child_it;
floaterp->setMinimized(FALSE);
if (floaterp) //<FS:KC> Possible fix for crash on disconnect
{
floaterp->setMinimized(FALSE);
}
}
// *FIX: make sure dependents are restored

View File

@ -275,6 +275,24 @@ BOOL LLFolderViewItem::passedFilter(S32 filter_generation)
return getViewModelItem()->passedFilter(filter_generation);
}
BOOL LLFolderViewItem::isPotentiallyVisible(S32 filter_generation)
{
// Item should be visible if:
// 1. item passed current filter
// 2. item was updated (gen < 0) but has descendants that passed filter
// 3. item was recently updated and was visible before update
LLFolderViewModelItem* model = getViewModelItem();
if (model->getLastFilterGeneration() < 0 && !getFolderViewModel()->getFilter().isModified())
{
return model->descendantsPassedFilter(filter_generation) || getVisible();
}
else
{
return model->passedFilter(filter_generation);
}
}
void LLFolderViewItem::refresh()
{
LLFolderViewModelItem& vmi = *getViewModelItem();
@ -722,7 +740,7 @@ void LLFolderViewItem::drawOpenFolderArrow(const Params& default_params, const L
//
const S32 TOP_PAD = default_params.item_top_pad;
if (hasVisibleChildren() || getViewModelItem()->hasChildren())
if (hasVisibleChildren())
{
LLUIImage* arrow_image = default_params.folder_arrow_image;
gl_draw_scaled_rotated_image(
@ -1077,7 +1095,7 @@ S32 LLFolderViewFolder::arrange( S32* width, S32* height )
getRoot()->getFolderViewModel()->sort(this);
LL_RECORD_BLOCK_TIME(FTM_ARRANGE);
// evaluate mHasVisibleChildren
mHasVisibleChildren = false;
if (getViewModelItem()->descendantsPassedFilter())
@ -1088,7 +1106,7 @@ S32 LLFolderViewFolder::arrange( S32* width, S32* height )
for (items_t::iterator iit = mItems.begin(); iit != mItems.end(); ++iit)
{
LLFolderViewItem* itemp = (*iit);
found = itemp->passedFilter();
found = itemp->isPotentiallyVisible();
if (found)
break;
}
@ -1098,7 +1116,7 @@ S32 LLFolderViewFolder::arrange( S32* width, S32* height )
for (folders_t::iterator fit = mFolders.begin(); fit != mFolders.end(); ++fit)
{
LLFolderViewFolder* folderp = (*fit);
found = folderp->passedFilter();
found = folderp->isPotentiallyVisible();
if (found)
break;
}
@ -1131,7 +1149,7 @@ S32 LLFolderViewFolder::arrange( S32* width, S32* height )
for(folders_t::iterator fit = mFolders.begin(); fit != mFolders.end(); ++fit)
{
LLFolderViewFolder* folderp = (*fit);
folderp->setVisible(folderp->passedFilter()); // passed filter or has descendants that passed filter
folderp->setVisible(folderp->isPotentiallyVisible());
if (folderp->getVisible())
{
@ -1150,7 +1168,7 @@ S32 LLFolderViewFolder::arrange( S32* width, S32* height )
iit != mItems.end(); ++iit)
{
LLFolderViewItem* itemp = (*iit);
itemp->setVisible(itemp->passedFilter());
itemp->setVisible(itemp->isPotentiallyVisible());
if (itemp->getVisible())
{

View File

@ -263,6 +263,7 @@ public:
S32 getIndentation() { return mIndentation; }
virtual BOOL passedFilter(S32 filter_generation = -1);
virtual BOOL isPotentiallyVisible(S32 filter_generation = -1);
// refresh information from the object being viewed.
virtual void refresh();

View File

@ -49,8 +49,7 @@ LLLayoutPanel::Params::Params()
: expanded_min_dim("expanded_min_dim", 0),
min_dim("min_dim", -1),
user_resize("user_resize", false),
auto_resize("auto_resize", true),
force_resize_bar("force_resize_bar", false) // <FS:Ansariel> FIRE-5141: Add option to force display of a resize handle
auto_resize("auto_resize", true)
{
addSynonym(min_dim, "min_width");
addSynonym(min_dim, "min_height");
@ -69,8 +68,7 @@ LLLayoutPanel::LLLayoutPanel(const Params& p)
mFractionalSize(0.f),
mTargetDim(0),
mIgnoreReshape(false),
mOrientation(LLLayoutStack::HORIZONTAL),
mForceResizeBar(p.force_resize_bar) // <FS:Ansariel> FIRE-5141: Add option to force display of a resize handle
mOrientation(LLLayoutStack::HORIZONTAL)
{
// panels initialized as hidden should not start out partially visible
if (!getVisible())
@ -476,10 +474,7 @@ void LLLayoutStack::updateLayout()
if (panelp->mAutoResize
&& !panelp->mCollapsed
// <FS:Ansariel> FIRE-5141: Add option to force display of a resize handle
//&& panelp->getVisible())
&& (panelp->getVisible() || panelp->mForceResizeBar))
// </FS:Ansariel>
&& panelp->getVisible())
{
S32 space_for_panel = remaining_space > 0 ? 1 : -1;
panelp->mTargetDim += space_for_panel;
@ -792,10 +787,7 @@ bool LLLayoutStack::animatePanels()
//
BOOST_FOREACH(LLLayoutPanel* panelp, mPanels)
{
// <FS:Ansariel> FIRE-5141: Add option to force display of a resize handle
//if (panelp->getVisible())
if (panelp->getVisible() || panelp->mForceResizeBar)
// </FS:Ansariel>
if (panelp->getVisible())
{
if (mAnimate && panelp->mVisibleAmt < 1.f)
{
@ -896,10 +888,7 @@ void LLLayoutStack::updatePanelRect( LLLayoutPanel* resized_panel, const LLRect&
if (panelp->mAutoResize)
{
old_auto_resize_headroom += (F32)(panelp->mTargetDim - panelp->getRelevantMinDim());
// <FS:Ansariel> FIRE-5141: Add option to force display of a resize handle
//if (panelp->getVisible() && !panelp->mCollapsed)
if ((panelp->getVisible() || panelp->mForceResizeBar) && !panelp->mCollapsed)
// </FS:Ansariel>
if (panelp->getVisible() && !panelp->mCollapsed)
{
total_visible_fraction += panelp->mFractionalSize;
}
@ -910,10 +899,7 @@ void LLLayoutStack::updatePanelRect( LLLayoutPanel* resized_panel, const LLRect&
other_resize_panel = following_panel;
}
// <FS:Ansariel> FIRE-5141: Add option to force display of a resize handle
//if (panelp->getVisible() && !panelp->mCollapsed)
if ((panelp->getVisible() || panelp->mForceResizeBar) && !panelp->mCollapsed)
// </FS:Ansariel>
if (panelp->getVisible() && !panelp->mCollapsed)
{
following_panel = panelp;
}
@ -948,10 +934,7 @@ void LLLayoutStack::updatePanelRect( LLLayoutPanel* resized_panel, const LLRect&
BOOST_FOREACH(LLLayoutPanel* panelp, mPanels)
{
// <FS:Ansariel> FIRE-5141: Add option to force display of a resize handle
//if (!panelp->getVisible() || panelp->mCollapsed)
if ((!panelp->getVisible() && !panelp->mForceResizeBar) || panelp->mCollapsed)
// </FS:Ansariel>
if (!panelp->getVisible() || panelp->mCollapsed)
{
if (panelp->mAutoResize)
{
@ -1059,10 +1042,7 @@ void LLLayoutStack::updateResizeBarLimits()
LLLayoutPanel* previous_visible_panelp = NULL;
BOOST_REVERSE_FOREACH(LLLayoutPanel* visible_panelp, mPanels)
{
// <FS:Ansariel> FIRE-5141: Add option to force display of a resize handle
//if (!visible_panelp->getVisible() || visible_panelp->mCollapsed)
if ((!visible_panelp->getVisible() && !visible_panelp->mForceResizeBar) || visible_panelp->mCollapsed)
// </FS:Ansariel>
if (!visible_panelp->getVisible() || visible_panelp->mCollapsed)
{
visible_panelp->mResizeBar->setVisible(FALSE);
continue;

View File

@ -151,9 +151,6 @@ public:
Optional<bool> user_resize,
auto_resize;
// <FS:Ansariel> FIRE-5141: Add option to force display of a resize handle
Optional<bool> force_resize_bar;
Params();
};
@ -223,9 +220,6 @@ protected:
LLView::EOrientation mOrientation;
class LLResizeBar* mResizeBar;
// <FS:Ansariel> FIRE-5141: Add option to force display of a resize handle
bool mForceResizeBar;
// <FS:Ansariel> Add callback for reshaping
reshape_panel_callback_t mReshapePanelCallback;
};

View File

@ -934,6 +934,34 @@ void LLLineEditor::removeChar()
}
}
// <FS> Ctrl-Backspace remove word
// Remove a word (set of characters up to next space/punctuation) from the text
void LLLineEditor::removeWord(bool prev)
{
const U32 pos(getCursor());
if (prev ? pos > 0 : static_cast<S32>(pos) < getLength())
{
U32 new_pos(prev ? prevWordPos(pos) : nextWordPos(pos));
if (new_pos == pos) // Other character we don't jump over
new_pos = prev ? prevWordPos(new_pos-1) : nextWordPos(new_pos+1);
const U32 diff(labs(pos - new_pos));
if (prev)
{
mText.erase(new_pos, diff);
setCursor(new_pos);
}
else
{
mText.erase(pos, diff);
}
}
else
{
LLUI::reportBadKeystroke();
}
}
// </FS>
void LLLineEditor::addChar(const llwchar uni_char)
{
@ -1382,7 +1410,13 @@ BOOL LLLineEditor::handleSpecialKey(KEY key, MASK mask)
else
if( 0 < getCursor() )
{
removeChar();
// <FS> Ctrl-Backspace remove word
//removeChar();
if (mask == MASK_CONTROL)
removeWord(true);
else
removeChar();
// </FS>
}
else
{
@ -1392,6 +1426,16 @@ BOOL LLLineEditor::handleSpecialKey(KEY key, MASK mask)
handled = TRUE;
break;
// <FS> Ctrl-Backspace remove word
case KEY_DELETE:
if (!mReadOnly && mask == MASK_CONTROL)
{
removeWord(false);
handled = true;
}
break;
// </FS>
case KEY_PAGE_UP:
case KEY_HOME:
if (!mIgnoreArrowKeys)

View File

@ -285,6 +285,8 @@ private:
void pasteHelper(bool is_primary);
void removeChar();
// <FS> Ctrl-Backspace remove word
void removeWord(bool prev);
void addChar(const llwchar c);
void setCursorAtLocalPos(S32 local_mouse_x);
S32 findPixelNearestPos(S32 cursor_offset = 0) const;

View File

@ -1318,6 +1318,13 @@ BOOL LLScrollListCtrl::selectItemByPrefix(const std::string& target, BOOL case_s
// Selects first enabled item that has a name where the name's first part matched the target string.
// Returns false if item not found.
BOOL LLScrollListCtrl::selectItemByPrefix(const LLWString& target, BOOL case_sensitive)
// <FS:Ansariel> Allow selection by substring match
{
return selectItemByStringMatch(target, true, case_sensitive);
}
BOOL LLScrollListCtrl::selectItemByStringMatch(const LLWString& target, bool prefix_match, BOOL case_sensitive)
// </FS:Ansariel>
{
BOOL found = FALSE;
@ -1369,7 +1376,18 @@ BOOL LLScrollListCtrl::selectItemByPrefix(const LLWString& target, BOOL case_sen
LLWString trimmed_label = item_label;
LLWStringUtil::trim(trimmed_label);
BOOL select = item->getEnabled() && trimmed_label.compare(0, target_trimmed.size(), target_trimmed) == 0;
// <FS:Ansariel> Allow selection by substring match
//BOOL select = item->getEnabled() && trimmed_label.compare(0, target_trimmed.size(), target_trimmed) == 0;
BOOL select;
if (prefix_match)
{
select = item->getEnabled() && trimmed_label.compare(0, target_trimmed.size(), target_trimmed) == 0;
}
else
{
select = item->getEnabled() && trimmed_label.find(target_trimmed) != std::string::npos;
}
// </FS:Ansariel>
if (select)
{
@ -1391,6 +1409,19 @@ BOOL LLScrollListCtrl::selectItemByPrefix(const LLWString& target, BOOL case_sen
return found;
}
// <FS:Ansariel> Allow selection by substring match
BOOL LLScrollListCtrl::selectItemBySubstring(const std::string& target, BOOL case_sensitive)
{
return selectItemBySubstring(utf8str_to_wstring(target), case_sensitive);
}
// Returns false if item not found.
BOOL LLScrollListCtrl::selectItemBySubstring(const LLWString& target, BOOL case_sensitive)
{
return selectItemByStringMatch(target, false, case_sensitive);
}
// </FS:Ansariel>
const std::string LLScrollListCtrl::getSelectedItemLabel(S32 column) const
{
LLScrollListItem* item;

View File

@ -249,6 +249,11 @@ public:
BOOL selectItemByLabel( const std::string& item, BOOL case_sensitive = TRUE, S32 column = 0 ); // FALSE if item not found
BOOL selectItemByPrefix(const std::string& target, BOOL case_sensitive = TRUE);
BOOL selectItemByPrefix(const LLWString& target, BOOL case_sensitive = TRUE);
// <FS:Ansariel> Allow selection by substring match
BOOL selectItemBySubstring(const std::string& target, BOOL case_sensitive = TRUE);
BOOL selectItemBySubstring(const LLWString& target, BOOL case_sensitive = TRUE);
BOOL selectItemByStringMatch(const LLWString& target, bool prefix_match, BOOL case_sensitive = TRUE);
// </FS:Ansariel>
LLScrollListItem* getItemByLabel( const std::string& item, BOOL case_sensitive = TRUE, S32 column = 0 );
const std::string getSelectedItemLabel(S32 column = 0) const;
LLSD getSelectedValue();

View File

@ -302,6 +302,9 @@ LLTextBase::~LLTextBase()
{
mSegments.clear();
delete mURLClickSignal;
// <FS:Ansariel> Properly free the signals
delete mIsFriendSignal;
// </FS:Ansariel>
}
void LLTextBase::initFromParams(const LLTextBase::Params& p)

View File

@ -264,7 +264,8 @@ LLTextEditor::LLTextEditor(const LLTextEditor::Params& p) :
mContextMenu(NULL),
mShowContextMenu(p.show_context_menu),
mEnableTooltipPaste(p.enable_tooltip_paste),
mPassDelete(FALSE)
mPassDelete(FALSE),
mKeepSelectionOnReturn(false)
{
mSourceID.generate();
@ -1122,6 +1123,35 @@ void LLTextEditor::removeChar()
}
}
// <FS> Ctrl-Backspace remove word
// Remove a word (set of characters up to next space/punctuation) from the text
void LLTextEditor::removeWord(bool prev)
{
const U32 pos(mCursorPos);
if (prev ? pos > 0 : static_cast<S32>(pos) < getLength())
{
U32 new_pos(prev ? prevWordPos(pos) : nextWordPos(pos));
if (new_pos == pos) // Other character we don't jump over
new_pos = prev ? prevWordPos(new_pos-1) : nextWordPos(new_pos+1);
const U32 diff(labs(pos - new_pos));
if (prev)
{
remove(new_pos, diff, false);
setCursorPos(new_pos);
}
else
{
remove(pos, diff, false);
}
}
else
{
LLUI::reportBadKeystroke();
}
}
// </FS>
// Add a single character to the text
S32 LLTextEditor::addChar(S32 pos, llwchar wc)
{
@ -1717,7 +1747,13 @@ BOOL LLTextEditor::handleSpecialKey(const KEY key, const MASK mask)
else
if( 0 < mCursorPos )
{
removeCharOrTab();
// <FS> Ctrl-Backspace remove word
//removeCharOrTab();
if (mask == MASK_CONTROL)
removeWord(true);
else
removeCharOrTab();
// </FS>
}
else
{
@ -1725,11 +1761,23 @@ BOOL LLTextEditor::handleSpecialKey(const KEY key, const MASK mask)
}
break;
// <FS> Ctrl-Backspace remove word
case KEY_DELETE:
if (getEnabled() && mask == MASK_CONTROL)
{
removeWord(false);
}
else
{
handled = false;
}
break;
// </FS>
case KEY_RETURN:
if (mask == MASK_NONE)
{
if( hasSelection() )
if( hasSelection() && !mKeepSelectionOnReturn )
{
deleteSelection(FALSE);
}

View File

@ -262,6 +262,8 @@ protected:
S32 overwriteChar(S32 pos, llwchar wc);
void removeChar();
S32 removeChar(S32 pos);
// <FS> Ctrl-Backspace remove word
void removeWord(bool prev);
S32 insert(S32 pos, const LLWString &wstr, bool group_with_next_op, LLTextSegmentPtr segment);
S32 remove(S32 pos, S32 length, bool group_with_next_op);
@ -303,6 +305,7 @@ protected:
/*virtual*/ void updateSegments();
void updateLinkSegments();
void keepSelectionOnReturn(bool keep) { mKeepSelectionOnReturn = keep; }
private:
//
@ -346,6 +349,7 @@ private:
bool mParseOnTheFly;
bool mEnableTooltipPaste;
bool mPassDelete;
bool mKeepSelectionOnReturn; // disabling of removing selected text after pressing of Enter
LLUUID mSourceID;

View File

@ -476,9 +476,9 @@ void LLToolTipMgr::show(const std::string& msg)
void LLToolTipMgr::show(const LLToolTip::Params& params)
{
if (!params.styled_message.isProvided()
&& (!params.message.isProvided() || params.message().empty())) return;
if (!params.styled_message.isProvided()
&& (!params.message.isProvided() || params.message().empty())
&& !params.image.isProvided()) return;
// fill in default tooltip params from tool_tip.xml
LLToolTip::Params params_with_defaults(params);
params_with_defaults.fillFrom(LLUICtrlFactory::instance().getDefaultParams<LLToolTip>());

View File

@ -227,7 +227,10 @@ void LLUrlAction::blockObject(std::string url)
std::string object_name = getObjectName(url);
if (LLUUID::validate(object_id))
{
executeSLURL("secondlife:///app/agent/" + object_id + "/block/" + object_name);
// <FS:Ansariel> FIRE-14987: Cannot mute objects with slashes in their name via V1 chat history
//executeSLURL("secondlife:///app/agent/" + object_id + "/block/" + object_name);
executeSLURL("secondlife:///app/agent/" + object_id + "/block/" + LLURI::escape(object_name));
// </FS:Ansariel>
}
}

View File

@ -238,7 +238,10 @@ void callFocus()
void callFocusLost()
{
gWindowImplementation->getCallbacks()->handleFocusLost(gWindowImplementation);
if (gWindowImplementation)
{
gWindowImplementation->getCallbacks()->handleFocusLost(gWindowImplementation);
}
}
void callRightMouseDown(float *pos, MASK mask)

View File

@ -121,12 +121,12 @@ if (DARWIN)
)
# copy the webkit dylib to the build directory
add_custom_command(
TARGET media_plugin_webkit POST_BUILD
# OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/libllqtwebkit.dylib
COMMAND ${CMAKE_COMMAND} -E copy ${ARCH_PREBUILT_DIRS_RELEASE}/libllqtwebkit.dylib ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/
DEPENDS media_plugin_webkit ${ARCH_PREBUILT_DIRS_RELEASE}/libllqtwebkit.dylib
)
# add_custom_command(
# TARGET media_plugin_webkit POST_BUILD
# # OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/libllqtwebkit.dylib
# COMMAND ${CMAKE_COMMAND} -E copy ${ARCH_PREBUILT_DIRS_RELEASE}/libllqtwebkit.dylib ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/
# DEPENDS media_plugin_webkit ${ARCH_PREBUILT_DIRS_RELEASE}/libllqtwebkit.dylib
# )
endif (DARWIN)

View File

@ -160,7 +160,10 @@ private:
checkEditState();
if(mInitState == INIT_STATE_NAVIGATE_COMPLETE)
// <FS:ND> FIRE-14935; Make sure to load URI even if state changes are happing rapidly
// if(mInitState == INIT_STATE_NAVIGATE_COMPLETE)
if(mInitState >= INIT_STATE_NAVIGATE_COMPLETE)
// </FS:ND>
{
if(!mInitialNavigateURL.empty())
{
@ -458,7 +461,10 @@ private:
// virtual
void onNavigateBegin(const EventType& event)
{
if(mInitState >= INIT_STATE_NAVIGATE_COMPLETE)
// <FS:ND> FIRE-14935; Do not switch URI if there is still a saved URI to load
// if(mInitState >= INIT_STATE_NAVIGATE_COMPLETE)
if(mInitState >= INIT_STATE_NAVIGATE_COMPLETE && !mInitialNavigateURL.empty() )
// </FS:ND>
{
LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER, "navigate_begin");
message.setValue("uri", event.getEventUri());

View File

@ -208,6 +208,7 @@ set(viewer_SOURCE_FILES
lggcontactsets.cpp
lfsimfeaturehandler.cpp
llpanelopenregionsettings.cpp
fsfloatervramusage.cpp
llaccountingcostmanager.cpp
llaisapi.cpp
@ -342,6 +343,7 @@ set(viewer_SOURCE_FILES
llfloatergesture.cpp
llfloatergodtools.cpp
llfloatergotoline.cpp
llfloatergroupbulkban.cpp
llfloatergroupinvite.cpp
llfloatergroups.cpp
llfloaterhandler.cpp
@ -516,6 +518,8 @@ set(viewer_SOURCE_FILES
llpanelface.cpp
llpanelgenerictip.cpp
llpanelgroup.cpp
llpanelgroupbulk.cpp
llpanelgroupbulkban.cpp
llpanelgroupgeneral.cpp
llpanelgroupinvite.cpp
llpanelgrouplandmoney.cpp
@ -924,6 +928,7 @@ set(viewer_HEADER_FILES
lggbeamscolors.h
lggcontactsets.h
lfsimfeaturehandler.h
fsfloatervramusage.h
llaccountingcostmanager.h
llaisapi.h
@ -1059,6 +1064,7 @@ set(viewer_HEADER_FILES
llfloatergesture.h
llfloatergodtools.h
llfloatergotoline.h
llfloatergroupbulkban.h
llfloatergroupinvite.h
llfloatergroups.h
llfloaterhandler.h
@ -1226,6 +1232,9 @@ set(viewer_HEADER_FILES
llpanelface.h
llpanelgenerictip.h
llpanelgroup.h
llpanelgroupbulk.h
llpanelgroupbulkimpl.h
llpanelgroupbulkban.h
llpanelgroupgeneral.h
llpanelgroupinvite.h
llpanelgrouplandmoney.h

View File

@ -470,7 +470,7 @@ bool NACLAntiSpamRegistry::checkNewlineFlood(EAntispamQueue queue, const LLUUID&
}
return false;
}
return false;
return true;
}
bool NACLAntiSpamRegistry::isBlockedOnQueue(EAntispamQueue queue, const LLUUID& source)
@ -656,8 +656,11 @@ void NACLAntiSpamRegistry::processObjectPropertiesFamily(LLMessageSystem* msg)
{
AntispamObjectData data = found->second;
data.mName = LLSLURL("objectim", id, "").getSLURLString() + "?name=" + LLURI::escape(name) + "&owner=" + owner_id.asString();
notify(data);
if (!isBlockedOnQueue(data.mQueue, owner_id))
{
data.mName = LLSLURL("objectim", id, "").getSLURLString() + "?name=" + LLURI::escape(name) + "&owner=" + owner_id.asString();
notify(data);
}
mObjectData.erase(found);
}

View File

@ -88,7 +88,7 @@ BOOL NACLFloaterExploreSounds::postBuild()
void NACLFloaterExploreSounds::handleSelection()
{
S32 num_selected = mHistoryScroller->getAllSelected().size();
size_t num_selected = mHistoryScroller->getAllSelected().size();
bool multiple = (num_selected > 1);
childSetEnabled("look_at_btn", (num_selected && !multiple));
childSetEnabled("play_locally_btn", num_selected);

View File

@ -1 +1 @@
4.6.8
4.7.0

View File

@ -70,43 +70,43 @@ void RecentAnimationList::addAnimation(const LLUUID& id, const LLUUID& playedBy)
{
AnimationEntry entry;
entry.animationID=id;
entry.playedBy=playedBy;
entry.time=LLTimer::getElapsedSeconds();
entry.animationID = id;
entry.playedBy = playedBy;
entry.time = LLTimer::getElapsedSeconds();
AnimationExplorer* explorer=LLFloaterReg::findTypedInstance<AnimationExplorer>("animation_explorer");
AnimationExplorer* explorer = LLFloaterReg::findTypedInstance<AnimationExplorer>("animation_explorer");
// only remember animation when it wasn't played by ourselves or the explorer window is open,
// so the list doesn't get polluted
if(playedBy!=gAgentAvatarp->getID() || explorer!=NULL)
if (playedBy != gAgentAvatarp->getID() || explorer != NULL)
{
mAnimationList.push_back(entry);
// only keep a certain number of entries
if(mAnimationList.size()>MAX_ANIMATIONS)
if (mAnimationList.size() > MAX_ANIMATIONS)
{
mAnimationList.pop_front();
}
}
// if the animation explorer floater is open, send this animation over immediately
if(explorer)
if (explorer)
{
explorer->addAnimation(id,playedBy,LLTimer::getElapsedSeconds());
explorer->addAnimation(id, playedBy, LLTimer::getElapsedSeconds());
}
}
void RecentAnimationList::requestList(AnimationExplorer* explorer)
{
if(explorer)
if (explorer)
{
// send the list of recent animations to the given animation explorer floater
for(std::deque<AnimationEntry>::iterator iter=mAnimationList.begin();
iter!=mAnimationList.end();
for (std::deque<AnimationEntry>::iterator iter = mAnimationList.begin();
iter != mAnimationList.end();
++iter)
{
AnimationEntry entry=*iter;
explorer->addAnimation(entry.animationID,entry.playedBy,entry.time);
AnimationEntry entry = *iter;
explorer->addAnimation(entry.animationID, entry.playedBy, entry.time);
}
}
}
@ -123,45 +123,45 @@ AnimationExplorer::AnimationExplorer(const LLSD& key)
AnimationExplorer::~AnimationExplorer()
{
mAnimationPreview=NULL;
mAnimationPreview = NULL;
}
void AnimationExplorer::startMotion(const LLUUID& motionID)
{
if(!mAnimationPreview)
if (!mAnimationPreview)
{
return;
}
LLVOAvatar* avatarp=mAnimationPreview->getDummyAvatar();
LLVOAvatar* avatarp = mAnimationPreview->getDummyAvatar();
avatarp->deactivateAllMotions();
avatarp->startMotion(ANIM_AGENT_STAND,0.0f);
avatarp->startMotion(ANIM_AGENT_STAND, 0.0f);
if(motionID.notNull())
if (motionID.notNull())
{
avatarp->startMotion(motionID,0.0f);
avatarp->startMotion(motionID, 0.0f);
}
}
BOOL AnimationExplorer::postBuild()
{
mAnimationScrollList=getChild<LLScrollListCtrl>("animation_list");
mStopButton=getChild<LLButton>("stop_btn");
mRevokeButton=getChild<LLButton>("revoke_btn");
mStopAndRevokeButton=getChild<LLButton>("stop_and_revoke_btn");
mNoOwnedAnimationsCheckBox=getChild<LLCheckBoxCtrl>("no_owned_animations_check");
mAnimationScrollList = getChild<LLScrollListCtrl>("animation_list");
mStopButton = getChild<LLButton>("stop_btn");
mRevokeButton = getChild<LLButton>("revoke_btn");
mStopAndRevokeButton = getChild<LLButton>("stop_and_revoke_btn");
mNoOwnedAnimationsCheckBox = getChild<LLCheckBoxCtrl>("no_owned_animations_check");
mAnimationScrollList->setCommitCallback(boost::bind(&AnimationExplorer::onSelectAnimation,this));
mStopButton->setCommitCallback(boost::bind(&AnimationExplorer::onStopPressed,this));
mRevokeButton->setCommitCallback(boost::bind(&AnimationExplorer::onRevokePressed,this));
mStopAndRevokeButton->setCommitCallback(boost::bind(&AnimationExplorer::onStopAndRevokePressed,this));
mNoOwnedAnimationsCheckBox->setCommitCallback(boost::bind(&AnimationExplorer::onOwnedCheckToggled,this));
mAnimationScrollList->setCommitCallback(boost::bind(&AnimationExplorer::onSelectAnimation, this));
mStopButton->setCommitCallback(boost::bind(&AnimationExplorer::onStopPressed, this));
mRevokeButton->setCommitCallback(boost::bind(&AnimationExplorer::onRevokePressed, this));
mStopAndRevokeButton->setCommitCallback(boost::bind(&AnimationExplorer::onStopAndRevokePressed, this));
mNoOwnedAnimationsCheckBox->setCommitCallback(boost::bind(&AnimationExplorer::onOwnedCheckToggled, this));
mPreviewCtrl=findChild<LLView>("animation_preview");
if(mPreviewCtrl)
mPreviewCtrl = findChild<LLView>("animation_preview");
if (mPreviewCtrl)
{
mAnimationPreview=new LLPreviewAnimation(
mAnimationPreview = new LLPreviewAnimation(
mPreviewCtrl->getRect().getWidth(),mPreviewCtrl->getRect().getHeight()
);
mAnimationPreview->setZoom(2.0f);
@ -180,37 +180,37 @@ BOOL AnimationExplorer::postBuild()
void AnimationExplorer::onSelectAnimation()
{
LLScrollListItem* item=mAnimationScrollList->getFirstSelected();
if(!item)
LLScrollListItem* item = mAnimationScrollList->getFirstSelected();
if (!item)
{
return;
}
S32 column=mAnimationScrollList->getColumn("animation_id")->mIndex;
mCurrentAnimationID=item->getColumn(column)->getValue().asUUID();
S32 column = mAnimationScrollList->getColumn("animation_id")->mIndex;
mCurrentAnimationID = item->getColumn(column)->getValue().asUUID();
column=mAnimationScrollList->getColumn("played_by")->mIndex;
mCurrentObject=item->getColumn(column)->getValue().asUUID();
column = mAnimationScrollList->getColumn("played_by")->mIndex;
mCurrentObject = item->getColumn(column)->getValue().asUUID();
startMotion(mCurrentAnimationID);
}
void AnimationExplorer::onStopPressed()
{
if(mCurrentAnimationID.notNull())
if (mCurrentAnimationID.notNull())
{
gAgentAvatarp->stopMotion(mCurrentAnimationID);
gAgent.sendAnimationRequest(mCurrentAnimationID,ANIM_REQUEST_STOP);
gAgent.sendAnimationRequest(mCurrentAnimationID, ANIM_REQUEST_STOP);
}
}
void AnimationExplorer::onRevokePressed()
{
if(mCurrentObject.notNull())
if (mCurrentObject.notNull())
{
LLViewerObject* vo=gObjectList.findObject(mCurrentObject);
LLViewerObject* vo = gObjectList.findObject(mCurrentObject);
if(vo)
if (vo)
{
gAgentAvatarp->revokePermissionsOnObject(vo);
}
@ -232,35 +232,35 @@ void AnimationExplorer::onOwnedCheckToggled()
void AnimationExplorer::draw()
{
LLFloater::draw();
LLRect r=mPreviewCtrl->getRect();
LLRect r = mPreviewCtrl->getRect();
if(mAnimationPreview)
if (mAnimationPreview)
{
mAnimationPreview->requestUpdate();
gGL.color3f(1.0f,1.0f,1.0f);
gGL.color3f(1.0f, 1.0f, 1.0f);
gGL.getTexUnit(0)->bind(mAnimationPreview);
gGL.begin(LLRender::QUADS);
{
gGL.texCoord2f(0.0f,1.0f);
gGL.vertex2i(r.mLeft,r.mTop);
gGL.texCoord2f(0.0f,0.0f);
gGL.vertex2i(r.mLeft,r.mBottom);
gGL.texCoord2f(1.0f,0.0f);
gGL.vertex2i(r.mRight,r.mBottom);
gGL.texCoord2f(1.0f,1.0f);
gGL.vertex2i(r.mRight,r.mTop);
gGL.texCoord2f(0.0f, 1.0f);
gGL.vertex2i(r.mLeft, r.mTop);
gGL.texCoord2f(0.0f, 0.0f);
gGL.vertex2i(r.mLeft, r.mBottom);
gGL.texCoord2f(1.0f, 0.0f);
gGL.vertex2i(r.mRight, r.mBottom);
gGL.texCoord2f(1.0f, 1.0f);
gGL.vertex2i(r.mRight, r.mTop);
}
gGL.end();
gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
}
// update tiems and "Still playing" status in the list once every few seconds
static F64 last_update=0.0f;
F64 time=LLTimer::getElapsedSeconds();
if(time-last_update>5.0f)
static F64 last_update = 0.0f;
F64 time = LLTimer::getElapsedSeconds();
if (time-last_update > 5.0f)
{
last_update=time;
last_update = time;
updateList(time);
}
}
@ -276,58 +276,58 @@ void AnimationExplorer::update()
void AnimationExplorer::updateList(F64 current_timestamp)
{
S32 played_column=mAnimationScrollList->getColumn("played")->mIndex;
S32 timestamp_column=mAnimationScrollList->getColumn("timestamp")->mIndex;
S32 object_id_column=mAnimationScrollList->getColumn("object_id")->mIndex;
S32 anim_id_column=mAnimationScrollList->getColumn("animation_id")->mIndex;
S32 played_column = mAnimationScrollList->getColumn("played")->mIndex;
S32 timestamp_column = mAnimationScrollList->getColumn("timestamp")->mIndex;
S32 object_id_column = mAnimationScrollList->getColumn("object_id")->mIndex;
S32 anim_id_column = mAnimationScrollList->getColumn("animation_id")->mIndex;
// go through the full animation scroll list
std::vector<LLScrollListItem*> items=mAnimationScrollList->getAllData();
for (std::vector<LLScrollListItem*>::iterator list_iter=items.begin();list_iter!=items.end();++list_iter)
std::vector<LLScrollListItem*> items = mAnimationScrollList->getAllData();
for (std::vector<LLScrollListItem*>::iterator list_iter = items.begin(); list_iter != items.end(); ++list_iter)
{
LLScrollListItem* item=*list_iter;
LLScrollListItem* item = *list_iter;
// get a pointer to the "Played" column text
LLScrollListText* played_text=(LLScrollListText*) item->getColumn(played_column);
LLScrollListText* played_text = (LLScrollListText*)item->getColumn(played_column);
// get the object ID from the list
LLUUID object_id=item->getColumn(object_id_column)->getValue().asUUID();
LLUUID object_id = item->getColumn(object_id_column)->getValue().asUUID();
// assume this animation is not running first
bool is_running=false;
bool is_running = false;
// go through the list of playing animations to find out if this animation played by
// this object is still running
for(LLVOAvatar::AnimSourceIterator anim_iter=gAgentAvatarp->mAnimationSources.begin();
anim_iter!=gAgentAvatarp->mAnimationSources.end();anim_iter++)
for (LLVOAvatar::AnimSourceIterator anim_iter = gAgentAvatarp->mAnimationSources.begin();
anim_iter != gAgentAvatarp->mAnimationSources.end(); ++anim_iter)
{
// object found
if(anim_iter->first==object_id)
if (anim_iter->first == object_id)
{
LLUUID anim_id=item->getColumn(anim_id_column)->getValue().asUUID();
LLUUID anim_id = item->getColumn(anim_id_column)->getValue().asUUID();
// animation found
if(anim_iter->second==anim_id)
if (anim_iter->second == anim_id)
{
// set text to "Still playing" and break out of this loop
played_text->setText(LLTrans::getString("animation_explorer_still_playing"));
is_running=true;
is_running = true;
break;
}
}
}
// animation was not found to be running
if(!is_running)
if (!is_running)
{
// get timestamp when this animation was started
F64 timestamp=item->getColumn(timestamp_column)->getValue().asReal();
F64 timestamp = item->getColumn(timestamp_column)->getValue().asReal();
// update text to show the number of seconds ago when this animation was started
LLStringUtil::format_map_t args;
args["SECONDS"]=llformat("%d",(S32) (current_timestamp-timestamp));
args["SECONDS"] = llformat("%d", (S32) (current_timestamp - timestamp));
played_text->setText(LLTrans::getString("animation_explorer_seconds_ago",args));
played_text->setText(LLTrans::getString("animation_explorer_seconds_ago", args));
}
}
}
@ -335,37 +335,37 @@ void AnimationExplorer::updateList(F64 current_timestamp)
void AnimationExplorer::addAnimation(const LLUUID& id, const LLUUID& played_by, F64 time)
{
// don't add animations that are played by ourselves when the filter box is checked
if(played_by==gAgentAvatarp->getID())
if (played_by == gAgentAvatarp->getID())
{
if(mNoOwnedAnimationsCheckBox->getValue().asBoolean())
if (mNoOwnedAnimationsCheckBox->getValue().asBoolean())
{
return;
}
}
// set object name to UUID at first
std::string playedByName=played_by.asString();
std::string playedByName = played_by.asString();
// find out if the object is still in reach
LLViewerObject* vo=gObjectList.findObject(played_by);
if(vo)
LLViewerObject* vo = gObjectList.findObject(played_by);
if (vo)
{
// if it was an avatar, get the name here
if(vo->isAvatar())
if (vo->isAvatar())
{
playedByName=std::string(vo->getNVPair("FirstName")->getString())+" "+
playedByName = std::string(vo->getNVPair("FirstName")->getString()) + " " +
std::string(vo->getNVPair("LastName")->getString());
}
// not an avatar, do a lookup by UUID
else
{
// find out if we know the name to this UUID already
std::map<LLUUID,std::string>::iterator iter=mKnownIDs.find(played_by);
std::map<LLUUID, std::string>::iterator iter = mKnownIDs.find(played_by);
// if we don't know it yet, start a lookup
if(iter==mKnownIDs.end())
if (iter == mKnownIDs.end())
{
// if we are not already looking up this object's name, send a request out
if(std::find(mRequestedIDs.begin(),mRequestedIDs.end(),played_by)==mRequestedIDs.end())
if (std::find(mRequestedIDs.begin(), mRequestedIDs.end(), played_by) == mRequestedIDs.end())
{
// remember which object names we already requested
mRequestedIDs.push_back(played_by);
@ -374,86 +374,86 @@ void AnimationExplorer::addAnimation(const LLUUID& id, const LLUUID& played_by,
msg->newMessageFast(_PREHASH_ObjectSelect);
msg->nextBlockFast(_PREHASH_AgentData);
msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
msg->addUUIDFast(_PREHASH_AgentID, gAgentID);
msg->addUUIDFast(_PREHASH_SessionID, gAgentSessionID);
msg->nextBlockFast(_PREHASH_ObjectData);
msg->addU32Fast(_PREHASH_ObjectLocalID,vo->getLocalID());
msg->addU32Fast(_PREHASH_ObjectLocalID, vo->getLocalID());
msg->sendReliable(gAgentAvatarp->getRegion()->getHost());
msg->newMessageFast(_PREHASH_ObjectDeselect);
msg->nextBlockFast(_PREHASH_AgentData);
msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
msg->addUUIDFast(_PREHASH_AgentID, gAgentID);
msg->addUUIDFast(_PREHASH_SessionID, gAgentSessionID);
msg->nextBlockFast(_PREHASH_ObjectData);
msg->addU32Fast(_PREHASH_ObjectLocalID,vo->getLocalID());
msg->addU32Fast(_PREHASH_ObjectLocalID, vo->getLocalID());
msg->sendReliable(gAgentAvatarp->getRegion()->getHost());
}
}
else
{
// we know the name already
playedByName=mKnownIDs[played_by];
playedByName = mKnownIDs[played_by];
}
}
}
// insert the item into the scroll list
LLSD item;
item["columns"][0]["column"]="played_by";
item["columns"][0]["value"]=playedByName;
item["columns"][1]["column"]="played";
item["columns"][1]["value"]=LLTrans::getString("animation_explorer_still_playing");
item["columns"][2]["column"]="timestamp";
item["columns"][2]["value"]=time;
item["columns"][3]["column"]="animation_id";
item["columns"][3]["value"]=id;
item["columns"][4]["column"]="object_id";
item["columns"][4]["value"]=played_by;
item["columns"][0]["column"] = "played_by";
item["columns"][0]["value"] = playedByName;
item["columns"][1]["column"] = "played";
item["columns"][1]["value"] = LLTrans::getString("animation_explorer_still_playing");
item["columns"][2]["column"] = "timestamp";
item["columns"][2]["value"] = time;
item["columns"][3]["column"] = "animation_id";
item["columns"][3]["value"] = id;
item["columns"][4]["column"] = "object_id";
item["columns"][4]["value"] = played_by;
mAnimationScrollList->addElement(item,ADD_TOP);
mAnimationScrollList->addElement(item, ADD_TOP);
}
void AnimationExplorer::requestNameCallback(LLMessageSystem* msg)
{
// if we weren't looking for any IDs, ignore this callback
if(mRequestedIDs.empty())
if (mRequestedIDs.empty())
{
return;
}
// we might have received more than one answer in one block
S32 num=msg->getNumberOfBlocksFast(_PREHASH_ObjectData);
for (S32 index=0;index<num;index++)
S32 num = msg->getNumberOfBlocksFast(_PREHASH_ObjectData);
for (S32 index = 0; index < num; ++index)
{
LLUUID object_id;
msg->getUUIDFast(_PREHASH_ObjectData,_PREHASH_ObjectID,object_id,index);
msg->getUUIDFast(_PREHASH_ObjectData, _PREHASH_ObjectID, object_id, index);
std::vector<LLUUID>::iterator iter;
iter=std::find(mRequestedIDs.begin(),mRequestedIDs.end(),object_id);
uuid_vec_t::iterator iter;
iter = std::find(mRequestedIDs.begin(), mRequestedIDs.end(), object_id);
// if this is one of the objects we were looking for, process the data
if(iter!=mRequestedIDs.end())
if (iter != mRequestedIDs.end())
{
// get the name of the object
std::string object_name;
msg->getStringFast(_PREHASH_ObjectData,_PREHASH_Name,object_name,index);
msg->getStringFast(_PREHASH_ObjectData, _PREHASH_Name, object_name, index);
// remove the object from the lookup list and add it to the known names list
mRequestedIDs.erase(iter);
mKnownIDs[object_id]=object_name;
mKnownIDs[object_id] = object_name;
S32 object_id_column=mAnimationScrollList->getColumn("object_id")->mIndex;
S32 played_by_column=mAnimationScrollList->getColumn("played_by")->mIndex;
S32 object_id_column = mAnimationScrollList->getColumn("object_id")->mIndex;
S32 played_by_column = mAnimationScrollList->getColumn("played_by")->mIndex;
// find all scroll list entries with this object UUID and update the names there
std::vector<LLScrollListItem*> items=mAnimationScrollList->getAllData();
for (std::vector<LLScrollListItem*>::iterator list_iter=items.begin();list_iter!=items.end();++list_iter)
std::vector<LLScrollListItem*> items = mAnimationScrollList->getAllData();
for (std::vector<LLScrollListItem*>::iterator list_iter = items.begin(); list_iter != items.end(); ++list_iter)
{
LLScrollListItem* item=*list_iter;
LLUUID list_object_id=item->getColumn(object_id_column)->getValue().asUUID();
LLScrollListItem* item = *list_iter;
LLUUID list_object_id = item->getColumn(object_id_column)->getValue().asUUID();
if(object_id==list_object_id)
if (object_id == list_object_id)
{
LLScrollListText* played_by_text=(LLScrollListText*) item->getColumn(played_by_column);
LLScrollListText* played_by_text = (LLScrollListText*)item->getColumn(played_by_column);
played_by_text->setText(object_name);
}
}

View File

@ -59,7 +59,7 @@ class RecentAnimationList
std::deque<AnimationEntry> mAnimationList;
void addAnimation(const LLUUID& id,const LLUUID& playedBy); // called in llviewermessage.cpp
void addAnimation(const LLUUID& id, const LLUUID& playedBy); // called in llviewermessage.cpp
void requestList(AnimationExplorer* explorer); // request animation list
};
@ -85,7 +85,7 @@ class AnimationExplorer
public:
/*virtual*/ BOOL postBuild();
void addAnimation(const LLUUID& id,const LLUUID& playedBy,F64 time); // called from RecentAnimationList
void addAnimation(const LLUUID& id, const LLUUID& playedBy, F64 time); // called from RecentAnimationList
// copied from llfloaterbvhpreview.h
BOOL handleMouseDown(S32 x, S32 y, MASK mask);
@ -113,7 +113,7 @@ class AnimationExplorer
LLUUID mCurrentObject; // object ID that played the currently selected animation
std::vector<LLUUID> mRequestedIDs; // list of object IDs we requested named for
std::map<LLUUID,std::string> mKnownIDs; // known list of names for object IDs
std::map<LLUUID, std::string> mKnownIDs; // known list of names for object IDs
void draw();
void update(); // request list update from RecentAnimationList

View File

@ -342,9 +342,13 @@ void FloaterAO::onRenameSet()
std::string name=mSetSelector->getSimple();
LLStringUtil::trim(name);
LLUIString new_set_name=name;
if(!name.empty())
{
if(name.find_first_of(":|")==std::string::npos)
if(
LLTextValidate::validateASCIIPrintableNoPipe(new_set_name.getWString()) && // only allow ASCII
name.find_first_of(":|")==std::string::npos) // don't allow : or |
{
if(AOEngine::instance().renameSet(mSelectedSet,name))
{
@ -356,7 +360,7 @@ void FloaterAO::onRenameSet()
{
LLSD args;
args["AO_SET_NAME"]=name;
LLNotificationsUtil::add("RenameAOCantContainColon",args);
LLNotificationsUtil::add("RenameAOMustBeASCII",args);
}
}
mSetSelector->setSimple(mSelectedSet->getName());
@ -445,13 +449,19 @@ BOOL FloaterAO::newSetCallback(const LLSD& notification,const LLSD& response)
LLStringUtil::trim(newSetName);
LLUIString new_set_name=newSetName;
if(newSetName.empty())
{
return FALSE;
else if(newSetName.find_first_of(":|")!=std::string::npos)
}
else if(
!LLTextValidate::validateASCIIPrintableNoPipe(new_set_name.getWString()) || // only allow ASCII
newSetName.find_first_of(":|")!=std::string::npos) // don't allow : or |
{
LLSD args;
args["AO_SET_NAME"]=newSetName;
LLNotificationsUtil::add("NewAOCantContainColon",args);
LLNotificationsUtil::add("NewAOCantContainNonASCII",args);
return FALSE;
}

View File

@ -1036,6 +1036,13 @@ void AOEngine::update()
{
LLViewerInventoryCategory* currentCategory=categories->at(index);
const std::string& setFolderName=currentCategory->getName();
if( setFolderName.empty())
{
LL_WARNS("AOEngine") << "Folder with emtpy name in AO folder" << LL_ENDL;
continue;
}
std::vector<std::string> params;
LLStringUtil::getTokens(setFolderName,params,":");

View File

@ -209,7 +209,7 @@
icon="Command_Search_Icon"
label_ref="Command_Search_Label"
tooltip_ref="Command_Search_Tooltip"
execute_function="Floater.Toggle"
execute_function="Floater.ToggleOrBringToFront"
execute_parameters="search"
is_running_function="Floater.IsOpen"
is_running_parameters="search"

View File

@ -1,5 +1,41 @@
<llsd>
<map>
<key>login.aviworlds.com:8002</key>
<map>
<key>LastModified</key>
<date>2014-11-22T20:36:26.43Z</date>
<key>about</key>
<string>http://aviworlds.com</string>
<key>gatekeeper</key>
<string>login.aviworlds.com:8002</string>
<key>gridname</key>
<string>AviWorlds</string>
<key>gridnick</key>
<string>AviWorlds</string>
<key>helperuri</key>
<string>http://login.aviworlds.com/backend/components/com_opensim/</string>
<key>login_identifier_types</key>
<array>
<string>agent</string>
<string>account</string>
</array>
<key>loginpage</key>
<string>http://login.aviworlds.com/splash/</string>
<key>loginuri</key>
<array>
<string>http://login.aviworlds.com:8002/</string>
</array>
<key>name</key>
<string>login.aviworlds.com:8002</string>
<key>password</key>
<string>http://login.aviworlds.com:8002/wifi/forgotpassword</string>
<key>platform</key>
<string>OpenSim</string>
<key>register</key>
<string>http://login.aviworlds.com:8002/wifi/user/account</string>
<key>slurl_base</key>
<string>hop://login.aviworlds.com:8002/</string>
</map>
<key>craft-world.org:8002</key>
<map>
<key>LastModified</key>

View File

@ -12,6 +12,7 @@
<integer_constant name="OS_ATTACH_MSG_OBJECT_CREATOR" desc="Send only to those have the same CreatorID with host object CreatorID" />
<integer_constant name="OS_ATTACH_MSG_SCRIPT_CREATOR" desc="Send only to those have the same CreatorID with sender script CreatorID" />
<integer_constant name="CHANGED_REGION_RESTART" desc="Parameter of changed event handler used to indicate the region has been restarted." />
<integer_constant name="CHANGED_ANIMATION" desc="The set of animations playing on the avatar to whom this object is attached has been changed." />
<integer_constant name="LIST_STAT_HARMONIC_MEAN" desc="Returns the harmonic mean of a list of numbers, Value 100." />
<integer_constant name="CAMERA_FOCUS_OFFSET_X" desc="Adjusts the camera focus x position relative to the target. (float)" />
@ -143,7 +144,7 @@
<function name="osSetEstateSunSettings" sleep="0.0" energy="10.0"
desc="osSetEstateSunSettings(integer sunFixed, float sunHour);Set current estate's sun settings" />
<function name="osGetCurrentSunHour" sleep="0.0" energy="10.0"
desc="float osGetCurrentSunHour();Returns the value of the current region's sun hour" />
desc="float osGetCurrentSunHour();Returns the value of the current region's sun hour" />
<function name="osGetSunParam" sleep="0.0" energy="10.0"
desc="string osGetSunParam(string param);Returns region's current sun parameters.;Param are: day_length, year_length, day_night_offset, update_interval." />
<function name="osSetSunParam" sleep="0.0" energy="10.0"
@ -296,6 +297,12 @@
desc="string osLoadedCreationID();Returns the original UUID of the current region" />
<function name="osGetLinkPrimitiveParams" sleep="0.0" energy="10.0"
desc="list osGetLinkPrimitiveParams(integer link_num, list parameters);Returns prim params for the prim specified by link_num" />
<function name="osForceCreateLink" sleep="0.0" energy="10.0"
desc="osForceCreateLink(key target, int parent);Idential to llCreateLink() except that it doesn't require the link permission to be granted. Attempt to link the script's object with target." />
<function name="osForceBreakLink" sleep="0.0" energy="10.0"
desc="osForceBreakLink(integer link);to llBreakLink(integer link) except that it doesn't require the link permission to be granted. Delinks the prim with the given link number in a linked object set." />
<function name="osForceBreakAllLinks" sleep="0.0" energy="10.0"
desc="osForceBreakAllLinks();Identical to llBreakAllLinks() except that it doesn't require the link permission to be granted. Delinks all prims in the link set." />
<function name="osIsNpc" sleep="0.0" energy="10.0"
desc="integer osIsNpc(key npc);Returns 1 if TRUE, 0 if FALSE" />
<function name="osNpcCreate" sleep="0.0" energy="10.0"
@ -337,7 +344,7 @@
<function name="osNpcStopAnimation" sleep="0.0" energy="10.0"
desc="osNpcStopAnimation(key npc, string animation);Stops animation being played by the NPC" />
<function name="osOwnerSaveAppearance" sleep="0.0" energy="10.0"
desc="key osOwnerSaveAppearance(string notecard);Creates a notecard with the object owner&apos;s current appearance inside the object" />
desc="key osOwnerSaveAppearance(string notecard);Creates a notecard with the object owner&apos;s current appearance inside the object" />
<function name="osAgentSaveAppearance" sleep="0.0" energy="10.0"
desc="key osAgentSaveAppearance(key avatar, string notecard);Creates a notecard with the specified avatar&apos;s current appearance inside the object" />
<function name="osGetMapTexture" sleep="0.0" energy="10.0"

View File

@ -6288,8 +6288,6 @@
<real>0.0</real>
<real>1.0</real>
</array>
<key>Backup</key>
<integer>0</integer>
</map>
<key>FocusOffsetFrontView</key>
<map>
@ -6305,8 +6303,6 @@
<real>0.0</real>
<real>0.0</real>
</array>
<key>Backup</key>
<integer>0</integer>
</map>
<key>FocusOffsetGroupView</key>
<map>
@ -6322,8 +6318,6 @@
<real>0.7</real>
<real>1.0</real>
</array>
<key>Backup</key>
<integer>0</integer>
</map>
<key>FocusPosOnLogout</key>
<map>
@ -16928,6 +16922,28 @@ Change of this parameter will affect the layout of buttons in notification toast
<key>Backup</key>
<integer>0</integer>
</map>
<key>VivoxLogDirectory</key>
<map>
<key>Comment</key>
<string>Default log path is Application Support/SecondLife/logs specify alternate absolute path here.</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>String</string>
<key>Value</key>
<string></string>
</map>
<key>VivoxShutdownTimeout</key>
<map>
<key>Comment</key>
<string>shutdown timeout in miliseconds. The amount of time to wait for the service to shutdown gracefully after the last disconnect</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>String</string>
<key>Value</key>
<string>5</string>
</map>
<key>VivoxDebugSIPURIHostName</key>
<map>
<key>Comment</key>
@ -18557,7 +18573,7 @@ Change of this parameter will affect the layout of buttons in notification toast
<key>Type</key>
<string>String</string>
<key>Value</key>
<string>===OFF===</string>
<string>Rainbow</string>
</map>
<key>FSMaxBeamsPerSecond</key>
<map>
@ -19915,6 +19931,17 @@ Change of this parameter will affect the layout of buttons in notification toast
<key>Value</key>
<integer>0</integer>
</map>
<key>LockToolbars</key>
<map>
<key>Comment</key>
<string>If enabled, toolbars are locked and buttons can not be dragged around, added or removed.</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>0</integer>
</map>
<key>FSSkinClobbersToolbarPrefs</key>
<map>
<key>Comment</key>
@ -20795,10 +20822,10 @@ Change of this parameter will affect the layout of buttons in notification toast
<key>Value</key>
<integer>1</integer>
</map>
<key>FSVintageLoginInfo</key>
<key>FSSelectCopyableOnly</key>
<map>
<key>Comment</key>
<string>Shows the "did you know about Phoenix mode?" message at login screen, once per installation. TRUE means, that notification won't be displayed.</string>
<string>Only include copyable objects during selection</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
@ -22776,6 +22803,74 @@ Change of this parameter will affect the layout of buttons in notification toast
<key>Value</key>
<integer>1</integer>
</map>
<key>FSLogSnapshotsToLocal</key>
<map>
<key>Comment</key>
<string>Log filename of saved snapshots in to chat history</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>0</integer>
</map>
<key>FSLatencyOneTimeFixRun</key>
<map>
<key>Comment</key>
<string>One time fix has run for this install for script dialog colors on Latency</string>
<key>Persist</key>
<integer>1</integer>
<key>HideFromEditor</key>
<integer>1</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>0</integer>
</map>
<key>FSUseCtrlShout</key>
<map>
<key>Comment</key>
<string>Set to TRUE to use the keyboard shortcut Ctrl+Enter to Shout in Nearby Chat.</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>1</integer>
</map>
<key>FSUseShiftWhisper</key>
<map>
<key>Comment</key>
<string>Set to TRUE to use the keyboard shortcut Shift+Enter to Whisper in Nearby Chat.</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>1</integer>
</map>
<key>FSUseAltOOC</key>
<map>
<key>Comment</key>
<string>Set to TRUE to use the keyboard shortcut Alt+Enter to send ((OOC)) messages to Nearby Chat.</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>1</integer>
</map>
<key>FSComboboxSubstringSearch</key>
<map>
<key>Comment</key>
<string>Allows fulltext search on comboboxes</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>1</integer>
</map>
</map>
</llsd>

View File

@ -723,15 +723,29 @@
<integer>2</integer>
</map>
<key>FSFlashOnMessage</key>
<map>
<key>Persist</key>
<integer>1</integer>
<key>Comment</key>
<string>Flash/Bounce the app icon when a new message is recieved and Firestorm is not in focus</string>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>1</integer>
</map>
<key>PlayModeUISndScriptFloaterOpen</key>
<map>
<key>Persist</key>
<integer>1</integer>
<key>Comment</key>
<string>Holds state for Prefs &gt; Sound/Media &gt; UI Sounds - UISndScriptFloaterOpen.</string>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>0</integer>
</map>
</map>
</llsd>

View File

@ -643,6 +643,17 @@
<key>Value</key>
<integer>0</integer>
</map>
<key>FSKeywordMatchWholeWords</key>
<map>
<key>Comment</key>
<string>Keywords will only match whole words</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>0</integer>
</map>
<key>FSKeywords</key>
<map>
<key>Comment</key>

View File

@ -519,6 +519,18 @@
<integer>1</integer>
</map>
<key>PlayModeUISndScriptFloaterOpen</key>
<map>
<key>Comment</key>
<string>Holds state for Prefs &gt; Sound/Media &gt; UI Sounds - UISndScriptFloaterOpen.</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>0</integer>
</map>
<!-- <FS_Zi> Animated dialogs -->
<key>FSAnimatedScriptDialogs</key>
<map>

View File

@ -1,141 +0,0 @@
<llsd>
<map>
<key>ambient</key>
<array>
<real>1.4699999094009399</real>
<real>1.4699999094009399</real>
<real>1.4699999094009399</real>
<real>0.48999997973442078</real>
</array>
<key>blue_density</key>
<array>
<real>0.099999994039535522</real>
<real>0.037499997764825821</real>
<real>0.067499987781047821</real>
<real>0.049999997019767761</real>
</array>
<key>blue_horizon</key>
<array>
<real>0.15130999684333801</real>
<real>0.30000001192092896</real>
<real>0.35131001472473145</real>
<real>1</real>
</array>
<key>cloud_color</key>
<array>
<real>0.22999998927116394</real>
<real>0.22999998927116394</real>
<real>0.22999998927116394</real>
<real>0.22999998927116394</real>
</array>
<key>cloud_pos_density1</key>
<array>
<real>0.88419097661972046</real>
<real>0.53047597408294678</real>
<real>0.52999997138977051</real>
<real>1</real>
</array>
<key>cloud_pos_density2</key>
<array>
<real>0.2800000011920929</real>
<real>0.19999998807907104</real>
<real>0.31999999284744263</real>
<real>1</real>
</array>
<key>cloud_scale</key>
<array>
<real>0.0099999997764825821</real>
<real>0</real>
<real>0</real>
<real>1</real>
</array>
<key>cloud_scroll_rate</key>
<array>
<real>0</real>
<real>15.329999446868896</real>
</array>
<key>cloud_shadow</key>
<array>
<real>0</real>
<real>0</real>
<real>0</real>
<real>1</real>
</array>
<key>density_multiplier</key>
<array>
<real>0.00022000000171829015</real>
<real>0</real>
<real>0</real>
<real>1</real>
</array>
<key>distance_multiplier</key>
<array>
<real>16.200000762939453</real>
<real>0</real>
<real>0</real>
<real>1</real>
</array>
<key>east_angle</key>
<real>6.2831854820251465</real>
<key>enable_cloud_scroll</key>
<array>
<boolean>1</boolean>
<boolean>1</boolean>
</array>
<key>gamma</key>
<array>
<real>1.4199999570846558</real>
<real>0</real>
<real>0</real>
<real>1</real>
</array>
<key>glow</key>
<array>
<real>18.599998474121094</real>
<real>0.0012815999798476696</real>
<real>0</real>
<real>1</real>
</array>
<key>haze_density</key>
<array>
<real>0</real>
<real>0</real>
<real>0</real>
<real>1</real>
</array>
<key>haze_horizon</key>
<array>
<real>1</real>
<real>0.21744099259376526</real>
<real>0.21744099259376526</real>
<real>1</real>
</array>
<key>lightnorm</key>
<array>
<real>-1.7484555314695172e-007</real>
<real>0</real>
<real>1</real>
<real>0</real>
</array>
<key>max_y</key>
<array>
<real>403</real>
<real>0</real>
<real>0</real>
<real>1</real>
</array>
<key>preset_num</key>
<integer>2</integer>
<key>star_brightness</key>
<real>0</real>
<key>sun_angle</key>
<real>0</real>
<key>sunlight_color</key>
<array>
<real>0</real>
<real>0</real>
<real>0</real>
<real>0</real>
</array>
</map>
</llsd>

View File

@ -1,141 +0,0 @@
<llsd>
<map>
<key>ambient</key>
<array>
<real>1.4699999094009399</real>
<real>1.4699999094009399</real>
<real>1.4699999094009399</real>
<real>0.48999997973442078</real>
</array>
<key>blue_density</key>
<array>
<real>0.14000000059604645</real>
<real>0.14000000059604645</real>
<real>0.14000000059604645</real>
<real>0.070000000298023224</real>
</array>
<key>blue_horizon</key>
<array>
<real>0.83809572458267212</real>
<real>1.0735483169555664</real>
<real>1.2799999713897705</real>
<real>0.63999998569488525</real>
</array>
<key>cloud_color</key>
<array>
<real>0.12862999737262726</real>
<real>0.12862999737262726</real>
<real>0.12862999737262726</real>
<real>1</real>
</array>
<key>cloud_pos_density1</key>
<array>
<real>0.70999997854232788</real>
<real>0.53047597408294678</real>
<real>0.4270470142364502</real>
<real>1</real>
</array>
<key>cloud_pos_density2</key>
<array>
<real>0.38419300317764282</real>
<real>0.5</real>
<real>0.125</real>
<real>1</real>
</array>
<key>cloud_scale</key>
<array>
<real>0.72999995946884155</real>
<real>0</real>
<real>0</real>
<real>1</real>
</array>
<key>cloud_scroll_rate</key>
<array>
<real>10</real>
<real>10</real>
</array>
<key>cloud_shadow</key>
<array>
<real>0.2199999988079071</real>
<real>0</real>
<real>0</real>
<real>1</real>
</array>
<key>density_multiplier</key>
<array>
<real>0.00017999998817685992</real>
<real>0</real>
<real>0</real>
<real>1</real>
</array>
<key>distance_multiplier</key>
<array>
<real>11.40000057220459</real>
<real>0</real>
<real>0</real>
<real>1</real>
</array>
<key>east_angle</key>
<real>0</real>
<key>enable_cloud_scroll</key>
<array>
<boolean>1</boolean>
<boolean>1</boolean>
</array>
<key>gamma</key>
<array>
<real>1.6899999380111694</real>
<real>0</real>
<real>0</real>
<real>1</real>
</array>
<key>glow</key>
<array>
<real>6.4079799652099609</real>
<real>0.0012815999798476696</real>
<real>-0.39999997615814209</real>
<real>1</real>
</array>
<key>haze_density</key>
<array>
<real>1.4900000095367432</real>
<real>0</real>
<real>0</real>
<real>1</real>
</array>
<key>haze_horizon</key>
<array>
<real>0</real>
<real>0.21744099259376526</real>
<real>0.21744099259376526</real>
<real>1</real>
</array>
<key>lightnorm</key>
<array>
<real>0</real>
<real>0</real>
<real>1</real>
<real>0</real>
</array>
<key>max_y</key>
<array>
<real>805</real>
<real>0</real>
<real>0</real>
<real>1</real>
</array>
<key>preset_num</key>
<integer>2</integer>
<key>star_brightness</key>
<real>1.5699999332427979</real>
<key>sun_angle</key>
<real>0</real>
<key>sunlight_color</key>
<array>
<real>3</real>
<real>3</real>
<real>3</real>
<real>1</real>
</array>
</map>
</llsd>

View File

@ -1,141 +0,0 @@
<llsd>
<map>
<key>ambient</key>
<array>
<real>1.8300000429153442</real>
<real>1.8300000429153442</real>
<real>1.8300000429153442</real>
<real>0.61000001430511475</real>
</array>
<key>blue_density</key>
<array>
<real>0.21899415552616119</real>
<real>0.40148928761482239</real>
<real>0.68000000715255737</real>
<real>0.34000000357627869</real>
</array>
<key>blue_horizon</key>
<array>
<real>0</real>
<real>0.10838708281517029</real>
<real>0.14000000059604645</real>
<real>0.070000000298023224</real>
</array>
<key>cloud_color</key>
<array>
<real>0</real>
<real>0</real>
<real>0</real>
<real>0</real>
</array>
<key>cloud_pos_density1</key>
<array>
<real>0.14000000059604645</real>
<real>0.62000000476837158</real>
<real>0.99999999999999767</real>
<real>1</real>
</array>
<key>cloud_pos_density2</key>
<array>
<real>0.48999997973442078</real>
<real>0.19999998807907104</real>
<real>0.125</real>
<real>1</real>
</array>
<key>cloud_scale</key>
<array>
<real>0.43999999761581421</real>
<real>0</real>
<real>0</real>
<real>1</real>
</array>
<key>cloud_scroll_rate</key>
<array>
<real>10.199999853917745</real>
<real>10.010999722693327</real>
</array>
<key>cloud_shadow</key>
<array>
<real>0.29999998211860657</real>
<real>0</real>
<real>0</real>
<real>1</real>
</array>
<key>density_multiplier</key>
<array>
<real>0.00015999999595806003</real>
<real>0</real>
<real>0</real>
<real>1</real>
</array>
<key>distance_multiplier</key>
<array>
<real>10.800000190734863</real>
<real>0</real>
<real>0</real>
<real>1</real>
</array>
<key>east_angle</key>
<real>0</real>
<key>enable_cloud_scroll</key>
<array>
<boolean>1</boolean>
<boolean>1</boolean>
</array>
<key>gamma</key>
<array>
<real>0.94999998807907104</real>
<real>0</real>
<real>0</real>
<real>1</real>
</array>
<key>glow</key>
<array>
<real>4.9999999403953552</real>
<real>0.0010000000616982377</real>
<real>-0.47999998693999579</real>
<real>1</real>
</array>
<key>haze_density</key>
<array>
<real>0.94999998807907104</real>
<real>0</real>
<real>0</real>
<real>1</real>
</array>
<key>haze_horizon</key>
<array>
<real>0.25999999046325684</real>
<real>0.19915600121021271</real>
<real>0.19915600121021271</real>
<real>1</real>
</array>
<key>lightnorm</key>
<array>
<real>0</real>
<real>0.96692299842834473</real>
<real>-0.25506836175918579</real>
<real>0</real>
</array>
<key>max_y</key>
<array>
<real>1128</real>
<real>0</real>
<real>0</real>
<real>1</real>
</array>
<key>preset_num</key>
<integer>28</integer>
<key>star_brightness</key>
<real>0</real>
<key>sun_angle</key>
<real>1.8287147283554077</real>
<key>sunlight_color</key>
<array>
<real>0.65999996662139893</real>
<real>0.78157895803451538</real>
<real>0.89999997615814209</real>
<real>0.29999998211860657</real>
</array>
</map>
</llsd>

View File

@ -1,141 +0,0 @@
<llsd>
<map>
<key>ambient</key>
<array>
<real>1.0799999237060547</real>
<real>1.0799999237060547</real>
<real>1.0799999237060547</real>
<real>0.35999998450279236</real>
</array>
<key>blue_density</key>
<array>
<real>0.11593805998563766</real>
<real>0.21255312860012054</real>
<real>0.74000000953674316</real>
<real>0.74000000953674316</real>
</array>
<key>blue_horizon</key>
<array>
<real>0.52645158767700195</real>
<real>0.52645158767700195</real>
<real>0.8399999737739563</real>
<real>0.8399999737739563</real>
</array>
<key>cloud_color</key>
<array>
<real>0.68000000715255737</real>
<real>0.32800003886222839</real>
<real>0.32800003886222839</real>
<real>0.68000000715255737</real>
</array>
<key>cloud_pos_density1</key>
<array>
<real>0.90999996662139893</real>
<real>0.45999997854232788</real>
<real>0.40999999642372131</real>
<real>1</real>
</array>
<key>cloud_pos_density2</key>
<array>
<real>0.63999998569488525</real>
<real>0.38999998569488525</real>
<real>0</real>
<real>1</real>
</array>
<key>cloud_scale</key>
<array>
<real>0.36999997496604919</real>
<real>0</real>
<real>0</real>
<real>1</real>
</array>
<key>cloud_scroll_rate</key>
<array>
<real>10.050000190734863</real>
<real>9.9200000762939453</real>
</array>
<key>cloud_shadow</key>
<array>
<real>0.19999998807907104</real>
<real>0</real>
<real>0</real>
<real>1</real>
</array>
<key>density_multiplier</key>
<array>
<real>0.00011999999696854502</real>
<real>0</real>
<real>0</real>
<real>1</real>
</array>
<key>distance_multiplier</key>
<array>
<real>1</real>
<real>0</real>
<real>0</real>
<real>1</real>
</array>
<key>east_angle</key>
<real>0</real>
<key>enable_cloud_scroll</key>
<array>
<boolean>1</boolean>
<boolean>1</boolean>
</array>
<key>gamma</key>
<array>
<real>0.93999999761581421</real>
<real>0</real>
<real>0</real>
<real>1</real>
</array>
<key>glow</key>
<array>
<real>6.1999988555908203</real>
<real>0.0010000000474974513</real>
<real>-0.55000001192092896</real>
<real>1</real>
</array>
<key>haze_density</key>
<array>
<real>0.34999999403953552</real>
<real>0</real>
<real>0</real>
<real>1</real>
</array>
<key>haze_horizon</key>
<array>
<real>0.19999998807907104</real>
<real>0.19915600121021271</real>
<real>0.19915600121021271</real>
<real>1</real>
</array>
<key>lightnorm</key>
<array>
<real>0</real>
<real>0.77450281381607056</real>
<real>-0.63257044553756714</real>
<real>0</real>
</array>
<key>max_y</key>
<array>
<real>913</real>
<real>0</real>
<real>0</real>
<real>1</real>
</array>
<key>preset_num</key>
<integer>22</integer>
<key>star_brightness</key>
<real>0.039999999105930328</real>
<key>sun_angle</key>
<real>2.2556638717651367</real>
<key>sunlight_color</key>
<array>
<real>1.2899999618530273</real>
<real>0.88457131385803223</real>
<real>0.51599997282028198</real>
<real>0.42999997735023499</real>
</array>
</map>
</llsd>

View File

@ -1,141 +0,0 @@
<llsd>
<map>
<key>ambient</key>
<array>
<real>0.29999998211860657</real>
<real>0.29999998211860657</real>
<real>0.29999998211860657</real>
<real>0.099999994039535522</real>
</array>
<key>blue_density</key>
<array>
<real>0.07937999814748764</real>
<real>0.22679997980594635</real>
<real>1.6200000047683716</real>
<real>0.81000000238418579</real>
</array>
<key>blue_horizon</key>
<array>
<real>0.16684222221374512</real>
<real>0.33368346095085144</real>
<real>0.57999998331069946</real>
<real>0.28999999165534973</real>
</array>
<key>cloud_color</key>
<array>
<real>0.56000000238418579</real>
<real>0.56000000238418579</real>
<real>0.56000000238418579</real>
<real>0.56000000238418579</real>
</array>
<key>cloud_pos_density1</key>
<array>
<real>2.8148899078369141</real>
<real>0.78999996185302734</real>
<real>0.59999996423721313</real>
<real>1</real>
</array>
<key>cloud_pos_density2</key>
<array>
<real>5.9584097862243652</real>
<real>0.85999995470046997</real>
<real>0.059999998658895493</real>
<real>1</real>
</array>
<key>cloud_scale</key>
<array>
<real>0.32999998331069946</real>
<real>0</real>
<real>0</real>
<real>1</real>
</array>
<key>cloud_scroll_rate</key>
<array>
<real>11.679999351501465</real>
<real>10.359999656677246</real>
</array>
<key>cloud_shadow</key>
<array>
<real>0.11999999731779099</real>
<real>0</real>
<real>0</real>
<real>1</real>
</array>
<key>density_multiplier</key>
<array>
<real>0.00031000000308267772</real>
<real>0</real>
<real>0</real>
<real>1</real>
</array>
<key>distance_multiplier</key>
<array>
<real>0.60000002384185791</real>
<real>0</real>
<real>0</real>
<real>1</real>
</array>
<key>east_angle</key>
<real>0</real>
<key>enable_cloud_scroll</key>
<array>
<boolean>1</boolean>
<boolean>1</boolean>
</array>
<key>gamma</key>
<array>
<real>1.3500000238418579</real>
<real>0</real>
<real>0</real>
<real>1</real>
</array>
<key>glow</key>
<array>
<real>8.8000011444091797</real>
<real>0.0010000000474974513</real>
<real>-0.74999994039535522</real>
<real>1</real>
</array>
<key>haze_density</key>
<array>
<real>0.029999999329447746</real>
<real>0</real>
<real>0</real>
<real>1</real>
</array>
<key>haze_horizon</key>
<array>
<real>0.32999998331069946</real>
<real>0.19915600121021271</real>
<real>0.19915600121021271</real>
<real>1</real>
</array>
<key>lightnorm</key>
<array>
<real>0</real>
<real>1</real>
<real>-4.3711388286737929e-008</real>
<real>0</real>
</array>
<key>max_y</key>
<array>
<real>1181</real>
<real>0</real>
<real>0</real>
<real>1</real>
</array>
<key>preset_num</key>
<integer>24</integer>
<key>star_brightness</key>
<real>0.11999999731779099</real>
<key>sun_angle</key>
<real>1.5707963705062866</real>
<key>sunlight_color</key>
<array>
<real>1.3499999046325684</real>
<real>1.0799999237060547</real>
<real>1.0799999237060547</real>
<real>0.44999998807907104</real>
</array>
</map>
</llsd>

View File

@ -1,141 +0,0 @@
<llsd>
<map>
<key>ambient</key>
<array>
<real>2.0099997520446777</real>
<real>1.9199999570846558</real>
<real>1.8899999856948853</real>
<real>2.0099997520446777</real>
</array>
<key>blue_density</key>
<array>
<real>0.63999998569488525</real>
<real>1.1799999475479126</real>
<real>2</real>
<real>2</real>
</array>
<key>blue_horizon</key>
<array>
<real>0.23999999463558197</real>
<real>0.23999999463558197</real>
<real>0.31999999284744263</real>
<real>0.31999999284744263</real>
</array>
<key>cloud_color</key>
<array>
<real>0.39050509865536398</real>
<real>0.39050509865536398</real>
<real>0.39050509865536398</real>
<real>0.39050509865536398</real>
</array>
<key>cloud_pos_density1</key>
<array>
<real>1.6884100437164307</real>
<real>0.52609699964523315</real>
<real>1</real>
<real>1</real>
</array>
<key>cloud_pos_density2</key>
<array>
<real>1.6884100437164307</real>
<real>0.52609699964523315</real>
<real>0.125</real>
<real>1</real>
</array>
<key>cloud_scale</key>
<array>
<real>0.41999998254906856</real>
<real>0</real>
<real>0</real>
<real>1</real>
</array>
<key>cloud_scroll_rate</key>
<array>
<real>10.199999735331062</real>
<real>10.010999579794088</real>
</array>
<key>cloud_shadow</key>
<array>
<real>0.12999999523162842</real>
<real>0</real>
<real>0</real>
<real>1</real>
</array>
<key>density_multiplier</key>
<array>
<real>0.00017999998391111764</real>
<real>0</real>
<real>0</real>
<real>1</real>
</array>
<key>distance_multiplier</key>
<array>
<real>2</real>
<real>0</real>
<real>0</real>
<real>1</real>
</array>
<key>east_angle</key>
<real>0</real>
<key>enable_cloud_scroll</key>
<array>
<boolean>1</boolean>
<boolean>1</boolean>
</array>
<key>gamma</key>
<array>
<real>1.1499999761581421</real>
<real>0</real>
<real>0</real>
<real>1</real>
</array>
<key>glow</key>
<array>
<real>4.9999998807907104</real>
<real>0.0010000000478643939</real>
<real>-0.47999998436731417</real>
<real>1</real>
</array>
<key>haze_density</key>
<array>
<real>0.64999997615814209</real>
<real>0</real>
<real>0</real>
<real>1</real>
</array>
<key>haze_horizon</key>
<array>
<real>0.08999999612569809</real>
<real>0.19915600121021271</real>
<real>0.19915600121021271</real>
<real>1</real>
</array>
<key>lightnorm</key>
<array>
<real>0</real>
<real>0</real>
<real>1</real>
<real>0</real>
</array>
<key>max_y</key>
<array>
<real>188</real>
<real>0</real>
<real>0</real>
<real>1</real>
</array>
<key>preset_num</key>
<integer>22</integer>
<key>star_brightness</key>
<real>0</real>
<key>sun_angle</key>
<real>0</real>
<key>sunlight_color</key>
<array>
<real>2.5799999237060547</real>
<real>2.5799999237060547</real>
<real>2.5799999237060547</real>
<real>2.5799999237060547</real>
</array>
</map>
</llsd>

View File

@ -66,7 +66,7 @@ RenderShaderLightingMaxLevel 1 3
RenderDeferred 1 1
RenderDeferredSSAO 1 1
RenderShadowDetail 1 2
WatchdogDisabled 1 1
//WatchdogDisabled 1 1
RenderUseStreamVBO 1 1
RenderFSAASamples 1 16
RenderMaxTextureIndex 1 16

View File

@ -66,7 +66,7 @@ RenderShaderLightingMaxLevel 1 3
RenderDeferred 1 1
RenderDeferredSSAO 1 1
RenderShadowDetail 1 2
WatchdogDisabled 1 1
//WatchdogDisabled 1 1
RenderUseStreamVBO 0 0
RenderFSAASamples 1 16
RenderMaxTextureIndex 1 16

View File

@ -41,7 +41,7 @@ VertexShaderEnable 1 1
RenderTextureMemoryMultiple 1 1.0
UseOcclusion 1 1
RenderCubeMap 1 1
WatchdogDisabled 1 1
//WatchdogDisabled 1 1
RenderUseFBO 1 1

View File

@ -66,7 +66,7 @@ RenderShaderLightingMaxLevel 1 3
RenderDeferred 1 1
RenderDeferredSSAO 1 1
RenderShadowDetail 1 2
WatchdogDisabled 1 1
//WatchdogDisabled 1 1
RenderUseStreamVBO 1 1
RenderFSAASamples 1 16
RenderMaxTextureIndex 1 16

View File

@ -509,7 +509,14 @@ public:
switch (mSourceType)
{
case CHAT_SOURCE_AGENT:
icon->setValue(chat.mFromID);
if (!chat.mRlvNamesFiltered)
{
icon->setValue(chat.mFromID);
}
else
{
icon->setValue(LLSD("Unknown_Icon"));
}
break;
case CHAT_SOURCE_OBJECT:
icon->setValue(LLSD("OBJECT_Icon"));
@ -519,7 +526,14 @@ public:
// FS:LO FIRE-1439 - Clickable avatar names on local chat radar crossing reports
if(chat.mChatType == CHAT_TYPE_RADAR)
{
icon->setValue(chat.mFromID);
if (!chat.mRlvNamesFiltered)
{
icon->setValue(chat.mFromID);
}
else
{
icon->setValue(LLSD("Unknown_Icon"));
}
}
else
{

View File

@ -43,9 +43,9 @@ FSFloaterAddToContactSet::FSFloaterAddToContactSet(const LLSD& target)
if (target.isArray())
{
mHasMultipleAgents = true;
for (S32 i = 0; i < target.size(); ++i)
for (LLSD::array_const_iterator it = target.beginArray(); it != target.endArray(); ++it)
{
mAgentIDs.push_back(target[i].asUUID());
mAgentIDs.push_back((*it).asUUID());
}
}
else

View File

@ -43,6 +43,7 @@
#include "llgrouplist.h"
#include "llnotificationsutil.h"
#include "llscrolllistctrl.h"
#include "llslurl.h"
#include "llstartup.h"
#include "lltabcontainer.h"
#include "llviewermenu.h"
@ -85,7 +86,8 @@ FSFloaterContacts::FSFloaterContacts(const LLSD& seed)
mObserver(NULL),
mFriendsList(NULL),
mGroupList(NULL),
mAllowRightsChange(TRUE),
mAllowRightsChange(true),
mRightsChangeNotificationTriggered(false),
mNumRightsChanged(0),
mRlvBehaviorCallbackConnection(),
mResetLastColumnDisplayModeChanged(false),
@ -141,6 +143,8 @@ BOOL FSFloaterContacts::postBuild()
mFriendsTab->childSetAction("add_btn", boost::bind(&FSFloaterContacts::onAddFriendWizButtonClicked, this));
mFriendsTab->setDefaultBtn("im_btn");
mFriendsTab->getChild<LLTextBox>("friend_count")->setTextArg("COUNT", llformat("%d", mFriendsList->getItemCount()));
mGroupsTab = getChild<LLPanel>(GROUP_TAB_NAME);
mGroupList = mGroupsTab->getChild<LLGroupList>("group_list");
mGroupList->setNoItemsMsg(getString("no_groups_msg"));
@ -552,11 +556,11 @@ void FSFloaterContacts::onFriendListUpdate(U32 changed_mask)
--mNumRightsChanged;
if (mNumRightsChanged > 0)
{
mAllowRightsChange = FALSE;
mAllowRightsChange = false;
}
else
{
mAllowRightsChange = TRUE;
mAllowRightsChange = true;
}
const std::set<LLUUID>& changed_items = at.getChangedIDs();
@ -870,12 +874,7 @@ void FSFloaterContacts::confirmModifyRights(rights_map_t& ids, EGrantRevoke comm
// for single friend, show their name
if (ids.size() == 1)
{
LLUUID agent_id = ids.begin()->first;
std::string name;
if (gCacheName->getFullName(agent_id, name))
{
args["NAME"] = name;
}
args["NAME"] = LLSLURL("agent", ids.begin()->first, "completename").getSLURLString();
if (command == GRANT)
{
LLNotificationsUtil::add("GrantModifyRights",
@ -909,10 +908,13 @@ void FSFloaterContacts::confirmModifyRights(rights_map_t& ids, EGrantRevoke comm
}
}
}
}
bool FSFloaterContacts::modifyRightsConfirmation(const LLSD& notification, const LLSD& response, rights_map_t* rights)
{
mRightsChangeNotificationTriggered = false;
S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
if (0 == option)
{
@ -936,6 +938,11 @@ bool FSFloaterContacts::modifyRightsConfirmation(const LLSD& notification, const
void FSFloaterContacts::applyRightsToFriends()
{
if (mRightsChangeNotificationTriggered)
{
return;
}
bool rights_changed = false;
// store modify rights separately for confirmation
@ -1023,6 +1030,7 @@ void FSFloaterContacts::applyRightsToFriends()
if (need_confirmation)
{
confirmModifyRights(rights_updates, confirmation_type);
mRightsChangeNotificationTriggered = true;
}
else
{

View File

@ -145,8 +145,9 @@ private:
LLTabContainer* mTabContainer;
LLFriendObserver* mObserver;
BOOL mAllowRightsChange;
bool mAllowRightsChange;
S32 mNumRightsChanged;
bool mRightsChangeNotificationTriggered;
std::string mFriendListFontName;

View File

@ -763,6 +763,8 @@ BOOL FSFloaterIM::postBuild()
if ( im_session && im_session->isP2PSessionType())
{
mTypingStart.setArg("[NAME]", im_session->mName);
updateSessionName(im_session->mName, im_session->mName);
fetchAvatarName(im_session->mOtherParticipantID);
}
else
@ -856,6 +858,10 @@ void FSFloaterIM::onAvatarNameCache(const LLUUID& agent_id,
updateSessionName(name, name);
mTypingStart.setArg("[NAME]", name);
if (mOtherTyping)
{
setTitle((gSavedSettings.getBOOL("FSTypingChevronPrefix") ? "> " : "") + mTypingStart.getString());
}
LL_DEBUGS("FSFloaterIM") << "Setting IM tab name to '" << name << "'" << LL_ENDL;
// </FS:Ansariel>
}
@ -1462,6 +1468,11 @@ void FSFloaterIM::processChatHistoryStyleUpdate(const LLSD& newvalue)
{
floater->updateChatHistoryStyle();
floater->mInputEditor->setFont(font);
// Re-set the current text to make style update instant
std::string text = floater->mInputEditor->getText();
floater->mInputEditor->clear();
floater->mInputEditor->setText(text);
}
}
}

View File

@ -495,6 +495,12 @@ void FSFloaterNearbyChat::processChatHistoryStyleUpdate(const LLSD& newvalue)
if (nearby_chat)
{
nearby_chat->updateChatHistoryStyle();
nearby_chat->mInputEditor->setFont(LLViewerChat::getChatFont());
// Re-set the current text to make style update instant
std::string text = nearby_chat->mInputEditor->getText();
nearby_chat->mInputEditor->clear();
nearby_chat->mInputEditor->setText(text);
}
}
@ -683,21 +689,21 @@ BOOL FSFloaterNearbyChat::handleKeyHere( KEY key, MASK mask )
if (KEY_RETURN == key)
{
if (mask == MASK_CONTROL)
if (mask == MASK_CONTROL && gSavedSettings.getBOOL("FSUseCtrlShout"))
{
// shout
mInputEditor->updateHistory();
sendChat(CHAT_TYPE_SHOUT);
handled = TRUE;
}
else if (mask == MASK_SHIFT)
else if (mask == MASK_SHIFT && gSavedSettings.getBOOL("FSUseShiftWhisper"))
{
// whisper
mInputEditor->updateHistory();
sendChat(CHAT_TYPE_WHISPER);
handled = TRUE;
}
else if (mask == MASK_ALT)
else if (mask == MASK_ALT && gSavedSettings.getBOOL("FSUseAltOOC"))
{
// OOC
mInputEditor->updateHistory();
@ -1015,7 +1021,10 @@ void FSFloaterNearbyChat::sendChat( EChatType type )
utf8text = applyMuPose(utf8text);
// discard returned "found" boolean
LLGestureMgr::instance().triggerAndReviseString(utf8text, &utf8_revised_text);
if(!LLGestureMgr::instance().triggerAndReviseString(utf8text, &utf8_revised_text))
{
utf8_revised_text = utf8text;
}
}
else
{

View File

@ -0,0 +1,343 @@
/**
* $LicenseInfo:firstyear=2015&license=viewerlgpl$
* Phoenix Firestorm Viewer Source Code
* Copyright (c) 2015 Nicky Dasmijn
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation;
* version 2.1 of the License only.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*
* The Phoenix Firestorm Project, Inc., 1831 Oakwood Drive, Fairmont, Minnesota 56031-3225 USA
* http://www.firestormviewer.org
* $/LicenseInfo$
*/
#include "llviewerprecompiledheaders.h"
#include "fsfloatervramusage.h"
#include "llscrolllistctrl.h"
#include "llviewerobjectlist.h"
#include "lldrawable.h"
#include "llviewertexture.h"
#include "lltoolpie.h"
#include "llfloaterreg.h"
#include "llface.h"
#include "llvertexbuffer.h"
#include "llcallbacklist.h"
#include "llvoavatarself.h"
#include "llagentcamera.h"
const F32 PROPERTIES_REQUEST_TIMEOUT = 10.0f;
const F32 PROPERY_REQUEST_INTERVAL = 2.0f;
const U32 PROPERTIES_MAX_REQUEST_COUNT = 250;
static void onIdle( void *aData )
{
FSFloaterVRAMUsage *pFloater = reinterpret_cast<FSFloaterVRAMUsage*>(aData);
pFloater->onIdle();
}
struct ObjectStat
{
LLUUID mId;
U32 mTextureSize;
};
struct FSFloaterVRAMUsage::ImplData
{
LLScrollListCtrl *mList;
LLObjectSelectionHandle mSelection;
U32 mPending;
LLFrameTimer mPropTimer;
std::deque< ObjectStat > mObjects;
};
bool sortByTexture( ObjectStat const &lhs, ObjectStat const &rhs )
{
return lhs.mTextureSize > rhs.mTextureSize;
}
FSFloaterVRAMUsage::FSFloaterVRAMUsage(const LLSD& seed)
: LLFloater( seed )
{
mData = new ImplData();
mData->mList = 0;
mData->mPending = 0;
gIdleCallbacks.addFunction( &::onIdle, this) ;
}
FSFloaterVRAMUsage::~FSFloaterVRAMUsage()
{
gIdleCallbacks.deleteFunction( &::onIdle, this );
delete mData;
LLSelectMgr::instance().removePropertyListener( this );
LLSelectMgr::instance().enableSilhouette( TRUE );
}
void FSFloaterVRAMUsage::onOpen(const LLSD& key)
{
}
BOOL FSFloaterVRAMUsage::postBuild()
{
LLButton *pRefresh = getChild< LLButton >( "refresh_button" );
pRefresh->setClickedCallback( boost::bind( &FSFloaterVRAMUsage::doRefresh, this ) );
mData->mList = getChild< LLScrollListCtrl >( "result_list" );
LLSelectMgr::instance().registerPropertyListener( this );
LLSelectMgr::instance().enableSilhouette( FALSE );
return TRUE;
}
void FSFloaterVRAMUsage::onIdle()
{
if( !mData->mPending && mData->mObjects.empty() )
{
LLSelectMgr::instance().deselectAll();
return;
}
if( mData->mPending && mData->mPropTimer.getElapsedTimeF32() < PROPERTIES_REQUEST_TIMEOUT )
return;
if( !mData->mPending && mData->mPropTimer.getStarted() && mData->mPropTimer.getElapsedTimeF32() < PROPERY_REQUEST_INTERVAL )
return;
LLSelectMgr::instance().deselectAll();
mData->mPending = 0;
std::vector< LLViewerObject* > vctSelection;
std::deque< ObjectStat > withoutRegion;
while( mData->mPending < PROPERTIES_MAX_REQUEST_COUNT && !mData->mObjects.empty() )
{
LLViewerObject *pObj = gObjectList.findObject( mData->mObjects[ 0 ].mId );
if( pObj && pObj->getRegion() )
{
++mData->mPending;
vctSelection.push_back( pObj );
}
else if( pObj )
withoutRegion.push_back( mData->mObjects[0] );
mData->mObjects.erase( mData->mObjects.begin() );
}
mData->mObjects.insert( mData->mObjects.end(), withoutRegion.begin(), withoutRegion.end() );
mData->mPropTimer.start();
if( vctSelection.size() )
{
LLSelectMgr::instance().enableBatchMode();
mData->mSelection = LLSelectMgr::instance().selectObjectAndFamily( vctSelection );
LLSelectMgr::instance().disableBatchMode();
}
}
U32 FSFloaterVRAMUsage::calcTexturSize( LLViewerObject *aObject, std::ostream *aTooltip )
{
if( !aObject || !aObject->mDrawable || aObject->mDrawable->isDead() )
return 0;
std::map< LLUUID, U32 > stTextures;
F64 totalTexSize = 0;
U8 numTEs = aObject->getNumTEs();
if (aTooltip )
*aTooltip << (U32)numTEs << " TEs" << std::endl;
for( U8 j = 0; j < numTEs; ++j )
{
LLViewerTexture *pTex = aObject->getTEImage( j );
if( !pTex || pTex->isMissingAsset() )
continue;
U32 textureId = stTextures.size();
bool bOldTexId( false );
if( stTextures.end() != stTextures.find( pTex->getID() ) )
{
textureId = stTextures[ pTex->getID() ];
bOldTexId = true;
}
if (aTooltip )
*aTooltip << "TE: " << (U32)j << " tx: " << textureId << " w/h/c " << pTex->getFullWidth() << "/" << pTex->getFullHeight() << "/" << (U32)pTex->getComponents() << std::endl;
if( bOldTexId )
continue;
stTextures[ pTex->getID() ] = textureId;
S32 texSize = pTex->getFullWidth() * pTex->getFullHeight() * pTex->getComponents();
if( pTex->getUseMipMaps() )
texSize += (texSize*33)/100;
totalTexSize += texSize;
}
totalTexSize /= 1024.0;
return static_cast< U32 >( totalTexSize );
}
void FSFloaterVRAMUsage::doRefresh()
{
mData->mList->deleteAllItems();
S32 numObjects = gObjectList.getNumObjects();
mData->mPending = 0;
mData->mObjects.clear();
LLSelectMgr::instance().deselectAll();
for( S32 i = 0; i < numObjects; ++i )
{
LLViewerObject *pObj = gObjectList.getObject( i );
if( !pObj ) // Might be dead
continue;
if( !pObj->mbCanSelect ||
pObj->getPCode() == LLViewerObject::LL_VO_SURFACE_PATCH ||
pObj->getPCode() == LLViewerObject::LL_VO_SKY ||
pObj->getPCode() == LLViewerObject::LL_VO_WL_SKY ||
pObj->getPCode() == LLViewerObject::LL_VO_VOID_WATER ||
pObj->getPCode() == LLViewerObject::LL_VO_WATER ||
pObj->isAvatar() )
continue;
// Exclude everything that's not in a sphere with r=draw distance around the avatar.
F64 distance = (pObj->getPositionGlobal() - gAgentAvatarp->getPositionGlobal()).length();
if( distance > gAgentCamera.mDrawDistance )
continue;
ObjectStat oObject;
oObject.mId = pObj->getID();
oObject.mTextureSize = calcTexturSize( pObj );
mData->mObjects.push_back( oObject );
}
std::sort( mData->mObjects.begin(), mData->mObjects.end(), sortByTexture );
}
void FSFloaterVRAMUsage::addObjectToList( LLViewerObject *aObject, std::string const &aName )
{
LLScrollListItem::Params item;
F64 distance = (aObject->getPositionGlobal() - gAgentAvatarp->getPositionGlobal()).length();
item.columns.add().column("uuid").value( aObject->getID() );
item.columns.add().column("name").value( aName );
item.columns.add().column("distance").value( distance );
item.columns.add().column("faces").value( aObject->getNumFaces() );
item.columns.add().column("vertices").value( static_cast<S32>( aObject->getNumVertices() ) );
item.columns.add().column("indices").value( static_cast<S32>( aObject->getNumIndices() ) );
std::stringstream strTooltip;
U32 totalTexSize = calcTexturSize( aObject, &strTooltip );
F64 totalVboSize(0.0);
LLPointer< LLDrawable > pDrawable = aObject->mDrawable;
S32 numFaces = 0;
if( pDrawable && !pDrawable->isDead() )
numFaces = pDrawable->getNumFaces();
strTooltip << numFaces << " faces" << std::endl;
for (S32 j = 0; j < numFaces; j++)
{
LLFace* pFace = pDrawable->getFace( j );
if( !pFace )
continue;
S32 cmW = 0, cmH = 0;
calcFaceSize( pFace, cmW, cmH );
strTooltip << "Face: " << j << " extends (cm) w/h " << cmW << "/" << cmH << std::endl;
S32 vertexSize = calcVBOEntrySize( pFace->getVertexBuffer() ) * aObject->getNumVertices();;
S32 indexSize = sizeof( S16 ) * aObject->getNumIndices();
totalVboSize += vertexSize;
totalVboSize += indexSize;
}
totalVboSize /= 1024.0;
item.columns.add().column("vram_usage").value( (S32)totalTexSize );
item.columns.add().column("vram_usage_vbo").value( (S32)totalVboSize );
LLScrollListItem *pRow = mData->mList->addRow( item );
if( pRow )
{
for( S32 j = 0; j < pRow->getNumColumns(); ++j )
pRow->getColumn( j )->setToolTip( strTooltip.str() );
}
}
void FSFloaterVRAMUsage::calcFaceSize( LLFace *aFace, S32 &aW, S32 &aH )
{
aW = aH = 0;
if( !aFace )
return;
LLVector4a size;
size.setSub( aFace->mExtents[1], aFace->mExtents[0] );
S32 cmX = static_cast<S32>( size[0]*100 );
S32 cmY = static_cast<S32>( size[1]*100 );
S32 cmZ = static_cast<S32>( size[2]*100 );
aW = cmX;
aH = cmY;
if( 0 != cmZ )
{
if( 0 == aW )
aW = cmZ;
else
aH = cmZ;
}
}
S32 FSFloaterVRAMUsage::calcVBOEntrySize( LLVertexBuffer *aVBO )
{
if( !aVBO )
return 0;
S32 vboEntrySize(0);
U32 vboMask = aVBO->getTypeMask();
for( S32 k = 0, l = 1; k < LLVertexBuffer::TYPE_MAX; ++k )
{
if( vboMask & l && k != LLVertexBuffer::TYPE_TEXTURE_INDEX )
vboEntrySize += LLVertexBuffer::sTypeSize[ k ];
l = l << 1;
}
return vboEntrySize;
}
void FSFloaterVRAMUsage::onProperties( LLSelectNode const *aProps )
{
if( !aProps && !aProps->getObject() )
return;
LLUUID id = aProps->getObject()->getID();
LLViewerObject *pObj = gObjectList.findObject( id );
addObjectToList( pObj, aProps->mName );
}

View File

@ -0,0 +1,61 @@
/**
* $LicenseInfo:firstyear=2015&license=viewerlgpl$
* Phoenix Firestorm Viewer Source Code
* Copyright (c) 2015 Nicky Dasmijn
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation;
* version 2.1 of the License only.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*
* The Phoenix Firestorm Project, Inc., 1831 Oakwood Drive, Fairmont, Minnesota 56031-3225 USA
* http://www.firestormviewer.org
* $/LicenseInfo$
*/
#ifndef FS_FLOATERVRAMUSAGE_H
#define FS_FLOATERVRAMUSAGE_H
#include "llfloater.h"
#include "llselectmgr.h"
class LLScrollListCtrl;
class LLViewerObject;
class LLFace;
class LLVertexBuffer;
class FSFloaterVRAMUsage : public LLFloater, public nd::selection::PropertiesListener
{
public:
FSFloaterVRAMUsage(const LLSD& seed);
/*virtual*/ ~FSFloaterVRAMUsage();
/*virtual*/ void onOpen(const LLSD& key);
BOOL postBuild();
virtual void onProperties( LLSelectNode const * );
void onIdle();
private:
void doRefresh();
void addObjectToList( LLViewerObject*, std::string const& );
void calcFaceSize( LLFace *aFace, S32 &aW, S32 &aH );
S32 calcVBOEntrySize( LLVertexBuffer *aVBO );
U32 calcTexturSize( LLViewerObject*, std::ostream * = 0 );
struct ImplData;
ImplData *mData;
};
#endif // FS_FLOATERBLOCKLIST_H

View File

@ -61,6 +61,9 @@ std::string FSFloaterWSAssetBlacklist::getTypeString(S32 type)
case 6:
return getString("asset_object");
break;
case 45:
return getString("asset_resident");
break;
default:
return getString("asset_unknown");
break;

View File

@ -35,13 +35,12 @@
#include "llviewercontrol.h"
#include <boost/regex.hpp>
//#include <boost/algorithm/string/find.hpp> //for boost::ifind_first
FSKeywords::FSKeywords()
{
gSavedPerAccountSettings.getControl("FSKeywords")->getSignal()->connect(boost::bind(&FSKeywords::updateKeywords, this));
gSavedPerAccountSettings.getControl("FSKeywordCaseSensitive")->getSignal()->connect(boost::bind(&FSKeywords::updateKeywords, this));
gSavedPerAccountSettings.getControl("FSKeywordMatchWholeWords")->getSignal()->connect(boost::bind(&FSKeywords::updateKeywords, this));
updateKeywords();
}
@ -51,6 +50,7 @@ FSKeywords::~FSKeywords()
void FSKeywords::updateKeywords()
{
BOOL match_whole_words = gSavedPerAccountSettings.getBOOL("FSKeywordMatchWholeWords");
std::string s = gSavedPerAccountSettings.getString("FSKeywords");
if (!gSavedPerAccountSettings.getBOOL("FSKeywordCaseSensitive"))
{
@ -61,7 +61,14 @@ void FSKeywords::updateKeywords()
mWordList.clear();
while (begin != end)
{
mWordList.push_back(*begin++);
if (match_whole_words)
{
mWordList.push_back(boost::regex_replace(std::string(*begin++), boost::regex("[.^$|()\\[\\]{}*+?\\\\]"), "\\\\&", boost::match_default|boost::format_sed));
}
else
{
mWordList.push_back(*begin++);
}
}
}
@ -71,6 +78,7 @@ bool FSKeywords::chatContainsKeyword(const LLChat& chat, bool is_local)
static LLCachedControl<bool> sFSKeywordInChat(gSavedPerAccountSettings, "FSKeywordInChat", false);
static LLCachedControl<bool> sFSKeywordInIM(gSavedPerAccountSettings, "FSKeywordInIM", false);
static LLCachedControl<bool> sFSKeywordCaseSensitive(gSavedPerAccountSettings, "FSKeywordCaseSensitive", false);
static LLCachedControl<bool> sFSKeywordMatchWholeWords(gSavedPerAccountSettings, "FSKeywordMatchWholeWords", false);
if (!sFSKeywordOn ||
(is_local && !sFSKeywordInChat) ||
@ -86,13 +94,27 @@ bool FSKeywords::chatContainsKeyword(const LLChat& chat, bool is_local)
LLStringUtil::toLower(source);
}
for (std::vector<std::string>::iterator it = mWordList.begin(); it != mWordList.end(); ++it)
if (sFSKeywordMatchWholeWords)
{
if (source.find((*it)) != std::string::npos)
for (std::vector<std::string>::iterator it = mWordList.begin(); it != mWordList.end(); ++it)
{
return true;
if (boost::regex_search(source, boost::regex("\\b" + (*it) + "\\b")))
{
return true;
}
}
}
else
{
for (std::vector<std::string>::iterator it = mWordList.begin(); it != mWordList.end(); ++it)
{
if (source.find((*it)) != std::string::npos)
{
return true;
}
}
}
return false;
}
@ -101,7 +123,7 @@ void FSKeywords::notify(const LLChat& chat)
{
if (chat.mFromID != gAgentID || chat.mFromName == SYSTEM_FROM)
{
if (!LLMuteList::getInstance()->isMuted(chat.mFromID) && !chat.mMuted)
if (!chat.mMuted && !LLMuteList::getInstance()->isMuted(chat.mFromID))
{
static LLCachedControl<bool> PlayModeUISndFSKeywordSound(gSavedSettings, "PlayModeUISndFSKeywordSound");
if (PlayModeUISndFSKeywordSound)

View File

@ -77,6 +77,7 @@ public:
void setBridge(LLViewerInventoryItem* item) { mpBridge = item; };
LLViewerInventoryItem* getBridge() { return mpBridge; };
bool canUseBridge();
bool isBridgeValid() const { return NULL != mpBridge; }
void checkBridgeScriptName(const std::string& fileName);
std::string currentFullName() { return mCurrentFullName; }
@ -106,7 +107,6 @@ private:
LLUUID mBridgeUUID;
bool mIsFirstCallDone; //initialization conversation
bool isBridgeValid() const { return NULL != mpBridge; }
uuid_vec_t mAllowedDetachables;

View File

@ -89,7 +89,7 @@ void FSLSLBridgeRequestRadarPosResponder::result(const LLSD& content)
FSRadarEntry* entry = radar->getEntry(targetAv);
if (entry)
{
entry->setZOffset((F32)(targetZ));
entry->setZOffset(targetZ);
//LL_INFOS() << targetAv << " ::: " << targetZ << LL_ENDL;
}
}

View File

@ -137,7 +137,6 @@ using namespace boost::regex_constants;
std::string FSLSLPreprocessor::encode(std::string script)
{
std::string otext = FSLSLPreprocessor::decode(script);
BOOL mono = mono_directive(script);
@ -157,19 +156,17 @@ std::string FSLSLPreprocessor::encode(std::string script)
if(mono)otext += "//mono\n";
else otext += "//lsl2\n";
return otext;
}
std::string FSLSLPreprocessor::decode(std::string script)
{
static S32 startpoint = encode_start.length();
std::string tip = script.substr(0,startpoint);
if(tip != encode_start)
if (tip != encode_start)
{
LL_DEBUGS() << "No start" << LL_ENDL;
//if(sp != -1)trigger warningg/error?
@ -178,24 +175,19 @@ std::string FSLSLPreprocessor::decode(std::string script)
S32 end = script.find(encode_end);
if(end == -1)
if (end == -1)
{
LL_DEBUGS() << "No end" << LL_ENDL;
return script;
}
std::string data = script.substr(startpoint,end-startpoint);
LL_DEBUGS() << "data = " << data << LL_ENDL;
std::string otext = data;
otext = boost::regex_replace(otext, boost::regex("([/*])\\|",boost::regex::perl), "$1");
//otext = curl_unescape(otext.c_str(),otext.length());
return otext;
@ -204,30 +196,36 @@ std::string FSLSLPreprocessor::decode(std::string script)
std::string scopeript2(std::string& top, S32 fstart, char left = '{', char right = '}')
{
if(fstart >= int(top.length()))
if (fstart >= S32(top.length()))
{
return "begin out of bounds";
}
int cursor = fstart;
S32 cursor = fstart;
bool noscoped = true;
bool in_literal = false;
int count = 0;
S32 count = 0;
char ltoken = ' ';
do
{
char token = top.at(cursor);
if(token == '"' && ltoken != '\\')in_literal = !in_literal;
else if(token == '\\' && ltoken == '\\')token = ' ';
else if(!in_literal)
if (token == '"' && ltoken != '\\')
{
if(token == left)
in_literal = !in_literal;
}
else if (token == '\\' && ltoken == '\\')
{
token = ' ';
}
else if (!in_literal)
{
if (token == left)
{
count += 1;
noscoped = false;
}else if(token == right)
}
else if (token == right)
{
count -= 1;
noscoped = false;
@ -235,9 +233,11 @@ std::string scopeript2(std::string& top, S32 fstart, char left = '{', char right
}
ltoken = token;
cursor += 1;
}while((count > 0 || noscoped) && cursor < int(top.length()));
int end = (cursor-fstart);
if(end > int(top.length()))
}
while ((count > 0 || noscoped) && cursor < S32(top.length()));
S32 end = (cursor-fstart);
if (end > S32(top.length()))
{
return "end out of bounds";
}
@ -245,19 +245,20 @@ std::string scopeript2(std::string& top, S32 fstart, char left = '{', char right
return top.substr(fstart,(cursor-fstart));
}
inline int const_iterator_to_pos(std::string::const_iterator begin, std::string::const_iterator cursor)
inline S32 const_iterator_to_pos(std::string::const_iterator begin, std::string::const_iterator cursor)
{
return std::distance(begin, cursor);
}
void shredder(std::string& text)
{
int cursor = 0;
if(int(text.length()) == 0)
S32 cursor = 0;
if (text.length() == 0)
{
text = "y u do dis?";
text = "No text to shredder.";
return;
}
char ltoken = ' ';
do
{
@ -266,7 +267,7 @@ void shredder(std::string& text)
{
ltoken = token;
token = text[++cursor];
while(cursor < int(text.length()))
while(cursor < S32(text.length()))
{
if(token == '\\' && ltoken == '\\') token = ' ';
if(token == '"' && ltoken != '\\')
@ -294,13 +295,14 @@ void shredder(std::string& text)
}
ltoken = token;
++cursor;
}while(cursor < int(text.length()));
}
while (cursor < S32(text.length()));
}
std::string FSLSLPreprocessor::lslopt(std::string script)
{
script = " \n"+script;//HACK//this should prevent regex fail for functions starting on line 0, column 0
script = " \n" + script;//HACK//this should prevent regex fail for functions starting on line 0, column 0
//added more to prevent split fail on scripts with no global data
//this should be fun
@ -327,13 +329,13 @@ std::string FSLSLPreprocessor::lslopt(std::string script)
std::set<std::string> kept_functions;
std::map<std::string, std::string> functions;
while(boost::regex_search(std::string::const_iterator(top.begin()), std::string::const_iterator(top.end()), TOPfmatch, findfuncts, boost::match_default))
while (boost::regex_search(std::string::const_iterator(top.begin()), std::string::const_iterator(top.end()), TOPfmatch, findfuncts, boost::match_default))
{
//std::string type = TOPfmatch[1];
std::string funcname = TOPfmatch[2];
int pos = TOPfmatch.position(boost::match_results<std::string::const_iterator>::size_type(0));
S32 pos = TOPfmatch.position(boost::match_results<std::string::const_iterator>::size_type(0));
std::string funcb = scopeript2(top, pos);
functions[funcname] = funcb;
LL_DEBUGS() << "func " << funcname << " added to list[" << funcb << "]" << LL_ENDL;
@ -346,12 +348,12 @@ std::string FSLSLPreprocessor::lslopt(std::string script)
repass = false;
std::map<std::string, std::string>::iterator func_it;
for(func_it = functions.begin(); func_it != functions.end(); func_it++)
for (func_it = functions.begin(); func_it != functions.end(); func_it++)
{
std::string funcname = func_it->first;
if(kept_functions.find(funcname) == kept_functions.end())
if (kept_functions.find(funcname) == kept_functions.end())
{
boost::smatch calls;
@ -361,7 +363,7 @@ std::string FSLSLPreprocessor::lslopt(std::string script)
std::string::const_iterator bstart = bottom.begin();
std::string::const_iterator bend = bottom.end();
if(boost::regex_search(bstart, bend, calls, findcalls, boost::match_default))
if (boost::regex_search(bstart, bend, calls, findcalls, boost::match_default))
{
std::string function = func_it->second;
@ -371,7 +373,8 @@ std::string FSLSLPreprocessor::lslopt(std::string script)
}
}
}
}while(repass);
}
while (repass);
std::map<std::string, std::string> gvars;
boost::regex findvars("(integer|float|string|key|vector|rotation|list)\\s+([a-zA-Z0-9_]+)([^\\(\\);]*;)");
@ -384,12 +387,12 @@ std::string FSLSLPreprocessor::lslopt(std::string script)
std::string fullref = TOPvmatch[1] + " " + varname+TOPvmatch[3];
gvars[varname] = fullref;
int start = const_iterator_to_pos(std::string::const_iterator(top.begin()), TOPvmatch[1].first);
S32 start = const_iterator_to_pos(std::string::const_iterator(top.begin()), TOPvmatch[1].first);
top.erase(start,fullref.length());
}
std::map<std::string, std::string>::iterator var_it;
for(var_it = gvars.begin(); var_it != gvars.end(); var_it++)
for (var_it = gvars.begin(); var_it != gvars.end(); var_it++)
{
std::string varname = var_it->first;
@ -398,7 +401,7 @@ std::string FSLSLPreprocessor::lslopt(std::string script)
std::string::const_iterator bstart = bottom.begin();
std::string::const_iterator bend = bottom.end();
if(boost::regex_search(bstart, bend, vcalls, findvcalls, boost::match_default))
if (boost::regex_search(bstart, bend, vcalls, findvcalls, boost::match_default))
{
bottom = var_it->second + "\n" + bottom;
}
@ -457,17 +460,16 @@ inline std::string shortfile(std::string in)
class trace_include_files : public boost::wave::context_policies::default_preprocessing_hooks
{
public:
trace_include_files(FSLSLPreprocessor* proc)
: mProc(proc)
{
trace_include_files(FSLSLPreprocessor* proc)
: mProc(proc)
{
mAssetStack.push(LLUUID::null.asString());
mFileStack.push(proc->mMainScriptName);
}
template <typename ContextT>
bool found_include_directive(ContextT const& ctx,
std::string const &filename, bool include_next)
bool found_include_directive(ContextT const& ctx, std::string const &filename, bool include_next)
{
std::string cfilename = filename.substr(1,filename.length()-2);
LL_DEBUGS() << cfilename << ":found_include_directive" << LL_ENDL;
@ -512,13 +514,14 @@ public:
}
}
}
}else
}
else
{
//todo check on HDD in user defined dir for file in question
}
//++include_depth;
//++include_depth;
return false;
}
}
template <typename ContextT>
void opened_include_file(ContextT const& ctx,
@ -530,10 +533,14 @@ public:
std::string id;
std::string filename = shortfile(relname);//boost::filesystem::path(std::string(relname)).filename();
std::map<std::string,LLUUID>::iterator it = mProc->cached_assetids.find(filename);
if(it != mProc->cached_assetids.end())
if (it != mProc->cached_assetids.end())
{
id = mProc->cached_assetids[filename].asString();
}else id = "NOT_IN_WORLD";//I guess, still need to add external includes atm
}
else
{
id = "NOT_IN_WORLD";//I guess, still need to add external includes atm
}
mAssetStack.push(id);
std::string macro = "__ASSETID__";
usefulctx.remove_macro_definition(macro, true);
@ -575,12 +582,14 @@ public:
{
std::string err;
err = "warning: last line of file ends without a newline";
if( !err.compare( e.description())){
if( !err.compare( e.description()))
{
err = "Ignoring warning: ";
err += e.description();
LL_WARNS() << err << LL_ENDL;
}
else{
else
{
boost::throw_exception(e);
}
}
@ -594,7 +603,7 @@ private:
std::string cachepath(std::string name)
{
return gDirUtilp->getExpandedFilename(LL_PATH_CACHE,"lslpreproc",name);
return gDirUtilp->getExpandedFilename(LL_PATH_CACHE, "lslpreproc", name);
}
void cache_script(std::string name, std::string content)
@ -612,16 +621,15 @@ void cache_script(std::string name, std::string content)
void FSLSLPreprocessor::FSProcCacheCallback(LLVFS *vfs, const LLUUID& iuuid, LLAssetType::EType type, void *userdata, S32 result, LLExtStat extstat)
{
LLUUID uuid = iuuid;
LL_DEBUGS() << "cachecallback called" << LL_ENDL;
ProcCacheInfo* info =(ProcCacheInfo*)userdata;
ProcCacheInfo* info = (ProcCacheInfo*)userdata;
LLViewerInventoryItem* item = info->item;
FSLSLPreprocessor* self = info->self;
if(item && self)
if (item && self)
{
std::string name = item->getName();
if(result == LL_ERR_NOERR)
if (result == LL_ERR_NOERR)
{
LLVFile file(vfs, uuid, type);
S32 file_length = file.getSize();
@ -637,13 +645,13 @@ void FSLSLPreprocessor::FSProcCacheCallback(LLVFS *vfs, const LLUUID& iuuid, LLA
content += "\n#define __ITEMID__ __UP_ITEMID__\n";*/
//prolly wont work and ill have to be not lazy, but worth a try
delete buffer;
if(boost::filesystem::native(name))
if (boost::filesystem::native(name))
{
LL_DEBUGS() << "native name of " << name << LL_ENDL;
self->mCore->mErrorList->setCommentText(std::string("Cached ")+name);
self->mCore->mErrorList->setCommentText("Cached " + name);
cache_script(name, content);
std::set<std::string>::iterator loc = self->caching_files.find(name);
if(loc != self->caching_files.end())
if (loc != self->caching_files.end())
{
LL_DEBUGS() << "finalizing cache" << LL_ENDL;
self->caching_files.erase(loc);
@ -666,33 +674,36 @@ void FSLSLPreprocessor::FSProcCacheCallback(LLVFS *vfs, const LLUUID& iuuid, LLA
}
}
if(info)
if (info)
{
delete info;
}
}
void FSLSLPreprocessor::preprocess_script(BOOL close, BOOL defcache)
void FSLSLPreprocessor::preprocess_script(BOOL close, bool sync, BOOL defcache)
{
mClose = close;
mSync = sync;
mDefinitionCaching = defcache;
caching_files.clear();
mCore->mErrorList->setCommentText(std::string("PreProc Starting..."));
mCore->mErrorList->setCommentText("PreProc Starting...");
LLFile::mkdir(gDirUtilp->getExpandedFilename(LL_PATH_CACHE,"")+gDirUtilp->getDirDelimiter()+"lslpreproc");
LLFile::mkdir(gDirUtilp->getExpandedFilename(LL_PATH_CACHE,"") + gDirUtilp->getDirDelimiter() + "lslpreproc");
std::string script = mCore->mEditor->getText();
if(mMainScriptName == "")//more sanity
if (mMainScriptName.empty())//more sanity
{
const LLInventoryItem* item = NULL;
LLPreview* preview = (LLPreview*)mCore->mUserdata;
if(preview)
if (preview)
{
item = preview->getItem();
}
if(item)
if (item)
{
mMainScriptName = item->getName();
}else
}
else
{
mMainScriptName = "(Unknown)";
}
@ -702,7 +713,6 @@ void FSLSLPreprocessor::preprocess_script(BOOL close, BOOL defcache)
cache_script(name, script);
//start the party
start_process();
}
const std::string lazy_list_set_func("\
@ -730,15 +740,15 @@ list lazy_list_set(list target, integer pos, list newval)\n\
std::string reformat_lazy_lists(std::string script)
{
BOOL add_set = FALSE;
bool add_set = false;
std::string nscript = script;
nscript = boost::regex_replace(nscript, boost::regex("([a-zA-Z0-9_]+)\\[([a-zA-Z0-9_()\"]+)]\\s*=\\s*([a-zA-Z0-9_()\"\\+\\-\\*/]+)([;)])",boost::regex::perl), "$1=lazy_list_set($1,$2,[$3])$4");
if(nscript != script)
if (nscript != script)
{
add_set = TRUE;
add_set = true;
}
if(add_set == TRUE)
if (add_set)
{
//add lazy_list_set function to top of script, as it is used
nscript = utf8str_removeCRLF(lazy_list_set_func) + "\n" + nscript;
@ -747,14 +757,14 @@ std::string reformat_lazy_lists(std::string script)
}
inline std::string randstr(int len, std::string chars)
inline std::string randstr(S32 len, std::string chars)
{
int clen = int(chars.length());
int built = 0;
S32 clen = S32(chars.length());
S32 built = 0;
std::string ret;
while(built < len)
while (built < len)
{
int r = std::rand() / ( RAND_MAX / clen );
S32 r = std::rand() / ( RAND_MAX / clen );
r = r % clen;//sanity
ret += chars.at(r);
built += 1;
@ -764,12 +774,12 @@ inline std::string randstr(int len, std::string chars)
inline std::string quicklabel()
{
return std::string("c")+randstr(5,"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz");
return std::string("c") + randstr(5, "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz");
}
std::string minimalize_whitespace(std::string in)
{
return boost::regex_replace(in, boost::regex("\\s*",boost::regex::perl), "\n");
return boost::regex_replace(in, boost::regex("\\s*",boost::regex::perl), "\n");
}
std::string reformat_switch_statements(std::string script)
@ -784,13 +794,13 @@ std::string reformat_switch_statements(std::string script)
static std::string switchstr = "switch(";
int escape = 100;
S32 escape = 100;
while(boost::regex_search(std::string::const_iterator(buffer.begin()), std::string::const_iterator(buffer.end()), matches, findswitches, boost::match_default) && escape > 1)
{
int res = matches.position(boost::match_results<std::string::const_iterator>::size_type(0))+1;
S32 res = matches.position(boost::match_results<std::string::const_iterator>::size_type(0))+1;
static int slen = switchstr.length();
static S32 slen = switchstr.length();
std::string arg = scopeript2(buffer, res+slen-1,'(',')');
@ -803,7 +813,7 @@ std::string reformat_switch_statements(std::string script)
LL_DEBUGS() << "arg=[" << arg << "]" << LL_ENDL;;
std::string rstate = scopeript2(buffer, res+slen+arg.length()-1);
int cutlen = slen;
S32 cutlen = slen;
cutlen -= 1;
cutlen += arg.length();
cutlen += rstate.length();
@ -811,7 +821,7 @@ std::string reformat_switch_statements(std::string script)
//then add arg len and state len to get section to excise
//rip off the scope edges
int slicestart = rstate.find("{")+1;
S32 slicestart = rstate.find("{")+1;
rstate = rstate.substr(slicestart,(rstate.rfind("}")-slicestart)-1);
LL_DEBUGS() << "rstate=[" << rstate << "]" << LL_ENDL;
@ -825,11 +835,11 @@ std::string reformat_switch_statements(std::string script)
{
//if(statematches[0].matched)
{
int case_start = statematches.position(boost::match_results<std::string::const_iterator>::size_type(0))+1;//const_iterator2pos(statematches[0].first+1, std::string::const_iterator(rstate.begin()))-1;
int next_curl = rstate.find("{",case_start+1);
int next_semi = rstate.find(":",case_start+1);
int case_end = (next_curl < next_semi && next_curl != -1) ? next_curl : next_semi;
static int caselen = std::string("case").length();
S32 case_start = statematches.position(boost::match_results<std::string::const_iterator>::size_type(0))+1;//const_iterator2pos(statematches[0].first+1, std::string::const_iterator(rstate.begin()))-1;
S32 next_curl = rstate.find("{",case_start+1);
S32 next_semi = rstate.find(":",case_start+1);
S32 case_end = (next_curl < next_semi && next_curl != -1) ? next_curl : next_semi;
static S32 caselen = std::string("case").length();
if(case_end != -1)
{
std::string casearg = rstate.substr(case_start+caselen,case_end-(case_start+caselen));
@ -928,11 +938,12 @@ std::string reformat_switch_statements(std::string script)
void FSLSLPreprocessor::start_process()
{
if(mWaving)
if (mWaving)
{
LL_WARNS() << "already waving?" << LL_ENDL;
return;
}
mWaving = TRUE;
boost::wave::util::file_position_type current_position;
std::string input = mCore->mEditor->getText();
@ -944,31 +955,34 @@ void FSLSLPreprocessor::start_process()
std::string name = mMainScriptName;
bool lazy_lists = gSavedSettings.getBOOL("_NACL_PreProcLSLLazyLists");
bool use_switch = gSavedSettings.getBOOL("_NACL_PreProcLSLSwitch");
bool use_optimizer = gSavedSettings.getBOOL("_NACL_PreProcLSLOptimizer");
bool enable_hdd_include = gSavedSettings.getBOOL("_NACL_PreProcEnableHDDInclude");
bool use_compression = gSavedSettings.getBOOL("_NACL_PreProcLSLTextCompress");
std::string settings;
settings = "Settings: preproc ";
if (lazy_lists)
{
settings = settings + " Lazy Lists";
}
settings = settings + " Lazy Lists";
}
if (use_switch)
{
settings = settings + " Switches";
settings = settings + " Switches";
}
if(gSavedSettings.getBOOL("_NACL_PreProcLSLOptimizer"))
if (use_optimizer)
{
settings = settings + " Optimize";
settings = settings + " Optimize";
}
if(gSavedSettings.getBOOL("_NACL_PreProcEnableHDDInclude"))
if (enable_hdd_include)
{
settings = settings + " HDDInclude";
settings = settings + " HDDInclude";
}
if(gSavedSettings.getBOOL("_NACL_PreProcLSLTextCompress"))
if (use_compression)
{
settings = settings + " Compress";
settings = settings + " Compress";
}
//display the settings
mCore->mErrorList->setCommentText(std::string(settings));
mCore->mErrorList->setCommentText(settings);
LL_DEBUGS() << settings << LL_ENDL;
bool errored = false;
std::string err;
@ -985,29 +999,29 @@ void FSLSLPreprocessor::start_process()
ctx.set_language(boost::wave::enable_prefer_pp_numbers(ctx.get_language()));
ctx.set_language(boost::wave::enable_variadics(ctx.get_language()));
std::string path = gDirUtilp->getExpandedFilename(LL_PATH_CACHE,"")+gDirUtilp->getDirDelimiter()+"lslpreproc"+gDirUtilp->getDirDelimiter();
std::string path = gDirUtilp->getExpandedFilename(LL_PATH_CACHE,"") + gDirUtilp->getDirDelimiter() + "lslpreproc" + gDirUtilp->getDirDelimiter();
ctx.add_include_path(path.c_str());
if(gSavedSettings.getBOOL("_NACL_PreProcEnableHDDInclude"))
if (enable_hdd_include)
{
std::string hddpath = gSavedSettings.getString("_NACL_PreProcHDDIncludeLocation");
if(hddpath != "")
if (!hddpath.empty())
{
ctx.add_include_path(hddpath.c_str());
ctx.add_sysinclude_path(hddpath.c_str());
}
}
std::string def = llformat("__AGENTKEY__=\"%s\"",gAgent.getID().asString().c_str());//legacy because I used it earlier
std::string def = llformat("__AGENTKEY__=\"%s\"", gAgentID.asString().c_str());//legacy because I used it earlier
ctx.add_macro_definition(def,false);
def = llformat("__AGENTID__=\"%s\"",gAgent.getID().asString().c_str());
def = llformat("__AGENTID__=\"%s\"", gAgentID.asString().c_str());
ctx.add_macro_definition(def,false);
def = llformat("__AGENTIDRAW__=%s",gAgent.getID().asString().c_str());
def = llformat("__AGENTIDRAW__=%s", gAgentID.asString().c_str());
ctx.add_macro_definition(def,false);
std::string aname = gAgentAvatarp->getFullname();
def = llformat("__AGENTNAME__=\"%s\"",aname.c_str());
def = llformat("__AGENTNAME__=\"%s\"", aname.c_str());
ctx.add_macro_definition(def,false);
def = llformat("__ASSETID__=%s",LLUUID::null.asString().c_str());
def = llformat("__ASSETID__=%s", LLUUID::null.asString().c_str());
ctx.add_macro_definition(def,false);
def = llformat("__SHORTFILE__=\"%s\"",name.c_str());
def = llformat("__SHORTFILE__=\"%s\"", name.c_str());
ctx.add_macro_definition(def,false);
ctx.add_macro_definition("list(input)=((list)(input))",false);
@ -1022,15 +1036,15 @@ void FSLSLPreprocessor::start_process()
context_type::iterator_type first = ctx.begin();
context_type::iterator_type last = ctx.end();
while (first != last)
while (first != last)
{
if(caching_files.size() != 0)
if (caching_files.size() != 0)
{
mWaving = FALSE;
return;
}
current_position = (*first).get_position();
current_position = (*first).get_position();
std::string token = std::string((*first).get_value().c_str());//stupid boost bitching even though we know its a std::string
@ -1041,17 +1055,17 @@ void FSLSLPreprocessor::start_process()
output += token;
if(lazy_lists == FALSE)
if (!lazy_lists)
{
lazy_lists = ctx.is_defined_macro(std::string("USE_LAZY_LISTS"));
}
if(use_switch == FALSE)
if (!use_switch)
{
use_switch = ctx.is_defined_macro(std::string("USE_SWITCHES"));
}
++first;
}
++first;
}
}
catch(boost::wave::cpp_exception const& e)
{
@ -1080,31 +1094,33 @@ void FSLSLPreprocessor::start_process()
mCore->mErrorList->setCommentText(err);
}
if(!errored)
if (!errored)
{
FAILDEBUG
if(lazy_lists == TRUE)
if (lazy_lists)
{
try
{
mCore->mErrorList->setCommentText("Applying lazy list set transform");
output = reformat_lazy_lists(output);
}catch(...)
{
}
catch(...)
{
errored = TRUE;
err = "unexpected exception in lazy list converter.";
mCore->mErrorList->setCommentText(err);
}
}
if(use_switch == TRUE)
if (use_switch)
{
try
{
mCore->mErrorList->setCommentText("Applying switch statement transform");
output = reformat_switch_statements(output);
}catch(...)
{
}
catch(...)
{
errored = TRUE;
err = "unexpected exception in switch statement converter.";
mCore->mErrorList->setCommentText(err);
@ -1112,11 +1128,11 @@ void FSLSLPreprocessor::start_process()
}
}
if(!mDefinitionCaching)
if (!mDefinitionCaching)
{
if(!errored)
if (!errored)
{
if(gSavedSettings.getBOOL("_NACL_PreProcLSLOptimizer"))
if (use_optimizer)
{
mCore->mErrorList->setCommentText("Optimizing out unreferenced user-defined functions and global variables");
try
@ -1131,32 +1147,33 @@ void FSLSLPreprocessor::start_process()
}
}
}
if(!errored)
if (!errored)
{
if(gSavedSettings.getBOOL("_NACL_PreProcLSLTextCompress"))
if (use_compression)
{
mCore->mErrorList->setCommentText("Compressing lsltext by removing unnecessary space");
try
{
output = lslcomp(output);
}catch(...)
{
}
catch(...)
{
errored = TRUE;
err = "unexpected exception in lsl compressor";
mCore->mErrorList->setCommentText(err);
}
}
}
output = encode(rinput)+"\n\n"+output;
output = encode(rinput) + "\n\n" + output;
LLTextEditor* outfield = mCore->mPostEditor;//getChild<LLViewerTextEditor>("post_process");
if(outfield)
if (outfield)
{
outfield->setText(LLStringExplicit(output));
}
mCore->mPostScript = output;
mCore->doSaveComplete((void*)mCore,mClose);
mCore->doSaveComplete((void*)mCore, mClose, mSync);
}
mWaving = FALSE;
}
@ -1207,13 +1224,13 @@ bool FSLSLPreprocessor::mono_directive(std::string const& text, bool agent_inv)
{
bool domono = agent_inv;
if(text.find("//mono\n") != -1)
if (text.find("//mono\n") != -1)
{
domono = TRUE;
domono = true;
}
else if(text.find("//lsl2\n") != -1)
else if (text.find("//lsl2\n") != -1)
{
domono = FALSE;
domono = false;
}
return domono;
}

View File

@ -46,7 +46,7 @@ class FSLSLPreprocessor
public:
FSLSLPreprocessor(LLScriptEdCore* corep)
: mCore(corep), mWaving(FALSE), mClose(FALSE)
: mCore(corep), mWaving(FALSE), mClose(FALSE), mSync(false)
{}
static bool mono_directive(std::string const& text, bool agent_inv = true);
@ -59,7 +59,7 @@ public:
static LLUUID findInventoryByName(std::string name);
static void FSProcCacheCallback(LLVFS *vfs, const LLUUID& uuid, LLAssetType::EType type,
void *userdata, S32 result, LLExtStat extstat);
void preprocess_script(BOOL close = FALSE, BOOL defcache = FALSE);
void preprocess_script(BOOL close = FALSE, bool sync = false, BOOL defcache = FALSE);
void start_process();
void display_error(std::string err);
@ -86,6 +86,7 @@ public:
LLScriptEdCore* mCore;
BOOL mWaving;
BOOL mClose;
bool mSync;
BOOL mHDDInclude;
std::string mMainScriptName;
};

View File

@ -357,19 +357,19 @@ BOOL FSNearbyChatControl::handleKeyHere(KEY key, MASK mask )
}
else if( KEY_RETURN == key )
{
if (mask == MASK_CONTROL)
if (mask == MASK_CONTROL && gSavedSettings.getBOOL("FSUseCtrlShout"))
{
// shout
type = CHAT_TYPE_SHOUT;
handled = TRUE;
}
else if (mask == MASK_SHIFT)
else if (mask == MASK_SHIFT && gSavedSettings.getBOOL("FSUseShiftWhisper"))
{
// whisper
type = CHAT_TYPE_WHISPER;
handled = TRUE;
}
else if (mask == MASK_ALT)
else if (mask == MASK_ALT && gSavedSettings.getBOOL("FSUseAltOOC"))
{
// OOC
type = CHAT_TYPE_OOC;
@ -381,6 +381,12 @@ BOOL FSNearbyChatControl::handleKeyHere(KEY key, MASK mask )
type = CHAT_TYPE_NORMAL;
handled = TRUE;
}
else
{
// say
type = CHAT_TYPE_NORMAL;
handled = TRUE;
}
}
if (handled == TRUE)

View File

@ -480,7 +480,10 @@ void FSNearbyChat::sendChat(LLWString text, EChatType type)
utf8text = applyMuPose(utf8text);
// discard returned "found" boolean
LLGestureMgr::instance().triggerAndReviseString(utf8text, &utf8_revised_text);
if(!LLGestureMgr::instance().triggerAndReviseString(utf8text, &utf8_revised_text))
{
utf8_revised_text = utf8text;
}
}
else
{

View File

@ -125,6 +125,11 @@ void FSPanelBlockList::selectBlocked(const LLUUID& mute_id)
void FSPanelBlockList::showPanelAndSelect(const LLUUID& idToSelect)
{
if (gSavedSettings.getBOOL("FSDisableBlockListAutoOpen"))
{
return;
}
if (gSavedSettings.getBOOL("FSUseStandaloneBlocklistFloater"))
{
LLFloaterReg::showInstance("fs_blocklist", LLSD().with(BLOCKED_PARAM_NAME, idToSelect));
@ -162,7 +167,9 @@ void FSPanelBlockList::refreshBlockedList()
void FSPanelBlockList::updateButtons()
{
getChildView("unblock_btn")->setEnabled(mBlockedList->getNumSelected() > 0);
bool has_selection = mBlockedList->getNumSelected() > 0;
getChildView("blocked_gear_btn")->setEnabled(has_selection);
getChildView("unblock_btn")->setEnabled(has_selection);
}
void FSPanelBlockList::removeMutes()
@ -300,7 +307,7 @@ void FSPanelBlockList::blockResidentByName()
void FSPanelBlockList::blockObjectByName()
{
LLFloaterGetBlockedObjectName* picker = LLFloaterGetBlockedObjectName::show(&FSPanelBlockList::callbackBlockByName);
LLFloaterGetBlockedObjectName* picker = LLFloaterGetBlockedObjectName::show(boost::bind(&FSPanelBlockList::callbackBlockByName, this, _1));
LLFloater* parent = dynamic_cast<LLFloater*>(getParent());
if (parent)
{
@ -331,7 +338,6 @@ void FSPanelBlockList::callbackBlockPicked(const uuid_vec_t& ids, const std::vec
showPanelAndSelect(mute.mID);
}
//static
void FSPanelBlockList::callbackBlockByName(const std::string& text)
{
if (text.empty()) return;
@ -342,6 +348,11 @@ void FSPanelBlockList::callbackBlockByName(const std::string& text)
{
LLNotificationsUtil::add("MuteByNameFailed");
}
else
{
mBlockedList->selectItemByLabel(text);
mBlockedList->scrollToShowSelected();
}
}
void FSPanelBlockList::onFilterEdit(std::string search_string)

View File

@ -57,7 +57,7 @@ public:
* @param idToSelect - LLUUID of blocked Resident or Object to be selected.
* If it is LLUUID::null, nothing will be selected.
*/
static void showPanelAndSelect(const LLUUID& idToSelect);
static void showPanelAndSelect(const LLUUID& idToSelect = LLUUID::null);
// LLMuteListObserver callback interface implementation.
/* virtual */ void onChange() { refreshBlockedList();}
@ -90,7 +90,7 @@ private:
bool isActionEnabled(const LLSD& userdata);
void callbackBlockPicked(const uuid_vec_t& ids, const std::vector<LLAvatarName> names);
static void callbackBlockByName(const std::string& text);
void callbackBlockByName(const std::string& text);
private:
FSBlockListCtrl* mBlockedList;

View File

@ -1929,10 +1929,9 @@ void FSPanelAvatarNotes::rightsConfirmationCallback(const LLSD& notification,
}
void FSPanelAvatarNotes::confirmModifyRights(bool grant, S32 rights)
// AO: If this is modified, also modify LLPanelAvatar::ConfirmModifyRights
{
LLSD args;
args["NAME"] = LLSLURL("agent", getAvatarId(), "displayname").getSLURLString();
args["NAME"] = LLSLURL("agent", getAvatarId(), "completename").getSLURLString();
if (grant)
{

View File

@ -43,6 +43,7 @@
#include "llavataractions.h"
#include "llfloatersidepanelcontainer.h"
#include "llnetmap.h"
#include "llpanelblockedlist.h"
#include "llviewercontrol.h" // for gSavedSettings
#include "llviewermenu.h" // for gMenuHolder
#include "rlvhandler.h"
@ -190,7 +191,7 @@ void FSPanelRadar::updateButtons()
is_friend = LLAvatarTracker::instance().getBuddyInfo(selected_id) != NULL;
}
mAddFriendButton->setEnabled(!is_friend && !gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMES));
mRadarGearButton->setEnabled(selected_uuids.size() > 0);
mRadarGearButton->setEnabled(selected_uuids.size() > 0 && !gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMES));
}
LLUUID FSPanelRadar::getCurrentItemID() const
@ -279,15 +280,7 @@ void FSPanelRadar::onOptionsMenuItemClicked(const LLSD& userdata)
if (chosen_item == "panel_block_list_sidetray")
{
if (gSavedSettings.getBOOL("FSUseStandaloneBlocklistFloater"))
{
LLFloaterReg::showInstance("fs_blocklist", LLSD());
}
else
{
LLFloaterSidePanelContainer::showPanel("people", "panel_people",
LLSD().with("people_panel_tab_name", "blocked_panel"));
}
LLPanelBlockedList::showPanelAndSelect();
}
}

View File

@ -509,10 +509,10 @@ void FSRadar::updateRadarList()
entry["range"] = (avRange > AVATAR_UNKNOWN_RANGE ? llformat("%3.2f", avRange) : llformat(">%3.2f", drawRadius));
entry["typing"] = (avVo && avVo->isTyping());
entry["sitting"] = (avVo && (avVo->getParent() || avVo->isMotionActive(ANIM_AGENT_SIT_GROUND) || avVo->isMotionActive(ANIM_AGENT_SIT_GROUND_CONSTRAINED)));
entry["has_notes"] = ent->hasNotes();
if (!gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMES))
{
entry["has_notes"] = ent->hasNotes();
entry["age"] = (avAge > -1 ? llformat("%d", avAge) : "");
if (ent->hasAlertAge())
{
@ -531,6 +531,7 @@ void FSRadar::updateRadarList()
}
else
{
entry["has_notes"] = false;
entry["age"] = "---";
}

View File

@ -53,6 +53,9 @@ LLAssetType::EType S32toAssetType(S32 assetindex)
case 6:
type = LLAssetType::AT_OBJECT;
break;
case 45:
type = LLAssetType::AT_PERSON;
break;
default:
type = LLAssetType::AT_NONE;
}

View File

@ -140,9 +140,14 @@ ATI Radeon HD 8600D/G/M .*ATI.*AMD Radeon.* (HD|HD )86..[DGM].* 4 1 0 4.2
ATI Radeon HD 8700D/G/M .*ATI.*AMD Radeon.* (HD|HD )87..[DGM].* 4 1 0 4.2
ATI Radeon HD 8800D/G/M .*ATI.*AMD Radeon.* (HD|HD )88..[DGM].* 4 1 0 4.2
ATI Radeon HD 8900D/G/M .*ATI.*AMD Radeon.* (HD|HD )89..[DGM].* 4 1 0 4.2
ATI Radeon R2 Mobile Series .*ATI.*AMD Radeon.* R2 M2\d\d.* 2 1 0 4.2
ATI Radeon R3 Mobile Series .*ATI.*AMD Radeon.* R3 M2\d\d.* 3 1 0 4.2
ATI Radeon R4 Mobile Series .*ATI.*AMD Radeon.* R4 M2\d\d.* 3 1 0 4.2
ATI Radeon R5 Mobile Series .*ATI.*AMD Radeon.* R5 M2\d\d.* 3 1 0 4.2
ATI Radeon R6 Mobile Series .*ATI.*AMD Radeon.* R6 M2\d\d.* 3 1 0 4.2
ATI Radeon R7 Mobile Series .*ATI.*AMD Radeon.* R7 M2\d\d.* 4 1 0 4.2
ATI Radeon R9 Mobile Series .*ATI.*AMD Radeon.* R9 M2\d\d.* 4 1 0 4.2
ATI Radeon R8 Mobile Series .*ATI.*AMD Radeon.* R8 M2\d\d.* 4 1 0 4.2
ATI Radeon R9 Mobile Series .*ATI.*AMD Radeon.* R9 M2\d\d.* 5 1 0 4.2
AMD Radeon R5(TM) OEM Mobile Series .*ATI.*AMD Radeon\(TM\).* R5 .* 3 1 0 4.2
AMD Radeon R7(TM) OEM Mobile Series .*ATI.*AMD Radeon\(TM\).* R7 .* 4 1 0 4.2
AMD Radeon R9(TM) OEM Mobile Series .*ATI.*AMD Radeon\(TM\).* R9 .* 4 1 0 4.2
@ -204,10 +209,17 @@ ATI Radeon HD 8600 (OEM) .*ATI.*(Radeon|ASUS).* (HD|HD |EAH)86.* 3 1 0 4.2
ATI Radeon HD 8700 (OEM) .*ATI.*(Radeon|ASUS).* (HD|HD |EAH)87.* 4 1 1 4.2
ATI Radeon HD 8800 (OEM) .*ATI.*(Radeon|ASUS).* (HD|HD |EAH)88.* 5 1 1 4.2
ATI Radeon HD 8900 (OEM) .*ATI.*(Radeon|ASUS).* (HD|HD |EAH)89.* 5 1 1 4.2
AMD Radeon R3 Series .*ATI.*(Radeon|ASUS).* R3.* 3 1 0 4.2
AMD Radeon R5 200 Series .*ATI.*(Radeon|ASUS).* R5 2[0-9].* 3 1 0 4.2
AMD Radeon R7 200 Series .*ATI.*(Radeon|ASUS).* R7 2[0-9].* 4 1 0 4.2
AMD Radeon R9 200 Series .*ATI.*(Radeon|ASUS).* R9 2[0-9].* 5 1 0 4.2
AMD Radeon R2 Series .*ATI.*(Radeon|ASUS).* R2.* 2 1 0 4.2
AMD Radeon R3 Series .*ATI.*(Radeon|ASUS).* R3.* 3 1 0 4.2
AMD Radeon R4 Series .*ATI.*(Radeon|ASUS).* R4.* 3 1 0 4.2
AMD Radeon R5 Series .*ATI.*(Radeon|ASUS).* R5.* 3 1 0 4.2
AMD Radeon R6 Series .*ATI.*(Radeon|ASUS).* R6.* 3 1 0 4.2
AMD Radeon R7 Series .*ATI.*(Radeon|ASUS).* R7.* 4 1 0 4.2
AMD Radeon R8 Series .*ATI.*(Radeon|ASUS).* R8.* 4 1 0 4.2
AMD Radeon R9 Series .*ATI.*(Radeon|ASUS).* R9.* 4 1 0 4.2
ATI Radeon OpenGL .*ATI.*Radeon OpenGL.* 0 0 0 0
ATI Radeon 2100 .*ATI.*Radeon 21.. 0 0 1 2.1
ATI Radeon 3000 .*ATI.*Radeon 30.. 0 0 1 4
@ -469,6 +481,9 @@ NVIDIA GTX 850M .*NVIDIA .*GTX *85[0-9]M.* 5 1 0 4.4
NVIDIA GTX 860M .*NVIDIA .*GTX *86[0-9]M.* 5 1 0 4.4
NVIDIA GTX 870M .*NVIDIA .*GTX *87[0-9]M.* 5 1 0 4.4
NVIDIA GTX 880M .*NVIDIA .*GTX *88[0-9]M.* 5 1 0 4.4
NVIDIA GTX 960M .*NVIDIA .*GTX *96[0-9]M.* 5 1 0 4.4
NVIDIA GTX 970M .*NVIDIA .*GTX *97[0-9]M.* 5 1 0 4.4
NVIDIA GTX 980M .*NVIDIA .*GTX *98[0-9]M.* 5 1 0 4.4
NVIDIA G100 .*NVIDIA .*G10.* 3 1 1 3.3
NVIDIA GT 120 .*NVIDIA .*GT 12.* 2 1 0 3.3
NVIDIA GT 130 .*NVIDIA .*GT 13.* 2 1 0 3.3

View File

@ -4389,6 +4389,10 @@ void LLAgent::restartFailedTeleportRequest()
void LLAgent::clearTeleportRequest()
{
if(LLVoiceClient::instanceExists())
{
LLVoiceClient::getInstance()->setHidden(FALSE);
}
mTeleportRequest.reset();
}
@ -4407,6 +4411,10 @@ bool LLAgent::hasPendingTeleportRequest()
void LLAgent::startTeleportRequest()
{
if(LLVoiceClient::instanceExists())
{
LLVoiceClient::getInstance()->setHidden(TRUE);
}
if (hasPendingTeleportRequest())
{
if (!isMaturityPreferenceSyncedWithServer())
@ -4452,6 +4460,11 @@ void LLAgent::handleTeleportFinished()
void LLAgent::handleTeleportFailed()
{
if(LLVoiceClient::instanceExists())
{
LLVoiceClient::getInstance()->setHidden(FALSE);
}
if (mTeleportRequest != NULL)
{
mTeleportRequest->setStatus(LLTeleportRequest::kFailed);

View File

@ -40,6 +40,7 @@ void LLAgentLanguage::init()
gSavedSettings.getControl("InstallLanguage")->getSignal()->connect(boost::bind(&onChange));
gSavedSettings.getControl("SystemLanguage")->getSignal()->connect(boost::bind(&onChange));
gSavedSettings.getControl("LanguageIsPublic")->getSignal()->connect(boost::bind(&onChange));
gSavedSettings.getControl("LanguageIsPublic")->getSignal()->connect(boost::bind(&update)); // <FS:Ansariel> Make change instant
}
// static

View File

@ -137,7 +137,7 @@ BOOL LLAgentUI::buildLocationString(std::string& str, ELocationFormat fmt,const
region_name = RlvStrings::getString(RLV_STRING_HIDDEN_REGION);
if (LOCATION_FORMAT_NO_MATURITY == fmt)
fmt = LOCATION_FORMAT_LANDMARK;
else if (LOCATION_FORMAT_FULL == fmt)
else if (LOCATION_FORMAT_FULL == fmt || LOCATION_FORMAT_V1_STATUSBAR == fmt)
fmt = LOCATION_FORMAT_NO_COORDS;
}
// [/RLVa:KB]

View File

@ -3384,6 +3384,17 @@ bool LLAppViewer::initConfiguration()
gLastRunVersion = gSavedSettings.getString("LastRunVersion");
loadColorSettings();
//<FS:KC> One time fix for Latency
if ((gLastRunVersion != LLVersionInfo::getChannelAndVersion()) && (gSavedSettings.getString("SkinCurrent") == "latency") && !gSavedSettings.getBOOL("FSLatencyOneTimeFixRun"))
{
LL_INFOS() << "FSLatencyOneTimeFix: Fixing script dialog colors." << LL_ENDL;
// Replace previously saved script dialog colors with new defaults, which happen to be the same as the group notice colors
LLUIColorTable::instance().setColor("ScriptDialog", LLUIColorTable::instance().getColor("GroupNotifyDialogBG", LLColor4::grey4));
LLUIColorTable::instance().setColor("ScriptDialogFg", LLUIColorTable::instance().getColor("GroupNotifyTextColor", LLColor4::white));
}
gSavedSettings.setBOOL("FSLatencyOneTimeFixRun", TRUE);
//</FS:KC>
// Let anyone else who cares know that we've populated our settings
// variables.
@ -3711,19 +3722,22 @@ bool LLAppViewer::initWindow()
LL_INFOS("AppInit") << "gViewerwindow created." << LL_ENDL;
// Need to load feature table before cheking to start watchdog.
bool use_watchdog = false;
int watchdog_enabled_setting = gSavedSettings.getS32("WatchdogEnabled");
if (watchdog_enabled_setting == -1)
{
use_watchdog = !LLFeatureManager::getInstance()->isFeatureAvailable("WatchdogDisabled");
}
else
{
// The user has explicitly set this setting; always use that value.
use_watchdog = bool(watchdog_enabled_setting);
}
// <FS:Ansariel> Fix Watchdog settings/feature table mess
//bool use_watchdog = false;
//int watchdog_enabled_setting = gSavedSettings.getS32("WatchdogEnabled");
//if (watchdog_enabled_setting == -1)
//{
// use_watchdog = !LLFeatureManager::getInstance()->isFeatureAvailable("WatchdogDisabled");
//}
//else
//{
// // The user has explicitly set this setting; always use that value.
// use_watchdog = bool(watchdog_enabled_setting);
//}
if (use_watchdog)
//if (use_watchdog)
if (gSavedSettings.getBOOL("WatchdogEnabled"))
// </FS:Ansariel>
{
LLWatchdog::getInstance()->init(watchdog_killer_callback);
}
@ -5691,7 +5705,10 @@ void LLAppViewer::idle()
// Handle the regular UI idle callbacks as well as
// hover callbacks
//
#ifdef LL_DARWIN
if (!mQuitRequested) //MAINT-4243
#endif
{
// LL_RECORD_BLOCK_TIME(FTM_IDLE_CB);

View File

@ -425,14 +425,25 @@ void LLAppViewerWin32::disableWinErrorReporting()
HINSTANCE fault_rep_dll_handle = LoadLibrary(L"faultrep.dll"); /* Flawfinder: ignore */
if( fault_rep_dll_handle )
{
pfn_ADDEREXCLUDEDAPPLICATIONA pAddERExcludedApplicationA = (pfn_ADDEREXCLUDEDAPPLICATIONA) GetProcAddress(fault_rep_dll_handle, "AddERExcludedApplicationA");
if( pAddERExcludedApplicationA )
// <FS:Ansariel> Use unicode version
//pfn_ADDEREXCLUDEDAPPLICATIONA pAddERExcludedApplicationA = (pfn_ADDEREXCLUDEDAPPLICATIONA) GetProcAddress(fault_rep_dll_handle, "AddERExcludedApplicationA");
//if( pAddERExcludedApplicationA )
//{
// // Strip the path off the name
// const char* executable_name = gDirUtilp->getExecutableFilename().c_str();
// if( 0 == pAddERExcludedApplicationA( executable_name ) )
pfn_ADDEREXCLUDEDAPPLICATIONW pAddERExcludedApplicationW = (pfn_ADDEREXCLUDEDAPPLICATIONW) GetProcAddress(fault_rep_dll_handle, "AddERExcludedApplicationW");
if( pAddERExcludedApplicationW )
{
// Strip the path off the name
const char* executable_name = gDirUtilp->getExecutableFilename().c_str();
std::string executable_name = gDirUtilp->getExecutableFilename();
llutf16string wstr = utf8str_to_utf16str(executable_name);
if( 0 == pAddERExcludedApplicationA( executable_name ) )
if( 0 == pAddERExcludedApplicationW( wstr.c_str() ) )
// </FS:Ansariel>
{
U32 error_code = GetLastError();
LL_INFOS() << "AddERExcludedApplication() failed with error code " << error_code << LL_ENDL;
@ -465,8 +476,8 @@ void LLAppViewerWin32::disableWinErrorReporting()
if( pAddERExcludedApplicationW )
{
// Strip the path off the name
const char* executable_name = gDirUtilp->getExecutableFilename().c_str();
std::wstring wstr(executable_name, executable_name+strlen(executable_name));
std::string executable_name = gDirUtilp->getExecutableFilename();
llutf16string wstr = utf8str_to_utf16str(executable_name);
if( S_OK == pAddERExcludedApplicationW( wstr.c_str(), FALSE ) )
{

View File

@ -570,9 +570,10 @@ void LLUpdateAgentInventoryResponder::uploadComplete(const LLSD& content)
}
}
// <FS:TT> Client LSL Bridge
if (FSLSLBridge::instance().canUseBridge())
FSLSLBridge& fs_bridge = FSLSLBridge::instance();
if (fs_bridge.canUseBridge() && fs_bridge.getBridgeCreating())
{
FSLSLBridge::instance().checkBridgeScriptName(mFileName);
fs_bridge.checkBridgeScriptName(mFileName);
}
// </FS:TT>
break;

View File

@ -2148,7 +2148,7 @@ void LLAvatarActions::onDerenderAvatarNameLookup(const LLUUID& agent_id, const L
{
if (permanent)
{
FSWSAssetBlacklist::getInstance()->addNewItemToBlacklist(agent_id, av_name.getUserName(), "", LLAssetType::AT_OBJECT);
FSWSAssetBlacklist::getInstance()->addNewItemToBlacklist(agent_id, av_name.getUserName(), "", LLAssetType::AT_PERSON);
}
LLViewerObject* av_obj = gObjectList.findObject(agent_id);

View File

@ -1122,7 +1122,9 @@ void LLAvatarListItem::confirmModifyRights(bool grant, S32 rights)
// Same as llpanelavatar::confirmModifyRights
{
LLSD args;
args["NAME"] = LLSLURL("agent", getAvatarId(), "displayname").getSLURLString();
// <FS:Ansariel> Always show complete name in rights confirmation dialogs
//args["NAME"] = LLSLURL("agent", getAvatarId(), "displayname").getSLURLString();
args["NAME"] = LLSLURL("agent", getAvatarId(), "completename").getSLURLString();
if (grant)
{

View File

@ -706,7 +706,9 @@ void LLAvatarTracker::processChange(LLMessageSystem* msg)
if((mBuddyInfo[agent_id]->getRightsGrantedFrom() ^ new_rights) & LLRelationship::GRANT_MODIFY_OBJECTS)
{
LLSD args;
args["NAME"] = LLSLURL("agent", agent_id, "displayname").getSLURLString();
// <FS:Ansariel> Always show complete name in rights dialogs
//args["NAME"] = LLSLURL("agent", agent_id, "displayname").getSLURLString();
args["NAME"] = LLSLURL("agent", agent_id, "completename").getSLURLString();
LLSD payload;
payload["from_id"] = agent_id;

View File

@ -1681,11 +1681,11 @@ void LLDrawPoolAvatar::updateRiggedFaceVertexBuffer(LLVOAvatar* avatar, LLFace*
{
LLPointer<LLVertexBuffer> cur_buffer = facep->getVertexBuffer();
const LLVolumeFace& cur_vol_face = volume->getVolumeFace(i);
if( cur_vol_face.mNumVertices > 0x10000 || cur_vol_face.mNumVertices < 0 || cur_vol_face.mNumIndices < 0 )
{
LL_WARNS() << "Skipping face " << i
<< " vertices " << cur_vol_face.mNumVertices << " indices " << cur_vol_face.mNumIndices
<< " face is possibly corrupted"
if( cur_vol_face.mNumVertices > 0x10000 || cur_vol_face.mNumVertices < 0 || cur_vol_face.mNumIndices < 0 )
{
LL_WARNS() << "Skipping face " << i
<< " vertices " << cur_vol_face.mNumVertices << " indices " << cur_vol_face.mNumIndices
<< " face is possibly corrupted"
<< LL_ENDL;
continue;
}

View File

@ -954,6 +954,23 @@ LLVector2 LLFace::surfaceToTexture(LLVector2 surface_coord, const LLVector4a& po
void LLFace::getPlanarProjectedParams(LLQuaternion* face_rot, LLVector3* face_pos, F32* scale) const
{
const LLMatrix4& vol_mat = getWorldMatrix();
if( ! getViewerObject() )
{
LL_WARNS() << "No viewer object" << LL_ENDL;
return;
}
if( ! getViewerObject()->getVolume() )
{
LL_WARNS() << "No volume" << LL_ENDL;
return;
}
if( getViewerObject()->getVolume()->getNumVolumeFaces() <= mTEOffset )
{
LL_WARNS() << "No volume face" << (S32)mTEOffset << LL_ENDL;
return;
}
const LLVolumeFace& vf = getViewerObject()->getVolume()->getVolumeFace(mTEOffset);
const LLVector4a& normal4a = vf.mNormals[0];
const LLVector4a& tangent = vf.mTangents[0];

View File

@ -256,6 +256,14 @@ BOOL LLFastTimerView::handleHover(S32 x, S32 y, MASK mask)
bar_index < end_index;
++bar_index)
{
// <FS:Ansariel> FIRE-14600: mBars might be null here
if (!row.mBars)
{
LL_WARNS() << "Skipping null row bars" << LL_ENDL;
continue;
}
// </FS:Ansariel>
TimerBar& bar = row.mBars[bar_index];
if (bar.mSelfStart > mouse_time_offset)
{

View File

@ -422,13 +422,71 @@ bool LLFeatureManager::parseFeatureTable(std::string filename)
return parse_ok;
}
F32 gpu_benchmark();
bool LLFeatureManager::loadGPUClass()
{
// defaults
mGPUClass = GPU_CLASS_UNKNOWN;
mGPUString = gGLManager.getRawGLString();
mGPUSupported = FALSE;
//get memory bandwidth from benchmark
F32 gbps = gpu_benchmark();
if (gbps < 0.f)
{ //couldn't bench, use GLVersion
#if LL_DARWIN
//GLVersion is misleading on OSX, just default to class 3 if we can't bench
mGPUClass = GPU_CLASS_3;
#else
if (gGLManager.mGLVersion < 2.f)
{
mGPUClass = GPU_CLASS_0;
}
else if (gGLManager.mGLVersion < 3.f)
{
mGPUClass = GPU_CLASS_1;
}
else if (gGLManager.mGLVersion < 3.3f)
{
mGPUClass = GPU_CLASS_2;
}
else if (gGLManager.mGLVersion < 4.f)
{
mGPUClass = GPU_CLASS_3;
}
else
{
mGPUClass = GPU_CLASS_4;
}
#endif
}
else if (gbps < 5.f)
{
mGPUClass = GPU_CLASS_0;
}
else if (gbps < 10.f)
{
mGPUClass = GPU_CLASS_1;
}
else if (gbps < 20.f)
{
mGPUClass = GPU_CLASS_2;
}
else if (gbps < 40.f)
{
mGPUClass = GPU_CLASS_3;
}
else if (gbps < 80.f)
{
mGPUClass = GPU_CLASS_4;
}
else
{
mGPUClass = GPU_CLASS_5;
}
// defaults
mGPUString = gGLManager.getRawGLString();
mGPUSupported = TRUE;
#if 0
// first table is in the app dir
std::string app_path = gDirUtilp->getAppRODataDir();
app_path += gDirUtilp->getDirDelimiter();
@ -456,8 +514,8 @@ bool LLFeatureManager::loadGPUClass()
{
parse_ok = parseGPUTable(app_path);
}
return parse_ok; // indicates that the file parsed correctly, not that the gpu was recognized
#endif
return true; // indicates that the file parsed correctly, not that the gpu was recognized
}
@ -778,6 +836,7 @@ void LLFeatureManager::init()
void LLFeatureManager::applyRecommendedSettings()
{
loadGPUClass();
// apply saved settings
// cap the level at 2 (high)
U32 level = llmax(GPU_CLASS_0, llmin(mGPUClass, GPU_CLASS_5));

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