#3190 Ensure materials are properly copied instead of reused.
parent
3f6d55f4fe
commit
27fb297b6f
|
|
@ -2251,13 +2251,14 @@ void LLSelectMgr::selectionRevertGLTFMaterials()
|
|||
|
||||
// Update material locally
|
||||
objectp->setRenderMaterialID(te, asset_id, false /*wait for LLGLTFMaterialList update*/);
|
||||
objectp->setTEGLTFMaterialOverride(te, nodep->mSavedGLTFOverrideMaterials[te]);
|
||||
LLGLTFMaterial* material = new LLGLTFMaterial(*nodep->mSavedGLTFOverrideMaterials[te]);
|
||||
objectp->setTEGLTFMaterialOverride(te, material);
|
||||
|
||||
// Enqueue update to server
|
||||
if (asset_id.notNull())
|
||||
{
|
||||
// Restore overrides and base material
|
||||
LLGLTFMaterialList::queueApply(objectp, te, asset_id, nodep->mSavedGLTFOverrideMaterials[te]);
|
||||
LLGLTFMaterialList::queueApply(objectp, te, asset_id, material);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
@ -3151,15 +3152,20 @@ void LLSelectMgr::adjustTexturesByScale(bool send_to_sim, bool stretch)
|
|||
material->mTextureTransform[i].mScale.set(scale_x, scale_y);
|
||||
}
|
||||
|
||||
LLFetchedGLTFMaterial* render_mat = (LLFetchedGLTFMaterial*)tep->getGLTFRenderMaterial();
|
||||
if (render_mat)
|
||||
const LLGLTFMaterial* base_material = tep->getGLTFMaterial();
|
||||
if (base_material)
|
||||
{
|
||||
render_mat->applyOverride(*material);
|
||||
LLGLTFMaterial* render_material = new LLFetchedGLTFMaterial();
|
||||
*render_material = *base_material;
|
||||
render_material->applyOverride(*material);
|
||||
tep->setGLTFRenderMaterial(render_material);
|
||||
}
|
||||
|
||||
if (send_to_sim)
|
||||
{
|
||||
LLGLTFMaterialList::queueModify(object, te_num, material);
|
||||
LLGLTFMaterial new_override;
|
||||
new_override = *material;
|
||||
LLGLTFMaterialList::queueModify(object, te_num, &new_override);
|
||||
}
|
||||
}
|
||||
send = send_to_sim;
|
||||
|
|
@ -5957,12 +5963,12 @@ void LLSelectMgr::processObjectProperties(LLMessageSystem* msg, void** user_data
|
|||
LLGLTFMaterial* old_override = node->getObject()->getTE(i)->getGLTFMaterialOverride();
|
||||
if (old_override)
|
||||
{
|
||||
LLPointer<LLGLTFMaterial> mat = new LLGLTFMaterial(*old_override);
|
||||
override_materials.push_back(mat);
|
||||
// saveGLTFMaterials will make a copy
|
||||
override_materials.emplace_back(old_override);
|
||||
}
|
||||
else
|
||||
{
|
||||
override_materials.push_back(nullptr);
|
||||
override_materials.emplace_back(nullptr);
|
||||
}
|
||||
}
|
||||
// processObjectProperties does not include overrides so this
|
||||
|
|
@ -6870,16 +6876,22 @@ void LLSelectNode::saveGLTFMaterials(const uuid_vec_t& materials, const gltf_mat
|
|||
mSavedGLTFMaterialIds.clear();
|
||||
mSavedGLTFOverrideMaterials.clear();
|
||||
|
||||
for (uuid_vec_t::const_iterator materials_it = materials.begin();
|
||||
materials_it != materials.end(); ++materials_it)
|
||||
for (const LLUUID& id : materials)
|
||||
{
|
||||
mSavedGLTFMaterialIds.push_back(*materials_it);
|
||||
mSavedGLTFMaterialIds.push_back(id);
|
||||
}
|
||||
|
||||
for (gltf_materials_vec_t::const_iterator mat_it = override_materials.begin();
|
||||
mat_it != override_materials.end(); ++mat_it)
|
||||
for (const LLPointer<LLGLTFMaterial> &mat : override_materials)
|
||||
{
|
||||
mSavedGLTFOverrideMaterials.push_back(*mat_it);
|
||||
if (mat.notNull())
|
||||
{
|
||||
LLGLTFMaterial* copy = new LLGLTFMaterial(*mat);
|
||||
mSavedGLTFOverrideMaterials.emplace_back(copy);
|
||||
}
|
||||
else
|
||||
{
|
||||
mSavedGLTFOverrideMaterials.emplace_back(nullptr);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -198,6 +198,8 @@ public:
|
|||
// final gltf material that users see.
|
||||
// Ids get applied and restored by tools floater,
|
||||
// overrides get applied in live material editor
|
||||
// @param override_materials' content will be copied to not
|
||||
// affect originals
|
||||
void saveGLTFMaterials(const uuid_vec_t& materials, const gltf_materials_vec_t& override_materials);
|
||||
|
||||
bool allowOperationOnNode(PermissionBit op, U64 group_proxy_power) const;
|
||||
|
|
|
|||
|
|
@ -1410,6 +1410,7 @@ void LLToolDragAndDrop::dropTexture(LLViewerObject* hit_obj,
|
|||
LLTextureEntry* te = hit_obj->getTE(hit_face);
|
||||
if (te && !remove_pbr)
|
||||
{
|
||||
// saveGLTFMaterials will make a copy
|
||||
override_materials.push_back(te->getGLTFMaterialOverride());
|
||||
}
|
||||
else
|
||||
|
|
@ -1448,7 +1449,8 @@ void LLToolDragAndDrop::dropTexture(LLViewerObject* hit_obj,
|
|||
LLTextureEntry* te = hit_obj->getTE(hit_face);
|
||||
if (te && !remove_pbr)
|
||||
{
|
||||
nodep->mSavedGLTFOverrideMaterials[hit_face] = te->getGLTFMaterialOverride();
|
||||
LLGLTFMaterial* copy = new LLGLTFMaterial(*te->getGLTFMaterialOverride());
|
||||
nodep->mSavedGLTFOverrideMaterials[hit_face] = copy;
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
|
|||
Loading…
Reference in New Issue