summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrey Kleshchev <andreykproductengine@lindenlab.com>2022-10-26 00:41:35 +0300
committerAndrey Kleshchev <andreykproductengine@lindenlab.com>2022-10-26 00:41:59 +0300
commit89625f92473bd2894acd287caeeb1d20673f8ddb (patch)
tree178c26092ee581ffacef9657462a75a94e5aa1a4
parentca53f265b45b01378748039d2345005688545114 (diff)
SL-18444 Live Material Editor updating with selection
-rw-r--r--indra/newview/llinspectobject.cpp15
-rw-r--r--indra/newview/llmaterialeditor.cpp93
-rw-r--r--indra/newview/llmaterialeditor.h4
-rw-r--r--indra/newview/llsidepaneltaskinfo.cpp7
-rw-r--r--indra/newview/llsidepaneltaskinfo.h2
5 files changed, 87 insertions, 34 deletions
diff --git a/indra/newview/llinspectobject.cpp b/indra/newview/llinspectobject.cpp
index 5329f10612..42bf416efb 100644
--- a/indra/newview/llinspectobject.cpp
+++ b/indra/newview/llinspectobject.cpp
@@ -116,6 +116,7 @@ private:
viewer_media_t mMediaImpl;
LLMediaEntry* mMediaEntry;
LLSafeHandle<LLObjectSelection> mObjectSelection;
+ boost::signals2::connection mSelectionUpdateSlot;
};
LLInspectObject::LLInspectObject(const LLSD& sd)
@@ -175,9 +176,12 @@ BOOL LLInspectObject::postBuild(void)
getChild<LLUICtrl>("more_info_btn")->setCommitCallback(
boost::bind(&LLInspectObject::onClickMoreInfo, this));
- // Watch for updates to selection properties off the network
- LLSelectMgr::getInstance()->mUpdateSignal.connect(
- boost::bind(&LLInspectObject::update, this) );
+ if (!mSelectionUpdateSlot.connected())
+ {
+ // Watch for updates to selection properties off the network
+ mSelectionUpdateSlot = LLSelectMgr::getInstance()->mUpdateSignal.connect(
+ boost::bind(&LLInspectObject::update, this));
+ }
return TRUE;
}
@@ -243,6 +247,11 @@ void LLInspectObject::onClose(bool app_quitting)
mObjectSelection = NULL;
mPreviousObjectID = mObjectID;
+ if (mSelectionUpdateSlot.connected())
+ {
+ mSelectionUpdateSlot.disconnect();
+ }
+
getChild<LLMenuButton>("gear_btn")->hideMenu();
}
diff --git a/indra/newview/llmaterialeditor.cpp b/indra/newview/llmaterialeditor.cpp
index 06705a277b..1e75216079 100644
--- a/indra/newview/llmaterialeditor.cpp
+++ b/indra/newview/llmaterialeditor.cpp
@@ -302,6 +302,11 @@ void LLMaterialEditor::onClickCloseBtn(bool app_quitting)
void LLMaterialEditor::onClose(bool app_quitting)
{
+ if (mSelectionUpdateSlot.connected())
+ {
+ mSelectionUpdateSlot.disconnect();
+ }
+
LLPreview::onClose(app_quitting);
}
@@ -1463,42 +1468,61 @@ void LLMaterialEditor::loadMaterialFromFile(const std::string& filename, S32 ind
);
}
}
+void LLMaterialEditor::onSelectionChanged()
+{
+ mHasUnsavedChanges = false;
+ clearTextures();
+ setFromSelection();
+ saveLiveValues();
+}
+
+void LLMaterialEditor::saveLiveValues()
+{
+ // Collect ids to be able to revert overrides.
+ // TODO: monitor selection changes and resave on selection changes
+ mObjectOverridesSavedValues.clear();
+ struct g : public LLSelectedObjectFunctor
+ {
+ g(LLMaterialEditor* me) : mEditor(me) {}
+ virtual bool apply(LLViewerObject* objectp)
+ {
+ if (!objectp)
+ {
+ return false;
+ }
+
+ U32 local_id = objectp->getLocalID();
+ S32 num_tes = llmin((S32)objectp->getNumTEs(), (S32)objectp->getNumFaces());
+ for (U8 te = 0; te < num_tes; te++)
+ {
+ LLUUID mat_id = objectp->getRenderMaterialID(te);
+ mEditor->mObjectOverridesSavedValues[local_id].push_back(mat_id);
+ }
+ return true;
+ }
+ LLMaterialEditor* mEditor;
+ } savefunc(this);
+ LLSelectMgr::getInstance()->getSelection()->applyToObjects(&savefunc);
+}
void LLMaterialEditor::loadLive()
{
LLMaterialEditor* me = (LLMaterialEditor*)LLFloaterReg::getInstance("material_editor", LLSD(LIVE_MATERIAL_EDITOR_KEY));
- if (me->setFromSelection())
+ if (me)
{
+ me->setFromSelection();
me->mIsOverride = true;
me->setTitle(me->getString("material_override_title"));
me->childSetVisible("save", false);
me->childSetVisible("save_as", false);
- me->mObjectOverridesSavedValues.clear();
- // Collect ids to be able to revert overrides.
- // TODO: monitor selection changes and resave on selection changes
- struct g : public LLSelectedObjectFunctor
+ // Set up for selection changes updates
+ if (!me->mSelectionUpdateSlot.connected())
{
- g(LLMaterialEditor* me) : mEditor(me) {}
- virtual bool apply(LLViewerObject* objectp)
- {
- if (!objectp)
- {
- return false;
- }
-
- U32 local_id = objectp->getLocalID();
- S32 num_tes = llmin((S32)objectp->getNumTEs(), (S32)objectp->getNumFaces());
- for (U8 te = 0; te < num_tes; te++)
- {
- LLUUID mat_id = objectp->getRenderMaterialID(te);
- mEditor->mObjectOverridesSavedValues[local_id].push_back(mat_id);
- }
- return true;
- }
- LLMaterialEditor* mEditor;
- } savefunc(me);
- LLSelectMgr::getInstance()->getSelection()->applyToObjects(&savefunc);
+ me->mSelectionUpdateSlot = LLSelectMgr::instance().mUpdateSignal.connect(boost::bind(&LLMaterialEditor::onSelectionChanged, me));
+ }
+ // Collect ids to be able to revert overrides on cancel.
+ me->saveLiveValues();
me->openFloater();
me->setFocus(TRUE);
@@ -2095,6 +2119,10 @@ bool LLMaterialEditor::setFromSelection()
return true;
}
+ // pick defaults from a blank material;
+ LLGLTFMaterial blank_mat;
+ setFromGLTFMaterial(&blank_mat);
+
return false;
}
@@ -2424,6 +2452,16 @@ S32 LLMaterialEditor::saveTextures()
}
// discard upload buffers once textures have been saved
+ clearTextures();
+
+ // asset storage can callback immediately, causing a decrease
+ // of mUploadingTexturesCount, report amount of work scheduled
+ // not amount of work remaining
+ return work_count;
+}
+
+void LLMaterialEditor::clearTextures()
+{
mBaseColorJ2C = nullptr;
mNormalJ2C = nullptr;
mEmissiveJ2C = nullptr;
@@ -2438,11 +2476,6 @@ S32 LLMaterialEditor::saveTextures()
mNormalTextureUploadId.setNull();
mMetallicTextureUploadId.setNull();
mEmissiveTextureUploadId.setNull();
-
- // asset storage can callback immediately, causing a decrease
- // of mUploadingTexturesCount, report amount of work scheduled
- // not amount of work remaining
- return work_count;
}
void LLMaterialEditor::loadDefaults()
diff --git a/indra/newview/llmaterialeditor.h b/indra/newview/llmaterialeditor.h
index 60907b18ba..438acb532b 100644
--- a/indra/newview/llmaterialeditor.h
+++ b/indra/newview/llmaterialeditor.h
@@ -103,6 +103,8 @@ public:
// will promt to select specific one
static void loadMaterialFromFile(const std::string& filename, S32 index = -1);
+ void onSelectionChanged(); // // live overrides selection changes
+ void saveLiveValues(); // for restoration on cancel
static void loadLive();
static void loadObjectSave();
@@ -118,6 +120,7 @@ public:
// save textures to inventory if needed
// returns amount of scheduled uploads
S32 saveTextures();
+ void clearTextures();
void onClickSave();
@@ -279,5 +282,6 @@ private:
// local id, texture ids per face for object overrides
// for "cancel" support
std::map<U32, uuid_vec_t> mObjectOverridesSavedValues;
+ boost::signals2::connection mSelectionUpdateSlot;
};
diff --git a/indra/newview/llsidepaneltaskinfo.cpp b/indra/newview/llsidepaneltaskinfo.cpp
index 7fa06f51e3..6216057c17 100644
--- a/indra/newview/llsidepaneltaskinfo.cpp
+++ b/indra/newview/llsidepaneltaskinfo.cpp
@@ -77,7 +77,7 @@ static LLPanelInjector<LLSidepanelTaskInfo> t_task_info("sidepanel_task_info");
LLSidepanelTaskInfo::LLSidepanelTaskInfo()
{
setMouseOpaque(FALSE);
- LLSelectMgr::instance().mUpdateSignal.connect(boost::bind(&LLSidepanelTaskInfo::refreshAll, this));
+ mSelectionUpdateSlot = LLSelectMgr::instance().mUpdateSignal.connect(boost::bind(&LLSidepanelTaskInfo::refreshAll, this));
}
@@ -85,6 +85,11 @@ LLSidepanelTaskInfo::~LLSidepanelTaskInfo()
{
if (sActivePanel == this)
sActivePanel = NULL;
+
+ if (mSelectionUpdateSlot.connected())
+ {
+ mSelectionUpdateSlot.disconnect();
+ }
}
// virtual
diff --git a/indra/newview/llsidepaneltaskinfo.h b/indra/newview/llsidepaneltaskinfo.h
index dc259cb22d..ac9c57f2e2 100644
--- a/indra/newview/llsidepaneltaskinfo.h
+++ b/indra/newview/llsidepaneltaskinfo.h
@@ -154,6 +154,8 @@ private:
LLView* mDAE;
LLView* mDAN;
LLView* mDAF;
+
+ boost::signals2::connection mSelectionUpdateSlot;
};