summaryrefslogtreecommitdiff
path: root/indra/newview/llselectmgr.cpp
diff options
context:
space:
mode:
authorErik Kundiman <erik@megapahit.org>2025-10-23 12:00:12 +0800
committerErik Kundiman <erik@megapahit.org>2025-10-25 20:03:33 +0800
commitab9976389fe5e4c254d3eb2c39fd2dff083d8d2d (patch)
treecf14ec0d25efd065a1471debb74080ef41763fbf /indra/newview/llselectmgr.cpp
parent790a7d1ccfa5b1a20a3b5295f839670793ced950 (diff)
parent01823996196c11aea905200fe267463d520d285b (diff)
Merge tag 'Second_Life_Release#01823996-2025.08' into 2025.08
Diffstat (limited to 'indra/newview/llselectmgr.cpp')
-rw-r--r--indra/newview/llselectmgr.cpp103
1 files changed, 88 insertions, 15 deletions
diff --git a/indra/newview/llselectmgr.cpp b/indra/newview/llselectmgr.cpp
index 329522f18c..e171136ffa 100644
--- a/indra/newview/llselectmgr.cpp
+++ b/indra/newview/llselectmgr.cpp
@@ -1996,9 +1996,96 @@ bool LLSelectMgr::selectionSetGLTFMaterial(const LLUUID& mat_id)
asset_id = BLANK_MATERIAL_ASSET_ID;
}
}
+
+ // If this face already has the target material ID, do nothing.
+ // This prevents re-sending the same ID on OK, which can cause the server
+ // to drop overrides when queueApply is invoked with the OLD id.
+ if (objectp->getRenderMaterialID(te) == asset_id)
+ {
+ return true;
+ }
+
+ // Preserve existing texture transforms when switching to PBR material
+ LLTextureEntry* tep = objectp->getTE(te);
+ bool should_preserve_transforms = false;
+ LLGLTFMaterial* preserved_override = nullptr;
+
+ if (tep && asset_id.notNull())
+ {
+ // Only preserve transforms from existing GLTF material override
+ // Do not fall back to texture entry transforms when switching between PBR materials
+ LLGLTFMaterial* existing_override = tep->getGLTFMaterialOverride();
+ if (existing_override)
+ {
+ // Check if existing override has non-default transforms
+ const LLGLTFMaterial::TextureTransform& existing_transform = existing_override->mTextureTransform[0];
+ const LLGLTFMaterial::TextureTransform& default_transform = LLGLTFMaterial::TextureTransform();
+
+ if (existing_transform.mScale != default_transform.mScale ||
+ existing_transform.mOffset != default_transform.mOffset ||
+ existing_transform.mRotation != default_transform.mRotation)
+ {
+ // Preserve non-default transforms from current PBR material
+ preserved_override = new LLGLTFMaterial();
+ for (U32 i = 0; i < LLGLTFMaterial::GLTF_TEXTURE_INFO_COUNT; ++i)
+ {
+ preserved_override->mTextureTransform[i].mScale = existing_transform.mScale;
+ preserved_override->mTextureTransform[i].mOffset = existing_transform.mOffset;
+ preserved_override->mTextureTransform[i].mRotation = existing_transform.mRotation;
+ }
+ should_preserve_transforms = true;
+ }
+ // If existing override has default transforms, don't preserve anything
+ }
+ else
+ {
+ // No existing PBR material override - check texture entry transforms
+ // This handles the case of switching from Blinn-Phong to PBR material
+ F32 existing_scale_s, existing_scale_t, existing_offset_s, existing_offset_t, existing_rotation;
+ tep->getScale(&existing_scale_s, &existing_scale_t);
+ tep->getOffset(&existing_offset_s, &existing_offset_t);
+ existing_rotation = tep->getRotation();
+
+ const LLGLTFMaterial::TextureTransform& default_transform = LLGLTFMaterial::TextureTransform();
+ if (existing_scale_s != default_transform.mScale.mV[0] || existing_scale_t != default_transform.mScale.mV[1] ||
+ existing_offset_s != default_transform.mOffset.mV[0] || existing_offset_t != default_transform.mOffset.mV[1] ||
+ existing_rotation != default_transform.mRotation)
+ {
+ // Preserve non-default transforms from texture entry
+ preserved_override = new LLGLTFMaterial();
+ for (U32 i = 0; i < LLGLTFMaterial::GLTF_TEXTURE_INFO_COUNT; ++i)
+ {
+ LLVector2 pbr_scale, pbr_offset;
+ F32 pbr_rotation;
+ LLGLTFMaterial::convertTextureTransformToPBR(
+ existing_scale_s, existing_scale_t,
+ existing_offset_s, existing_offset_t,
+ existing_rotation,
+ pbr_scale, pbr_offset, pbr_rotation);
+ preserved_override->mTextureTransform[i].mScale = pbr_scale;
+ preserved_override->mTextureTransform[i].mOffset = pbr_offset;
+ preserved_override->mTextureTransform[i].mRotation = pbr_rotation;
+ }
+ should_preserve_transforms = true;
+ }
+ }
+ }
+
objectp->clearTEWaterExclusion(te);
// Blank out most override data on the object and send to server
objectp->setRenderMaterialID(te, asset_id);
+ if (should_preserve_transforms && preserved_override)
+ {
+ // Apply material with preserved transforms
+ LLGLTFMaterialList::queueApply(objectp, te, asset_id, preserved_override);
+ // Update local state
+ objectp->setRenderMaterialID(te, asset_id, false, true);
+ tep->setGLTFMaterialOverride(preserved_override);
+ }
+ else
+ {
+ objectp->setRenderMaterialID(te, asset_id);
+ }
return true;
}
@@ -2265,23 +2352,9 @@ void LLSelectMgr::selectionRevertGLTFMaterials()
//blank override out
LLGLTFMaterialList::queueApply(objectp, te, asset_id);
}
- if (old_asset_id != asset_id)
- {
- // Restore overrides and base material
- // Note: might not work reliably if asset is already there, might
- // have a server sided problem where servers applies override
- // first then resets it by adding asset, in which case need
- // to create a server ticket and chain asset then override
- // application.
- LLGLTFMaterialList::queueApply(objectp, te, asset_id, material);
- }
else
{
- // Enqueue override update to server
- // Note: this is suboptimal, better to send asset id as well
- // but there seems to be a server problem with queueApply
- // that ignores override in some cases
- LLGLTFMaterialList::queueModify(objectp, te, material);
+ LLGLTFMaterialList::queueApply(objectp, te, asset_id, material);
}
}
return true;