Skip to content

Commit 27fb297

Browse files
committed
#3190 Ensure materials are properly copied instead of reused.
1 parent 3f6d55f commit 27fb297

File tree

3 files changed

+32
-16
lines changed

3 files changed

+32
-16
lines changed

indra/newview/llselectmgr.cpp

Lines changed: 27 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -2251,13 +2251,14 @@ void LLSelectMgr::selectionRevertGLTFMaterials()
22512251

22522252
// Update material locally
22532253
objectp->setRenderMaterialID(te, asset_id, false /*wait for LLGLTFMaterialList update*/);
2254-
objectp->setTEGLTFMaterialOverride(te, nodep->mSavedGLTFOverrideMaterials[te]);
2254+
LLGLTFMaterial* material = new LLGLTFMaterial(*nodep->mSavedGLTFOverrideMaterials[te]);
2255+
objectp->setTEGLTFMaterialOverride(te, material);
22552256

22562257
// Enqueue update to server
22572258
if (asset_id.notNull())
22582259
{
22592260
// Restore overrides and base material
2260-
LLGLTFMaterialList::queueApply(objectp, te, asset_id, nodep->mSavedGLTFOverrideMaterials[te]);
2261+
LLGLTFMaterialList::queueApply(objectp, te, asset_id, material);
22612262
}
22622263
else
22632264
{
@@ -3151,15 +3152,20 @@ void LLSelectMgr::adjustTexturesByScale(bool send_to_sim, bool stretch)
31513152
material->mTextureTransform[i].mScale.set(scale_x, scale_y);
31523153
}
31533154

3154-
LLFetchedGLTFMaterial* render_mat = (LLFetchedGLTFMaterial*)tep->getGLTFRenderMaterial();
3155-
if (render_mat)
3155+
const LLGLTFMaterial* base_material = tep->getGLTFMaterial();
3156+
if (base_material)
31563157
{
3157-
render_mat->applyOverride(*material);
3158+
LLGLTFMaterial* render_material = new LLFetchedGLTFMaterial();
3159+
*render_material = *base_material;
3160+
render_material->applyOverride(*material);
3161+
tep->setGLTFRenderMaterial(render_material);
31583162
}
31593163

31603164
if (send_to_sim)
31613165
{
3162-
LLGLTFMaterialList::queueModify(object, te_num, material);
3166+
LLGLTFMaterial new_override;
3167+
new_override = *material;
3168+
LLGLTFMaterialList::queueModify(object, te_num, &new_override);
31633169
}
31643170
}
31653171
send = send_to_sim;
@@ -5957,12 +5963,12 @@ void LLSelectMgr::processObjectProperties(LLMessageSystem* msg, void** user_data
59575963
LLGLTFMaterial* old_override = node->getObject()->getTE(i)->getGLTFMaterialOverride();
59585964
if (old_override)
59595965
{
5960-
LLPointer<LLGLTFMaterial> mat = new LLGLTFMaterial(*old_override);
5961-
override_materials.push_back(mat);
5966+
// saveGLTFMaterials will make a copy
5967+
override_materials.emplace_back(old_override);
59625968
}
59635969
else
59645970
{
5965-
override_materials.push_back(nullptr);
5971+
override_materials.emplace_back(nullptr);
59665972
}
59675973
}
59685974
// processObjectProperties does not include overrides so this
@@ -6870,16 +6876,22 @@ void LLSelectNode::saveGLTFMaterials(const uuid_vec_t& materials, const gltf_mat
68706876
mSavedGLTFMaterialIds.clear();
68716877
mSavedGLTFOverrideMaterials.clear();
68726878

6873-
for (uuid_vec_t::const_iterator materials_it = materials.begin();
6874-
materials_it != materials.end(); ++materials_it)
6879+
for (const LLUUID& id : materials)
68756880
{
6876-
mSavedGLTFMaterialIds.push_back(*materials_it);
6881+
mSavedGLTFMaterialIds.push_back(id);
68776882
}
68786883

6879-
for (gltf_materials_vec_t::const_iterator mat_it = override_materials.begin();
6880-
mat_it != override_materials.end(); ++mat_it)
6884+
for (const LLPointer<LLGLTFMaterial> &mat : override_materials)
68816885
{
6882-
mSavedGLTFOverrideMaterials.push_back(*mat_it);
6886+
if (mat.notNull())
6887+
{
6888+
LLGLTFMaterial* copy = new LLGLTFMaterial(*mat);
6889+
mSavedGLTFOverrideMaterials.emplace_back(copy);
6890+
}
6891+
else
6892+
{
6893+
mSavedGLTFOverrideMaterials.emplace_back(nullptr);
6894+
}
68836895
}
68846896
}
68856897
}

indra/newview/llselectmgr.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -198,6 +198,8 @@ class LLSelectNode
198198
// final gltf material that users see.
199199
// Ids get applied and restored by tools floater,
200200
// overrides get applied in live material editor
201+
// @param override_materials' content will be copied to not
202+
// affect originals
201203
void saveGLTFMaterials(const uuid_vec_t& materials, const gltf_materials_vec_t& override_materials);
202204

203205
bool allowOperationOnNode(PermissionBit op, U64 group_proxy_power) const;

indra/newview/lltooldraganddrop.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1410,6 +1410,7 @@ void LLToolDragAndDrop::dropTexture(LLViewerObject* hit_obj,
14101410
LLTextureEntry* te = hit_obj->getTE(hit_face);
14111411
if (te && !remove_pbr)
14121412
{
1413+
// saveGLTFMaterials will make a copy
14131414
override_materials.push_back(te->getGLTFMaterialOverride());
14141415
}
14151416
else
@@ -1448,7 +1449,8 @@ void LLToolDragAndDrop::dropTexture(LLViewerObject* hit_obj,
14481449
LLTextureEntry* te = hit_obj->getTE(hit_face);
14491450
if (te && !remove_pbr)
14501451
{
1451-
nodep->mSavedGLTFOverrideMaterials[hit_face] = te->getGLTFMaterialOverride();
1452+
LLGLTFMaterial* copy = new LLGLTFMaterial(*te->getGLTFMaterialOverride());
1453+
nodep->mSavedGLTFOverrideMaterials[hit_face] = copy;
14521454
}
14531455
else
14541456
{

0 commit comments

Comments
 (0)