merge DRTVWR-398 build cleanup fixes

master
Oz Linden 2016-03-07 12:41:11 -05:00
commit 5822fb00b6
498 changed files with 14879 additions and 9470 deletions

11
README.md Normal file
View File

@ -0,0 +1,11 @@
Second Life Viewer
====================
This project manages the source code for the
[Second Life](https://www.secondlife.com) Viewer.
This source is available as open source; for details on licensing, see
[the licensing page on the Second Life wiki](https://wiki.secondlife.com/wiki/Linden_Lab_Official:Second_Life_Viewer_Licensing_Program)
For information on how to use and contribute to this, see
[the open source portal on the wiki](https://wiki.secondlife.com/wiki/Open_Source_Portal).

View File

@ -185,8 +185,11 @@ Ansariel Hiller
BUG-3764
STORM-1984
STORM-1979
STORM-2083
MAINT-5533
STORM-2094
MAINT-5756
MAINT-4677
Aralara Rajal
Arare Chantilly
CHUIBUG-191
@ -332,6 +335,7 @@ Cinder Roxley
STORM-2037
STORM-2053
STORM-2113
STORM-2098
Clara Young
Coaldust Numbers
VWR-1095
@ -726,6 +730,12 @@ Jonathan Yap
STORM-2030
STORM-2034
STORM-2018
STORM-2082
STORM-2086
STORM-2085
STORM-2088
STORM-2094
STORM-2099
Kadah Coba
STORM-1060
STORM-1843
@ -1000,6 +1010,7 @@ Nicky Dasmijn
STORM-1937
OPEN-187
STORM-2010
STORM-2082
Nicky Perian
OPEN-1
STORM-1087
@ -1241,6 +1252,7 @@ Sovereign Engineer
OPEN-195
OPEN-217
OPEN-295
STORM-2107
SpacedOut Frye
VWR-34
VWR-45

View File

@ -42,7 +42,7 @@ int main(int argc, char **argv)
if (!(options.has("pid") && options.has("dumpdir")))
{
llwarns << "Insufficient parameters to crash report." << llendl;
LL_WARNS() << "Insufficient parameters to crash report." << LL_ENDL;
}
if (! app.init())

View File

@ -67,3 +67,5 @@ const LLUUID TERRAIN_MOUNTAIN_DETAIL ("303cd381-8560-7579-23f1-f0a880799740"); /
const LLUUID TERRAIN_ROCK_DETAIL ("53a2f406-4895-1d13-d541-d2e3b86bc19c"); // VIEWER
const LLUUID DEFAULT_WATER_NORMAL ("822ded49-9a6c-f61c-cb89-6df54f42cdf4"); // VIEWER
const LLUUID IMG_BLACK_SQUARE_MALEVICH ("3b39cc01-c2d1-e194-1181-e4404978b20c"); // On dataserver

View File

@ -205,6 +205,8 @@ LL_COMMON_API extern const LLUUID TERRAIN_ROCK_DETAIL;
LL_COMMON_API extern const LLUUID DEFAULT_WATER_NORMAL;
LL_COMMON_API extern const LLUUID IMG_BLACK_SQUARE_MALEVICH;
// radius within which a chat message is fully audible
const F32 CHAT_NORMAL_RADIUS = 20.f;

View File

@ -362,13 +362,4 @@ typedef LLError::NoClassInfo _LL_CLASS_TO_LOG;
#define LL_INFOS_ONCE(...) lllog(LLError::LEVEL_INFO, true, ##__VA_ARGS__)
#define LL_WARNS_ONCE(...) lllog(LLError::LEVEL_WARN, true, ##__VA_ARGS__)
// DEPRECATED: Use the new macros that allow tags and *look* like macros.
#define lldebugs LL_COMPILE_TIME_MESSAGE("Warning: lldebugs deprecated, use LL_DEBUGS() instead") LL_DEBUGS()
#define llinfos LL_COMPILE_TIME_MESSAGE("Warning: llinfos deprecated, use LL_INFOS() instead") LL_INFOS()
#define llwarns LL_COMPILE_TIME_MESSAGE("Warning: llwarns deprecated, use LL_WARNS() instead") LL_WARNS()
#define llerrs LL_COMPILE_TIME_MESSAGE("Warning: llerrs deprecated, use LL_ERRS() instead") LL_ERRS()
#define llcont LL_COMPILE_TIME_MESSAGE("Warning: llcont deprecated, use LL_CONT instead") LL_CONT
#define llendl LL_COMPILE_TIME_MESSAGE("Warning: llendl deprecated, use LL_ENDL instead") LL_ENDL
#endif // LL_LLERROR_H

View File

@ -167,9 +167,9 @@ 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; }
F32 _sqrt(const F32& a) const { return sqrt(a); }
F32 _log(const F32& a) const { return log(a); }
F32 _exp(const F32& a) const { return exp(a); }

View File

@ -2202,7 +2202,7 @@ BOOL LLVolume::generate()
{
rot_mat.rotate(*profile++, tmp);
dst->setAdd(tmp,offset);
llassert(dst->isFinite3());
llassert(dst->isFinite3()); // MAINT-5660; don't know why this happens, does not affect Release builds
++dst;
}
}
@ -5663,7 +5663,7 @@ BOOL LLVolumeFace::createCap(LLVolume* volume, BOOL partial_build)
tc->mV[0] = (*p)[0]+0.5f;
tc->mV[1] = (*p)[1]+0.5f;
llassert(src->isFinite3());
llassert(src->isFinite3()); // MAINT-5660; don't know why this happens, does not affect Release builds
update_min_max(min,max,*src);
update_min_max(min_uv, max_uv, *tc);

View File

@ -355,7 +355,7 @@ void LLAvatarNameCache::requestNamesViaCapability()
if (!url.empty())
{
LL_INFOS("AvNameCache") << "LLAvatarNameCache::requestNamesViaCapability getting " << ids << " ids" << LL_ENDL;
LL_DEBUGS("AvNameCache") << " getting " << ids << " ids" << LL_ENDL;
LLHTTPClient::get(url, new LLAvatarNameResponder(agent_ids));
}
}

View File

@ -1360,7 +1360,7 @@ S32 LLMessageSystem::sendMessage(const LLHost &host)
mPacketsOut++;
mBytesOut += buffer_length;
mTotalBytesOut += buffer_length;
mSendReliable = FALSE;
mReliablePacketParams.clear();

View File

@ -680,7 +680,7 @@ void LLKeywords::findSegments(std::vector<LLTextSegmentPtr>* seg_list, const LLW
S32 seg_start = cur - base;
S32 seg_end = seg_start + seg_len;
// llinfos << "Seg: [" << word.c_str() << "]" << llendl;
// LL_INFOS("SyntaxLSL") << "Seg: [" << word.c_str() << "]" << LL_ENDL;
insertSegments(wtext, *seg_list,cur_token, text_len, seg_start, seg_end, defaultColor, editor);
}
@ -747,10 +747,10 @@ void LLKeywords::insertSegment(std::vector<LLTextSegmentPtr>& seg_list, LLTextSe
#ifdef _DEBUG
void LLKeywords::dump()
{
llinfos << "LLKeywords" << llendl;
LL_INFOS() << "LLKeywords" << LL_ENDL;
llinfos << "LLKeywords::sWordTokenMap" << llendl;
LL_INFOS() << "LLKeywords::sWordTokenMap" << LL_ENDL;
word_token_map_t::iterator word_token_iter = mWordTokenMap.begin();
while( word_token_iter != mWordTokenMap.end() )
{
@ -759,7 +759,7 @@ void LLKeywords::dump()
++word_token_iter;
}
llinfos << "LLKeywords::sLineTokenList" << llendl;
LL_INFOS() << "LLKeywords::sLineTokenList" << LL_ENDL;
for (token_list_t::iterator iter = mLineTokenList.begin();
iter != mLineTokenList.end(); ++iter)
{
@ -768,7 +768,7 @@ void LLKeywords::dump()
}
llinfos << "LLKeywords::sDelimiterTokenList" << llendl;
LL_INFOS() << "LLKeywords::sDelimiterTokenList" << LL_ENDL;
for (token_list_t::iterator iter = mDelimiterTokenList.begin();
iter != mDelimiterTokenList.end(); ++iter)
{
@ -779,12 +779,12 @@ void LLKeywords::dump()
void LLKeywordToken::dump()
{
llinfos << "[" <<
LL_INFOS() << "[" <<
mColor.mV[VX] << ", " <<
mColor.mV[VY] << ", " <<
mColor.mV[VZ] << "] [" <<
wstring_to_utf8str(mToken) << "]" <<
llendl;
LL_ENDL;
}
#endif // DEBUG

View File

@ -1317,6 +1317,7 @@ void LLTextBase::replaceWithSuggestion(U32 index)
setCursorPos(it->first + (S32)suggestion.length());
onSpellCheckPerformed();
break;
}

View File

@ -368,6 +368,7 @@ public:
std::string getMisspelledWord(U32 pos) const;
bool isMisspelledWord(U32 pos) const;
void onSpellCheckSettingsChange();
virtual void onSpellCheckPerformed(){}
// used by LLTextSegment layout code
bool getWordWrap() { return mWordWrap; }

View File

@ -2380,6 +2380,14 @@ void LLTextEditor::removeTextFromEnd(S32 num_chars)
//----------------------------------------------------------------------------
void LLTextEditor::onSpellCheckPerformed()
{
if (isPristine())
{
mBaseDocIsPristine = FALSE;
}
}
void LLTextEditor::makePristine()
{
mPristineCmd = mLastCmd;

View File

@ -160,6 +160,8 @@ public:
autoreplace_callback_t mAutoreplaceCallback;
void setAutoreplaceCallback(autoreplace_callback_t cb) { mAutoreplaceCallback = cb; }
/*virtual*/ void onSpellCheckPerformed();
//
// Text manipulation
//

View File

@ -227,6 +227,6 @@ 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);
executeSLURL("secondlife:///app/agent/" + object_id + "/block/" + LLURI::escape(object_name));
}
}

View File

@ -41,7 +41,7 @@ int main(int argc, char **argv)
if (!(options.has("pid") && options.has("dumpdir")))
{
llwarns << "Insufficient parameters to crash report." << llendl;
LL_WARNS() << "Insufficient parameters to crash report." << LL_ENDL;
}
if (! app.init())

View File

