Skip to content

Commit da928de

Browse files
committed
Fix PBR material transform persistence
1 parent ec3fe8c commit da928de

File tree

2 files changed

+251
-2
lines changed

2 files changed

+251
-2
lines changed

indra/newview/llselectmgr.cpp

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1996,9 +1996,81 @@ bool LLSelectMgr::selectionSetGLTFMaterial(const LLUUID& mat_id)
19961996
asset_id = BLANK_MATERIAL_ASSET_ID;
19971997
}
19981998
}
1999+
2000+
// Preserve existing texture transforms when switching to PBR material
2001+
LLTextureEntry* tep = objectp->getTE(te);
2002+
bool should_preserve_transforms = false;
2003+
LLGLTFMaterial* preserved_override = nullptr;
2004+
2005+
if (tep && asset_id.notNull())
2006+
{
2007+
// Only preserve transforms from existing GLTF material override
2008+
// Do not fall back to texture entry transforms when switching between PBR materials
2009+
LLGLTFMaterial* existing_override = tep->getGLTFMaterialOverride();
2010+
if (existing_override)
2011+
{
2012+
// Check if existing override has non-default transforms
2013+
const LLGLTFMaterial::TextureTransform& existing_transform = existing_override->mTextureTransform[0];
2014+
const LLGLTFMaterial::TextureTransform& default_transform = LLGLTFMaterial::TextureTransform();
2015+
2016+
if (existing_transform.mScale != default_transform.mScale ||
2017+
existing_transform.mOffset != default_transform.mOffset ||
2018+
existing_transform.mRotation != default_transform.mRotation)
2019+
{
2020+
// Preserve non-default transforms from current PBR material
2021+
preserved_override = new LLGLTFMaterial();
2022+
for (U32 i = 0; i < LLGLTFMaterial::GLTF_TEXTURE_INFO_COUNT; ++i)
2023+
{
2024+
preserved_override->mTextureTransform[i].mScale = existing_transform.mScale;
2025+
preserved_override->mTextureTransform[i].mOffset = existing_transform.mOffset;
2026+
preserved_override->mTextureTransform[i].mRotation = existing_transform.mRotation;
2027+
}
2028+
should_preserve_transforms = true;
2029+
}
2030+
// If existing override has default transforms, don't preserve anything
2031+
}
2032+
else
2033+
{
2034+
// No existing PBR material override - check texture entry transforms
2035+
// This handles the case of switching from Blinn-Phong to PBR material
2036+
F32 existing_scale_s, existing_scale_t, existing_offset_s, existing_offset_t, existing_rotation;
2037+
tep->getScale(&existing_scale_s, &existing_scale_t);
2038+
tep->getOffset(&existing_offset_s, &existing_offset_t);
2039+
existing_rotation = tep->getRotation();
2040+
2041+
const LLGLTFMaterial::TextureTransform& default_transform = LLGLTFMaterial::TextureTransform();
2042+
if (existing_scale_s != default_transform.mScale.mV[0] || existing_scale_t != default_transform.mScale.mV[1] ||
2043+
existing_offset_s != default_transform.mOffset.mV[0] || existing_offset_t != default_transform.mOffset.mV[1] ||
2044+
existing_rotation != default_transform.mRotation)
2045+
{
2046+
// Preserve non-default transforms from texture entry
2047+
preserved_override = new LLGLTFMaterial();
2048+
for (U32 i = 0; i < LLGLTFMaterial::GLTF_TEXTURE_INFO_COUNT; ++i)
2049+
{
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;
2053+
}
2054+
should_preserve_transforms = true;
2055+
}
2056+
}
2057+
}
2058+
19992059
objectp->clearTEWaterExclusion(te);
20002060
// Blank out most override data on the object and send to server
20012061
objectp->setRenderMaterialID(te, asset_id);
2062+
if (should_preserve_transforms && preserved_override)
2063+
{
2064+
// Apply material with preserved transforms
2065+
LLGLTFMaterialList::queueApply(objectp, te, asset_id, preserved_override);
2066+
// Update local state
2067+
objectp->setRenderMaterialID(te, asset_id, false, true);
2068+
tep->setGLTFMaterialOverride(preserved_override);
2069+
}
2070+
else
2071+
{
2072+
objectp->setRenderMaterialID(te, asset_id);
2073+
}
20022074

