Merge Firestorm LGPL tip
commit
e1ce6e3d58
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -1 +1 @@
|
|||
VERSION_VIEWER=4.6.8
|
||||
VERSION_VIEWER=4.7.0
|
||||
|
|
|
|||
|
|
@ -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")
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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); }
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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--)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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
|
||||
//////////////////////////////////////
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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())
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
};
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
||||
|
|
|
|||
|
|
@ -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>());
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -238,7 +238,10 @@ void callFocus()
|
|||
|
||||
void callFocusLost()
|
||||
{
|
||||
gWindowImplementation->getCallbacks()->handleFocusLost(gWindowImplementation);
|
||||
if (gWindowImplementation)
|
||||
{
|
||||
gWindowImplementation->getCallbacks()->handleFocusLost(gWindowImplementation);
|
||||
}
|
||||
}
|
||||
|
||||
void callRightMouseDown(float *pos, MASK mask)
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
||||
|
|
|
|||
|
|
@ -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());
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -1 +1 @@
|
|||
4.6.8
|
||||
4.7.0
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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,":");
|
||||
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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's current appearance inside the object" />
|
||||
desc="key osOwnerSaveAppearance(string notecard);Creates a notecard with the object owner'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's current appearance inside the object" />
|
||||
<function name="osGetMapTexture" sleep="0.0" energy="10.0"
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
||||
|
|
|
|||
|
|
@ -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 > Sound/Media > UI Sounds - UISndScriptFloaterOpen.</string>
|
||||
<key>Type</key>
|
||||
<string>Boolean</string>
|
||||
<key>Value</key>
|
||||
<integer>0</integer>
|
||||
</map>
|
||||
|
||||
</map>
|
||||
</llsd>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -519,6 +519,18 @@
|
|||
<integer>1</integer>
|
||||
</map>
|
||||
|
||||
<key>PlayModeUISndScriptFloaterOpen</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Holds state for Prefs > Sound/Media > 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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
@ -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>
|
||||
|
|
@ -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>
|
||||
|
|
@ -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>
|
||||
|
|
@ -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>
|
||||
|
|
@ -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>
|
||||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
{
|
||||
|
|
|
|||
|
|
@ -145,8 +145,9 @@ private:
|
|||
LLTabContainer* mTabContainer;
|
||||
|
||||
LLFriendObserver* mObserver;
|
||||
BOOL mAllowRightsChange;
|
||||
bool mAllowRightsChange;
|
||||
S32 mNumRightsChanged;
|
||||
bool mRightsChangeNotificationTriggered;
|
||||
|
||||
std::string mFriendListFontName;
|
||||
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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 );
|
||||
}
|
||||
|
|
@ -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
|
||||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
};
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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"] = "---";
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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]
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
||||
|
|
|
|||
|
|
@ -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 ) )
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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];
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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
Loading…
Reference in New Issue