Merge remote-tracking branch 'Liru/master'
This commit is contained in:
@@ -80,7 +80,7 @@ void LLAvatarName::fromLLSD(const LLSD& sd)
|
|||||||
mDisplayName = sd[DISPLAY_NAME].asString();
|
mDisplayName = sd[DISPLAY_NAME].asString();
|
||||||
mLegacyFirstName = sd[LEGACY_FIRST_NAME].asString();
|
mLegacyFirstName = sd[LEGACY_FIRST_NAME].asString();
|
||||||
mLegacyLastName = sd[LEGACY_LAST_NAME].asString();
|
mLegacyLastName = sd[LEGACY_LAST_NAME].asString();
|
||||||
mIsDisplayNameDefault = sd[IS_DISPLAY_NAME_DEFAULT].asBoolean();
|
mIsDisplayNameDefault = sd[IS_DISPLAY_NAME_DEFAULT].asBoolean() || mUsername == mDisplayName;
|
||||||
LLDate expires = sd[DISPLAY_NAME_EXPIRES];
|
LLDate expires = sd[DISPLAY_NAME_EXPIRES];
|
||||||
mExpires = expires.secondsSinceEpoch();
|
mExpires = expires.secondsSinceEpoch();
|
||||||
LLDate next_update = sd[DISPLAY_NAME_NEXT_UPDATE];
|
LLDate next_update = sd[DISPLAY_NAME_NEXT_UPDATE];
|
||||||
|
|||||||
@@ -1437,6 +1437,7 @@ void BufferedCurlEasyRequest::prepRequest(AICurlEasyRequest_wat& curl_easy_reque
|
|||||||
mResponder = responder;
|
mResponder = responder;
|
||||||
// Cache capability type, because it will be needed even after the responder was removed.
|
// Cache capability type, because it will be needed even after the responder was removed.
|
||||||
mCapabilityType = responder->capability_type();
|
mCapabilityType = responder->capability_type();
|
||||||
|
mIsEventPoll = responder->is_event_poll();
|
||||||
|
|
||||||
// Send header events to responder if needed.
|
// Send header events to responder if needed.
|
||||||
if (mResponder->needsHeaders())
|
if (mResponder->needsHeaders())
|
||||||
|
|||||||
@@ -75,6 +75,7 @@ AIPerService::AIPerService(void) :
|
|||||||
mConcurrentConnections(CurlConcurrentConnectionsPerService),
|
mConcurrentConnections(CurlConcurrentConnectionsPerService),
|
||||||
mApprovedRequests(0),
|
mApprovedRequests(0),
|
||||||
mTotalAdded(0),
|
mTotalAdded(0),
|
||||||
|
mEventPolls(0),
|
||||||
mEstablishedConnections(0),
|
mEstablishedConnections(0),
|
||||||
mUsedCT(0),
|
mUsedCT(0),
|
||||||
mCTInUse(0)
|
mCTInUse(0)
|
||||||
@@ -335,24 +336,70 @@ bool AIPerService::throttled(AICapabilityType capability_type) const
|
|||||||
mCapabilityType[capability_type].mAdded >= mCapabilityType[capability_type].mConcurrentConnections;
|
mCapabilityType[capability_type].mAdded >= mCapabilityType[capability_type].mConcurrentConnections;
|
||||||
}
|
}
|
||||||
|
|
||||||
void AIPerService::added_to_multi_handle(AICapabilityType capability_type)
|
void AIPerService::added_to_multi_handle(AICapabilityType capability_type, bool event_poll)
|
||||||
{
|
{
|
||||||
|
if (event_poll)
|
||||||
|
{
|
||||||
|
llassert(capability_type == cap_other);
|
||||||
|
// We want to mark this service as unused when only long polls have been added, because they
|
||||||
|
// are not counted towards the maximum number of connection for this service and therefore
|
||||||
|
// should not cause another capability type to get less connections.
|
||||||
|
// For example, if - like on opensim - Textures and Other capability types use the same
|
||||||
|
// service then it is nonsense to reserve 4 connections Other and only give 4 connections
|
||||||
|
// to Textures, only because there is a long poll connection (or any number of long poll
|
||||||
|
// connections). What we want is to see: 0-0-0,{0/7,0} for textures when Other is ONLY in
|
||||||
|
// use for the Event Poll.
|
||||||
|
//
|
||||||
|
// This translates to that, since we're adding an event_poll and are about to remove it from
|
||||||
|
// either the command queue OR the request queue, that when mAdded == 1 at the end of this function
|
||||||
|
// (and the rest of the pipeline is empty) we want to mark this capability type as unused.
|
||||||
|
//
|
||||||
|
// If mEventPolls > 0 at this point then mAdded will not be incremented.
|
||||||
|
// If mEventPolls == 0 then mAdded will be incremented and thus should be 0 now.
|
||||||
|
// In other words, if the number of mAdded requests is equal to the number of (counted)
|
||||||
|
// mEventPoll requests right now, then that will still be the case after we added another
|
||||||
|
// event poll request (the transition from used to unused only being necessary because
|
||||||
|
// event poll requests in the pipe line ARE counted; not because that is necessary but
|
||||||
|
// because it would be more complex to not do so).
|
||||||
|
//
|
||||||
|
// Moreover, when we get here then the request that is being added is still counted as being in
|
||||||
|
// the command queue, or the request queue, so that pipelined_requests() will return 1 more than
|
||||||
|
// the actual count.
|
||||||
|
U16 counted_event_polls = (mEventPolls == 0) ? 0 : 1;
|
||||||
|
if (mCapabilityType[capability_type].mAdded == counted_event_polls &&
|
||||||
|
mCapabilityType[capability_type].pipelined_requests() == counted_event_polls + 1)
|
||||||
|
{
|
||||||
|
mark_unused(capability_type);
|
||||||
|
}
|
||||||
|
if (++mEventPolls > 1)
|
||||||
|
{
|
||||||
|
// This only happens on megaregions. Do not count the additional long poll connections against the maximum handles for this service.
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
++mCapabilityType[capability_type].mAdded;
|
++mCapabilityType[capability_type].mAdded;
|
||||||
++mTotalAdded;
|
++mTotalAdded;
|
||||||
}
|
}
|
||||||
|
|
||||||
void AIPerService::removed_from_multi_handle(AICapabilityType capability_type, bool downloaded_something, bool success)
|
void AIPerService::removed_from_multi_handle(AICapabilityType capability_type, bool event_poll, bool downloaded_something, bool success)
|
||||||
{
|
{
|
||||||
CapabilityType& ct(mCapabilityType[capability_type]);
|
CapabilityType& ct(mCapabilityType[capability_type]);
|
||||||
llassert(mTotalAdded > 0 && ct.mAdded > 0);
|
llassert(mTotalAdded > 0 && ct.mAdded > 0 && (!event_poll || mEventPolls));
|
||||||
bool done = --ct.mAdded == 0;
|
if (!event_poll || --mEventPolls == 0)
|
||||||
|
{
|
||||||
|
--ct.mAdded;
|
||||||
|
--mTotalAdded;
|
||||||
|
}
|
||||||
if (downloaded_something)
|
if (downloaded_something)
|
||||||
{
|
{
|
||||||
llassert(ct.mDownloading > 0);
|
llassert(ct.mDownloading > 0);
|
||||||
--ct.mDownloading;
|
--ct.mDownloading;
|
||||||
}
|
}
|
||||||
--mTotalAdded;
|
// If the number of added request handles is equal to the number of counted event poll handles,
|
||||||
if (done && ct.pipelined_requests() == 0)
|
// in other words, when there are only long poll connections left, then mark the capability type
|
||||||
|
// as unused.
|
||||||
|
U16 counted_event_polls = (capability_type != cap_other || mEventPolls == 0) ? 0 : 1;
|
||||||
|
if (ct.mAdded == counted_event_polls && ct.pipelined_requests() == counted_event_polls)
|
||||||
{
|
{
|
||||||
mark_unused(capability_type);
|
mark_unused(capability_type);
|
||||||
}
|
}
|
||||||
@@ -467,6 +514,9 @@ void AIPerService::add_queued_to(curlthread::MultiHandle* multi_handle, bool onl
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
// Request was added, remove it from the queue.
|
// Request was added, remove it from the queue.
|
||||||
|
// Note: AIPerService::added_to_multi_handle (called from add_easy_request above) relies on the fact that
|
||||||
|
// we first add the easy handle and then remove it from the request queue (which is necessary to avoid
|
||||||
|
// that another thread adds one just in between).
|
||||||
ct.mQueuedRequests.pop_front();
|
ct.mQueuedRequests.pop_front();
|
||||||
// Mark that at least one request of this CT was successfully added.
|
// Mark that at least one request of this CT was successfully added.
|
||||||
success |= mask;
|
success |= mask;
|
||||||
|
|||||||
@@ -169,6 +169,7 @@ class AIPerService {
|
|||||||
int mConcurrentConnections; // The maximum number of allowed concurrent connections to this service.
|
int mConcurrentConnections; // The maximum number of allowed concurrent connections to this service.
|
||||||
int mApprovedRequests; // The number of approved requests for this service by approveHTTPRequestFor that were not added to the command queue yet.
|
int mApprovedRequests; // The number of approved requests for this service by approveHTTPRequestFor that were not added to the command queue yet.
|
||||||
int mTotalAdded; // Number of active easy handles with this service.
|
int mTotalAdded; // Number of active easy handles with this service.
|
||||||
|
int mEventPolls; // Number of active event poll handles with this service.
|
||||||
int mEstablishedConnections; // Number of connected sockets to this service.
|
int mEstablishedConnections; // Number of connected sockets to this service.
|
||||||
|
|
||||||
U32 mUsedCT; // Bit mask with one bit per capability type. A '1' means the capability was in use since the last resetUsedCT().
|
U32 mUsedCT; // Bit mask with one bit per capability type. A '1' means the capability was in use since the last resetUsedCT().
|
||||||
@@ -267,9 +268,10 @@ class AIPerService {
|
|||||||
|
|
||||||
public:
|
public:
|
||||||
void added_to_command_queue(AICapabilityType capability_type) { ++mCapabilityType[capability_type].mQueuedCommands; mark_inuse(capability_type); }
|
void added_to_command_queue(AICapabilityType capability_type) { ++mCapabilityType[capability_type].mQueuedCommands; mark_inuse(capability_type); }
|
||||||
void removed_from_command_queue(AICapabilityType capability_type) { --mCapabilityType[capability_type].mQueuedCommands; llassert(mCapabilityType[capability_type].mQueuedCommands >= 0); }
|
void removed_from_command_queue(AICapabilityType capability_type) { llassert(mCapabilityType[capability_type].mQueuedCommands > 0); --mCapabilityType[capability_type].mQueuedCommands; }
|
||||||
void added_to_multi_handle(AICapabilityType capability_type); // Called when an easy handle for this service has been added to the multi handle.
|
void added_to_multi_handle(AICapabilityType capability_type, bool event_poll); // Called when an easy handle for this service has been added to the multi handle.
|
||||||
void removed_from_multi_handle(AICapabilityType capability_type, bool downloaded_something, bool success); // Called when an easy handle for this service is removed again from the multi handle.
|
void removed_from_multi_handle(AICapabilityType capability_type, bool event_poll,
|
||||||
|
bool downloaded_something, bool success); // Called when an easy handle for this service is removed again from the multi handle.
|
||||||
void download_started(AICapabilityType capability_type) { ++mCapabilityType[capability_type].mDownloading; }
|
void download_started(AICapabilityType capability_type) { ++mCapabilityType[capability_type].mDownloading; }
|
||||||
bool throttled(AICapabilityType capability_type) const; // Returns true if the maximum number of allowed requests for this service/capability type have been added to the multi handle.
|
bool throttled(AICapabilityType capability_type) const; // Returns true if the maximum number of allowed requests for this service/capability type have been added to the multi handle.
|
||||||
bool nothing_added(AICapabilityType capability_type) const { return mCapabilityType[capability_type].mAdded == 0; }
|
bool nothing_added(AICapabilityType capability_type) const { return mCapabilityType[capability_type].mAdded == 0; }
|
||||||
|
|||||||
@@ -418,6 +418,7 @@ class BufferedCurlEasyRequest : public CurlEasyRequest {
|
|||||||
buffer_ptr_t mOutput;
|
buffer_ptr_t mOutput;
|
||||||
LLHTTPClient::ResponderPtr mResponder;
|
LLHTTPClient::ResponderPtr mResponder;
|
||||||
AICapabilityType mCapabilityType;
|
AICapabilityType mCapabilityType;
|
||||||
|
bool mIsEventPoll;
|
||||||
//U32 mBodyLimit; // From the old LLURLRequestDetail::mBodyLimit, but never used.
|
//U32 mBodyLimit; // From the old LLURLRequestDetail::mBodyLimit, but never used.
|
||||||
U32 mStatus; // HTTP status, decoded from the first header line.
|
U32 mStatus; // HTTP status, decoded from the first header line.
|
||||||
std::string mReason; // The "reason" from the same header line.
|
std::string mReason; // The "reason" from the same header line.
|
||||||
@@ -466,6 +467,7 @@ class BufferedCurlEasyRequest : public CurlEasyRequest {
|
|||||||
|
|
||||||
// Return the capability type of this request.
|
// Return the capability type of this request.
|
||||||
AICapabilityType capability_type(void) const { llassert(mCapabilityType != number_of_capability_types); return mCapabilityType; }
|
AICapabilityType capability_type(void) const { llassert(mCapabilityType != number_of_capability_types); return mCapabilityType; }
|
||||||
|
bool is_event_poll(void) const { return mIsEventPoll; }
|
||||||
|
|
||||||
// Return true if any data was received.
|
// Return true if any data was received.
|
||||||
bool received_data(void) const { return mTotalRawBytes > 0; }
|
bool received_data(void) const { return mTotalRawBytes > 0; }
|
||||||
|
|||||||
@@ -1340,6 +1340,9 @@ void AICurlThread::process_commands(AICurlMultiHandle_wat const& multi_handle_w)
|
|||||||
break;
|
break;
|
||||||
case cmd_add:
|
case cmd_add:
|
||||||
{
|
{
|
||||||
|
// Note: AIPerService::added_to_multi_handle (called from add_easy_request) relies on the fact that
|
||||||
|
// we first add the easy handle and then remove it from the command queue (which is necessary to
|
||||||
|
// avoid that another thread adds one just in between).
|
||||||
multi_handle_w->add_easy_request(AICurlEasyRequest(command_being_processed_r->easy_request()), false);
|
multi_handle_w->add_easy_request(AICurlEasyRequest(command_being_processed_r->easy_request()), false);
|
||||||
PerService_wat(*per_service)->removed_from_command_queue(capability_type);
|
PerService_wat(*per_service)->removed_from_command_queue(capability_type);
|
||||||
break;
|
break;
|
||||||
@@ -1747,10 +1750,12 @@ bool MultiHandle::add_easy_request(AICurlEasyRequest const& easy_request, bool f
|
|||||||
{
|
{
|
||||||
bool throttled = true; // Default.
|
bool throttled = true; // Default.
|
||||||
AICapabilityType capability_type;
|
AICapabilityType capability_type;
|
||||||
|
bool event_poll;
|
||||||
AIPerServicePtr per_service;
|
AIPerServicePtr per_service;
|
||||||
{
|
{
|
||||||
AICurlEasyRequest_wat curl_easy_request_w(*easy_request);
|
AICurlEasyRequest_wat curl_easy_request_w(*easy_request);
|
||||||
capability_type = curl_easy_request_w->capability_type();
|
capability_type = curl_easy_request_w->capability_type();
|
||||||
|
event_poll = curl_easy_request_w->is_event_poll();
|
||||||
per_service = curl_easy_request_w->getPerServicePtr();
|
per_service = curl_easy_request_w->getPerServicePtr();
|
||||||
if (!from_queue)
|
if (!from_queue)
|
||||||
{
|
{
|
||||||
@@ -1782,7 +1787,7 @@ bool MultiHandle::add_easy_request(AICurlEasyRequest const& easy_request, bool f
|
|||||||
curl_easy_request_w->set_timeout_opts();
|
curl_easy_request_w->set_timeout_opts();
|
||||||
if (curl_easy_request_w->add_handle_to_multi(curl_easy_request_w, mMultiHandle) == CURLM_OK)
|
if (curl_easy_request_w->add_handle_to_multi(curl_easy_request_w, mMultiHandle) == CURLM_OK)
|
||||||
{
|
{
|
||||||
per_service_w->added_to_multi_handle(capability_type); // (About to be) added to mAddedEasyRequests.
|
per_service_w->added_to_multi_handle(capability_type, event_poll); // (About to be) added to mAddedEasyRequests.
|
||||||
throttled = false; // Fall through...
|
throttled = false; // Fall through...
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1841,6 +1846,7 @@ CURLMcode MultiHandle::remove_easy_request(addedEasyRequests_type::iterator cons
|
|||||||
{
|
{
|
||||||
CURLMcode res;
|
CURLMcode res;
|
||||||
AICapabilityType capability_type;
|
AICapabilityType capability_type;
|
||||||
|
bool event_poll;
|
||||||
AIPerServicePtr per_service;
|
AIPerServicePtr per_service;
|
||||||
{
|
{
|
||||||
AICurlEasyRequest_wat curl_easy_request_w(**iter);
|
AICurlEasyRequest_wat curl_easy_request_w(**iter);
|
||||||
@@ -1848,8 +1854,9 @@ CURLMcode MultiHandle::remove_easy_request(addedEasyRequests_type::iterator cons
|
|||||||
bool success = curl_easy_request_w->success();
|
bool success = curl_easy_request_w->success();
|
||||||
res = curl_easy_request_w->remove_handle_from_multi(curl_easy_request_w, mMultiHandle);
|
res = curl_easy_request_w->remove_handle_from_multi(curl_easy_request_w, mMultiHandle);
|
||||||
capability_type = curl_easy_request_w->capability_type();
|
capability_type = curl_easy_request_w->capability_type();
|
||||||
|
event_poll = curl_easy_request_w->is_event_poll();
|
||||||
per_service = curl_easy_request_w->getPerServicePtr();
|
per_service = curl_easy_request_w->getPerServicePtr();
|
||||||
PerService_wat(*per_service)->removed_from_multi_handle(capability_type, downloaded_something, success); // (About to be) removed from mAddedEasyRequests.
|
PerService_wat(*per_service)->removed_from_multi_handle(capability_type, event_poll, downloaded_something, success); // (About to be) removed from mAddedEasyRequests.
|
||||||
#ifdef SHOW_ASSERT
|
#ifdef SHOW_ASSERT
|
||||||
curl_easy_request_w->mRemovedPerCommand = as_per_command;
|
curl_easy_request_w->mRemovedPerCommand = as_per_command;
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -228,6 +228,9 @@ public:
|
|||||||
// If this function returns false then we generate an error when a redirect status (300..399) is received.
|
// If this function returns false then we generate an error when a redirect status (300..399) is received.
|
||||||
virtual bool redirect_status_ok(void) const { return true; }
|
virtual bool redirect_status_ok(void) const { return true; }
|
||||||
|
|
||||||
|
// Overridden by LLEventPollResponder to return true.
|
||||||
|
virtual bool is_event_poll(void) const { return false; }
|
||||||
|
|
||||||
// Returns the capability type used by this responder.
|
// Returns the capability type used by this responder.
|
||||||
virtual AICapabilityType capability_type(void) const { return cap_other; }
|
virtual AICapabilityType capability_type(void) const { return cap_other; }
|
||||||
|
|
||||||
|
|||||||
@@ -80,6 +80,7 @@ void AIServiceBar::draw()
|
|||||||
U32 is_used;
|
U32 is_used;
|
||||||
U32 is_inuse;
|
U32 is_inuse;
|
||||||
int total_added;
|
int total_added;
|
||||||
|
int event_polls;
|
||||||
int established_connections;
|
int established_connections;
|
||||||
int concurrent_connections;
|
int concurrent_connections;
|
||||||
size_t bandwidth;
|
size_t bandwidth;
|
||||||
@@ -88,6 +89,7 @@ void AIServiceBar::draw()
|
|||||||
is_used = per_service_r->is_used();
|
is_used = per_service_r->is_used();
|
||||||
is_inuse = per_service_r->is_inuse();
|
is_inuse = per_service_r->is_inuse();
|
||||||
total_added = per_service_r->mTotalAdded;
|
total_added = per_service_r->mTotalAdded;
|
||||||
|
event_polls = per_service_r->mEventPolls;
|
||||||
established_connections = per_service_r->mEstablishedConnections;
|
established_connections = per_service_r->mEstablishedConnections;
|
||||||
concurrent_connections = per_service_r->mConcurrentConnections;
|
concurrent_connections = per_service_r->mConcurrentConnections;
|
||||||
bandwidth = per_service_r->bandwidth().truncateData(AIHTTPView::getTime_40ms());
|
bandwidth = per_service_r->bandwidth().truncateData(AIHTTPView::getTime_40ms());
|
||||||
@@ -148,7 +150,7 @@ void AIServiceBar::draw()
|
|||||||
}
|
}
|
||||||
start = mHTTPView->updateColumn(mc_col, start);
|
start = mHTTPView->updateColumn(mc_col, start);
|
||||||
#if defined(CWDEBUG) || defined(DEBUG_CURLIO)
|
#if defined(CWDEBUG) || defined(DEBUG_CURLIO)
|
||||||
text = llformat(" | %d,%d/%d", total_added, established_connections, concurrent_connections);
|
text = llformat(" | %d,%d,%d/%d", total_added, event_polls, established_connections, concurrent_connections);
|
||||||
#else
|
#else
|
||||||
text = llformat(" | %d/%d", total_added, concurrent_connections);
|
text = llformat(" | %d/%d", total_added, concurrent_connections);
|
||||||
#endif
|
#endif
|
||||||
@@ -227,6 +229,7 @@ void AIGLHTTPHeaderBar::draw(void)
|
|||||||
height -= sLineHeight;
|
height -= sLineHeight;
|
||||||
start = h_offset;
|
start = h_offset;
|
||||||
text = "Service (host:port)";
|
text = "Service (host:port)";
|
||||||
|
// This must match AICapabilityType!
|
||||||
static char const* caption[number_of_capability_types] = {
|
static char const* caption[number_of_capability_types] = {
|
||||||
" | Textures", " | Inventory", " | Mesh", " | Other"
|
" | Textures", " | Inventory", " | Mesh", " | Other"
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -10068,17 +10068,6 @@ This should be as low as possible, but too low may break functionality</string>
|
|||||||
<key>Value</key>
|
<key>Value</key>
|
||||||
<integer>1</integer>
|
<integer>1</integer>
|
||||||
</map>
|
</map>
|
||||||
<key>MiniMapChatRings</key>
|
|
||||||
<map>
|
|
||||||
<key>Comment</key>
|
|
||||||
<string>Display chat distance rings on mini map</string>
|
|
||||||
<key>Persist</key>
|
|
||||||
<integer>1</integer>
|
|
||||||
<key>Type</key>
|
|
||||||
<string>Boolean</string>
|
|
||||||
<key>Value</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
</map>
|
|
||||||
<key>MiniMapWhisperRing</key>
|
<key>MiniMapWhisperRing</key>
|
||||||
<map>
|
<map>
|
||||||
<key>Comment</key>
|
<key>Comment</key>
|
||||||
@@ -17674,7 +17663,7 @@ This should be as low as possible, but too low may break functionality</string>
|
|||||||
<key>Type</key>
|
<key>Type</key>
|
||||||
<string>Boolean</string>
|
<string>Boolean</string>
|
||||||
<key>Value</key>
|
<key>Value</key>
|
||||||
<integer>1</integer>
|
<integer>0</integer>
|
||||||
</map>
|
</map>
|
||||||
<key>DAEExportTextures</key>
|
<key>DAEExportTextures</key>
|
||||||
<map>
|
<map>
|
||||||
|
|||||||
@@ -75,6 +75,7 @@ namespace
|
|||||||
void handleMessage(const LLSD& content);
|
void handleMessage(const LLSD& content);
|
||||||
/*virtual*/ void error(U32 status, const std::string& reason);
|
/*virtual*/ void error(U32 status, const std::string& reason);
|
||||||
/*virtual*/ void result(const LLSD& content);
|
/*virtual*/ void result(const LLSD& content);
|
||||||
|
/*virtual*/ bool is_event_poll(void) const { return true; }
|
||||||
/*virtual*/ AIHTTPTimeoutPolicy const& getHTTPTimeoutPolicy(void) const { return eventPollResponder_timeout; }
|
/*virtual*/ AIHTTPTimeoutPolicy const& getHTTPTimeoutPolicy(void) const { return eventPollResponder_timeout; }
|
||||||
/*virtual*/ char const* getName(void) const { return "LLEventPollResponder"; }
|
/*virtual*/ char const* getName(void) const { return "LLEventPollResponder"; }
|
||||||
|
|
||||||
|
|||||||
@@ -113,14 +113,8 @@ LLNetMap::LLNetMap(const std::string& name) :
|
|||||||
(new LLScaleMap())->registerListener(this, "MiniMap.ZoomLevel");
|
(new LLScaleMap())->registerListener(this, "MiniMap.ZoomLevel");
|
||||||
(new LLCenterMap())->registerListener(this, "MiniMap.Center");
|
(new LLCenterMap())->registerListener(this, "MiniMap.Center");
|
||||||
(new LLCheckCenterMap())->registerListener(this, "MiniMap.CheckCenter");
|
(new LLCheckCenterMap())->registerListener(this, "MiniMap.CheckCenter");
|
||||||
(new LLRotateMap())->registerListener(this, "MiniMap.Rotate");
|
|
||||||
(new LLCheckRotateMap())->registerListener(this, "MiniMap.CheckRotate");
|
|
||||||
(new LLShowObjects())->registerListener(this, "MiniMap.ShowObjects");
|
|
||||||
(new LLCheckShowObjects())->registerListener(this, "MiniMap.CheckShowObjects");
|
|
||||||
(new LLChatRings())->registerListener(this, "MiniMap.ChatRings");
|
(new LLChatRings())->registerListener(this, "MiniMap.ChatRings");
|
||||||
(new LLWhisperRing())->registerListener(this, "MiniMap.WhisperRing");
|
(new LLCheckChatRings())->registerListener(this, "MiniMap.CheckChatRings");
|
||||||
(new LLChatRing())->registerListener(this, "MiniMap.ChatRing");
|
|
||||||
(new LLShoutRing())->registerListener(this, "MiniMap.ShoutRing");
|
|
||||||
(new LLStopTracking())->registerListener(this, "MiniMap.StopTracking");
|
(new LLStopTracking())->registerListener(this, "MiniMap.StopTracking");
|
||||||
(new LLEnableTracking())->registerListener(this, "MiniMap.EnableTracking");
|
(new LLEnableTracking())->registerListener(this, "MiniMap.EnableTracking");
|
||||||
(new LLShowAgentProfile())->registerListener(this, "MiniMap.ShowProfile");
|
(new LLShowAgentProfile())->registerListener(this, "MiniMap.ShowProfile");
|
||||||
@@ -133,6 +127,7 @@ LLNetMap::LLNetMap(const std::string& name) :
|
|||||||
(new mmsetcustom())->registerListener(this, "MiniMap.setcustom");
|
(new mmsetcustom())->registerListener(this, "MiniMap.setcustom");
|
||||||
(new mmsetunmark())->registerListener(this, "MiniMap.setunmark");
|
(new mmsetunmark())->registerListener(this, "MiniMap.setunmark");
|
||||||
(new mmenableunmark())->registerListener(this, "MiniMap.enableunmark");
|
(new mmenableunmark())->registerListener(this, "MiniMap.enableunmark");
|
||||||
|
(new LLToggleControl())->registerListener(this, "MiniMap.ToggleControl");
|
||||||
|
|
||||||
LLUICtrlFactory::getInstance()->buildPanel(this, "panel_mini_map.xml");
|
LLUICtrlFactory::getInstance()->buildPanel(this, "panel_mini_map.xml");
|
||||||
|
|
||||||
@@ -1163,95 +1158,29 @@ bool LLNetMap::LLCheckCenterMap::handleEvent(LLPointer<LLEvent> event, const LLS
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool LLNetMap::LLRotateMap::handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
|
|
||||||
{
|
|
||||||
BOOL rotate = gSavedSettings.getBOOL("MiniMapRotate");
|
|
||||||
gSavedSettings.setBOOL("MiniMapRotate", !rotate);
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool LLNetMap::LLCheckRotateMap::handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
|
|
||||||
{
|
|
||||||
LLNetMap *self = mPtr;
|
|
||||||
BOOL enabled = gSavedSettings.getBOOL("MiniMapRotate");
|
|
||||||
self->findControl(userdata["control"].asString())->setValue(enabled);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool LLNetMap::LLShowObjects::handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
|
|
||||||
{
|
|
||||||
BOOL showobjects = gSavedSettings.getBOOL("ShowMiniMapObjects");
|
|
||||||
gSavedSettings.setBOOL("ShowMiniMapObjects", !showobjects);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool LLNetMap::LLCheckShowObjects::handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
|
|
||||||
{
|
|
||||||
LLNetMap *self = mPtr;
|
|
||||||
BOOL enabled = gSavedSettings.getBOOL("ShowMiniMapObjects");
|
|
||||||
self->findControl(userdata["control"].asString())->setValue(enabled);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool LLNetMap::LLChatRings::handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
|
bool LLNetMap::LLChatRings::handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
|
||||||
{
|
{
|
||||||
BOOL all_enabled = gSavedSettings.getBOOL("MiniMapChatRings");
|
BOOL whisper_enabled = gSavedSettings.getBOOL("MiniMapWhisperRing");
|
||||||
gSavedSettings.setBOOL("MiniMapChatRings", !all_enabled);
|
BOOL chat_enabled = gSavedSettings.getBOOL("MiniMapChatRing");
|
||||||
|
BOOL shout_enabled = gSavedSettings.getBOOL("MiniMapShoutRing");
|
||||||
|
BOOL all_enabled = whisper_enabled && chat_enabled && shout_enabled;
|
||||||
|
|
||||||
gSavedSettings.setBOOL("MiniMapWhisperRing", !all_enabled);
|
gSavedSettings.setBOOL("MiniMapWhisperRing", !all_enabled);
|
||||||
gSavedSettings.setBOOL("MiniMapChatRing", !all_enabled);
|
gSavedSettings.setBOOL("MiniMapChatRing", !all_enabled);
|
||||||
gSavedSettings.setBOOL("MiniMapShoutRing", !all_enabled);
|
gSavedSettings.setBOOL("MiniMapShoutRing", !all_enabled);
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool LLNetMap::LLWhisperRing::handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
|
|
||||||
{
|
|
||||||
BOOL all_enabled = gSavedSettings.getBOOL("MiniMapChatRings");
|
|
||||||
BOOL whisper_enabled = gSavedSettings.getBOOL("MiniMapWhisperRing");
|
|
||||||
BOOL chat_enabled = gSavedSettings.getBOOL("MiniMapChatRing");
|
|
||||||
BOOL shout_enabled = gSavedSettings.getBOOL("MiniMapShoutRing");
|
|
||||||
|
|
||||||
gSavedSettings.setBOOL("MiniMapWhisperRing", !whisper_enabled);
|
|
||||||
|
|
||||||
if(all_enabled)
|
|
||||||
gSavedSettings.setBOOL("MiniMapChatRings", !all_enabled);
|
|
||||||
else if(!whisper_enabled && chat_enabled && shout_enabled)
|
|
||||||
gSavedSettings.setBOOL("MiniMapChatRings", TRUE);
|
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool LLNetMap::LLChatRing::handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
|
bool LLNetMap::LLCheckChatRings::handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
|
||||||
{
|
{
|
||||||
BOOL all_enabled = gSavedSettings.getBOOL("MiniMapChatRings");
|
|
||||||
BOOL whisper_enabled = gSavedSettings.getBOOL("MiniMapWhisperRing");
|
BOOL whisper_enabled = gSavedSettings.getBOOL("MiniMapWhisperRing");
|
||||||
BOOL chat_enabled = gSavedSettings.getBOOL("MiniMapChatRing");
|
BOOL chat_enabled = gSavedSettings.getBOOL("MiniMapChatRing");
|
||||||
BOOL shout_enabled = gSavedSettings.getBOOL("MiniMapShoutRing");
|
BOOL shout_enabled = gSavedSettings.getBOOL("MiniMapShoutRing");
|
||||||
|
BOOL all_enabled = whisper_enabled && chat_enabled && shout_enabled;
|
||||||
|
|
||||||
gSavedSettings.setBOOL("MiniMapChatRing", !chat_enabled);
|
LLNetMap *self = mPtr;
|
||||||
|
self->findControl(userdata["control"].asString())->setValue(all_enabled);
|
||||||
if(all_enabled)
|
|
||||||
gSavedSettings.setBOOL("MiniMapChatRings", !all_enabled);
|
|
||||||
else if(whisper_enabled && !chat_enabled && shout_enabled)
|
|
||||||
gSavedSettings.setBOOL("MiniMapChatRings", TRUE);
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool LLNetMap::LLShoutRing::handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
|
|
||||||
{
|
|
||||||
BOOL all_enabled = gSavedSettings.getBOOL("MiniMapChatRings");
|
|
||||||
BOOL whisper_enabled = gSavedSettings.getBOOL("MiniMapWhisperRing");
|
|
||||||
BOOL chat_enabled = gSavedSettings.getBOOL("MiniMapChatRing");
|
|
||||||
BOOL shout_enabled = gSavedSettings.getBOOL("MiniMapShoutRing");
|
|
||||||
|
|
||||||
gSavedSettings.setBOOL("MiniMapShoutRing", !shout_enabled);
|
|
||||||
|
|
||||||
if(all_enabled)
|
|
||||||
gSavedSettings.setBOOL("MiniMapChatRings", !all_enabled);
|
|
||||||
else if(whisper_enabled && chat_enabled && !shout_enabled)
|
|
||||||
gSavedSettings.setBOOL("MiniMapChatRings", TRUE);
|
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1300,3 +1229,11 @@ bool LLNetMap::LLEnableProfile::handleEvent(LLPointer<LLEvent> event, const LLSD
|
|||||||
//self->findControl(userdata["control"].asString())->setValue(self->isAgentUnderCursor());
|
//self->findControl(userdata["control"].asString())->setValue(self->isAgentUnderCursor());
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool LLNetMap::LLToggleControl::handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
|
||||||
|
{
|
||||||
|
std::string control_name = userdata.asString();
|
||||||
|
gSavedSettings.setBOOL(control_name, !gSavedSettings.getBOOL(control_name));
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -147,49 +147,13 @@ private:
|
|||||||
/*virtual*/ bool handleEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata);
|
/*virtual*/ bool handleEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata);
|
||||||
};
|
};
|
||||||
|
|
||||||
class LLRotateMap : public LLMemberListener<LLNetMap>
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
/*virtual*/ bool handleEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata);
|
|
||||||
};
|
|
||||||
|
|
||||||
class LLCheckRotateMap : public LLMemberListener<LLNetMap>
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
/*virtual*/ bool handleEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata);
|
|
||||||
};
|
|
||||||
|
|
||||||
class LLCheckShowObjects : public LLMemberListener<LLNetMap>
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
/*virtual*/ bool handleEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata);
|
|
||||||
};
|
|
||||||
|
|
||||||
class LLChatRings : public LLMemberListener<LLNetMap>
|
class LLChatRings : public LLMemberListener<LLNetMap>
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
/*virtual*/ bool handleEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata);
|
/*virtual*/ bool handleEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata);
|
||||||
};
|
};
|
||||||
|
|
||||||
class LLShowObjects : public LLMemberListener<LLNetMap>
|
class LLCheckChatRings : public LLMemberListener<LLNetMap>
|
||||||
{
|
|
||||||
public:
|
|
||||||
/*virtual*/ bool handleEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata);
|
|
||||||
};
|
|
||||||
|
|
||||||
class LLWhisperRing : public LLMemberListener<LLNetMap>
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
/*virtual*/ bool handleEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata);
|
|
||||||
};
|
|
||||||
|
|
||||||
class LLChatRing : public LLMemberListener<LLNetMap>
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
/*virtual*/ bool handleEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata);
|
|
||||||
};
|
|
||||||
|
|
||||||
class LLShoutRing : public LLMemberListener<LLNetMap>
|
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
/*virtual*/ bool handleEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata);
|
/*virtual*/ bool handleEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata);
|
||||||
@@ -268,6 +232,13 @@ private:
|
|||||||
public:
|
public:
|
||||||
/*virtual*/ bool handleEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata);
|
/*virtual*/ bool handleEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
class LLToggleControl : public LLMemberListener<LLNetMap>
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
/*virtual*/ bool handleEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata);
|
||||||
|
};
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -440,6 +440,11 @@ void LLSurface::connectNeighbor(LLSurface *neighborp, U32 direction)
|
|||||||
// <FS:CR> Aurora Sim
|
// <FS:CR> Aurora Sim
|
||||||
//neighbor_patchp = neighborp->getPatch(mPatchesPerEdge - 1, 0);
|
//neighbor_patchp = neighborp->getPatch(mPatchesPerEdge - 1, 0);
|
||||||
neighbor_patchp = neighborp->getPatch(neighbor_offset[0] - 1, off); //neighborPatchesPerEdge - 1
|
neighbor_patchp = neighborp->getPatch(neighbor_offset[0] - 1, off); //neighborPatchesPerEdge - 1
|
||||||
|
if (!neighbor_patchp)
|
||||||
|
{
|
||||||
|
mNeighbors[direction] = NULL;
|
||||||
|
return;
|
||||||
|
}
|
||||||
// </FS:CR> Aurora Sim
|
// </FS:CR> Aurora Sim
|
||||||
|
|
||||||
patchp->connectNeighbor(neighbor_patchp, direction);
|
patchp->connectNeighbor(neighbor_patchp, direction);
|
||||||
@@ -451,6 +456,11 @@ void LLSurface::connectNeighbor(LLSurface *neighborp, U32 direction)
|
|||||||
// <FS:CR> Aurora Sim
|
// <FS:CR> Aurora Sim
|
||||||
//neighbor_patchp = neighborp->getPatch(mPatchesPerEdge - 1, mPatchesPerEdge - 1);
|
//neighbor_patchp = neighborp->getPatch(mPatchesPerEdge - 1, mPatchesPerEdge - 1);
|
||||||
neighbor_patchp = neighborp->getPatch(neighbor_offset[0] - 1, neighbor_offset[1] - 1);
|
neighbor_patchp = neighborp->getPatch(neighbor_offset[0] - 1, neighbor_offset[1] - 1);
|
||||||
|
if (!neighbor_patchp)
|
||||||
|
{
|
||||||
|
mNeighbors[direction] = NULL;
|
||||||
|
return;
|
||||||
|
}
|
||||||
// </FS:CR> Aurora Sim
|
// </FS:CR> Aurora Sim
|
||||||
|
|
||||||
patchp->connectNeighbor(neighbor_patchp, direction);
|
patchp->connectNeighbor(neighbor_patchp, direction);
|
||||||
@@ -472,6 +482,11 @@ void LLSurface::connectNeighbor(LLSurface *neighborp, U32 direction)
|
|||||||
// <FS:CR> Aurora Sim
|
// <FS:CR> Aurora Sim
|
||||||
//neighbor_patchp = neighborp->getPatch(0, mPatchesPerEdge - 1);
|
//neighbor_patchp = neighborp->getPatch(0, mPatchesPerEdge - 1);
|
||||||
neighbor_patchp = neighborp->getPatch(off, neighbor_offset[1] - 1); //0
|
neighbor_patchp = neighborp->getPatch(off, neighbor_offset[1] - 1); //0
|
||||||
|
if (!neighbor_patchp)
|
||||||
|
{
|
||||||
|
mNeighbors[direction] = NULL;
|
||||||
|
return;
|
||||||
|
}
|
||||||
// </FS:CR> Aurora Sim
|
// </FS:CR> Aurora Sim
|
||||||
|
|
||||||
patchp->connectNeighbor(neighbor_patchp, direction);
|
patchp->connectNeighbor(neighbor_patchp, direction);
|
||||||
@@ -600,6 +615,7 @@ void LLSurface::connectNeighbor(LLSurface *neighborp, U32 direction)
|
|||||||
//neighbor_patchp = neighborp->getPatch(mPatchesPerEdge - 1, i);
|
//neighbor_patchp = neighborp->getPatch(mPatchesPerEdge - 1, i);
|
||||||
patchp = getPatch(0, i + own_offset[1]);
|
patchp = getPatch(0, i + own_offset[1]);
|
||||||
neighbor_patchp = neighborp->getPatch(neighborPatchesPerEdge - 1, i + neighbor_offset[1]);
|
neighbor_patchp = neighborp->getPatch(neighborPatchesPerEdge - 1, i + neighbor_offset[1]);
|
||||||
|
if (!neighbor_patchp) continue;
|
||||||
// </FS:CR> Aurora Sim
|
// </FS:CR> Aurora Sim
|
||||||
|
|
||||||
patchp->connectNeighbor(neighbor_patchp, direction);
|
patchp->connectNeighbor(neighbor_patchp, direction);
|
||||||
@@ -620,6 +636,7 @@ void LLSurface::connectNeighbor(LLSurface *neighborp, U32 direction)
|
|||||||
//neighbor_patchp = neighborp->getPatch(mPatchesPerEdge - 1, i - 1);
|
//neighbor_patchp = neighborp->getPatch(mPatchesPerEdge - 1, i - 1);
|
||||||
patchp = getPatch(0, i + own_offset[1]);
|
patchp = getPatch(0, i + own_offset[1]);
|
||||||
neighbor_patchp = neighborp->getPatch(neighborPatchesPerEdge - 1, i - 1 + neighbor_offset[1]);
|
neighbor_patchp = neighborp->getPatch(neighborPatchesPerEdge - 1, i - 1 + neighbor_offset[1]);
|
||||||
|
if (!neighbor_patchp) continue;
|
||||||
// </FS:CR> Aurora Sim
|
// </FS:CR> Aurora Sim
|
||||||
|
|
||||||
patchp->connectNeighbor(neighbor_patchp, SOUTHWEST);
|
patchp->connectNeighbor(neighbor_patchp, SOUTHWEST);
|
||||||
@@ -637,6 +654,7 @@ void LLSurface::connectNeighbor(LLSurface *neighborp, U32 direction)
|
|||||||
//neighbor_patchp = neighborp->getPatch(mPatchesPerEdge - 1, i + 1);
|
//neighbor_patchp = neighborp->getPatch(mPatchesPerEdge - 1, i + 1);
|
||||||
patchp = getPatch(0, i + own_offset[1]);
|
patchp = getPatch(0, i + own_offset[1]);
|
||||||
neighbor_patchp = neighborp->getPatch(neighborPatchesPerEdge - 1, i + 1 + neighbor_offset[1]);
|
neighbor_patchp = neighborp->getPatch(neighborPatchesPerEdge - 1, i + 1 + neighbor_offset[1]);
|
||||||
|
if (!neighbor_patchp) continue;
|
||||||
// </FS:CR> Aurora Sim
|
// </FS:CR> Aurora Sim
|
||||||
|
|
||||||
patchp->connectNeighbor(neighbor_patchp, NORTHWEST);
|
patchp->connectNeighbor(neighbor_patchp, NORTHWEST);
|
||||||
@@ -656,6 +674,7 @@ void LLSurface::connectNeighbor(LLSurface *neighborp, U32 direction)
|
|||||||
//neighbor_patchp = neighborp->getPatch(i, mPatchesPerEdge - 1);
|
//neighbor_patchp = neighborp->getPatch(i, mPatchesPerEdge - 1);
|
||||||
patchp = getPatch(i + own_offset[0], 0);
|
patchp = getPatch(i + own_offset[0], 0);
|
||||||
neighbor_patchp = neighborp->getPatch(i + neighbor_offset[0], neighborPatchesPerEdge - 1);
|
neighbor_patchp = neighborp->getPatch(i + neighbor_offset[0], neighborPatchesPerEdge - 1);
|
||||||
|
if (!neighbor_patchp) continue;
|
||||||
// </FS:CR> Aurora Sim
|
// </FS:CR> Aurora Sim
|
||||||
|
|
||||||
patchp->connectNeighbor(neighbor_patchp, direction);
|
patchp->connectNeighbor(neighbor_patchp, direction);
|
||||||
@@ -1321,12 +1340,12 @@ LLSurfacePatch *LLSurface::getPatch(const S32 x, const S32 y) const
|
|||||||
{
|
{
|
||||||
if ((x < 0) || (x >= mPatchesPerEdge))
|
if ((x < 0) || (x >= mPatchesPerEdge))
|
||||||
{
|
{
|
||||||
llerrs << "Asking for patch out of bounds" << llendl;
|
llwarns << "Asking for patch out of bounds" << llendl;
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
if ((y < 0) || (y >= mPatchesPerEdge))
|
if ((y < 0) || (y >= mPatchesPerEdge))
|
||||||
{
|
{
|
||||||
llerrs << "Asking for patch out of bounds" << llendl;
|
llwarns << "Asking for patch out of bounds" << llendl;
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -881,6 +881,7 @@ void LLSurfacePatch::setOriginGlobal(const LLVector3d &origin_global)
|
|||||||
void LLSurfacePatch::connectNeighbor(LLSurfacePatch *neighbor_patchp, const U32 direction)
|
void LLSurfacePatch::connectNeighbor(LLSurfacePatch *neighbor_patchp, const U32 direction)
|
||||||
{
|
{
|
||||||
llassert(neighbor_patchp);
|
llassert(neighbor_patchp);
|
||||||
|
if (!neighbor_patchp) return;
|
||||||
mNormalsInvalid[direction] = TRUE;
|
mNormalsInvalid[direction] = TRUE;
|
||||||
neighbor_patchp->mNormalsInvalid[gDirOpposite[direction]] = TRUE;
|
neighbor_patchp->mNormalsInvalid[gDirOpposite[direction]] = TRUE;
|
||||||
|
|
||||||
|
|||||||
@@ -21,32 +21,32 @@
|
|||||||
</menu_item_check>
|
</menu_item_check>
|
||||||
<menu_item_check bottom_delta="-18" enabled="true" height="18" label="Rotate Mini-Map"
|
<menu_item_check bottom_delta="-18" enabled="true" height="18" label="Rotate Mini-Map"
|
||||||
left="0" mouse_opaque="true" name="Rotate Mini-Map" width="128">
|
left="0" mouse_opaque="true" name="Rotate Mini-Map" width="128">
|
||||||
<on_click function="MiniMap.Rotate" userdata="" />
|
<on_click function="MiniMap.ToggleControl" userdata="MiniMapRotate" />
|
||||||
<on_check function="MiniMap.CheckRotate" userdata="" />
|
<on_check control="MiniMapRotate" />
|
||||||
</menu_item_check>
|
</menu_item_check>
|
||||||
<menu_item_check bottom_delta="-18" enabled="false" height="18" label="Show Objects"
|
<menu_item_check bottom_delta="-18" enabled="false" height="18" label="Show Objects"
|
||||||
left="0" mouse_opaque="true" name="Show Objects" width="128">
|
left="0" mouse_opaque="true" name="Show Objects" width="128">
|
||||||
<on_click function="MiniMap.ShowObjects" userdata="" />
|
<on_click function="MiniMap.ToggleControl" userdata="ShowMiniMapObjects" />
|
||||||
<on_check function="MiniMap.CheckShowObjects" userdata="" />
|
<on_check control="ShowMiniMapObjects" />
|
||||||
</menu_item_check>
|
</menu_item_check>
|
||||||
<menu bottom_delta="0" color="MenuDefaultBgColor" drop_shadow="true" height="175" left="0"
|
<menu bottom_delta="0" color="MenuDefaultBgColor" drop_shadow="true" height="175" left="0"
|
||||||
mouse_opaque="false" name="Chat Distance Rings" opaque="true" tear_off="false" width="125">
|
mouse_opaque="false" name="Chat Distance Rings" opaque="true" tear_off="false" width="125">
|
||||||
<menu_item_check label="Show All" name="Show All">
|
<menu_item_check label="Show All" name="Show All">
|
||||||
<on_check control="MiniMapChatRings" />
|
<on_check function="MiniMap.CheckChatRings" />
|
||||||
<on_click function="MiniMap.ChatRings" userdata="MiniMapChatRings" />
|
<on_click function="MiniMap.ChatRings" />
|
||||||
</menu_item_check>
|
</menu_item_check>
|
||||||
<menu_item_separator />
|
<menu_item_separator />
|
||||||
<menu_item_check label="Show Whisper Ring" name="Show Whisper Ring">
|
<menu_item_check label="Show Whisper Ring" name="Show Whisper Ring">
|
||||||
<on_check control="MiniMapWhisperRing" />
|
<on_check control="MiniMapWhisperRing" />
|
||||||
<on_click function="MiniMap.WhisperRing" userdata="MiniMapWhisperRing" />
|
<on_click function="MiniMap.ToggleControl" userdata="MiniMapWhisperRing" />
|
||||||
</menu_item_check>
|
</menu_item_check>
|
||||||
<menu_item_check label="Show Chat Ring" name="Show Chat Ring">
|
<menu_item_check label="Show Chat Ring" name="Show Chat Ring">
|
||||||
<on_check control="MiniMapChatRing" />
|
<on_check control="MiniMapChatRing" />
|
||||||
<on_click function="MiniMap.ChatRing" userdata="MiniMapChatRing" />
|
<on_click function="MiniMap.ToggleControl" userdata="MiniMapChatRing" />
|
||||||
</menu_item_check>
|
</menu_item_check>
|
||||||
<menu_item_check label="Show Shout Ring" name="Show Shout Ring">
|
<menu_item_check label="Show Shout Ring" name="Show Shout Ring">
|
||||||
<on_check control="MiniMapShoutRing" />
|
<on_check control="MiniMapShoutRing" />
|
||||||
<on_click function="MiniMap.ShoutRing" userdata="MiniMapShoutRing" />
|
<on_click function="MiniMap.ToggleControl" userdata="MiniMapShoutRing" />
|
||||||
</menu_item_check>
|
</menu_item_check>
|
||||||
</menu>
|
</menu>
|
||||||
<menu_item_separator />
|
<menu_item_separator />
|
||||||
|
|||||||
Reference in New Issue
Block a user