20032075
return true;
20042076
}

indra/newview/lltooldraganddrop.cpp

Lines changed: 179 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,8 @@
2929

3030
// library headers
3131
#include "llnotificationsutil.h"
32+
#include <vector>
33+
#include <tuple>
3234
// project headers
3335
#include "llagent.h"
3436
#include "llagentcamera.h"
@@ -1297,7 +1299,91 @@ void LLToolDragAndDrop::dropMaterialOneFace(LLViewerObject* hit_obj,
12971299
asset_id = BLANK_MATERIAL_ASSET_ID;
12981300
}
12991301

1300-
hit_obj->setRenderMaterialID(hit_face, asset_id);
1302+
// Preserve existing texture transforms when switching to PBR material
1303+
LLTextureEntry* tep = hit_obj->getTE(hit_face);
1304+
F32 existing_scale_s = LLGLTFMaterial::TextureTransform().mScale.mV[0];
1305+
F32 existing_scale_t = LLGLTFMaterial::TextureTransform().mScale.mV[1];
1306+
F32 existing_offset_s = LLGLTFMaterial::TextureTransform().mOffset.mV[0];
1307+
F32 existing_offset_t = LLGLTFMaterial::TextureTransform().mOffset.mV[1];
1308+
F32 existing_rotation = LLGLTFMaterial::TextureTransform().mRotation;
1309+
bool should_preserve_transforms = false;
1310+
LLGLTFMaterial* preserved_override = nullptr;
1311+
1312+
if (tep && asset_id.notNull())
1313+
{
1314+
// Check if we have non-default texture transforms to preserve
1315+
// First check GLTF material override, then fall back to texture entry
1316+
LLGLTFMaterial* existing_override = tep->getGLTFMaterialOverride();
1317+
if (existing_override)
1318+
{
1319+
// Check if existing override has non-default transforms
1320+
const LLGLTFMaterial::TextureTransform& existing_transform = existing_override->mTextureTransform[0];
1321+
const LLGLTFMaterial::TextureTransform& default_transform = LLGLTFMaterial::TextureTransform();
1322+
1323+
if (existing_transform.mScale != default_transform.mScale ||
1324+
existing_transform.mOffset != default_transform.mOffset ||
1325+
existing_transform.mRotation != default_transform.mRotation)
1326+
{
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;
1333+
should_preserve_transforms = true;
1334+
}
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+
}
1346+
}
1347+
else
1348+
{
1349+
// No existing override, check texture entry transforms
1350+
tep->getScale(&existing_scale_s, &existing_scale_t);
1351+
tep->getOffset(&existing_offset_s, &existing_offset_t);
1352+
existing_rotation = tep->getRotation();
1353+
1354+
// Only preserve if texture entry transforms are non-default
1355+
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)
1367+
{
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;
1371+
}
1372+
}
1373+
}
1374+
1375+
if (should_preserve_transforms && preserved_override)
1376+
{
1377+
// Apply material with preserved transforms
1378+
LLGLTFMaterialList::queueApply(hit_obj, hit_face, asset_id, preserved_override);
1379+
// Update local state
1380+
hit_obj->setRenderMaterialID(hit_face, asset_id, false, true);
1381+
tep->setGLTFMaterialOverride(preserved_override);
1382+
}
1383+
else
1384+
{
1385+
hit_obj->setRenderMaterialID(hit_face, asset_id);
1386+
}
13011387

13021388
dialog_refresh_all();
13031389

@@ -1333,7 +1419,98 @@ void LLToolDragAndDrop::dropMaterialAllFaces(LLViewerObject* hit_obj,
13331419
asset_id = BLANK_MATERIAL_ASSET_ID;
13341420
}
13351421