@ -126,6 +126,7 @@ set(viewer_SOURCE_FILES
llavatarlist.cpp
llavatarlistitem.cpp
llavatarrenderinfoaccountant.cpp
llavatarrendernotifier.cpp
llavatarpropertiesprocessor.cpp
llblockedlistitem.cpp
llblocklist.cpp
@ -225,6 +226,7 @@ set(viewer_SOURCE_FILES
llfloaterconversationlog.cpp
llfloaterconversationpreview.cpp
llfloaterdeleteenvpreset.cpp
llfloaterdeleteprefpreset.cpp
llfloaterdestinations.cpp
llfloaterdisplayname.cpp
llfloatereditdaycycle.cpp
@ -245,7 +247,6 @@ set(viewer_SOURCE_FILES
llfloatergroupinvite.cpp
llfloatergroups.cpp
llfloaterhandler.cpp
llfloaterhardwaresettings.cpp
llfloaterhelpbrowser.cpp
llfloaterhoverheight.cpp
llfloaterhud.cpp
@ -259,6 +260,7 @@ set(viewer_SOURCE_FILES
llfloaterlagmeter.cpp
llfloaterland.cpp
llfloaterlandholdings.cpp
llfloaterloadprefpreset.cpp
llfloatermarketplacelistings.cpp
llfloatermap.cpp
llfloatermediasettings.cpp
@ -284,6 +286,7 @@ set(viewer_SOURCE_FILES
llfloaterregioninfo.cpp
llfloaterreporter.cpp
llfloaterregionrestarting.cpp
llfloatersaveprefpreset.cpp
llfloatersceneloadstats.cpp
llfloaterscriptdebug.cpp
llfloaterscriptedprefs.cpp
@ -464,6 +467,7 @@ set(viewer_SOURCE_FILES
llpanelplaceprofile.cpp
llpanelplaces.cpp
llpanelplacestab.cpp
llpanelpresetspulldown.cpp
llpanelprimmediacontrols.cpp
llpanelprofile.cpp
llpanelsnapshot.cpp
@ -503,6 +507,7 @@ set(viewer_SOURCE_FILES
llplacesfolderview.cpp
llpopupview.cpp
llpostcard.cpp
llpresetsmanager.cpp
llpreview.cpp
llpreviewanim.cpp
llpreviewgesture.cpp
@ -746,6 +751,7 @@ set(viewer_HEADER_FILES
llavatarlistitem.h
llavatarpropertiesprocessor.h
llavatarrenderinfoaccountant.h
llavatarrendernotifier.h
llblockedlistitem.h
llblocklist.h
llbox.h
@ -843,6 +849,7 @@ set(viewer_HEADER_FILES
llfloatercolorpicker.h
llfloaterconversationlog.h
llfloaterconversationpreview.h
llfloaterdeleteprefpreset.h
llfloaterdeleteenvpreset.h
llfloaterdestinations.h
llfloaterdisplayname.h
@ -864,7 +871,6 @@ set(viewer_HEADER_FILES
llfloatergroupinvite.h
llfloatergroups.h
llfloaterhandler.h
llfloaterhardwaresettings.h
llfloaterhelpbrowser.h
llfloaterhoverheight.h
llfloaterhud.h
@ -881,6 +887,7 @@ set(viewer_HEADER_FILES
llfloaterlagmeter.h
llfloaterland.h
llfloaterlandholdings.h
llfloaterloadprefpreset.h
llfloatermap.h
llfloatermarketplacelistings.h
llfloatermediasettings.h
@ -906,6 +913,7 @@ set(viewer_HEADER_FILES
llfloaterregioninfo.h
llfloaterreporter.h
llfloaterregionrestarting.h
llfloatersaveprefpreset.h
llfloatersceneloadstats.h
llfloaterscriptdebug.h
llfloaterscriptedprefs.h
@ -1077,6 +1085,7 @@ set(viewer_HEADER_FILES
llpanelplaceprofile.h
llpanelplaces.h
llpanelplacestab.h
llpanelpresetspulldown.h
llpanelprimmediacontrols.h
llpanelprofile.h
llpanelsnapshot.h
@ -1111,6 +1120,7 @@ set(viewer_HEADER_FILES
llplacesfolderview.h
llpopupview.h
llpostcard.h
llpresetsmanager.h
llpreview.h
llpreviewanim.h
llpreviewgesture.h

View File

@ -26,8 +26,10 @@
<RenderTerrainLODFactor value="2"/>
<!--Default for now-->
<RenderTreeLODFactor value="0.5"/>
<!--Try Impostors-->
<RenderUseImpostors value="TRUE"/>
<!--Avater Impostors and Visual Muting Limits-->
<RenderAvatarMaxNonImpostors value="20"/>
<RenderAvatarMaxComplexity value="350000"/>
<RenderAutoMuteSurfaceAreaLimit value="1250.0"/>
<!--Default for now-->
<RenderVolumeLODFactor value="1.125"/>
<!--NO SHADERS-->

View File

@ -5,7 +5,23 @@
<key>print-location</key> <boolean>false</boolean>
<key>settings</key>
<array>
<!-- sample entry for changing settings on specific items -->
<!-- Suppress anything but ERROR for some very verbose components -->
<map>
<key>level</key><string>ERROR</string>
<key>functions</key>
<array>
</array>
<key>classes</key>
<array>
</array>
<key>files</key>
<array>
</array>
<key>tags</key>
<array>
<string>ShaderLoading</string>
</array>
</map>
<map>
<key>level</key><string>INFO</string>
<key>functions</key>
@ -19,14 +35,6 @@
</array>
<key>tags</key>
<array>
<string>AppInit</string>
<string>Capabilities</string>
<string>SystemInfo</string>
<string>TextureCache</string>
<string>AppCache</string>
<string>Window</string>
<string>RenderInit</string>
<string>MediaAuth</string>
</array>
</map>
<map>

View File

@ -6,8 +6,6 @@
<RenderAvatarLODFactor value="0.5"/>
<!--Default for now-->
<RenderAvatarPhysicsLODFactor value="0.0"/>
<!--Default for now-->
<RenderAvatarMaxVisible value="3"/>
<!--NO SHADERS-->
<RenderAvatarVP value="FALSE"/>
<!--Short Range-->
@ -28,8 +26,10 @@
<RenderTerrainLODFactor value="1.0"/>
<!--Default for now-->
<RenderTreeLODFactor value="0.5"/>
<!--Try Impostors-->
<RenderUseImpostors value="TRUE"/>
<!--Avater Impostors and Visual Muting Limits-->
<RenderAvatarMaxNonImpostors value="12"/>
<RenderAvatarMaxComplexity value="75000"/>
<RenderAutoMuteSurfaceAreaLimit value="750.0"/>
<!--Default for now-->
<RenderVolumeLODFactor value="1.125"/>
<!--NO SHADERS-->

View File

@ -26,8 +26,10 @@
<RenderTerrainLODFactor value="1.0"/>
<!--Default for now-->
<RenderTreeLODFactor value="0.5"/>
<!--Try Impostors-->
<RenderUseImpostors value="TRUE"/>
<!--Avater Impostors and Visual Muting Limits-->
<RenderAvatarMaxNonImpostors value="18"/>
<RenderAvatarMaxComplexity value="100000"/>
<RenderAutoMuteSurfaceAreaLimit value="1000.0"/>
<!--Default for now-->
<RenderVolumeLODFactor value="1.125"/>
<!--NO SHADERS-->

View File

@ -8306,21 +8306,10 @@
<key>Value</key>
<integer>1</integer>
</map>
<key>RenderAvatarComplexityLimit</key>
<map>
<key>Comment</key>
<string>Max visual complexity of avatars in a scene</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>S32</string>
<key>Value</key>
<integer>-1</integer>
</map>
<key>RenderComplexityColorMin</key>
<map>
<key>Comment</key>
<string>Max visual complexity of avatars in a scene</string>
<string>Unused obsolete setting</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
@ -8336,7 +8325,7 @@
<key>RenderComplexityColorMid</key>
<map>
<key>Comment</key>
<string>Max visual complexity of avatars in a scene</string>
<string>Unused obsolete setting</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
@ -8352,7 +8341,7 @@
<key>RenderComplexityColorMax</key>
<map>
<key>Comment</key>
<string>Max visual complexity of avatars in a scene</string>
<string>Unused obsolete setting</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
@ -8368,7 +8357,7 @@
<key>RenderComplexityThreshold</key>
<map>
<key>Comment</key>
<string>Only color objects higher than render threshold</string>
<string>Unused obsolete setting</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
@ -8379,8 +8368,7 @@
<key>RenderComplexityStaticMax</key>
<map>
<key>Comment</key>
<string>Sets a static max value for scaling of RenderComplexity
display (-1 for dynamic scaling)</string>
<string>Unused obsolete setting</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
@ -8402,13 +8390,13 @@
<key>RenderAvatarMaxVisible</key>
<map>
<key>Comment</key>
<string>Maximum number of avatars to display at any one time</string>
<string>OBSOLETE and UNUSED. See RenderAvatarMaxNonImpostors</string>
<key>Persist</key>
<integer>1</integer>
<integer>0</integer>
<key>Type</key>
<string>S32</string>
<key>Value</key>
<integer>12</integer>
<integer>0</integer>
</map>
<key>RenderAvatarPhysicsLODFactor</key>
<map>
@ -9841,13 +9829,13 @@
<key>RenderTerrainDetail</key>
<map>
<key>Comment</key>
<string>Detail applied to terrain texturing (0 = none, 1 or 2 = full)</string>
<string>Detail applied to terrain texturing (0 = none, 1 = full)</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>S32</string>
<key>Value</key>
<integer>2</integer>
<integer>1</integer>
</map>
<key>RenderTerrainLODFactor</key>
<map>
@ -9959,44 +9947,79 @@
<key>Value</key>
<integer>0</integer>
</map>
<key>RenderUseFarClip</key>
<map>
<key>Comment</key>
<string>If false, frustum culling will ignore far clip plane.</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>1</integer>
</map>
<key>RenderUseImpostors</key>
<map>
<key>Comment</key>
<string>Whether we want to use impostors for far away avatars.</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>1</integer>
</map>
<key>RenderUseFarClip</key>
<map>
<key>Comment</key>
<string>If false, frustum culling will ignore far clip plane.</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>1</integer>
</map>
<key>RenderUseImpostors</key>
<map>
<key>Comment</key>
<string>OBSOLETE and UNUSED. See RenderAvatarMaxNonImpostors and RenderAvatarMaxComplexity.</string>
<key>Persist</key>
<integer>0</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>0</integer>
</map>
<key>RenderAutoMuteByteLimit</key>
<map>
<key>Comment</key>
<string>Maximum bytes of attachments before an avatar is rendered as a simple impostor (0 for no limit).</string>
<string>OBSOLETE and UNUSED.</string>
<key>Persist</key>
<integer>1</integer>
<integer>0</integer>
<key>Type</key>
<string>U32</string>
<key>Value</key>
<integer>0</integer>
</map>
<key>RenderAvatarMaxNonImpostors</key>
<map>
<key>Comment</key>
<string>Maximum number of avatars to fully render at one time;
over this limit uses impostor rendering (simplified rendering
with less frequent updates), reducing client lag.</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>U32</string>
<key>Value</key>
<integer>12</integer>
</map>
<key>RenderAutoMuteRenderWeightLimit</key>
<map>
<key>Comment</key>
<string>Maximum render weight before an avatar is rendered as a simple impostor (0 to not use this limit).</string>
<string>OBSOLETE. This setting has been renamed RenderAvatarMaxNonImpostors.</string>
<key>Persist</key>
<integer>0</integer>
<key>Type</key>
<string>U32</string>
<key>Value</key>
<integer>0</integer>
</map>
<key>ShowMyComplexityChanges</key>
<map>
<key>Comment</key>
<string>How long to show notices about avatar complexity (set to zero to disable those notices)</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>U32</string>
<key>Value</key>
<integer>20</integer>
</map>
<key>RenderAvatarMaxComplexity</key>
<map>
<key>Comment</key>
<string>Maximum Avatar Complexity; above this value, the avatar is
rendered as a solid color outline (0 to disable this limit).</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
@ -10007,24 +10030,15 @@
<key>RenderAutoMuteSurfaceAreaLimit</key>
<map>
<key>Comment</key>
<string>Maximum surface area of attachments before an avatar is rendered as a simple impostor (0 to not use this limit).</string>
<string>Maximum surface area of attachments before an avatar is
rendered as a simple impostor (to not use this limit, set to zero
or set RenderAvatarMaxComplexity to zero).</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>F32</string>
<key>Value</key>
<integer>0</integer>
</map>
<key>RenderAutoMuteFunctions</key>
<map>
<key>Comment</key>
<string>Developing feature to render some avatars using simple impostors or colored silhouettes. (Set to 7 for all functionality)</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>U32</string>
<key>Value</key>
<integer>0</integer>
<real>1000.0</real>
</map>
<key>RenderAutoMuteLogging</key>
<map>
@ -10046,7 +10060,7 @@
<key>Type</key>
<string>F32</string>
<key>Value</key>
<integer>0</integer>
<real>10.0E6</real>
</map>
<key>RenderVBOEnable</key>
@ -10633,17 +10647,6 @@
<key>Value</key>
<integer>0</integer>
</map>
<key>ShowAdvancedGraphicsSettings</key>
<map>
<key>Comment</key>
<string>Show advanced graphics settings</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>0</integer>
</map>
<key>ShowAllObjectHoverTip</key>
<map>
<key>Comment</key>
@ -15699,6 +15702,41 @@
<key>Value</key>
<integer>0</integer>
</map>
<key>PresetGraphicActive</key>
<map>
<key>Comment</key>
<string>Name of currently selected preference</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>String</string>
<key>Value</key>
<string />
</map>
<key>IndirectMaxComplexity</key>
<map>
<key>Comment</key>
<string>Controls RenderAvatarMaxComplexity in a non-linear fashion (do
not set this value)</string>
<key>Persist</key>
<integer>0</integer>
<key>Type</key>
<string>U32</string>
<key>Value</key>
<integer>0</integer>
</map>
<key>IndirectMaxNonImpostors</key>
<map>
<key>Comment</key>
<string>Controls RenderAvatarMaxNonImpostors in a non-linear fashion (do
not set this value)</string>
<key>Persist</key>
<integer>0</integer>
<key>Type</key>
<string>U32</string>
<key>Value</key>
<integer>0</integer>
</map>
</map>
</llsd>

View File

@ -26,8 +26,11 @@
<RenderTerrainLODFactor value="2.0"/>
<!--Default for now-->
<RenderTreeLODFactor value="1.0"/>
<!--Try Impostors-->
<RenderUseImpostors value="TRUE"/>
<!--Avater Impostors and Visual Muting Limits (real defaults set
based on default graphics setting -->
<RenderAvatarMaxNonImpostors value="0"/>
<RenderAvatarMaxComplexity value="0"/>
<RenderAutoMuteSurfaceAreaLimit value="1500.0"/>
<!--Default for now-->
<RenderVolumeLODFactor value="2.0"/>
<!--NO SHADERS-->

View File

@ -10366,8 +10366,8 @@ render_pass="bump">
edit_group="hair_style"
edit_group_order="16"
name="Hair Tilt"
label_min="Left"
label_max="Right"
label_min="Hair Tilted Left"
label_max="Hair Tilted Right"
value_min="0"
value_max="1"
value_default=".5"

View File

@ -1,5 +1,5 @@
version 33
// The version number above should be implemented IF AND ONLY IF some
// The version number above should be incremented IF AND ONLY IF some
// change has been made that is sufficiently important to justify
// resetting the graphics preferences of all users to the recommended
// defaults. This should be as rare an event as we can manage.
@ -31,8 +31,10 @@ RenderAnisotropic 1 1
RenderAvatarCloth 1 1
RenderAvatarLODFactor 1 1.0
RenderAvatarPhysicsLODFactor 1 1.0
RenderAvatarMaxVisible 1 12
RenderAvatarMaxNonImpostors 1 16
RenderAvatarMaxComplexity 1 80000
RenderAvatarVP 1 1
RenderAutoMuteSurfaceAreaLimit 1 1000.0
RenderCubeMap 1 1
RenderDelayVBUpdate 1 0
RenderFarClip 1 256
@ -49,7 +51,6 @@ RenderTerrainDetail 1 1
RenderTerrainLODFactor 1 2.0
RenderTransparentWater 1 1
RenderTreeLODFactor 1 1.0
RenderUseImpostors 1 1
RenderVBOEnable 1 1
RenderVBOMappingDisable 1 1
RenderVolumeLODFactor 1 2.0
@ -66,12 +67,10 @@ RenderShaderLightingMaxLevel 1 3
RenderDeferred 1 1
RenderDeferredSSAO 1 1
RenderShadowDetail 1 2
WatchdogDisabled 1 1
RenderUseStreamVBO 1 1
RenderFSAASamples 1 16
RenderMaxTextureIndex 1 16
//
// Low Graphics Settings (fixed function)
//
@ -80,20 +79,20 @@ RenderAnisotropic 1 0
RenderAvatarCloth 1 0
RenderAvatarLODFactor 1 0
RenderAvatarPhysicsLODFactor 1 0
RenderAvatarMaxVisible 1 3
RenderAvatarMaxNonImpostors 1 3
RenderAvatarMaxComplexity 1 35000
RenderAvatarVP 1 0
RenderFarClip 1 64
RenderFlexTimeFactor 1 0
RenderGlowResolutionPow 1 8
RenderLocalLights 1 0
RenderMaxPartCount 1 0
RenderObjectBump 1 0
RenderLocalLights 1 0
RenderReflectionDetail 1 0
RenderTerrainDetail 1 0
RenderTerrainLODFactor 1 1
RenderTransparentWater 1 0
RenderTreeLODFactor 1 0
RenderUseImpostors 1 1
RenderVolumeLODFactor 1 1.125
VertexShaderEnable 1 0
WindLightUseAtmosShaders 1 0
@ -103,7 +102,6 @@ RenderShadowDetail 1 0
WLSkyDetail 1 48
RenderFSAASamples 1 0
//
// Low Graphics Settings
//
@ -112,20 +110,20 @@ RenderAnisotropic 1 0
RenderAvatarCloth 1 0
RenderAvatarLODFactor 1 0
RenderAvatarPhysicsLODFactor 1 0
RenderAvatarMaxVisible 1 3
RenderAvatarMaxNonImpostors 1 3
RenderAvatarMaxComplexity 1 35000
RenderAvatarVP 1 0
RenderFarClip 1 64
RenderFlexTimeFactor 1 0
RenderGlowResolutionPow 1 8
RenderLocalLights 1 0
RenderMaxPartCount 1 0
RenderObjectBump 1 0
RenderLocalLights 1 0
RenderReflectionDetail 1 0
RenderTerrainDetail 1 0
RenderTerrainLODFactor 1 1
RenderTransparentWater 1 0
RenderTreeLODFactor 1 0
RenderUseImpostors 1 1
RenderVolumeLODFactor 1 1.125
VertexShaderEnable 1 1
WindLightUseAtmosShaders 1 0
@ -155,7 +153,6 @@ RenderTerrainDetail 1 1
RenderTerrainLODFactor 1 1.0
RenderTransparentWater 1 1
RenderTreeLODFactor 1 0.5
RenderUseImpostors 1 1
RenderVolumeLODFactor 1 1.125
VertexShaderEnable 1 1
WindLightUseAtmosShaders 1 0
@ -185,7 +182,6 @@ RenderTerrainDetail 1 1
RenderTerrainLODFactor 1 2.0
RenderTransparentWater 1 1
RenderTreeLODFactor 1 0.5
RenderUseImpostors 1 1
RenderVolumeLODFactor 1 1.125
VertexShaderEnable 1 1
WindLightUseAtmosShaders 1 1
@ -215,7 +211,6 @@ RenderTerrainDetail 1 1
RenderTerrainLODFactor 1 2.0
RenderTransparentWater 1 1
RenderTreeLODFactor 1 0.5
RenderUseImpostors 1 1
RenderVolumeLODFactor 1 1.125
VertexShaderEnable 1 1
WindLightUseAtmosShaders 1 1
@ -245,7 +240,6 @@ RenderTerrainDetail 1 1
RenderTerrainLODFactor 1 2.0
RenderTransparentWater 1 1
RenderTreeLODFactor 1 0.5
RenderUseImpostors 1 1
RenderVolumeLODFactor 1 1.125
VertexShaderEnable 1 1
WindLightUseAtmosShaders 1 1
@ -275,7 +269,6 @@ RenderTerrainDetail 1 1
RenderTerrainLODFactor 1 2.0
RenderTransparentWater 1 1
RenderTreeLODFactor 1 0.5
RenderUseImpostors 1 1
RenderVolumeLODFactor 1 1.125
VertexShaderEnable 1 1
WindLightUseAtmosShaders 1 1
@ -293,19 +286,19 @@ list Ultra
RenderAnisotropic 1 1
RenderAvatarCloth 1 1
RenderAvatarLODFactor 1 1.0
RenderAvatarPhysicsLODFactor 1 1.0
RenderAvatarVP 1 1
RenderFarClip 1 256
RenderFlexTimeFactor 1 1.0
RenderGlowResolutionPow 1 9
RenderLocalLights 1 1
RenderMaxPartCount 1 8192
RenderObjectBump 1 1
RenderLocalLights 1 1
RenderReflectionDetail 1 4
RenderTerrainDetail 1 1
RenderTerrainLODFactor 1 2.0
RenderTransparentWater 1 1
RenderTreeLODFactor 1 1.0
RenderUseImpostors 1 1
RenderVolumeLODFactor 1 2.0
VertexShaderEnable 1 1
WindLightUseAtmosShaders 1 1
@ -315,7 +308,6 @@ RenderDeferredSSAO 1 1
RenderShadowDetail 1 2
RenderFSAASamples 1 2
//
// Class Unknown Hardware (unknown)
//
@ -407,18 +399,18 @@ list safe
RenderAnisotropic 1 0
RenderAvatarCloth 0 0
RenderAvatarVP 0 0
RenderAvatarMaxNonImpostors 1 16
RenderAvatarMaxComplexity 1 60000
RenderObjectBump 0 0
RenderLocalLights 1 0
RenderMaxPartCount 1 1024
RenderTerrainDetail 1 0
RenderUseImpostors 0 0
RenderVBOEnable 1 0
RenderReflectionDetail 0 0
WindLightUseAtmosShaders 0 0
RenderDeferred 0 0
RenderDeferredSSAO 0 0
RenderShadowDetail 0 0
//
// CPU based feature masks
@ -462,37 +454,30 @@ UseOcclusion 0 0
list Intel_830M
RenderTerrainDetail 1 0
RenderVBOEnable 1 0
RenderUseImpostors 0 0
list Intel_845G
RenderTerrainDetail 1 0
RenderVBOEnable 1 0
RenderUseImpostors 0 0
list Intel_855GM
RenderTerrainDetail 1 0
RenderVBOEnable 1 0
RenderUseImpostors 0 0
list Intel_865G
RenderTerrainDetail 1 0
RenderVBOEnable 1 0
RenderUseImpostors 0 0
list Intel_900
RenderTerrainDetail 1 0
RenderVBOEnable 1 0
RenderUseImpostors 0 0
list Intel_915GM
RenderTerrainDetail 1 0
RenderVBOEnable 1 0
RenderUseImpostors 0 0
list Intel_915G
RenderTerrainDetail 1 0
RenderVBOEnable 1 0
RenderUseImpostors 0 0
list Intel_945GM
RenderTerrainDetail 1 0

View File

@ -31,7 +31,7 @@ RenderAnisotropic 1 1
RenderAvatarCloth 1 1
RenderAvatarLODFactor 1 1.0
RenderAvatarPhysicsLODFactor 1 1.0
RenderAvatarMaxVisible 1 12
RenderAvatarMaxNonImpostors 1 12
RenderAvatarVP 1 1
RenderCubeMap 1 1
RenderDelayVBUpdate 1 0
@ -49,7 +49,6 @@ RenderTerrainDetail 1 1
RenderTerrainLODFactor 1 2.0
RenderTransparentWater 1 1
RenderTreeLODFactor 1 1.0
RenderUseImpostors 1 1
RenderVBOEnable 1 1
RenderVBOMappingDisable 1 1
RenderVolumeLODFactor 1 2.0
@ -77,7 +76,7 @@ RenderAnisotropic 1 0
RenderAvatarCloth 1 0
RenderAvatarLODFactor 1 0
RenderAvatarPhysicsLODFactor 1 0
RenderAvatarMaxVisible 1 3
RenderAvatarMaxNonImpostors 1 3
RenderAvatarVP 1 0
RenderFarClip 1 64
RenderFlexTimeFactor 1 0
@ -90,7 +89,6 @@ RenderTerrainDetail 1 0
RenderTerrainLODFactor 1 1
RenderTransparentWater 1 0
RenderTreeLODFactor 1 0
RenderUseImpostors 1 1
RenderVolumeLODFactor 1 0.5
VertexShaderEnable 1 1
WindLightUseAtmosShaders 1 0
@ -108,7 +106,7 @@ RenderAnisotropic 1 0
RenderAvatarCloth 1 0
RenderAvatarLODFactor 1 0
RenderAvatarPhysicsLODFactor 1 0
RenderAvatarMaxVisible 1 3
RenderAvatarMaxNonImpostors 1 3
RenderAvatarVP 1 0
RenderFarClip 1 64
RenderFlexTimeFactor 1 0
@ -121,7 +119,6 @@ RenderTerrainDetail 1 0
RenderTerrainLODFactor 1 1
RenderTransparentWater 1 0
RenderTreeLODFactor 1 0
RenderUseImpostors 1 1
RenderVolumeLODFactor 1 0.5
VertexShaderEnable 1 0
WindLightUseAtmosShaders 1 0
@ -151,7 +148,6 @@ RenderTerrainDetail 1 1
RenderTerrainLODFactor 1 1.0
RenderTransparentWater 1 1
RenderTreeLODFactor 1 0.5
RenderUseImpostors 1 1
RenderVolumeLODFactor 1 1.125
VertexShaderEnable 1 1
WindLightUseAtmosShaders 1 0
@ -181,7 +177,6 @@ RenderTerrainDetail 1 1
RenderTerrainLODFactor 1 2.0
RenderTransparentWater 1 1
RenderTreeLODFactor 1 0.5
RenderUseImpostors 1 1
RenderVolumeLODFactor 1 1.125
VertexShaderEnable 1 1
WindLightUseAtmosShaders 1 1
@ -211,7 +206,6 @@ RenderTerrainDetail 1 1
RenderTerrainLODFactor 1 2.0
RenderTransparentWater 1 1
RenderTreeLODFactor 1 0.5
RenderUseImpostors 1 1
RenderVolumeLODFactor 1 1.125
VertexShaderEnable 1 1
WindLightUseAtmosShaders 1 1
@ -241,7 +235,6 @@ RenderTerrainDetail 1 1
RenderTerrainLODFactor 1 2.0
RenderTransparentWater 1 1
RenderTreeLODFactor 1 0.5
RenderUseImpostors 1 1
RenderVolumeLODFactor 1 1.125
VertexShaderEnable 1 1
WindLightUseAtmosShaders 1 1
@ -271,7 +264,6 @@ RenderTerrainDetail 1 1
RenderTerrainLODFactor 1 2.0
RenderTransparentWater 1 1
RenderTreeLODFactor 1 0.5
RenderUseImpostors 1 1
RenderVolumeLODFactor 1 1.125
VertexShaderEnable 1 1
WindLightUseAtmosShaders 1 1
@ -301,7 +293,6 @@ RenderTerrainDetail 1 1
RenderTerrainLODFactor 1 2.0
RenderTransparentWater 1 1
RenderTreeLODFactor 1 1.0
RenderUseImpostors 1 1
RenderVolumeLODFactor 1 2.0
VertexShaderEnable 1 1
WindLightUseAtmosShaders 1 1
@ -405,7 +396,6 @@ RenderAvatarVP 0 0
RenderObjectBump 0 0
RenderMaxPartCount 1 1024
RenderTerrainDetail 1 0
RenderUseImpostors 0 0
RenderVBOEnable 1 0
RenderReflectionDetail 0 0
WindLightUseAtmosShaders 0 0

View File

@ -4,7 +4,7 @@ version 37
// resetting the graphics preferences of all users to the recommended
// defaults. This should be as rare an event as we can manage.
// NOTE: This is mostly identical to featuretable_mac.txt with a few differences
// NOTE: This is mostly identical to featuretable.txt with a few differences
// Should be combined into one table
//
@ -31,8 +31,10 @@ RenderAnisotropic 1 0
RenderAvatarCloth 1 1
RenderAvatarLODFactor 1 1.0
RenderAvatarPhysicsLODFactor 1 1.0
RenderAvatarMaxVisible 1 12
RenderAvatarMaxNonImpostors 1 12
RenderAvatarMaxComplexity 1 60000
RenderAvatarVP 1 1
RenderAutoMuteSurfaceAreaLimit 1 1000.0
RenderCubeMap 1 1
RenderDelayVBUpdate 1 0
RenderFarClip 1 256
@ -49,7 +51,6 @@ RenderTerrainDetail 1 1
RenderTerrainLODFactor 1 2.0
RenderTransparentWater 1 1
RenderTreeLODFactor 1 1.0
RenderUseImpostors 1 1
RenderVBOEnable 1 1
RenderVBOMappingDisable 1 1
RenderVolumeLODFactor 1 2.0
@ -66,7 +67,6 @@ RenderShaderLightingMaxLevel 1 3
RenderDeferred 1 1
RenderDeferredSSAO 1 1
RenderShadowDetail 1 2
WatchdogDisabled 1 1
RenderUseStreamVBO 1 1
RenderFSAASamples 1 16
RenderMaxTextureIndex 1 16
@ -79,7 +79,8 @@ RenderAnisotropic 1 0
RenderAvatarCloth 1 0
RenderAvatarLODFactor 1 0
RenderAvatarPhysicsLODFactor 1 0
RenderAvatarMaxVisible 1 3
RenderAvatarMaxNonImpostors 1 3
RenderAvatarMaxComplexity 1 30000
RenderAvatarVP 1 0
RenderFarClip 1 64
RenderFlexTimeFactor 1 0
@ -92,7 +93,6 @@ RenderTerrainDetail 1 0
RenderTerrainLODFactor 1 1
RenderTransparentWater 1 0
RenderTreeLODFactor 1 0
RenderUseImpostors 1 1
RenderVolumeLODFactor 1 0.5
VertexShaderEnable 1 0
WindLightUseAtmosShaders 1 0
@ -110,7 +110,8 @@ RenderAnisotropic 1 0
RenderAvatarCloth 1 0
RenderAvatarLODFactor 1 0
RenderAvatarPhysicsLODFactor 1 0
RenderAvatarMaxVisible 1 3
RenderAvatarMaxNonImpostors 1 3
RenderAvatarMaxComplexity 1 30000
RenderAvatarVP 1 0
RenderFarClip 1 64
RenderFlexTimeFactor 1 0
@ -123,7 +124,6 @@ RenderTerrainDetail 1 0
RenderTerrainLODFactor 1 1
RenderTransparentWater 1 0
RenderTreeLODFactor 1 0
RenderUseImpostors 1 1
RenderVolumeLODFactor 1 0.5
VertexShaderEnable 1 1
WindLightUseAtmosShaders 1 0
@ -153,7 +153,6 @@ RenderTerrainDetail 1 1
RenderTerrainLODFactor 1 1.0
RenderTransparentWater 1 1
RenderTreeLODFactor 1 0.5
RenderUseImpostors 1 1
RenderVolumeLODFactor 1 1.125
VertexShaderEnable 1 1
WindLightUseAtmosShaders 1 0
@ -183,7 +182,6 @@ RenderTerrainDetail 1 1
RenderTerrainLODFactor 1 2.0
RenderTransparentWater 1 1
RenderTreeLODFactor 1 0.5
RenderUseImpostors 1 1
RenderVolumeLODFactor 1 1.125
VertexShaderEnable 1 1
WindLightUseAtmosShaders 1 1
@ -213,7 +211,6 @@ RenderTerrainDetail 1 1
RenderTerrainLODFactor 1 2.0
RenderTransparentWater 1 1
RenderTreeLODFactor 1 0.5
RenderUseImpostors 1 1
RenderVolumeLODFactor 1 1.125
VertexShaderEnable 1 1
WindLightUseAtmosShaders 1 1
@ -243,7 +240,6 @@ RenderTerrainDetail 1 1
RenderTerrainLODFactor 1 2.0
RenderTransparentWater 1 1
RenderTreeLODFactor 1 0.5
RenderUseImpostors 1 1
RenderVolumeLODFactor 1 1.125
VertexShaderEnable 1 1
WindLightUseAtmosShaders 1 1
@ -273,7 +269,6 @@ RenderTerrainDetail 1 1
RenderTerrainLODFactor 1 2.0
RenderTransparentWater 1 1
RenderTreeLODFactor 1 0.5
RenderUseImpostors 1 1
RenderVolumeLODFactor 1 1.125
VertexShaderEnable 1 1
WindLightUseAtmosShaders 1 1
@ -304,7 +299,6 @@ RenderTerrainDetail 1 1
RenderTerrainLODFactor 1 2.0
RenderTransparentWater 1 1
RenderTreeLODFactor 1 1.0
RenderUseImpostors 1 1
RenderVolumeLODFactor 1 2.0
VertexShaderEnable 1 1
WindLightUseAtmosShaders 1 1
@ -319,6 +313,9 @@ RenderFSAASamples 1 2
//
list Unknown
RenderVBOEnable 1 0
RenderShadowDetail 1 0
RenderDeferred 1 0
RenderDeferredSSAO 1 0
//
// Class 0 Hardware (just old)
@ -343,6 +340,7 @@ RenderVBOEnable 1 1
//
list Class3
RenderVBOEnable 1 1
//
// Class 4 Hardware
//
@ -394,11 +392,12 @@ list safe
RenderAnisotropic 1 0
RenderAvatarCloth 0 0
RenderAvatarVP 0 0
RenderLocalLights 1 0
RenderAvatarMaxNonImpostors 1 16
RenderAvatarMaxComplexity 1 60000
RenderObjectBump 0 0
RenderLocalLights 1 0
RenderMaxPartCount 1 1024
RenderTerrainDetail 1 0
RenderUseImpostors 0 0
RenderVBOEnable 1 0
RenderReflectionDetail 0 0
WindLightUseAtmosShaders 0 0
@ -523,7 +522,6 @@ Disregard96DefaultDrawDistance 1 0
list NVIDIA_GeForce_8600
RenderTextureMemoryMultiple 1 1
RenderUseImpostors 0 0
UseOcclusion 0 0
/// tweaked ATI to 96 Draw distance

View File

@ -129,7 +129,7 @@ RenderUseFBO 1 0
list low
RenderVBO 1 0
RenderAniso 1 0
RenderAvatarMaxVisible 1 3
RenderAvatarMaxNonImpostors 1 3
RenderLighting 1 0
list medium

View File

@ -31,7 +31,7 @@ RenderAnisotropic 1 1
RenderAvatarCloth 1 1
RenderAvatarLODFactor 1 1.0
RenderAvatarPhysicsLODFactor 1 1.0
RenderAvatarMaxVisible 1 12
RenderAvatarMaxNonImpostors 1 12
RenderAvatarVP 1 1
RenderCubeMap 1 1
RenderDelayVBUpdate 1 0
@ -49,7 +49,6 @@ RenderTerrainDetail 1 1
RenderTerrainLODFactor 1 2.0
RenderTransparentWater 1 1
RenderTreeLODFactor 1 1.0
RenderUseImpostors 1 1
RenderVBOEnable 1 1
RenderVBOMappingDisable 1 1
RenderVolumeLODFactor 1 2.0
@ -79,7 +78,7 @@ RenderAnisotropic 1 0
RenderAvatarCloth 1 0
RenderAvatarLODFactor 1 0
RenderAvatarPhysicsLODFactor 1 0
RenderAvatarMaxVisible 1 3
RenderAvatarMaxNonImpostors 1 3
RenderAvatarVP 1 0
RenderFarClip 1 64
RenderFlexTimeFactor 1 0
@ -92,7 +91,6 @@ RenderTerrainDetail 1 0
RenderTerrainLODFactor 1 1
RenderTransparentWater 1 0
RenderTreeLODFactor 1 0
RenderUseImpostors 1 1
RenderVolumeLODFactor 1 0.5
VertexShaderEnable 1 0
WindLightUseAtmosShaders 1 0
@ -110,7 +108,7 @@ RenderAnisotropic 1 0
RenderAvatarCloth 1 0
RenderAvatarLODFactor 1 0
RenderAvatarPhysicsLODFactor 1 0
RenderAvatarMaxVisible 1 3
RenderAvatarMaxNonImpostors 1 3
RenderAvatarVP 1 0
RenderFarClip 1 64
RenderFlexTimeFactor 1 0
@ -123,7 +121,6 @@ RenderTerrainDetail 1 0
RenderTerrainLODFactor 1 1
RenderTransparentWater 1 0
RenderTreeLODFactor 1 0
RenderUseImpostors 1 1
RenderVolumeLODFactor 1 0.5
VertexShaderEnable 1 1
WindLightUseAtmosShaders 1 0
@ -153,7 +150,6 @@ RenderTerrainDetail 1 1
RenderTerrainLODFactor 1 1.0
RenderTransparentWater 1 1
RenderTreeLODFactor 1 0.5
RenderUseImpostors 1 1
RenderVolumeLODFactor 1 1.125
VertexShaderEnable 1 1
WindLightUseAtmosShaders 1 0
@ -183,7 +179,6 @@ RenderTerrainDetail 1 1
RenderTerrainLODFactor 1 2.0
RenderTransparentWater 1 1
RenderTreeLODFactor 1 0.5
RenderUseImpostors 1 1
RenderVolumeLODFactor 1 1.125
VertexShaderEnable 1 1
WindLightUseAtmosShaders 1 1
@ -213,7 +208,6 @@ RenderTerrainDetail 1 1
RenderTerrainLODFactor 1 2.0
RenderTransparentWater 1 1
RenderTreeLODFactor 1 0.5
RenderUseImpostors 1 1
RenderVolumeLODFactor 1 1.125
VertexShaderEnable 1 1
WindLightUseAtmosShaders 1 1
@ -243,7 +237,6 @@ RenderTerrainDetail 1 1
RenderTerrainLODFactor 1 2.0
RenderTransparentWater 1 1
RenderTreeLODFactor 1 0.5
RenderUseImpostors 1 1
RenderVolumeLODFactor 1 1.125
VertexShaderEnable 1 1
WindLightUseAtmosShaders 1 1
@ -273,7 +266,6 @@ RenderTerrainDetail 1 1
RenderTerrainLODFactor 1 2.0
RenderTransparentWater 1 1
RenderTreeLODFactor 1 0.5
RenderUseImpostors 1 1
RenderVolumeLODFactor 1 1.125
VertexShaderEnable 1 1
WindLightUseAtmosShaders 1 1
@ -303,7 +295,6 @@ RenderTerrainDetail 1 1
RenderTerrainLODFactor 1 2.0
RenderTransparentWater 1 1
RenderTreeLODFactor 1 1.0
RenderUseImpostors 1 1
RenderVolumeLODFactor 1 2.0
VertexShaderEnable 1 1
WindLightUseAtmosShaders 1 1
@ -404,7 +395,6 @@ RenderAvatarVP 0 0
RenderObjectBump 0 0
RenderMaxPartCount 1 1024
RenderTerrainDetail 1 0
RenderUseImpostors 0 0
RenderVBOEnable 1 0
RenderReflectionDetail 0 0
WindLightUseAtmosShaders 0 0
@ -454,37 +444,30 @@ UseOcclusion 0 0
list Intel_830M
RenderTerrainDetail 1 0
RenderVBOEnable 1 0
RenderUseImpostors 0 0
list Intel_845G
RenderTerrainDetail 1 0
RenderVBOEnable 1 0
RenderUseImpostors 0 0
list Intel_855GM
RenderTerrainDetail 1 0
RenderVBOEnable 1 0
RenderUseImpostors 0 0
list Intel_865G
RenderTerrainDetail 1 0
RenderVBOEnable 1 0
RenderUseImpostors 0 0
list Intel_900
RenderTerrainDetail 1 0
RenderVBOEnable 1 0
RenderUseImpostors 0 0
list Intel_915GM
RenderTerrainDetail 1 0
RenderVBOEnable 1 0
RenderUseImpostors 0 0
list Intel_915G
RenderTerrainDetail 1 0
RenderVBOEnable 1 0
RenderUseImpostors 0 0
list Intel_945GM
RenderTerrainDetail 1 0
@ -501,7 +484,6 @@ RenderVBOEnable 1 0
list Intel_965
RenderTerrainDetail 1 0
RenderVBOEnable 1 0
RenderUseImpostors 1 0
UseOcclusion 0 0
list Intel_G33

View File

@ -594,7 +594,7 @@ static void settings_to_globals()
LLVOTree::sTreeFactor = gSavedSettings.getF32("RenderTreeLODFactor");
LLVOAvatar::sLODFactor = gSavedSettings.getF32("RenderAvatarLODFactor");
LLVOAvatar::sPhysicsLODFactor = gSavedSettings.getF32("RenderAvatarPhysicsLODFactor");
LLVOAvatar::sMaxVisible = (U32)gSavedSettings.getS32("RenderAvatarMaxVisible");
LLVOAvatar::updateImpostorRendering(gSavedSettings.getU32("RenderAvatarMaxNonImpostors"));
LLVOAvatar::sVisibleInFirstPerson = gSavedSettings.getBOOL("FirstPersonAvatarVisible");
// clamp auto-open time to some minimum usable value
LLFolderView::sAutoOpenTime = llmax(0.25f, gSavedSettings.getF32("FolderAutoOpenDelay"));
@ -616,7 +616,6 @@ static void settings_modify()
LLRenderTarget::sUseFBO = gSavedSettings.getBOOL("RenderDeferred");
LLPipeline::sRenderBump = gSavedSettings.getBOOL("RenderObjectBump");
LLPipeline::sRenderDeferred = LLPipeline::sRenderBump && gSavedSettings.getBOOL("RenderDeferred");
LLVOAvatar::sUseImpostors = gSavedSettings.getBOOL("RenderUseImpostors");
LLVOSurfacePatch::sLODFactor = gSavedSettings.getF32("RenderTerrainLODFactor");
LLVOSurfacePatch::sLODFactor *= LLVOSurfacePatch::sLODFactor; //square lod factor to get exponential range of [1,4]
gDebugGL = gSavedSettings.getBOOL("RenderDebugGL") || gDebugSession;
@ -5146,7 +5145,7 @@ void LLAppViewer::idle()
}
// Update AV render info
LLAvatarRenderInfoAccountant::idle();
LLAvatarRenderInfoAccountant::getInstance()->idle();
{
LL_RECORD_BLOCK_TIME(FTM_AUDIO_UPDATE);

View File

@ -421,6 +421,15 @@ void LLAttachmentsMgr::onDetachCompleted(const LLUUID& inv_item_id)
mQuestionableCOFLinks.addTime(inv_item_id);
}
bool LLAttachmentsMgr::isAttachmentStateComplete() const
{
return mPendingAttachments.empty()
&& mAttachmentRequests.empty()
&& mDetachRequests.empty()
&& mRecentlyArrivedAttachments.empty()
&& mQuestionableCOFLinks.empty();
}
// Check for attachments that are (a) linked in COF and (b) not
// attached to the avatar. This is a rotten function to have to
// include, because it runs the risk of either repeatedly spamming out

View File

@ -87,6 +87,8 @@ public:
void onDetachRequested(const LLUUID& inv_item_id);
void onDetachCompleted(const LLUUID& inv_item_id);
bool isAttachmentStateComplete() const;
private:
class LLItemRequestTimes: public std::map<LLUUID,LLTimer>

View File

@ -28,14 +28,17 @@
// Precompiled header
#include "llviewerprecompiledheaders.h"
// associated header
#include "llavatarrenderinfoaccountant.h"
// STL headers
// std headers
// external library headers
// other Linden headers
#include "llcharacter.h"
#include "llhttpclient.h"
#include "httprequest.h"
#include "httphandler.h"
#include "httpresponse.h"
#include "llcorehttputil.h"
#include "llappcorehttp.h"
#include "llavatarrendernotifier.h"
#include "lltimer.h"
#include "llviewercontrol.h"
#include "llviewermenu.h"
@ -43,233 +46,290 @@
#include "llviewerregion.h"
#include "llvoavatar.h"
#include "llworld.h"
// associated header
#include "llavatarrenderinfoaccountant.h"
static const std::string KEY_AGENTS = "agents"; // map
static const std::string KEY_WEIGHT = "weight"; // integer
static const std::string KEY_TOO_COMPLEX = "tooComplex"; // bool
static const std::string KEY_OVER_COMPLEXITY_LIMIT = "overlimit"; // integer
static const std::string KEY_REPORTING_COMPLEXITY_LIMIT = "reportinglimit"; // integer
static const std::string KEY_IDENTIFIER = "identifier";
static const std::string KEY_MESSAGE = "message";
static const std::string KEY_ERROR = "error";
// Send data updates about once per minute, only need per-frame resolution
LLFrameTimer LLAvatarRenderInfoAccountant::sRenderInfoReportTimer;
static const F32 SECS_BETWEEN_REGION_SCANS = 5.f; // Scan the region list every 5 seconds
static const F32 SECS_BETWEEN_REGION_REQUEST = 15.0; // Look for new avs every 15 seconds
static const F32 SECS_BETWEEN_REGION_REPORTS = 60.0; // Update each region every 60 seconds
// The policy class for HTTP traffic; this is the right value for all capability requests.
static LLCore::HttpRequest::policy_t http_policy(LLAppCoreHttp::AP_REPORTING);
// Priority for HTTP requests. Use 0U.
static LLCore::HttpRequest::priority_t http_priority(0U);
LLAvatarRenderInfoAccountant::LLAvatarRenderInfoAccountant()
: mHttpRequest(new LLCore::HttpRequest)
, mHttpHeaders(new LLCore::HttpHeaders)
, mHttpOptions(new LLCore::HttpOptions)
{
mHttpOptions->setTransferTimeout(SECS_BETWEEN_REGION_SCANS);
mHttpHeaders->append(HTTP_OUT_HEADER_CONTENT_TYPE, HTTP_CONTENT_LLSD_XML);
mHttpHeaders->append(HTTP_OUT_HEADER_ACCEPT, HTTP_CONTENT_LLSD_XML);
}
LLAvatarRenderInfoAccountant::~LLAvatarRenderInfoAccountant()
{
mHttpOptions->release();
mHttpHeaders->release();
// delete mHttpRequest; ???
}
// HTTP responder class for GET request for avatar render weight information
class LLAvatarRenderInfoGetResponder : public LLHTTPClient::Responder
class LLAvatarRenderInfoGetHandler : public LLCore::HttpHandler
{
private:
LOG_CLASS(LLAvatarRenderInfoGetHandler);
public:
LLAvatarRenderInfoGetResponder(U64 region_handle) : mRegionHandle(region_handle)
LLAvatarRenderInfoGetHandler() : LLCore::HttpHandler()
{
}
virtual void error(U32 statusNum, const std::string& reason)
void onCompleted(LLCore::HttpHandle handle,
LLCore::HttpResponse* response)
{
LLViewerRegion * regionp = LLWorld::getInstance()->getRegionFromHandle(mRegionHandle);
if (regionp)
{
LL_WARNS() << "HTTP error result for avatar weight GET: " << statusNum
<< ", " << reason
<< " returned by region " << regionp->getName()
<< LL_ENDL;
}
else
{
LL_WARNS() << "Avatar render weight GET error recieved but region not found for "
<< mRegionHandle
<< ", error " << statusNum
<< ", " << reason
<< LL_ENDL;
}
}
virtual void result(const LLSD& content)
{
LLViewerRegion * regionp = LLWorld::getInstance()->getRegionFromHandle(mRegionHandle);
if (regionp)
{
if (LLAvatarRenderInfoAccountant::logRenderInfo())
{
LL_INFOS() << "LRI: Result for avatar weights request for region " << regionp->getName() << ":" << LL_ENDL;
}
if (content.isMap())
{
if (content.has(KEY_AGENTS))
LLCore::HttpStatus status = response->getStatus();
if (status)
{
LL_DEBUGS("AvatarRenderInfo") << "response"<<LL_ENDL;
LLSD avatar_render_info;
if (LLCoreHttpUtil::responseToLLSD(response, false /* quiet logging */,
avatar_render_info))
{
const LLSD & agents = content[KEY_AGENTS];
if (agents.isMap())
if (avatar_render_info.isMap())
{
LLSD::map_const_iterator report_iter = agents.beginMap();
while (report_iter != agents.endMap())
if ( avatar_render_info.has(KEY_REPORTING_COMPLEXITY_LIMIT)
&& avatar_render_info.has(KEY_OVER_COMPLEXITY_LIMIT))
{
LLUUID target_agent_id = LLUUID(report_iter->first);
const LLSD & agent_info_map = report_iter->second;
LLViewerObject* avatarp = gObjectList.findObject(target_agent_id);
if (avatarp &&
avatarp->isAvatar() &&
agent_info_map.isMap())
{ // Extract the data for this avatar
U32 reporting = avatar_render_info[KEY_REPORTING_COMPLEXITY_LIMIT].asInteger();
U32 overlimit = avatar_render_info[KEY_OVER_COMPLEXITY_LIMIT].asInteger();
if (LLAvatarRenderInfoAccountant::logRenderInfo())
{
LL_INFOS() << "LRI: Agent " << target_agent_id
<< ": " << agent_info_map << LL_ENDL;
}
LL_DEBUGS("AvatarRenderInfo") << "complexity limit: "<<reporting<<" reporting, "<<overlimit<<" over limit"<<LL_ENDL;
if (agent_info_map.has(KEY_WEIGHT))
LLAvatarRenderNotifier::getInstance()->updateNotificationRegion(reporting, overlimit);
}
if (avatar_render_info.has(KEY_AGENTS))
{
const LLSD & agents = avatar_render_info[KEY_AGENTS];
if (agents.isMap())
{
for (LLSD::map_const_iterator agent_iter = agents.beginMap();
agent_iter != agents.endMap();
agent_iter++
)
{
((LLVOAvatar *) avatarp)->setReportedVisualComplexity(agent_info_map[KEY_WEIGHT].asInteger());
}
LLUUID target_agent_id = LLUUID(agent_iter->first);
LLViewerObject* avatarp = gObjectList.findObject(target_agent_id);
if (avatarp && avatarp->isAvatar())
{
const LLSD & agent_info_map = agent_iter->second;
if (agent_info_map.isMap())
{
LL_DEBUGS("AvatarRenderInfo") << " Agent " << target_agent_id
<< ": " << agent_info_map << LL_ENDL;
if (agent_info_map.has(KEY_WEIGHT))
{
((LLVOAvatar *) avatarp)->setReportedVisualComplexity(agent_info_map[KEY_WEIGHT].asInteger());
}
}
else
{
LL_WARNS("AvatarRenderInfo") << "agent entry invalid"
<< " agent " << target_agent_id
<< " map " << agent_info_map
<< LL_ENDL;
}
}
else
{
LL_DEBUGS("AvatarRenderInfo") << "Unknown agent " << target_agent_id << LL_ENDL;
}
} // for agent_iter
}
report_iter++;
else
{
LL_WARNS("AvatarRenderInfo") << "malformed get response agents avatar_render_info is not map" << LL_ENDL;
}
} // has "agents"
else if (avatar_render_info.has(KEY_ERROR))
{
const LLSD & error = avatar_render_info[KEY_ERROR];
LL_WARNS("AvatarRenderInfo") << "Avatar render info GET error: "
<< error[KEY_IDENTIFIER]
<< ": " << error[KEY_MESSAGE]
<< LL_ENDL;
}
else
{
LL_WARNS("AvatarRenderInfo") << "no agent key in get response" << LL_ENDL;
}
}
} // has "agents"
else if (content.has(KEY_ERROR))
else
{
LL_WARNS("AvatarRenderInfo") << "malformed get response is not map" << LL_ENDL;
}
}
else
{
const LLSD & error = content[KEY_ERROR];
LL_WARNS() << "Avatar render info GET error: "
<< error[KEY_IDENTIFIER]
<< ": " << error[KEY_MESSAGE]
<< " from region " << regionp->getName()
<< LL_ENDL;
LL_WARNS("AvatarRenderInfo") << "malformed get response parse failure" << LL_ENDL;
}
}
}
else
{
LL_INFOS() << "Avatar render weight info recieved but region not found for "
<< mRegionHandle << LL_ENDL;
}
}
}
else
{
// Something went wrong. Translate the status to
// a meaningful message.
LL_WARNS("AvatarRenderInfo") << "GET failed Status: "
<< status.toTerseString()
<< ", Reason: " << status.toString()
<< LL_ENDL;
}
private:
U64 mRegionHandle;
delete this; // release the handler object
}
};
// HTTP responder class for POST request for avatar render weight information
class LLAvatarRenderInfoPostResponder : public LLHTTPClient::Responder
class LLAvatarRenderInfoPostHandler : public LLCore::HttpHandler
{
public:
LLAvatarRenderInfoPostResponder(U64 region_handle) : mRegionHandle(region_handle)
private:
LOG_CLASS(LLAvatarRenderInfoPostHandler);
public:
LLAvatarRenderInfoPostHandler() : LLCore::HttpHandler()
{
}
virtual void error(U32 statusNum, const std::string& reason)
{
LLViewerRegion * regionp = LLWorld::getInstance()->getRegionFromHandle(mRegionHandle);
if (regionp)
void onCompleted(LLCore::HttpHandle handle,
LLCore::HttpResponse* response)
{
LL_WARNS() << "HTTP error result for avatar weight POST: " << statusNum
<< ", " << reason
<< " returned by region " << regionp->getName()
<< LL_ENDL;
}
else
{
LL_WARNS() << "Avatar render weight POST error recieved but region not found for "
<< mRegionHandle
<< ", error " << statusNum
<< ", " << reason
<< LL_ENDL;
}
}
virtual void result(const LLSD& content)
{
LLViewerRegion * regionp = LLWorld::getInstance()->getRegionFromHandle(mRegionHandle);
if (regionp)
{
if (LLAvatarRenderInfoAccountant::logRenderInfo())
LLCore::HttpStatus status = response->getStatus();
if (status)
{
LL_INFOS() << "LRI: Result for avatar weights POST for region " << regionp->getName()
<< ": " << content << LL_ENDL;
LL_DEBUGS("AvatarRenderInfo") << "post succeeded" << LL_ENDL;
}
if (content.isMap())
else
{
if (content.has(KEY_ERROR))
{
const LLSD & error = content[KEY_ERROR];
LL_WARNS() << "Avatar render info POST error: "
<< error[KEY_IDENTIFIER]
<< ": " << error[KEY_MESSAGE]
<< " from region " << regionp->getName()
<< LL_ENDL;
}
}
}
else
{
LL_INFOS() << "Avatar render weight POST result recieved but region not found for "
<< mRegionHandle << LL_ENDL;
}
}
// Something went wrong. Translate the status to
// a meaningful message.
LL_WARNS("AvatarRenderInfo") << "POST failed Status: "
<< status.toTerseString()
<< ", Reason: " << status.toString()
<< LL_ENDL;
}
private:
U64 mRegionHandle;
delete this; // release the handler object
}
};
// static
// Send request for one region, no timer checks
// Send request for avatar weights in one region
// called when the mRenderInfoScanTimer expires (forced when entering a new region)
void LLAvatarRenderInfoAccountant::sendRenderInfoToRegion(LLViewerRegion * regionp)
{
std::string url = regionp->getCapability("AvatarRenderInfo");
if (!url.empty())
if ( regionp->getRenderInfoReportTimer().hasExpired() ) // Time to make request
{
if (logRenderInfo())
U32 num_avs = 0;
std::string url = regionp->getCapability("AvatarRenderInfo");
if (!url.empty())
{
LL_INFOS() << "LRI: Sending avatar render info to region "
<< regionp->getName()
<< " from " << url
<< LL_ENDL;
}
// Build the render info to POST to the region
LLSD report = LLSD::emptyMap();
LLSD agents = LLSD::emptyMap();
// Build the render info to POST to the region
LLSD agents = LLSD::emptyMap();
std::vector<LLCharacter*>::iterator iter = LLCharacter::sInstances.begin();
while( iter != LLCharacter::sInstances.end() )
{
LLVOAvatar* avatar = dynamic_cast<LLVOAvatar*>(*iter);
if (avatar &&
avatar->getRezzedStatus() >= 2 && // Mostly rezzed (maybe without baked textures downloaded)
!avatar->isDead() && // Not dead yet
avatar->getObjectHost() == regionp->getHost()) // Ensure it's on the same region
std::vector<LLCharacter*>::iterator iter = LLCharacter::sInstances.begin();
while( iter != LLCharacter::sInstances.end() )
{
avatar->calculateUpdateRenderCost(); // Make sure the numbers are up-to-date
LLSD info = LLSD::emptyMap();
if (avatar->getVisualComplexity() > 0)
LLVOAvatar* avatar = dynamic_cast<LLVOAvatar*>(*iter);
if (avatar &&
avatar->getRezzedStatus() >= 2 && // Mostly rezzed (maybe without baked textures downloaded)
!avatar->isDead() && // Not dead yet
avatar->getObjectHost() == regionp->getHost()) // Ensure it's on the same region
{
info[KEY_WEIGHT] = avatar->getVisualComplexity();
agents[avatar->getID().asString()] = info;
avatar->calculateUpdateRenderComplexity(); // Make sure the numbers are up-to-date
if (logRenderInfo())
LLSD info = LLSD::emptyMap();
U32 avatar_complexity = avatar->getVisualComplexity();
if (avatar_complexity > 0)
{
LL_INFOS() << "LRI: Sending avatar render info for " << avatar->getID()
<< ": " << info << LL_ENDL;
LL_INFOS() << "LRI: other info geometry " << avatar->getAttachmentGeometryBytes()
<< ", area " << avatar->getAttachmentSurfaceArea()
<< LL_ENDL;
// the weight/complexity is unsigned, but LLSD only stores signed integers,
// so if it's over that (which would be ridiculously high), just store the maximum signed int value
info[KEY_WEIGHT] = (S32)(avatar_complexity < S32_MAX ? avatar_complexity : S32_MAX);
info[KEY_TOO_COMPLEX] = LLSD::Boolean(avatar->isTooComplex());
agents[avatar->getID().asString()] = info;
LL_DEBUGS("AvatarRenderInfo") << "Sending avatar render info for " << avatar->getID()
<< ": " << info << LL_ENDL;
num_avs++;
}
}
iter++;
}
iter++;
if (num_avs > 0)
{
LLSD report = LLSD::emptyMap();
report[KEY_AGENTS] = agents;
LLCore::HttpHandle handle(LLCORE_HTTP_HANDLE_INVALID);
LLAvatarRenderInfoPostHandler* handler = new LLAvatarRenderInfoPostHandler;
handle = LLCoreHttpUtil::requestPostWithLLSD(mHttpRequest,
http_policy,
http_priority,
url,
report,
mHttpOptions,
mHttpHeaders,
handler);
if (LLCORE_HTTP_HANDLE_INVALID == handle)
{
LLCore::HttpStatus status(mHttpRequest->getStatus());
LL_WARNS("AvatarRenderInfo") << "HTTP POST request failed"
<< " Status: " << status.toTerseString()
<< " Reason: '" << status.toString() << "'"
<< LL_ENDL;
delete handler;
}
else
{
LL_DEBUGS("AvatarRenderInfo") << "Sent render costs for " << num_avs
<< " avatars to region " << regionp->getName()
<< LL_ENDL;
}
}
else
{
LL_DEBUGS("AvatarRenderInfo") << "no agent info to send" << LL_ENDL;
}
}
else
{
LL_WARNS("AvatarRenderInfo") << "AvatarRenderInfo cap is empty" << LL_ENDL;
}
report[KEY_AGENTS] = agents;
if (agents.size() > 0)
{
LLHTTPClient::post(url, report, new LLAvatarRenderInfoPostResponder(regionp->getHandle()));
}
// Reset this regions timer, moving to longer intervals if there are lots of avatars around
regionp->getRenderInfoReportTimer().resetWithExpiry(SECS_BETWEEN_REGION_REPORTS + (2.f * num_avs));
}
}
@ -280,19 +340,39 @@ void LLAvatarRenderInfoAccountant::sendRenderInfoToRegion(LLViewerRegion * regio
// Send request for one region, no timer checks
void LLAvatarRenderInfoAccountant::getRenderInfoFromRegion(LLViewerRegion * regionp)
{
std::string url = regionp->getCapability("AvatarRenderInfo");
if (!url.empty())
if (regionp->getRenderInfoRequestTimer().hasExpired())
{
if (logRenderInfo())
std::string url = regionp->getCapability("AvatarRenderInfo");
if (!url.empty())
{
LL_INFOS() << "LRI: Requesting avatar render info for region "
<< regionp->getName()
<< " from " << url
<< LL_ENDL;
LLAvatarRenderInfoGetHandler* handler = new LLAvatarRenderInfoGetHandler;
// First send a request to get the latest data
LLCore::HttpHandle handle = mHttpRequest->requestGet(http_policy,
http_priority,
url,
NULL,
NULL,
handler);
if (LLCORE_HTTP_HANDLE_INVALID != handle)
{
LL_DEBUGS("AvatarRenderInfo") << "Requested avatar render info for region "
<< regionp->getName()
<< LL_ENDL;
}
else
{
LL_WARNS("AvatarRenderInfo") << "Failed to launch HTTP GET request. Try again."
<< LL_ENDL;
delete handler;
}
}
else
{
LL_WARNS("AvatarRenderInfo") << "no AvatarRenderInfo cap for " << regionp->getName() << LL_ENDL;
}
// First send a request to get the latest data
LLHTTPClient::get(url, new LLAvatarRenderInfoGetResponder(regionp->getHandle()));
regionp->getRenderInfoRequestTimer().resetWithExpiry(SECS_BETWEEN_REGION_REQUEST);
}
}
@ -301,98 +381,60 @@ void LLAvatarRenderInfoAccountant::getRenderInfoFromRegion(LLViewerRegion * regi
// Called every frame - send render weight requests to every region
void LLAvatarRenderInfoAccountant::idle()
{
if (sRenderInfoReportTimer.hasExpired())
{
const F32 SECS_BETWEEN_REGION_SCANS = 5.f; // Scan the region list every 5 seconds
const F32 SECS_BETWEEN_REGION_REQUEST = 60.0; // Update each region every 60 seconds
mHttpRequest->update(0); // give any pending http operations a chance to call completion methods
S32 num_avs = LLCharacter::sInstances.size();
if (mRenderInfoScanTimer.hasExpired())
{
LL_DEBUGS("AvatarRenderInfo") << "Scanning regions for render info updates"
<< LL_ENDL;
if (logRenderInfo())
{
LL_INFOS() << "LRI: Scanning all regions and checking for render info updates"
<< LL_ENDL;
}
// Check all regions and see if it's time to fetch/send data
// Check all regions
for (LLWorld::region_list_t::const_iterator iter = LLWorld::getInstance()->getRegionList().begin();
iter != LLWorld::getInstance()->getRegionList().end(); ++iter)
iter != LLWorld::getInstance()->getRegionList().end();
++iter)
{
LLViewerRegion* regionp = *iter;
if (regionp &&
regionp->isAlive() &&
regionp->capabilitiesReceived() && // Region has capability URLs available
regionp->getRenderInfoRequestTimer().hasExpired()) // Time to make request
if ( regionp
&& regionp->isAlive()
&& regionp->capabilitiesReceived())
{
// each of these is further governed by and resets its own timer
sendRenderInfoToRegion(regionp);
getRenderInfoFromRegion(regionp);
// Reset this regions timer, moving to longer intervals if there are lots of avatars around
regionp->getRenderInfoRequestTimer().resetWithExpiry(SECS_BETWEEN_REGION_REQUEST + (2.f * num_avs));
}
}
// We scanned all the regions, reset the request timer.
sRenderInfoReportTimer.resetWithExpiry(SECS_BETWEEN_REGION_SCANS);
}
static LLCachedControl<U32> render_auto_mute_functions(gSavedSettings, "RenderAutoMuteFunctions", 0);
static U32 prev_render_auto_mute_functions = (U32) -1;
if (prev_render_auto_mute_functions != render_auto_mute_functions)
{
prev_render_auto_mute_functions = render_auto_mute_functions;
// Adjust menus
BOOL show_items = (BOOL)(render_auto_mute_functions & 0x04);
gMenuAvatarOther->setItemVisible( std::string("Normal"), show_items);
gMenuAvatarOther->setItemVisible( std::string("Always use impostor"), show_items);
gMenuAvatarOther->setItemVisible( std::string("Never use impostor"), show_items);
gMenuAvatarOther->setItemVisible( std::string("Impostor seperator"), show_items);
gMenuAttachmentOther->setItemVisible( std::string("Normal"), show_items);
gMenuAttachmentOther->setItemVisible( std::string("Always use impostor"), show_items);
gMenuAttachmentOther->setItemVisible( std::string("Never use impostor"), show_items);
gMenuAttachmentOther->setItemVisible( std::string("Impostor seperator"), show_items);
if (!show_items)
{ // Turning off visual muting
for (std::vector<LLCharacter*>::iterator iter = LLCharacter::sInstances.begin();
iter != LLCharacter::sInstances.end(); ++iter)
{ // Make sure all AVs have the setting cleared
LLVOAvatar* inst = (LLVOAvatar*) *iter;
inst->setCachedVisualMute(false);
}
}
mRenderInfoScanTimer.resetWithExpiry(SECS_BETWEEN_REGION_SCANS);
}
}
void LLAvatarRenderInfoAccountant::resetRenderInfoScanTimer()
{
// this will force the next frame to rescan
mRenderInfoScanTimer.reset();
}
// static
// Make sRenderInfoReportTimer expire so the next call to idle() will scan and query a new region
// called via LLViewerRegion::setCapabilitiesReceived() boost signals when the capabilities
// Called via LLViewerRegion::setCapabilitiesReceived() boost signals when the capabilities
// are returned for a new LLViewerRegion, and is the earliest time to get render info
void LLAvatarRenderInfoAccountant::expireRenderInfoReportTimer(const LLUUID& region_id)
void LLAvatarRenderInfoAccountant::scanNewRegion(const LLUUID& region_id)
{
if (logRenderInfo())
{
LL_INFOS() << "LRI: Viewer has new region capabilities, clearing global render info timer"
<< " and timer for region " << region_id
<< LL_ENDL;
}
LL_INFOS("AvatarRenderInfo") << region_id << LL_ENDL;
// Reset the global timer so it will scan regions immediately
sRenderInfoReportTimer.reset();
// Reset the global timer so it will scan regions on the next call to ::idle
LLAvatarRenderInfoAccountant::getInstance()->resetRenderInfoScanTimer();
LLViewerRegion* regionp = LLWorld::instance().getRegionFromID(region_id);
if (regionp)
{ // Reset the region's timer so it will request data immediately
{ // Reset the region's timers so we will:
// * request render info from it immediately
// * report on the following scan
regionp->getRenderInfoRequestTimer().reset();
regionp->getRenderInfoReportTimer().resetWithExpiry(SECS_BETWEEN_REGION_SCANS);
}
else
{
LL_WARNS("AvatarRenderInfo") << "unable to resolve region "<<region_id<<LL_ENDL;
}
}
// static
bool LLAvatarRenderInfoAccountant::logRenderInfo()
{
static LLCachedControl<bool> render_mute_logging_enabled(gSavedSettings, "RenderAutoMuteLogging", false);
return render_mute_logging_enabled;
}

View File

@ -33,24 +33,33 @@ class LLViewerRegion;
// Class to gather avatar rendering information
// that is sent to or fetched from regions.
class LLAvatarRenderInfoAccountant
class LLAvatarRenderInfoAccountant : public LLSingleton<LLAvatarRenderInfoAccountant>
{
public:
LLAvatarRenderInfoAccountant() {};
~LLAvatarRenderInfoAccountant() {};
private:
LOG_CLASS(LLAvatarRenderInfoAccountant);
static void sendRenderInfoToRegion(LLViewerRegion * regionp);
static void getRenderInfoFromRegion(LLViewerRegion * regionp);
public:
LLAvatarRenderInfoAccountant();
~LLAvatarRenderInfoAccountant();
static void expireRenderInfoReportTimer(const LLUUID& region_id);
void sendRenderInfoToRegion(LLViewerRegion * regionp);
void getRenderInfoFromRegion(LLViewerRegion * regionp);
static void idle();
void idle(); // called once per frame
static bool logRenderInfo();
void resetRenderInfoScanTimer();
static void scanNewRegion(const LLUUID& region_id);
private:
// Send data updates about once per minute, only need per-frame resolution
static LLFrameTimer sRenderInfoReportTimer;
private:
// frequency of region scans,
// further limited by per region Request and Report timers
LLFrameTimer mRenderInfoScanTimer;
//
LLCore::HttpRequest* mHttpRequest;
LLCore::HttpHeaders* mHttpHeaders;
LLCore::HttpOptions* mHttpOptions;
};
#endif /* ! defined(LL_llavatarrenderinfoaccountant_H) */

View File

@ -0,0 +1,265 @@
/**
* @file llavatarrendernotifier.cpp
* @author andreykproductengine
* @date 2015-08-05
* @brief
*
* $LicenseInfo:firstyear=2013&license=viewerlgpl$
* Second Life Viewer Source Code
* Copyright (C) 2013, Linden Research, Inc.
*
* 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
*
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
// Pre-compiled headers
#include "llviewerprecompiledheaders.h"
// STL headers
// std headers
// external library headers
// other Linden headers
#include "llagentwearables.h"
#include "llappearancemgr.h"
#include "llattachmentsmgr.h"
#include "llnotifications.h"
#include "llnotificationsutil.h"
#include "llnotificationtemplate.h"
#include "lltimer.h"
#include "llvoavatarself.h"
#include "llviewercontrol.h"
#include "lltrans.h"
#include "llagentcamera.h"
// associated header
#include "llavatarrendernotifier.h"
// when change exceeds this ration, notification is shown
static const F32 RENDER_ALLOWED_CHANGE_PCT = 0.1;
// wait seconds before processing over limit updates after last complexity change
static const U32 OVER_LIMIT_UPDATE_DELAY = 70;
LLAvatarRenderNotifier::LLAvatarRenderNotifier() :
mAgentsCount(0),
mOverLimitAgents(0),
mAgentComplexity(0),
mOverLimitPct(0.0f),
mLatestAgentsCount(0),
mLatestOverLimitAgents(0),
mLatestAgentComplexity(0),
mLatestOverLimitPct(0.0f),
mShowOverLimitAgents(false),
mNotifyOutfitLoading(false),
mLastCofVersion(-1),
mLastOutfitRezStatus(-1),
mLastSkeletonSerialNum(-1)
{
mPopUpDelayTimer.resetWithExpiry(OVER_LIMIT_UPDATE_DELAY);
}
std::string LLAvatarRenderNotifier::overLimitMessage()
{
static const char* everyone_now = "av_render_everyone_now";
static const char* not_everyone = "av_render_not_everyone";
static const char* over_half = "av_render_over_half";
static const char* most = "av_render_most_of";
static const char* anyone = "av_render_anyone";
std::string message;
if ( mLatestOverLimitPct >= 99.0 )
{
message = anyone;
}
else if ( mLatestOverLimitPct >= 75.0 )
{
message = most;
}
else if ( mLatestOverLimitPct >= 50.0 )
{
message = over_half;
}
else if ( mLatestOverLimitPct > 10.0 )
{
message = not_everyone;
}
else
{
// Will be shown only after overlimit was > 0
message = everyone_now;
}
return LLTrans::getString(message);
}
void LLAvatarRenderNotifier::displayNotification(bool show_over_limit)
{
if (gAgentCamera.getLastCameraMode() == CAMERA_MODE_MOUSELOOK)
{
LL_WARNS("AvatarRenderInfo") << "Suppressing a notification while in mouselook" << LL_ENDL;
return;
}
mAgentComplexity = mLatestAgentComplexity;
mShowOverLimitAgents = show_over_limit;
static LLCachedControl<U32> expire_delay(gSavedSettings, "ShowMyComplexityChanges", 20);
LLDate expire_date(LLDate::now().secondsSinceEpoch() + expire_delay);
LLSD args;
args["AGENT_COMPLEXITY"] = LLSD::Integer(mLatestAgentComplexity);
std::string notification_name;
if (mShowOverLimitAgents)
{
mAgentsCount = mLatestAgentsCount;
mOverLimitAgents = mLatestOverLimitAgents;
mOverLimitPct = mLatestOverLimitPct;
std::string notification_message = overLimitMessage();
notification_name = "RegionAndAgentComplexity";
args["OVERLIMIT_MSG"] = notification_message;
}
else
{
notification_name = "AgentComplexity";
}
if (mNotificationPtr != NULL && mNotificationPtr->getName() != notification_name)
{
// since unique tag works only for same notification,
// old notification needs to be canceled manually
LLNotifications::instance().cancel(mNotificationPtr);
}
LL_INFOS("AvatarRenderInfo") << notification_name << " " << args << LL_ENDL;
mNotificationPtr = LLNotifications::instance().add(LLNotification::Params()
.name(notification_name)
.expiry(expire_date)
.substitutions(args));
}
bool LLAvatarRenderNotifier::isNotificationVisible()
{
return mNotificationPtr != NULL && mNotificationPtr->isActive();
}
void LLAvatarRenderNotifier::updateNotificationRegion(U32 agentcount, U32 overLimit)
{
if (agentcount == 0)
{
// Data not ready
return;
}
// save current values for later use
mLatestAgentsCount = agentcount > overLimit ? agentcount - 1 : agentcount; // subtract self
mLatestOverLimitAgents = overLimit;
mLatestOverLimitPct = mLatestAgentsCount != 0 ? ((F32)overLimit / (F32)mLatestAgentsCount) * 100.0 : 0;
if (mAgentsCount == mLatestAgentsCount
&& mOverLimitAgents == mLatestOverLimitAgents)
{
// no changes since last notification
return;
}
if ((mPopUpDelayTimer.hasExpired() || (isNotificationVisible() && mShowOverLimitAgents))
&& (mOverLimitPct > 0 || mLatestOverLimitPct > 0)
&& std::abs(mOverLimitPct - mLatestOverLimitPct) > mLatestOverLimitPct * RENDER_ALLOWED_CHANGE_PCT
)
{
// display in case of drop to/from zero and in case of significant (RENDER_ALLOWED_CHANGE_PCT) changes
displayNotification(true);
// default timeout before next notification
static LLCachedControl<U32> pop_up_delay(gSavedSettings, "ComplexityChangesPopUpDelay", 300);
mPopUpDelayTimer.resetWithExpiry(pop_up_delay);
}
}
void LLAvatarRenderNotifier::updateNotificationState()
{
if (!isAgentAvatarValid())
{
// data not ready, nothing to show.
return;
}
// Don't use first provided COF and Sceleton versions - let them load anf 'form' first
if (mLastCofVersion < 0
&& gAgentWearables.areWearablesLoaded()
&& LLAttachmentsMgr::getInstance()->isAttachmentStateComplete())
{
// cof formed
mLastCofVersion = LLAppearanceMgr::instance().getCOFVersion();
mLastSkeletonSerialNum = gAgentAvatarp->mLastSkeletonSerialNum;
}
else if (mLastCofVersion >= 0
&& (mLastCofVersion != gAgentAvatarp->mLastUpdateRequestCOFVersion
|| mLastSkeletonSerialNum != gAgentAvatarp->mLastSkeletonSerialNum))
{
// version mismatch in comparison to previous outfit - outfit changed
mNotifyOutfitLoading = true;
mLastCofVersion = LLAppearanceMgr::instance().getCOFVersion();
mLastSkeletonSerialNum = gAgentAvatarp->mLastSkeletonSerialNum;
}
if (gAgentAvatarp->mLastRezzedStatus < mLastOutfitRezStatus)
{
// rez status decreased - outfit related action was initiated
mNotifyOutfitLoading = true;
}
mLastOutfitRezStatus = gAgentAvatarp->mLastRezzedStatus;
}
void LLAvatarRenderNotifier::updateNotificationAgent(U32 agentComplexity)
{
// save the value for use in following messages
mLatestAgentComplexity = agentComplexity;
if (!isAgentAvatarValid() || !gAgentWearables.areWearablesLoaded())
{
// data not ready, nothing to show.
return;
}
if (!mNotifyOutfitLoading)
{
// We should not notify about initial outfit and it's load process without reason
updateNotificationState();
if (mLatestOverLimitAgents > 0)
{
// Some users can't see agent already, notify user about complexity growth
mNotifyOutfitLoading = true;
}
if (!mNotifyOutfitLoading)
{
// avatar or outfit not ready
mAgentComplexity = mLatestAgentComplexity;
return;
}
}
if (mAgentComplexity != mLatestAgentComplexity)
{
// if we have an agent complexity change, we always display it and hide 'over limit'
displayNotification(false);
// next 'over limit' update should be displayed after delay to make sure information got updated at server side
mPopUpDelayTimer.resetWithExpiry(OVER_LIMIT_UPDATE_DELAY);
}
}

View File

@ -0,0 +1,84 @@
/**
* @file llavatarrendernotifier.h
* @author andreykproductengine
* @date 2015-08-05
* @brief
*
* $LicenseInfo:firstyear=2013&license=viewerlgpl$
* Second Life Viewer Source Code
* Copyright (C) 2013, Linden Research, Inc.
*
* 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
*
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
#if ! defined(LL_llavatarrendernotifier_H)
#define LL_llavatarrendernotifier_H
#include "llnotificationptr.h"
class LLViewerRegion;
// Class to notify user about drastic changes in agent's render weights or if other agents
// reported that user's agent is too 'heavy' for their settings
class LLAvatarRenderNotifier : public LLSingleton<LLAvatarRenderNotifier>
{
public:
LLAvatarRenderNotifier();
void displayNotification(bool show_over_limit);
bool isNotificationVisible();
void updateNotificationRegion(U32 agentcount, U32 overLimit);
void updateNotificationState();
void updateNotificationAgent(U32 agentComplexity);
private:
LLNotificationPtr mNotificationPtr;
// to prevent notification from popping up too often, show it only
// if certain amount of time passed since previous notification
LLFrameTimer mPopUpDelayTimer;
// values since last notification for comparison purposes
U32 mAgentsCount;
U32 mOverLimitAgents;
U32 mAgentComplexity;
F32 mOverLimitPct;
// last reported values
U32 mLatestAgentsCount;
U32 mLatestOverLimitAgents;
U32 mLatestAgentComplexity;
F32 mLatestOverLimitPct;
bool mShowOverLimitAgents;
std::string overLimitMessage();
// initial outfit related variables (state control)
bool mNotifyOutfitLoading;
// COF (inventory folder) and Skeleton (voavatar) are used to spot changes in outfit.
S32 mLastCofVersion;
S32 mLastSkeletonSerialNum;
// Used to detect changes in voavatar's rezzed status.
// If value decreases - there were changes in outfit.
S32 mLastOutfitRezStatus;
};
#endif /* ! defined(LL_llavatarrendernotifier_H) */

View File

@ -472,7 +472,9 @@ void LLDrawPoolAvatar::renderShadow(S32 pass)
}
BOOL impostor = avatarp->isImpostor();
if (impostor)
if (impostor
&& LLVOAvatar::AV_DO_NOT_RENDER != avatarp->getVisualMuteSettings()
&& LLVOAvatar::AV_ALWAYS_RENDER != avatarp->getVisualMuteSettings())
{
return;
}
@ -1246,7 +1248,9 @@ void LLDrawPoolAvatar::renderAvatars(LLVOAvatar* single_avatar, S32 pass)
BOOL impostor = avatarp->isImpostor() && !single_avatar;
if (impostor && pass != 0)
if (( avatarp->isInMuteList()
|| impostor
|| (LLVOAvatar::AV_DO_NOT_RENDER == avatarp->getVisualMuteSettings() && !avatarp->needsImpostorUpdate()) ) && pass != 0)
{ //don't draw anything but the impostor for impostored avatars
return;
}
@ -1263,7 +1267,7 @@ void LLDrawPoolAvatar::renderAvatars(LLVOAvatar* single_avatar, S32 pass)
LLVOAvatar::sNumVisibleAvatars++;
}
if (impostor)
if (impostor || (LLVOAvatar::AV_DO_NOT_RENDER == avatarp->getVisualMuteSettings() && !avatarp->needsImpostorUpdate()))
{
if (LLPipeline::sRenderDeferred && !LLPipeline::sReflectionRender && avatarp->mImpostor.isComplete())
{
@ -1281,13 +1285,6 @@ void LLDrawPoolAvatar::renderAvatars(LLVOAvatar* single_avatar, S32 pass)
return;
}
llassert(LLPipeline::sImpostorRender || !avatarp->isVisuallyMuted());
/*if (single_avatar && avatarp->mSpecialRenderMode >= 1) // 1=anim preview, 2=image preview, 3=morph view
{
gPipeline.enableLightsAvatarEdit(LLColor4(.5f, .5f, .5f, 1.f));
}*/
if (pass == 1)
{
// render rigid meshes (eyeballs) first
@ -1811,7 +1808,7 @@ void LLDrawPoolAvatar::renderRigged(LLVOAvatar* avatar, U32 type, bool glow)
{
//order is important here LLRender::DIFFUSE_MAP should be last, becouse it change
//(gGL).mCurrTextureUnitIndex
gGL.getTexUnit(specular_channel)->bind(face->getTexture(LLRender::SPECULAR_MAP));
gGL.getTexUnit(specular_channel)->bind(LLPipeline::sImpostorRender ? LLViewerTextureManager::findTexture(IMG_BLACK_SQUARE_MALEVICH) : face->getTexture(LLRender::SPECULAR_MAP));
gGL.getTexUnit(normal_channel)->bind(face->getTexture(LLRender::NORMAL_MAP));
gGL.getTexUnit(sDiffuseChannel)->bind(face->getTexture(LLRender::DIFFUSE_MAP), false, true);

View File

@ -98,6 +98,10 @@ void LLFeatureList::addFeature(const std::string& name, const BOOL available, co
}
LLFeatureInfo fi(name, available, level);
LL_DEBUGS_ONCE("RenderInit") << "Feature '" << name << "' "
<< (available ? "" : "not " ) << "available"
<< " at " << level
<< LL_ENDL;
mFeatures[name] = fi;
}
@ -119,6 +123,7 @@ F32 LLFeatureList::getRecommendedValue(const std::string& name)
{
if (mFeatures.count(name) && isFeatureAvailable(name))
{
LL_DEBUGS_ONCE("RenderInit") << "Setting '" << name << "' to recommended value " << mFeatures[name].mRecommendedLevel << LL_ENDL;
return mFeatures[name].mRecommendedLevel;
}
@ -128,7 +133,7 @@ F32 LLFeatureList::getRecommendedValue(const std::string& name)
BOOL LLFeatureList::maskList(LLFeatureList &mask)
{
//LL_INFOS() << "Masking with " << mask.mName << LL_ENDL;
LL_DEBUGS_ONCE() << "Masking with " << mask.mName << LL_ENDL;
//
// Lookup the specified feature mask, and overlay it on top of the
// current feature mask.
@ -294,7 +299,7 @@ bool LLFeatureManager::loadFeatureTables()
app_path += filename;
// second table is downloaded with HTTP
// second table is downloaded with HTTP - note that this will only be used on the run _after_ it is downloaded
std::string http_path = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, http_filename);
// use HTTP table if it exists
@ -378,11 +383,11 @@ bool LLFeatureManager::parseFeatureTable(std::string filename)
file >> name;
if (!mMaskList.count(name))
{
flp = new LLFeatureList(name);
mMaskList[name] = flp;
}
else
{
flp = new LLFeatureList(name);
mMaskList[name] = flp;
}
else
{
LL_WARNS("RenderInit") << "Overriding mask " << name << ", this is invalid!" << LL_ENDL;
parse_ok = false;
}
@ -391,11 +396,11 @@ bool LLFeatureManager::parseFeatureTable(std::string filename)
{
if (flp)
{
S32 available;
F32 recommended;
file >> available >> recommended;
flp->addFeature(name, available, recommended);
}
S32 available;
F32 recommended;
file >> available >> recommended;
flp->addFeature(name, available, recommended);
}
else
{
LL_WARNS("RenderInit") << "Specified parameter before <list> keyword!" << LL_ENDL;
@ -604,7 +609,7 @@ void LLFeatureManager::applyRecommendedSettings()
// cap the level at 2 (high)
U32 level = llmax(GPU_CLASS_0, llmin(mGPUClass, GPU_CLASS_5));
LL_INFOS() << "Applying Recommended Features" << LL_ENDL;
LL_INFOS("RenderInit") << "Applying Recommended Features for level " << level << LL_ENDL;
setGraphicsLevel(level, false);
gSavedSettings.setU32("RenderQualityPerformance", level);
@ -811,7 +816,7 @@ void LLFeatureManager::applyBaseMasks()
if (osInfo.mMajorVer == 10 && osInfo.mMinorVer < 7)
{
maskFeatures("OSX_10_6_8");
}
}
#endif
// now mask by gpu string

View File

@ -0,0 +1,101 @@
/**
* @file llfloaterdeleteprefpreset.cpp
* @brief Floater to delete a graphics / camera preset
*
* $LicenseInfo:firstyear=2014&license=viewerlgpl$
* Second Life Viewer Source Code
* Copyright (C) 2014, Linden Research, Inc.
*
* 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
*
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
#include "llviewerprecompiledheaders.h"
#include "llfloaterdeleteprefpreset.h"
#include "llbutton.h"
#include "llcombobox.h"
#include "llfloaterpreference.h"
#include "llnotificationsutil.h"
#include "llpresetsmanager.h"
#include "llviewercontrol.h"
#include "llfloaterreg.h"
LLFloaterDeletePrefPreset::LLFloaterDeletePrefPreset(const LLSD &key)
: LLFloater(key)
{
}
// virtual
BOOL LLFloaterDeletePrefPreset::postBuild()
{
LLFloaterPreference* preferences = LLFloaterReg::getTypedInstance<LLFloaterPreference>("preferences");
if (preferences)
{
preferences->addDependentFloater(this);
}
getChild<LLButton>("delete")->setCommitCallback(boost::bind(&LLFloaterDeletePrefPreset::onBtnDelete, this));
getChild<LLButton>("cancel")->setCommitCallback(boost::bind(&LLFloaterDeletePrefPreset::onBtnCancel, this));
LLPresetsManager::instance().setPresetListChangeCallback(boost::bind(&LLFloaterDeletePrefPreset::onPresetsListChange, this));
return TRUE;
}
void LLFloaterDeletePrefPreset::onOpen(const LLSD& key)
{
mSubdirectory = key.asString();
std::string floater_title = getString(std::string("title_") + mSubdirectory);
setTitle(floater_title);
LLComboBox* combo = getChild<LLComboBox>("preset_combo");
EDefaultOptions option = DEFAULT_HIDE;
LLPresetsManager::getInstance()->setPresetNamesInComboBox(mSubdirectory, combo, option);
}
void LLFloaterDeletePrefPreset::onBtnDelete()
{
LLComboBox* combo = getChild<LLComboBox>("preset_combo");
std::string name = combo->getSimple();
if (!LLPresetsManager::getInstance()->deletePreset(mSubdirectory, name))
{
LLSD args;
args["NAME"] = name;
LLNotificationsUtil::add("PresetNotDeleted", args);
}
closeFloater();
}
void LLFloaterDeletePrefPreset::onPresetsListChange()
{
LLComboBox* combo = getChild<LLComboBox>("preset_combo");
LLButton* delete_btn = getChild<LLButton>("delete");
EDefaultOptions option = DEFAULT_HIDE;
LLPresetsManager::getInstance()->setPresetNamesInComboBox(mSubdirectory, combo, option);
delete_btn->setEnabled(0 != combo->getItemCount());
}
void LLFloaterDeletePrefPreset::onBtnCancel()
{
closeFloater();
}

View File

@ -0,0 +1,53 @@
/**
* @file llfloaterdeleteprefpreset.h
* @brief Floater to delete a graphics / camera preset
*
* $LicenseInfo:firstyear=2014&license=viewerlgpl$
* Second Life Viewer Source Code
* Copyright (C) 2014, Linden Research, Inc.
*
* 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
*
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
#ifndef LL_LLFLOATERDELETEPREFPRESET_H
#define LL_LLFLOATERDELETEPREFPRESET_H
#include "llfloater.h"
class LLComboBox;
class LLFloaterDeletePrefPreset : public LLFloater
{
public:
LLFloaterDeletePrefPreset(const LLSD &key);
/*virtual*/ BOOL postBuild();
/*virtual*/ void onOpen(const LLSD& key);
void onBtnDelete();
void onBtnCancel();
private:
void onPresetsListChange();
std::string mSubdirectory;
};
#endif // LL_LLFLOATERDELETEPREFPRESET_H

View File

@ -1,212 +0,0 @@
/**
* @file llfloaterhardwaresettings.cpp
* @brief Menu of all the different graphics hardware settings
*
* $LicenseInfo:firstyear=2001&license=viewerlgpl$
* Second Life Viewer Source Code
* Copyright (C) 2010, Linden Research, Inc.
*
* 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
*
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
#include "llviewerprecompiledheaders.h"
#include "llfloaterhardwaresettings.h"
// Viewer includes
#include "llfloaterpreference.h"
#include "llviewerwindow.h"
#include "llviewercontrol.h"
#include "llviewertexturelist.h"
#include "llfeaturemanager.h"
#include "llspinctrl.h"
#include "llstartup.h"
#include "lltextbox.h"
#include "llcombobox.h"
#include "pipeline.h"
// Linden library includes
#include "llradiogroup.h"
#include "lluictrlfactory.h"
#include "llwindow.h"
#include "llsliderctrl.h"
LLFloaterHardwareSettings::LLFloaterHardwareSettings(const LLSD& key)
: LLFloater(key),
// these should be set on imminent refresh() call,
// but init them anyway
mUseVBO(0),
mUseAniso(0),
mFSAASamples(0),
mGamma(0.0),
mVideoCardMem(0),
mFogRatio(0.0),
mProbeHardwareOnStartup(FALSE)
{
}
LLFloaterHardwareSettings::~LLFloaterHardwareSettings()
{
}
void LLFloaterHardwareSettings::initCallbacks(void)
{
}
// menu maintenance functions
void LLFloaterHardwareSettings::refresh()
{
LLPanel::refresh();
mUseVBO = gSavedSettings.getBOOL("RenderVBOEnable");
mUseAniso = gSavedSettings.getBOOL("RenderAnisotropic");
mFSAASamples = gSavedSettings.getU32("RenderFSAASamples");
mGamma = gSavedSettings.getF32("RenderGamma");
mVideoCardMem = gSavedSettings.getS32("TextureMemory");
mFogRatio = gSavedSettings.getF32("RenderFogRatio");
mProbeHardwareOnStartup = gSavedSettings.getBOOL("ProbeHardwareOnStartup");
mCompressTextures = gSavedSettings.getBOOL("RenderCompressTextures");
getChild<LLUICtrl>("fsaa")->setValue((LLSD::Integer) mFSAASamples);
refreshEnabledState();
}
void LLFloaterHardwareSettings::refreshEnabledState()
{
F32 mem_multiplier = gSavedSettings.getF32("RenderTextureMemoryMultiple");
S32Megabytes min_tex_mem = LLViewerTextureList::getMinVideoRamSetting();
S32Megabytes max_tex_mem = LLViewerTextureList::getMaxVideoRamSetting(false, mem_multiplier);
getChild<LLSliderCtrl>("GraphicsCardTextureMemory")->setMinValue(min_tex_mem.value());
getChild<LLSliderCtrl>("GraphicsCardTextureMemory")->setMaxValue(max_tex_mem.value());
if (!LLFeatureManager::getInstance()->isFeatureAvailable("RenderVBOEnable") ||
!gGLManager.mHasVertexBufferObject)
{
getChildView("vbo")->setEnabled(FALSE);
}
if (!LLFeatureManager::getInstance()->isFeatureAvailable("RenderCompressTextures") ||
!gGLManager.mHasVertexBufferObject)
{
getChildView("texture compression")->setEnabled(FALSE);
}
// if no windlight shaders, turn off nighttime brightness, gamma, and fog distance
LLSpinCtrl* gamma_ctrl = getChild<LLSpinCtrl>("gamma");
gamma_ctrl->setEnabled(!gPipeline.canUseWindLightShaders());
getChildView("(brightness, lower is brighter)")->setEnabled(!gPipeline.canUseWindLightShaders());
getChildView("fog")->setEnabled(!gPipeline.canUseWindLightShaders());
// anti-aliasing
{
LLUICtrl* fsaa_ctrl = getChild<LLUICtrl>("fsaa");
LLTextBox* fsaa_text = getChild<LLTextBox>("antialiasing label");
LLView* fsaa_restart = getChildView("antialiasing restart");
// Enable or disable the control, the "Antialiasing:" label and the restart warning
// based on code support for the feature on the current hardware.
if (gPipeline.canUseAntiAliasing())
{
fsaa_ctrl->setEnabled(TRUE);
// borrow the text color from the gamma control for consistency
fsaa_text->setColor(gamma_ctrl->getEnabledTextColor());
fsaa_restart->setVisible(!gSavedSettings.getBOOL("RenderDeferred"));
}
else
{
fsaa_ctrl->setEnabled(FALSE);
fsaa_ctrl->setValue((LLSD::Integer) 0);
// borrow the text color from the gamma control for consistency
fsaa_text->setColor(gamma_ctrl->getDisabledTextColor());
fsaa_restart->setVisible(FALSE);
}
}
}
//============================================================================
BOOL LLFloaterHardwareSettings::postBuild()
{
childSetAction("OK", onBtnOK, this);
childSetAction("Cancel", onBtnCancel, this);
// Don't do this on Mac as their braindead GL versioning
// sets this when 8x and 16x are indeed available
//
#if !LL_DARWIN
if (gGLManager.mIsIntel || gGLManager.mGLVersion < 3.f)
{ //remove FSAA settings above "4x"
LLComboBox* combo = getChild<LLComboBox>("fsaa");
combo->remove("8x");
combo->remove("16x");
}
#endif
refresh();
center();
// load it up
initCallbacks();
return TRUE;
}
void LLFloaterHardwareSettings::apply()
{
refresh();
}
void LLFloaterHardwareSettings::cancel()
{
closeFloater();
}
// static
void LLFloaterHardwareSettings::onBtnCancel( void* userdata )
{
LLFloaterHardwareSettings *fp =(LLFloaterHardwareSettings *)userdata;
fp->cancel();
}
// static
void LLFloaterHardwareSettings::onBtnOK( void* userdata )
{
LLFloaterHardwareSettings *fp =(LLFloaterHardwareSettings *)userdata;
fp->apply();
fp->closeFloater(false);
}
void LLFloaterHardwareSettings::onClose(bool app_quitting)
{
gSavedSettings.setBOOL("RenderVBOEnable", mUseVBO);
gSavedSettings.setBOOL("RenderAnisotropic", mUseAniso);
gSavedSettings.setU32("RenderFSAASamples", mFSAASamples);
gSavedSettings.setF32("RenderGamma", mGamma);
gSavedSettings.setS32("TextureMemory", mVideoCardMem);
gSavedSettings.setF32("RenderFogRatio", mFogRatio);
gSavedSettings.setBOOL("ProbeHardwareOnStartup", mProbeHardwareOnStartup );
gSavedSettings.setBOOL("RenderCompressTextures", mCompressTextures );
}

View File

@ -1,89 +0,0 @@
/**
* @file llfloaterhardwaresettings.h
* @brief Menu of all the different graphics hardware settings
*
* $LicenseInfo:firstyear=2001&license=viewerlgpl$
* Second Life Viewer Source Code
* Copyright (C) 2010, Linden Research, Inc.
*
* 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
*
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
#ifndef LL_LLFLOATER_HARDWARE_SETTINGS_H
#define LL_LLFLOATER_HARDWARE_SETTINGS_H
#include "llfloater.h"
/// Menuing system for all of windlight's functionality
class LLFloaterHardwareSettings : public LLFloater
{
friend class LLFloaterPreference;
public:
LLFloaterHardwareSettings(const LLSD& key);
/*virtual*/ ~LLFloaterHardwareSettings();
/*virtual*/ BOOL postBuild();
/*virtual*/ void onClose(bool app_quitting);
/// initialize all the callbacks for the menu
void initCallbacks(void);
/// OK button
static void onBtnOK( void* userdata );
/// Cancel button
static void onBtnCancel( void* userdata );
//// menu management
/// show off our menu
static void show();
/// return if the menu exists or not
static bool isOpen();
/// sync up menu with parameters
void refresh();
/// Apply the changed values.
void apply();
/// don't apply the changed values
void cancel();
/// refresh the enabled values
void refreshEnabledState();
protected:
BOOL mUseVBO;
BOOL mUseAniso;
BOOL mUseFBO;
U32 mFSAASamples;
F32 mGamma;
S32 mVideoCardMem;
F32 mFogRatio;
BOOL mProbeHardwareOnStartup;
BOOL mCompressTextures;
private:
};
#endif

View File

@ -0,0 +1,91 @@
/**
* @file llfloateloadprefpreset.cpp
* @brief Floater to load a graphics / camera preset
*
* $LicenseInfo:firstyear=2015&license=viewerlgpl$
* Second Life Viewer Source Code
* Copyright (C) 2015, Linden Research, Inc.
*
* 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
*
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
#include "llviewerprecompiledheaders.h"
#include "llfloaterloadprefpreset.h"
#include "llbutton.h"
#include "llcombobox.h"
#include "llfloaterpreference.h"
#include "llfloaterreg.h"
#include "llpresetsmanager.h"
#include "llviewercontrol.h"
LLFloaterLoadPrefPreset::LLFloaterLoadPrefPreset(const LLSD &key)
: LLFloater(key)
{
}
// virtual
BOOL LLFloaterLoadPrefPreset::postBuild()
{ LLFloaterPreference* preferences = LLFloaterReg::getTypedInstance<LLFloaterPreference>("preferences");
if (preferences)
{
preferences->addDependentFloater(this);
}
getChild<LLButton>("ok")->setCommitCallback(boost::bind(&LLFloaterLoadPrefPreset::onBtnOk, this));
getChild<LLButton>("cancel")->setCommitCallback(boost::bind(&LLFloaterLoadPrefPreset::onBtnCancel, this));
LLPresetsManager::instance().setPresetListChangeCallback(boost::bind(&LLFloaterLoadPrefPreset::onPresetsListChange, this));
return TRUE;
}
void LLFloaterLoadPrefPreset::onOpen(const LLSD& key)
{
mSubdirectory = key.asString();
std::string floater_title = getString(std::string("title_") + mSubdirectory);
setTitle(floater_title);
LLComboBox* combo = getChild<LLComboBox>("preset_combo");
EDefaultOptions option = DEFAULT_TOP;
LLPresetsManager::getInstance()->setPresetNamesInComboBox(mSubdirectory, combo, option);
}
void LLFloaterLoadPrefPreset::onPresetsListChange()
{
LLComboBox* combo = getChild<LLComboBox>("preset_combo");
EDefaultOptions option = DEFAULT_TOP;
LLPresetsManager::getInstance()->setPresetNamesInComboBox(mSubdirectory, combo, option);
}
void LLFloaterLoadPrefPreset::onBtnCancel()
{
closeFloater();
}
void LLFloaterLoadPrefPreset::onBtnOk()
{
LLComboBox* combo = getChild<LLComboBox>("preset_combo");
std::string name = combo->getSimple();
LLPresetsManager::getInstance()->loadPreset(mSubdirectory, name);
closeFloater();
}

View File

@ -0,0 +1,53 @@
/**
* @file llfloaterloadprefpreset.h
* @brief Floater to load a graphics / camera preset
*
* $LicenseInfo:firstyear=2015&license=viewerlgpl$
* Second Life Viewer Source Code
* Copyright (C) 2015, Linden Research, Inc.
*
* 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
*
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
#ifndef LL_LLFLOATERLOADPREFPRESET_H
#define LL_LLFLOATERLOADPREFPRESET_H
#include "llfloater.h"
class LLComboBox;
class LLFloaterLoadPrefPreset : public LLFloater
{
public:
LLFloaterLoadPrefPreset(const LLSD &key);
/*virtual*/ BOOL postBuild();
/*virtual*/ void onOpen(const LLSD& key);
void onBtnOk();
void onBtnCancel();
private:
void onPresetsListChange();
std::string mSubdirectory;
};
#endif // LL_LLFLOATERLOADPREFPRESET_H

View File

@ -3798,10 +3798,6 @@ BOOL LLModelPreview::render()
if (regen)
{
genBuffers(mPreviewLOD, skin_weight);
{
LL_INFOS() << "Vertex Buffer[" << mPreviewLOD << "]" << " is EMPTY!!!" << LL_ENDL;
regen = TRUE;
}
}
if (!skin_weight)

File diff suppressed because it is too large Load Diff

View File

@ -58,7 +58,6 @@ typedef enum
} EGraphicsSettings;
// Floater to control preferences (display, audio, bandwidth, general.
class LLFloaterPreference : public LLFloater, public LLAvatarPropertiesObserver, public LLConversationLogObserver
{
@ -93,11 +92,11 @@ public:
void saveAvatarProperties( void );
void selectPrivacyPanel();
void selectChatPanel();
void getControlNames(std::vector<std::string>& names);
protected:
void onBtnOK();
void onBtnCancel();
void onBtnApply();
void onBtnOK(const LLSD& userdata);
void onBtnCancel(const LLSD& userdata);
void onClickClearCache(); // Clear viewer texture cache, vfs, and VO cache on next startup
void onClickBrowserClearCache(); // Clear web history and caches as well as viewer caches above
@ -111,11 +110,13 @@ protected:
// if the custom settings box is clicked
void onChangeCustom();
void updateMeterText(LLUICtrl* ctrl);
void onOpenHardwareSettings();
// callback for defaults
void setHardwareDefaults();
void setRecommended();
// callback for when client turns on shaders
void onVertexShaderEnable();
// callback for when client turns on impostors
void onAvatarImpostorsEnable();
// callback for commit in the "Single click on land" and "Double click on land" comboboxes.
void onClickActionChange();
@ -123,7 +124,7 @@ protected:
void updateClickActionSettings();
// updates click/double-click action controls depending on values from settings.xml
void updateClickActionControls();
// This function squirrels away the current values of the controls so that
// cancel() can restore them.
void saveSettings();
@ -150,13 +151,11 @@ public:
void enableHistory();
void setPersonalInfo(const std::string& visibility, bool im_via_email);
void refreshEnabledState();
void disableUnavailableSettings();
void onCommitWindowedMode();
void refresh(); // Refresh enable/disable
// if the quality radio buttons are changed
void onChangeQuality(const LLSD& data);
void updateSliderText(LLSliderCtrl* ctrl, LLTextBox* text_box);
void refreshUI();
void onCommitParcelMediaAutoPlayEnable();
@ -170,12 +169,14 @@ public:
void onClickPermsDefault();
void onClickAutoReplace();
void onClickSpellChecker();
void onClickAdvanced();
void applyUIColor(LLUICtrl* ctrl, const LLSD& param);
void getUIColor(LLUICtrl* ctrl, const LLSD& param);
void onLogChatHistorySaved();
void buildPopupLists();
static void refreshSkin(void* data);
void selectPanel(const LLSD& name);
void saveGraphicsPreset(std::string& preset);
private:
@ -196,6 +197,8 @@ private:
std::string mDirectoryVisibility;
LLAvatarData mAvatarProperties;
std::string mSavedGraphicsPreset;
LOG_CLASS(LLFloaterPreference);
};
class LLPanelPreference : public LLPanel
@ -209,7 +212,7 @@ public:
virtual void apply();
virtual void cancel();
void setControlFalse(const LLSD& user_data);
virtual void setHardwareDefaults(){};
virtual void setHardwareDefaults();
// Disables "Allow Media to auto play" check box only when both
// "Streaming Music" and "Media" are unchecked. Otherwise enables it.
@ -218,7 +221,11 @@ public:
// This function squirrels away the current values of the controls so that
// cancel() can restore them.
virtual void saveSettings();
void deletePreset(const LLSD& user_data);
void savePreset(const LLSD& user_data);
void loadPreset(const LLSD& user_data);
class Updater;
protected:
@ -235,6 +242,7 @@ private:
string_color_map_t mSavedColors;
Updater* mBandWidthUpdater;
LOG_CLASS(LLPanelPreference);
};
class LLPanelPreferenceGraphics : public LLPanelPreference
@ -242,14 +250,45 @@ class LLPanelPreferenceGraphics : public LLPanelPreference
public:
BOOL postBuild();
void draw();
void apply();
void cancel();
void saveSettings();
void resetDirtyChilds();
void setHardwareDefaults();
void setPresetText();
static const std::string getPresetsPath();
protected:
bool hasDirtyChilds();
void resetDirtyChilds();
private:
void onPresetsListChange();
LOG_CLASS(LLPanelPreferenceGraphics);
};
class LLFloaterPreferenceGraphicsAdvanced : public LLFloater
{
public:
LLFloaterPreferenceGraphicsAdvanced(const LLSD& key);
~LLFloaterPreferenceGraphicsAdvanced();
void onOpen(const LLSD& key);
void onClickCloseBtn(bool app_quitting);
void disableUnavailableSettings();
void refreshEnabledGraphics();
void refreshEnabledState();
void updateSliderText(LLSliderCtrl* ctrl, LLTextBox* text_box);
void updateMaxNonImpostors();
void setMaxNonImpostorsText(U32 value, LLTextBox* text_box);
void updateMaxComplexity();
void setMaxComplexityText(U32 value, LLTextBox* text_box);
static void setIndirectControls();
static void setIndirectMaxNonImpostors();
static void setIndirectMaxArc();
void refresh();
// callback for when client turns on shaders
void onVertexShaderEnable();
LOG_CLASS(LLFloaterPreferenceGraphicsAdvanced);
};
class LLFloaterPreferenceProxy : public LLFloater
@ -278,7 +317,7 @@ private:
bool mSocksSettingsDirty;
typedef std::map<LLControlVariable*, LLSD> control_values_map_t;
control_values_map_t mSavedValues;
LOG_CLASS(LLFloaterPreferenceProxy);
};

View File

@ -0,0 +1,108 @@
/**
* @file llfloatersaveprefpreset.cpp
* @brief Floater to save a graphics / camera preset
*
* $LicenseInfo:firstyear=2014&license=viewerlgpl$
* Second Life Viewer Source Code
* Copyright (C) 2014, Linden Research, Inc.
*
* 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
*
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
#include "llviewerprecompiledheaders.h"
#include "llfloatersaveprefpreset.h"
#include "llbutton.h"
#include "llcombobox.h"
#include "llfloaterpreference.h"
#include "llfloaterreg.h"
#include "llnotificationsutil.h"
#include "llpresetsmanager.h"
LLFloaterSavePrefPreset::LLFloaterSavePrefPreset(const LLSD &key)
: LLFloater(key)
{
}
// virtual
BOOL LLFloaterSavePrefPreset::postBuild()
{ LLFloaterPreference* preferences = LLFloaterReg::getTypedInstance<LLFloaterPreference>("preferences");
if (preferences)
{
preferences->addDependentFloater(this);
}
getChild<LLComboBox>("preset_combo")->setTextEntryCallback(boost::bind(&LLFloaterSavePrefPreset::onPresetNameEdited, this));
getChild<LLComboBox>("preset_combo")->setCommitCallback(boost::bind(&LLFloaterSavePrefPreset::onPresetNameEdited, this));
getChild<LLButton>("save")->setCommitCallback(boost::bind(&LLFloaterSavePrefPreset::onBtnSave, this));
getChild<LLButton>("cancel")->setCommitCallback(boost::bind(&LLFloaterSavePrefPreset::onBtnCancel, this));
LLPresetsManager::instance().setPresetListChangeCallback(boost::bind(&LLFloaterSavePrefPreset::onPresetsListChange, this));
mSaveButton = getChild<LLButton>("save");
mPresetCombo = getChild<LLComboBox>("preset_combo");
return TRUE;
}
void LLFloaterSavePrefPreset::onPresetNameEdited()
{
// Disable saving a preset having empty name.
std::string name = mPresetCombo->getSimple();
mSaveButton->setEnabled(!name.empty());
}
void LLFloaterSavePrefPreset::onOpen(const LLSD& key)
{
mSubdirectory = key.asString();
std::string floater_title = getString(std::string("title_") + mSubdirectory);
setTitle(floater_title);
EDefaultOptions option = DEFAULT_TOP;
LLPresetsManager::getInstance()->setPresetNamesInComboBox(mSubdirectory, mPresetCombo, option);
onPresetNameEdited();
}
void LLFloaterSavePrefPreset::onBtnSave()
{
std::string name = mPresetCombo->getSimple();
if (!LLPresetsManager::getInstance()->savePreset(mSubdirectory, name))
{
LLSD args;
args["NAME"] = name;
LLNotificationsUtil::add("PresetNotSaved", args);
}
closeFloater();
}
void LLFloaterSavePrefPreset::onPresetsListChange()
{
EDefaultOptions option = DEFAULT_TOP;
LLPresetsManager::getInstance()->setPresetNamesInComboBox(mSubdirectory, mPresetCombo, option);
}
void LLFloaterSavePrefPreset::onBtnCancel()
{
closeFloater();
}

View File

@ -0,0 +1,57 @@
/**
* @file llfloatersaveprefpreset.h
* @brief Floater to save a graphics / camera preset
*
* $LicenseInfo:firstyear=2014&license=viewerlgpl$
* Second Life Viewer Source Code
* Copyright (C) 2014, Linden Research, Inc.
*
* 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
*
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
#ifndef LL_LLFLOATERSAVEPREFPRESET_H
#define LL_LLFLOATERSAVEPREFPRESET_H
#include "llfloater.h"
class LLComboBox;
class LLFloaterSavePrefPreset : public LLFloater
{
public:
LLFloaterSavePrefPreset(const LLSD &key);
/*virtual*/ BOOL postBuild();
/*virtual*/ void onOpen(const LLSD& key);
void onBtnSave();
void onBtnCancel();
private:
LLComboBox* mPresetCombo;
LLButton* mSaveButton;
void onPresetsListChange();
void onPresetNameEdited();
std::string mSubdirectory;
};
#endif // LL_LLFLOATERSAVEPREFPRESET_H

View File

@ -1605,7 +1605,7 @@ bool sort_alpha(const LLViewerInventoryCategory* cat1, const LLViewerInventoryCa
void dump_trace(std::string& message, S32 depth, LLError::ELevel log_level)
{
LL_INFOS() << "validate_marketplacelistings : error = "<< log_level << ", depth = " << depth << ", message = " << message << LL_ENDL;
LL_INFOS("SLM") << "validate_marketplacelistings : error = "<< log_level << ", depth = " << depth << ", message = " << message << LL_ENDL;
}
// Make all relevant business logic checks on the marketplace listings starting with the folder as argument.

View File

@ -3127,7 +3127,10 @@ void LLMeshLODHandler::processData(LLCore::BufferArray * /* body */, S32 /* body
LLMeshSkinInfoHandler::~LLMeshSkinInfoHandler()
{
llassert(mProcessed);
if (!mProcessed)
{
LL_WARNS(LOG_MESH) << "deleting unprocessed request handler (may be ok on exit)" << LL_ENDL;
}
}
void LLMeshSkinInfoHandler::processFailure(LLCore::HttpStatus status)
@ -3171,7 +3174,10 @@ void LLMeshSkinInfoHandler::processData(LLCore::BufferArray * /* body */, S32 /*
LLMeshDecompositionHandler::~LLMeshDecompositionHandler()
{
llassert(mProcessed);
if (!mProcessed)
{
LL_WARNS(LOG_MESH) << "deleting unprocessed request handler (may be ok on exit)" << LL_ENDL;
}
}
void LLMeshDecompositionHandler::processFailure(LLCore::HttpStatus status)
@ -3214,7 +3220,10 @@ void LLMeshDecompositionHandler::processData(LLCore::BufferArray * /* body */, S
LLMeshPhysicsShapeHandler::~LLMeshPhysicsShapeHandler()
{
llassert(mProcessed);
if (!mProcessed)
{
LL_WARNS(LOG_MESH) << "deleting unprocessed request handler (may be ok on exit)" << LL_ENDL;
}
}
void LLMeshPhysicsShapeHandler::processFailure(LLCore::HttpStatus status)

View File

@ -218,6 +218,7 @@ BOOL LLMuteList::add(const LLMute& mute, U32 flags)
if ((mute.mType == LLMute::AGENT)
&& isLinden(mute.mName) && (flags & LLMute::flagTextChat || flags == 0))
{
LL_WARNS() << "Trying to mute a Linden; ignored" << LL_ENDL;
LLNotifications::instance().add("MuteLinden", LLSD(), LLSD());
return FALSE;
}
@ -226,6 +227,7 @@ BOOL LLMuteList::add(const LLMute& mute, U32 flags)
if (mute.mType == LLMute::AGENT
&& mute.mID == gAgent.getID())
{
LL_WARNS() << "Trying to self; ignored" << LL_ENDL;
return FALSE;
}
@ -256,6 +258,7 @@ BOOL LLMuteList::add(const LLMute& mute, U32 flags)
}
else
{
LL_INFOS() << "duplicate mute ignored" << LL_ENDL;
// was duplicate
return FALSE;
}

View File

@ -96,13 +96,13 @@ LLNetMap::LLNetMap (const Params & p)
mToolTipMsg(),
mPopupMenu(NULL)
{
mScale = gSavedSettings.getF32("MiniMapScale");
mPixelsPerMeter = mScale / REGION_WIDTH_METERS;
mDotRadius = llmax(DOT_SCALE * mPixelsPerMeter, MIN_DOT_RADIUS);
setScale(gSavedSettings.getF32("MiniMapScale"));
}
LLNetMap::~LLNetMap()
{
gSavedSettings.setF32("MiniMapScale", mScale);
}
BOOL LLNetMap::postBuild()
@ -137,6 +137,8 @@ void LLNetMap::setScale( F32 scale )
mPixelsPerMeter = mScale / REGION_WIDTH_METERS;
mDotRadius = llmax(DOT_SCALE * mPixelsPerMeter, MIN_DOT_RADIUS);
gSavedSettings.setF32("MiniMapScale", mScale);
mUpdateNow = true;
}

View File

@ -113,11 +113,23 @@ bool LLTipHandler::processNotification(const LLNotificationPtr& notification)
LLToast::Params p;
p.notif_id = notification->getID();
p.notification = notification;
p.lifetime_secs = gSavedSettings.getS32("NotificationTipToastLifeTime");
p.panel = notify_box;
p.is_tip = true;
p.can_be_stored = false;
LLDate cur_time = LLDate::now();
LLDate exp_time = notification->getExpiration();
if (exp_time > cur_time)
{
// we have non-default expiration time - keep visible until expires
p.lifetime_secs = exp_time.secondsSinceEpoch() - cur_time.secondsSinceEpoch();
}
else
{
// use default time
p.lifetime_secs = gSavedSettings.getS32("NotificationTipToastLifeTime");
}
LLScreenChannel* channel = dynamic_cast<LLScreenChannel*>(mChannel.get());
if(channel)
channel->addToast(p);

View File

@ -65,6 +65,9 @@ extern LLControlGroup gSavedSettings;
static const LLUUID PARCEL_MEDIA_LIST_ITEM_UUID = LLUUID("CAB5920F-E484-4233-8621-384CF373A321");
static const LLUUID PARCEL_AUDIO_LIST_ITEM_UUID = LLUUID("DF4B020D-8A24-4B95-AB5D-CA970D694822");
const F32 AUTO_CLOSE_FADE_TIME_START= 2.0f;
const F32 AUTO_CLOSE_FADE_TIME_END = 3.0f;
//
// LLPanelNearByMedia
//
@ -227,9 +230,6 @@ void LLPanelNearByMedia::reshape(S32 width, S32 height, BOOL called_from_parent)
}
const F32 AUTO_CLOSE_FADE_TIME_START= 4.0f;
const F32 AUTO_CLOSE_FADE_TIME_END = 5.0f;
/*virtual*/
void LLPanelNearByMedia::draw()
{

View File

@ -0,0 +1,224 @@
/**
* @file llpanelpresetspulldown.cpp
* @brief A panel showing a quick way to pick presets
*
* $LicenseInfo:firstyear=2014&license=viewerlgpl$
* Second Life Viewer Source Code
* Copyright (C) 2014, Linden Research, Inc.
*
* 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
*
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
#include "llviewerprecompiledheaders.h"
#include "llpanelpresetspulldown.h"
#include "llviewercontrol.h"
#include "llstatusbar.h"
#include "llbutton.h"
#include "lltabcontainer.h"
#include "llfloaterreg.h"
#include "llfloaterpreference.h"
#include "llpresetsmanager.h"
#include "llsliderctrl.h"
#include "llscrolllistctrl.h"
/* static */ const F32 LLPanelPresetsPulldown::sAutoCloseFadeStartTimeSec = 2.0f;
/* static */ const F32 LLPanelPresetsPulldown::sAutoCloseTotalTimeSec = 3.0f;
///----------------------------------------------------------------------------
/// Class LLPanelPresetsPulldown
///----------------------------------------------------------------------------
// Default constructor
LLPanelPresetsPulldown::LLPanelPresetsPulldown()
{
mHoverTimer.stop();
mCommitCallbackRegistrar.add("Presets.GoGraphicsPrefs", boost::bind(&LLPanelPresetsPulldown::onGraphicsButtonClick, this, _2));
mCommitCallbackRegistrar.add("Presets.RowClick", boost::bind(&LLPanelPresetsPulldown::onRowClick, this, _2));
buildFromFile( "panel_presets_pulldown.xml");
}
BOOL LLPanelPresetsPulldown::postBuild()
{
LLPresetsManager* presetsMgr = LLPresetsManager::getInstance();
presetsMgr->setPresetListChangeCallback(boost::bind(&LLPanelPresetsPulldown::populatePanel, this));
// Make sure there is a default preference file
presetsMgr->createMissingDefault();
populatePanel();
return LLPanel::postBuild();
}
void LLPanelPresetsPulldown::populatePanel()
{
std::string presets_dir = LLPresetsManager::getInstance()->getPresetsDir(PRESETS_GRAPHIC);
LLPresetsManager::getInstance()->loadPresetNamesFromDir(presets_dir, mPresetNames, DEFAULT_TOP);
LLScrollListCtrl* scroll = getChild<LLScrollListCtrl>("preset_list");
if (scroll && mPresetNames.begin() != mPresetNames.end())
{
scroll->clearRows();
for (std::list<std::string>::const_iterator it = mPresetNames.begin(); it != mPresetNames.end(); ++it)
{
const std::string& name = *it;
LL_DEBUGS() << "adding '" << name << "'" << LL_ENDL;
LLSD row;
row["columns"][0]["column"] = "preset_name";
row["columns"][0]["value"] = name;
bool is_selected_preset = false;
if (name == gSavedSettings.getString("PresetGraphicActive"))
{
row["columns"][1]["column"] = "icon";
row["columns"][1]["type"] = "icon";
row["columns"][1]["value"] = "Check_Mark";
is_selected_preset = true;
}
LLScrollListItem* new_item = scroll->addElement(row);
new_item->setSelected(is_selected_preset);
}
}
}
/*virtual*/
void LLPanelPresetsPulldown::onMouseEnter(S32 x, S32 y, MASK mask)
{
mHoverTimer.stop();
LLPanel::onMouseEnter(x,y,mask);
}
/*virtual*/
void LLPanelPresetsPulldown::onTopLost()
{
setVisible(FALSE);
}
/*virtual*/
BOOL LLPanelPresetsPulldown::handleMouseDown(S32 x, S32 y, MASK mask)
{
LLPanel::handleMouseDown(x,y,mask);
return TRUE;
}
/*virtual*/
BOOL LLPanelPresetsPulldown::handleRightMouseDown(S32 x, S32 y, MASK mask)
{
LLPanel::handleRightMouseDown(x, y, mask);
return TRUE;
}
/*virtual*/
BOOL LLPanelPresetsPulldown::handleDoubleClick(S32 x, S32 y, MASK mask)
{
LLPanel::handleDoubleClick(x, y, mask);
return TRUE;
}
/*virtual*/
void LLPanelPresetsPulldown::onMouseLeave(S32 x, S32 y, MASK mask)
{
mHoverTimer.start();
LLPanel::onMouseLeave(x,y,mask);
}
/*virtual*/
void LLPanelPresetsPulldown::onVisibilityChange ( BOOL new_visibility )
{
if (new_visibility)
{
mHoverTimer.start(); // timer will be stopped when mouse hovers over panel
}
else
{
mHoverTimer.stop();
}
}
void LLPanelPresetsPulldown::onRowClick(const LLSD& user_data)
{
LLScrollListCtrl* scroll = getChild<LLScrollListCtrl>("preset_list");
if (scroll)
{
LLScrollListItem* item = scroll->getFirstSelected();
if (item)
{
std::string name = item->getColumn(1)->getValue().asString();
LL_DEBUGS() << "selected '" << name << "'" << LL_ENDL;
LLPresetsManager::getInstance()->loadPreset(PRESETS_GRAPHIC, name);
setVisible(FALSE);
}
else
{
LL_DEBUGS() << "none selected" << LL_ENDL;
}
}
else
{
LL_DEBUGS() << "no scroll" << LL_ENDL;
}
}
void LLPanelPresetsPulldown::onGraphicsButtonClick(const LLSD& user_data)
{
// close the minicontrol, we're bringing up the big one
setVisible(FALSE);
// bring up the prefs floater
LLFloater* prefsfloater = LLFloaterReg::showInstance("preferences");
if (prefsfloater)
{
// grab the 'graphics' panel from the preferences floater and
// bring it the front!
LLTabContainer* tabcontainer = prefsfloater->getChild<LLTabContainer>("pref core");
LLPanel* graphicspanel = prefsfloater->getChild<LLPanel>("display");
if (tabcontainer && graphicspanel)
{
tabcontainer->selectTabPanel(graphicspanel);
}
}
}
//virtual
void LLPanelPresetsPulldown::draw()
{
F32 alpha = mHoverTimer.getStarted()
? clamp_rescale(mHoverTimer.getElapsedTimeF32(), sAutoCloseFadeStartTimeSec, sAutoCloseTotalTimeSec, 1.f, 0.f)
: 1.0f;
LLViewDrawContext context(alpha);
LLPanel::draw();
if (alpha == 0.f)
{
setVisible(FALSE);
}
}

View File

@ -0,0 +1,62 @@
/**
* @file llpanelpresetspulldown.h
* @brief A panel showing a quick way to pick presets
*
* $LicenseInfo:firstyear=2014&license=viewerlgpl$
* Second Life Viewer Source Code
* Copyright (C) 2014, Linden Research, Inc.
*
* 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
*
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
#ifndef LL_LLPANELPRESETSPULLDOWN_H
#define LL_LLPANELPRESETSPULLDOWN_H
#include "linden_common.h"
#include "llpanel.h"
class LLFrameTimer;
class LLPanelPresetsPulldown : public LLPanel
{
public:
LLPanelPresetsPulldown();
/*virtual*/ void draw();
/*virtual*/ void onMouseEnter(S32 x, S32 y, MASK mask);
/*virtual*/ void onMouseLeave(S32 x, S32 y, MASK mask);
/*virtual*/ BOOL handleMouseDown(S32 x, S32 y, MASK mask);
/*virtual*/ BOOL handleRightMouseDown(S32 x, S32 y, MASK mask);
/*virtual*/ BOOL handleDoubleClick(S32 x, S32 y, MASK mask);
/*virtual*/ void onTopLost();
/*virtual*/ void onVisibilityChange ( BOOL new_visibility );
/*virtual*/ BOOL postBuild();
void populatePanel();
private:
void onGraphicsButtonClick(const LLSD& user_data);
void onRowClick(const LLSD& user_data);
std::list<std::string> mPresetNames;
LLFrameTimer mHoverTimer;
static const F32 sAutoCloseFadeStartTimeSec;
static const F32 sAutoCloseTotalTimeSec;
LOG_CLASS(LLPanelPresetsPulldown);
};
#endif // LL_LLPANELPRESETSPULLDOWN_H

View File

@ -168,7 +168,7 @@ public:
{
if (params.size() > 2)
{
const std::string object_name = params[2].asString();
const std::string object_name = LLURI::unescape(params[2].asString());
LLMute mute(avatar_id, object_name, LLMute::OBJECT);
LLMuteList::getInstance()->add(mute);
LLPanelBlockedList::showPanelAndSelect(mute.mID);

View File

@ -40,8 +40,8 @@
#include "llfloaterpreference.h"
#include "llsliderctrl.h"
/* static */ const F32 LLPanelVolumePulldown::sAutoCloseFadeStartTimeSec = 4.0f;
/* static */ const F32 LLPanelVolumePulldown::sAutoCloseTotalTimeSec = 5.0f;
/* static */ const F32 LLPanelVolumePulldown::sAutoCloseFadeStartTimeSec = 2.0f;
/* static */ const F32 LLPanelVolumePulldown::sAutoCloseTotalTimeSec = 3.0f;
///----------------------------------------------------------------------------
/// Class LLPanelVolumePulldown

View File

@ -0,0 +1,320 @@
/**
* @file llpresetsmanager.cpp
* @brief Implementation for the LLPresetsManager class.
*
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
* Second Life Viewer Source Code
* Copyright (C) 2010, Linden Research, Inc.
*
* 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
*
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
#include "llviewerprecompiledheaders.h"
#include <boost/assign/list_of.hpp>
#include "llpresetsmanager.h"
#include "lldiriterator.h"
#include "llfloater.h"
#include "llsdserialize.h"
#include "lltrans.h"
#include "lluictrlfactory.h"
#include "llviewercontrol.h"
#include "llfloaterpreference.h"
#include "llfloaterreg.h"
LLPresetsManager::LLPresetsManager()
{
}
LLPresetsManager::~LLPresetsManager()
{
}
void LLPresetsManager::triggerChangeSignal()
{
mPresetListChangeSignal();
}
void LLPresetsManager::createMissingDefault()
{
std::string default_file = gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, PRESETS_DIR, PRESETS_GRAPHIC, PRESETS_DEFAULT + ".xml");
if (!gDirUtilp->fileExists(default_file))
{
LL_INFOS() << "No default preset found -- creating one at " << default_file << LL_ENDL;
// Write current graphic settings as the default
savePreset(PRESETS_GRAPHIC, PRESETS_DEFAULT);
}
else
{
LL_DEBUGS() << "default preset exists; no-op" << LL_ENDL;
}
}
std::string LLPresetsManager::getPresetsDir(const std::string& subdirectory)
{
std::string presets_path = gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, PRESETS_DIR);
std::string full_path;
if (!gDirUtilp->fileExists(presets_path))
{
LLFile::mkdir(presets_path);
}
full_path = gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, PRESETS_DIR, subdirectory);
if (!gDirUtilp->fileExists(full_path))
{
LLFile::mkdir(full_path);
}
return full_path;
}
void LLPresetsManager::loadPresetNamesFromDir(const std::string& dir, preset_name_list_t& presets, EDefaultOptions default_option)
{
LL_INFOS("AppInit") << "Loading list of preset names from " << dir << LL_ENDL;
mPresetNames.clear();
LLDirIterator dir_iter(dir, "*.xml");
bool found = true;
while (found)
{
std::string file;
found = dir_iter.next(file);
if (found)
{
std::string path = gDirUtilp->add(dir, file);
std::string name = gDirUtilp->getBaseFileName(LLURI::unescape(path), /*strip_exten = */ true);
LL_DEBUGS() << " Found preset '" << name << "'" << LL_ENDL;
if (PRESETS_DEFAULT != name)
{
mPresetNames.push_back(name);
}
else
{
switch (default_option)
{
case DEFAULT_SHOW:
mPresetNames.push_back(LLTrans::getString(PRESETS_DEFAULT));
break;
case DEFAULT_TOP:
mPresetNames.push_front(LLTrans::getString(PRESETS_DEFAULT));
break;
case DEFAULT_HIDE:
default:
break;
}
}
}
}
presets = mPresetNames;
}
bool LLPresetsManager::savePreset(const std::string& subdirectory, std::string name)
{
if (LLTrans::getString(PRESETS_DEFAULT) == name)
{
name = PRESETS_DEFAULT;
}
bool saved = false;
std::vector<std::string> name_list;
if(PRESETS_GRAPHIC == subdirectory)
{
gSavedSettings.setString("PresetGraphicActive", name);
LLFloaterPreference* instance = LLFloaterReg::findTypedInstance<LLFloaterPreference>("preferences");
if (instance)
{
instance->getControlNames(name_list);
LL_DEBUGS() << "saving preset '" << name << "'; " << name_list.size() << " names" << LL_ENDL;
name_list.push_back("PresetGraphicActive");
}
else
{
LL_WARNS() << "preferences floater instance not found" << LL_ENDL;
}
}
else if(PRESETS_CAMERA == subdirectory)
{
name_list = boost::assign::list_of
("Placeholder");
}
else
{
LL_ERRS() << "Invalid presets directory '" << subdirectory << "'" << LL_ENDL;
}
if (name_list.size() > 1) // if the active preset name is the only thing in the list, don't save the list
{
// make an empty llsd
LLSD paramsData(LLSD::emptyMap());
for (std::vector<std::string>::iterator it = name_list.begin(); it != name_list.end(); ++it)
{
std::string ctrl_name = *it;
LLControlVariable* ctrl = gSavedSettings.getControl(ctrl_name).get();
std::string comment = ctrl->getComment();
std::string type = gSavedSettings.typeEnumToString(ctrl->type());
LLSD value = ctrl->getValue();
paramsData[ctrl_name]["Comment"] = comment;
paramsData[ctrl_name]["Persist"] = 1;
paramsData[ctrl_name]["Type"] = type;
paramsData[ctrl_name]["Value"] = value;
}
std::string pathName(getPresetsDir(subdirectory) + gDirUtilp->getDirDelimiter() + LLURI::escape(name) + ".xml");
// write to file
llofstream presetsXML(pathName.c_str());
if (presetsXML.is_open())
{
LLPointer<LLSDFormatter> formatter = new LLSDXMLFormatter();
formatter->format(paramsData, presetsXML, LLSDFormatter::OPTIONS_PRETTY);
presetsXML.close();
saved = true;
LL_DEBUGS() << "saved preset '" << name << "'; " << paramsData.size() << " parameters" << LL_ENDL;
gSavedSettings.setString("PresetGraphicActive", name);
// signal interested parties
triggerChangeSignal();
}
else
{
LL_WARNS("Presets") << "Cannot open for output preset file " << pathName << LL_ENDL;
}
}
else
{
LL_INFOS() << "No settings found; preferences floater has not yet been created" << LL_ENDL;
}
return saved;
}
void LLPresetsManager::setPresetNamesInComboBox(const std::string& subdirectory, LLComboBox* combo, EDefaultOptions default_option)
{
combo->clearRows();
std::string presets_dir = getPresetsDir(subdirectory);
if (!presets_dir.empty())
{
std::list<std::string> preset_names;
loadPresetNamesFromDir(presets_dir, preset_names, default_option);
std::string preset_graphic_active = gSavedSettings.getString("PresetGraphicActive");
if (preset_names.begin() != preset_names.end())
{
for (std::list<std::string>::const_iterator it = preset_names.begin(); it != preset_names.end(); ++it)
{
const std::string& name = *it;
combo->add(name, LLSD().with(0, name));
}
}
else
{
combo->setLabel(LLTrans::getString("preset_combo_label"));
}
}
}
void LLPresetsManager::loadPreset(const std::string& subdirectory, std::string name)
{
if (LLTrans::getString(PRESETS_DEFAULT) == name)
{
name = PRESETS_DEFAULT;
}
std::string full_path(getPresetsDir(subdirectory) + gDirUtilp->getDirDelimiter() + LLURI::escape(name) + ".xml");
LL_DEBUGS() << "attempting to load preset '"<<name<<"' from '"<<full_path<<"'" << LL_ENDL;
if(gSavedSettings.loadFromFile(full_path, false, true) > 0)
{
if(PRESETS_GRAPHIC == subdirectory)
{
gSavedSettings.setString("PresetGraphicActive", name);
}
LLFloaterPreference* instance = LLFloaterReg::findTypedInstance<LLFloaterPreference>("preferences");
if (instance)
{
instance->refreshEnabledGraphics();
}
triggerChangeSignal();
}
else
{
LL_WARNS() << "failed to load preset '"<<name<<"' from '"<<full_path<<"'" << LL_ENDL;
}
}
bool LLPresetsManager::deletePreset(const std::string& subdirectory, std::string name)
{
if (LLTrans::getString(PRESETS_DEFAULT) == name)
{
name = PRESETS_DEFAULT;
}
bool sts = true;
if (PRESETS_DEFAULT == name)
{
// This code should never execute
LL_WARNS("Presets") << "You are not allowed to delete the default preset." << LL_ENDL;
sts = false;
}
if (gDirUtilp->deleteFilesInDir(getPresetsDir(subdirectory), LLURI::escape(name) + ".xml") < 1)
{
LL_WARNS("Presets") << "Error removing preset " << name << " from disk" << LL_ENDL;
sts = false;
}
// If you delete the preset that is currently marked as loaded then also indicate that no preset is loaded.
if (gSavedSettings.getString("PresetGraphicActive") == name)
{
gSavedSettings.setString("PresetGraphicActive", "");
}
// signal interested parties
triggerChangeSignal();
return sts;
}
boost::signals2::connection LLPresetsManager::setPresetListChangeCallback(const preset_list_signal_t::slot_type& cb)
{
return mPresetListChangeSignal.connect(cb);
}

View File

@ -0,0 +1,79 @@
/**
* @file llpresetsmanager.h
* @brief Implementation for the LLPresetsManager class.
*
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
* Second Life Viewer Source Code
* Copyright (C) 2010, Linden Research, Inc.
*
* 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
*
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
#ifndef LL_PRESETSMANAGER_H
#define LL_PRESETSMANAGER_H
#include "llcombobox.h"
#include <list>
#include <map>
static const std::string PRESETS_DEFAULT = "Default";
static const std::string PRESETS_DIR = "presets";
static const std::string PRESETS_GRAPHIC = "graphic";
static const std::string PRESETS_CAMERA = "camera";
enum EDefaultOptions
{
DEFAULT_SHOW,
DEFAULT_TOP,
DEFAULT_HIDE // Do not display "Default" in a list
};
class LLPresetsManager : public LLSingleton<LLPresetsManager>
{
public:
typedef std::list<std::string> preset_name_list_t;
typedef boost::signals2::signal<void()> preset_list_signal_t;
void createMissingDefault();
void triggerChangeSignal();
static std::string getPresetsDir(const std::string& subdirectory);
void setPresetNamesInComboBox(const std::string& subdirectory, LLComboBox* combo, EDefaultOptions default_option);
void loadPresetNamesFromDir(const std::string& dir, preset_name_list_t& presets, EDefaultOptions default_option);
bool savePreset(const std::string& subdirectory, std::string name);
void loadPreset(const std::string& subdirectory, std::string name);
bool deletePreset(const std::string& subdirectory, std::string name);
// Emitted when a preset gets loaded, deleted, or saved.
boost::signals2::connection setPresetListChangeCallback(const preset_list_signal_t::slot_type& cb);
// Emitted when a preset gets loaded or saved.
preset_name_list_t mPresetNames;
LLPresetsManager();
~LLPresetsManager();
preset_list_signal_t mPresetListChangeSignal;
private:
LOG_CLASS(LLPresetsManager);
};
#endif // LL_PRESETSMANAGER_H

View File

@ -862,10 +862,7 @@ void LLSpatialGroup::handleDestruction(const TreeNode* node)
{
if (bridge->mAvatar.notNull())
{
bridge->mAvatar->mAttachmentGeometryBytes -= mGeometryBytes;
bridge->mAvatar->mAttachmentGeometryBytes = llmax(bridge->mAvatar->mAttachmentGeometryBytes, 0);
bridge->mAvatar->mAttachmentSurfaceArea -= mSurfaceArea;
bridge->mAvatar->mAttachmentSurfaceArea = llmax(bridge->mAvatar->mAttachmentSurfaceArea, 0.f);
bridge->mAvatar->subtractAttachmentArea(mSurfaceArea );
}
}

View File

@ -38,6 +38,7 @@
#include "llfloaterbuycurrency.h"
#include "llbuycurrencyhtml.h"
#include "llpanelnearbymedia.h"
#include "llpanelpresetspulldown.h"
#include "llpanelvolumepulldown.h"
#include "llfloaterregioninfo.h"
#include "llfloaterscriptdebug.h"
@ -170,6 +171,9 @@ BOOL LLStatusBar::postBuild()
mBtnStats = getChildView("stat_btn");
mIconPresets = getChild<LLIconCtrl>( "presets_icon" );
mIconPresets->setMouseEnterCallback(boost::bind(&LLStatusBar::onMouseEnterPresets, this));
mBtnVolume = getChild<LLButton>( "volume_btn" );
mBtnVolume->setClickedCallback( onClickVolume, this );
mBtnVolume->setMouseEnterCallback(boost::bind(&LLStatusBar::onMouseEnterVolume, this));
@ -223,6 +227,11 @@ BOOL LLStatusBar::postBuild()
mSGPacketLoss = LLUICtrlFactory::create<LLStatGraph>(pgp);
addChild(mSGPacketLoss);
mPanelPresetsPulldown = new LLPanelPresetsPulldown();
addChild(mPanelPresetsPulldown);
mPanelPresetsPulldown->setFollows(FOLLOWS_TOP|FOLLOWS_RIGHT);
mPanelPresetsPulldown->setVisible(FALSE);
mPanelVolumePulldown = new LLPanelVolumePulldown();
addChild(mPanelVolumePulldown);
mPanelVolumePulldown->setFollows(FOLLOWS_TOP|FOLLOWS_RIGHT);
@ -316,6 +325,7 @@ void LLStatusBar::setVisibleForMouselook(bool visible)
mSGBandwidth->setVisible(visible);
mSGPacketLoss->setVisible(visible);
setBackgroundVisible(visible);
mIconPresets->setVisible(visible);
}
void LLStatusBar::debitBalance(S32 debit)
@ -460,8 +470,32 @@ void LLStatusBar::onClickBuyCurrency()
LLFirstUse::receiveLindens(false);
}
void LLStatusBar::onMouseEnterPresets()
{
LLView* popup_holder = gViewerWindow->getRootView()->getChildView("popup_holder");
LLIconCtrl* icon = getChild<LLIconCtrl>( "presets_icon" );
LLRect icon_rect = icon->getRect();
LLRect pulldown_rect = mPanelPresetsPulldown->getRect();
pulldown_rect.setLeftTopAndSize(icon_rect.mLeft -
(pulldown_rect.getWidth() - icon_rect.getWidth()),
icon_rect.mBottom,
pulldown_rect.getWidth(),
pulldown_rect.getHeight());
pulldown_rect.translate(popup_holder->getRect().getWidth() - pulldown_rect.mRight, 0);
mPanelPresetsPulldown->setShape(pulldown_rect);
// show the master presets pull-down
LLUI::clearPopups();
LLUI::addPopup(mPanelPresetsPulldown);
mPanelNearByMedia->setVisible(FALSE);
mPanelVolumePulldown->setVisible(FALSE);
mPanelPresetsPulldown->setVisible(TRUE);
}
void LLStatusBar::onMouseEnterVolume()
{
LLView* popup_holder = gViewerWindow->getRootView()->getChildView("popup_holder");
LLButton* volbtn = getChild<LLButton>( "volume_btn" );
LLRect vol_btn_rect = volbtn->getRect();
LLRect volume_pulldown_rect = mPanelVolumePulldown->getRect();
@ -471,12 +505,14 @@ void LLStatusBar::onMouseEnterVolume()
volume_pulldown_rect.getWidth(),
volume_pulldown_rect.getHeight());
volume_pulldown_rect.translate(popup_holder->getRect().getWidth() - volume_pulldown_rect.mRight, 0);
mPanelVolumePulldown->setShape(volume_pulldown_rect);
// show the master volume pull-down
LLUI::clearPopups();
LLUI::addPopup(mPanelVolumePulldown);
mPanelPresetsPulldown->setVisible(FALSE);
mPanelNearByMedia->setVisible(FALSE);
mPanelVolumePulldown->setVisible(TRUE);
}
@ -500,6 +536,7 @@ void LLStatusBar::onMouseEnterNearbyMedia()
LLUI::clearPopups();
LLUI::addPopup(mPanelNearByMedia);
mPanelPresetsPulldown->setVisible(FALSE);
mPanelVolumePulldown->setVisible(FALSE);
mPanelNearByMedia->setVisible(TRUE);
}

View File

@ -41,8 +41,10 @@ class LLUICtrl;
class LLUUID;
class LLFrameTimer;
class LLStatGraph;
class LLPanelPresetsPulldown;
class LLPanelVolumePulldown;
class LLPanelNearByMedia;
class LLIconCtrl;
class LLStatusBar
: public LLPanel
@ -89,6 +91,7 @@ private:
void onClickBuyCurrency();
void onVolumeChanged(const LLSD& newvalue);
void onMouseEnterPresets();
void onMouseEnterVolume();
void onMouseEnterNearbyMedia();
void onClickScreen(S32 x, S32 y);
@ -103,6 +106,7 @@ private:
LLStatGraph *mSGPacketLoss;
LLView *mBtnStats;
LLIconCtrl *mIconPresets;
LLButton *mBtnVolume;
LLTextBox *mBoxBalance;
LLButton *mMediaToggle;
@ -115,6 +119,7 @@ private:
S32 mSquareMetersCommitted;
LLFrameTimer* mBalanceTimer;
LLFrameTimer* mHealthTimer;
LLPanelPresetsPulldown* mPanelPresetsPulldown;
LLPanelVolumePulldown* mPanelVolumePulldown;
LLPanelNearByMedia* mPanelNearByMedia;
};

View File

@ -167,11 +167,6 @@ static bool handleRenderPerfTestChanged(const LLSD& newvalue)
return true;
}
bool handleRenderAvatarComplexityLimitChanged(const LLSD& newvalue)
{
return true;
}
bool handleRenderTransparentWaterChanged(const LLSD& newvalue)
{
LLWorld::getInstance()->updateWaterObjects();
@ -224,12 +219,6 @@ static bool handleAvatarPhysicsLODChanged(const LLSD& newvalue)
return true;
}
static bool handleAvatarMaxVisibleChanged(const LLSD& newvalue)
{
LLVOAvatar::sMaxVisible = (U32) newvalue.asInteger();
return true;
}
static bool handleTerrainLODChanged(const LLSD& newvalue)
{
LLVOSurfacePatch::sLODFactor = (F32)newvalue.asReal();
@ -423,12 +412,6 @@ static bool handleRenderBumpChanged(const LLSD& newval)
return true;
}
static bool handleRenderUseImpostorsChanged(const LLSD& newvalue)
{
LLVOAvatar::sUseImpostors = newvalue.asBoolean();
return true;
}
static bool handleRenderDebugGLChanged(const LLSD& newvalue)
{
gDebugGL = newvalue.asBoolean() || gDebugSession;
@ -635,8 +618,6 @@ void settings_setup_listeners()
gSavedSettings.getControl("RenderAvatarCloth")->getSignal()->connect(boost::bind(&handleSetShaderChanged, _2));
gSavedSettings.getControl("WindLightUseAtmosShaders")->getSignal()->connect(boost::bind(&handleSetShaderChanged, _2));
gSavedSettings.getControl("RenderGammaFull")->getSignal()->connect(boost::bind(&handleSetShaderChanged, _2));
gSavedSettings.getControl("RenderAvatarMaxVisible")->getSignal()->connect(boost::bind(&handleAvatarMaxVisibleChanged, _2));
gSavedSettings.getControl("RenderAvatarComplexityLimit")->getSignal()->connect(boost::bind(&handleRenderAvatarComplexityLimitChanged, _2));
gSavedSettings.getControl("RenderVolumeLODFactor")->getSignal()->connect(boost::bind(&handleVolumeLODChanged, _2));
gSavedSettings.getControl("RenderAvatarLODFactor")->getSignal()->connect(boost::bind(&handleAvatarLODChanged, _2));
gSavedSettings.getControl("RenderAvatarPhysicsLODFactor")->getSignal()->connect(boost::bind(&handleAvatarPhysicsLODChanged, _2));
@ -654,7 +635,6 @@ void settings_setup_listeners()
gSavedSettings.getControl("RenderObjectBump")->getSignal()->connect(boost::bind(&handleRenderBumpChanged, _2));
gSavedSettings.getControl("RenderMaxVBOSize")->getSignal()->connect(boost::bind(&handleResetVertexBuffersChanged, _2));
gSavedSettings.getControl("RenderDeferredNoise")->getSignal()->connect(boost::bind(&handleReleaseGLBufferChanged, _2));
gSavedSettings.getControl("RenderUseImpostors")->getSignal()->connect(boost::bind(&handleRenderUseImpostorsChanged, _2));
gSavedSettings.getControl("RenderDebugGL")->getSignal()->connect(boost::bind(&handleRenderDebugGLChanged, _2));
gSavedSettings.getControl("RenderDebugPipeline")->getSignal()->connect(boost::bind(&handleRenderDebugPipelineChanged, _2));
gSavedSettings.getControl("RenderResolutionDivisor")->getSignal()->connect(boost::bind(&handleRenderResolutionDivisorChanged, _2));

View File

@ -55,6 +55,7 @@
#include "llfloaterconversationlog.h"
#include "llfloaterconversationpreview.h"
#include "llfloaterdeleteenvpreset.h"
#include "llfloaterdeleteprefpreset.h"
#include "llfloaterdestinations.h"
#include "llfloaterdisplayname.h"
#include "llfloatereditdaycycle.h"
@ -71,7 +72,6 @@
#include "llfloatergesture.h"
#include "llfloatergodtools.h"
#include "llfloatergroups.h"
#include "llfloaterhardwaresettings.h"
#include "llfloaterhelpbrowser.h"
#include "llfloaterhoverheight.h"
#include "llfloaterhud.h"
@ -83,6 +83,7 @@
#include "llfloaterlagmeter.h"
#include "llfloaterland.h"
#include "llfloaterlandholdings.h"
#include "llfloaterloadprefpreset.h"
#include "llfloatermap.h"
#include "llfloatermarketplacelistings.h"
#include "llfloatermediasettings.h"
@ -106,6 +107,7 @@
#include "llfloaterregioninfo.h"
#include "llfloaterregionrestarting.h"
#include "llfloaterreporter.h"
#include "llfloatersaveprefpreset.h"
#include "llfloatersceneloadstats.h"
#include "llfloaterscriptdebug.h"
#include "llfloaterscriptedprefs.h"
@ -211,6 +213,7 @@ void LLViewerFloaterReg::registerFloaters()
LLFloaterReg::add("compile_queue", "floater_script_queue.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterCompileQueue>);
LLFloaterReg::add("conversation", "floater_conversation_log.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterConversationLog>);
LLFloaterReg::add("delete_pref_preset", "floater_delete_pref_preset.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterDeletePrefPreset>);
LLFloaterReg::add("destinations", "floater_destinations.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterDestinations>);
LLFloaterReg::add("env_post_process", "floater_post_process.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterPostProcess>);
@ -252,6 +255,7 @@ void LLViewerFloaterReg::registerFloaters()
LLFloaterReg::add("lagmeter", "floater_lagmeter.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterLagMeter>);
LLFloaterReg::add("land_holdings", "floater_land_holdings.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterLandHoldings>);
LLFloaterReg::add("load_pref_preset", "floater_load_pref_preset.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterLoadPrefPreset>);
LLFloaterReg::add("mem_leaking", "floater_mem_leaking.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterMemLeak>);
@ -285,8 +289,8 @@ void LLViewerFloaterReg::registerFloaters()
LLFloaterReg::add("perms_default", "floater_perms_default.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterPermsDefault>);
LLFloaterReg::add("places", "floater_places.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterSidePanelContainer>);
LLFloaterReg::add("preferences", "floater_preferences.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterPreference>);
LLFloaterReg::add("prefs_graphics_advanced", "floater_preferences_graphics_advanced.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterPreferenceGraphicsAdvanced>);
LLFloaterReg::add("prefs_proxy", "floater_preferences_proxy.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterPreferenceProxy>);
LLFloaterReg::add("prefs_hardware_settings", "floater_hardware_settings.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterHardwareSettings>);
LLFloaterReg::add("prefs_spellchecker_import", "floater_spellcheck_import.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterSpellCheckerImport>);
LLFloaterReg::add("prefs_translation", "floater_translation_settings.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterTranslationSettings>);
LLFloaterReg::add("prefs_spellchecker", "floater_spellcheck.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterSpellCheckerSettings>);
@ -303,6 +307,7 @@ void LLViewerFloaterReg::registerFloaters()
LLFloaterReg::add("preview_texture", "floater_preview_texture.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLPreviewTexture>, "preview");
LLFloaterReg::add("properties", "floater_inventory_item_properties.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterProperties>);
LLFloaterReg::add("publish_classified", "floater_publish_classified.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLPublishClassifiedFloater>);
LLFloaterReg::add("save_pref_preset", "floater_save_pref_preset.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterSavePrefPreset>);
LLFloaterReg::add("script_colors", "floater_script_ed_prefs.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterScriptEdPrefs>);
LLFloaterReg::add("telehubs", "floater_telehub.xml",&LLFloaterReg::build<LLFloaterTelehub>);

View File

@ -1041,10 +1041,6 @@ U32 info_display_from_string(std::string info_display)
{
return LLPipeline::RENDER_DEBUG_TEXTURE_PRIORITY;
}
else if ("shame" == info_display)
{
return LLPipeline::RENDER_DEBUG_SHAME;
}
else if ("texture area" == info_display)
{
return LLPipeline::RENDER_DEBUG_TEXTURE_AREA;
@ -1073,9 +1069,9 @@ U32 info_display_from_string(std::string info_display)
{
return LLPipeline::RENDER_DEBUG_COMPOSITION;
}
else if ("attachment bytes" == info_display)
else if ("avatardrawinfo" == info_display)
{
return LLPipeline::RENDER_DEBUG_ATTACHMENT_BYTES;
return (LLPipeline::RENDER_DEBUG_AVATAR_DRAW_INFO);
}
else if ("glow" == info_display)
{
@ -1111,6 +1107,7 @@ U32 info_display_from_string(std::string info_display)
}
else
{
LL_WARNS() << "unrecognized feature name '" << info_display << "'" << LL_ENDL;
return 0;
}
};
@ -2929,6 +2926,8 @@ BOOL enable_object_build(void*)
bool enable_object_edit()
{
if (!isAgentAvatarValid()) return false;
// *HACK: The new "prelude" Help Islands have a build sandbox area,
// so users need the Edit and Create pie menu options when they are
// there. Eventually this needs to be replaced with code that only
@ -3089,11 +3088,11 @@ class LLAvatarCheckImpostorMode : public view_listener_t
switch (mode)
{
case 0:
return (avatar->getVisualMuteSettings() == LLVOAvatar::VISUAL_MUTE_NOT_SET);
return (avatar->getVisualMuteSettings() == LLVOAvatar::AV_RENDER_NORMALLY);
case 1:
return (avatar->getVisualMuteSettings() == LLVOAvatar::ALWAYS_VISUAL_MUTE);
return (avatar->getVisualMuteSettings() == LLVOAvatar::AV_DO_NOT_RENDER);
case 2:
return (avatar->getVisualMuteSettings() == LLVOAvatar::NEVER_VISUAL_MUTE);
return (avatar->getVisualMuteSettings() == LLVOAvatar::AV_ALWAYS_RENDER);
default:
return false;
}
@ -3115,19 +3114,18 @@ class LLAvatarSetImpostorMode : public view_listener_t
switch (mode)
{
case 0:
avatar->setVisualMuteSettings(LLVOAvatar::VISUAL_MUTE_NOT_SET);
avatar->setVisualMuteSettings(LLVOAvatar::AV_RENDER_NORMALLY);
break;
case 1:
avatar->setVisualMuteSettings(LLVOAvatar::ALWAYS_VISUAL_MUTE);
avatar->setVisualMuteSettings(LLVOAvatar::AV_DO_NOT_RENDER);
break;
case 2:
avatar->setVisualMuteSettings(LLVOAvatar::NEVER_VISUAL_MUTE);
avatar->setVisualMuteSettings(LLVOAvatar::AV_ALWAYS_RENDER);
break;
default:
return false;
}
avatar->forceUpdateVisualMuteSettings();
LLVOAvatar::cullAvatarsByPixelArea();
return true;
} // handleEvent()
@ -3147,6 +3145,8 @@ class LLObjectMute : public view_listener_t
LLVOAvatar* avatar = find_avatar_from_object(object);
if (avatar)
{
avatar->mNeedsImpostorUpdate = TRUE;
id = avatar->getID();
LLNameValue *firstname = avatar->getNVPair("FirstName");

View File

@ -2428,7 +2428,7 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)
buffer = message;
LL_INFOS("Messaging") << "process_improved_im: session_id( " << session_id << " ), from_id( " << from_id << " )" << LL_ENDL;
LL_DEBUGS("Messaging") << "session_id( " << session_id << " ), from_id( " << from_id << " )" << LL_ENDL;
// add to IM panel, but do not bother the user
gIMMgr->addMessage(
@ -2477,7 +2477,7 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)
}
buffer = saved + message;
LL_INFOS("Messaging") << "process_improved_im: session_id( " << session_id << " ), from_id( " << from_id << " )" << LL_ENDL;
LL_DEBUGS("Messaging") << "session_id( " << session_id << " ), from_id( " << from_id << " )" << LL_ENDL;
bool mute_im = is_muted;
if(accept_im_from_only_friend && !is_friend && !is_linden)
@ -2942,7 +2942,7 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)
buffer = message;
LL_INFOS("Messaging") << "process_improved_im: session_id( " << session_id << " ), from_id( " << from_id << " )" << LL_ENDL;
LL_DEBUGS("Messaging") << "message in dnd; session_id( " << session_id << " ), from_id( " << from_id << " )" << LL_ENDL;
// add to IM panel, but do not bother the user
gIMMgr->addMessage(
@ -2969,7 +2969,7 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)
buffer = saved + message;
LL_INFOS("Messaging") << "process_improved_im: session_id( " << session_id << " ), from_id( " << from_id << " )" << LL_ENDL;
LL_DEBUGS("Messaging") << "standard message session_id( " << session_id << " ), from_id( " << from_id << " )" << LL_ENDL;
gIMMgr->addMessage(
session_id,

View File

@ -5048,7 +5048,7 @@ void LLViewerObject::updateText()
{
mText->setHidden(avatar->isInMuteList());
}
LLVector3 up_offset(0,0,0);
up_offset.mV[2] = getScale().mV[VZ]*0.6f;

View File

@ -39,6 +39,7 @@
#include "llworld.h"
#include "pipeline.h"
#include "llspatialpartition.h"
#include "llvoavatarself.h"
#include "llvovolume.h"
const F32 PART_SIM_BOX_SIDE = 16.f;
@ -703,16 +704,24 @@ void LLViewerPartSim::updateSimulation()
if (!mViewerPartSources[i]->isDead())
{
BOOL upd = TRUE;
if (!LLPipeline::sRenderAttachedParticles)
LLViewerObject* vobj = mViewerPartSources[i]->mSourceObjectp;
if (vobj && vobj->isAvatar() && ((LLVOAvatar*)vobj)->isInMuteList())
{
LLViewerObject* vobj = mViewerPartSources[i]->mSourceObjectp;
if (vobj && (vobj->getPCode() == LL_PCODE_VOLUME))
upd = FALSE;
}
if (upd && vobj && (vobj->getPCode() == LL_PCODE_VOLUME))
{
if(vobj->getAvatar() && vobj->getAvatar()->isTooComplex())
{
LLVOVolume* vvo = (LLVOVolume *)vobj;
if (vvo && vvo->isAttachment())
{
upd = FALSE;
}
upd = FALSE;
}
LLVOVolume* vvo = (LLVOVolume *)vobj;
if (!LLPipeline::sRenderAttachedParticles && vvo && vvo->isAttachment())
{
upd = FALSE;
}
}

View File

@ -475,8 +475,7 @@ LLViewerRegion::LLViewerRegion(const U64 &handle,
mImpl->mObjectPartition.push_back(NULL); //PARTITION_NONE
mImpl->mVOCachePartition = getVOCachePartition();
mRenderInfoRequestTimer.resetWithExpiry(0.f); // Set timer to be expired
setCapabilitiesReceivedCallback(boost::bind(&LLAvatarRenderInfoAccountant::expireRenderInfoReportTimer, _1));
setCapabilitiesReceivedCallback(boost::bind(&LLAvatarRenderInfoAccountant::scanNewRegion, _1));
}

View File

@ -438,7 +438,8 @@ public:
static BOOL sVOCacheCullingEnabled; //vo cache culling enabled or not.
static S32 sLastCameraUpdated;
LLFrameTimer & getRenderInfoRequestTimer() { return mRenderInfoRequestTimer; };
LLFrameTimer & getRenderInfoRequestTimer() { return mRenderInfoRequestTimer; };
LLFrameTimer & getRenderInfoReportTimer() { return mRenderInfoReportTimer; };
struct CompareRegionByLastUpdate
{
@ -547,6 +548,7 @@ private:
// the materials capability throttle
LLFrameTimer mMaterialsCapThrottleTimer;
LLFrameTimer mRenderInfoRequestTimer;
LLFrameTimer mRenderInfoReportTimer;
};
inline BOOL LLViewerRegion::getRegionProtocol(U64 protocol) const

View File

@ -677,14 +677,13 @@ public:
{
LLVOAvatar* avatar = av_iter->second;
avatar->calculateUpdateRenderCost(); // Make sure the numbers are up-to-date
avatar->calculateUpdateRenderComplexity(); // Make sure the numbers are up-to-date
trunc_name = utf8str_truncate(avatar->getFullname(), 16);
addText(xpos, ypos, llformat("%s : rez %d, weight %d, bytes %d area %.2f",
addText(xpos, ypos, llformat("%s : %s, complexity %d, area %.2f",
trunc_name.c_str(),
avatar->getRezzedStatus(),
LLVOAvatar::rezStatusToString(avatar->getRezzedStatus()).c_str(),
avatar->getVisualComplexity(),
avatar->getAttachmentGeometryBytes(),
avatar->getAttachmentSurfaceArea()));
ypos += y_inc;
av_iter++;

View File

@ -1,4 +1,4 @@
/**
/**
* @File llvoavatar.cpp
* @brief Implementation of LLVOAvatar class which is a derivation of LLViewerObject
*
@ -43,6 +43,7 @@
#include "llanimationstates.h"
#include "llavatarnamecache.h"
#include "llavatarpropertiesprocessor.h"
#include "llavatarrendernotifier.h"
#include "llexperiencecache.h"
#include "llphysicsmotion.h"
#include "llviewercontrol.h"
@ -115,8 +116,6 @@ extern U32 JOINT_COUNT_REQUIRED_FOR_FULLRIG;
const F32 MAX_HOVER_Z = 2.0;
const F32 MIN_HOVER_Z = -2.0;
// #define OUTPUT_BREAST_DATA
using namespace LLAvatarAppearanceDefines;
//-----------------------------------------------------------------------------
@ -186,6 +185,8 @@ const F32 NAMETAG_UPDATE_THRESHOLD = 0.3f;
const F32 NAMETAG_VERTICAL_SCREEN_OFFSET = 25.f;
const F32 NAMETAG_VERT_OFFSET_WEIGHT = 0.17f;
const U32 LLVOAvatar::VISUAL_COMPLEXITY_UNKNOWN = 0;
enum ERenderName
{
RENDER_NAME_NEVER,
@ -622,7 +623,7 @@ private:
//-----------------------------------------------------------------------------
LLAvatarAppearanceDictionary *LLVOAvatar::sAvatarDictionary = NULL;
S32 LLVOAvatar::sFreezeCounter = 0;
U32 LLVOAvatar::sMaxVisible = 12;
U32 LLVOAvatar::sMaxNonImpostors = 12; // overridden based on graphics setting
F32 LLVOAvatar::sRenderDistance = 256.f;
S32 LLVOAvatar::sNumVisibleAvatars = 0;
S32 LLVOAvatar::sNumLODChangesThisFrame = 0;
@ -649,7 +650,7 @@ BOOL LLVOAvatar::sShowFootPlane = FALSE;
BOOL LLVOAvatar::sVisibleInFirstPerson = FALSE;
F32 LLVOAvatar::sLODFactor = 1.f;
F32 LLVOAvatar::sPhysicsLODFactor = 1.f;
BOOL LLVOAvatar::sUseImpostors = FALSE;
bool LLVOAvatar::sUseImpostors = false; // overwridden by RenderAvatarMaxNonImpostors
BOOL LLVOAvatar::sJointDebug = FALSE;
F32 LLVOAvatar::sUnbakedTime = 0.f;
F32 LLVOAvatar::sUnbakedUpdateTime = 0.f;
@ -670,9 +671,8 @@ LLVOAvatar::LLVOAvatar(const LLUUID& id,
LLAvatarAppearance(&gAgentWearables),
LLViewerObject(id, pcode, regionp),
mSpecialRenderMode(0),
mAttachmentGeometryBytes(-1),
mAttachmentSurfaceArea(-1.f),
mReportedVisualComplexity(-1),
mAttachmentSurfaceArea(0.f),
mReportedVisualComplexity(VISUAL_COMPLEXITY_UNKNOWN),
mTurning(FALSE),
mLastSkeletonSerialNum( 0 ),
mIsSitting(FALSE),
@ -702,12 +702,14 @@ LLVOAvatar::LLVOAvatar(const LLUUID& id,
mNeedsSkin(FALSE),
mLastSkinTime(0.f),
mUpdatePeriod(1),
mVisualComplexityStale(true),
mVisuallyMuteSetting(AV_RENDER_NORMALLY),
mMutedAVColor(LLColor4::white /* used for "uninitialize" */),
mFirstFullyVisible(TRUE),
mFullyLoaded(FALSE),
mPreviousFullyLoaded(FALSE),
mFullyLoadedInitialized(FALSE),
mVisualComplexity(0),
mVisualComplexityStale(TRUE),
mVisualComplexity(VISUAL_COMPLEXITY_UNKNOWN),
mLoadedCallbacksPaused(FALSE),
mRenderUnloadedAvatar(LLCachedControl<bool>(gSavedSettings, "RenderUnloadedAvatar", false)),
mLastRezzedStatus(-1),
@ -718,6 +720,8 @@ LLVOAvatar::LLVOAvatar(const LLUUID& id,
mCachedMuteListUpdateTime(0),
mCachedInMuteList(false)
{
LL_DEBUGS("AvatarRender") << "LLVOAvatar Constructor (0x" << this << ") id:" << mID << LL_ENDL;
//VTResume(); // VTune
setHoverOffset(LLVector3(0.0, 0.0, 0.0));
@ -726,7 +730,6 @@ LLVOAvatar::LLVOAvatar(const LLUUID& id,
mVoiceVisualizer = ( LLVoiceVisualizer *)LLHUDManager::getInstance()->createViewerEffect( LLHUDObject::LL_HUD_EFFECT_VOICE_VISUALIZER, needsSendToSim );
LL_DEBUGS("Avatar","Message") << "LLVOAvatar Constructor (0x" << this << ") id:" << mID << LL_ENDL;
mPelvisp = NULL;
mDirtyMesh = 2; // Dirty geometry, need to regenerate.
@ -775,17 +778,10 @@ LLVOAvatar::LLVOAvatar(const LLUUID& id,
mDebugExistenceTimer.reset();
mLastAppearanceMessageTimer.reset();
if(LLSceneMonitor::getInstance()->isEnabled())
if(LLSceneMonitor::getInstance()->isEnabled())
{
LLSceneMonitor::getInstance()->freezeAvatar((LLCharacter*)this);
LLSceneMonitor::getInstance()->freezeAvatar((LLCharacter*)this);
}
mCachedVisualMute = !isSelf();
mCachedVisualMuteUpdateTime = LLFrameTimer::getTotalSeconds() + 5.0;
mVisuallyMuteSetting = VISUAL_MUTE_NOT_SET;
F32 color_value = (F32) (getID().mData[0]);
mMutedAVColor = calcMutedAVColor(color_value, 0, 256);
}
std::string LLVOAvatar::avString() const
@ -993,8 +989,8 @@ std::string LLVOAvatar::rezStatusToString(S32 rez_status)
{
if (rez_status==0) return "cloud";
if (rez_status==1) return "gray";
if (rez_status==2) return "textured";
if (rez_status==3) return "textured_and_downloaded";
if (rez_status==2) return "downloading";
if (rez_status==3) return "full";
return "unknown";
}
@ -1106,6 +1102,7 @@ void LLVOAvatar::resetImpostors()
{
LLVOAvatar* avatar = (LLVOAvatar*) *iter;
avatar->mImpostor.release();
avatar->mNeedsImpostorUpdate = TRUE;
}
}
@ -2156,7 +2153,7 @@ void LLVOAvatar::idleUpdate(LLAgent &agent, const F64 &time)
}
idleUpdateNameTag( mLastRootPos );
idleUpdateRenderCost();
idleUpdateRenderComplexity();
}
void LLVOAvatar::idleUpdateVoiceVisualizer(bool voice_enabled)
@ -2496,19 +2493,22 @@ void LLVOAvatar::idleUpdateLoadingEffect()
// update visibility when avatar is partially loaded
if (updateIsFullyLoaded()) // changed?
{
if (isFullyLoaded() && mFirstFullyVisible && isSelf())
{
LL_INFOS("Avatar") << avString() << "self isFullyLoaded, mFirstFullyVisible" << LL_ENDL;
mFirstFullyVisible = FALSE;
LLAppearanceMgr::instance().onFirstFullyVisible();
}
if (isFullyLoaded() && mFirstFullyVisible && !isSelf())
{
LL_INFOS("Avatar") << avString() << "other isFullyLoaded, mFirstFullyVisible" << LL_ENDL;
mFirstFullyVisible = FALSE;
}
if (isFullyLoaded())
{
if (mFirstFullyVisible)
{
mFirstFullyVisible = FALSE;
if (isSelf())
{
LL_INFOS("Avatar") << avString() << "self isFullyLoaded, mFirstFullyVisible" << LL_ENDL;
LLAppearanceMgr::instance().onFirstFullyVisible();
}
else
{
LL_INFOS("Avatar") << avString() << "other isFullyLoaded, mFirstFullyVisible" << LL_ENDL;
}
}
deleteParticleSource();
updateLOD();
}
@ -2733,7 +2733,7 @@ void LLVOAvatar::idleUpdateNameTagText(BOOL new_name)
}
else
{
is_muted = LLMuteList::getInstance()->isMuted(getID());
is_muted = isInMuteList();
}
bool is_friend = LLAvatarTracker::instance().isBuddy(getID());
bool is_cloud = getIsCloud();
@ -3091,86 +3091,32 @@ bool LLVOAvatar::isVisuallyMuted()
{
bool muted = false;
// Priority order (highest priority first)
// * own avatar is never visually muted
// * if on the "always draw normally" list, draw them normally
// * if on the "always visually mute" list, mute them
// * check against the render cost and attachment limits
if (!isSelf())
{
static LLCachedControl<U32> render_auto_mute_functions(gSavedSettings, "RenderAutoMuteFunctions", 0);
if (render_auto_mute_functions) // Hacky debug switch for developing feature
if (mVisuallyMuteSetting == AV_ALWAYS_RENDER)
{
// Priority order (highest priority first)
// * own avatar is never visually muted
// * if on the "always draw normally" list, draw them normally
// * if on the "always visually mute" list, mute them
// * draw them normally if they meet the following criteria:
// - within the closest N avatars OR on friends list OR in an IM chat
// - AND aren't over the thresholds
// * otherwise visually mute all other avatars
static LLCachedControl<U32> max_attachment_bytes(gSavedSettings, "RenderAutoMuteByteLimit", 0);
static LLCachedControl<F32> max_attachment_area(gSavedSettings, "RenderAutoMuteSurfaceAreaLimit", 0.0);
static LLCachedControl<U32> max_render_cost(gSavedSettings, "RenderAutoMuteRenderWeightLimit", 0);
if (mVisuallyMuteSetting == ALWAYS_VISUAL_MUTE)
{ // Always want to see this AV as an impostor
muted = true;
}
else if (mVisuallyMuteSetting == NEVER_VISUAL_MUTE)
{ // Never show as impostor
muted = false;
}
else
{
F64 now = LLFrameTimer::getTotalSeconds();
if (now < mCachedVisualMuteUpdateTime)
{ // Use cached mute value
muted = mCachedVisualMute;
}
else
{ // Determine if visually muted or not
U32 max_cost = (U32) (max_render_cost*(LLVOAvatar::sLODFactor+0.5));
muted = (mAttachmentGeometryBytes > max_attachment_bytes && max_attachment_bytes > 0) ||
(mAttachmentSurfaceArea > max_attachment_area && max_attachment_area > 0.f) ||
(mVisualComplexity > max_cost && max_render_cost > 0);
// Could be part of the grand || collection above, but yanked out to make the logic visible
if (!muted)
{
if (sMaxVisible > 0)
{ // They are above the visibilty rank - mute them
muted = (mVisibilityRank > sMaxVisible);
}
// Always draw friends or those in IMs. Needs UI?
if ((render_auto_mute_functions & 0x02) &&
(muted || sMaxVisible == 0)) // Don't mute friends or IMs
{
muted = !(LLAvatarTracker::instance().isBuddy(getID()));
if (muted)
{ // Not a friend, so they are muted ... are they in an IM?
LLUUID session_id = gIMMgr->computeSessionID(IM_NOTHING_SPECIAL,getID());
muted = !gIMMgr->hasSession(session_id);
}
}
}
// Save visual mute state and set interval for updating
const F64 SECONDS_BETWEEN_RENDER_AUTO_MUTE_UPDATES = 1.5;
mCachedVisualMuteUpdateTime = now + SECONDS_BETWEEN_RENDER_AUTO_MUTE_UPDATES;
mCachedVisualMute = muted;
}
}
muted = false;
}
else if (mVisuallyMuteSetting == AV_DO_NOT_RENDER)
{ // Always want to see this AV as an impostor
muted = true;
}
else if (isInMuteList())
{
muted = true;
}
else
{
muted = isTooComplex();
}
}
return muted || isInMuteList();
}
void LLVOAvatar::forceUpdateVisualMuteSettings()
{
// Set the cache time so it's updated ASAP
mCachedVisualMuteUpdateTime = LLFrameTimer::getTotalSeconds() - 1.0;
return muted;
}
bool LLVOAvatar::isInMuteList()
@ -3335,18 +3281,18 @@ BOOL LLVOAvatar::updateCharacter(LLAgent &agent)
{ // visually muted avatars update at 16 hz
mUpdatePeriod = 16;
}
else if (mVisibilityRank <= LLVOAvatar::sMaxVisible ||
mDrawable->mDistanceWRTCamera < 1.f + mag)
{ //first 25% of max visible avatars are not impostored
//also, don't impostor avatars whose bounding box may be penetrating the
//impostor camera near clip plane
else if ( ! shouldImpostor()
|| mDrawable->mDistanceWRTCamera < 1.f + mag)
{ // first 25% of max visible avatars are not impostored
// also, don't impostor avatars whose bounding box may be penetrating the
// impostor camera near clip plane
mUpdatePeriod = 1;
}
else if (mVisibilityRank > LLVOAvatar::sMaxVisible * 4)
else if ( shouldImpostor(4) )
{ //background avatars are REALLY slow updating impostors
mUpdatePeriod = 16;
}
else if (mVisibilityRank > LLVOAvatar::sMaxVisible * 3)
else if ( shouldImpostor(3) )
{ //back 25% of max visible avatars are slow updating impostors
mUpdatePeriod = 8;
}
@ -3930,6 +3876,10 @@ void LLVOAvatar::updateVisibility()
}
}
if ( visible != mVisible )
{
LL_DEBUGS("AvatarRender") << "visible was " << mVisible << " now " << visible << LL_ENDL;
}
mVisible = visible;
}
@ -4202,8 +4152,8 @@ U32 LLVOAvatar::renderTransparent(BOOL first_pass)
}
// Can't test for baked hair being defined, since that won't always be the case (not all viewers send baked hair)
// TODO: 1.25 will be able to switch this logic back to calling isTextureVisible();
if ( ( getImage(TEX_HAIR_BAKED, 0) &&
getImage(TEX_HAIR_BAKED, 0)->getID() != IMG_INVISIBLE ) || LLDrawPoolAlpha::sShowDebugAlpha)
if ( (getImage(TEX_HAIR_BAKED, 0) && getImage(TEX_HAIR_BAKED, 0)->getID() != IMG_INVISIBLE)
|| LLDrawPoolAlpha::sShowDebugAlpha)
{
LLViewerJoint* hair_mesh = getViewerJoint(MESH_ID_HAIR);
if (hair_mesh)
@ -5840,7 +5790,7 @@ const LLViewerJointAttachment *LLVOAvatar::attachObject(LLViewerObject *viewer_o
return 0;
}
mVisualComplexityStale = TRUE;
updateVisualComplexity();
if (viewer_object->isSelected())
{
@ -5996,7 +5946,7 @@ BOOL LLVOAvatar::detachObject(LLViewerObject *viewer_object)
if (attachment->isObjectAttached(viewer_object))
{
mVisualComplexityStale = TRUE;
updateVisualComplexity();
cleanupAttachedMesh( viewer_object );
attachment->removeObject(viewer_object);
@ -6298,32 +6248,20 @@ BOOL LLVOAvatar::isVisible() const
}
// Determine if we have enough avatar data to render
BOOL LLVOAvatar::getIsCloud() const
bool LLVOAvatar::getIsCloud() const
{
// Do we have a shape?
if ((const_cast<LLVOAvatar*>(this))->visualParamWeightsAreDefault())
{
return TRUE;
}
if (!isTextureDefined(TEX_LOWER_BAKED) ||
!isTextureDefined(TEX_UPPER_BAKED) ||
!isTextureDefined(TEX_HEAD_BAKED))
{
return TRUE;
}
if (isTooComplex())
{
return TRUE;
}
return FALSE;
return ( ((const_cast<LLVOAvatar*>(this))->visualParamWeightsAreDefault())// Do we have a shape?
|| ( !isTextureDefined(TEX_LOWER_BAKED)
|| !isTextureDefined(TEX_UPPER_BAKED)
|| !isTextureDefined(TEX_HEAD_BAKED)
)
);
}
void LLVOAvatar::updateRezzedStatusTimers()
{
// State machine for rezzed status. Statuses are -1 on startup, 0
// = cloud, 1 = gray, 2 = textured, 3 = textured_and_downloaded.
// = cloud, 1 = gray, 2 = downloading, 3 = full.
// Purpose is to collect time data for each it takes avatar to reach
// various loading landmarks: gray, textured (partial), textured fully.
@ -6363,6 +6301,8 @@ void LLVOAvatar::updateRezzedStatusTimers()
selfStopPhase("update_appearance_from_cof");
selfStopPhase("wear_inventory_category", false);
selfStopPhase("process_initial_wearables_update", false);
updateVisualComplexity();
}
}
mLastRezzedStatus = rez_status;
@ -6495,7 +6435,7 @@ void LLVOAvatar::logMetricsTimerRecord(const std::string& phase_name, F32 elapse
// returns true if the value has changed.
BOOL LLVOAvatar::updateIsFullyLoaded()
{
const BOOL loading = getIsCloud();
const bool loading = getIsCloud();
updateRezzedStatusTimers();
updateRuthTimer(loading);
return processFullyLoadedChange(loading);
@ -6556,6 +6496,12 @@ BOOL LLVOAvatar::processFullyLoadedChange(bool loading)
mPreviousFullyLoaded = mFullyLoaded;
mFullyLoadedInitialized = TRUE;
mFullyLoadedFrameCounter++;
if (changed && isSelf())
{
// to know about outfit switching
LLAvatarRenderNotifier::getInstance()->updateNotificationState();
}
return changed;
}
@ -6567,15 +6513,28 @@ BOOL LLVOAvatar::isFullyLoaded() const
bool LLVOAvatar::isTooComplex() const
{
if (gSavedSettings.getS32("RenderAvatarComplexityLimit") > 0 && mVisualComplexity >= gSavedSettings.getS32("RenderAvatarComplexityLimit"))
bool too_complex;
if (isSelf() || mVisuallyMuteSetting == AV_ALWAYS_RENDER)
{
return true;
too_complex = false;
}
else
{
// Determine if visually muted or not
static LLCachedControl<U32> max_render_cost(gSavedSettings, "RenderAvatarMaxComplexity", 0U);
static LLCachedControl<F32> max_attachment_area(gSavedSettings, "RenderAutoMuteSurfaceAreaLimit", 1000.0f);
// If the user has chosen unlimited max complexity, we also disregard max attachment area
// so that unlimited will completely disable the overly complex impostor rendering
// yes, this leaves them vulnerable to griefing objects... their choice
too_complex = ( max_render_cost > 0
&& ( mVisualComplexity > max_render_cost
|| (max_attachment_area > 0.0f && mAttachmentSurfaceArea > max_attachment_area)
));
}
return false;
return too_complex;
}
//-----------------------------------------------------------------------------
// findMotion()
//-----------------------------------------------------------------------------
@ -7439,7 +7398,10 @@ void LLVOAvatar::processAvatarAppearance( LLMessageSystem* mesgsys )
// appearance messages.
mLastUpdateReceivedCOFVersion = this_update_cof_version;
applyParsedTEMessage(contents.mTEContents);
if (applyParsedTEMessage(contents.mTEContents) > 0 && isChanged(TEXTURE))
{
updateVisualComplexity();
}
// prevent the overwriting of valid baked textures with invalid baked textures
for (U8 baked_index = 0; baked_index < mBakedTextureDatas.size(); baked_index++)
@ -7557,7 +7519,7 @@ void LLVOAvatar::processAvatarAppearance( LLMessageSystem* mesgsys )
// Got an update for some other avatar
// Ignore updates for self, because we have a more authoritative value in the preferences.
setHoverOffset(contents.mHoverOffset);
LL_INFOS("Avatar") << avString() << "setting hover from message" << contents.mHoverOffset[2] << LL_ENDL;
LL_INFOS("Avatar") << avString() << "setting hover to " << contents.mHoverOffset[2] << LL_ENDL;
}
if (!contents.mHoverOffsetWasSet && !isSelf())
@ -8134,7 +8096,7 @@ void LLVOAvatar::updateFreezeCounter(S32 counter)
BOOL LLVOAvatar::updateLOD()
{
if (isImpostor())
if (isImpostor() && 0 != mDrawable->getNumFaces() && mDrawable->getFace(0)->hasGeometry())
{
return TRUE;
}
@ -8171,28 +8133,35 @@ U32 LLVOAvatar::getPartitionType() const
}
//static
void LLVOAvatar::updateImpostors()
void LLVOAvatar::updateImpostors()
{
LLCharacter::sAllowInstancesChange = FALSE ;
LLCharacter::sAllowInstancesChange = FALSE;
for (std::vector<LLCharacter*>::iterator iter = LLCharacter::sInstances.begin();
iter != LLCharacter::sInstances.end(); ++iter)
iter != LLCharacter::sInstances.end(); ++iter)
{
LLVOAvatar* avatar = (LLVOAvatar*) *iter;
if (!avatar->isDead() && avatar->needsImpostorUpdate() && avatar->isVisible() && avatar->isImpostor())
if (!avatar->isDead() && avatar->isVisible()
&& ((avatar->isImpostor() || LLVOAvatar::AV_DO_NOT_RENDER == avatar->getVisualMuteSettings()) && avatar->needsImpostorUpdate())
)
{
avatar->calcMutedAVColor();
gPipeline.generateImpostor(avatar);
}
}
LLCharacter::sAllowInstancesChange = TRUE ;
LLCharacter::sAllowInstancesChange = TRUE;
}
BOOL LLVOAvatar::isImpostor()
{
return (sUseImpostors && (isVisuallyMuted() || (mUpdatePeriod >= IMPOSTOR_PERIOD))) || isInMuteList() ? TRUE : FALSE;
return sUseImpostors && (isVisuallyMuted() || (mUpdatePeriod >= IMPOSTOR_PERIOD)) ? TRUE : FALSE;
}
BOOL LLVOAvatar::shouldImpostor(const U32 rank_factor) const
{
return (!isSelf() && sUseImpostors && mVisibilityRank > (sMaxNonImpostors * rank_factor));
}
BOOL LLVOAvatar::needsImpostorUpdate() const
{
@ -8233,68 +8202,170 @@ void LLVOAvatar::getImpostorValues(LLVector4a* extents, LLVector3& angle, F32& d
angle.mV[2] = da;
}
// static
const U32 LLVOAvatar::IMPOSTORS_OFF = 66; /* Must equal the maximum allowed the RenderAvatarMaxNonImpostors
* slider in panel_preferences_graphics1.xml */
void LLVOAvatar::idleUpdateRenderCost()
// static
void LLVOAvatar::updateImpostorRendering(U32 newMaxNonImpostorsValue)
{
static LLCachedControl<U32> max_render_cost(gSavedSettings, "RenderAutoMuteRenderWeightLimit", 0);
static const U32 ARC_LIMIT = 20000;
if (gPipeline.hasRenderDebugMask(LLPipeline::RENDER_DEBUG_ATTACHMENT_BYTES))
{ //set debug text to attachment geometry bytes here so render cost will override
setDebugText(llformat("%.1f KB, %.2f m^2", mAttachmentGeometryBytes/1024.f, mAttachmentSurfaceArea));
}
if (!gPipeline.hasRenderDebugMask(LLPipeline::RENDER_DEBUG_SHAME) && max_render_cost == 0)
{
return;
}
calculateUpdateRenderCost(); // Update mVisualComplexity if needed
U32 oldmax = sMaxNonImpostors;
bool oldflg = sUseImpostors;
if (gPipeline.hasRenderDebugMask(LLPipeline::RENDER_DEBUG_SHAME))
if (IMPOSTORS_OFF <= newMaxNonImpostorsValue)
{
std::string viz_string = LLVOAvatar::rezStatusToString(getRezzedStatus());
setDebugText(llformat("%s %d", viz_string.c_str(), mVisualComplexity));
F32 green = 1.f-llclamp(((F32) mVisualComplexity-(F32)ARC_LIMIT)/(F32)ARC_LIMIT, 0.f, 1.f);
F32 red = llmin((F32) mVisualComplexity/(F32)ARC_LIMIT, 1.f);
mText->setColor(LLColor4(red,green,0,1));
sMaxNonImpostors = 0;
}
else
{
sMaxNonImpostors = newMaxNonImpostorsValue;
}
// the sUseImpostors flag depends on whether or not sMaxNonImpostors is set to the no-limit value (0)
sUseImpostors = (0 != sMaxNonImpostors);
if ( oldflg != sUseImpostors )
{
LL_DEBUGS("AvatarRender")
<< "was " << (oldflg ? "use" : "don't use" ) << " impostors (max " << oldmax << "); "
<< "now " << (sUseImpostors ? "use" : "don't use" ) << " impostors (max " << sMaxNonImpostors << "); "
<< LL_ENDL;
}
}
// Calculations for mVisualComplexity value
void LLVOAvatar::calculateUpdateRenderCost()
void LLVOAvatar::idleUpdateRenderComplexity()
{
static const U32 ARC_BODY_PART_COST = 200;
// Render Complexity
calculateUpdateRenderComplexity(); // Update mVisualComplexity if needed
if (gPipeline.hasRenderDebugMask(LLPipeline::RENDER_DEBUG_AVATAR_DRAW_INFO))
{
std::string info_line;
F32 red_level;
F32 green_level;
LLColor4 info_color;
LLFontGL::StyleFlags info_style;
if ( !mText )
{
initHudText();
mText->setFadeDistance(20.0, 5.0); // limit clutter in large crowds
}
else
{
mText->clearString(); // clear debug text
}
/*
* NOTE: the logic for whether or not each of the values below
* controls muting MUST match that in the isVisuallyMuted and isTooComplex methods.
*/
static LLCachedControl<U32> max_render_cost(gSavedSettings, "RenderAvatarMaxComplexity", 0);
info_line = llformat("%d Complexity", mVisualComplexity);
if (max_render_cost != 0) // zero means don't care, so don't bother coloring based on this
{
green_level = 1.f-llclamp(((F32) mVisualComplexity-(F32)max_render_cost)/(F32)max_render_cost, 0.f, 1.f);
red_level = llmin((F32) mVisualComplexity/(F32)max_render_cost, 1.f);
info_color.set(red_level, green_level, 0.0, 1.0);
info_style = ( mVisualComplexity > max_render_cost
? LLFontGL::BOLD : LLFontGL::NORMAL );
}
else
{
info_color.set(LLColor4::grey);
info_style = LLFontGL::NORMAL;
}
mText->addLine(info_line, info_color, info_style);
// Visual rank
info_line = llformat("%d rank", mVisibilityRank);
// Use grey for imposters, white for normal rendering or no impostors
info_color.set(isImpostor() ? LLColor4::grey : LLColor4::white);
info_style = LLFontGL::NORMAL;
mText->addLine(info_line, info_color, info_style);
// Attachment Surface Area
static LLCachedControl<F32> max_attachment_area(gSavedSettings, "RenderAutoMuteSurfaceAreaLimit", 1000.0f);
info_line = llformat("%.2f m^2", mAttachmentSurfaceArea);
if (max_render_cost != 0 && max_attachment_area != 0) // zero means don't care, so don't bother coloring based on this
{
green_level = 1.f-llclamp((mAttachmentSurfaceArea-max_attachment_area)/max_attachment_area, 0.f, 1.f);
red_level = llmin(mAttachmentSurfaceArea/max_attachment_area, 1.f);
info_color.set(red_level, green_level, 0.0, 1.0);
info_style = ( mAttachmentSurfaceArea > max_attachment_area
? LLFontGL::BOLD : LLFontGL::NORMAL );
}
else
{
info_color.set(LLColor4::grey);
info_style = LLFontGL::NORMAL;
}
mText->addLine(info_line, info_color, info_style);
updateText(); // corrects position
}
}
void LLVOAvatar::addAttachmentArea(F32 delta_area)
{
mAttachmentSurfaceArea += delta_area;
}
void LLVOAvatar::subtractAttachmentArea(F32 delta_area)
{
mAttachmentSurfaceArea = delta_area > mAttachmentSurfaceArea ? 0.0 : mAttachmentSurfaceArea - delta_area;
}
void LLVOAvatar::updateVisualComplexity()
{
LL_DEBUGS("AvatarRender") << "avatar " << getID() << " appearance changed" << LL_ENDL;
// Set the cache time to in the past so it's updated ASAP
mVisualComplexityStale = true;
}
// Calculations for mVisualComplexity value
void LLVOAvatar::calculateUpdateRenderComplexity()
{
/*****************************************************************
* This calculation should not be modified by third party viewers,
* since it is used to limit rendering and should be uniform for
* everyone. If you have suggested improvements, submit them to
* the official viewer for consideration.
*****************************************************************/
static const U32 COMPLEXITY_BODY_PART_COST = 200;
// Diagnostic list of all textures on our avatar
static std::set<LLUUID> all_textures;
if (mVisualComplexityStale)
{
mVisualComplexityStale = FALSE;
U32 cost = 0;
U32 cost = VISUAL_COMPLEXITY_UNKNOWN;
LLVOVolume::texture_cost_t textures;
for (U8 baked_index = 0; baked_index < BAKED_NUM_INDICES; baked_index++)
{
const LLAvatarAppearanceDictionary::BakedEntry *baked_dict = LLAvatarAppearanceDictionary::getInstance()->getBakedTexture((EBakedTextureIndex)baked_index);
const LLAvatarAppearanceDictionary::BakedEntry *baked_dict
= LLAvatarAppearanceDictionary::getInstance()->getBakedTexture((EBakedTextureIndex)baked_index);
ETextureIndex tex_index = baked_dict->mTextureIndex;
if ((tex_index != TEX_SKIRT_BAKED) || (isWearingWearableType(LLWearableType::WT_SKIRT)))
{
if (isTextureVisible(tex_index))
{
cost +=ARC_BODY_PART_COST;
cost +=COMPLEXITY_BODY_PART_COST;
}
}
}
LL_DEBUGS("ARCdetail") << "Avatar body parts complexity: " << cost << LL_ENDL;
for (attachment_map_t::const_iterator iter = mAttachmentPoints.begin();
iter != mAttachmentPoints.end();
++iter)
for (attachment_map_t::const_iterator attachment_point = mAttachmentPoints.begin();
attachment_point != mAttachmentPoints.end();
++attachment_point)
{
LLViewerJointAttachment* attachment = iter->second;
LLViewerJointAttachment* attachment = attachment_point->second;
for (LLViewerJointAttachment::attachedobjs_vec_t::iterator attachment_iter = attachment->mAttachedObjects.begin();
attachment_iter != attachment->mAttachedObjects.end();
++attachment_iter)
@ -8309,7 +8380,12 @@ void LLVOAvatar::calculateUpdateRenderCost()
const LLVOVolume* volume = drawable->getVOVolume();
if (volume)
{
cost += volume->getRenderCost(textures);
U32 attachment_total_cost = 0;
U32 attachment_volume_cost = 0;
U32 attachment_texture_cost = 0;
U32 attachment_children_cost = 0;
attachment_volume_cost += volume->getRenderCost(textures);
const_child_list_t children = volume->getChildren();
for (const_child_list_t::const_iterator child_iter = children.begin();
@ -8320,15 +8396,27 @@ void LLVOAvatar::calculateUpdateRenderCost()
LLVOVolume *child = dynamic_cast<LLVOVolume*>( child_obj );
if (child)
{
cost += child->getRenderCost(textures);
attachment_children_cost += child->getRenderCost(textures);
}
}
for (LLVOVolume::texture_cost_t::iterator iter = textures.begin(); iter != textures.end(); ++iter)
for (LLVOVolume::texture_cost_t::iterator volume_texture = textures.begin();
volume_texture != textures.end();
++volume_texture)
{
// add the cost of each individual texture in the linkset
cost += iter->second;
attachment_texture_cost += volume_texture->second;
}
attachment_total_cost = attachment_volume_cost + attachment_texture_cost + attachment_children_cost;
LL_DEBUGS("ARCdetail") << "Attachment costs " << attached_object->getAttachmentItemID()
<< " total: " << attachment_total_cost
<< ", volume: " << attachment_volume_cost
<< ", textures: " << attachment_texture_cost
<< ", " << volume->numChildren()
<< " children: " << attachment_children_cost
<< LL_ENDL;
cost += attachment_total_cost;
}
}
}
@ -8374,38 +8462,85 @@ void LLVOAvatar::calculateUpdateRenderCost()
}
}
if ( cost != mVisualComplexity )
{
LL_DEBUGS("AvatarRender") << "Avatar "<< getID()
<< " complexity updated was " << mVisualComplexity << " now " << cost
<< " reported " << mReportedVisualComplexity
<< LL_ENDL;
}
else
{
LL_DEBUGS("AvatarRender") << "Avatar "<< getID()
<< " complexity updated no change " << mVisualComplexity
<< " reported " << mReportedVisualComplexity
<< LL_ENDL;
}
mVisualComplexity = cost;
mVisualComplexityStale = false;
static LLCachedControl<U32> show_my_complexity_changes(gSavedSettings, "ShowMyComplexityChanges", 20);
if (isSelf() && show_my_complexity_changes)
{
LLAvatarRenderNotifier::getInstance()->updateNotificationAgent(mVisualComplexity);
}
}
}
// static
LLColor4 LLVOAvatar::calcMutedAVColor(F32 value, S32 range_low, S32 range_high)
void LLVOAvatar::setVisualMuteSettings(VisualMuteSettings set)
{
F32 clamped_value = llmin(value, (F32) range_high);
clamped_value = llmax(value, (F32) range_low);
F32 spectrum = (clamped_value / range_high); // spectrum is between 0 and 1.f
mVisuallyMuteSetting = set;
mNeedsImpostorUpdate = TRUE;
}
// Array of colors. These are arranged so only one RGB color changes between each step,
// and it loops back to red so there is an even distribution. It is not a heat map
const S32 NUM_SPECTRUM_COLORS = 7;
static LLColor4 * spectrum_color[NUM_SPECTRUM_COLORS] = { &LLColor4::red, &LLColor4::magenta, &LLColor4::blue, &LLColor4::cyan, &LLColor4::green, &LLColor4::yellow, &LLColor4::red };
void LLVOAvatar::calcMutedAVColor()
{
LLColor4 new_color(mMutedAVColor);
std::string change_msg;
LLUUID av_id(getID());
if (getVisualMuteSettings() == AV_DO_NOT_RENDER)
{
// explicitly not-rendered avatars are light grey
new_color = LLColor4::grey3;
change_msg = " not rendered: color is grey3";
}
else if (LLMuteList::getInstance()->isMuted(av_id)) // the user blocked them
{
// blocked avatars are dark grey
new_color = LLColor4::grey4;
change_msg = " blocked: color is grey4";
}
else if ( mMutedAVColor == LLColor4::white || mMutedAVColor == LLColor4::grey3 || mMutedAVColor == LLColor4::grey4 )
{
// select a color based on the first byte of the agents uuid so any muted agent is always the same color
F32 color_value = (F32) (av_id.mData[0]);
F32 spectrum = (color_value / 256.0); // spectrum is between 0 and 1.f
// Array of colors. These are arranged so only one RGB color changes between each step,
// and it loops back to red so there is an even distribution. It is not a heat map
const S32 NUM_SPECTRUM_COLORS = 7;
static LLColor4 * spectrum_color[NUM_SPECTRUM_COLORS] = { &LLColor4::red, &LLColor4::magenta, &LLColor4::blue, &LLColor4::cyan, &LLColor4::green, &LLColor4::yellow, &LLColor4::red };
spectrum = spectrum * (NUM_SPECTRUM_COLORS - 1); // Scale to range of number of colors
S32 spectrum_index_1 = floor(spectrum); // Desired color will be after this index
S32 spectrum_index_2 = spectrum_index_1 + 1; // and before this index (inclusive)
F32 fractBetween = spectrum - (F32)(spectrum_index_1); // distance between the two indexes (0-1)
spectrum = spectrum * (NUM_SPECTRUM_COLORS - 1); // Scale to range of number of colors
S32 spectrum_index_1 = floor(spectrum); // Desired color will be after this index
S32 spectrum_index_2 = spectrum_index_1 + 1; // and before this index (inclusive)
F32 fractBetween = spectrum - (F32)(spectrum_index_1); // distance between the two indexes (0-1)
LLColor4 new_color = lerp(*spectrum_color[spectrum_index_1], *spectrum_color[spectrum_index_2], fractBetween);
new_color.normalize();
new_color *= 0.7f; // Tone it down a bit
new_color = lerp(*spectrum_color[spectrum_index_1], *spectrum_color[spectrum_index_2], fractBetween);
new_color.normalize();
new_color *= 0.28f; // Tone it down
//LL_INFOS() << "From value " << std::setprecision(3) << value << " returning color " << new_color
// << " using indexes " << spectrum_index_1 << ", " << spectrum_index_2
// << " and fractBetween " << fractBetween
// << LL_ENDL;
change_msg = " over limit color ";
}
return new_color;
if (mMutedAVColor != new_color)
{
LL_DEBUGS("AvatarRender") << "avatar "<< av_id << change_msg << std::setprecision(3) << new_color << LL_ENDL;
mMutedAVColor = new_color;
}
}
// static

