summaryrefslogtreecommitdiff
path: root/indra/newview/lltexturectrl.cpp
diff options
context:
space:
mode:
authorAndrey Kleshchev <117672381+akleshchev@users.noreply.github.com>2026-03-18 01:59:22 +0200
committerAndrey Kleshchev <117672381+akleshchev@users.noreply.github.com>2026-03-20 03:15:28 +0200
commit166fa85705bd7501a1af81d4b529fa4b83038be7 (patch)
tree7011e1e575804da5baf5af4b1c6af30dd6c29425 /indra/newview/lltexturectrl.cpp
parent0aa33a144d392c16eaa419ffefa7c98af2e37834 (diff)
#5543 PBR support for pipette
Diffstat (limited to 'indra/newview/lltexturectrl.cpp')
-rw-r--r--indra/newview/lltexturectrl.cpp96
1 files changed, 74 insertions, 22 deletions
diff --git a/indra/newview/lltexturectrl.cpp b/indra/newview/lltexturectrl.cpp
index 52ec8c17c1..f0655901f7 100644
--- a/indra/newview/lltexturectrl.cpp
+++ b/indra/newview/lltexturectrl.cpp
@@ -658,7 +658,10 @@ bool LLFloaterTexturePicker::postBuild()
mSavedFolderState.setApply(false);
- LLToolPipette::getInstance()->setToolSelectCallback(boost::bind(&LLFloaterTexturePicker::onTextureSelect, this, _1));
+ mPipetteConnection = LLToolPipette::getInstance()->setToolSelectCallback([this](LLPointer<LLViewerObject> object, S32 te_index)
+ {
+ onPipetteSelect(object, te_index);
+ });
getChild<LLComboBox>("l_bake_use_texture_combo_box")->setCommitCallback(onBakeTextureSelect, this);
@@ -1640,39 +1643,88 @@ void LLFloaterTexturePicker::onPickerCallback(const std::vector<std::string>& fi
}
}
-void LLFloaterTexturePicker::onTextureSelect( const LLTextureEntry& te )
+void LLFloaterTexturePicker::onPipetteSelect(LLPointer<LLViewerObject>& object, S32 te_index)
{
- LLUUID inventory_item_id = findItemID(te.getID(), true);
- if (inventory_item_id.notNull())
+ if (mInventoryPickType == PICK_MATERIAL)
{
- LLToolPipette::getInstance()->setResult(true, "");
- if (mInventoryPickType == PICK_MATERIAL)
- {
- // tes have no data about material ids
- // Plus gltf materials are layered with overrides,
- // which mean that end result might have no id.
- LL_WARNS() << "tes have no data about material ids" << LL_ENDL;
- }
- else
+ // Note: does not copy overrides!
+ LLUUID mat_id = object->getRenderMaterialID(te_index);
+ if (mat_id == BLANK_MATERIAL_ASSET_ID)
{
- setImageID(te.getID());
+ // It's fine if blank material isn't in inventory, just set it
+ LLToolPipette::getInstance()->setResult(true, "");
+ setImageID(mat_id);
setTentative(false);
- }
- mNoCopyTextureSelected = false;
- LLInventoryItem* itemp = gInventory.getItem(inventory_item_id);
+ mNoCopyTextureSelected = false;
- if (itemp && !itemp->getPermissions().allowCopyBy(gAgent.getID()))
+ commitIfImmediateSet();
+ }
+ else if (mat_id.isNull())
{
- // no copy texture
- mNoCopyTextureSelected = true;
+ LLToolPipette::getInstance()->setResult(false, LLTrans::getString("InventoryNoMaterial"));
}
+ else
+ {
+ LLUUID inventory_item_id = findItemID(mat_id, true);
+ if (inventory_item_id.notNull())
+ {
+ LLToolPipette::getInstance()->setResult(true, "");
+ setImageID(mat_id);
+ setTentative(false);
+
+ mNoCopyTextureSelected = false;
+ LLInventoryItem* itemp = gInventory.getItem(inventory_item_id);
+
+ if (itemp && !itemp->getPermissions().allowCopyBy(gAgent.getID()))
+ {
+ // no copy texture
+ mNoCopyTextureSelected = true;
+ }
- commitIfImmediateSet();
+ commitIfImmediateSet();
+ }
+ else
+ {
+ // Not in inventory, can't apply
+ LLToolPipette::getInstance()->setResult(false, LLTrans::getString("InventoryNoMaterial"));
+ }
+ }
}
else
{
- LLToolPipette::getInstance()->setResult(false, LLTrans::getString("InventoryNoTexture"));
+ const LLTextureEntry* entry = object->getTE(te_index);
+ if (!entry)
+ {
+ // Whatever was selected is not a face/TE,
+ // no texture to check, so do nothing.
+ // Should not be reachable, if you hit this,
+ // check what happens in pipette tool.
+ llassert(false);
+ return;
+ }
+ LLUUID inventory_item_id = findItemID(entry->getID(), true);
+ if (inventory_item_id.notNull())
+ {
+ LLToolPipette::getInstance()->setResult(true, "");
+ setImageID(entry->getID());
+ setTentative(false);
+
+ mNoCopyTextureSelected = false;
+ LLInventoryItem* itemp = gInventory.getItem(inventory_item_id);
+
+ if (itemp && !itemp->getPermissions().allowCopyBy(gAgent.getID()))
+ {
+ // no copy texture
+ mNoCopyTextureSelected = true;
+ }
+
+ commitIfImmediateSet();
+ }
+ else
+ {
+ LLToolPipette::getInstance()->setResult(false, LLTrans::getString("InventoryNoTexture"));
+ }
}
}