Merge remote-tracking branch 'Liru/master'
This commit is contained in:
@@ -7,7 +7,7 @@ include(00-Common)
|
||||
include_directories(${LIBS_OPEN_DIR}/libhacd)
|
||||
|
||||
set (libndhacd_SOURCE_FILES
|
||||
LLConvexDecomposition.cpp
|
||||
llconvexdecomposition.cpp
|
||||
nd_hacdConvexDecomposition.cpp
|
||||
nd_hacdStructs.cpp
|
||||
nd_hacdUtils.cpp
|
||||
@@ -16,12 +16,12 @@ set (libndhacd_SOURCE_FILES
|
||||
)
|
||||
|
||||
set (libndhacd_HEADER_FILES
|
||||
LLConvexDecomposition.h
|
||||
llconvexdecomposition.h
|
||||
ndConvexDecomposition.h
|
||||
nd_hacdConvexDecomposition.h
|
||||
nd_hacdStructs.h
|
||||
nd_StructTracer.h
|
||||
LLConvexDecompositionStubImpl.h
|
||||
llconvexdecompositionstubimpl.h
|
||||
nd_EnterExitTracer.h
|
||||
nd_hacdDefines.h
|
||||
nd_hacdUtils.h
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/**
|
||||
* @file LLConvexDecomposition.cpp
|
||||
* @file llconvexdecomposition.cpp
|
||||
* @author falcon@lindenlab.com
|
||||
* @brief A stub implementation of LLConvexDecomposition interface
|
||||
*
|
||||
@@ -35,7 +35,7 @@
|
||||
|
||||
#include "nd_hacdConvexDecomposition.h"
|
||||
|
||||
#include "LLConvexDecomposition.h"
|
||||
#include "llconvexdecomposition.h"
|
||||
|
||||
|
||||
/*static */bool LLConvexDecomposition::s_isInitialized = false;
|
||||
@@ -1,5 +1,5 @@
|
||||
/**
|
||||
* @file LLConvexDecomposition.cpp
|
||||
* @file llconvexdecomposition.cpp
|
||||
* @brief LLConvexDecomposition interface definition
|
||||
*
|
||||
* $LicenseInfo:firstyear=2011&license=viewerlgpl$
|
||||
@@ -1,5 +1,5 @@
|
||||
/**
|
||||
* @file LLConvexDecompositionStubImpl.cpp
|
||||
* @file llconvexdecompositionstubimpl.cpp
|
||||
* @author falcon@lindenlab.com
|
||||
* @brief A stub implementation of LLConvexDecomposition
|
||||
*
|
||||
@@ -28,7 +28,7 @@
|
||||
|
||||
#include <string.h>
|
||||
#include <memory>
|
||||
#include "LLConvexDecompositionStubImpl.h"
|
||||
#include "llconvexdecompositionstubimpl.h"
|
||||
|
||||
LLConvexDecomposition* LLConvexDecompositionImpl::getInstance()
|
||||
{
|
||||
@@ -1,5 +1,5 @@
|
||||
/**
|
||||
* @file LLConvexDecompositionStubImpl.h
|
||||
* @file llconvexdecompositionstubimpl.h
|
||||
* @author falcon@lindenlab.com
|
||||
* @brief A stub implementation of LLConvexDecomposition
|
||||
*
|
||||
@@ -29,7 +29,7 @@
|
||||
#ifndef LL_CONVEX_DECOMP_UTIL_H
|
||||
#define LL_CONVEX_DECOMP_UTIL_H
|
||||
|
||||
#include "LLConvexDecomposition.h"
|
||||
#include "llconvexdecomposition.h"
|
||||
|
||||
class LLConvexDecompositionImpl : public LLConvexDecomposition
|
||||
{
|
||||
@@ -21,7 +21,7 @@
|
||||
|
||||
|
||||
#include "ndConvexDecomposition.h"
|
||||
#include "LLConvexDecomposition.h"
|
||||
#include "llconvexdecomposition.h"
|
||||
#include "nd_hacdStructs.h"
|
||||
|
||||
namespace ndStructTracer
|
||||
|
||||
@@ -19,7 +19,7 @@
|
||||
#ifndef ND_HACD_CONVEXDECOMP_H
|
||||
#define ND_HACD_CONVEXDECOMP_H
|
||||
|
||||
#include "LLConvexDecomposition.h"
|
||||
#include "llconvexdecomposition.h"
|
||||
|
||||
#include <map>
|
||||
#include <vector>
|
||||
|
||||
@@ -17,7 +17,6 @@
|
||||
*/
|
||||
|
||||
#include "nd_hacdStructs.h"
|
||||
#include "LLConvexDecomposition.h"
|
||||
|
||||
void DecompHull::clear()
|
||||
{
|
||||
|
||||
@@ -21,7 +21,7 @@
|
||||
|
||||
#include "nd_hacdDefines.h"
|
||||
#include "hacdHACD.h"
|
||||
#include "LLConvexDecomposition.h"
|
||||
#include "llconvexdecomposition.h"
|
||||
#include <vector>
|
||||
|
||||
struct LLCDHull;
|
||||
|
||||
@@ -20,7 +20,6 @@
|
||||
#define ND_HACD_UTILS_H
|
||||
|
||||
#include "nd_hacdStructs.h"
|
||||
#include "LLConvexDecomposition.h"
|
||||
|
||||
tHACD* init( int nConcavity, int nClusters, int nMaxVerticesPerHull, double dMaxConnectDist, HACDDecoder *aData );
|
||||
DecompData decompose( tHACD *aHACD );
|
||||
|
||||
@@ -237,13 +237,21 @@ void LLHTTPClient::request(
|
||||
req->run(parent, new_parent_state, parent != NULL, true, default_engine);
|
||||
}
|
||||
|
||||
void LLHTTPClient::getByteRange(std::string const& url, S32 offset, S32 bytes, ResponderPtr responder, AIHTTPHeaders& headers/*,*/ DEBUG_CURLIO_PARAM(EDebugCurl debug))
|
||||
bool LLHTTPClient::getByteRange(std::string const& url, AIHTTPHeaders& headers, S32 offset, S32 bytes, ResponderPtr responder/*,*/ DEBUG_CURLIO_PARAM(EDebugCurl debug))
|
||||
{
|
||||
if(offset > 0 || bytes > 0)
|
||||
try
|
||||
{
|
||||
headers.addHeader("Range", llformat("bytes=%d-%d", offset, offset + bytes - 1));
|
||||
if (offset > 0 || bytes > 0)
|
||||
{
|
||||
headers.addHeader("Range", llformat("bytes=%d-%d", offset, offset + bytes - 1));
|
||||
}
|
||||
request(url, HTTP_GET, NULL, responder, headers, NULL/*,*/ DEBUG_CURLIO_PARAM(debug));
|
||||
}
|
||||
request(url, HTTP_GET, NULL, responder, headers, NULL/*,*/ DEBUG_CURLIO_PARAM(debug));
|
||||
catch(AICurlNoEasyHandle const&)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
void LLHTTPClient::head(std::string const& url, ResponderHeadersOnly* responder, AIHTTPHeaders& headers/*,*/ DEBUG_CURLIO_PARAM(EDebugCurl debug))
|
||||
|
||||
@@ -133,6 +133,14 @@ public:
|
||||
public:
|
||||
typedef boost::shared_ptr<LLBufferArray> buffer_ptr_t;
|
||||
|
||||
/**
|
||||
* @brief return true if the status code indicates success.
|
||||
*/
|
||||
static bool isGoodStatus(U32 status)
|
||||
{
|
||||
return((200 <= status) && (status < 300));
|
||||
}
|
||||
|
||||
protected:
|
||||
ResponderBase(void);
|
||||
virtual ~ResponderBase();
|
||||
@@ -452,9 +460,9 @@ public:
|
||||
static void head(std::string const& url, ResponderHeadersOnly* responder/*,*/ DEBUG_CURLIO_PARAM(EDebugCurl debug = debug_off))
|
||||
{ AIHTTPHeaders headers; head(url, responder, headers/*,*/ DEBUG_CURLIO_PARAM(debug)); }
|
||||
|
||||
static void getByteRange(std::string const& url, S32 offset, S32 bytes, ResponderPtr responder, AIHTTPHeaders& headers/*,*/ DEBUG_CURLIO_PARAM(EDebugCurl debug = debug_off));
|
||||
static void getByteRange(std::string const& url, S32 offset, S32 bytes, ResponderPtr responder/*,*/ DEBUG_CURLIO_PARAM(EDebugCurl debug = debug_off))
|
||||
{ AIHTTPHeaders headers; getByteRange(url, offset, bytes, responder, headers/*,*/ DEBUG_CURLIO_PARAM(debug)); }
|
||||
static bool getByteRange(std::string const& url, AIHTTPHeaders& headers, S32 offset, S32 bytes, ResponderPtr responder/*,*/ DEBUG_CURLIO_PARAM(EDebugCurl debug = debug_off));
|
||||
static bool getByteRange(std::string const& url, S32 offset, S32 bytes, ResponderPtr responder/*,*/ DEBUG_CURLIO_PARAM(EDebugCurl debug = debug_off))
|
||||
{ AIHTTPHeaders headers; return getByteRange(url, headers, offset, bytes, responder/*,*/ DEBUG_CURLIO_PARAM(debug)); }
|
||||
|
||||
static void get(std::string const& url, ResponderPtr responder, AIHTTPHeaders& headers/*,*/ DEBUG_CURLIO_PARAM(EDebugCurl debug = debug_off));
|
||||
static void get(std::string const& url, ResponderPtr responder/*,*/ DEBUG_CURLIO_PARAM(EDebugCurl debug = debug_off))
|
||||
|
||||
@@ -28,7 +28,7 @@
|
||||
|
||||
#include "llmodel.h"
|
||||
#include "llmemory.h"
|
||||
#include "LLConvexDecomposition.h"
|
||||
#include "llconvexdecomposition.h"
|
||||
#include "llsdserialize.h"
|
||||
#include "llvector4a.h"
|
||||
#if LL_MSVC
|
||||
|
||||
@@ -3277,7 +3277,7 @@ void LLWindowMacOSX::spawnWebBrowser(const std::string& escaped_url, bool async)
|
||||
|
||||
llinfos << "Opening URL " << escaped_url << llendl;
|
||||
|
||||
CFStringRef stringRef = CFStringCreateWithCString(NULL, escaped_url.c_str(), kCFStringEncodingUTF8);
|
||||
CFStringRef stringRef = CFStringCreateWithBytes(NULL, (UInt8 *)escaped_url.c_str(), strlen(escaped_url.c_str()), kCFStringEncodingUTF8, false);
|
||||
if (stringRef)
|
||||
{
|
||||
// This will succeed if the string is a full URL, including the http://
|
||||
@@ -3315,6 +3315,21 @@ void LLWindowMacOSX::setTitle(const std::string &title)
|
||||
SetWindowTitleWithCFString(mWindow, title_str);
|
||||
}
|
||||
|
||||
// virtual
|
||||
void LLWindowMacOSX::ShellEx(const std::string& command)
|
||||
{
|
||||
char * path = NULL;
|
||||
asprintf(&path, "%s %s", (char*)"file://", command.c_str());
|
||||
CFURLRef url = CFURLCreateAbsoluteURLWithBytes(NULL, (UInt8 *)path, strlen(path),
|
||||
kCFURLPOSIXPathStyle, NULL, true);
|
||||
if (url != NULL)
|
||||
{
|
||||
LSOpenCFURLRef(url, NULL);
|
||||
CFRelease(url);
|
||||
}
|
||||
free(path);
|
||||
}
|
||||
|
||||
LLSD LLWindowMacOSX::getNativeKeyData()
|
||||
{
|
||||
LLSD result = LLSD::emptyMap();
|
||||
|
||||
@@ -116,6 +116,7 @@ public:
|
||||
/*virtual*/ void spawnWebBrowser(const std::string& escaped_url, bool async);
|
||||
|
||||
/*virtual*/ void setTitle(const std::string &title);
|
||||
/*virtual*/ void ShellEx(const std::string& command);
|
||||
|
||||
static std::vector<std::string> getDynamicFallbackFontList();
|
||||
|
||||
|
||||
@@ -3329,9 +3329,9 @@ S32 OSMessageBoxWin32(const std::string& text, const std::string& caption, U32 t
|
||||
return retval;
|
||||
}
|
||||
|
||||
void LLWindowWin32::ShellEx(const std::string& command )
|
||||
void LLWindowWin32::ShellEx(const std::string& command)
|
||||
{
|
||||
LLWString url_wstring = utf8str_to_wstring( command );
|
||||
LLWString url_wstring = utf8str_to_wstring( "\"" + command + "\"" );
|
||||
llutf16string url_utf16 = wstring_to_utf16str( url_wstring );
|
||||
|
||||
SHELLEXECUTEINFO sei = { sizeof( sei ) };
|
||||
|
||||
@@ -253,6 +253,7 @@ set(viewer_SOURCE_FILES
|
||||
llfloaterproperties.cpp
|
||||
llfloaterregiondebugconsole.cpp
|
||||
llfloaterregioninfo.cpp
|
||||
llfloaterregionrestarting.cpp
|
||||
llfloaterreporter.cpp
|
||||
llfloaterscriptdebug.cpp
|
||||
llfloaterscriptlimits.cpp
|
||||
@@ -774,6 +775,7 @@ set(viewer_HEADER_FILES
|
||||
llfloaterproperties.h
|
||||
llfloaterregiondebugconsole.h
|
||||
llfloaterregioninfo.h
|
||||
llfloaterregionrestarting.h
|
||||
llfloaterreporter.h
|
||||
llfloaterscriptdebug.h
|
||||
llfloaterscriptlimits.h
|
||||
|
||||
@@ -738,7 +738,7 @@
|
||||
<key>LiruLegacyLogLaunch</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>When opening a chat log, open in an external text editor instead of a browser floater(Windows Only).</string>
|
||||
<string>When opening a chat log, open in an external text editor instead of a browser floater(Windows and Mac Only).</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
@@ -1324,6 +1324,17 @@ This should be as low as possible, but too low may break functionality</string>
|
||||
<key>Value</key>
|
||||
<integer>1</integer>
|
||||
</map>
|
||||
<key>AnnounceBumps</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Announce if someone bumps into you.</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>Boolean</string>
|
||||
<key>Value</key>
|
||||
<boolean>0</boolean>
|
||||
</map>
|
||||
<key>AnnounceSnapshots</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
@@ -2233,6 +2244,17 @@ This should be as low as possible, but too low may break functionality</string>
|
||||
<key>IsCOA</key>
|
||||
<integer>1</integer>
|
||||
</map>
|
||||
<key>UISndRestart</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Sound file for region restarting (uuid for sound asset)</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>String</string>
|
||||
<key>Value</key>
|
||||
<string>1e506d0c-4811-bdf3-5ec7-d624284c9040</string>
|
||||
</map>
|
||||
<key>UISndSnapshot</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
@@ -14587,9 +14609,9 @@ This should be as low as possible, but too low may break functionality</string>
|
||||
<key>ShowChatHistory</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string/>
|
||||
<string>Open local chat window on login</string>
|
||||
<key>Persist</key>
|
||||
<integer>0</integer>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>Boolean</string>
|
||||
<key>Value</key>
|
||||
@@ -14598,14 +14620,25 @@ This should be as low as possible, but too low may break functionality</string>
|
||||
<key>ShowCommunicate</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string/>
|
||||
<string>Open communicate window on login</string>
|
||||
<key>Persist</key>
|
||||
<integer>0</integer>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>Boolean</string>
|
||||
<key>Value</key>
|
||||
<integer>0</integer>
|
||||
</map>
|
||||
<key>ShowContacts</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Open contacts window on login</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>Boolean</string>
|
||||
<key>Value</key>
|
||||
<boolean>0</boolean>
|
||||
</map>
|
||||
<key>ShowConsoleWindow</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
|
||||
@@ -91,6 +91,17 @@
|
||||
<key>Value</key>
|
||||
<integer>1</integer>
|
||||
</map>
|
||||
<key>AlchemyRegionRestartShake</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Shake the screen when the region restart floater is displayed</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>Boolean</string>
|
||||
<key>Value</key>
|
||||
<integer>0</integer>
|
||||
</map>
|
||||
<key>AscentPowerfulWizard</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
@@ -741,6 +752,51 @@
|
||||
<key>Value</key>
|
||||
<boolean>0</boolean>
|
||||
</map>
|
||||
<key>ExodusMapRolloverCircleColor</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Color setting of circle for rollovers on the minimap.</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>Color4</string>
|
||||
<key>Value</key>
|
||||
<key>Value</key>
|
||||
<array>
|
||||
<real>1.0</real>
|
||||
<real>1.0</real>
|
||||
<real>1.0</real>
|
||||
<real>0.05</real>
|
||||
</array>
|
||||
</map>
|
||||
<key>ExodusMapRolloverColor</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Color setting for rollovers on the minimap.</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>Color4</string>
|
||||
<key>Value</key>
|
||||
<key>Value</key>
|
||||
<array>
|
||||
<real>0.0</real>
|
||||
<real>1.0</real>
|
||||
<real>1.0</real>
|
||||
<real>1.0</real>
|
||||
</array>
|
||||
</map>
|
||||
<key>ExodusMinimapAreaEffect</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Radius of the area of affect for the minimap, adjusted by shift scrolling over the minimap.</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>F32</string>
|
||||
<key>Value</key>
|
||||
<real>3.5</real>
|
||||
</map>
|
||||
<key>OBJExportNotifyFailed</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
|
||||
@@ -723,6 +723,16 @@
|
||||
<key>Value</key>
|
||||
<string></string>
|
||||
</map>
|
||||
|
||||
<key>EmergencyTeleportLandmark</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>UUID of the landmark to teleport to in the last twenty seconds before a region will restart, empty is none.</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>String</string>
|
||||
<key>Value</key>
|
||||
<string/>
|
||||
</map>
|
||||
</map>
|
||||
</llsd>
|
||||
|
||||
@@ -252,12 +252,14 @@ void LLPrefsAscentSys::refreshValues()
|
||||
mPrivateLookAt = gSavedSettings.getBOOL("PrivateLookAt");
|
||||
mShowLookAt = gSavedSettings.getBOOL("AscentShowLookAt");
|
||||
mQuietSnapshotsToDisk = gSavedSettings.getBOOL("QuietSnapshotsToDisk");
|
||||
mAnnounceBumps = gSavedSettings.getBOOL("AnnounceBumps");
|
||||
mDetachBridge = gSavedSettings.getBOOL("SGDetachBridge");
|
||||
mRevokePermsOnStandUp = gSavedSettings.getBOOL("RevokePermsOnStandUp");
|
||||
mDisableClickSit = gSavedSettings.getBOOL("DisableClickSit");
|
||||
mDisableClickSitOtherOwner = gSavedSettings.getBOOL("DisableClickSitOtherOwner");
|
||||
mDisplayScriptJumps = gSavedSettings.getBOOL("AscentDisplayTotalScriptJumps");
|
||||
mNumScriptDiff = gSavedSettings.getF32("Ascentnumscriptdiff");
|
||||
mLandmark = gSavedPerAccountSettings.getString("EmergencyTeleportLandmark");
|
||||
|
||||
//Build -------------------------------------------------------------------------------
|
||||
mAlpha = gSavedSettings.getF32("EmeraldBuildPrefs_Alpha");
|
||||
@@ -408,12 +410,14 @@ void LLPrefsAscentSys::cancel()
|
||||
gSavedSettings.setBOOL("PrivateLookAt", mPrivateLookAt);
|
||||
gSavedSettings.setBOOL("AscentShowLookAt", mShowLookAt);
|
||||
gSavedSettings.setBOOL("QuietSnapshotsToDisk", mQuietSnapshotsToDisk);
|
||||
gSavedSettings.setBOOL("AnnounceBumps", mAnnounceBumps);
|
||||
gSavedSettings.setBOOL("SGDetachBridge", mDetachBridge);
|
||||
gSavedSettings.setBOOL("RevokePermsOnStandUp", mRevokePermsOnStandUp);
|
||||
gSavedSettings.setBOOL("DisableClickSit", mDisableClickSit);
|
||||
gSavedSettings.setBOOL("DisableClickSitOtherOwner", mDisableClickSitOtherOwner);
|
||||
gSavedSettings.setBOOL("AscentDisplayTotalScriptJumps", mDisplayScriptJumps);
|
||||
gSavedSettings.setF32("Ascentnumscriptdiff", mNumScriptDiff);
|
||||
gSavedPerAccountSettings.setString("EmergencyTeleportLandmark", mLandmark);
|
||||
|
||||
//Build -------------------------------------------------------------------------------
|
||||
gSavedSettings.setF32("EmeraldBuildPrefs_Alpha", mAlpha);
|
||||
|
||||
@@ -103,12 +103,14 @@ private:
|
||||
bool mPrivateLookAt;
|
||||
bool mShowLookAt;
|
||||
bool mQuietSnapshotsToDisk;
|
||||
bool mAnnounceBumps;
|
||||
bool mDetachBridge;
|
||||
bool mRevokePermsOnStandUp;
|
||||
bool mDisableClickSit;
|
||||
bool mDisableClickSitOtherOwner;
|
||||
bool mDisplayScriptJumps;
|
||||
F32 mNumScriptDiff;
|
||||
std::string mLandmark;
|
||||
|
||||
//Build -------------------------------------------------------------------------------
|
||||
F32 mAlpha;
|
||||
|
||||
@@ -145,6 +145,11 @@ void LLDropTarget::setControlName(const std::string& control_name, LLView* conte
|
||||
else
|
||||
{
|
||||
mControl = gSavedPerAccountSettings.getControl(control_name);
|
||||
if (!mControl)
|
||||
{
|
||||
llerrs << "Could not find control \"" << control_name << "\" in gSavedPerAccountSettings" << llendl;
|
||||
return; // Though this should never happen.
|
||||
}
|
||||
const LLUUID id(mControl->getValue().asString());
|
||||
if (id.isNull())
|
||||
text = LLTrans::getString("CurrentlyNotSet");
|
||||
|
||||
@@ -646,6 +646,8 @@ void LLFloaterAvatarList::updateAvatarSorting()
|
||||
}
|
||||
}
|
||||
|
||||
bool mm_getMarkerColor(const LLUUID&, LLColor4&);
|
||||
|
||||
/**
|
||||
* Redraws the avatar list
|
||||
* Only does anything if the avatar list is visible.
|
||||
@@ -738,7 +740,8 @@ void LLFloaterAvatarList::refreshAvatarList()
|
||||
LLColor4 color = sDefaultListText;
|
||||
|
||||
//Lindens are always more Linden than your friend, make that take precedence
|
||||
if (LLMuteList::getInstance()->isLinden(av_id))
|
||||
if (mm_getMarkerColor(av_id, color)) {}
|
||||
else if (LLMuteList::getInstance()->isLinden(av_id))
|
||||
{
|
||||
static const LLCachedControl<LLColor4> ascent_linden_color("AscentLindenColor", LLColor4(0.f,0.f,1.f,1.f));
|
||||
color = ascent_linden_color;
|
||||
|
||||
@@ -427,7 +427,7 @@ public:
|
||||
|
||||
// in case of invalid characters, the avatar picker returns a 400
|
||||
// just set it to process so it displays 'not found'
|
||||
if ((200 <= status && status < 300) || status == 400)
|
||||
if (isGoodStatus(status) || status == 400)
|
||||
{
|
||||
if (LLFloaterAvatarPicker::instanceExists())
|
||||
{
|
||||
|
||||
@@ -102,13 +102,6 @@ LLFloaterChat::~LLFloaterChat()
|
||||
// Children all cleaned up by default view destructor.
|
||||
}
|
||||
|
||||
void LLFloaterChat::setVisible(BOOL visible)
|
||||
{
|
||||
LLFloater::setVisible( visible );
|
||||
|
||||
gSavedSettings.setBOOL("ShowChatHistory", visible);
|
||||
}
|
||||
|
||||
void LLFloaterChat::draw()
|
||||
{
|
||||
// enable say and shout only when text available
|
||||
@@ -140,6 +133,11 @@ BOOL LLFloaterChat::postBuild()
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
void LLFloaterChat::onOpen()
|
||||
{
|
||||
gSavedSettings.setBOOL("ShowChatHistory", true);
|
||||
}
|
||||
|
||||
// public virtual
|
||||
void LLFloaterChat::onClose(bool app_quitting)
|
||||
{
|
||||
|
||||
@@ -59,9 +59,9 @@ public:
|
||||
LLFloaterChat(const LLSD& seed);
|
||||
~LLFloaterChat();
|
||||
|
||||
virtual void setVisible( BOOL b );
|
||||
virtual void draw();
|
||||
virtual BOOL postBuild();
|
||||
virtual void onOpen();
|
||||
virtual void onClose(bool app_quitting);
|
||||
virtual void onFocusReceived();
|
||||
virtual void handleVisibilityChange(BOOL cur_visibility);
|
||||
|
||||
@@ -78,9 +78,14 @@ BOOL LLFloaterMyFriends::postBuild()
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
void LLFloaterMyFriends::onOpen()
|
||||
{
|
||||
gSavedSettings.setBOOL("ShowContacts", true);
|
||||
}
|
||||
|
||||
void LLFloaterMyFriends::onClose(bool app_quitting)
|
||||
{
|
||||
if (!app_quitting) gSavedSettings.setBOOL("ShowContacts", false);
|
||||
setVisible(FALSE);
|
||||
}
|
||||
|
||||
@@ -122,6 +127,7 @@ LLFloaterChatterBox::LLFloaterChatterBox(const LLSD& seed) :
|
||||
removeFloater(floater_contacts);
|
||||
// reparent to floater view
|
||||
gFloaterView->addChild(floater_contacts);
|
||||
if (gSavedSettings.getBOOL("ShowContacts")) floater_contacts->open();
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -136,11 +142,13 @@ LLFloaterChatterBox::LLFloaterChatterBox(const LLSD& seed) :
|
||||
removeFloater(floater_chat);
|
||||
// reparent to floater view
|
||||
gFloaterView->addChild(floater_chat);
|
||||
if (gSavedSettings.getBOOL("ShowChatHistory")) floater_chat->open();
|
||||
}
|
||||
else
|
||||
{
|
||||
addFloater(floater_chat, FALSE);
|
||||
}
|
||||
if (gSavedSettings.getBOOL("ShowCommunicate")) open(); // After all floaters have been added, so we may not be hidden anyhow.
|
||||
gSavedSettings.getControl("ShowLocalChatFloaterBar")->getSignal()->connect(boost::bind(handleLocalChatBar, floater_chat, _2));
|
||||
mTabContainer->lockTabs();
|
||||
}
|
||||
@@ -228,7 +236,7 @@ void LLFloaterChatterBox::onOpen()
|
||||
void LLFloaterChatterBox::onClose(bool app_quitting)
|
||||
{
|
||||
setVisible(FALSE);
|
||||
gSavedSettings.setBOOL("ShowCommunicate", FALSE);
|
||||
if (!app_quitting) gSavedSettings.setBOOL("ShowCommunicate", false);
|
||||
}
|
||||
|
||||
void LLFloaterChatterBox::setMinimized(BOOL minimized)
|
||||
|
||||
@@ -126,7 +126,8 @@ public:
|
||||
|
||||
virtual BOOL postBuild();
|
||||
|
||||
void onClose(bool app_quitting);
|
||||
virtual void onOpen();
|
||||
virtual void onClose(bool app_quitting);
|
||||
|
||||
static void* createFriendsPanel(void* data);
|
||||
static void* createGroupsPanel(void* data);
|
||||
|
||||
@@ -2161,7 +2161,7 @@ void LLPanelLandOptions::refreshSearch()
|
||||
|
||||
bool can_change =
|
||||
LLViewerParcelMgr::isParcelModifiableByAgent(
|
||||
parcel, GP_LAND_CHANGE_IDENTITY)
|
||||
parcel, GP_LAND_FIND_PLACES)
|
||||
&& region
|
||||
&& !(region->getRegionFlag(REGION_FLAGS_BLOCK_PARCEL_SEARCH));
|
||||
|
||||
|
||||
196
indra/newview/llfloaterregionrestarting.cpp
Normal file
196
indra/newview/llfloaterregionrestarting.cpp
Normal file
@@ -0,0 +1,196 @@
|
||||
/**
|
||||
* @file llfloaterregionrestarting.cpp
|
||||
* @brief Shows countdown timer during region restart
|
||||
*
|
||||
* $LicenseInfo:firstyear=2006&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 "llfloaterregionrestarting.h"
|
||||
|
||||
#include "lluictrlfactory.h"
|
||||
#include "llagent.h"
|
||||
#include "llagentcamera.h"
|
||||
#include "llenvmanager.h"
|
||||
#include "llviewercontrol.h"
|
||||
#include "llviewerwindow.h"
|
||||
|
||||
// <singu> For emergency teleports
|
||||
#include "llinventorymodel.h"
|
||||
void emergency_teleport()
|
||||
{
|
||||
static const LLCachedControl<std::string> landmark(gSavedPerAccountSettings, "EmergencyTeleportLandmark");
|
||||
if (landmark().empty()) return;
|
||||
const LLUUID id(landmark);
|
||||
if (id.isNull()) return;
|
||||
if (LLViewerInventoryItem* item = gInventory.getItem(id))
|
||||
gAgent.teleportViaLandmark(item->getAssetUUID());
|
||||
}
|
||||
// </singu>
|
||||
|
||||
enum shake_state
|
||||
{
|
||||
SHAKE_START,
|
||||
SHAKE_LEFT,
|
||||
SHAKE_UP,
|
||||
SHAKE_RIGHT,
|
||||
SHAKE_DOWN,
|
||||
SHAKE_DONE
|
||||
};
|
||||
static shake_state sShakeState;
|
||||
|
||||
LLFloaterRegionRestarting::LLFloaterRegionRestarting(const LLSD& key) :
|
||||
LLEventTimer(1)
|
||||
, mRestartSeconds(NULL)
|
||||
, mSeconds(key["SECONDS"].asInteger())
|
||||
, mShakeIterations()
|
||||
, mShakeMagnitude()
|
||||
{
|
||||
//buildFromFile("floater_region_restarting.xml");
|
||||
LLUICtrlFactory::getInstance()->buildFloater(this, "floater_region_restarting.xml");
|
||||
|
||||
LLStringUtil::format_map_t args;
|
||||
args["[NAME]"] = key["NAME"].asString();
|
||||
getChild<LLTextBox>("region_name")->setValue(getString("RegionName", args));
|
||||
mRestartSeconds = getChild<LLTextBox>("restart_seconds");
|
||||
center();
|
||||
|
||||
refresh();
|
||||
|
||||
mRegionChangedConnection = LLEnvManagerNew::instance().setRegionChangeCallback(boost::bind(&LLFloaterRegionRestarting::close, this, false));
|
||||
if (mSeconds <= 20) emergency_teleport(); // <singu/> For emergency teleports
|
||||
}
|
||||
|
||||
LLFloaterRegionRestarting::~LLFloaterRegionRestarting()
|
||||
{
|
||||
mRegionChangedConnection.disconnect();
|
||||
}
|
||||
|
||||
BOOL LLFloaterRegionRestarting::postBuild()
|
||||
{
|
||||
setBackgroundColor(gColors.getColor("NotifyCautionBoxColor"));
|
||||
sShakeState = SHAKE_START;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
BOOL LLFloaterRegionRestarting::tick()
|
||||
{
|
||||
refresh();
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
void LLFloaterRegionRestarting::refresh()
|
||||
{
|
||||
LLStringUtil::format_map_t args;
|
||||
args["[SECONDS]"] = llformat("%d", mSeconds);
|
||||
mRestartSeconds->setValue(getString("RestartSeconds", args));
|
||||
|
||||
if (mSeconds == 20) emergency_teleport(); // <singu/> For emergency teleports
|
||||
if (!mSeconds) return; // Zero means we're done.
|
||||
--mSeconds;
|
||||
}
|
||||
|
||||
void LLFloaterRegionRestarting::draw()
|
||||
{
|
||||
LLFloater::draw();
|
||||
|
||||
static const LLCachedControl<bool> alchemyRegionShake(gSavedSettings, "AlchemyRegionRestartShake", true);
|
||||
if (!alchemyRegionShake)
|
||||
return;
|
||||
|
||||
const F32 SHAKE_INTERVAL = 0.025;
|
||||
const F32 SHAKE_TOTAL_DURATION = 1.8; // the length of the default alert tone for this
|
||||
const F32 SHAKE_INITIAL_MAGNITUDE = 1.5;
|
||||
const F32 SHAKE_HORIZONTAL_BIAS = 0.25;
|
||||
F32 time_shaking;
|
||||
|
||||
if (SHAKE_START == sShakeState)
|
||||
{
|
||||
mShakeTimer.setTimerExpirySec(SHAKE_INTERVAL);
|
||||
sShakeState = SHAKE_LEFT;
|
||||
mShakeIterations = 0;
|
||||
mShakeMagnitude = SHAKE_INITIAL_MAGNITUDE;
|
||||
}
|
||||
|
||||
if (SHAKE_DONE != sShakeState && mShakeTimer.hasExpired())
|
||||
{
|
||||
gAgentCamera.unlockView();
|
||||
|
||||
switch(sShakeState)
|
||||
{
|
||||
case SHAKE_LEFT:
|
||||
gAgentCamera.setPanLeftKey(mShakeMagnitude * SHAKE_HORIZONTAL_BIAS);
|
||||
sShakeState = SHAKE_UP;
|
||||
break;
|
||||
|
||||
case SHAKE_UP:
|
||||
gAgentCamera.setPanUpKey(mShakeMagnitude);
|
||||
sShakeState = SHAKE_RIGHT;
|
||||
break;
|
||||
|
||||
case SHAKE_RIGHT:
|
||||
gAgentCamera.setPanRightKey(mShakeMagnitude * SHAKE_HORIZONTAL_BIAS);
|
||||
sShakeState = SHAKE_DOWN;
|
||||
break;
|
||||
|
||||
case SHAKE_DOWN:
|
||||
gAgentCamera.setPanDownKey(mShakeMagnitude);
|
||||
mShakeIterations++;
|
||||
time_shaking = SHAKE_INTERVAL * (mShakeIterations * 4 /* left, up, right, down */);
|
||||
if (SHAKE_TOTAL_DURATION <= time_shaking)
|
||||
{
|
||||
sShakeState = SHAKE_DONE;
|
||||
mShakeMagnitude = 0.0;
|
||||
}
|
||||
else
|
||||
{
|
||||
sShakeState = SHAKE_LEFT;
|
||||
F32 percent_done_shaking = (SHAKE_TOTAL_DURATION - time_shaking) / SHAKE_TOTAL_DURATION;
|
||||
mShakeMagnitude = SHAKE_INITIAL_MAGNITUDE * (percent_done_shaking * percent_done_shaking); // exponential decay
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
mShakeTimer.setTimerExpirySec(SHAKE_INTERVAL);
|
||||
}
|
||||
}
|
||||
|
||||
void LLFloaterRegionRestarting::onClose(bool app_quitting)
|
||||
{
|
||||
if (sShakeState != SHAKE_DONE && sShakeState != SHAKE_START) // Finish shake if needed
|
||||
{
|
||||
gAgentCamera.resetView(TRUE, TRUE);
|
||||
sShakeState = SHAKE_DONE;
|
||||
}
|
||||
LLFloater::onClose(app_quitting);
|
||||
}
|
||||
|
||||
void LLFloaterRegionRestarting::updateTime(const U32& time)
|
||||
{
|
||||
mSeconds = time;
|
||||
if (mSeconds <= 20) emergency_teleport(); // <singu/> For emergency teleports
|
||||
sShakeState = SHAKE_START;
|
||||
}
|
||||
59
indra/newview/llfloaterregionrestarting.h
Normal file
59
indra/newview/llfloaterregionrestarting.h
Normal file
@@ -0,0 +1,59 @@
|
||||
/**
|
||||
* @file llfloaterregionrestarting.h
|
||||
* @brief Shows countdown timer during region restart
|
||||
*
|
||||
* $LicenseInfo:firstyear=2006&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_LLFLOATERREGIONRESTARTING_H
|
||||
#define LL_LLFLOATERREGIONRESTARTING_H
|
||||
|
||||
#include "llfloater.h"
|
||||
#include "lleventtimer.h"
|
||||
|
||||
class LLFloaterRegionRestarting : public LLFloater, public LLEventTimer
|
||||
, public LLFloaterSingleton<LLFloaterRegionRestarting>
|
||||
{
|
||||
friend class LLFloaterReg;
|
||||
|
||||
public:
|
||||
void updateTime(const U32& time);
|
||||
|
||||
LLFloaterRegionRestarting(const LLSD& key);
|
||||
private:
|
||||
virtual ~LLFloaterRegionRestarting();
|
||||
virtual BOOL postBuild();
|
||||
virtual BOOL tick();
|
||||
virtual void refresh();
|
||||
virtual void draw();
|
||||
virtual void onClose(bool app_quitting);
|
||||
|
||||
class LLTextBox* mRestartSeconds;
|
||||
U32 mSeconds;
|
||||
U32 mShakeIterations;
|
||||
F32 mShakeMagnitude;
|
||||
LLTimer mShakeTimer;
|
||||
|
||||
boost::signals2::connection mRegionChangedConnection;
|
||||
};
|
||||
|
||||
#endif // LL_LLFLOATERREGIONRESTARTING_H
|
||||
@@ -47,6 +47,7 @@
|
||||
#include "llviewerregion.h"
|
||||
#include "llviewerwindow.h"
|
||||
#include "llfloaterdirectory.h"
|
||||
#include "llfloatergroupinfo.h"
|
||||
#include "llgroupactions.h"
|
||||
#include "llnotificationsutil.h"
|
||||
#include "lluictrlfactory.h"
|
||||
@@ -1448,7 +1449,8 @@ void LLGroupMgr::processCreateGroupReply(LLMessageSystem* msg, void ** data)
|
||||
|
||||
gAgent.mGroups.push_back(gd);
|
||||
|
||||
LLGroupActions::closeGroup(LLUUID::null);
|
||||
if (LLFloaterGroupInfo* flooter = LLFloaterGroupInfo::getInstance(LLUUID::null))
|
||||
flooter->onClose(false);
|
||||
LLGroupActions::showTab(group_id, "roles_tab");
|
||||
}
|
||||
else
|
||||
|
||||
@@ -1002,10 +1002,10 @@ void LLFloaterIMPanel::onFlyoutCommit(LLComboBox* flyout, const LLSD& value)
|
||||
|
||||
void show_log_browser(const std::string& name, const std::string& id)
|
||||
{
|
||||
#if LL_WINDOWS // Singu TODO: Other platforms?
|
||||
#if LL_WINDOWS || LL_DARWIN // Singu TODO: Linux?
|
||||
if (gSavedSettings.getBOOL("LiruLegacyLogLaunch"))
|
||||
{
|
||||
gViewerWindow->getWindow()->ShellEx("\"" + LLLogChat::makeLogFileName(name) + "\"");
|
||||
gViewerWindow->getWindow()->ShellEx(LLLogChat::makeLogFileName(name));
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -102,7 +102,6 @@
|
||||
#include "llmakeoutfitdialog.h"
|
||||
#include "llmoveview.h" // LLFloaterMove
|
||||
#include "lltextureview.h"
|
||||
#include "lltoolbar.h"
|
||||
#include "lltoolgrab.h"
|
||||
#include "lltoolmgr.h"
|
||||
#include "lluictrlfactory.h"
|
||||
@@ -211,7 +210,6 @@ struct MenuFloaterDict : public LLSingleton<MenuFloaterDict>
|
||||
registerFloater("sound_explorer", boost::bind(LLFloaterExploreSounds::toggle), boost::bind(LLFloaterExploreSounds::visible));
|
||||
registerFloater("test", boost::bind(LLFloaterTest::show, (void*)NULL));
|
||||
// Phoenix: Wolfspirit: Enabled Show Floater out of viewer menu
|
||||
registerFloater("toolbar", boost::bind(toggle_control, "ShowToolBar"), boost::bind(&LLToolBar::getVisible, gToolBar));
|
||||
registerFloater("WaterSettings", boost::bind(LLFloaterWater::show), boost::bind(LLFloaterWater::isOpen));
|
||||
registerFloater("web", boost::bind(LLFloaterWebContent::showInstance, "dict web", LLFloaterWebContent::Params()));
|
||||
registerFloater("Windlight", boost::bind(LLFloaterWindLight::show), boost::bind(LLFloaterWindLight::isOpen));
|
||||
|
||||
@@ -67,6 +67,7 @@
|
||||
#include "aicurl.h"
|
||||
|
||||
#include "boost/lexical_cast.hpp"
|
||||
|
||||
#ifndef LL_WINDOWS
|
||||
#include "netdb.h"
|
||||
#endif
|
||||
@@ -239,7 +240,7 @@ public:
|
||||
}
|
||||
}
|
||||
|
||||
/*virtual*/ void completedRaw(U32 status, const std::string& reason,
|
||||
virtual void completedRaw(U32 status, const std::string& reason,
|
||||
const LLChannelDescriptors& channels,
|
||||
const LLIOPipe::buffer_ptr_t& buffer);
|
||||
|
||||
@@ -278,7 +279,7 @@ public:
|
||||
}
|
||||
}
|
||||
|
||||
/*virtual*/ void completedRaw(U32 status, const std::string& reason,
|
||||
virtual void completedRaw(U32 status, const std::string& reason,
|
||||
const LLChannelDescriptors& channels,
|
||||
const LLIOPipe::buffer_ptr_t& buffer);
|
||||
|
||||
@@ -303,10 +304,17 @@ public:
|
||||
|
||||
~LLMeshSkinInfoResponder()
|
||||
{
|
||||
llassert(mProcessed || LLApp::isExiting());
|
||||
if (!LLApp::isQuitting() &&
|
||||
!mProcessed &&
|
||||
mMeshID.notNull())
|
||||
{ // Something went wrong, retry
|
||||
llwarns << "Timeout or service unavailable, retrying loadMeshSkinInfo() for " << mMeshID << llendl;
|
||||
LLMeshRepository::sHTTPRetryCount++;
|
||||
gMeshRepo.mThread->loadMeshSkinInfo(mMeshID);
|
||||
}
|
||||
}
|
||||
|
||||
/*virtual*/ void completedRaw(U32 status, const std::string& reason,
|
||||
virtual void completedRaw(U32 status, const std::string& reason,
|
||||
const LLChannelDescriptors& channels,
|
||||
const LLIOPipe::buffer_ptr_t& buffer);
|
||||
|
||||
@@ -331,10 +339,17 @@ public:
|
||||
|
||||
~LLMeshDecompositionResponder()
|
||||
{
|
||||
llassert(mProcessed || LLApp::isExiting());
|
||||
if (!LLApp::isQuitting() &&
|
||||
!mProcessed &&
|
||||
mMeshID.notNull())
|
||||
{ // Something went wrong, retry
|
||||
llwarns << "Timeout or service unavailable, retrying loadMeshDecomposition() for " << mMeshID << llendl;
|
||||
LLMeshRepository::sHTTPRetryCount++;
|
||||
gMeshRepo.mThread->loadMeshDecomposition(mMeshID);
|
||||
}
|
||||
}
|
||||
|
||||
/*virtual*/ void completedRaw(U32 status, const std::string& reason,
|
||||
virtual void completedRaw(U32 status, const std::string& reason,
|
||||
const LLChannelDescriptors& channels,
|
||||
const LLIOPipe::buffer_ptr_t& buffer);
|
||||
|
||||
@@ -359,10 +374,17 @@ public:
|
||||
|
||||
~LLMeshPhysicsShapeResponder()
|
||||
{
|
||||
llassert(mProcessed || LLApp::isExiting());
|
||||
if (!LLApp::isQuitting() &&
|
||||
!mProcessed &&
|
||||
mMeshID.notNull())
|
||||
{ // Something went wrong, retry
|
||||
llwarns << "Timeout or service unavailable, retrying loadMeshPhysicsShape() for " << mMeshID << llendl;
|
||||
LLMeshRepository::sHTTPRetryCount++;
|
||||
gMeshRepo.mThread->loadMeshPhysicsShape(mMeshID);
|
||||
}
|
||||
}
|
||||
|
||||
/*virtual*/ void completedRaw(U32 status, const std::string& reason,
|
||||
virtual void completedRaw(U32 status, const std::string& reason,
|
||||
const LLChannelDescriptors& channels,
|
||||
const LLIOPipe::buffer_ptr_t& buffer);
|
||||
|
||||
@@ -437,7 +459,7 @@ public:
|
||||
{
|
||||
}
|
||||
|
||||
/*virtual*/ void completed(U32 status,
|
||||
virtual void completed(U32 status,
|
||||
const std::string& reason,
|
||||
const LLSD& content)
|
||||
{
|
||||
@@ -451,7 +473,7 @@ public:
|
||||
|
||||
LLWholeModelFeeObserver* observer = mObserverHandle.get();
|
||||
|
||||
if (((200 <= status) && (status < 300)) &&
|
||||
if (isGoodStatus(status) &&
|
||||
cc["state"].asString() == "upload")
|
||||
{
|
||||
mWholeModelUploadURL = cc["uploader"].asString();
|
||||
@@ -495,7 +517,7 @@ public:
|
||||
{
|
||||
}
|
||||
|
||||
/*virtual*/ void completed(U32 status,
|
||||
virtual void completed(U32 status,
|
||||
const std::string& reason,
|
||||
const LLSD& content)
|
||||
{
|
||||
@@ -511,7 +533,7 @@ public:
|
||||
|
||||
// requested "mesh" asset type isn't actually the type
|
||||
// of the resultant object, fix it up here.
|
||||
if (((200 <= status) && (status < 300)) &&
|
||||
if (isGoodStatus(status) &&
|
||||
cc["state"].asString() == "complete")
|
||||
{
|
||||
mModelData["asset_type"] = "object";
|
||||
@@ -568,6 +590,7 @@ void LLMeshRepoThread::run()
|
||||
mSignal->lock();
|
||||
while (!LLApp::isQuitting())
|
||||
{
|
||||
if (!LLApp::isQuitting())
|
||||
{
|
||||
static U32 count = 0;
|
||||
|
||||
@@ -583,50 +606,35 @@ void LLMeshRepoThread::run()
|
||||
|
||||
while (!mLODReqQ.empty() && count < MAX_MESH_REQUESTS_PER_SECOND && sActiveLODRequests < (S32)sMaxConcurrentRequests)
|
||||
{
|
||||
if (mMutex)
|
||||
{
|
||||
mMutex->lock();
|
||||
LODRequest req = mLODReqQ.front();
|
||||
mLODReqQ.pop();
|
||||
LLMeshRepository::sLODProcessing--;
|
||||
mMutex->unlock();
|
||||
try
|
||||
if (!fetchMeshLOD(req.mMeshParams, req.mLOD, count))//failed, resubmit
|
||||
{
|
||||
fetchMeshLOD(req.mMeshParams, req.mLOD, count);
|
||||
}
|
||||
catch(AICurlNoEasyHandle const& error)
|
||||
{
|
||||
llwarns << "fetchMeshLOD() failed: " << error.what() << llendl;
|
||||
mMutex->lock();
|
||||
LLMeshRepository::sLODProcessing++;
|
||||
mLODReqQ.push(req);
|
||||
mMutex->unlock();
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
while (!mHeaderReqQ.empty() && count < MAX_MESH_REQUESTS_PER_SECOND && sActiveHeaderRequests < (S32)sMaxConcurrentRequests)
|
||||
{
|
||||
if (mMutex)
|
||||
{
|
||||
mMutex->lock();
|
||||
HeaderRequest req = mHeaderReqQ.front();
|
||||
mHeaderReqQ.pop();
|
||||
mMutex->unlock();
|
||||
bool success = false;
|
||||
try
|
||||
{
|
||||
success = fetchMeshHeader(req.mMeshParams, count);
|
||||
}
|
||||
catch(AICurlNoEasyHandle const& error)
|
||||
{
|
||||
llwarns << "fetchMeshHeader() failed: " << error.what() << llendl;
|
||||
}
|
||||
if (!success)
|
||||
if (!fetchMeshHeader(req.mMeshParams, count))//failed, resubmit
|
||||
{
|
||||
mMutex->lock();
|
||||
mHeaderReqQ.push(req) ;
|
||||
mMutex->unlock();
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -636,16 +644,7 @@ void LLMeshRepoThread::run()
|
||||
for (std::set<LLUUID>::iterator iter = mSkinRequests.begin(); iter != mSkinRequests.end(); ++iter)
|
||||
{
|
||||
LLUUID mesh_id = *iter;
|
||||
bool success = false;
|
||||
try
|
||||
{
|
||||
success = fetchMeshSkinInfo(mesh_id);
|
||||
}
|
||||
catch(AICurlNoEasyHandle const& error)
|
||||
{
|
||||
llwarns << "fetchMeshSkinInfo(" << mesh_id << ") failed: " << error.what() << llendl;
|
||||
}
|
||||
if (!success)
|
||||
if (!fetchMeshSkinInfo(mesh_id))
|
||||
{
|
||||
incomplete.insert(mesh_id);
|
||||
}
|
||||
@@ -658,16 +657,7 @@ void LLMeshRepoThread::run()
|
||||
for (std::set<LLUUID>::iterator iter = mDecompositionRequests.begin(); iter != mDecompositionRequests.end(); ++iter)
|
||||
{
|
||||
LLUUID mesh_id = *iter;
|
||||
bool success = false;
|
||||
try
|
||||
{
|
||||
success = fetchMeshDecomposition(mesh_id);
|
||||
}
|
||||
catch(AICurlNoEasyHandle const& error)
|
||||
{
|
||||
llwarns << "fetchMeshDecomposition(" << mesh_id << ") failed: " << error.what() << llendl;
|
||||
}
|
||||
if (!success)
|
||||
if (!fetchMeshDecomposition(mesh_id))
|
||||
{
|
||||
incomplete.insert(mesh_id);
|
||||
}
|
||||
@@ -680,16 +670,7 @@ void LLMeshRepoThread::run()
|
||||
for (std::set<LLUUID>::iterator iter = mPhysicsShapeRequests.begin(); iter != mPhysicsShapeRequests.end(); ++iter)
|
||||
{
|
||||
LLUUID mesh_id = *iter;
|
||||
bool success = false;
|
||||
try
|
||||
{
|
||||
success = fetchMeshPhysicsShape(mesh_id);
|
||||
}
|
||||
catch(AICurlNoEasyHandle const& error)
|
||||
{
|
||||
llwarns << "fetchMeshPhysicsShape(" << mesh_id << ") failed: " << error.what() << llendl;
|
||||
}
|
||||
if (!success)
|
||||
if (!fetchMeshPhysicsShape(mesh_id))
|
||||
{
|
||||
incomplete.insert(mesh_id);
|
||||
}
|
||||
@@ -701,7 +682,11 @@ void LLMeshRepoThread::run()
|
||||
|
||||
mSignal->wait();
|
||||
}
|
||||
mSignal->unlock();
|
||||
|
||||
if (mSignal->isLocked())
|
||||
{ //make sure to let go of the mutex associated with the given signal before shutting down
|
||||
mSignal->unlock();
|
||||
}
|
||||
|
||||
res = LLConvexDecomposition::quitThread();
|
||||
if (res != LLCD_OK)
|
||||
@@ -734,6 +719,8 @@ void LLMeshRepoThread::lockAndLoadMeshLOD(const LLVolumeParams& mesh_params, S32
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
void LLMeshRepoThread::loadMeshLOD(const LLVolumeParams& mesh_params, S32 lod)
|
||||
{ //could be called from any thread
|
||||
LLMutexLock lock(mMutex);
|
||||
@@ -790,15 +777,21 @@ std::string LLMeshRepoThread::constructUrl(LLUUID mesh_id)
|
||||
|
||||
bool LLMeshRepoThread::fetchMeshSkinInfo(const LLUUID& mesh_id)
|
||||
{ //protected by mMutex
|
||||
|
||||
if (!mHeaderMutex)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
mHeaderMutex->lock();
|
||||
|
||||
if (mMeshHeader.find(mesh_id) == mMeshHeader.end())
|
||||
{
|
||||
// We have no header info for this mesh, try again later.
|
||||
{ //we have no header info for this mesh, do nothing
|
||||
mHeaderMutex->unlock();
|
||||
return false;
|
||||
}
|
||||
|
||||
bool ret = true ;
|
||||
U32 header_size = mMeshHeaderSize[mesh_id];
|
||||
|
||||
if (header_size > 0)
|
||||
@@ -820,7 +813,7 @@ bool LLMeshRepoThread::fetchMeshSkinInfo(const LLUUID& mesh_id)
|
||||
U8* buffer = new U8[size];
|
||||
file.read(buffer, size);
|
||||
|
||||
//make sure buffer isn't all 0's (reserved block but not written)
|
||||
//make sure buffer isn't all 0's by checking the first 1KB (reserved block but not written)
|
||||
bool zero = true;
|
||||
for (S32 i = 0; i < llmin(size, 1024) && zero; ++i)
|
||||
{
|
||||
@@ -845,9 +838,12 @@ bool LLMeshRepoThread::fetchMeshSkinInfo(const LLUUID& mesh_id)
|
||||
std::string http_url = constructUrl(mesh_id);
|
||||
if (!http_url.empty())
|
||||
{
|
||||
LLHTTPClient::getByteRange(http_url, offset, size,
|
||||
new LLMeshSkinInfoResponder(mesh_id, offset, size), headers);
|
||||
LLMeshRepository::sHTTPRequestCount++;
|
||||
ret = LLHTTPClient::getByteRange(http_url, headers, offset, size,
|
||||
new LLMeshSkinInfoResponder(mesh_id, offset, size));
|
||||
if (ret)
|
||||
{
|
||||
LLMeshRepository::sHTTPRequestCount++;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -857,22 +853,26 @@ bool LLMeshRepoThread::fetchMeshSkinInfo(const LLUUID& mesh_id)
|
||||
}
|
||||
|
||||
//early out was not hit, effectively fetched
|
||||
return true;
|
||||
return ret;
|
||||
}
|
||||
|
||||
//return false if failed to get header
|
||||
bool LLMeshRepoThread::fetchMeshDecomposition(const LLUUID& mesh_id)
|
||||
{ //protected by mMutex
|
||||
if (!mHeaderMutex)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
mHeaderMutex->lock();
|
||||
|
||||
if (mMeshHeader.find(mesh_id) == mMeshHeader.end())
|
||||
{
|
||||
// We have no header info for this mesh, try again later.
|
||||
{ //we have no header info for this mesh, do nothing
|
||||
mHeaderMutex->unlock();
|
||||
return false;
|
||||
}
|
||||
|
||||
U32 header_size = mMeshHeaderSize[mesh_id];
|
||||
bool ret = true ;
|
||||
|
||||
if (header_size > 0)
|
||||
{
|
||||
@@ -889,11 +889,12 @@ bool LLMeshRepoThread::fetchMeshDecomposition(const LLUUID& mesh_id)
|
||||
if (file.getSize() >= offset+size)
|
||||
{
|
||||
LLMeshRepository::sCacheBytesRead += size;
|
||||
|
||||
file.seek(offset);
|
||||
U8* buffer = new U8[size];
|
||||
file.read(buffer, size);
|
||||
|
||||
//make sure buffer isn't all 0's (reserved block but not written)
|
||||
//make sure buffer isn't all 0's by checking the first 1KB (reserved block but not written)
|
||||
bool zero = true;
|
||||
for (S32 i = 0; i < llmin(size, 1024) && zero; ++i)
|
||||
{
|
||||
@@ -918,10 +919,12 @@ bool LLMeshRepoThread::fetchMeshDecomposition(const LLUUID& mesh_id)
|
||||
std::string http_url = constructUrl(mesh_id);
|
||||
if (!http_url.empty())
|
||||
{
|
||||
// This might throw AICurlNoEasyHandle.
|
||||
LLHTTPClient::getByteRange(http_url, offset, size,
|
||||
new LLMeshDecompositionResponder(mesh_id, offset, size), headers);
|
||||
LLMeshRepository::sHTTPRequestCount++;
|
||||
ret = LLHTTPClient::getByteRange(http_url, headers, offset, size,
|
||||
new LLMeshDecompositionResponder(mesh_id, offset, size));
|
||||
if(ret)
|
||||
{
|
||||
LLMeshRepository::sHTTPRequestCount++;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -931,22 +934,26 @@ bool LLMeshRepoThread::fetchMeshDecomposition(const LLUUID& mesh_id)
|
||||
}
|
||||
|
||||
//early out was not hit, effectively fetched
|
||||
return true;
|
||||
return ret;
|
||||
}
|
||||
|
||||
//return false if failed to get header
|
||||
bool LLMeshRepoThread::fetchMeshPhysicsShape(const LLUUID& mesh_id)
|
||||
{ //protected by mMutex
|
||||
if (!mHeaderMutex)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
mHeaderMutex->lock();
|
||||
|
||||
if (mMeshHeader.find(mesh_id) == mMeshHeader.end())
|
||||
{
|
||||
// We have no header info for this mesh, retry later.
|
||||
{ //we have no header info for this mesh, do nothing
|
||||
mHeaderMutex->unlock();
|
||||
return false;
|
||||
}
|
||||
|
||||
U32 header_size = mMeshHeaderSize[mesh_id];
|
||||
bool ret = true ;
|
||||
|
||||
if (header_size > 0)
|
||||
{
|
||||
@@ -967,7 +974,7 @@ bool LLMeshRepoThread::fetchMeshPhysicsShape(const LLUUID& mesh_id)
|
||||
U8* buffer = new U8[size];
|
||||
file.read(buffer, size);
|
||||
|
||||
//make sure buffer isn't all 0's (reserved block but not written)
|
||||
//make sure buffer isn't all 0's by checking the first 1KB (reserved block but not written)
|
||||
bool zero = true;
|
||||
for (S32 i = 0; i < llmin(size, 1024) && zero; ++i)
|
||||
{
|
||||
@@ -992,10 +999,13 @@ bool LLMeshRepoThread::fetchMeshPhysicsShape(const LLUUID& mesh_id)
|
||||
std::string http_url = constructUrl(mesh_id);
|
||||
if (!http_url.empty())
|
||||
{
|
||||
// This might throw AICurlNoEasyHandle.
|
||||
LLHTTPClient::getByteRange(http_url, offset, size,
|
||||
new LLMeshPhysicsShapeResponder(mesh_id, offset, size), headers);
|
||||
LLMeshRepository::sHTTPRequestCount++;
|
||||
ret = LLHTTPClient::getByteRange(http_url, headers, offset, size,
|
||||
new LLMeshPhysicsShapeResponder(mesh_id, offset, size));
|
||||
|
||||
if(ret)
|
||||
{
|
||||
LLMeshRepository::sHTTPRequestCount++;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
@@ -1009,7 +1019,7 @@ bool LLMeshRepoThread::fetchMeshPhysicsShape(const LLUUID& mesh_id)
|
||||
}
|
||||
|
||||
//early out was not hit, effectively fetched
|
||||
return true;
|
||||
return ret;
|
||||
}
|
||||
|
||||
//static
|
||||
@@ -1056,14 +1066,14 @@ bool LLMeshRepoThread::fetchMeshHeader(const LLVolumeParams& mesh_params, U32& c
|
||||
LLMeshRepository::sCacheBytesRead += bytes;
|
||||
file.read(buffer, bytes);
|
||||
if (headerReceived(mesh_params, buffer, bytes))
|
||||
{
|
||||
// Already have header, no need to retry.
|
||||
{ //did not do an HTTP request, return false
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//either cache entry doesn't exist or is corrupt, request header from simulator
|
||||
bool retval = true;
|
||||
AIHTTPHeaders headers("Accept", "application/octet-stream");
|
||||
|
||||
std::string http_url = constructUrl(mesh_params.getSculptID());
|
||||
@@ -1072,19 +1082,29 @@ bool LLMeshRepoThread::fetchMeshHeader(const LLVolumeParams& mesh_params, U32& c
|
||||
//grab first 4KB if we're going to bother with a fetch. Cache will prevent future fetches if a full mesh fits
|
||||
//within the first 4KB
|
||||
//NOTE -- this will break of headers ever exceed 4KB
|
||||
// This might throw AICurlNoEasyHandle.
|
||||
LLHTTPClient::getByteRange(http_url, 0, 4096, new LLMeshHeaderResponder(mesh_params), headers);
|
||||
LLMeshRepository::sHTTPRequestCount++;
|
||||
retval = LLHTTPClient::getByteRange(http_url, headers, 0, 4096, new LLMeshHeaderResponder(mesh_params));
|
||||
if (retval)
|
||||
{
|
||||
LLMeshRepository::sHTTPRequestCount++;
|
||||
}
|
||||
count++;
|
||||
}
|
||||
|
||||
return true;
|
||||
return retval;
|
||||
}
|
||||
|
||||
void LLMeshRepoThread::fetchMeshLOD(const LLVolumeParams& mesh_params, S32 lod, U32& count)
|
||||
//return false if failed to get mesh lod.
|
||||
bool LLMeshRepoThread::fetchMeshLOD(const LLVolumeParams& mesh_params, S32 lod, U32& count)
|
||||
{ //protected by mMutex
|
||||
if (!mHeaderMutex)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
mHeaderMutex->lock();
|
||||
|
||||
bool retval = true;
|
||||
|
||||
LLUUID mesh_id = mesh_params.getSculptID();
|
||||
|
||||
U32 header_size = mMeshHeaderSize[mesh_id];
|
||||
@@ -1108,7 +1128,7 @@ void LLMeshRepoThread::fetchMeshLOD(const LLVolumeParams& mesh_params, S32 lod,
|
||||
U8* buffer = new U8[size];
|
||||
file.read(buffer, size);
|
||||
|
||||
//make sure buffer isn't all 0's (reserved block but not written)
|
||||
//make sure buffer isn't all 0's by checking the first 1KB (reserved block but not written)
|
||||
bool zero = true;
|
||||
for (S32 i = 0; i < llmin(size, 1024) && zero; ++i)
|
||||
{
|
||||
@@ -1120,7 +1140,7 @@ void LLMeshRepoThread::fetchMeshLOD(const LLVolumeParams& mesh_params, S32 lod,
|
||||
if (lodReceived(mesh_params, lod, buffer, size))
|
||||
{
|
||||
delete[] buffer;
|
||||
return;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1133,10 +1153,13 @@ void LLMeshRepoThread::fetchMeshLOD(const LLVolumeParams& mesh_params, S32 lod,
|
||||
std::string http_url = constructUrl(mesh_id);
|
||||
if (!http_url.empty())
|
||||
{
|
||||
// This might throw AICurlNoEasyHandle.
|
||||
LLHTTPClient::getByteRange(constructUrl(mesh_id), offset, size,
|
||||
new LLMeshLODResponder(mesh_params, lod, offset, size), headers);
|
||||
LLMeshRepository::sHTTPRequestCount++;
|
||||
retval = LLHTTPClient::getByteRange(constructUrl(mesh_id), headers, offset, size,
|
||||
new LLMeshLODResponder(mesh_params, lod, offset, size));
|
||||
|
||||
if (retval)
|
||||
{
|
||||
LLMeshRepository::sHTTPRequestCount++;
|
||||
}
|
||||
count++;
|
||||
}
|
||||
else
|
||||
@@ -1153,6 +1176,8 @@ void LLMeshRepoThread::fetchMeshLOD(const LLVolumeParams& mesh_params, S32 lod,
|
||||
{
|
||||
mHeaderMutex->unlock();
|
||||
}
|
||||
|
||||
return retval;
|
||||
}
|
||||
|
||||
bool LLMeshRepoThread::headerReceived(const LLVolumeParams& mesh_params, U8* data, S32 data_size)
|
||||
@@ -1199,7 +1224,6 @@ bool LLMeshRepoThread::headerReceived(const LLVolumeParams& mesh_params, U8* dat
|
||||
mMeshHeader[mesh_id] = header;
|
||||
}
|
||||
|
||||
|
||||
LLMutexLock lock(mMutex); // make sure only one thread access mPendingLOD at the same time.
|
||||
|
||||
//check for pending requests
|
||||
@@ -1212,10 +1236,8 @@ bool LLMeshRepoThread::headerReceived(const LLVolumeParams& mesh_params, U8* dat
|
||||
mLODReqQ.push(req);
|
||||
LLMeshRepository::sLODProcessing++;
|
||||
}
|
||||
|
||||
mPendingLOD.erase(iter); // <FS:ND/> FIRE-7182, only call erase if iter is really valid.
|
||||
mPendingLOD.erase(iter);
|
||||
}
|
||||
// mPendingLOD.erase(iter); // <FS:ND/> avoid crash by moving erase up.
|
||||
}
|
||||
|
||||
return true;
|
||||
@@ -1375,6 +1397,11 @@ void LLMeshUploadThread::init(LLMeshUploadThread::instance_list& data, LLVector3
|
||||
mMeshUploadTimeOut = gSavedSettings.getS32("MeshUploadTimeOut") ;
|
||||
}
|
||||
|
||||
LLMeshUploadThread::~LLMeshUploadThread()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
LLMeshUploadThread::DecompRequest::DecompRequest(LLModel* mdl, LLModel* base_model, LLMeshUploadThread* thread)
|
||||
{
|
||||
mStage = "single_hull";
|
||||
@@ -1476,18 +1503,18 @@ bool LLMeshUploadThread::run()
|
||||
|
||||
void LLMeshUploadThread::postRequest(std::string& whole_model_upload_url, AIMeshUpload* state_machine)
|
||||
{
|
||||
if (!mDoUpload)
|
||||
{
|
||||
LLHTTPClient::post(mWholeModelFeeCapability, mModelData,
|
||||
new LLWholeModelFeeResponder(mModelData, mFeeObserverHandle, whole_model_upload_url)/*,*/
|
||||
DEBUG_CURLIO_PARAM(debug_on), keep_alive, state_machine, AIMeshUpload_responderFinished);
|
||||
}
|
||||
else
|
||||
if (mDoUpload)
|
||||
{
|
||||
LLHTTPClient::post(whole_model_upload_url, mBody,
|
||||
new LLWholeModelUploadResponder(mModelData, mUploadObserverHandle)/*,*/
|
||||
DEBUG_CURLIO_PARAM(debug_off), keep_alive, state_machine, AIMeshUpload_responderFinished);
|
||||
}
|
||||
else
|
||||
{
|
||||
LLHTTPClient::post(mWholeModelFeeCapability, mModelData,
|
||||
new LLWholeModelFeeResponder(mModelData, mFeeObserverHandle, whole_model_upload_url)/*,*/
|
||||
DEBUG_CURLIO_PARAM(debug_on), keep_alive, state_machine, AIMeshUpload_responderFinished);
|
||||
}
|
||||
}
|
||||
|
||||
void dump_llsd_to_file(const LLSD& content, std::string filename)
|
||||
@@ -1735,8 +1762,14 @@ void LLMeshUploadThread::generateHulls()
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void LLMeshRepoThread::notifyLoadedMeshes()
|
||||
{//called via gMeshRepo.notifyLoadedMeshes(). mMutex already locked
|
||||
{
|
||||
if (!mMutex)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
while (!mLoadedQ.empty())
|
||||
{
|
||||
mMutex->lock();
|
||||
@@ -1860,6 +1893,12 @@ void LLMeshLODResponder::completedRaw(U32 status, const std::string& reason,
|
||||
{
|
||||
mProcessed = true;
|
||||
|
||||
// thread could have already be destroyed during logout
|
||||
if( !gMeshRepo.mThread )
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
S32 data_size = buffer->countAfter(channels.in(), NULL);
|
||||
|
||||
if (status < 200 || status >= 400)
|
||||
@@ -1877,6 +1916,7 @@ void LLMeshLODResponder::completedRaw(U32 status, const std::string& reason,
|
||||
}
|
||||
else
|
||||
{
|
||||
llassert(is_internal_http_error_that_warrants_a_retry(status) || status == HTTP_SERVICE_UNAVAILABLE); //intentionally trigger a breakpoint
|
||||
llwarns << "Unhandled status " << status << llendl;
|
||||
}
|
||||
return;
|
||||
@@ -1917,6 +1957,12 @@ void LLMeshSkinInfoResponder::completedRaw(U32 status, const std::string& reason
|
||||
{
|
||||
mProcessed = true;
|
||||
|
||||
// thread could have already be destroyed during logout
|
||||
if( !gMeshRepo.mThread )
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
S32 data_size = buffer->countAfter(channels.in(), NULL);
|
||||
|
||||
if (status < 200 || status >= 400)
|
||||
@@ -1928,12 +1974,13 @@ void LLMeshSkinInfoResponder::completedRaw(U32 status, const std::string& reason
|
||||
{
|
||||
if (is_internal_http_error_that_warrants_a_retry(status) || status == HTTP_SERVICE_UNAVAILABLE)
|
||||
{ //timeout or service unavailable, try again
|
||||
llwarns << "Timeout or service unavailable, retrying." << llendl;
|
||||
llwarns << "Timeout or service unavailable, retrying loadMeshSkinInfo() for " << mMeshID << llendl;
|
||||
LLMeshRepository::sHTTPRetryCount++;
|
||||
gMeshRepo.mThread->loadMeshSkinInfo(mMeshID);
|
||||
}
|
||||
else
|
||||
{
|
||||
llassert(is_internal_http_error_that_warrants_a_retry(status) || status == HTTP_SERVICE_UNAVAILABLE); //intentionally trigger a breakpoint
|
||||
llwarns << "Unhandled status " << status << llendl;
|
||||
}
|
||||
return;
|
||||
@@ -1974,6 +2021,11 @@ void LLMeshDecompositionResponder::completedRaw(U32 status, const std::string& r
|
||||
{
|
||||
mProcessed = true;
|
||||
|
||||
if( !gMeshRepo.mThread )
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
S32 data_size = buffer->countAfter(channels.in(), NULL);
|
||||
|
||||
if (status < 200 || status >= 400)
|
||||
@@ -1985,12 +2037,13 @@ void LLMeshDecompositionResponder::completedRaw(U32 status, const std::string& r
|
||||
{
|
||||
if (is_internal_http_error_that_warrants_a_retry(status) || status == HTTP_SERVICE_UNAVAILABLE)
|
||||
{ //timeout or service unavailable, try again
|
||||
llwarns << "Timeout or service unavailable, retrying." << llendl;
|
||||
llwarns << "Timeout or service unavailable, retrying loadMeshDecomposition() for " << mMeshID << llendl;
|
||||
LLMeshRepository::sHTTPRetryCount++;
|
||||
gMeshRepo.mThread->loadMeshDecomposition(mMeshID);
|
||||
}
|
||||
else
|
||||
{
|
||||
llassert(is_internal_http_error_that_warrants_a_retry(status) || status == HTTP_SERVICE_UNAVAILABLE); //intentionally trigger a breakpoint
|
||||
llwarns << "Unhandled status " << status << llendl;
|
||||
}
|
||||
return;
|
||||
@@ -2031,6 +2084,12 @@ void LLMeshPhysicsShapeResponder::completedRaw(U32 status, const std::string& re
|
||||
{
|
||||
mProcessed = true;
|
||||
|
||||
// thread could have already be destroyed during logout
|
||||
if( !gMeshRepo.mThread )
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
S32 data_size = buffer->countAfter(channels.in(), NULL);
|
||||
|
||||
if (status < 200 || status >= 400)
|
||||
@@ -2042,12 +2101,13 @@ void LLMeshPhysicsShapeResponder::completedRaw(U32 status, const std::string& re
|
||||
{
|
||||
if (is_internal_http_error_that_warrants_a_retry(status) || status == HTTP_SERVICE_UNAVAILABLE)
|
||||
{ //timeout or service unavailable, try again
|
||||
llwarns << "Timeout or service unavailable, retrying." << llendl;
|
||||
llwarns << "Timeout or service unavailable, retrying loadMeshPhysicsShape() for " << mMeshID << llendl;
|
||||
LLMeshRepository::sHTTPRetryCount++;
|
||||
gMeshRepo.mThread->loadMeshPhysicsShape(mMeshID);
|
||||
}
|
||||
else
|
||||
{
|
||||
llassert(is_internal_http_error_that_warrants_a_retry(status) || status == HTTP_SERVICE_UNAVAILABLE); //intentionally trigger a breakpoint
|
||||
llwarns << "Unhandled status " << status << llendl;
|
||||
}
|
||||
return;
|
||||
@@ -2088,18 +2148,27 @@ void LLMeshHeaderResponder::completedRaw(U32 status, const std::string& reason,
|
||||
{
|
||||
mProcessed = true;
|
||||
|
||||
// thread could have already be destroyed during logout
|
||||
if( !gMeshRepo.mThread )
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if (status < 200 || status >= 400)
|
||||
{
|
||||
//llwarns
|
||||
// << "Header responder failed with status: "
|
||||
// << status << ": " << reason << llendl;
|
||||
|
||||
// HTTP_SERVICE_UNAVAILABLE (503) or HTTP_INTERNAL_ERROR_*'s.
|
||||
// 503 (service unavailable) or HTTP_INTERNAL_ERROR_*'s.
|
||||
// can be due to server load and can be retried
|
||||
|
||||
// TODO*: Add maximum retry logic, exponential backoff
|
||||
// and (somewhat more optional than the others) retries
|
||||
// again after some set period of time
|
||||
|
||||
llassert(status == HTTP_NOT_FOUND || status == HTTP_SERVICE_UNAVAILABLE || status == HTTP_REQUEST_TIME_OUT || is_internal_http_error_that_warrants_a_retry(status));
|
||||
|
||||
if (is_internal_http_error_that_warrants_a_retry(status) || status == HTTP_SERVICE_UNAVAILABLE)
|
||||
{ //retry
|
||||
llwarns << "Timeout or service unavailable, retrying." << llendl;
|
||||
@@ -2112,7 +2181,7 @@ void LLMeshHeaderResponder::completedRaw(U32 status, const std::string& reason,
|
||||
}
|
||||
else
|
||||
{
|
||||
llwarns << "Unhandled status." << llendl;
|
||||
llwarns << "Unhandled status: " << status << llendl;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2401,8 +2470,7 @@ void LLMeshRepository::notifyLoadedMeshes()
|
||||
mDecompThread->notifyCompleted();
|
||||
|
||||
if (!mThread->mSignal->tryLock())
|
||||
{
|
||||
// Curl thread is churning, wait for it to go idle.
|
||||
{ //curl thread is churning, wait for it to go idle
|
||||
return;
|
||||
}
|
||||
mThread->mSignal->unlock();
|
||||
@@ -2414,7 +2482,6 @@ void LLMeshRepository::notifyLoadedMeshes()
|
||||
if (gAgent.getRegion()->getName() != region_name && gAgent.getRegion()->capabilitiesReceived())
|
||||
{
|
||||
region_name = gAgent.getRegion()->getName();
|
||||
|
||||
mGetMeshCapability = gAgent.getRegion()->getCapability("GetMesh2");
|
||||
if (mGetMeshCapability.empty())
|
||||
{
|
||||
@@ -2772,8 +2839,9 @@ void LLMeshRepository::uploadModel(std::vector<LLModelInstance>& data, LLVector3
|
||||
llinfos << "unable to upload, fee request failed" << llendl;
|
||||
return;
|
||||
}
|
||||
AIMeshUpload* uploader = new AIMeshUpload(data, scale, upload_textures, upload_skin, upload_joints, upload_url, do_upload, fee_observer, upload_observer);
|
||||
uploader->run(NULL, 0, false, true, &gMainThreadEngine);
|
||||
AIMeshUpload* thread = new AIMeshUpload(data, scale, upload_textures, upload_skin, upload_joints, upload_url,
|
||||
do_upload, fee_observer, upload_observer);
|
||||
thread->run(NULL, 0, false, true, &gMainThreadEngine);
|
||||
}
|
||||
|
||||
S32 LLMeshRepository::getMeshSize(const LLUUID& mesh_id, S32 lod)
|
||||
@@ -3069,13 +3137,15 @@ bool needTriangles( LLConvexDecomposition *aDC )
|
||||
|
||||
void LLPhysicsDecomp::setMeshData(LLCDMeshData& mesh, bool vertex_based)
|
||||
{
|
||||
LLConvexDecomposition *pDeComp = LLConvexDecomposition::getInstance();
|
||||
|
||||
if( !pDeComp )
|
||||
return;
|
||||
|
||||
if( vertex_based )
|
||||
vertex_based = !needTriangles( pDeComp );
|
||||
// <singu> HACD
|
||||
if (vertex_based)
|
||||
{
|
||||
if (LLConvexDecomposition* pDeComp = LLConvexDecomposition::getInstance())
|
||||
vertex_based = !needTriangles(pDeComp);
|
||||
else
|
||||
return;
|
||||
}
|
||||
// </singu>
|
||||
|
||||
mesh.mVertexBase = mCurRequest->mPositions[0].mV;
|
||||
mesh.mVertexStrideBytes = 12;
|
||||
@@ -3093,7 +3163,10 @@ void LLPhysicsDecomp::setMeshData(LLCDMeshData& mesh, bool vertex_based)
|
||||
if ((vertex_based || mesh.mNumTriangles > 0) && mesh.mNumVertices > 2)
|
||||
{
|
||||
LLCDResult ret = LLCD_OK;
|
||||
ret = LLConvexDecomposition::getInstance()->setMeshData(&mesh, vertex_based);
|
||||
if (LLConvexDecomposition::getInstance() != NULL)
|
||||
{
|
||||
ret = LLConvexDecomposition::getInstance()->setMeshData(&mesh, vertex_based);
|
||||
}
|
||||
|
||||
if (ret)
|
||||
{
|
||||
@@ -3148,6 +3221,7 @@ void LLPhysicsDecomp::doDecomposition()
|
||||
continue;
|
||||
}
|
||||
|
||||
|
||||
if (param->mType == LLCDParam::LLCD_FLOAT)
|
||||
{
|
||||
ret = LLConvexDecomposition::getInstance()->setParam(param->mName, (F32) value.asReal());
|
||||
@@ -3461,10 +3535,12 @@ void LLPhysicsDecomp::run()
|
||||
}
|
||||
}
|
||||
|
||||
mSignal->unlock();
|
||||
|
||||
decomp->quitThread();
|
||||
|
||||
if (mSignal->isLocked())
|
||||
{ //let go of mSignal's associated mutex
|
||||
mSignal->unlock();
|
||||
}
|
||||
|
||||
mDone = true;
|
||||
}
|
||||
@@ -3670,4 +3746,3 @@ bool LLMeshRepository::meshRezEnabled()
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
@@ -36,7 +36,7 @@
|
||||
|
||||
#define LLCONVEXDECOMPINTER_STATIC 1
|
||||
|
||||
#include "LLConvexDecomposition.h"
|
||||
#include "llconvexdecomposition.h"
|
||||
#include "lluploadfloaterobservers.h"
|
||||
#include "aistatemachinethread.h"
|
||||
|
||||
@@ -324,7 +324,7 @@ public:
|
||||
void lockAndLoadMeshLOD(const LLVolumeParams& mesh_params, S32 lod);
|
||||
void loadMeshLOD(const LLVolumeParams& mesh_params, S32 lod);
|
||||
bool fetchMeshHeader(const LLVolumeParams& mesh_params, U32& count);
|
||||
void fetchMeshLOD(const LLVolumeParams& mesh_params, S32 lod, U32& count);
|
||||
bool fetchMeshLOD(const LLVolumeParams& mesh_params, S32 lod, U32& count);
|
||||
bool headerReceived(const LLVolumeParams& mesh_params, U8* data, S32 data_size);
|
||||
bool lodReceived(const LLVolumeParams& mesh_params, S32 lod, U8* data, S32 data_size);
|
||||
bool skinInfoReceived(const LLUUID& mesh_id, U8* data, S32 data_size);
|
||||
@@ -405,10 +405,11 @@ public:
|
||||
#endif
|
||||
void init(instance_list& data, LLVector3& scale, bool upload_textures, bool upload_skin, bool upload_joints, bool do_upload,
|
||||
LLHandle<LLWholeModelFeeObserver> const& fee_observer, LLHandle<LLWholeModelUploadObserver> const& upload_observer);
|
||||
~LLMeshUploadThread();
|
||||
|
||||
void postRequest(std::string& url, AIMeshUpload* state_machine);
|
||||
|
||||
/*virtual*/ bool run();
|
||||
virtual bool run();
|
||||
void preStart();
|
||||
|
||||
void generateHulls();
|
||||
@@ -504,8 +505,7 @@ public:
|
||||
|
||||
void uploadModel(std::vector<LLModelInstance>& data, LLVector3& scale, bool upload_textures,
|
||||
bool upload_skin, bool upload_joints, std::string upload_url, bool do_upload = true,
|
||||
LLHandle<LLWholeModelFeeObserver> fee_observer= (LLHandle<LLWholeModelFeeObserver>()),
|
||||
LLHandle<LLWholeModelUploadObserver> upload_observer = (LLHandle<LLWholeModelUploadObserver>()));
|
||||
LLHandle<LLWholeModelFeeObserver> fee_observer= (LLHandle<LLWholeModelFeeObserver>()), LLHandle<LLWholeModelUploadObserver> upload_observer = (LLHandle<LLWholeModelUploadObserver>()));
|
||||
|
||||
S32 getMeshSize(const LLUUID& mesh_id, S32 lod);
|
||||
|
||||
|
||||
@@ -103,11 +103,15 @@ const S32 CIRCLE_STEPS = 100;
|
||||
|
||||
const F64 COARSEUPDATE_MAX_Z = 1020.0f;
|
||||
|
||||
std::map<LLUUID, LLVector3d> LLNetMap::mClosestAgentsToCursor; // <exodus/>
|
||||
static std::map<LLUUID, LLVector3d> mClosestAgentsAtLastClick; // <exodus/>
|
||||
|
||||
LLNetMap::LLNetMap(const std::string& name) :
|
||||
LLPanel(name),
|
||||
mScale(128.f),
|
||||
mObjectMapTPM(1.f),
|
||||
mObjectMapPixels(255.f),
|
||||
mPickRadius(gSavedSettings, "ExodusMinimapAreaEffect"), // <exodus/>
|
||||
mTargetPan(0.f, 0.f),
|
||||
mCurPan(0.f, 0.f),
|
||||
mStartPan(0.f, 0.f),
|
||||
@@ -215,6 +219,13 @@ std::size_t hash_value(const LLUUID& uuid)
|
||||
return (std::size_t)uuid.getCRC32();
|
||||
}
|
||||
boost::unordered_map<const LLUUID,LLColor4> mm_MarkerColors;
|
||||
bool mm_getMarkerColor(const LLUUID& id, LLColor4& color)
|
||||
{
|
||||
boost::unordered_map<const LLUUID,LLColor4>::const_iterator it = mm_MarkerColors.find(id);
|
||||
if (it == mm_MarkerColors.end()) return false;
|
||||
color = it->second;
|
||||
return true;
|
||||
}
|
||||
|
||||
void LLNetMap::mm_setcolor(LLUUID key,LLColor4 col)
|
||||
{
|
||||
@@ -222,6 +233,10 @@ void LLNetMap::mm_setcolor(LLUUID key,LLColor4 col)
|
||||
}
|
||||
void LLNetMap::draw()
|
||||
{
|
||||
LLViewerRegion* region = gAgent.getRegion();
|
||||
|
||||
if (region == NULL) return;
|
||||
|
||||
static LLFrameTimer map_timer;
|
||||
static LLUIColor map_track_color = gTrackColor;
|
||||
static const LLCachedControl<LLColor4> map_frustum_color(gColors, "NetMapFrustum", LLColor4::white);
|
||||
@@ -262,18 +277,15 @@ void LLNetMap::draw()
|
||||
|
||||
gGL.loadIdentity();
|
||||
gGL.loadUIIdentity();
|
||||
|
||||
gGL.scalef(scale.mV[0], scale.mV[1], scale.mV[2]);
|
||||
gGL.translatef(offset.mV[0], offset.mV[1], offset.mV[2]);
|
||||
|
||||
{
|
||||
LLLocalClipRect clip(getLocalRect());
|
||||
{
|
||||
gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
|
||||
|
||||
gGL.matrixMode(LLRender::MM_MODELVIEW);
|
||||
|
||||
// Draw background rectangle
|
||||
// Draw background rectangle.
|
||||
if(isBackgroundVisible())
|
||||
{
|
||||
LLColor4 background_color = isBackgroundOpaque() ? getBackgroundColor().mV : getTransparentColor().mV;
|
||||
@@ -282,23 +294,22 @@ void LLNetMap::draw()
|
||||
}
|
||||
}
|
||||
|
||||
// region 0,0 is in the middle
|
||||
// Region 0,0 is in the middle.
|
||||
S32 center_sw_left = getRect().getWidth() / 2 + llfloor(mCurPan.mV[VX]);
|
||||
S32 center_sw_bottom = getRect().getHeight() / 2 + llfloor(mCurPan.mV[VY]);
|
||||
|
||||
gGL.pushMatrix();
|
||||
|
||||
gGL.translatef( (F32) center_sw_left, (F32) center_sw_bottom, 0.f);
|
||||
|
||||
static LLCachedControl<bool> rotate_map("MiniMapRotate", true);
|
||||
if (rotate_map)
|
||||
{
|
||||
// rotate subsequent draws to agent rotation
|
||||
// Rotate subsequent draws to agent rotation.
|
||||
rotation = atan2( LLViewerCamera::getInstance()->getAtAxis().mV[VX], LLViewerCamera::getInstance()->getAtAxis().mV[VY] );
|
||||
gGL.rotatef( rotation * RAD_TO_DEG, 0.f, 0.f, 1.f);
|
||||
}
|
||||
|
||||
// figure out where agent is
|
||||
// Figure out where agent is.
|
||||
static const LLCachedControl<LLColor4> this_region_color(gColors, "NetMapThisRegion");
|
||||
static const LLCachedControl<LLColor4> live_region_color(gColors, "NetMapLiveRegion");
|
||||
static const LLCachedControl<LLColor4> dead_region_color(gColors, "NetMapDeadRegion");
|
||||
@@ -311,13 +322,14 @@ void LLNetMap::draw()
|
||||
iter != LLWorld::getInstance()->getRegionList().end(); ++iter)
|
||||
{
|
||||
LLViewerRegion* regionp = *iter;
|
||||
|
||||
// Find x and y position relative to camera's center.
|
||||
LLVector3 origin_agent = regionp->getOriginAgent();
|
||||
LLVector3 rel_region_pos = origin_agent - gAgentCamera.getCameraPositionAgent();
|
||||
F32 relative_x = (rel_region_pos.mV[0] / region_width) * mScale;
|
||||
F32 relative_y = (rel_region_pos.mV[1] / region_width) * mScale;
|
||||
|
||||
// background region rectangle
|
||||
// Background region rectangle.
|
||||
F32 bottom = relative_y;
|
||||
F32 left = relative_x;
|
||||
// <FS:CR> Aurora Sim
|
||||
@@ -327,19 +339,9 @@ void LLNetMap::draw()
|
||||
F32 right = left + (regionp->getWidth() / REGION_WIDTH_METERS) * mScale ;
|
||||
// </FS:CR> Aurora Sim
|
||||
|
||||
if (regionp == gAgent.getRegion())
|
||||
{
|
||||
gGL.color4fv(this_region_color().mV);
|
||||
}
|
||||
else
|
||||
{
|
||||
gGL.color4fv(live_region_color().mV);
|
||||
}
|
||||
|
||||
if (!regionp->isAlive())
|
||||
{
|
||||
gGL.color4fv(dead_region_color().mV);
|
||||
}
|
||||
if (regionp == region) gGL.color4fv(this_region_color().mV);
|
||||
else if (!regionp->isAlive()) gGL.color4fv(dead_region_color().mV);
|
||||
else gGL.color4fv(live_region_color().mV);
|
||||
|
||||
// [SL:KB] - Patch: World-MinimapOverlay | Checked: 2012-07-26 (Catznip-3.3)
|
||||
static LLCachedControl<bool> s_fUseWorldMapTextures(gSavedSettings, "MiniMapWorldMapTextures");
|
||||
@@ -445,7 +447,6 @@ void LLNetMap::draw()
|
||||
gObjectList.renderObjectsForMap(*this);
|
||||
|
||||
mObjectImagep->setSubImage(mObjectRawImagep, 0, 0, mObjectImagep->getWidth(), mObjectImagep->getHeight());
|
||||
|
||||
map_timer.reset();
|
||||
}
|
||||
|
||||
@@ -530,10 +531,15 @@ void LLNetMap::draw()
|
||||
// Mouse pointer in local coordinates
|
||||
S32 local_mouse_x;
|
||||
S32 local_mouse_y;
|
||||
//localMouse(&local_mouse_x, &local_mouse_y);
|
||||
|
||||
LLUI::getMousePositionLocal(this, &local_mouse_x, &local_mouse_y);
|
||||
|
||||
F32 min_pick_dist = mDotRadius * mPickRadius;
|
||||
|
||||
mClosestAgentToCursor.setNull();
|
||||
F32 closest_dist_squared = F32_MAX; // value will be overridden in the loop
|
||||
mClosestAgentsToCursor.clear();
|
||||
|
||||
F32 closest_dist_squared = F32_MAX;
|
||||
F32 min_pick_dist_squared = (mDotRadius * MIN_PICK_SCALE) * (mDotRadius * MIN_PICK_SCALE);
|
||||
|
||||
LLVector3 pos_map;
|
||||
@@ -564,38 +570,45 @@ void LLNetMap::draw()
|
||||
{
|
||||
pos_map.mV[VZ] = 16000.f;
|
||||
}
|
||||
if(LLMuteList::getInstance()->isMuted(uuid))
|
||||
{
|
||||
static const LLCachedControl<LLColor4> muted_color("AscentMutedColor",LLColor4(0.7f,0.7f,0.7f,1.f));
|
||||
color = muted_color;
|
||||
}
|
||||
|
||||
LLViewerRegion* avatar_region = LLWorld::getInstance()->getRegionFromPosGlobal(positions[i]);
|
||||
LLUUID estate_owner = avatar_region ? avatar_region->getOwner() : LLUUID::null;
|
||||
if (dist_vec(LLVector2(pos_map.mV[VX], pos_map.mV[VY]), LLVector2(local_mouse_x, local_mouse_y)) < min_pick_dist)
|
||||
{
|
||||
mClosestAgentsToCursor[uuid] = positions[i];
|
||||
static const LLCachedControl<LLColor4> map_avatar_rollover_color(gSavedSettings, "ExodusMapRolloverColor", LLColor4::cyan);
|
||||
color = map_avatar_rollover_color;
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
// MOYMOD Minimap custom av colors.
|
||||
boost::unordered_map<const LLUUID,LLColor4>::const_iterator it = mm_MarkerColors.find(uuid);
|
||||
if(it != mm_MarkerColors.end())
|
||||
{
|
||||
color = it->second;
|
||||
}
|
||||
//Lindens are always more Linden than your friend, make that take precedence
|
||||
else if (LLMuteList::getInstance()->isLinden(uuid))
|
||||
{
|
||||
static const LLCachedControl<LLColor4> linden_color("AscentLindenColor",LLColor4(0.f,0.f,1.f,1.f));
|
||||
color = linden_color;
|
||||
}
|
||||
//check if they are an estate owner at their current position
|
||||
else if (estate_owner.notNull() && uuid == estate_owner)
|
||||
{
|
||||
static const LLCachedControl<LLColor4> em_color("AscentEstateOwnerColor",LLColor4(1.f,0.6f,1.f,1.f));
|
||||
color = em_color;
|
||||
}
|
||||
//without these dots, SL would suck.
|
||||
else if (show_friends && LLAvatarActions::isFriend(uuid))
|
||||
{
|
||||
static const LLCachedControl<LLColor4> friend_color("AscentFriendColor",LLColor4(1.f,1.f,0.f,1.f));
|
||||
color = friend_color;
|
||||
if(LLMuteList::getInstance()->isMuted(uuid))
|
||||
{
|
||||
static const LLCachedControl<LLColor4> muted_color("AscentMutedColor",LLColor4(0.7f,0.7f,0.7f,1.f));
|
||||
color = muted_color;
|
||||
}
|
||||
|
||||
LLViewerRegion* avatar_region = LLWorld::getInstance()->getRegionFromPosGlobal(positions[i]);
|
||||
const LLUUID estate_owner = avatar_region ? avatar_region->getOwner() : LLUUID::null;
|
||||
|
||||
// MOYMOD Minimap custom av colors.
|
||||
if (mm_getMarkerColor(uuid, color)) {}
|
||||
//Lindens are always more Linden than your friend, make that take precedence
|
||||
else if (LLMuteList::getInstance()->isLinden(uuid))
|
||||
{
|
||||
static const LLCachedControl<LLColor4> linden_color("AscentLindenColor",LLColor4(0.f,0.f,1.f,1.f));
|
||||
color = linden_color;
|
||||
}
|
||||
//check if they are an estate owner at their current position
|
||||
else if (estate_owner.notNull() && uuid == estate_owner)
|
||||
{
|
||||
static const LLCachedControl<LLColor4> em_color("AscentEstateOwnerColor",LLColor4(1.f,0.6f,1.f,1.f));
|
||||
color = em_color;
|
||||
}
|
||||
//without these dots, SL would suck.
|
||||
else if (show_friends && LLAvatarActions::isFriend(uuid))
|
||||
{
|
||||
static const LLCachedControl<LLColor4> friend_color("AscentFriendColor",LLColor4(1.f,1.f,0.f,1.f));
|
||||
color = friend_color;
|
||||
}
|
||||
}
|
||||
|
||||
LLWorldMapView::drawAvatar(
|
||||
@@ -603,23 +616,12 @@ void LLNetMap::draw()
|
||||
color,
|
||||
pos_map.mV[VZ], mDotRadius);
|
||||
|
||||
F32 dist_to_cursor_squared = dist_vec_squared(LLVector2(pos_map.mV[VX], pos_map.mV[VY]),
|
||||
LLVector2(local_mouse_x,local_mouse_y));
|
||||
if(dist_to_cursor_squared < min_pick_dist_squared)
|
||||
{
|
||||
if (dist_to_cursor_squared < closest_dist_squared)
|
||||
{
|
||||
closest_dist_squared = dist_to_cursor_squared;
|
||||
mClosestAgentToCursor = uuid;
|
||||
mClosestAgentPosition = positions[i];
|
||||
}
|
||||
}
|
||||
|
||||
if (!gmSelected.empty())
|
||||
if (uuid.notNull())
|
||||
{
|
||||
bool selected = false;
|
||||
uuid_vec_t::iterator sel_iter = gmSelected.begin();
|
||||
|
||||
for (; sel_iter != gmSelected.end(); sel_iter++)
|
||||
{
|
||||
if(*sel_iter == uuid)
|
||||
@@ -628,6 +630,7 @@ void LLNetMap::draw()
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (selected)
|
||||
{
|
||||
if( (pos_map.mV[VX] < 0) ||
|
||||
@@ -637,13 +640,19 @@ void LLNetMap::draw()
|
||||
{
|
||||
S32 x = llround( pos_map.mV[VX] );
|
||||
S32 y = llround( pos_map.mV[VY] );
|
||||
|
||||
LLWorldMapView::drawTrackingCircle( getRect(), x, y, color, 1, 10);
|
||||
} else
|
||||
{
|
||||
LLWorldMapView::drawTrackingDot(pos_map.mV[VX],pos_map.mV[VY],color,0.f);
|
||||
}
|
||||
else LLWorldMapView::drawTrackingDot(pos_map.mV[VX],pos_map.mV[VY],color,0.f);
|
||||
}
|
||||
}
|
||||
|
||||
F32 dist_to_cursor_squared = dist_vec_squared(LLVector2(pos_map.mV[VX], pos_map.mV[VY]), LLVector2(local_mouse_x,local_mouse_y));
|
||||
if (dist_to_cursor_squared < min_pick_dist_squared && dist_to_cursor_squared < closest_dist_squared)
|
||||
{
|
||||
closest_dist_squared = dist_to_cursor_squared;
|
||||
mClosestAgentToCursor = uuid;
|
||||
}
|
||||
}
|
||||
|
||||
// Draw dot for autopilot target
|
||||
@@ -658,24 +667,31 @@ void LLNetMap::draw()
|
||||
{
|
||||
drawTracking( LLAvatarTracker::instance().getGlobalPos(), map_track_color );
|
||||
}
|
||||
else if ( LLTracker::TRACKING_LANDMARK == tracking_status
|
||||
|| LLTracker::TRACKING_LOCATION == tracking_status )
|
||||
else if ( LLTracker::TRACKING_LANDMARK == tracking_status ||
|
||||
LLTracker::TRACKING_LOCATION == tracking_status )
|
||||
{
|
||||
drawTracking( LLTracker::getTrackedPositionGlobal(), map_track_color );
|
||||
}
|
||||
}
|
||||
|
||||
// Draw dot for self avatar position
|
||||
LLVector3d pos_global = gAgent.getPositionGlobal();
|
||||
pos_map = globalPosToView(pos_global);
|
||||
pos_map = globalPosToView(gAgent.getPositionGlobal());
|
||||
S32 dot_width = llround(mDotRadius * 2.f);
|
||||
LLUIImagePtr you = LLWorldMapView::sAvatarYouLargeImage;
|
||||
|
||||
if (you)
|
||||
{
|
||||
you->draw(llround(pos_map.mV[VX] - mDotRadius),
|
||||
llround(pos_map.mV[VY] - mDotRadius),
|
||||
dot_width,
|
||||
dot_width);
|
||||
|
||||
F32 dist_to_cursor_squared = dist_vec_squared(LLVector2(pos_map.mV[VX], pos_map.mV[VY]),
|
||||
LLVector2(local_mouse_x,local_mouse_y));
|
||||
|
||||
if (dist_to_cursor_squared < min_pick_dist_squared && dist_to_cursor_squared < closest_dist_squared)
|
||||
{
|
||||
mClosestAgentToCursor = gAgent.getID();
|
||||
}
|
||||
}
|
||||
|
||||
// Draw chat range ring(s)
|
||||
@@ -721,18 +737,25 @@ void LLNetMap::draw()
|
||||
else
|
||||
{
|
||||
gGL.color4fv((map_frustum_rotating_color()).mV);
|
||||
|
||||
|
||||
// If we don't rotate the map, we have to rotate the frustum.
|
||||
gGL.pushMatrix();
|
||||
gGL.translatef( ctr_x, ctr_y, 0 );
|
||||
gGL.rotatef( atan2( LLViewerCamera::getInstance()->getAtAxis().mV[VX], LLViewerCamera::getInstance()->getAtAxis().mV[VY] ) * RAD_TO_DEG, 0.f, 0.f, -1.f);
|
||||
gGL.begin( LLRender::TRIANGLES );
|
||||
gGL.vertex2f( 0, 0 );
|
||||
gGL.vertex2f( 0.f, 0.f );
|
||||
gGL.vertex2f( -half_width_pixels, far_clip_pixels );
|
||||
gGL.vertex2f( half_width_pixels, far_clip_pixels );
|
||||
gGL.end();
|
||||
gGL.popMatrix();
|
||||
}
|
||||
|
||||
// <exodus> Draw mouse radius
|
||||
static const LLCachedControl<LLColor4> map_avatar_rollover_color("ExodusMapRolloverCircleColor");
|
||||
gGL.color4fv((map_avatar_rollover_color()).mV);
|
||||
// Todo: Detect if over the window and don't render a circle?
|
||||
gl_circle_2d(local_mouse_x, local_mouse_y, min_pick_dist, 32, true);
|
||||
// </exodus>
|
||||
}
|
||||
|
||||
gGL.popMatrix();
|
||||
@@ -764,9 +787,7 @@ void LLNetMap::reshape(S32 width, S32 height, BOOL called_from_parent)
|
||||
|
||||
LLVector3 LLNetMap::globalPosToView(const LLVector3d& global_pos)
|
||||
{
|
||||
LLVector3d camera_position = gAgentCamera.getCameraPositionGlobal();
|
||||
|
||||
LLVector3d relative_pos_global = global_pos - camera_position;
|
||||
LLVector3d relative_pos_global = global_pos - gAgentCamera.getCameraPositionGlobal();
|
||||
LLVector3 pos_local;
|
||||
pos_local.setVec(relative_pos_global); // convert to floats from doubles
|
||||
|
||||
@@ -862,6 +883,13 @@ LLVector3d LLNetMap::viewPosToGlobal( S32 x, S32 y )
|
||||
|
||||
BOOL LLNetMap::handleScrollWheel(S32 x, S32 y, S32 clicks)
|
||||
{
|
||||
// <exodus>
|
||||
if (gKeyboard->currentMask(TRUE) & MASK_SHIFT)
|
||||
{
|
||||
mPickRadius = llclamp(mPickRadius + (2.5f * clicks), 1.f, 64.f);
|
||||
return true;
|
||||
}
|
||||
// </exodus>
|
||||
// note that clicks are reversed from what you'd think: i.e. > 0 means zoom out, < 0 means zoom in
|
||||
F32 new_scale = mScale * pow(MAP_SCALE_ZOOM_FACTOR, -clicks);
|
||||
F32 old_scale = mScale;
|
||||
@@ -881,7 +909,7 @@ BOOL LLNetMap::handleScrollWheel(S32 x, S32 y, S32 clicks)
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
BOOL LLNetMap::handleToolTip( S32 x, S32 y, std::string& msg, LLRect* sticky_rect_screen )
|
||||
BOOL LLNetMap::handleToolTip( S32 x, S32 y, std::string& tool_tip, LLRect* sticky_rect_screen )
|
||||
{
|
||||
if (gDisconnected)
|
||||
{
|
||||
@@ -898,41 +926,64 @@ BOOL LLNetMap::handleToolTip( S32 x, S32 y, std::string& msg, LLRect* sticky_rec
|
||||
sticky_rect.mRight = sticky_rect.mLeft + 2 * SLOP;
|
||||
sticky_rect.mTop = sticky_rect.mBottom + 2 * SLOP;
|
||||
|
||||
msg.assign("");
|
||||
std::string fullname;
|
||||
if(mClosestAgentToCursor.notNull() && LLAvatarNameCache::getPNSName(mClosestAgentToCursor, fullname))
|
||||
tool_tip.assign("");
|
||||
|
||||
if (region->mMapAvatarIDs.count())
|
||||
{
|
||||
//msg.append(fullname);
|
||||
// [RLVa:KB] - Version: 1.23.4 | Checked: 2009-07-08 (RLVa-1.0.0e) | Modified: RLVa-0.2.0b
|
||||
msg.append( (!gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMES)) ? fullname : RlvStrings::getAnonym(fullname) );
|
||||
// [/RLVa:KB]
|
||||
msg.append("\n");
|
||||
|
||||
LLVector3d mypos = gAgent.getPositionGlobal();
|
||||
LLVector3d position = mClosestAgentPosition;
|
||||
|
||||
if ( LLFloaterAvatarList::instanceExists() )
|
||||
if (mClosestAgentsToCursor.size())
|
||||
{
|
||||
if (LLAvatarListEntry *ent = LLFloaterAvatarList::getInstance()->getAvatarEntry(mClosestAgentToCursor))
|
||||
position = ent->getPosition();
|
||||
}
|
||||
LLVector3d delta = position - mypos;
|
||||
F32 distance = (F32)delta.magVec();
|
||||
bool single_agent(mClosestAgentsToCursor.size() == 1); // Singu note: For old look, only add the count if we have more than one
|
||||
if (!single_agent)
|
||||
tool_tip.append(llformat("Agents under cursor (%d/%d)\n", mClosestAgentsToCursor.size(), region->mMapAvatarIDs.count() + 1));
|
||||
|
||||
msg.append( llformat("\n(Distance: %.02fm)\n\n",distance) );
|
||||
LLVector3d myPosition = gAgent.getPositionGlobal();
|
||||
|
||||
std::map<LLUUID, LLVector3d>::iterator current = mClosestAgentsToCursor.begin();
|
||||
std::map<LLUUID, LLVector3d>::iterator end = mClosestAgentsToCursor.end();
|
||||
for (; current != end; ++current)
|
||||
{
|
||||
LLUUID targetUUID = (*current).first;
|
||||
LLVector3d targetPosition = (*current).second;
|
||||
|
||||
std::string fullName;
|
||||
if (targetUUID.notNull() && LLAvatarNameCache::getPNSName(targetUUID, fullName))
|
||||
{
|
||||
//tool_tip.append(fullName);
|
||||
// [RLVa:KB] - Version: 1.23.4 | Checked: 2009-07-08 (RLVa-1.0.0e) | Modified: RLVa-0.2.0b
|
||||
tool_tip.append( (!gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMES)) ? fullName : RlvStrings::getAnonym(fullName) );
|
||||
// [/RLVa:KB]
|
||||
|
||||
// <singu> Use the radar for positioning, when possible.
|
||||
if (LLFloaterAvatarList::instanceExists())
|
||||
{
|
||||
if (LLAvatarListEntry* ent = LLFloaterAvatarList::getInstance()->getAvatarEntry(targetUUID))
|
||||
targetPosition = ent->getPosition();
|
||||
}
|
||||
// </singu>
|
||||
|
||||
LLVector3d delta = targetPosition - myPosition;
|
||||
F32 distance = (F32)delta.magVec();
|
||||
if (single_agent)
|
||||
tool_tip.append( llformat("\n\n(Distance: %.02fm)\n",distance) );
|
||||
else
|
||||
tool_tip.append(llformat(" (%.02fm)\n", distance));
|
||||
}
|
||||
}
|
||||
tool_tip.append("\n");
|
||||
}
|
||||
}
|
||||
// [RLVa:KB] - Version: 1.23.4 | Checked: 2009-07-04 (RLVa-1.0.0a) | Modified: RLVa-0.2.0b
|
||||
msg.append( (!gRlvHandler.hasBehaviour(RLV_BHVR_SHOWLOC)) ? region->getName() : RlvStrings::getString(RLV_STRING_HIDDEN) );
|
||||
tool_tip.append((!gRlvHandler.hasBehaviour(RLV_BHVR_SHOWLOC) ? region->getName() : RlvStrings::getString(RLV_STRING_HIDDEN)));
|
||||
// [/RLVa:KB]
|
||||
//msg.append( region->getName() );
|
||||
//tool_tip.append("\n\n" + region->getName());
|
||||
|
||||
msg.append("\n" + region->getHost().getHostName());
|
||||
msg.append("\n" + region->getHost().getString());
|
||||
msg.append("\n" + getToolTip());
|
||||
tool_tip.append("\n" + region->getHost().getHostName());
|
||||
tool_tip.append("\n" + region->getHost().getString());
|
||||
tool_tip.append("\n" + getToolTip());
|
||||
}
|
||||
else
|
||||
{
|
||||
return LLPanel::handleToolTip(x, y, msg, sticky_rect_screen);
|
||||
return LLPanel::handleToolTip(x, y, tool_tip, sticky_rect_screen);
|
||||
}
|
||||
*sticky_rect_screen = sticky_rect;
|
||||
return TRUE;
|
||||
@@ -1283,9 +1334,11 @@ bool LLNetMap::OverlayToggle::handleEvent(LLPointer<LLEvent> event, const LLSD&
|
||||
|
||||
BOOL LLNetMap::handleRightMouseDown(S32 x, S32 y, MASK mask)
|
||||
{
|
||||
mClosestAgentsAtLastClick = mClosestAgentsToCursor;
|
||||
mClosestAgentAtLastRightClick = mClosestAgentToCursor;
|
||||
if (mPopupMenu)
|
||||
{
|
||||
// Singu TODO: It'd be spectacular to address multiple avatars from here.
|
||||
mPopupMenu->buildDrawLabels();
|
||||
mPopupMenu->updateParent(LLMenuGL::sMenuContainer);
|
||||
LLMenuGL::showPopup(this, mPopupMenu, x, y);
|
||||
@@ -1404,58 +1457,50 @@ bool LLNetMap::LLScaleMap::handleEvent(LLPointer<LLEvent> event, const LLSD& use
|
||||
}
|
||||
|
||||
//moymod - minimap color shit
|
||||
bool LLNetMap::mmsetred::handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
|
||||
void markMassAgents(const LLColor4& color)
|
||||
{
|
||||
LLNetMap *self = mPtr;
|
||||
//if(self->mClosestAgentAtLastRightClick){
|
||||
mm_setcolor(self->mClosestAgentAtLastRightClick,LLColor4(1.0,0.0,0.0,1.0));
|
||||
//}
|
||||
std::map<LLUUID, LLVector3d>::iterator current = mClosestAgentsAtLastClick.begin();
|
||||
std::map<LLUUID, LLVector3d>::iterator end = mClosestAgentsAtLastClick.end();
|
||||
for(; current != end; ++current) LLNetMap::mm_setcolor((*current).first, color);
|
||||
}
|
||||
|
||||
bool LLNetMap::mmsetred::handleEvent(LLPointer<LLEvent>, const LLSD&)
|
||||
{
|
||||
markMassAgents(LLColor4::red); return true;
|
||||
}
|
||||
bool LLNetMap::mmsetgreen::handleEvent(LLPointer<LLEvent>, const LLSD&)
|
||||
{
|
||||
markMassAgents(LLColor4::green); return true;
|
||||
}
|
||||
bool LLNetMap::mmsetblue::handleEvent(LLPointer<LLEvent>, const LLSD&)
|
||||
{
|
||||
markMassAgents(LLColor4::blue); return true;
|
||||
}
|
||||
bool LLNetMap::mmsetyellow::handleEvent(LLPointer<LLEvent>, const LLSD&)
|
||||
{
|
||||
markMassAgents(LLColor4::yellow); return true;
|
||||
}
|
||||
bool LLNetMap::mmsetcustom::handleEvent(LLPointer<LLEvent>, const LLSD&)
|
||||
{
|
||||
markMassAgents(gSavedSettings.getColor4("MoyMiniMapCustomColor")); return true;
|
||||
}
|
||||
bool LLNetMap::mmsetunmark::handleEvent(LLPointer<LLEvent>, const LLSD&)
|
||||
{
|
||||
std::map<LLUUID, LLVector3d>::iterator it = mClosestAgentsAtLastClick.begin();
|
||||
std::map<LLUUID, LLVector3d>::iterator end = mClosestAgentsAtLastClick.end();
|
||||
for(; it!= end; ++it) mm_MarkerColors.erase((*it).first);
|
||||
return true;
|
||||
}
|
||||
bool LLNetMap::mmsetgreen::handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
|
||||
bool LLNetMap::mmenableunmark::handleEvent(LLPointer<LLEvent>, const LLSD& userdata)
|
||||
{
|
||||
LLNetMap *self = mPtr;
|
||||
//if(self->mClosestAgentAtLastRightClick){
|
||||
mm_setcolor(self->mClosestAgentAtLastRightClick,LLColor4(0.0,1.0,0.0,1.0));
|
||||
//}
|
||||
return true;
|
||||
}
|
||||
bool LLNetMap::mmsetblue::handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
|
||||
{
|
||||
LLNetMap *self = mPtr;
|
||||
//if(self->mClosestAgentAtLastRightClick){
|
||||
mm_setcolor(self->mClosestAgentAtLastRightClick,LLColor4(0.0,0.0,1.0,1.0));
|
||||
//}
|
||||
return true;
|
||||
}
|
||||
bool LLNetMap::mmsetyellow::handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
|
||||
{
|
||||
LLNetMap *self = mPtr;
|
||||
//if(self->mClosestAgentAtLastRightClick){
|
||||
mm_setcolor(self->mClosestAgentAtLastRightClick,LLColor4(1.0,1.0,0.0,1.0));
|
||||
//}
|
||||
return true;
|
||||
}
|
||||
bool LLNetMap::mmsetcustom::handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
|
||||
{
|
||||
LLNetMap *self = mPtr;
|
||||
//if(self->mClosestAgentAtLastRightClick){
|
||||
mm_setcolor(self->mClosestAgentAtLastRightClick,gSavedSettings.getColor4("MoyMiniMapCustomColor"));
|
||||
//}
|
||||
return true;
|
||||
}
|
||||
bool LLNetMap::mmsetunmark::handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
|
||||
{
|
||||
mm_MarkerColors.erase(mPtr->mClosestAgentAtLastRightClick);
|
||||
return true;
|
||||
}
|
||||
bool LLNetMap::mmenableunmark::handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
|
||||
{
|
||||
LLNetMap *self = mPtr;
|
||||
BOOL enabled = mPtr->mClosestAgentAtLastRightClick.notNull() && mm_MarkerColors.find(mPtr->mClosestAgentAtLastRightClick) != mm_MarkerColors.end();
|
||||
self->findControl(userdata["control"].asString())->setValue(enabled);
|
||||
bool enabled(false);
|
||||
std::map<LLUUID, LLVector3d>::iterator it = mClosestAgentsAtLastClick.begin();
|
||||
std::map<LLUUID, LLVector3d>::iterator end = mClosestAgentsAtLastClick.end();
|
||||
for(; it != end && !enabled; ++it) enabled = mm_MarkerColors.find((*it).first) != mm_MarkerColors.end();
|
||||
mPtr->findControl(userdata["control"].asString())->setValue(enabled);
|
||||
return true;
|
||||
}
|
||||
|
||||
bool LLNetMap::LLCenterMap::handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
|
||||
{
|
||||
EMiniMapCenter center = (EMiniMapCenter)userdata.asInteger();
|
||||
|
||||
@@ -132,6 +132,9 @@ private:
|
||||
F32 mObjectMapTPM; // texels per meter on map
|
||||
F32 mObjectMapPixels; // Width of object map in pixels
|
||||
F32 mDotRadius; // Size of avatar markers
|
||||
// <exodus>
|
||||
LLCachedControl<F32> mPickRadius; // Size of the rightclick area of affect
|
||||
// </exodus>
|
||||
|
||||
bool mPanning; // map is being dragged
|
||||
LLVector2 mTargetPan;
|
||||
@@ -148,8 +151,9 @@ private:
|
||||
LLPointer<LLViewerTexture> mParcelImagep;
|
||||
// [/SL:KB]
|
||||
|
||||
static std::map<LLUUID, LLVector3d> mClosestAgentsToCursor; // <exodus/>
|
||||
|
||||
LLUUID mClosestAgentToCursor;
|
||||
LLVector3d mClosestAgentPosition;
|
||||
LLUUID mClosestAgentAtLastRightClick;
|
||||
|
||||
static void showAgentProfile(void*);
|
||||
|
||||
@@ -1496,7 +1496,7 @@ bool LLTextureFetchWorker::doWork(S32 param)
|
||||
HTTP_CASE(HTTP_INTERNAL_ERROR_CURL_OTHER)
|
||||
HTTP_CASE(HTTP_INTERNAL_ERROR_OTHER)
|
||||
default:
|
||||
LL_DEBUGS("TexDebug") << mID << " status = " << mGetStatus << " (??)" << " Failcount = " << mHTTPFailCount << llendl; break;
|
||||
LL_DEBUGS("TexDebug") << mID << " status = " << mGetStatus << " (?)" << " Failcount = " << mHTTPFailCount << llendl; break;
|
||||
}
|
||||
|
||||
if (mGetStatus == HTTP_NOT_FOUND || mGetStatus == HTTP_INTERNAL_ERROR_CURL_TIMEOUT || mGetStatus == HTTP_INTERNAL_ERROR_LOW_SPEED)
|
||||
|
||||
@@ -96,6 +96,7 @@ void precache_audio()
|
||||
gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndTyping")));
|
||||
gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndWindowClose")));
|
||||
gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndWindowOpen")));
|
||||
gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndRestart")));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -67,6 +67,7 @@
|
||||
#include "llfloatermute.h"
|
||||
#include "llfloaterpostcard.h"
|
||||
#include "llfloaterpreference.h"
|
||||
#include "llfloaterregionrestarting.h"
|
||||
#include "llfloaterteleporthistory.h"
|
||||
#include "llgroupactions.h"
|
||||
#include "llhudeffecttrail.h"
|
||||
@@ -6434,7 +6435,6 @@ bool handle_special_notification(std::string notificationID, LLSD& llsdBlock)
|
||||
std::string regionMaturity = LLViewerRegion::accessToString(regionAccess);
|
||||
LLStringUtil::toLower(regionMaturity);
|
||||
llsdBlock["REGIONMATURITY"] = regionMaturity;
|
||||
|
||||
bool returnValue = false;
|
||||
LLNotificationPtr maturityLevelNotification;
|
||||
std::string notifySuffix = "_Notify";
|
||||
@@ -6583,6 +6583,34 @@ void home_position_set()
|
||||
gViewerWindow->saveSnapshot(snap_filename, gViewerWindow->getWindowWidthRaw(), gViewerWindow->getWindowHeightRaw(), FALSE, FALSE);
|
||||
}
|
||||
|
||||
void update_region_restart(const LLSD& llsdBlock)
|
||||
{
|
||||
U32 seconds;
|
||||
if (llsdBlock.has("MINUTES"))
|
||||
{
|
||||
seconds = 60U * static_cast<U32>(llsdBlock["MINUTES"].asInteger());
|
||||
}
|
||||
else
|
||||
{
|
||||
seconds = static_cast<U32>(llsdBlock["SECONDS"].asInteger());
|
||||
}
|
||||
|
||||
LLFloaterRegionRestarting* restarting_floater = LLFloaterRegionRestarting::findInstance();
|
||||
|
||||
if (restarting_floater)
|
||||
{
|
||||
restarting_floater->updateTime(seconds);
|
||||
restarting_floater->center();
|
||||
}
|
||||
else
|
||||
{
|
||||
LLSD params;
|
||||
params["NAME"] = llsdBlock["NAME"];
|
||||
params["SECONDS"] = (LLSD::Integer)seconds;
|
||||
LLFloaterRegionRestarting::showInstance(params);
|
||||
}
|
||||
}
|
||||
|
||||
bool attempt_standard_notification(LLMessageSystem* msgsystem)
|
||||
{
|
||||
// if we have additional alert data
|
||||
@@ -6654,6 +6682,12 @@ bool attempt_standard_notification(LLMessageSystem* msgsystem)
|
||||
{
|
||||
LLViewerStats::getInstance()->incStat(LLViewerStats::ST_KILLED_COUNT);
|
||||
}
|
||||
else if (notificationID == "RegionRestartMinutes" || notificationID == "RegionRestartSeconds")
|
||||
{
|
||||
update_region_restart(llsdBlock);
|
||||
LLUI::sAudioCallback(LLUUID(gSavedSettings.getString("UISndRestart")));
|
||||
return true; // Floater is enough.
|
||||
}
|
||||
|
||||
LLNotificationsUtil::add(notificationID, llsdBlock);
|
||||
return true;
|
||||
@@ -6712,7 +6746,6 @@ bool handle_not_age_verified_alert(const std::string &pAlertName)
|
||||
bool handle_special_alerts(const std::string &pAlertName)
|
||||
{
|
||||
bool isHandled = false;
|
||||
|
||||
if (LLStringUtil::compareStrings(pAlertName, "NotAgeVerified") == 0)
|
||||
{
|
||||
|
||||
@@ -6763,17 +6796,27 @@ void process_alert_core(const std::string& message, BOOL modal)
|
||||
S32 mins = 0;
|
||||
LLStringUtil::convertToS32(text.substr(18), mins);
|
||||
args["MINUTES"] = llformat("%d",mins);
|
||||
LLNotificationsUtil::add("RegionRestartMinutes", args);
|
||||
update_region_restart(args);
|
||||
//LLNotificationsUtil::add("RegionRestartMinutes", args); // Floater is enough.
|
||||
LLUI::sAudioCallback(LLUUID(gSavedSettings.getString("UISndRestart")));
|
||||
}
|
||||
else if (text.substr(0,17) == "RESTART_X_SECONDS")
|
||||
{
|
||||
S32 secs = 0;
|
||||
LLStringUtil::convertToS32(text.substr(18), secs);
|
||||
args["SECONDS"] = llformat("%d",secs);
|
||||
LLNotificationsUtil::add("RegionRestartSeconds", args);
|
||||
update_region_restart(args);
|
||||
//LLNotificationsUtil::add("RegionRestartSeconds", args); // Floater is enough.
|
||||
LLUI::sAudioCallback(LLUUID(gSavedSettings.getString("UISndRestart")));
|
||||
}
|
||||
else
|
||||
{
|
||||
// *NOTE: If the text from the server ever changes this line will need to be adjusted.
|
||||
if (text.substr(0, 25) == "Region restart cancelled.")
|
||||
{
|
||||
LLFloaterRegionRestarting::hideInstance();
|
||||
}
|
||||
|
||||
std::string new_msg =LLNotificationTemplates::instance().getGlobalString(text);
|
||||
// [RLVa:KB] - Checked: 2012-02-07 (RLVa-1.4.5) | Added: RLVa-1.4.5
|
||||
if ( (new_msg == text) && (rlv_handler_t::isEnabled()) )
|
||||
@@ -6872,6 +6915,32 @@ void mean_name_callback(const LLUUID &id, const std::string& full_name, bool is_
|
||||
}
|
||||
}
|
||||
|
||||
void chat_mean_collision(const LLUUID& id, const LLAvatarName& avname, const EMeanCollisionType& type, const F32& mag)
|
||||
{
|
||||
LLStringUtil::format_map_t args;
|
||||
if (type == MEAN_BUMP)
|
||||
args["ACT"] = LLTrans::getString("bump");
|
||||
else if (type == MEAN_LLPUSHOBJECT)
|
||||
args["ACT"] = LLTrans::getString("llpushobject");
|
||||
else if (type == MEAN_SELECTED_OBJECT_COLLIDE)
|
||||
args["ACT"] = LLTrans::getString("selected_object_collide");
|
||||
else if (type == MEAN_SCRIPTED_OBJECT_COLLIDE)
|
||||
args["ACT"] = LLTrans::getString("scripted_object_collide");
|
||||
else if (type == MEAN_PHYSICAL_OBJECT_COLLIDE)
|
||||
args["ACT"] = LLTrans::getString("physical_object_collide");
|
||||
else
|
||||
return; // How did we get here? I used to know you so well.
|
||||
std::string name;
|
||||
LLAvatarNameCache::getPNSName(avname, name);
|
||||
args["NAME"] = name;
|
||||
args["MAG"] = llformat("%f", mag);
|
||||
LLChat chat(LLTrans::getString("BumpedYou", args));
|
||||
chat.mFromName = name;
|
||||
chat.mURL = llformat("secondlife:///app/agent/%s/about", id.asString().c_str());
|
||||
chat.mSourceType = CHAT_SOURCE_SYSTEM;
|
||||
LLFloaterChat::addChat(chat);
|
||||
}
|
||||
|
||||
void process_mean_collision_alert_message(LLMessageSystem *msgsystem, void **user_data)
|
||||
{
|
||||
if (gAgent.inPrelude())
|
||||
@@ -6901,6 +6970,8 @@ void process_mean_collision_alert_message(LLMessageSystem *msgsystem, void **use
|
||||
msgsystem->getU8Fast(_PREHASH_MeanCollision, _PREHASH_Type, u8type);
|
||||
|
||||
type = (EMeanCollisionType)u8type;
|
||||
static const LLCachedControl<bool> chat_collision("AnnounceBumps");
|
||||
if (chat_collision) LLAvatarNameCache::get(perp, boost::bind(chat_mean_collision, _1, _2, type, mag));
|
||||
|
||||
BOOL b_found = FALSE;
|
||||
|
||||
|
||||
@@ -851,16 +851,18 @@ void LLObjectBackup::importObject_continued(AIFilePicker* filepicker)
|
||||
llifstream import_file(file_name);
|
||||
LLSDSerialize::fromXML(mLLSD, import_file);
|
||||
import_file.close();
|
||||
if (!mLLSD.has("data"))
|
||||
{
|
||||
LLNotificationsUtil::add("InvalidObjectParams");
|
||||
close();
|
||||
return;
|
||||
}
|
||||
show(false);
|
||||
|
||||
mAgentPos = gAgent.getPositionAgent();
|
||||
mAgentRot = LLQuaternion(gAgent.getAtAxis(), gAgent.getLeftAxis(), gAgent.getUpAxis());
|
||||
|
||||
// Get the texture map
|
||||
|
||||
LLSD::map_const_iterator prim_it;
|
||||
LLSD::array_const_iterator prim_arr_it;
|
||||
|
||||
mCurObject = 1;
|
||||
mCurPrim = 1;
|
||||
mObjects = mLLSD["data"].size();
|
||||
@@ -868,11 +870,11 @@ void LLObjectBackup::importObject_continued(AIFilePicker* filepicker)
|
||||
mRezCount = 0;
|
||||
updateImportNumbers();
|
||||
|
||||
for (prim_arr_it = mLLSD["data"].beginArray(); prim_arr_it != mLLSD["data"].endArray(); prim_arr_it++)
|
||||
for (LLSD::array_const_iterator prim_arr_it = mLLSD["data"].beginArray(); prim_arr_it != mLLSD["data"].endArray(); prim_arr_it++)
|
||||
{
|
||||
LLSD llsd2 = (*prim_arr_it)["group_body"];
|
||||
|
||||
for (prim_it = llsd2.beginMap(); prim_it != llsd2.endMap(); prim_it++)
|
||||
for (LLSD::map_const_iterator prim_it = llsd2.beginMap(); prim_it != llsd2.endMap(); prim_it++)
|
||||
{
|
||||
LLSD prim_llsd = llsd2[prim_it->first];
|
||||
LLSD::array_iterator text_it;
|
||||
|
||||
@@ -1667,7 +1667,7 @@ LLView* LLViewerTextEditor::fromXML(LLXMLNodePtr node, LLView *parent, LLUICtrlF
|
||||
node->getAttributeBOOL("hide_border", hide_border);
|
||||
text_editor->setBorderVisible(!hide_border);
|
||||
|
||||
BOOL parse_html = text_editor->mParseHTML;
|
||||
BOOL parse_html = true;
|
||||
node->getAttributeBOOL("allow_html", parse_html);
|
||||
text_editor->setParseHTML(parse_html);
|
||||
text_editor->setParseHighlights(TRUE);
|
||||
|
||||
@@ -910,8 +910,10 @@ const LLUUID SHClientTagMgr::getClientID(const LLVOAvatar* pAvatar) const
|
||||
}
|
||||
return tag.asUUID();
|
||||
}
|
||||
bool mm_getMarkerColor(const LLUUID&, LLColor4&);
|
||||
bool SHClientTagMgr::getClientColor(const LLVOAvatar* pAvatar, bool check_status, LLColor4& color) const
|
||||
{
|
||||
if (mm_getMarkerColor(pAvatar->getID(), color)) return true;
|
||||
static const LLCachedControl<bool> ascent_use_status_colors("AscentUseStatusColors",true);
|
||||
static const LLCachedControl<bool> ascent_show_self_tag_color("AscentShowSelfTagColor");
|
||||
static const LLCachedControl<bool> ascent_show_others_tag_color("AscentShowOthersTagColor");
|
||||
|
||||
@@ -2492,7 +2492,7 @@ public:
|
||||
|
||||
/*virtual*/ void completedHeaders(U32 status, std::string const& reason, AIHTTPReceivedHeaders const& headers)
|
||||
{
|
||||
if (200 <= status && status < 300)
|
||||
if (isGoodStatus(status))
|
||||
{
|
||||
LL_DEBUGS("Avatar") << "status OK" << llendl;
|
||||
}
|
||||
|
||||
@@ -26,11 +26,11 @@
|
||||
left="0" name="step_1" width="64" />
|
||||
<text bottom_delta="38" follows="top|left" height="16" left="72" name="contacting"
|
||||
right="-20" >
|
||||
Contacting LindeX...
|
||||
Contacting currency exchange...
|
||||
</text>
|
||||
<text bottom_delta="0" follows="top|left" height="16" left="72"
|
||||
name="buy_action_unknown" right="-20" >
|
||||
Buy [CURRENCY] on the LindeX currency exchange
|
||||
Buy [CURRENCY] on the currency exchange
|
||||
</text>
|
||||
<text bottom_delta="0" follows="top|left" height="16" left="72" name="buy_action"
|
||||
right="-20" >
|
||||
|
||||
@@ -0,0 +1,81 @@
|
||||
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
|
||||
<floater
|
||||
height="140"
|
||||
width="360"
|
||||
layout="topleft"
|
||||
name="region_restarting"
|
||||
help_topic="floater_region_restarting"
|
||||
single_instance="true"
|
||||
reuse_instance="false"
|
||||
title="Region Restarting">
|
||||
<string name="RegionName">
|
||||
The region you are in now
|
||||
([NAME]) is about to restart.
|
||||
|
||||
If you stay here, you'll be logged out.
|
||||
</string>
|
||||
<string name="RestartSeconds">
|
||||
Seconds Until Restart:
|
||||
[SECONDS]
|
||||
</string>
|
||||
<panel
|
||||
name="layout_panel_1"
|
||||
height="140"
|
||||
width="360"
|
||||
follows="right|top"
|
||||
bottom="-140"
|
||||
left="0"
|
||||
mouse_opaque="false"
|
||||
background_visible="true"
|
||||
bg_opaque_color="NotifyCautionBoxColor"
|
||||
bg_alpha_color="NotifyCautionBoxColor">
|
||||
|
||||
<icon color="1.0 1.0 1.0 1.0"
|
||||
tab_stop="false"
|
||||
mouse_opaque="false"
|
||||
name="icon"
|
||||
width="32"
|
||||
height="32"
|
||||
bottom="-40"
|
||||
left="8"
|
||||
image_name="notify_caution_icon.tga"
|
||||
follows="left|top">
|
||||
</icon>
|
||||
|
||||
<text
|
||||
type="string"
|
||||
length="1"
|
||||
follows="top|left"
|
||||
layout="topleft"
|
||||
name="region_name"
|
||||
text_color="0 0 0 1"
|
||||
font="SansSerifBold"
|
||||
word_wrap="true"
|
||||
height="100"
|
||||
bottom="-110"
|
||||
left="48"
|
||||
width="320">
|
||||
The region you are in now
|
||||
(-The longest region name-) is about to restart.
|
||||
|
||||
If you stay here, you'll be logged out.
|
||||
</text>
|
||||
<text
|
||||
type="string"
|
||||
length="1"
|
||||
follows="top|left"
|
||||
layout="topleft"
|
||||
name="restart_seconds"
|
||||
text_color="0 0 0 1"
|
||||
font="SansSerifBold"
|
||||
height="40"
|
||||
bottom_delta="-25"
|
||||
left="0"
|
||||
halign="center"
|
||||
width="360">
|
||||
Seconds Until Restart:
|
||||
32767
|
||||
</text>
|
||||
</panel>
|
||||
</floater>
|
||||
|
||||
@@ -351,7 +351,7 @@
|
||||
mouse_opaque="true" name="WLGlowB" show_text="true" value="1.0" width="200" />
|
||||
<slider bottom_delta="-11" can_edit_text="false" control_name="WLGlowR"
|
||||
decimal_digits="2" follows="left" height="10" increment="0.01"
|
||||
initial_val="0.25" label="Size " left="494" max_val="1.99" min_val="1"
|
||||
initial_val="0.25" label="Size " left="494" max_val="1.99" min_val="0.01"
|
||||
mouse_opaque="true" name="WLGlowR" show_text="true" value="1.0" width="200" />
|
||||
<text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
|
||||
bottom="-67" drop_shadow_visible="true" follows="left|top|right"
|
||||
|
||||
@@ -44,7 +44,20 @@
|
||||
<on_enable function="Object.EnableReturn" />
|
||||
</menu_item_call>
|
||||
<pie_menu more="true" label="More" name="Rate Menu">
|
||||
<menu_item_separator />
|
||||
<pie_menu label="Export" name="Export Menu">
|
||||
<menu_item_call label="XML" mouse_opaque="true" name="XML">
|
||||
<on_click function="Object.Export" />
|
||||
<on_enable function="Object.EnableExport" />
|
||||
</menu_item_call>
|
||||
<menu_item_call label="OBJ..." mouse_opaque="true" name="Save OBJ...">
|
||||
<on_click function="Object.SaveAsOBJ" />
|
||||
<on_enable function="Object.EnableExport" />
|
||||
</menu_item_call>
|
||||
<menu_item_call label="DAE..." mouse_opaque="true" name="Save DAE...">
|
||||
<on_click function="Object.SaveAsDAE" />
|
||||
<on_enable function="Object.EnableExport" />
|
||||
</menu_item_call>
|
||||
</pie_menu>
|
||||
<pie_menu label="Tools" name="Rate Menu">
|
||||
<menu_item_call enabled="false" label="Destroy" mouse_opaque="true" name="Destroy">
|
||||
<on_click function="Object.Destroy" />
|
||||
@@ -60,18 +73,9 @@
|
||||
<menu_item_call enabled="true" hidden="false" label="Data" mouse_opaque="true" name="Data">
|
||||
<on_click function="Object.Data" />
|
||||
</menu_item_call>
|
||||
<menu_item_call label="Export" mouse_opaque="true" name="Export">
|
||||
<on_click function="Object.Export" />
|
||||
<on_enable function="Object.EnableExport" />
|
||||
</menu_item_call>
|
||||
<menu_item_call label="Save OBJ..." mouse_opaque="true" name="Save OBJ...">
|
||||
<on_click function="Object.SaveAsOBJ" />
|
||||
<on_enable function="Object.EnableExport" />
|
||||
</menu_item_call>
|
||||
<menu_item_call label="Save DAE..." mouse_opaque="true" name="Save DAE...">
|
||||
<on_click function="Object.SaveAsDAE" />
|
||||
<on_enable function="Object.EnableExport" />
|
||||
</menu_item_call>
|
||||
<menu_item_separator />
|
||||
<menu_item_separator />
|
||||
<menu_item_separator />
|
||||
<menu_item_call enabled="true" label="Reload" mouse_opaque="true" name="Reload Textures">
|
||||
<on_click function="Object.ReloadTextures" />
|
||||
</menu_item_call>
|
||||
|
||||
@@ -321,8 +321,8 @@
|
||||
mouse_opaque="true" name="separator" width="211" />
|
||||
<menu_item_check bottom="-113" enabled="true" height="19" label="Toolbar" left="0"
|
||||
mouse_opaque="true" name="Toolbar" width="211">
|
||||
<on_click function="ShowFloater" userdata="toolbar" />
|
||||
<on_check function="FloaterVisible" userdata="toolbar" />
|
||||
<on_click function="ToggleControl" userdata="ShowToolBar"/>
|
||||
<on_check control="ShowToolBar"/>
|
||||
</menu_item_check>
|
||||
<menu_item_call label="Change toolbar buttons" name="toolbar_prefs">
|
||||
<on_click function="ShowFloater" userdata="floater_toolbar_prefs.xml"/>
|
||||
|
||||
@@ -6942,20 +6942,20 @@ This will add a bookmark in your inventory so you can quickly IM this resident.
|
||||
<notification
|
||||
icon="notify.tga"
|
||||
name="RegionRestartMinutes"
|
||||
show_toast="false"
|
||||
priority="high"
|
||||
sound="UISndAlert"
|
||||
type="notify">
|
||||
Region is restarting in [MINUTES] minutes.
|
||||
This region will restart in [MINUTES] minutes.
|
||||
If you remain in this region you will be logged out.
|
||||
</notification>
|
||||
|
||||
<notification
|
||||
icon="notify.tga"
|
||||
name="RegionRestartSeconds"
|
||||
show_toast="false"
|
||||
priority="high"
|
||||
sound="UISndAlert"
|
||||
type="notify">
|
||||
Region is restarting in [SECONDS] seconds.
|
||||
This region will restart in [SECONDS] seconds.
|
||||
If you remain in this region you will be logged out.
|
||||
</notification>
|
||||
|
||||
|
||||
@@ -94,7 +94,7 @@
|
||||
<check_box bottom_delta="-24" left="10" control_name="UseConciseIMButtons" follows="top" height="16" label="Buttons on the same line as name for IMs (Affects new IMs)" name="im_concise_butt"/>
|
||||
<check_box bottom_delta="-20" control_name="UseConciseGroupChatButtons" follows="top" height="16" label="Buttons on group chat name line (Affects new group chats)" name="group_concise_butt"/>
|
||||
<check_box bottom_delta="-20" control_name="UseConciseConferenceButtons" follows="top" height="16" label="Buttons on conference title line (Affects new conferences)" name="conf_concise_butt"/>
|
||||
<check_box bottom_delta="-20" follows="top" height="16" control_name="LiruLegacyLogLaunch" label="Log button opens external text editor (Windows only)" name="legacy_log_launch"/>
|
||||
<check_box bottom_delta="-20" follows="top" height="16" control_name="LiruLegacyLogLaunch" label="Log button opens external text editor (Windows and Mac only)" name="legacy_log_launch"/>
|
||||
<check_box bottom_delta="-20" follows="top" height="16" initial_value="false" label="Disallow communicate shortcut opening detached friends list" control_name="CommunicateSpecificShortcut" name="only_comm"/>
|
||||
<check_box bottom_delta="-20" follows="top" height="16" control_name="LiruItalicizeActions" label="Italicize action messages (/me)" name="italicize_actions"/>
|
||||
</panel>
|
||||
|
||||
@@ -87,6 +87,7 @@
|
||||
<check_box bottom_delta="-20" control_name="DisablePointAtAndBeam" follows="top" initial_value="true" label="Disable Point At And Beam" tool_tip="Don't point at or show your edit beam when selecting an object." name="disable_point_at_and_beams_check"/>
|
||||
<check_box bottom_delta="-20" control_name="PrivateLookAt" follows="top" initial_value="false" label="Do not Look At objects and/or avatars" tool_tip="Disables headturns and lookat beacons, causing your avatar to look straight ahead (unless scripted to do otherwise)." name="private_look_at_check"/>
|
||||
<check_box bottom_delta="-20" control_name="AscentShowLookAt" follows="top" initial_value="false" label="Show others' LookAt beacons" tool_tip="Shows you where others are looking." name="show_look_at_check"/>
|
||||
<check_box bottom_delta="-20" control_name="AnnounceBumps" follows="top" label="Announce in chat when people bump you" name="announce_bumps"/>
|
||||
<check_box bottom_delta="-20" control_name="SGDetachBridge" follows="top" initial_value="false" label="Auto detach LSL Bridge" tool_tip="Automatically detach LSL Bridge of Phoenix or Firestorm viewer." name="detach_bridge"/>
|
||||
<check_box bottom_delta="-20" control_name="QuietSnapshotsToDisk" follows="top" initial_value="false" label="Quiet Snapshots to Disk" tool_tip="Doesn't make a camera sound nor alert everyone when you take a snapshot to your computer." name="quiet_snapshots_check"/>
|
||||
<check_box bottom_delta="-20" control_name="RevokePermsOnStandUp" follows="top" initial_value="false" label="On standing up, revoke perms for the object your avatar was sitting on" tool_tip="Objects generally retain Take Control and Trigger Animation permissions until reset or given permission by another user. Enabling this will make sure you revoke these permissions immediately." name="revoke_perms_on_stand_up_check"/>
|
||||
@@ -95,6 +96,8 @@
|
||||
<check_box bottom_delta="-20" left="10" follows="top" initial_value="false" label="Display Total Script Count changes:" name="totalscriptjumps" control_name="AscentDisplayTotalScriptJumps" tool_tip="Displays script count changes in your region, dependant on the threshold you choose to the right."/>
|
||||
<spinner bottom_delta="0" decimal_digits="0" follows="top" height="16" increment="1" left_delta="210" max_val="9999" min_val="1" name="ScriptJumpCount" width="50" control_name="Ascentnumscriptdiff" tool_tip="Threshold for the script jump message [Default: 100]"/>
|
||||
<check_box bottom_delta="-20" left="10" follows="top" label="Restrained Love API Support (RLVa)" name="RestrainedLove" control_name="RestrainedLove" tool_tip="Allows scripts to take greater control of the viewer, if you wear compliant objects."/>
|
||||
<text name="EmergencyTeleportDesc" left="14" bottom_delta="-12" follows="top">Drop a landmark below to autoteleport there in the last 20 seconds before region restarts</text>
|
||||
<drop_target control_name="EmergencyTeleportLandmark" bottom_delta="-8" left="15" height="17" name="emergency_teleport_landmark_drop" width="430"/>
|
||||
</panel>
|
||||
|
||||
<panel border="true" left="1" bottom="-408" height="408" width="500" label="Building" name="Building">
|
||||
|
||||
@@ -39,7 +39,7 @@
|
||||
</layout_panel>
|
||||
<layout_panel name="panelgrouptitles" height="24" width="50" user_resize="false" visibility_control="ToolbarVisibleGroupTitles">
|
||||
<button bottom="0" height="24" label="Group Titles" image_overlay="icn_toolbar_group_titles.tga" image_overlay_alignment="left" image_selected="toolbar_btn_selected.tga" image_unselected="toolbar_btn_enabled.tga" image_disabled="toolbar_btn_disabled.tga" scale_image="true" name="group_titles_btn" width="50" follows="left|right">
|
||||
<button.commit_callback function="ShowFloater" parameter="group_titles"/>
|
||||
<button.commit_callback function="ShowFloater" parameter="group titles"/>
|
||||
</button>
|
||||
</layout_panel>
|
||||
<layout_panel name="panelchathistory" height="24" width="50" user_resize="false" visibility_control="ToolbarVisibleChatHistory">
|
||||
@@ -401,7 +401,7 @@
|
||||
</layout_panel>
|
||||
<layout_panel name="panelpreferences" height="24" width="50" user_resize="false" visibility_control="ToolbarVisiblePreferences">
|
||||
<button bottom="0" height="24" label="Preferences" name="preferences_btn" tool_tip="Ctrl-P" image_overlay="icn_toolbar_preferences.tga" image_overlay_alignment="left" image_selected="toolbar_btn_selected.tga" image_unselected="toolbar_btn_enabled.tga" image_disabled="toolbar_btn_disabled.tga" scale_image="true" width="50" follows="left|right">
|
||||
<button.commit_callback function="ShowFloater" parameter="Preferences"/>
|
||||
<button.commit_callback function="ShowFloater" parameter="preferences"/>
|
||||
</button>
|
||||
</layout_panel>
|
||||
<layout_panel name="panelautoreplace" height="24" width="50" user_resize="false" visibility_control="ToolbarVisibleAutoReplace">
|
||||
|
||||
@@ -352,6 +352,15 @@ Make sure you entered the correct Login URI. An example of a Login URI is: \"htt
|
||||
<string name="ScriptReturnObjects">Return objects on your behalf</string>
|
||||
<string name="UnknownScriptPermission">(unknown)!</string>
|
||||
|
||||
<!-- Bumps in chat -->
|
||||
<string name="BumpedYou">[NAME] [ACT] with magnitude [MAG]</string>
|
||||
<!-- [ACT]s -->
|
||||
<string name="bump">bumped you</string>
|
||||
<string name="llpushobject">pushed you with a script</string>
|
||||
<string name="selected_object_collide">hit you with an object</string>
|
||||
<string name="scripted_object_collide">hit you with a scripted object</string>
|
||||
<string name="physical_object_collide">hit you with a physical object</string>
|
||||
|
||||
|
||||
<!-- Sim Access labels -->
|
||||
<string name="SIM_ACCESS_PG">PG</string>
|
||||
@@ -3058,10 +3067,10 @@ Where tag = tag string to match. Removes bot's matching the tag.
|
||||
<!-- *** END OF OpenSimulator & Aurora-Sim syntax section *** -->
|
||||
|
||||
<!-- Strings needed by drop targets -->
|
||||
<string name="CurrentlyNotSet">Currently not set</string>
|
||||
<string name="CurrentlySetTo">Currently set to: [ITEM]</string>
|
||||
<string name="CurrentlyNotSet">Item currently not set</string>
|
||||
<string name="CurrentlySetTo">Item currently set to: [ITEM]</string>
|
||||
<string name="CurrentlySetToAnItemNotOnThisAccount">Currently set to an item not on this account</string>
|
||||
<string name="NotLoggedIn">Not logged in</string>
|
||||
<string name="NotLoggedIn">Not logged in, item display unavailable</string>
|
||||
|
||||
<!-- Non-standard LLChat strings -->
|
||||
<string name="ScriptCounting">Counting scripts, please wait...</string>
|
||||
|
||||
@@ -71,7 +71,7 @@
|
||||
<check_box label="Colocar los Botones en la misma línea del nombre en los IMs (Sólo afecta en Nuevos MIs)" name="im_concise_butt"/>
|
||||
<check_box label="Botones en chat de grupo en la línea del nombre del grupo (Afecta nuevos chats de grupo)" name="group_concise_butt"/>
|
||||
<check_box label="Botones en la misma línea de título de conferencia (Afecta nuevas conferencias de Chat)" name="conf_concise_butt"/>
|
||||
<check_box label="Botón Historial abre editor externo (Solo en Windows)" name="legacy_log_launch"/>
|
||||
<check_box label="Botón Historial abre editor externo (Solo en Windows y Mac)" name="legacy_log_launch"/>
|
||||
<check_box label="Deshabilitar apertura atajo de Comunicación fuera de la lista de amigos" name="only_comm"/>
|
||||
<check_box label="Mensajes de acción en Itálica (/me)" name="italicize_actions"/>
|
||||
</panel>
|
||||
|
||||
93
indra/newview/skins/default/xui/fr/floater_toolbar_prefs.xml
Normal file
93
indra/newview/skins/default/xui/fr/floater_toolbar_prefs.xml
Normal file
@@ -0,0 +1,93 @@
|
||||
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
|
||||
<floater name="floater_toolbar_prefs.xml">
|
||||
<check_box label="Barre de Chat" name="chat_btn"/>
|
||||
<check_box label="Communiquer 1" name="communicate_flyout"/>
|
||||
<check_box label="Communiquer 2" name="communicate_btn"/>
|
||||
<check_box label="Amis" name="friends_btn"/>
|
||||
<check_box label="Groupes" name="groups_btn"/>
|
||||
<check_box label="Titres de Groupes" name="group_titles_btn"/>
|
||||
<check_box label="Chat local" name="chat_history_btn"/>
|
||||
<check_box label="Intervenants Actifs" name="active_speakers_btn"/>
|
||||
<check_box label="Liste des mutes" name="mute_list_btn"/>
|
||||
<check_box label="Asset Blacklist" name="black_list_btn"/>
|
||||
<check_box label="Voice FX" name="voice_effects_btn"/>
|
||||
<check_box label="Gestures" name="gestures_btn"/>
|
||||
<check_box label="Balises" name="beacons_btn"/>
|
||||
<check_box label="Radar" name="radar_list_btn"/>
|
||||
<check_box label="contrôles de la cam" name="camera_controls_btn"/>
|
||||
<check_box label="contrôles des déplacements" name="movement_controls_btn"/>
|
||||
<check_box label="Mouselook" name="look_btn"/>
|
||||
<check_box label="Voler" name="fly_btn"/>
|
||||
<check_box label="S'assoir" name="sit_btn"/>
|
||||
<check_box label="Courir" name="run_btn"/>
|
||||
<check_box label="Velocity" name="velocity_btn"/>
|
||||
<check_box label="Bumps" name="bumps_btn"/>
|
||||
<check_box label="Stream Display" name="media_ticker_btn"/>
|
||||
<check_box label="Filtre des médias" name="media_filter_btn"/>
|
||||
<check_box label="Photo" name="snapshot_btn"/>
|
||||
<check_box label="Apparence" name="appearance_btn"/>
|
||||
<check_box label="Recherche" name="directory_btn"/>
|
||||
<check_box label="Web Browser" name="web_browser_btn"/>
|
||||
<check_box label="AO Settings" name="ao_btn"/>
|
||||
<check_box label="Debug Settings" name="debug_settings_btn"/>
|
||||
<check_box label="Debug Avatar" name="debug_avatar_btn"/>
|
||||
<check_box label="Anims Explorer" name="anims_explorer_btn"/>
|
||||
<check_box label="Sound Explorer" name="sound_explorer_btn"/>
|
||||
<check_box label="Area Search" name="areasearch_btn"/>
|
||||
<check_box label="Inspecter" name="inspect_btn"/>
|
||||
<check_box label="Characters" name="pathing_characters_btn"/>
|
||||
<check_box label="Linksets" name="pathing_linksets_btn"/>
|
||||
<check_box label="construire" name="build_btn"/>
|
||||
<check_box label="Grid Options" name="grid_options_btn"/>
|
||||
<check_box label="Local Textures" name="local_textures_btn"/>
|
||||
<check_box label="Upload Perms" name="perm_prefs_btn"/>
|
||||
<check_box label="Script Errors" name="script_errors_btn"/>
|
||||
<check_box label="Environment Editor" name="env_editor_btn"/>
|
||||
<check_box label="Day Cycle Editor" name="day_cycle_editor_btn"/>
|
||||
<check_box label="Windlight" name="windlight_btn"/>
|
||||
<check_box label="Water Editor" name="water_editor_btn"/>
|
||||
<check_box label="Post-Process FX" name="post_process_btn"/>
|
||||
<check_box label="Acheter [CURRENCY]" name="buy_currency_btn"/>
|
||||
<check_box label="Acheter un terrain" name="buy_land_btn"/>
|
||||
<check_box label="Mon terrain" name="my_land_btn"/>
|
||||
<check_box label="A propos du terrain" name="about_land_btn"/>
|
||||
<check_box label="Script Info" name="script_info_btn"/>
|
||||
<check_box label="Region/Estate" name="about_region_btn"/>
|
||||
<check_box label="God Tools" name="god_tools_btn"/>
|
||||
<check_box label="Historique des TP" name="teleport_history_btn"/>
|
||||
<check_box label="Carte" name="map_btn"/>
|
||||
<check_box label="Mini carte" name="minimap_btn"/>
|
||||
<!-- [RLVa:LF] -->
|
||||
<check_box label="RLVa Restrictions" name="rlv_restrictions_btn"/>
|
||||
<check_box label="RLVa Locks" name="rlv_locks_btn"/>
|
||||
<check_box label="RLVa Strings" name="rlv_strings_btn"/>
|
||||
<!-- [/RLVa:LF] -->
|
||||
<check_box label="Memory Leak" name="memleak_btn"/>
|
||||
<check_box label="Message Log" name="message_log_btn"/>
|
||||
<check_box label="Statistiques" name="stats_btn"/>
|
||||
<check_box label="Notifications Console" name="notifications_console_btn"/>
|
||||
<check_box label="Debug Console" name="debug_console_btn"/>
|
||||
<check_box label="Region Console" name="region_console_btn"/>
|
||||
<check_box label="Fast Timers" name="fast_timers_btn"/>
|
||||
<check_box label="Frame Console" name="frame_console_btn"/>
|
||||
<check_box label="HTTP Console" name="http_console_btn"/>
|
||||
<check_box label="Texture Console" name="texture_console_btn"/>
|
||||
<check_box label="Texture Category Console" name="texture_category_console_btn"/>
|
||||
<check_box label="Texture Size Console" name="texture_size_console_btn"/>
|
||||
<check_box label="Inventaire" name="directory_btn"/>
|
||||
<check_box label="Créer un ensemble" name="make_outfit_btn"/>
|
||||
<check_box label="Ensembles" name="outfits_btn"/>
|
||||
<check_box label="Favoris" name="favs_btn"/>
|
||||
<check_box label="Outbox" name="outbox_btn"/>
|
||||
<check_box label="Preferences" name="preferences_btn"/>
|
||||
<check_box label="Autoreplace" name="auto_replace_btn"/>
|
||||
<check_box label="Display Name" name="display_name_btn"/>
|
||||
<check_box label="Floater Test" name="floater_test_btn"/>
|
||||
<check_box label="Edit UI" name="edit_ui_btn"/>
|
||||
<check_box label="Font Test" name="font_test_btn"/>
|
||||
<check_box label="Lag Meter" name="lag_meter_btn"/>
|
||||
<check_box label="Report Abuse" name="abuse_btn"/>
|
||||
<check_box label="Tuto" name="tutorial_btn"/>
|
||||
<check_box label="A propos de [SHORT_APP_NAME]" name="about_btn"/>
|
||||
<check_box label="Changer les boutons" name="change_buttons_btn"/>
|
||||
</floater>
|
||||
@@ -76,6 +76,7 @@
|
||||
<menu_item_call label="Regarder le dernier intervenant" name="Look at Last Chatter"/>
|
||||
<menu_item_separator label="-----------" name="separator"/>
|
||||
<menu_item_check label="Barre d'outils" name="Toolbar"/>
|
||||
<menu_item_call label="Customiser la barre d'outils" name="toolbar_prefs"/>
|
||||
<menu_item_check label="Chat local" name="Chat History"/>
|
||||
<menu_item_check label="Communiquer" name="Instant Message"/>
|
||||
<menu_item_check label="Inventaire" name="Inventory"/>
|
||||
|
||||
@@ -44,7 +44,7 @@
|
||||
<check_box label="Boutons sur la même ligne que les noms pour les IMs" name="im_concise_butt"/>
|
||||
<check_box label="Boutons sur la ligne des noms des chats de groupe" name="group_concise_butt"/>
|
||||
<check_box label="Boutons sur la ligne de titre des conférences" name="conf_concise_butt"/>
|
||||
<check_box label="Ouvre les logs avec un éditeur de texte externe (windows)" name="legacy_log_launch"/>
|
||||
<check_box label="Ouvre les logs avec un éditeur de texte externe (windows/mac)" name="legacy_log_launch"/>
|
||||
<check_box label="Désactive le raccourci ouvrant détacher la liste d'amis" name="only_comm"/>
|
||||
<check_box label="Ecrit en Italiques le /me" name="italicize_actions"/>
|
||||
</panel>
|
||||
|
||||
@@ -1,11 +1,9 @@
|
||||
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
|
||||
<panel name="toolbar">
|
||||
<string name="Redock Windows">
|
||||
Rétablir les fenêtres
|
||||
</string>
|
||||
<layout_stack name="toolbar_stack">
|
||||
<string name="Redock Windows">établir les fenêtres</string>
|
||||
<layout_stack name="toolbar_stack">
|
||||
<layout_panel name="panel2">
|
||||
<button label="" name="chat_btn" tool_tip="Affiche la barre de chat.(Entrée)"/>
|
||||
<button name="chat_btn" tool_tip="Affiche la barre de chat.(Entrée)"/>
|
||||
</layout_panel>
|
||||
<layout_panel name="panel4">
|
||||
<flyout_button label="Communiquer" name="communicate_btn" tool_tip="Communiquez (valable pour les amis et groupes."/>
|
||||
@@ -31,5 +29,87 @@
|
||||
<layout_panel name="panel13">
|
||||
<button label="Inventaire" name="inventory_btn" tool_tip="Vos objets (Ctrl-I)"/>
|
||||
</layout_panel>
|
||||
</layout_stack>
|
||||
<layout_panel name="panelim">
|
||||
<button label="Communiquer" name="communicate_im_btn"/>
|
||||
</layout_panel>
|
||||
<layout_panel name="panelfriends">
|
||||
<button label="Amis" name="friends_btn"/>
|
||||
</layout_panel>
|
||||
<layout_panel name="panelgroups">
|
||||
<button label="Groupes" name="groups_btn"/>
|
||||
</layout_panel>
|
||||
<layout_panel name="panelgrouptitles">
|
||||
<button label="Titres GR" name="group_titles_btn"/>
|
||||
</layout_panel>
|
||||
<layout_panel name="panelchathistory">
|
||||
<button label="Chat local" name="chat_history_btn"/>
|
||||
</layout_panel>
|
||||
<layout_panel name="panelactivespeakers">
|
||||
<button label="Int. Actifs" name="active_speakers_btn"/>
|
||||
</layout_panel>
|
||||
<layout_panel name="panelmutelist">
|
||||
<button label="Liste des mutes" name="mute_list_btn"/>
|
||||
</layout_panel>
|
||||
<layout_panel name="panelbeacons">
|
||||
<button label="Balises" name="beacons_btn"/>
|
||||
</layout_panel>
|
||||
<layout_panel name="panelcameracontrols">
|
||||
<button label="Ctrl Camera" name="camera_controls_btn"/>
|
||||
</layout_panel>
|
||||
<layout_panel name="panelmessagelog">
|
||||
<button label="Ctrl déplacements" name="movement_controls_btn"/>
|
||||
</layout_panel>
|
||||
<layout_panel name="panelsit">
|
||||
<button label="S'assoir" label_selected="Stand" name="sit_btn"/>
|
||||
</layout_panel>
|
||||
<layout_panel name="panelrun">
|
||||
<button label="Courir" label_selected="Stop Running" name="run_btn"/>
|
||||
</layout_panel>
|
||||
<layout_panel name="panelmediafilter">
|
||||
<button label="Filtre médias" name="media_filter_btn"/>
|
||||
</layout_panel>
|
||||
<layout_panel name="panelappearance">
|
||||
<button label="Apparence" name="appearance_btn"/>
|
||||
</layout_panel>
|
||||
<layout_panel name="panelinspect">
|
||||
<button label="Inspecter" name="inspect_btn"/>
|
||||
</layout_panel>
|
||||
<layout_panel name="panelbuycurrency">
|
||||
<button label="Acheter [CURRENCY]" name="buy_currency_btn"/>
|
||||
</layout_panel>
|
||||
<layout_panel name="panelbuyland">
|
||||
<button label="Achat terrain" name="buy_land_btn"/>
|
||||
</layout_panel>
|
||||
<layout_panel name="panelmyland">
|
||||
<button label="Mon terrain" name="my_land_btn"/>
|
||||
</layout_panel>
|
||||
<layout_panel name="panelaboutland">
|
||||
<button label="A propos du terrain" name="about_land_btn"/>
|
||||
</layout_panel>
|
||||
<layout_panel name="panelteleporthistory">
|
||||
<button label="Hist. TP" name="teleport_history_btn"/>
|
||||
</layout_panel>
|
||||
<layout_panel name="panelstats">
|
||||
<button label="Statistiques" name="stats_btn"/>
|
||||
</layout_panel>
|
||||
<layout_panel name="paneloutfit">
|
||||
<button label="Créer un ensemble" name="make_outfit_btn"/>
|
||||
</layout_panel>
|
||||
<layout_panel name="paneloutfits">
|
||||
<button label="Ensembles" name="outfits_btn"/>
|
||||
</layout_panel>
|
||||
<layout_panel name="panelfavs">
|
||||
<button label="Favoris" name="favs_btn"/>
|
||||
</layout_panel>
|
||||
<layout_panel name="panelhelptutorial">
|
||||
<button label="Tuto" name="tutorial_btn"/>
|
||||
</layout_panel>
|
||||
<layout_panel name="panelabout">
|
||||
<button label="A propos de [SHORT_APP_NAME]" name="about_btn"/>
|
||||
</layout_panel>
|
||||
<layout_panel name="paneltoolbarprefs">
|
||||
<button label="Changer les boutons" name="change_buttons_btn"/>
|
||||
</layout_panel>
|
||||
</layout_stack>
|
||||
</panel>
|
||||
|
||||
|
||||
Reference in New Issue
Block a user