diff options
| author | Graham Madarasz <graham@lindenlab.com> | 2013-05-15 17:00:13 -0700 | 
|---|---|---|
| committer | Graham Madarasz <graham@lindenlab.com> | 2013-05-15 17:00:13 -0700 | 
| commit | 666896ac4efa0575c82cd58c9fe041f354ccbbfc (patch) | |
| tree | 62ea74c178c617a3efe77c09307f66c4b543c997 /indra/newview | |
| parent | c46b24fc9abb00528249b5a1482ace8d31d835c2 (diff) | |
NORSPEC-119 put back TE-specific get registration in material manager stomped during 'reloading'.
Diffstat (limited to 'indra/newview')
| -rw-r--r-- | indra/newview/llmaterialmgr.cpp | 61 | ||||
| -rw-r--r-- | indra/newview/llmaterialmgr.h | 22 | ||||
| -rwxr-xr-x | indra/newview/llvovolume.cpp | 2 | 
3 files changed, 84 insertions, 1 deletions
diff --git a/indra/newview/llmaterialmgr.cpp b/indra/newview/llmaterialmgr.cpp index f217ff160e..59e5d05736 100644 --- a/indra/newview/llmaterialmgr.cpp +++ b/indra/newview/llmaterialmgr.cpp @@ -217,6 +217,51 @@ boost::signals2::connection LLMaterialMgr::get(const LLUUID& region_id, const LL  	return connection;  } +boost::signals2::connection LLMaterialMgr::getTE(const LLUUID& region_id, const LLMaterialID& material_id, U32 te, LLMaterialMgr::get_callback_te_t::slot_type cb) +{ +	boost::signals2::connection connection; + +	material_map_t::const_iterator itMaterial = mMaterials.find(material_id); +	if (itMaterial != mMaterials.end()) +	{ +		LL_DEBUGS("Materials") << "region " << region_id << " found materialid " << material_id << LL_ENDL; +		get_callback_te_t signal; +		signal.connect(cb); +		signal(material_id, itMaterial->second, te); +		connection = boost::signals2::connection(); +	} +	else +	{ +		if (!isGetPending(region_id, material_id)) +		{ +			get_queue_t::iterator itQueue = mGetQueue.find(region_id); +			if (mGetQueue.end() == itQueue) +			{ +				LL_DEBUGS("Materials") << "mGetQueue inserting region "<<region_id << LL_ENDL; +				std::pair<get_queue_t::iterator, bool> ret = mGetQueue.insert(std::pair<LLUUID, material_queue_t>(region_id, material_queue_t())); +				itQueue = ret.first; +			} +			LL_DEBUGS("Materials") << "adding material id " << material_id << LL_ENDL; +			itQueue->second.insert(material_id); +			markGetPending(region_id, material_id); +		} + +		TEMaterialPair te_mat_pair; +		te_mat_pair.te = te; +		te_mat_pair.materialID = material_id; + +		get_callback_te_map_t::iterator itCallback = mGetTECallbacks.find(te_mat_pair); +		if (itCallback == mGetTECallbacks.end()) +		{ +			std::pair<get_callback_te_map_t::iterator, bool> ret = mGetTECallbacks.insert(std::pair<TEMaterialPair, get_callback_te_t*>(te_mat_pair, new get_callback_te_t())); +			itCallback = ret.first; +		} +		connection = itCallback->second->connect(cb); +	} + +	return connection; +} +  bool LLMaterialMgr::isGetAllPending(const LLUUID& region_id) const  {  	getall_pending_map_t::const_iterator itPending = mGetAllPending.find(region_id); @@ -301,6 +346,22 @@ const LLMaterialPtr LLMaterialMgr::setMaterial(const LLUUID& region_id, const LL  		mGetCallbacks.erase(itCallback);  	} +	TEMaterialPair te_mat_pair; +	te_mat_pair.materialID = material_id; + +	U32 i = 0; +	while (i < LLTEContents::MAX_TES) +	{ +		te_mat_pair.te = i++; +		get_callback_te_map_t::iterator itCallbackTE = mGetTECallbacks.find(te_mat_pair); +		if (itCallbackTE != mGetTECallbacks.end()) +		{ +			(*itCallbackTE->second)(material_id, itMaterial->second, te_mat_pair.te); +			delete itCallbackTE->second; +			mGetTECallbacks.erase(itCallbackTE); +		} +	} +  	return itMaterial->second;  } diff --git a/indra/newview/llmaterialmgr.h b/indra/newview/llmaterialmgr.h index a6a7a5d1d7..b5ba8ab680 100644 --- a/indra/newview/llmaterialmgr.h +++ b/indra/newview/llmaterialmgr.h @@ -44,9 +44,11 @@ public:  	typedef std::map<LLMaterialID, LLMaterialPtr> material_map_t;  	typedef boost::signals2::signal<void (const LLMaterialID&, const LLMaterialPtr)> get_callback_t; +	typedef boost::signals2::signal<void (const LLMaterialID&, const LLMaterialPtr, U32 te)> get_callback_te_t;  	const LLMaterialPtr         get(const LLUUID& region_id, const LLMaterialID& material_id);  	boost::signals2::connection get(const LLUUID& region_id, const LLMaterialID& material_id, get_callback_t::slot_type cb); +	boost::signals2::connection getTE(const LLUUID& region_id, const LLMaterialID& material_id, U32 te, get_callback_te_t::slot_type cb);  	typedef boost::signals2::signal<void (const LLUUID&, const material_map_t&)> getall_callback_t;  	void                        getAll(const LLUUID& region_id); @@ -80,6 +82,26 @@ protected:  	typedef std::map<LLMaterialID, get_callback_t*> get_callback_map_t;  	get_callback_map_t mGetCallbacks; +	// struct for TE-specific material ID query +	struct TEMaterialPair +	{ +		U32 te; +		LLMaterialID materialID; +	}; + +	// needed for std::map compliance only +	// +	friend inline bool operator<( +		const struct LLMaterialMgr::TEMaterialPair& lhs, +		const struct LLMaterialMgr::TEMaterialPair& rhs) +	{ +		return (lhs.materialID < rhs.materialID) ? TRUE : +		       (lhs.te	< rhs.te) ? TRUE : FALSE; +	} + +	typedef std::map<TEMaterialPair, get_callback_te_t*> get_callback_te_map_t; +	get_callback_te_map_t mGetTECallbacks; +  	typedef std::set<LLUUID> getall_queue_t;  	getall_queue_t        mGetAllQueue;  	getall_queue_t        mGetAllRequested; diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp index 694ad82914..a9b540507f 100755 --- a/indra/newview/llvovolume.cpp +++ b/indra/newview/llvovolume.cpp @@ -1993,7 +1993,7 @@ S32 LLVOVolume::setTEMaterialID(const U8 te, const LLMaterialID& pMaterialID)  	LL_DEBUGS("MaterialTEs") << " " << pMaterialID.asString() << LL_ENDL;  	if (res)  	{ -		LLMaterialMgr::instance().get(getRegion()->getRegionID(), pMaterialID, boost::bind(&LLVOVolume::setTEMaterialParamsCallback, this, _1, _2, te));			 +		LLMaterialMgr::instance().getTE(getRegion()->getRegionID(), pMaterialID, te, boost::bind(&LLVOVolume::setTEMaterialParamsCallback, this, _1, _2, _3));			  		setChanged(TEXTURE);  		if (!mDrawable.isNull())  		{  | 
