diff options
| author | ruslantproductengine <ruslantproductengine@lindenlab.com> | 2018-02-14 20:52:31 +0200 | 
|---|---|---|
| committer | ruslantproductengine <ruslantproductengine@lindenlab.com> | 2018-02-14 20:52:31 +0200 | 
| commit | 84e5dc37b60a9aa44139084c3d19b29f98527199 (patch) | |
| tree | 56a067c64941f15e9a48d30f226c3444d62d6b9b | |
| parent | cc30a9e2f5b9410dcdf323d3ecdd3f6f1e2985db (diff) | |
MAINT-7847 The presence of certain Avatars stops local specular textures from "sticking". Yes really.
FIXED. Allows set material explicitly to material manager.
| -rw-r--r-- | indra/llprimitive/llmaterialid.cpp | 5 | ||||
| -rw-r--r-- | indra/llprimitive/llmaterialid.h | 1 | ||||
| -rw-r--r-- | indra/newview/llmaterialmgr.cpp | 38 | ||||
| -rw-r--r-- | indra/newview/llmaterialmgr.h | 6 | ||||
| -rw-r--r-- | indra/newview/llvovolume.cpp | 4 | 
5 files changed, 44 insertions, 10 deletions
| diff --git a/indra/llprimitive/llmaterialid.cpp b/indra/llprimitive/llmaterialid.cpp index 820f62c43c..f88a607c4f 100644 --- a/indra/llprimitive/llmaterialid.cpp +++ b/indra/llprimitive/llmaterialid.cpp @@ -61,6 +61,11 @@ LLMaterialID::LLMaterialID(const LLMaterialID& pOtherMaterialID)  	copyFromOtherMaterialID(pOtherMaterialID);  } +LLMaterialID::LLMaterialID(const LLUUID& lluid) +{ +	set(lluid.mData); +} +  LLMaterialID::~LLMaterialID()  {  } diff --git a/indra/llprimitive/llmaterialid.h b/indra/llprimitive/llmaterialid.h index b4c82d3b7b..ee663f8f99 100644 --- a/indra/llprimitive/llmaterialid.h +++ b/indra/llprimitive/llmaterialid.h @@ -40,6 +40,7 @@ public:  	LLMaterialID(const LLSD::Binary& pMaterialID);  	LLMaterialID(const void* pMemory);  	LLMaterialID(const LLMaterialID& pOtherMaterialID); +	LLMaterialID(const LLUUID& lluid);  	~LLMaterialID();  	bool          operator == (const LLMaterialID& pOtherMaterialID) const; diff --git a/indra/newview/llmaterialmgr.cpp b/indra/newview/llmaterialmgr.cpp index ccbe13fb50..945ecc10d0 100644 --- a/indra/newview/llmaterialmgr.cpp +++ b/indra/newview/llmaterialmgr.cpp @@ -350,6 +350,25 @@ void LLMaterialMgr::remove(const LLUUID& object_id, const U8 te)  	put(object_id, te, LLMaterial::null);  } +void LLMaterialMgr::setLocalMaterial(const LLUUID& region_id, LLMaterialPtr material_ptr) +{ +	LLUUID uuid; +	uuid.generate(); +	LLMaterialID material_id(uuid); +	while (mMaterials.end() != mMaterials.find(material_id))  +	{ //probability that this loop will executed is very, very low (one in a billion chance) +		uuid.generate(); +		material_id.set(uuid.mData); +	}	 + +	LL_DEBUGS("Materials") << "region " << region_id << "new local material id " << material_id << LL_ENDL; +	mMaterials.insert(std::pair<LLMaterialID, LLMaterialPtr>(material_id, material_ptr)); + +	setMaterialCallbacks(material_id, material_ptr); + +	mGetPending.erase(pending_material_t(region_id, material_id)); +} +  const LLMaterialPtr LLMaterialMgr::setMaterial(const LLUUID& region_id, const LLMaterialID& material_id, const LLSD& material_data)  {  	LL_DEBUGS("Materials") << "region " << region_id << " material id " << material_id << LL_ENDL; @@ -362,17 +381,26 @@ const LLMaterialPtr LLMaterialMgr::setMaterial(const LLUUID& region_id, const LL  		itMaterial = ret.first;  	} +	setMaterialCallbacks(material_id, itMaterial->second); + +	mGetPending.erase(pending_material_t(region_id, material_id)); + +	return itMaterial->second; +} + +void LLMaterialMgr::setMaterialCallbacks(const LLMaterialID& material_id, const LLMaterialPtr material_ptr) +{  	TEMaterialPair te_mat_pair;  	te_mat_pair.materialID = material_id;  	U32 i = 0; -	while (i < LLTEContents::MAX_TES) +	while (i < LLTEContents::MAX_TES && !mGetTECallbacks.empty())  	{  		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); +			(*itCallbackTE->second)(material_id, material_ptr, te_mat_pair.te);  			delete itCallbackTE->second;  			mGetTECallbacks.erase(itCallbackTE);  		} @@ -381,15 +409,11 @@ const LLMaterialPtr LLMaterialMgr::setMaterial(const LLUUID& region_id, const LL  	get_callback_map_t::iterator itCallback = mGetCallbacks.find(material_id);  	if (itCallback != mGetCallbacks.end())  	{ -		(*itCallback->second)(material_id, itMaterial->second); +		(*itCallback->second)(material_id, material_ptr);  		delete itCallback->second;  		mGetCallbacks.erase(itCallback);  	} - -	mGetPending.erase(pending_material_t(region_id, material_id)); - -	return itMaterial->second;  }  void LLMaterialMgr::onGetResponse(bool success, const LLSD& content, const LLUUID& region_id) diff --git a/indra/newview/llmaterialmgr.h b/indra/newview/llmaterialmgr.h index 60b58d17de..843dc66fbc 100644 --- a/indra/newview/llmaterialmgr.h +++ b/indra/newview/llmaterialmgr.h @@ -56,6 +56,9 @@ public:  	boost::signals2::connection getAll(const LLUUID& region_id, getall_callback_t::slot_type cb);  	void put(const LLUUID& object_id, const U8 te, const LLMaterial& material);  	void remove(const LLUUID& object_id, const U8 te); +	 +	//explicitly add new material to material manager +	void setLocalMaterial(const LLUUID& region_id, LLMaterialPtr material_ptr);  private:  	void clearGetQueues(const LLUUID& region_id); @@ -63,7 +66,8 @@ private:  	bool isGetAllPending(const LLUUID& region_id) const;  	void markGetPending(const LLUUID& region_id, const LLMaterialID& material_id);  	const LLMaterialPtr setMaterial(const LLUUID& region_id, const LLMaterialID& material_id, const LLSD& material_data); - +	void setMaterialCallbacks(const LLMaterialID& material_id, const LLMaterialPtr material_ptr); +	  	static void onIdle(void*);      static void CapsRecvForRegion(const LLUUID& regionId, LLUUID regionTest, std::string pumpname); diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp index ad4466073a..0c4f4d8058 100644 --- a/indra/newview/llvovolume.cpp +++ b/indra/newview/llvovolume.cpp @@ -2198,7 +2198,7 @@ bool LLVOVolume::notifyAboutMissingAsset(LLViewerTexture *texture)  	//setup new materials  	for(map_te_material::const_iterator it = new_material.begin(), end = new_material.end(); it != end; ++it)  	{ -		LLMaterialMgr::getInstance()->put(getID(), it->first, *it->second); +		LLMaterialMgr::getInstance()->setLocalMaterial(getRegion()->getRegionID(), it->second);  		LLViewerObject::setTEMaterialParams(it->first, it->second);  	} @@ -2301,7 +2301,7 @@ S32 LLVOVolume::setTEMaterialParams(const U8 te, const LLMaterialPtr pMaterialPa  		if(new_material) {  			pMaterial = new_material; -			LLMaterialMgr::getInstance()->put(getID(),te,*pMaterial); +			LLMaterialMgr::getInstance()->setLocalMaterial(getRegion()->getRegionID(), pMaterial);  		}  	} | 