View File

@ -253,20 +253,22 @@ public:
// force all name tags to rebuild, useful when display names turned on/off
static void invalidateNameTags();
void addNameTagLine(const std::string& line, const LLColor4& color, S32 style, const LLFontGL* font);
void idleUpdateRenderCost();
void calculateUpdateRenderCost();
void updateVisualComplexity() { mVisualComplexityStale = TRUE; }
void idleUpdateRenderComplexity();
void calculateUpdateRenderComplexity();
static const U32 VISUAL_COMPLEXITY_UNKNOWN;
void updateVisualComplexity();
S32 getVisualComplexity() { return mVisualComplexity; }; // Numbers calculated here by rendering AV
S32 getAttachmentGeometryBytes() { return mAttachmentGeometryBytes; }; // number of bytes in attached geometry
U32 getVisualComplexity() { return mVisualComplexity; }; // Numbers calculated here by rendering AV
F32 getAttachmentSurfaceArea() { return mAttachmentSurfaceArea; }; // estimated surface area of attachments
void addAttachmentArea(F32 delta_area);
void subtractAttachmentArea(F32 delta_area);
S32 getReportedVisualComplexity() { return mReportedVisualComplexity; }; // Numbers as reported by the SL server
void setReportedVisualComplexity(S32 value) { mReportedVisualComplexity = value; };
U32 getReportedVisualComplexity() { return mReportedVisualComplexity; }; // Numbers as reported by the SL server
void setReportedVisualComplexity(U32 value) { mReportedVisualComplexity = value; };
S32 getUpdatePeriod() { return mUpdatePeriod; };
const LLColor4 & getMutedAVColor() { return mMutedAVColor; };
static void updateImpostorRendering(U32 newMaxNonImpostorsValue);
void idleUpdateBelowWater();
@ -276,10 +278,12 @@ public:
public:
static S32 sRenderName;
static BOOL sRenderGroupTitles;
static U32 sMaxVisible; //(affected by control "RenderAvatarMaxVisible")
static const U32 IMPOSTORS_OFF; /* Must equal the maximum allowed the RenderAvatarMaxNonImpostors
* slider in panel_preferences_graphics1.xml */
static U32 sMaxNonImpostors; //(affected by control "RenderAvatarMaxNonImpostors")
static F32 sRenderDistance; //distance at which avatars will render.
static BOOL sShowAnimationDebug; // show animation debug info
static BOOL sUseImpostors; //use impostors for far away avatars
static bool sUseImpostors; //use impostors for far away avatars
static BOOL sShowFootPlane; // show foot collision plane reported by server
static BOOL sShowCollisionVolumes; // show skeletal collision volumes
static BOOL sVisibleInFirstPerson;
@ -303,9 +307,9 @@ public:
//--------------------------------------------------------------------
public:
BOOL isFullyLoaded() const;
bool isTooComplex() const;
bool isTooComplex() const;
bool visualParamWeightsAreDefault();
virtual BOOL getIsCloud() const;
virtual bool getIsCloud() const;
BOOL isFullyTextured() const;
BOOL hasGray() const;
S32 getRezzedStatus() const; // 0 = cloud, 1 = gray, 2 = textured, 3 = textured and fully downloaded.
@ -321,7 +325,7 @@ public:
static void logPendingPhasesAllAvatars();
void logMetricsTimerRecord(const std::string& phase_name, F32 elapsed, bool completed);
static LLColor4 calcMutedAVColor(F32 value, S32 range_low, S32 range_high);
void calcMutedAVColor();
protected:
LLViewerStats::PhaseMap& getPhases() { return mPhases; }
@ -336,8 +340,6 @@ private:
BOOL mPreviousFullyLoaded;
BOOL mFullyLoadedInitialized;
S32 mFullyLoadedFrameCounter;
S32 mVisualComplexity;
BOOL mVisualComplexityStale;
LLColor4 mMutedAVColor;
LLFrameTimer mFullyLoadedTimer;
LLFrameTimer mRuthTimer;
@ -386,16 +388,15 @@ public:
U32 renderImpostor(LLColor4U color = LLColor4U(255,255,255,255), S32 diffuse_channel = 0);
bool isVisuallyMuted();
bool isInMuteList();
void setCachedVisualMute(bool muted) { mCachedVisualMute = muted; };
void forceUpdateVisualMuteSettings();
enum VisualMuteSettings
{
VISUAL_MUTE_NOT_SET = 0,
ALWAYS_VISUAL_MUTE = 1,
NEVER_VISUAL_MUTE = 2
AV_RENDER_NORMALLY = 0,
AV_DO_NOT_RENDER = 1,
AV_ALWAYS_RENDER = 2
};
void setVisualMuteSettings(VisualMuteSettings set) { mVisuallyMuteSetting = set; };
void setVisualMuteSettings(VisualMuteSettings set);
VisualMuteSettings getVisualMuteSettings() { return mVisuallyMuteSetting; };
U32 renderRigid();
@ -408,12 +409,9 @@ public:
static void destroyGL();
static void restoreGL();
S32 mSpecialRenderMode; // special lighting
S32 mAttachmentGeometryBytes; //number of bytes in attached geometry
private:
F32 mAttachmentSurfaceArea; //estimated surface area of attachments
S32 mReportedVisualComplexity; // Numbers as reported by the SL server
private:
bool shouldAlphaMask();
BOOL mNeedsSkin; // avatar has been animated and verts have not been updated
@ -422,8 +420,10 @@ private:
S32 mUpdatePeriod;
S32 mNumInitFaces; //number of faces generated when creating the avatar drawable, does not inculde splitted faces due to long vertex buffer.
bool mCachedVisualMute; // cached return value for isVisuallyMuted()
F64 mCachedVisualMuteUpdateTime; // Time to update mCachedVisualMute
// the isTooComplex method uses these mutable values to avoid recalculating too frequently
mutable U32 mVisualComplexity;
mutable bool mVisualComplexityStale;
U32 mReportedVisualComplexity; // from other viewers through the simulator
bool mCachedInMuteList;
F64 mCachedMuteListUpdateTime;
@ -469,6 +469,7 @@ private:
//--------------------------------------------------------------------
public:
BOOL isImpostor();
BOOL shouldImpostor(const U32 rank_factor = 1) const;
BOOL needsImpostorUpdate() const;
const LLVector3& getImpostorOffset() const;
const LLVector2& getImpostorDim() const;
@ -703,7 +704,6 @@ private:
public:
BOOL isVisible() const;
void setVisibilityRank(U32 rank);
U32 getVisibilityRank() const { return mVisibilityRank; } // unused
static S32 sNumVisibleAvatars; // Number of instances of this class
/** Appearance
** **

View File

@ -435,7 +435,7 @@ BOOL LLVOAvatarSelf::buildMenus()
++iter)
{
LLViewerJointAttachment* attachment = iter->second;
if (attachment->getGroup() == i)
if (attachment && attachment->getGroup() == i)
{
LLMenuItemCallGL::Params item_params;
@ -474,7 +474,7 @@ BOOL LLVOAvatarSelf::buildMenus()
++iter)
{
LLViewerJointAttachment* attachment = iter->second;
if (attachment->getGroup() == i)
if (attachment && attachment->getGroup() == i)
{
LLMenuItemCallGL::Params item_params;
std::string sub_piemenu_name = attachment->getName();
@ -507,7 +507,7 @@ BOOL LLVOAvatarSelf::buildMenus()
++iter)
{
LLViewerJointAttachment* attachment = iter->second;
if (attachment->getGroup() == 8)
if (attachment && attachment->getGroup() == 8)
{
LLMenuItemCallGL::Params item_params;
std::string sub_piemenu_name = attachment->getName();
@ -609,7 +609,7 @@ BOOL LLVOAvatarSelf::buildMenus()
++iter)
{
LLViewerJointAttachment* attachment = iter->second;
if(attachment->getGroup() == group)
if(attachment && attachment->getGroup() == group)
{
// use multimap to provide a partial order off of the pie slice key
S32 pie_index = attachment->getPieSlice();
@ -1885,7 +1885,7 @@ void LLVOAvatarSelf::dumpTotalLocalTextureByteCount()
LL_INFOS() << "Total Avatar LocTex GL:" << (gl_bytes/1024) << "KB" << LL_ENDL;
}
BOOL LLVOAvatarSelf::getIsCloud() const
bool LLVOAvatarSelf::getIsCloud() const
{
// Let people know why they're clouded without spamming them into oblivion.
bool do_warn = false;
@ -1913,7 +1913,7 @@ BOOL LLVOAvatarSelf::getIsCloud() const
<< (skin_count ? "" : "SKIN ")
<< LL_ENDL;
}
return TRUE;
return true;
}
if (!isTextureDefined(TEX_HAIR, 0))
@ -1922,7 +1922,7 @@ BOOL LLVOAvatarSelf::getIsCloud() const
{
LL_INFOS() << "Self is clouded because of no hair texture" << LL_ENDL;
}
return TRUE;
return true;
}
if (!mPreviousFullyLoaded)
@ -1934,7 +1934,7 @@ BOOL LLVOAvatarSelf::getIsCloud() const
{
LL_INFOS() << "Self is clouded because lower textures not baked" << LL_ENDL;
}
return TRUE;
return true;
}
if (!isLocalTextureDataAvailable(getLayerSet(BAKED_UPPER)) &&
@ -1944,7 +1944,7 @@ BOOL LLVOAvatarSelf::getIsCloud() const
{
LL_INFOS() << "Self is clouded because upper textures not baked" << LL_ENDL;
}
return TRUE;
return true;
}
for (U32 i = 0; i < mBakedTextureDatas.size(); i++)
@ -1965,13 +1965,13 @@ BOOL LLVOAvatarSelf::getIsCloud() const
LL_INFOS() << "Self is clouded because texture at index " << i
<< " (texture index is " << texture_data.mTextureIndex << ") is not loaded" << LL_ENDL;
}
return TRUE;
return true;
}
}
LL_DEBUGS() << "Avatar de-clouded" << LL_ENDL;
}
return FALSE;
return false;
}
/*static*/

