Skip to content

Commit 1446d59

Browse files
committed
fix: preserve texture transforms when switching materials
1 parent da928de commit 1446d59

File tree

5 files changed

+130
-53
lines changed

5 files changed

+130
-53
lines changed

indra/llprimitive/llgltfmaterial.cpp

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -923,3 +923,34 @@ void LLGLTFMaterial::updateTextureTracking()
923923
// setTEGLTFMaterialOverride is responsible for tracking
924924
// for material overrides editor will set it
925925
}
926+
927+
void LLGLTFMaterial::convertTextureTransformToPBR(
928+
F32 tex_scale_s,
929+
F32 tex_scale_t,
930+
F32 tex_offset_s,
931+
F32 tex_offset_t,
932+
F32 tex_rotation,
933+
LLVector2& pbr_scale,
934+
LLVector2& pbr_offset,
935+
F32& pbr_rotation)
936+
{
937+
pbr_scale.set(tex_scale_s, tex_scale_t);
938+
pbr_rotation = -(tex_rotation) / 2.f;
939+
const F32 adjusted_offset_s = tex_offset_s;
940+
const F32 adjusted_offset_t = -tex_offset_t;
941+
F32 center_adjust_s = 0.5f * (1.0f - tex_scale_s);
942+
F32 center_adjust_t = 0.5f * (1.0f - tex_scale_t);
943+
944+
if (pbr_rotation != 0.0f)
945+
{
946+
const F32 c = cosf(pbr_rotation);
947+
const F32 s = sinf(pbr_rotation);
948+
const F32 tmp_s = center_adjust_s * c - center_adjust_t * s;
949+
const F32 tmp_t = center_adjust_s * s + center_adjust_t * c;
950+
center_adjust_s = tmp_s;
951+
center_adjust_t = tmp_t;
952+
}
953+
954+
pbr_offset.set(adjusted_offset_s + center_adjust_s,
955+
adjusted_offset_t + center_adjust_t);
956+
}

indra/llprimitive/llgltfmaterial.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -214,6 +214,14 @@ class LLGLTFMaterial : public LLRefCount
214214
bool hasLocalTextures() { return !mTrackingIdToLocalTexture.empty(); }
215215
virtual bool replaceLocalTexture(const LLUUID& tracking_id, const LLUUID &old_id, const LLUUID& new_id);
216216
virtual void updateTextureTracking();
217+
218+
// Convert legacy TE transform values to PBR transform values.
219+
static void convertTextureTransformToPBR(F32 tex_scale_s, F32 tex_scale_t,
220+
F32 tex_offset_s, F32 tex_offset_t,
221+
F32 tex_rotation,
222+
LLVector2& pbr_scale,
223+
LLVector2& pbr_offset,
224+
F32& pbr_rotation);
217225
protected:
218226
static LLVector2 vec2FromJson(const std::map<std::string, tinygltf::Value>& object, const char* key, const LLVector2& default_value);
219227
static F32 floatFromJson(const std::map<std::string, tinygltf::Value>& object, const char* key, const F32 default_value);

indra/newview/llgltfmateriallist.cpp

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -380,17 +380,6 @@ void LLGLTFMaterialList::queueApply(const LLViewerObject* obj, S32 side, const L
380380
LLGLTFMaterial* material = new LLGLTFMaterial(*material_override);
381381
sApplyQueue.push_back({ obj->getID(), side, asset_id, material });
382382
}
383-
384-
if (sUpdates.size() >= MAX_TASK_UPDATES)
385-
{
386-
LLCoros::instance().launch("modifyMaterialCoro",
387-
std::bind(&LLGLTFMaterialList::modifyMaterialCoro,
388-
gAgent.getRegionCapability("ModifyMaterialParams"),
389-
sUpdates,
390-
std::shared_ptr<CallbackHolder>(nullptr)));
391-
392-
sUpdates = LLSD::emptyArray();
393-
}
394383
}
395384

396385
void LLGLTFMaterialList::queueUpdate(const LLSD& data)

indra/newview/llselectmgr.cpp

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1997,6 +1997,14 @@ bool LLSelectMgr::selectionSetGLTFMaterial(const LLUUID& mat_id)
19971997
}
19981998
}
19991999

