summaryrefslogtreecommitdiff
path: root/indra/newview
diff options
context:
space:
mode:
authorAndrey Kleshchev <andreykproductengine@lindenlab.com>2022-08-08 23:24:29 +0300
committerAndrey Kleshchev <andreykproductengine@lindenlab.com>2022-08-08 23:24:54 +0300
commit49278013ef3af18f4565f46aeb67368e6439ae46 (patch)
tree19835b507b52d2a118dca350fb308418e18dacf5 /indra/newview
parenteeb3b4daa62d044d8fcdee1a2fa6a63c782b3229 (diff)
SL-17653 Apply selection to faces and linkset instead of just first object
Diffstat (limited to 'indra/newview')
-rw-r--r--indra/newview/llmaterialeditor.cpp52
1 files changed, 29 insertions, 23 deletions
diff --git a/indra/newview/llmaterialeditor.cpp b/indra/newview/llmaterialeditor.cpp
index 57cd74e0f2..0e252518cb 100644
--- a/indra/newview/llmaterialeditor.cpp
+++ b/indra/newview/llmaterialeditor.cpp
@@ -62,6 +62,7 @@ const std::string MATERIAL_NORMAL_DEFAULT_NAME = "Normal";
const std::string MATERIAL_METALLIC_DEFAULT_NAME = "Metallic Roughness";
const std::string MATERIAL_EMISSIVE_DEFAULT_NAME = "Emissive";
+
class LLMaterialEditorCopiedCallback : public LLInventoryCallback
{
public:
@@ -1341,34 +1342,39 @@ void LLMaterialEditor::importMaterial()
(new LLMaterialFilePicker(this))->getFile();
}
-void LLMaterialEditor::applyToSelection()
+class LLRemderMaterialFunctor : public LLSelectedTEFunctor
{
- // Todo: fix this, this is a hack, not a proper live preview
- LLViewerObject* objectp = LLSelectMgr::instance().getSelection()->getFirstObject();
- if (objectp && objectp->getVolume() && objectp->permModify())
+public:
+ LLRemderMaterialFunctor(LLGLTFMaterial *mat, const LLUUID &id)
+ : mMat(mat), mMatId(id)
{
- LLGLTFMaterial* mat = new LLGLTFMaterial();
- getGLTFMaterial(mat);
- LLVOVolume* vobjp = (LLVOVolume*)objectp;
- for (int i = 0; i < vobjp->getNumTEs(); ++i)
- {
- // this is here just to prevent material from immediately resetting
- if (mAssetID.notNull())
- {
- vobjp->setRenderMaterialID(i, mAssetID);
- }
- else
- {
- const LLUUID placeholder("984e183e-7811-4b05-a502-d79c6f978a98");
- vobjp->setRenderMaterialID(i, placeholder);
- }
+ }
- vobjp->getTE(i)->setGLTFMaterial(mat);
- vobjp->updateTEMaterialTextures(i);
+ virtual bool apply(LLViewerObject* objectp, S32 te)
+ {
+ if (objectp && objectp->permModify() && objectp->getVolume())
+ {
+ LLVOVolume* vobjp = (LLVOVolume*)objectp;
+ vobjp->setRenderMaterialID(te, mMatId);
+ vobjp->getTE(te)->setGLTFMaterial(mMat);
+ vobjp->updateTEMaterialTextures(te);
}
-
- vobjp->markForUpdate(TRUE);
+ return true;
}
+private:
+ LLGLTFMaterial *mMat;
+ LLUUID mMatId;
+};
+
+void LLMaterialEditor::applyToSelection()
+{
+ LLGLTFMaterial* mat = new LLGLTFMaterial();
+ getGLTFMaterial(mat);
+ const LLUUID placeholder("984e183e-7811-4b05-a502-d79c6f978a98");
+ LLUUID asset_id = mAssetID.notNull() ? mAssetID : placeholder;
+ LLRemderMaterialFunctor mat_func(mat, mAssetID);
+ LLObjectSelectionHandle selected_objects = LLSelectMgr::getInstance()->getSelection();
+ selected_objects->applyToTEs(&mat_func);
}
void LLMaterialEditor::getGLTFMaterial(LLGLTFMaterial* mat)