diff options
author | Graham Madarasz <graham@lindenlab.com> | 2013-05-23 16:24:34 -0700 |
---|---|---|
committer | Graham Madarasz <graham@lindenlab.com> | 2013-05-23 16:24:34 -0700 |
commit | 260afbcece7db436af411abcba28495bf99fa08b (patch) | |
tree | 27609345c4a73e0ce9b566e9046abf2f21c25d54 /indra/newview/llmaterialmgr.cpp | |
parent | 33f674a0d080c5e74ae2f50029b601b4dcecd4d9 (diff) |
NORSPEC-192 fix more incorrect batching, fix bug in reflecting normal map state in build tool, and protect against callback crashes when switching regions
Diffstat (limited to 'indra/newview/llmaterialmgr.cpp')
-rw-r--r-- | indra/newview/llmaterialmgr.cpp | 53 |
1 files changed, 30 insertions, 23 deletions
diff --git a/indra/newview/llmaterialmgr.cpp b/indra/newview/llmaterialmgr.cpp index edf8e83038..5c0173c7a7 100644 --- a/indra/newview/llmaterialmgr.cpp +++ b/indra/newview/llmaterialmgr.cpp @@ -337,34 +337,41 @@ const LLMaterialPtr LLMaterialMgr::setMaterial(const LLUUID& region_id, const LL itMaterial = ret.first; } - mGetPending.erase(pending_material_t(region_id, material_id)); - - get_callback_map_t::iterator itCallback = mGetCallbacks.find(material_id); - if (itCallback != mGetCallbacks.end()) - { - (*itCallback->second)(material_id, itMaterial->second); - - delete itCallback->second; - mGetCallbacks.erase(itCallback); - } + // we may have cleared our queues on leaving a region before we recv'd our + // update for this material...too late now! + // + if (isGetPending(region_id, material_id)) + { + + #if USE_TE_SPECIFIC_REGISTRATION + TEMaterialPair te_mat_pair; + te_mat_pair.materialID = material_id; -#if USE_TE_SPECIFIC_REGISTRATION - 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); + } + } + #endif - 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()) + get_callback_map_t::iterator itCallback = mGetCallbacks.find(material_id); + if (itCallback != mGetCallbacks.end()) { - (*itCallbackTE->second)(material_id, itMaterial->second, te_mat_pair.te); - delete itCallbackTE->second; - mGetTECallbacks.erase(itCallbackTE); + (*itCallback->second)(material_id, itMaterial->second); + + delete itCallback->second; + mGetCallbacks.erase(itCallback); } } -#endif + + mGetPending.erase(pending_material_t(region_id, material_id)); return itMaterial->second; } |