summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--indra/newview/llmaterialmgr.cpp25
-rw-r--r--indra/newview/llmaterialmgr.h3
-rw-r--r--indra/newview/llworld.cpp9
-rw-r--r--indra/newview/llworld.h5
4 files changed, 41 insertions, 1 deletions
diff --git a/indra/newview/llmaterialmgr.cpp b/indra/newview/llmaterialmgr.cpp
index f623ca11ec..1daeedb8b0 100644
--- a/indra/newview/llmaterialmgr.cpp
+++ b/indra/newview/llmaterialmgr.cpp
@@ -112,6 +112,7 @@ void LLMaterialsResponder::error(U32 pStatus, const std::string& pReason)
LLMaterialMgr::LLMaterialMgr()
{
gIdleCallbacks.addFunction(&LLMaterialMgr::onIdle, NULL);
+ LLWorld::instance().setRegionRemovedCallback(boost::bind(&LLMaterialMgr::onRegionRemoved, this, _1));
}
LLMaterialMgr::~LLMaterialMgr()
@@ -607,3 +608,27 @@ void LLMaterialMgr::processPutQueue()
}
}
}
+
+void LLMaterialMgr::onRegionRemoved(LLViewerRegion* regionp)
+{
+ const LLUUID& region_id = regionp->getRegionID();
+
+ // Get
+ mGetQueue.erase(region_id);
+ for (get_pending_map_t::const_iterator itPending = mGetPending.begin(); itPending != mGetPending.end();)
+ {
+ if (region_id == itPending->first.first)
+ mGetPending.erase(itPending++);
+ else
+ ++itPending;
+ }
+
+ // Get all
+ mGetAllQueue.erase(region_id);
+ mGetAllRequested.erase(region_id);
+ mGetAllPending.erase(region_id);
+ mGetAllCallbacks.erase(region_id);
+
+ // Put
+// mPutQueue.erase(region_id);
+}
diff --git a/indra/newview/llmaterialmgr.h b/indra/newview/llmaterialmgr.h
index 1066f3ef37..5a0064ae27 100644
--- a/indra/newview/llmaterialmgr.h
+++ b/indra/newview/llmaterialmgr.h
@@ -31,6 +31,8 @@
#include "llmaterialid.h"
#include "llsingleton.h"
+class LLViewerRegion;
+
class LLMaterialMgr : public LLSingleton<LLMaterialMgr>
{
friend LLSingleton<LLMaterialMgr>;
@@ -61,6 +63,7 @@ protected:
void onGetAllResponse(bool success, const LLSD& content, const LLUUID& region_id);
void processPutQueue();
void onPutResponse(bool success, const LLSD& content);
+ void onRegionRemoved(LLViewerRegion* regionp);
protected:
typedef std::set<LLMaterialID> material_queue_t;
diff --git a/indra/newview/llworld.cpp b/indra/newview/llworld.cpp
index ed6c8bd32b..604f7f2b56 100644
--- a/indra/newview/llworld.cpp
+++ b/indra/newview/llworld.cpp
@@ -275,7 +275,9 @@ void LLWorld::removeRegion(const LLHost &host)
mActiveRegionList.remove(regionp);
mCulledRegionList.remove(regionp);
mVisibleRegionList.remove(regionp);
-
+
+ mRegionRemovedSignal(regionp);
+
delete regionp;
updateWaterObjects();
@@ -1259,6 +1261,11 @@ bool LLWorld::isRegionListed(const LLViewerRegion* region) const
return it != mRegionList.end();
}
+boost::signals2::connection LLWorld::setRegionRemovedCallback(const region_remove_signal_t::slot_type& cb)
+{
+ return mRegionRemovedSignal.connect(cb);
+}
+
LLHTTPRegistration<LLEstablishAgentCommunication>
gHTTPRegistrationEstablishAgentCommunication(
"/message/EstablishAgentCommunication");
diff --git a/indra/newview/llworld.h b/indra/newview/llworld.h
index 72f2ac46da..d0b001ba44 100644
--- a/indra/newview/llworld.h
+++ b/indra/newview/llworld.h
@@ -150,6 +150,9 @@ public:
typedef std::list<LLViewerRegion*> region_list_t;
const region_list_t& getRegionList() const { return mActiveRegionList; }
+ typedef boost::signals2::signal<void(LLViewerRegion*)> region_remove_signal_t;
+ boost::signals2::connection setRegionRemovedCallback(const region_remove_signal_t::slot_type& cb);
+
// Returns lists of avatar IDs and their world-space positions within a given distance of a point.
// All arguments are optional. Given containers will be emptied and then filled.
// Not supplying origin or radius input returns data on all avatars in the known regions.
@@ -169,6 +172,8 @@ private:
region_list_t mVisibleRegionList;
region_list_t mCulledRegionList;
+ region_remove_signal_t mRegionRemovedSignal;
+
// Number of points on edge
static const U32 mWidth;