2000+
// If this face already has the target material ID, do nothing.
2001+
// This prevents re-sending the same ID on OK, which can cause the server
2002+
// to drop overrides when queueApply is invoked with the OLD id.
2003+
if (objectp->getRenderMaterialID(te) == asset_id)
2004+
{
2005+
return true;
2006+
}
2007+
20002008
// Preserve existing texture transforms when switching to PBR material
20012009
LLTextureEntry* tep = objectp->getTE(te);
20022010
bool should_preserve_transforms = false;
@@ -2047,9 +2055,16 @@ bool LLSelectMgr::selectionSetGLTFMaterial(const LLUUID& mat_id)
20472055
preserved_override = new LLGLTFMaterial();
20482056
for (U32 i = 0; i < LLGLTFMaterial::GLTF_TEXTURE_INFO_COUNT; ++i)
20492057
{
2050-
preserved_override->mTextureTransform[i].mScale.set(existing_scale_s, existing_scale_t);
2051-
preserved_override->mTextureTransform[i].mOffset.set(existing_offset_s, existing_offset_t);
2052-
preserved_override->mTextureTransform[i].mRotation = existing_rotation;
2058+
LLVector2 pbr_scale, pbr_offset;
2059+
F32 pbr_rotation;
2060+
LLGLTFMaterial::convertTextureTransformToPBR(
2061+
existing_scale_s, existing_scale_t,
2062+
existing_offset_s, existing_offset_t,
2063+
existing_rotation,
2064+
pbr_scale, pbr_offset, pbr_rotation);
2065+
preserved_override->mTextureTransform[i].mScale = pbr_scale;
2066+
preserved_override->mTextureTransform[i].mOffset = pbr_offset;
2067+
preserved_override->mTextureTransform[i].mRotation = pbr_rotation;
20532068
}
20542069
should_preserve_transforms = true;
20552070
}

indra/newview/lltooldraganddrop.cpp