1336-
hit_obj->setRenderMaterialIDs(asset_id);
1422+
// Preserve existing texture transforms when switching to PBR material for all faces
1423+
std::vector<std::pair<bool, LLGLTFMaterial*>> preserved_transforms(hit_obj->getNumTEs());
1424+
1425+
if (asset_id.notNull())
1426+
{
1427+
for (S32 te = 0; te < hit_obj->getNumTEs(); ++te)
1428+
{
1429+
LLTextureEntry* tep = hit_obj->getTE(te);
1430+
if (!tep) continue;
1431+
1432+
bool should_preserve = false;
1433+
LLGLTFMaterial* preserved_override = nullptr;
1434+
1435+
// Only preserve transforms from existing GLTF material override
1436+
// Do not fall back to texture entry transforms when switching between PBR materials
1437+
LLGLTFMaterial* existing_override = tep->getGLTFMaterialOverride();
1438+
if (existing_override)
1439+
{
1440+
// Check if existing override has non-default transforms
1441+
const LLGLTFMaterial::TextureTransform& existing_transform = existing_override->mTextureTransform[0];
1442+
const LLGLTFMaterial::TextureTransform& default_transform = LLGLTFMaterial::TextureTransform();
1443+
1444+
if (existing_transform.mScale != default_transform.mScale ||
1445+
existing_transform.mOffset != default_transform.mOffset ||
1446+
existing_transform.mRotation != default_transform.mRotation)
1447+
{
1448+
// Preserve non-default transforms from current PBR material
1449+
preserved_override = new LLGLTFMaterial();
1450+
for (U32 i = 0; i < LLGLTFMaterial::GLTF_TEXTURE_INFO_COUNT; ++i)
1451+
{
1452+
preserved_override->mTextureTransform[i].mScale = existing_transform.mScale;
1453+
preserved_override->mTextureTransform[i].mOffset = existing_transform.mOffset;
1454+
preserved_override->mTextureTransform[i].mRotation = existing_transform.mRotation;
1455+
}
1456+
should_preserve = true;
1457+
}
1458+
// If existing override has default transforms, don't preserve anything
1459+
}
1460+
else
1461+
{
1462+
// No existing PBR material override - check texture entry transforms
1463+
// This handles the case of switching from Blinn-Phong to PBR material
1464+
F32 existing_scale_s, existing_scale_t, existing_offset_s, existing_offset_t, existing_rotation;
1465+
tep->getScale(&existing_scale_s, &existing_scale_t);
1466+
tep->getOffset(&existing_offset_s, &existing_offset_t);
1467+
existing_rotation = tep->getRotation();
1468+
1469+
const LLGLTFMaterial::TextureTransform& default_transform = LLGLTFMaterial::TextureTransform();
1470+
if (existing_scale_s != default_transform.mScale.mV[0] || existing_scale_t != default_transform.mScale.mV[1] ||
1471+
existing_offset_s != default_transform.mOffset.mV[0] || existing_offset_t != default_transform.mOffset.mV[1] ||
1472+
existing_rotation != default_transform.mRotation)
1473+
{
1474+
// Preserve non-default transforms from texture entry
1475+
preserved_override = new LLGLTFMaterial();
1476+
for (U32 i = 0; i < LLGLTFMaterial::GLTF_TEXTURE_INFO_COUNT; ++i)
1477+
{
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;
1481+
}
1482+
should_preserve = true;
1483+
}
1484+
}
1485+
1486+
preserved_transforms[te] = std::make_pair(should_preserve, preserved_override);
1487+
}
1488+
}
1489+
1490+
// Apply materials with preserved transforms
1491+
if (asset_id.notNull())
1492+
{
1493+
for (S32 te = 0; te < hit_obj->getNumTEs(); ++te)
1494+
{
1495+
LLGLTFMaterial* preserved_override = preserved_transforms[te].second;
1496+
if (preserved_override)
1497+
{
1498+
// Apply material with preserved transforms
1499+
LLGLTFMaterialList::queueApply(hit_obj, te, asset_id, preserved_override);
1500+
// Update local state
1501+
hit_obj->setRenderMaterialID(te, asset_id, false, true);
1502+
hit_obj->getTE(te)->setGLTFMaterialOverride(preserved_override);
1503+
}
1504+
else
1505+
{
1506+
hit_obj->setRenderMaterialID(te, asset_id, false, true);
1507+
}
1508+
}
1509+
}
1510+
else
1511+
{
1512+
hit_obj->setRenderMaterialIDs(asset_id);
1513+
}
13371514
dialog_refresh_all();
13381515
// send the update to the simulator
13391516
hit_obj->sendTEUpdate();

0 commit comments

Comments
 (0)