View File

@ -133,7 +133,7 @@ public:
// Loading state
//--------------------------------------------------------------------
public:
/*virtual*/ BOOL getIsCloud() const;
/*virtual*/ bool getIsCloud() const;
//--------------------------------------------------------------------
// Region state

View File

@ -3355,6 +3355,13 @@ const LLMatrix4 LLVOVolume::getRenderMatrix() const
// children, and cost should only be increased for unique textures -Nyx
U32 LLVOVolume::getRenderCost(texture_cost_t &textures) const
{
/*****************************************************************
* This calculation should not be modified by third party viewers,
* since it is used to limit rendering and should be uniform for
* everyone. If you have suggested improvements, submit them to
* the official viewer for consideration.
*****************************************************************/
// Get access to params we'll need at various points.
// Skip if this is object doesn't have a volume (e.g. is an avatar).
BOOL has_volume = (getVolume() != NULL);
@ -3428,7 +3435,7 @@ U32 LLVOVolume::getRenderCost(texture_cost_t &textures) const
{
// base cost is dependent on mesh complexity
// note that 3 is the highest LOD as of the time of this coding.
S32 size = gMeshRepo.getMeshSize(volume_params.getSculptID(),3);
S32 size = gMeshRepo.getMeshSize(volume_params.getSculptID(), getLOD());
if ( size > 0)
{
if (gMeshRepo.getSkinInfo(volume_params.getSculptID(), this))
@ -4720,10 +4727,7 @@ void LLVolumeGeometryManager::rebuildGeom(LLSpatialGroup* group)
if (pAvatarVO)
{
pAvatarVO->mAttachmentGeometryBytes -= group->mGeometryBytes;
pAvatarVO->mAttachmentGeometryBytes = llmax(pAvatarVO->mAttachmentGeometryBytes, 0);
pAvatarVO->mAttachmentSurfaceArea -= group->mSurfaceArea;
pAvatarVO->mAttachmentSurfaceArea = llmax(pAvatarVO->mAttachmentSurfaceArea, 0.f);
pAvatarVO->subtractAttachmentArea( group->mSurfaceArea );
}
group->mGeometryBytes = 0;
@ -5277,24 +5281,9 @@ void LLVolumeGeometryManager::rebuildGeom(LLSpatialGroup* group)
if (pAvatarVO)
{
if (pAvatarVO->mAttachmentGeometryBytes < 0)
{ // First time through value is -1
pAvatarVO->mAttachmentGeometryBytes = group->mGeometryBytes;
}
else
{
pAvatarVO->mAttachmentGeometryBytes += group->mGeometryBytes;
}
if (pAvatarVO->mAttachmentSurfaceArea < 0.f)
{ // First time through value is -1
pAvatarVO->mAttachmentSurfaceArea = group->mSurfaceArea;
}
else
{
pAvatarVO->mAttachmentSurfaceArea += group->mSurfaceArea;
pAvatarVO->addAttachmentArea( group->mSurfaceArea );
}
}
}
static LLTrace::BlockTimerStatHandle FTM_REBUILD_MESH_FLUSH("Flush Mesh");

View File

@ -89,7 +89,7 @@ void LLWaterParamManager::loadAllPresets()
void LLWaterParamManager::loadPresetsFromDir(const std::string& dir)
{
LL_INFOS("AppInit", "Shaders") << "Loading water presets from " << dir << LL_ENDL;
LL_DEBUGS("AppInit", "Shaders") << "Loading water presets from " << dir << LL_ENDL;
LLDirIterator dir_iter(dir, "*.xml");
while (1)

View File

@ -107,7 +107,7 @@ void LLWLDayCycle::loadDayCycleFromFile(const std::string & fileName)
// static
LLSD LLWLDayCycle::loadDayCycleFromPath(const std::string& file_path)
{
LL_INFOS("Windlight") << "Loading DayCycle settings from " << file_path << LL_ENDL;
LL_DEBUGS("Windlight") << "Loading DayCycle settings from " << file_path << LL_ENDL;
llifstream day_cycle_xml(file_path.c_str());
if (day_cycle_xml.is_open())

View File

@ -569,7 +569,7 @@ void LLPipeline::init()
connectRefreshCachedSettingsSafe("RenderAutoMaskAlphaDeferred");
connectRefreshCachedSettingsSafe("RenderAutoMaskAlphaNonDeferred");
connectRefreshCachedSettingsSafe("RenderUseFarClip");
connectRefreshCachedSettingsSafe("RenderAvatarMaxVisible");
connectRefreshCachedSettingsSafe("RenderAvatarMaxNonImpostors");
connectRefreshCachedSettingsSafe("RenderDelayVBUpdate");
connectRefreshCachedSettingsSafe("UseOcclusion");
connectRefreshCachedSettingsSafe("VertexShaderEnable");
@ -1081,7 +1081,8 @@ void LLPipeline::refreshCachedSettings()
LLPipeline::sAutoMaskAlphaDeferred = gSavedSettings.getBOOL("RenderAutoMaskAlphaDeferred");
LLPipeline::sAutoMaskAlphaNonDeferred = gSavedSettings.getBOOL("RenderAutoMaskAlphaNonDeferred");
LLPipeline::sUseFarClip = gSavedSettings.getBOOL("RenderUseFarClip");
LLVOAvatar::sMaxVisible = (U32)gSavedSettings.getS32("RenderAvatarMaxVisible");
LLVOAvatar::sMaxNonImpostors = gSavedSettings.getU32("RenderAvatarMaxNonImpostors");
LLVOAvatar::updateImpostorRendering(LLVOAvatar::sMaxNonImpostors);
LLPipeline::sDelayVBUpdate = gSavedSettings.getBOOL("RenderDelayVBUpdate");
LLPipeline::sUseOcclusion =
@ -3113,7 +3114,9 @@ void LLPipeline::markVisible(LLDrawable *drawablep, LLCamera& camera)
if (vobj) // this test may not be needed, see above
{
LLVOAvatar* av = vobj->asAvatar();
if (av && av->isImpostor())
if (av && (av->isImpostor()
|| av->isInMuteList()
|| (LLVOAvatar::AV_DO_NOT_RENDER == av->getVisualMuteSettings() && !av->needsImpostorUpdate()) ))
{
return;
}
@ -6111,6 +6114,13 @@ void LLPipeline::calcNearbyLights(LLCamera& camera)
{
const Light* light = &(*iter);
LLDrawable* drawable = light->drawable;
const LLViewerObject *vobj = light->drawable->getVObj();
if(vobj && vobj->getAvatar() && vobj->getAvatar()->isTooComplex())
{
drawable->clearState(LLDrawable::NEARBY_LIGHT);
continue;
}
LLVOVolume* volight = drawable->getVOVolume();
if (!volight || !drawable->isState(LLDrawable::LIGHT))
{
@ -11304,16 +11314,25 @@ void LLPipeline::generateImpostor(LLVOAvatar* avatar)
if (!avatar || !avatar->mDrawable)
{
LL_WARNS_ONCE("AvatarRenderPipeline") << "Avatar is " << (avatar ? "not drawable" : "null") << LL_ENDL;
return;
}
LL_DEBUGS_ONCE("AvatarRenderPipeline") << "Avatar " << avatar->getID() << " is drawable" << LL_ENDL;
assertInitialized();
bool visually_muted = avatar->isVisuallyMuted();
LL_DEBUGS_ONCE("AvatarRenderPipeline") << "Avatar " << avatar->getID()
<< " is " << ( visually_muted ? "" : "not ") << "visually muted"
<< LL_ENDL;
bool too_complex = avatar->isTooComplex();
LL_DEBUGS_ONCE("AvatarRenderPipeline") << "Avatar " << avatar->getID()
<< " is " << ( too_complex ? "" : "not ") << "too complex"
<< LL_ENDL;
pushRenderTypeMask();
if (visually_muted)
if (visually_muted || too_complex)
{
andRenderTypeMask(LLPipeline::RENDER_TYPE_AVATAR, END_RENDER_TYPES);
}
@ -11358,7 +11377,7 @@ void LLPipeline::generateImpostor(LLVOAvatar* avatar)
{
LL_RECORD_BLOCK_TIME(FTM_IMPOSTOR_MARK_VISIBLE);
markVisible(avatar->mDrawable, *viewer_camera);
LLVOAvatar::sUseImpostors = FALSE;
LLVOAvatar::sUseImpostors = false; // @TODO ???
LLVOAvatar::attachment_map_t::iterator iter;
for (iter = avatar->mAttachmentPoints.begin();
@ -11471,7 +11490,7 @@ void LLPipeline::generateImpostor(LLVOAvatar* avatar)
F32 old_alpha = LLDrawPoolAvatar::sMinimumAlpha;
if (visually_muted)
if (visually_muted || too_complex)
{ //disable alpha masking for muted avatars (get whole skin silhouette)
LLDrawPoolAvatar::sMinimumAlpha = 0.f;
}
@ -11533,7 +11552,7 @@ void LLPipeline::generateImpostor(LLVOAvatar* avatar)
LLGLDisable blend(GL_BLEND);
if (visually_muted)
if (visually_muted || too_complex)
{
gGL.setColorMask(true, true);
}
@ -11562,13 +11581,16 @@ void LLPipeline::generateImpostor(LLVOAvatar* avatar)
}
if (LLMuteList::getInstance()->isMuted(avatar->getID()))
{ //grey muted avatar
gGL.diffuseColor4ub(64,64,64,255);
if (visually_muted)
{ // Visually muted avatar
LLColor4 muted_color(avatar->getMutedAVColor());
LL_DEBUGS_ONCE("AvatarRenderPipeline") << "Avatar " << avatar->getID() << " MUTED set solid color " << muted_color << LL_ENDL;
gGL.diffuseColor4fv( muted_color.mV );
}
else
{ // Visually muted avatar
gGL.diffuseColor4fv( avatar->getMutedAVColor().mV );
{ //grey muted avatar
LL_DEBUGS_ONCE("AvatarRenderPipeline") << "Avatar " << avatar->getID() << " MUTED set grey" << LL_ENDL;
gGL.diffuseColor4fv(LLColor4::pink.mV );
}
{
@ -11595,7 +11617,7 @@ void LLPipeline::generateImpostor(LLVOAvatar* avatar)
avatar->setImpostorDim(tdim);
LLVOAvatar::sUseImpostors = TRUE;
LLVOAvatar::sUseImpostors = true; // @TODO ???
sUseOcclusion = occlusion;
sReflectionRender = FALSE;
sImpostorRender = FALSE;

View File

@ -519,7 +519,7 @@ public:
RENDER_DEBUG_BATCH_SIZE = 0x00004000,
RENDER_DEBUG_ALPHA_BINS = 0x00008000,
RENDER_DEBUG_RAYCAST = 0x00010000,
RENDER_DEBUG_SHAME = 0x00020000,
RENDER_DEBUG_AVATAR_DRAW_INFO = 0x00020000,
RENDER_DEBUG_SHADOW_FRUSTA = 0x00040000,
RENDER_DEBUG_SCULPTED = 0x00080000,
RENDER_DEBUG_AVATAR_VOLUME = 0x00100000,

Binary file not shown.

After

Width:  |  Height:  |  Size: 366 B

View File

@ -205,6 +205,8 @@ with the same filename but different name
<texture name="Facebook_Icon" file_name="icons/Facebook.png" preload="false" />
<texture name="Presets_Icon" file_name="icons/Presets_Icon.png" preload="true" />
<texture name="Favorite_Star_Active" file_name="navbar/Favorite_Star_Active.png" preload="false" />
<texture name="Favorite_Star_Off" file_name="navbar/Favorite_Star_Off.png" preload="false" />
<texture name="Favorite_Star_Press" file_name="navbar/Favorite_Star_Press.png" preload="false" />

View File

@ -184,6 +184,7 @@
mouse_opaque="false"
name="divisor3"/>
<text
name="autoreplace_keyword_txt"
type="string"
follows="left|top"
height="16"
@ -204,6 +205,7 @@
width="150"
/>
<text
name="autoreplace_replacement_txt"
type="string"
follows="left|top"
height="16"

View File

@ -0,0 +1,49 @@
<?xml version="1.0" encoding="UTF-8"?>
<floater
legacy_header_height="18"
height="130"
help_topic="floater_delete_preset"
layout="topleft"
name="Delete Pref Preset"
save_rect="true"
title="DELETE PREF PRESET"
width="300">
<string name="title_graphic">Delete Graphic Preset</string>
<string name="title_camera">Delete Camera Preset</string>
<text
follows="top|left|right"
height="10"
layout="topleft"
left="20"
name="Preset"
top="30"
width="200">
Select a preset
</text>
<combo_box
follows="top|left"
layout="topleft"
left="20"
name="preset_combo"
top_delta="20"
width="200"/>
<button
follows="top|left"
height="23"
label="Delete"
layout="topleft"
top_delta="40"
left="20"
name="delete"
width="70"/>
<button
follows="top|left"
height="23"
label="Cancel"
layout="topleft"
left_pad="20"
name="cancel"
width="70"/>
</floater>

View File

@ -22,10 +22,10 @@
top="5"
width="150"
height="20">
<item label="2x Average"/>
<item label="Max"/>
<item label="Recent Max"/>
<item label="100ms"/>
<item name="2x Average" label="2x Average"/>
<item name="Max" label="Max"/>
<item name="Recent Max" label="Recent Max"/>
<item name="100ms" label="100ms"/>
</combo_box>
<combo_box name="metric_combo"
follows="left|top"
@ -33,9 +33,9 @@
top="5"
width="150"
height="20">
<item label="Time"/>
<item label="Number of Calls"/>
<item label="Hz"/>
<item name="Time" label="Time"/>
<item name="Number of Calls" label="Number of Calls"/>
<item name="Hz" label="Hz"/>
</combo_box>
<button follows="top|right"
name="pause_btn"

View File

@ -1,208 +0,0 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<floater
legacy_header_height="18"
height="224"
layout="topleft"
name="Hardware Settings Floater"
help_topic="hardware_settings_floater"
title="HARDWARE SETTINGS"
width="615">
<text
type="string"
length="1"
follows="left|top"
height="12"
layout="topleft"
left="10"
name="Filtering:"
top="20"
width="188">
Filtering:
</text>
<check_box
control_name="RenderAnisotropic"
height="16"
label="Anisotropic Filtering (slower when enabled)"
layout="topleft"
left_pad="10"
name="ani"
top_delta="0"
width="256" />
<text
type="string"
length="1"
follows="left|top"
height="12"
layout="topleft"
left="10"
name="antialiasing label"
top_pad="7"
width="188">
Antialiasing:
</text>
<combo_box
control_name="RenderFSAASamples"
height="22"
initial_value="false"
label="Antialiasing"
layout="topleft"
left_pad="10"
name="fsaa"
top_delta="0"
width="130">
<combo_box.item
label="Disabled"
name="FSAADisabled"
value="0" />
<combo_box.item
label="2x"
name="2x"
value="2" />
<combo_box.item
label="4x"
name="4x"
value="4" />
<combo_box.item
label="8x"
name="8x"
value="8" />
<combo_box.item
label="16x"
name="16x"
value="16" />
</combo_box>
<text
type="string"
length="1"
follows="left|top"
height="12"
layout="topleft"
left_pad="10"
name="antialiasing restart"
top_delta="0"
width="230">
(requires viewer restart)
</text>
<spinner
control_name="RenderGamma"
decimal_digits="2"
follows="left|top"
height="16"
increment="0.01"
initial_value="1"
label="Gamma:"
label_width="198"
layout="topleft"
left="10"
max_val="2"
name="gamma"
top_pad="11"
width="262" />
<text
type="string"
length="1"
follows="left|top"
height="12"
layout="topleft"
left_pad="10"
name="(brightness, lower is brighter)"
top_delta="2"
width="385">
(0 = default brightness, lower = brighter)
</text>
<text
type="string"
length="1"
follows="left|top"
height="16"
layout="topleft"
left="10"
name="Enable VBO:"
top_pad="10"
width="188">
Enable VBO:
</text>
<check_box
control_name="RenderVBOEnable"
height="16"
initial_value="true"
label="Enable OpenGL Vertex Buffer Objects"
layout="topleft"
left_pad="10"
name="vbo"
tool_tip="Enabling this on modern hardware gives a performance gain. However, older hardware often has poor implementations of VBOs and you may get crashes when this is enabled."
width="315" />
<text
type="string"
length="1"
follows="left|top"
height="16"
layout="topleft"
left="10"
name="tc label"
top_pad="10"
width="188">
Enable S3TC:
</text>
<check_box
control_name="RenderCompressTextures"
height="16"
initial_value="true"
label="Enable Texture Compression (requires restart)"
layout="topleft"
left_pad="10"
name="texture compression"
tool_tip="Compresses textures in video memory, allowing for higher resolution textures to be loaded at the cost of some color quality."
width="315" />
<slider
control_name="TextureMemory"
decimal_digits="0"
follows="left|top"
height="20"
increment="16"
initial_value="32"
label="Texture Memory (MB):"
label_width="195"
layout="topleft"
left="10"
max_val="4096"
name="GraphicsCardTextureMemory"
tool_tip="Amount of memory to allocate for textures. Defaults to video card memory. Reducing this may improve performance but may also make textures blurry."
top_pad="10"
width="360" />
<spinner
control_name="RenderFogRatio"
decimal_digits="1"
follows="left|top"
height="22"
initial_value="4"
label="Fog Distance Ratio:"
label_width="198"
layout="topleft"
left_delta="0"
max_val="10"
min_val="0.5"
name="fog"
top_pad="7"
width="262" />
<button
follows="right|bottom"
height="22"
label="OK"
label_selected="OK"
layout="topleft"
right="-105"
name="OK"
top="192"
width="90" />
<button
follows="right|bottom"
height="22"
label="Cancel"
label_selected="Cancel"
layout="topleft"
left_pad="5"
name="Cancel"
right="-10"
width="90" />
</floater>

View File

@ -301,6 +301,7 @@
top_pad="4"
width="64" />
<text
name="label_hours"
type="string"
length="1"
follows="left|top"
@ -323,6 +324,7 @@
left="8"
width="64" />
<text
name="label_days"
type="string"
length="1"
follows="left|top"

View File

@ -0,0 +1,49 @@
<?xml version="1.0" encoding="UTF-8"?>
<floater
legacy_header_height="18"
height="130"
help_topic="floater_load_preset"
layout="topleft"
name="Load Pref Preset"
save_rect="true"
title="LOAD PREF PRESET"
width="300">
<string name="title_graphic">Load Graphic Preset</string>
<string name="title_camera">Load Camera Preset</string>
<text
follows="top|left|right"
height="16"
layout="topleft"
left="20"
name="Preset"
top="30"
width="200">
Select a preset
</text>
<combo_box
follows="top|left"
layout="topleft"
left="20"
name="preset_combo"
top_delta="20"
width="200"/>
<button
follows="top|left"
height="23"
label="OK"
layout="topleft"
top_delta="40"
left="20"
name="ok"
width="70"/>
<button
follows="top|left"
height="23"
label="Cancel"
layout="topleft"
left_pad="20"
name="cancel"
width="70"/>
</floater>

View File

@ -19,6 +19,7 @@
<string name="OutboxImporting">Sending folders...</string>
<string name="OutboxInitializing">Initializing...</string>
<panel
name="panel_1"
follows="all"
layout="topleft"
left="0"
@ -27,6 +28,7 @@
height="440"
width="333">
<panel
name="panel_2"
follows="all"
left="10"
bottom="370"
@ -70,6 +72,7 @@
</panel>
</panel>
<panel
name="panel_3"
follows="bottom|left|right"
left="10"
bottom="435"
@ -89,6 +92,7 @@
bevel_style="in"
visible="true">
<text
name="text_1"
type="string"
follows="all"
layout="topleft"

View File

@ -185,9 +185,11 @@
width="135">
<item
name="Load from file"
label="Load from file"
value="Load from file" />
<item
name="Generate"
label="Generate"
value="Generate" />
</combo_box>
<line_editor
@ -220,9 +222,11 @@
width="130">
<item
name="Triangle Limit"
label="Triangle Limit"
value="Triangle Limit" />
<item
name="Error Threshold"
label="Error Threshold"
value="Error Threshold" />
</combo_box>
<spinner
@ -310,12 +314,15 @@
width="135">
<item
name="Load from file"
label="Load from file"
value="Load from file" />
<item
name="Generate"
label="Generate"
value="Generate" />
<item
name="Use LoD above"
label="Use LoD above"
value="Use LoD above" />
</combo_box>
<line_editor
@ -349,9 +356,11 @@
width="130">
<item
name="Triangle Limit"
label="Triangle Limit"
value="Triangle Limit" />
<item
name="Error Threshold"
label="Error Threshold"
value="Error Threshold" />
</combo_box>
<spinner
@ -438,12 +447,15 @@
width="135">
<item
name="Load from file"
label="Load from file"
value="Load from file" />
<item
name="Generate"
label="Generate"
value="Generate" />
<item
name="Use LoD above"
label="Use LoD above"
value="Use LoD above" />
</combo_box>
<line_editor
@ -477,9 +489,11 @@
width="130">
<item
name="Triangle Limit"
label="Triangle Limit"
value="Triangle Limit" />
<item
name="Error Threshold"
label="Error Threshold"
value="Error Threshold" />
</combo_box>
<spinner
@ -566,12 +580,15 @@
width="135">
<item
name="Load from file"
label="Load from file"
value="Load from file" />
<item
name="Generate"
label="Generate"
value="Generate" />
<item
name="Use LoD above"
label="Use LoD above"
value="Use LoD above" />
</combo_box>
<line_editor
@ -605,9 +622,11 @@
width="130">
<item
name="Triangle Limit"
label="Triangle Limit"
value="Triangle Limit" />
<item
name="Error Threshold"
label="Error Threshold"
value="Error Threshold" />
</combo_box>
<spinner

View File

@ -27,6 +27,7 @@
<floater.string name="character_owner_unknown">[Unknown]</floater.string>
<floater.string name="character_owner_group">[group]</floater.string>
<panel
name="pathfinding_chars_main"
border="false"
bevel_style="none"
follows="left|top|right|bottom"
@ -118,6 +119,7 @@
left="18"
width="600"/>
<panel
name="pathfinding_chars_actions"
border="false"
bevel_style="none"
follows="left|right|bottom"

View File

@ -37,6 +37,7 @@
<floater.string name="pathing_path_invalid">A path between the chosen points cannot be found.</floater.string>
<floater.string name="pathing_error">An error occurred during path generation.</floater.string>
<panel
name="pathfinding_console_main"
border="false"
bevel_style="none"
follows="left|top"
@ -46,6 +47,7 @@
height="61"
width="214">
<text
name="viewer_status_label"
height="13"
word_wrap="true"
use_ellipses="false"
@ -74,6 +76,7 @@
</text>
</panel>
<panel
name="pathfinding_console_simulator"
border="false"
bevel_style="none"
follows="left|top"
@ -82,6 +85,7 @@
height="66"
width="214">
<text
name="simulator_status_label"
height="13"
word_wrap="true"
use_ellipses="false"

View File

@ -46,6 +46,7 @@
<floater.string name="linkset_is_restricted_non_volume_state">[restricted,concave]</floater.string>
<floater.string name="linkset_choose_use">Choose linkset use...</floater.string>
<panel
name="pathfinding_linksets_main"
border="false"
bevel_style="none"
follows="left|top|right|bottom"
@ -53,6 +54,7 @@
height="226"
width="1059">
<text
name="linksets_filter_label"
height="13"
word_wrap="false"
use_ellipses="false"
@ -67,6 +69,7 @@
Filter by:
</text>
<text
name="linksets_name_label"
height="13"
word_wrap="false"
use_ellipses="false"
@ -91,6 +94,7 @@
name="filter_by_name"
width="161" />
<text
name="linksets_desc_label"
height="13"
word_wrap="false"
use_ellipses="false"
@ -279,6 +283,7 @@
left="18"
width="1039"/>
<panel
name="pathfinding_linksets_actions"
border="false"
bevel_style="none"
follows="left|right|bottom"
@ -287,6 +292,7 @@
height="67"
width="1010">
<text
name="linksets_actions_label"
height="13"
word_wrap="false"
use_ellipses="false"
@ -366,6 +372,7 @@
left="18"
width="1039"/>
<panel
name="pathfinding_linksets_attributes"
border="false"
bevel_style="none"
follows="left|right|bottom"
@ -374,6 +381,7 @@
height="75"
width="1010">
<text
name="linksets_attributes_label"
height="13"
word_wrap="false"
use_ellipses="false"

View File

@ -24,6 +24,7 @@
left="0"
width="430" />
<text
name="label_1"
type="string"
length="1"
follows="left|top"
@ -36,6 +37,7 @@
Next owner:
</text>
<text
name="label_2"
type="string"
length="1"
follows="left|top"
@ -48,6 +50,7 @@
Copy
</text>
<text
name="label_3"
type="string"
length="1"
follows="left|top"
@ -60,6 +63,7 @@
Modify
</text>
<text
name="label_4"
type="string"
length="1"
follows="left|top"
@ -72,6 +76,7 @@
Transfer
</text>
<text
name="label_5"
type="string"
length="1"
follows="left|top"
@ -85,6 +90,7 @@
Share with group
</text>
<text
name="label_6"
type="string"
length="1"
follows="left|top"
@ -98,6 +104,7 @@
Allow anyone to copy
</text>
<text
name="label_7"
type="string"
length="1"
follows="left|top"
@ -162,6 +169,7 @@
top_delta="0"
width="100" />
<text
name="label_8"
type="string"
length="1"
follows="left|top"
@ -225,6 +233,7 @@
top_delta="0"
width="100" />
<text
name="label_9"
type="string"
length="1"
follows="left|top"
@ -288,6 +297,7 @@
top_delta="0"
width="100" />
<text
name="label_10"
type="string"
length="1"
follows="left|top"
@ -351,6 +361,7 @@
top_delta="0"
width="100" />
<text
name="label_11"
type="string"
length="1"
follows="left|top"
@ -414,6 +425,7 @@
top_delta="0"
width="100" />
<text
name="label_12"
type="string"
length="1"
follows="left|top"

View File

@ -11,7 +11,7 @@
single_instance="true"
title="PREFERENCES"
width="658">
<button
<button
follows="right|bottom"
height="23"
label="OK"

View File

@ -0,0 +1,935 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<floater
height="400"
layout="topleft"
name="prefs_graphics_advanced"
help_topic="Preferences_Graphics_Advanced"
single_instance="true"
save_rect="true"
title="ADVANCED GRAPHICS PREFERENCES"
width="800">
<!-- This block shows Advanced Settings -->
<text
type="string"
length="1"
follows="left|top"
height="16"
layout="topleft"
name="GeneralText"
top="5"
left="10"
width="128">
General
</text>
<slider
control_name="RenderFarClip"
decimal_digits="0"
follows="left|top"
height="16"
increment="8"
initial_value="160"
label="Draw distance:"
label_width="185"
layout="topleft"
left="30"
min_val="64"
max_val="512"
name="DrawDistance"
top_delta="16"
width="330" />
<text
type="string"
length="1"
follows="left|top"
height="16"
layout="topleft"
name="DrawDistanceMeterText2"
top_delta="0"
left_delta="330"
width="20">
m
</text>
<slider
control_name="RenderMaxPartCount"
decimal_digits="0"
follows="left|top"
height="16"
increment="256"
initial_value="4096"
label="Max. particle count:"
label_width="185"
layout="topleft"
left="30"
max_val="8192"
name="MaxParticleCount"
top_delta="16"
width="336" />
<slider
control_name="RenderGlowResolutionPow"
decimal_digits="0"
follows="left|top"
height="16"
increment="1"
initial_value="8"
label="Post process quality:"
label_width="185"
layout="topleft"
left="30"
min_val="8"
max_val="9"
name="RenderPostProcess"
show_text="false"
top_delta="16"
width="300">
<slider.commit_callback
function="Pref.UpdateSliderText"
parameter="PostProcessText" />
</slider>
<text
type="string"
length="1"
follows="left|top"
height="16"
layout="topleft"
name="PostProcessText"
top_delta="0"
left_delta="304"
width="65">
Low
</text>
<text
type="string"
length="1"
follows="left|top"
height="16"
layout="topleft"
name="AvatarText"
top_delta="20"
left="10"
width="128">
Avatar
</text>
<slider
control_name="IndirectMaxComplexity"
tool_tip="Controls at what point a visually complex avatar is drawn as a jellybaby"
follows="left|top"
height="16"
initial_value="101"
increment="1"
label="Maximum complexity:"
label_width="185"
layout="topleft"
left="30"
min_val="1"
max_val="101"
name="IndirectMaxComplexity"
show_text="false"
top_delta="16"
width="300">
<slider.commit_callback
function="Pref.UpdateIndirectMaxComplexity"
parameter="IndirectMaxComlexityText" />
</slider>
<text
type="string"
length="1"
follows="left|top"
height="16"
layout="topleft"
top_delta="0"
left_delta="304"
text_readonly_color="LabelDisabledColor"
name="IndirectMaxComplexityText"
width="65">
0
</text>
<slider
control_name="IndirectMaxNonImpostors"
decimal_digits="0"
follows="left|top"
height="16"
increment="1"
initial_value="12"
label="Max. # of non-impostors:"
label_width="185"
layout="topleft"
left="30"
min_val="1"
max_val="66"
name="IndirectMaxNonImpostors"
show_text="false"
top_delta="16"
width="300">
<slider.commit_callback
function="Pref.UpdateIndirectMaxNonImpostors"
parameter="IndirectNonImpostorsText" />
</slider>
<text
type="string"
length="1"
follows="left|top"
height="16"
layout="topleft"
top_delta="0"
left_delta="304"
text_readonly_color="LabelDisabledColor"
name="IndirectMaxNonImpostorsText"
width="65">
0
</text>
<slider
control_name="RenderAvatarLODFactor"
follows="left|top"
height="16"
increment="0.125"
initial_value="160"
label="Detail:"
label_width="185"
layout="topleft"
left="30"
name="AvatarMeshDetail"
show_text="false"
top_delta="16"
width="300">
<slider.commit_callback
function="Pref.UpdateSliderText"
parameter="AvatarMeshDetailText" />
</slider>
<text
type="string"
length="1"
follows="left|top"
height="16"
layout="topleft"
name="AvatarMeshDetailText"
top_delta="0"
left_delta="304"
width="65">
Low
</text>
<slider
control_name="RenderAvatarPhysicsLODFactor"
follows="left|top"
height="16"
initial_value="100"
increment=".05"
label="Physics:"
label_width="185"
layout="topleft"
left="30"
name="AvatarPhysicsDetail"
show_text="false"
top_delta="16"
width="300">
<slider.commit_callback
function="Pref.UpdateSliderText"
parameter="AvatarPhysicsDetailText" />
</slider>
<text
type="string"
length="1"
follows="left|top"
height="16"
layout="topleft"
top_delta="0"
left_delta="304"
name="AvatarPhysicsDetailText"
width="65">
Low
</text>
<text
type="string"
length="1"
follows="left|top"
height="16"
layout="topleft"
name="ShadersText"
top_delta="20"
left="10"
width="128">
Hardware
</text>
<slider
control_name="TextureMemory"
decimal_digits="0"
follows="left|top"
height="16"
increment="16"
initial_value="32"
label="Texture Memory (MB):"
label_width="185"
layout="topleft"
left="30"
max_val="4096"
name="GraphicsCardTextureMemory"
tool_tip="Amount of memory to allocate for textures. Defaults to video card memory. Reducing this may improve performance but may also make textures blurry."
top_delta="16"
width="335" />
<slider
control_name="RenderFogRatio"
follows="left|top"
height="16"
initial_value="4"
decimal_digits="1"
label="Fog Distance Ratio:"
label_width="185"
layout="topleft"
left="30"
name="fog"
min_val="0.5"
max_val="10"
increment="0.1"
top_delta="16"
width="332" />
<slider
control_name="RenderGamma"
follows="left|top"
height="16"
initial_value="1"
decimal_digits="2"
label="Gamma:"
label_width="185"
layout="topleft"
left="30"
name="gamma"
min_val="0"
max_val="2"
increment="0.01"
top_delta="16"
width="332" />
<text
type="string"
length="1"
follows="left|top"
height="16"
layout="topleft"
left="30"
name="(brightness, lower is brighter)"
top_delta="16"
width="260">
(0 = default brightness, lower = brighter)
</text>
<check_box
control_name="RenderAnisotropic"
height="16"
label="Anisotropic Filtering (slower when enabled)"
layout="topleft"
left="30"
name="ani"
top_delta="16"
width="256" />
<check_box
control_name="RenderVBOEnable"
height="16"
initial_value="true"
label="Enable OpenGL Vertex Buffer Objects"
layout="topleft"
left="30"
top_delta="16"
name="vbo"
tool_tip="Enabling this on modern hardware gives a performance gain. However, older hardware often has poor implementations of VBOs and you may get crashes when this is enabled."
width="315" />
<check_box
control_name="RenderCompressTextures"
height="16"
initial_value="true"
label="Enable Texture Compression (requires restart)"
layout="topleft"
left="30"
top_delta="16"
name="texture compression"
tool_tip="Compresses textures in video memory, allowing for higher resolution textures to be loaded at the cost of some color quality."
width="315" />
<text
type="string"
length="1"
follows="left|top"
height="20"
layout="topleft"
left="30"
name="antialiasing label"
top_delta="20"
width="100">
Antialiasing:
</text>
<combo_box
control_name="RenderFSAASamples"
height="20"
initial_value="false"
label="Antialiasing"
layout="topleft"
left_pad="40"
name="fsaa"
top_delta="0"
width="90">
<combo_box.item
label="Disabled"
name="FSAADisabled"
value="0" />
<combo_box.item
label="2x"
name="2x"
value="2" />
<combo_box.item
label="4x"
name="4x"
value="4" />
<combo_box.item
label="8x"
name="8x"
value="8" />
<combo_box.item
label="16x"
name="16x"
value="16" />
</combo_box>
<text
type="string"
length="1"
follows="left|top"
height="16"
layout="topleft"
left_pad="10"
name="antialiasing restart"
top_delta="0"
width="130">
(requires restart)
</text>
<view_border
bevel_style="in"
height="322"
layout="topleft"
left="385"
name="vert_border"
top="16"
width="0"/>
<text
type="string"
length="1"
follows="left|top"
height="16"
layout="topleft"
name="AvatarText"
top_delta="20"
left="400"
top="21"
width="128">
Mesh
</text>
<slider
control_name="RenderTerrainLODFactor"
follows="left|top"
height="16"
increment="0.125"
initial_value="160"
label="Terrain Mesh Detail:"
label_width="185"
layout="topleft"
left="420"
min_val="1"
max_val="2"
name="TerrainMeshDetail"
show_text="false"
top_delta="16"
width="300">
<slider.commit_callback
function="Pref.UpdateSliderText"
parameter="TerrainMeshDetailText" />
</slider>
<text
type="string"
length="1"
follows="left|top"
height="16"
layout="topleft"
name="TerrainMeshDetailText"
text_readonly_color="LabelDisabledColor"
top_delta="0"
left_delta="304"
width="65">
Low
</text>
<slider
control_name="RenderTreeLODFactor"
follows="left|top"
height="16"
increment="0.125"
initial_value="160"
label="Trees:"
label_width="185"
layout="topleft"
left="420"
name="TreeMeshDetail"
show_text="false"
top_delta="16"
width="300">
<slider.commit_callback
function="Pref.UpdateSliderText"
parameter="TreeMeshDetailText" />
</slider>
<text
type="string"
length="1"
follows="left|top"
height="16"
layout="topleft"
name="TreeMeshDetailText"
top_delta="0"
left_delta="304"
width="65">
Low
</text>
<slider
control_name="RenderVolumeLODFactor"
follows="left|top"
height="16"
increment="0.125"
initial_value="160"
label="Objects:"
label_width="185"
layout="topleft"
left="420"
max_val="2"
name="ObjectMeshDetail"
show_text="false"
top_delta="16"
width="300">
<slider.commit_callback
function="Pref.UpdateSliderText"
parameter="ObjectMeshDetailText" />
</slider>
<text
type="string"
length="1"
follows="left|top"
height="16"
layout="topleft"
name="ObjectMeshDetailText"
top_delta="0"
left_delta="304"
width="65">
Low
</text>
<slider
control_name="RenderFlexTimeFactor"
follows="left|top"
height="16"
initial_value="160"
label="Flexiprims:"
label_width="185"
layout="topleft"
left="420"
name="FlexibleMeshDetail"
show_text="false"
top_delta="16"
width="300">
<slider.commit_callback
function="Pref.UpdateSliderText"
parameter="FlexibleMeshDetailText" />
</slider>
<text
type="string"
length="1"
follows="left|top"
height="16"
layout="topleft"
name="FlexibleMeshDetailText"
top_delta="0"
left_delta="304"
width="65">
Low
</text>
<text
type="string"
length="1"
follows="left|top"
height="16"
layout="topleft"
name="ShadersText"
top_delta="20"
left="400"
width="128">
Shaders
</text>
<check_box
control_name="RenderTransparentWater"
height="16"
initial_value="true"
label="Transparent Water"
layout="topleft"
left="420"
name="TransparentWater"
top_delta="16"
width="300" />
<check_box
control_name="RenderObjectBump"
height="16"
initial_value="true"
label="Bump mapping and shiny"
layout="topleft"
left="420"
name="BumpShiny"
top_delta="16"
width="300">
<check_box.commit_callback
function="Pref.VertexShaderEnable" />
</check_box>
<check_box
control_name="RenderLocalLights"
height="16"
initial_value="true"
label="Local Lights"
layout="topleft"
left="420"
name="LocalLights"
top_delta="16"
width="300" />
<check_box
control_name="VertexShaderEnable"
height="16"
initial_value="true"
label="Basic shaders"
layout="topleft"
left="420"
name="BasicShaders"
tool_tip="Disabling this option may prevent some graphics card drivers from crashing"
top_delta="16"
width="300">
<check_box.commit_callback
function="Pref.VertexShaderEnable" />
</check_box>
<slider
control_name="RenderTerrainDetail"
follows="left|top"
height="16"
label="Terrain Detail:"
label_width="165"
layout="topleft"
left="440"
show_text="false"
initial_value="0"
increment="1"
min_val="0"
max_val="1"
name="TerrainDetail"
top_delta="16"
width="280" >
<slider.commit_callback
function="Pref.UpdateSliderText"
parameter="TerrainDetail" />
</slider>
<text
type="string"
length="1"
follows="left|top"
height="16"
layout="topleft"
top_delta="0"
left_delta="284"
name="TerrainDetailText"
text_readonly_color="LabelDisabledColor"
width="65">
Low
</text>
<check_box
control_name="RenderAvatarVP"
height="16"
initial_value="true"
label="Avatar Hardware skinning"
layout="topleft"
left="440"
name="AvatarVertexProgram"
top_delta="16"
width="280">
<check_box.commit_callback
function="Pref.VertexShaderEnable" />
</check_box>
<check_box
control_name="RenderAvatarCloth"
height="16"
initial_value="true"
label="Avatar cloth"
layout="topleft"
left="440"
name="AvatarCloth"
top_delta="16"
width="280" />
<text
type="string"
length="1"
follows="left|top"
height="16"
layout="topleft"
name="ReflectionsText"
text_readonly_color="LabelDisabledColor"
top_delta="16"
left="440"
width="128">
Water Reflections:
</text>
<combo_box
control_name="RenderReflectionDetail"
height="18"
layout="topleft"
left_delta="170"
top_delta="0"
name="Reflections"
width="150">
<combo_box.item
label="Minimal"
name="0"
value="0"/>
<combo_box.item
label="Terrain and trees"
name="1"
value="1"/>
<combo_box.item
label="All static objects"
name="2"
value="2"/>
<combo_box.item
label="All avatars and objects"
name="3"
value="3"/>
<combo_box.item
label="Everything"
name="4"
value="4"/>
</combo_box>
<check_box
control_name="WindLightUseAtmosShaders"
height="16"
initial_value="true"
label="Atmospheric shaders"
layout="topleft"
left="440"
name="WindLightUseAtmosShaders"
top_delta="16"
width="280">
<check_box.commit_callback
function="Pref.VertexShaderEnable" />
</check_box>
<slider
control_name="WLSkyDetail"
decimal_digits="0"
follows="left|top"
height="16"
increment="8"
initial_value="160"
label="Sky:"
label_width="145"
layout="topleft"
left="460"
min_val="16"
max_val="128"
name="SkyMeshDetail"
show_text="false"
top_delta="16"
width="260">
<slider.commit_callback
function="Pref.UpdateSliderText"
parameter="SkyMeshDetailText" />
</slider>
<text
type="string"
length="1"
follows="left|top"
height="16"
layout="topleft"
left_delta="264"
name="SkyMeshDetailText"
text_readonly_color="LabelDisabledColor"
top_delta="0"
width="65">
Low
</text>
<check_box
control_name="RenderDeferred"
height="16"
initial_value="true"
label="Advanced Lighting Model"
layout="topleft"
left="460"
name="UseLightShaders"
top_delta="16"
width="260">
<check_box.commit_callback
function="Pref.VertexShaderEnable" />
</check_box>
<check_box
control_name="RenderDeferredSSAO"
height="16"
initial_value="true"
label="Ambient Occlusion"
layout="topleft"
left="480"
name="UseSSAO"
top_delta="16"
width="240">
<check_box.commit_callback
function="Pref.VertexShaderEnable" />
</check_box>
<check_box
control_name="RenderDepthOfField"
height="16"
initial_value="true"
label="Depth of Field"
layout="topleft"
left="480"
name="UseDoF"
top_delta="16"
width="240">
<check_box.commit_callback
function="Pref.VertexShaderEnable" />
</check_box>
<text
type="string"
length="1"
follows="left|top"
height="16"
layout="topleft"
left="480"
name="RenderShadowDetailText"
text_readonly_color="LabelDisabledColor"
top_delta="16"
width="128">
Shadows:
</text>
<combo_box
control_name="RenderShadowDetail"
height="18"
layout="topleft"
left_delta="130"
top_delta="0"
name="ShadowDetail"
width="150">
<combo_box.item
label="None"
name="0"
value="0"/>
<combo_box.item
label="Sun/Moon"
name="1"
value="1"/>
<combo_box.item
label="Sun/Moon + Projectors"
name="2"
value="2"/>
</combo_box>
<!-- End of Advanced Settings block -->
<view_border
bevel_style="in"
height="0"
layout="topleft"
left="13"
name="horiz_border"
top_pad="5"
top_delta="5"
width="774"/>
<button
follows="top|left"
height="23"
label="Reset to recommended settings"
layout="topleft"
left="20"
name="Defaults"
top_delta="10"
width="210">
<button.commit_callback
function="Pref.HardwareDefaults" />
</button>
<button
follows="right|bottom"
height="23"
label="OK"
label_selected="OK"
layout="topleft"
right="-115"
name="OK"
top_delta="0"
width="80">
<button.commit_callback
function="Pref.OK"
parameter="closeadvanced" />
</button>
<button
follows="right|bottom"
height="23"
label="Cancel"
label_selected="Cancel"
layout="topleft"
left_pad="5"
right="-20"
name="Cancel"
top_delta="0"
width="80" >
<button.commit_callback
function="Pref.Cancel"
parameter="closeadvanced" />
</button>
<!-- These two check boxes are dummies and will never be displayed. They are here so the control variables
are saved in a preset file. -->
<check_box
control_name="RenderAvatarMaxComplexity"
visible="false"
height="0"
label="RenderAvatarMaxComplexity"
layout="topleft"
left="0"
name="RenderAvatarMaxNonImpostors"
top_delta="0"
width="0">
</check_box>
<check_box
control_name="RenderAvatarMaxNonImpostors"
visible="false"
height="0"
label="RenderAvatarMaxNonImpostors"
layout="topleft"
left="0"
name="RenderAvatarMaxNonImpostors"
top_delta="0"
width="0">
</check_box>
</floater>

View File

@ -0,0 +1,51 @@
<?xml version="1.0" encoding="UTF-8"?>
<floater
legacy_header_height="18"
height="145"
help_topic="floater_save_preset"
layout="topleft"
name="Save Pref Preset"
save_rect="true"
title="SAVE PREF PRESET"
width="300">
<string name="title_graphic">Save Graphic Preset</string>
<string name="title_camera">Save Camera Preset</string>
<text
follows="top|left|right"
height="32"
layout="topleft"
word_wrap="true"
left="20"
name="Preset"
top="30"
width="200">
Type a name for the preset or choose an existing preset.
</text>
<combo_box
follows="top|left"
layout="topleft"
left="20"
name="preset_combo"
top_delta="35"
allow_text_entry="true"
width="200"/>
<button
follows="top|left"
height="23"
label="Save"
layout="topleft"
top_delta="40"
left="20"
name="save"
width="70"/>
<button
follows="bottom|right"
height="23"
label="Cancel"
layout="topleft"
left_pad="20"
name="cancel"
width="70"/>
</floater>

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