Lines changed: 73 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -1311,8 +1311,8 @@ void LLToolDragAndDrop::dropMaterialOneFace(LLViewerObject* hit_obj,
13111311

13121312
if (tep && asset_id.notNull())
13131313
{
1314-
// Check if we have non-default texture transforms to preserve
1315-
// First check GLTF material override, then fall back to texture entry
1314+
// Only preserve transforms from existing GLTF material override
1315+
// Do not fall back to texture entry transforms when switching between PBR materials
13161316
LLGLTFMaterial* existing_override = tep->getGLTFMaterialOverride();
13171317
if (existing_override)
13181318
{
@@ -1324,50 +1324,48 @@ void LLToolDragAndDrop::dropMaterialOneFace(LLViewerObject* hit_obj,
13241324
existing_transform.mOffset != default_transform.mOffset ||
13251325
existing_transform.mRotation != default_transform.mRotation)
13261326
{
1327-
// Read from existing GLTF material override
1328-
existing_scale_s = existing_transform.mScale.mV[0];
1329-
existing_scale_t = existing_transform.mScale.mV[1];
1330-
existing_offset_s = existing_transform.mOffset.mV[0];
1331-
existing_offset_t = existing_transform.mOffset.mV[1];
1332-
existing_rotation = existing_transform.mRotation;
1327+
// Preserve non-default transforms from current PBR material
1328+
preserved_override = new LLGLTFMaterial();
1329+
for (U32 i = 0; i < LLGLTFMaterial::GLTF_TEXTURE_INFO_COUNT; ++i)
1330+
{
1331+
preserved_override->mTextureTransform[i].mScale = existing_transform.mScale;
1332+
preserved_override->mTextureTransform[i].mOffset = existing_transform.mOffset;
1333+
preserved_override->mTextureTransform[i].mRotation = existing_transform.mRotation;
1334+
}
13331335
should_preserve_transforms = true;
13341336
}
1335-
else
1336-
{
1337-
// Existing override has default transforms, fall back to texture entry
1338-
tep->getScale(&existing_scale_s, &existing_scale_t);
1339-
tep->getOffset(&existing_offset_s, &existing_offset_t);
1340-
existing_rotation = tep->getRotation();
1341-
1342-
should_preserve_transforms = (existing_scale_s != default_transform.mScale.mV[0] || existing_scale_t != default_transform.mScale.mV[1] ||
1343-
existing_offset_s != default_transform.mOffset.mV[0] || existing_offset_t != default_transform.mOffset.mV[1] ||
1344-
existing_rotation != default_transform.mRotation);
1345-
}
1337+
// If existing override has default transforms, don't preserve anything
13461338
}
13471339
else
13481340
{
1349-
// No existing override, check texture entry transforms
1341+
// No existing PBR material override - check texture entry transforms
1342+
// This handles the case of switching from Blinn-Phong to PBR material
1343+
F32 existing_scale_s, existing_scale_t, existing_offset_s, existing_offset_t, existing_rotation;
13501344
tep->getScale(&existing_scale_s, &existing_scale_t);
13511345
tep->getOffset(&existing_offset_s, &existing_offset_t);
13521346
existing_rotation = tep->getRotation();
13531347

1354-
// Only preserve if texture entry transforms are non-default
13551348
const LLGLTFMaterial::TextureTransform& default_transform = LLGLTFMaterial::TextureTransform();
1356-
should_preserve_transforms = (existing_scale_s != default_transform.mScale.mV[0] || existing_scale_t != default_transform.mScale.mV[1] ||
1357-
existing_offset_s != default_transform.mOffset.mV[0] || existing_offset_t != default_transform.mOffset.mV[1] ||
1358-
existing_rotation != default_transform.mRotation);
1359-
}
1360-
1361-
// Create override material with preserved transforms if needed
1362-
if (should_preserve_transforms)
1363-
{
1364-
preserved_override = new LLGLTFMaterial();
1365-
// Transfer texture entry transforms to all PBR texture channels
1366-
for (U32 i = 0; i < LLGLTFMaterial::GLTF_TEXTURE_INFO_COUNT; ++i)
1349+
if (existing_scale_s != default_transform.mScale.mV[0] || existing_scale_t != default_transform.mScale.mV[1] ||
1350+
existing_offset_s != default_transform.mOffset.mV[0] || existing_offset_t != default_transform.mOffset.mV[1] ||
1351+
existing_rotation != default_transform.mRotation)
13671352
{
1368-
preserved_override->mTextureTransform[i].mScale.set(existing_scale_s, existing_scale_t);
1369-
preserved_override->mTextureTransform[i].mOffset.set(existing_offset_s, existing_offset_t);
1370-
preserved_override->mTextureTransform[i].mRotation = existing_rotation;
1353+
// Preserve non-default transforms from texture entry
1354+
preserved_override = new LLGLTFMaterial();
1355+
for (U32 i = 0; i < LLGLTFMaterial::GLTF_TEXTURE_INFO_COUNT; ++i)
1356+
{
1357+
LLVector2 pbr_scale, pbr_offset;
1358+
F32 pbr_rotation;
1359+
LLGLTFMaterial::convertTextureTransformToPBR(
1360+
existing_scale_s, existing_scale_t,
1361+
existing_offset_s, existing_offset_t,
1362+
existing_rotation,
1363+
pbr_scale, pbr_offset, pbr_rotation);
1364+
preserved_override->mTextureTransform[i].mScale = pbr_scale;
1365+
preserved_override->mTextureTransform[i].mOffset = pbr_offset;
1366+
preserved_override->mTextureTransform[i].mRotation = pbr_rotation;
1367+
}
1368+
should_preserve_transforms = true;
13711369
}
13721370
}
13731371
}
@@ -1455,7 +1453,36 @@ void LLToolDragAndDrop::dropMaterialAllFaces(LLViewerObject* hit_obj,
14551453
}
14561454
should_preserve = true;
14571455
}
1458-
// If existing override has default transforms, don't preserve anything
1456+
else
1457+
{
1458+
// Existing override has default transforms, fall back to texture entry
1459+
F32 existing_scale_s, existing_scale_t, existing_offset_s, existing_offset_t, existing_rotation;
1460+
tep->getScale(&existing_scale_s, &existing_scale_t);
1461+
tep->getOffset(&existing_offset_s, &existing_offset_t);
1462+
existing_rotation = tep->getRotation();
1463+
1464+
if (existing_scale_s != default_transform.mScale.mV[0] || existing_scale_t != default_transform.mScale.mV[1] ||
1465+
existing_offset_s != default_transform.mOffset.mV[0] || existing_offset_t != default_transform.mOffset.mV[1] ||
1466+
existing_rotation != default_transform.mRotation)
1467+
{
1468+
// Preserve non-default transforms from texture entry
1469+
preserved_override = new LLGLTFMaterial();
1470+
for (U32 i = 0; i < LLGLTFMaterial::GLTF_TEXTURE_INFO_COUNT; ++i)
1471+
{
1472+
LLVector2 pbr_scale, pbr_offset;
1473+
F32 pbr_rotation;
1474+
LLGLTFMaterial::convertTextureTransformToPBR(
1475+
existing_scale_s, existing_scale_t,
1476+
existing_offset_s, existing_offset_t,
1477+
existing_rotation,
1478+
pbr_scale, pbr_offset, pbr_rotation);
1479+
preserved_override->mTextureTransform[i].mScale = pbr_scale;
1480+
preserved_override->mTextureTransform[i].mOffset = pbr_offset;
1481+
preserved_override->mTextureTransform[i].mRotation = pbr_rotation;
1482+
}
1483+
should_preserve = true;
1484+
}
1485+
}
14591486
}
14601487
else
14611488
{
@@ -1475,9 +1502,16 @@ void LLToolDragAndDrop::dropMaterialAllFaces(LLViewerObject* hit_obj,
14751502
preserved_override = new LLGLTFMaterial();
14761503
for (U32 i = 0; i < LLGLTFMaterial::GLTF_TEXTURE_INFO_COUNT; ++i)
14771504
{
1478-
preserved_override->mTextureTransform[i].mScale.set(existing_scale_s, existing_scale_t);
1479-
preserved_override->mTextureTransform[i].mOffset.set(existing_offset_s, existing_offset_t);
1480-
preserved_override->mTextureTransform[i].mRotation = existing_rotation;
1505+
LLVector2 pbr_scale, pbr_offset;
1506+
F32 pbr_rotation;
1507+
LLGLTFMaterial::convertTextureTransformToPBR(
1508+
existing_scale_s, existing_scale_t,
1509+
existing_offset_s, existing_offset_t,
1510+
existing_rotation,
1511+
pbr_scale, pbr_offset, pbr_rotation);
1512+
preserved_override->mTextureTransform[i].mScale = pbr_scale;
1513+
preserved_override->mTextureTransform[i].mOffset = pbr_offset;
1514+
preserved_override->mTextureTransform[i].mRotation = pbr_rotation;
14811515
}
14821516
should_preserve = true;
14831517
}

0 commit comments

Comments
 (0)