forked from bartvdbraak/blender
BGE: Fix T40555: LibLoad material caching issue
Previously we don't merge material cached list, it create dangling pointer and memory leak. Now we merge material cache list during the scene merge, and remove material in this list during the library free. Reviewers: agoose77, dfelinto, hg1, pgi, campbellbarton, moguri Reviewed By: campbellbarton, moguri Subscribers: campbellbarton, youle, kupoman Projects: #game_engine Differential Revision: https://developer.blender.org/D1278
This commit is contained in:
parent
fccf253e36
commit
377822729c
@ -1218,6 +1218,8 @@ bool KX_BlenderSceneConverter::FreeBlendFile(Main *maggie)
|
|||||||
bmat = bl_mat->GetBlenderMaterial();
|
bmat = bl_mat->GetBlenderMaterial();
|
||||||
|
|
||||||
if (IS_TAGGED(bmat)) {
|
if (IS_TAGGED(bmat)) {
|
||||||
|
// Remove the poly material coresponding to this Blender Material.
|
||||||
|
m_polymat_cache[polymit->first].erase(bmat);
|
||||||
delete (*polymit).second;
|
delete (*polymit).second;
|
||||||
*polymit = m_polymaterials.back();
|
*polymit = m_polymaterials.back();
|
||||||
m_polymaterials.pop_back();
|
m_polymaterials.pop_back();
|
||||||
@ -1233,6 +1235,8 @@ bool KX_BlenderSceneConverter::FreeBlendFile(Main *maggie)
|
|||||||
for (i = 0, matit = m_materials.begin(); i < size; ) {
|
for (i = 0, matit = m_materials.begin(); i < size; ) {
|
||||||
BL_Material *mat = (*matit).second;
|
BL_Material *mat = (*matit).second;
|
||||||
if (IS_TAGGED(mat->material)) {
|
if (IS_TAGGED(mat->material)) {
|
||||||
|
// Remove the bl material coresponding to this Blender Material.
|
||||||
|
m_mat_cache[matit->first].erase(mat->material);
|
||||||
delete (*matit).second;
|
delete (*matit).second;
|
||||||
*matit = m_materials.back();
|
*matit = m_materials.back();
|
||||||
m_materials.pop_back();
|
m_materials.pop_back();
|
||||||
@ -1354,6 +1358,16 @@ bool KX_BlenderSceneConverter::MergeScene(KX_Scene *to, KX_Scene *from)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
MaterialCache::iterator matcacheit = m_mat_cache.find(from);
|
||||||
|
// Merge cached BL_Material map.
|
||||||
|
m_mat_cache[to].insert(matcacheit->second.begin(), matcacheit->second.end());
|
||||||
|
m_mat_cache.erase(matcacheit);
|
||||||
|
|
||||||
|
PolyMaterialCache::iterator polymatcacheit = m_polymat_cache.find(from);
|
||||||
|
// Merge cached RAS_IPolyMaterial map.
|
||||||
|
m_polymat_cache[to].insert(polymatcacheit->second.begin(), polymatcacheit->second.end());
|
||||||
|
m_polymat_cache.erase(polymatcacheit);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user