diff options
author | Brad Kittenbrink <brad@lindenlab.com> | 2022-10-17 15:44:32 -0700 |
---|---|---|
committer | Brad Kittenbrink <brad@lindenlab.com> | 2022-10-17 15:48:49 -0700 |
commit | 53e5216b2092b98d6973c2b27c5c75713ec99e73 (patch) | |
tree | e0ec5ca609b7f25648621b51715b7101bca37515 /indra/newview | |
parent | 77eba62335158db6b0c6c7966a26b956fd796da9 (diff) |
Continuing work on SL-17697 Live editing with material overrides.
* Fixed Selection usage so material editor no longer hardcoded to a single object/face
* made local preview hack the fallback for when the ModifyMaterialParams cap is missing
Diffstat (limited to 'indra/newview')
-rw-r--r-- | indra/newview/llgltfmateriallist.cpp | 17 | ||||
-rw-r--r-- | indra/newview/llmaterialeditor.cpp | 77 | ||||
-rw-r--r-- | indra/newview/llmaterialeditor.h | 4 | ||||
-rw-r--r-- | indra/newview/llpanelface.cpp | 11 |
4 files changed, 64 insertions, 45 deletions
diff --git a/indra/newview/llgltfmateriallist.cpp b/indra/newview/llgltfmateriallist.cpp index 24fd623231..a433644e0e 100644 --- a/indra/newview/llgltfmateriallist.cpp +++ b/indra/newview/llgltfmateriallist.cpp @@ -47,11 +47,22 @@ namespace bool operator()(const LLDispatcher* dispatcher, const std::string& key, const LLUUID& invoice, const sparam_t& strings) override { - LL_DEBUGS() << "strings: "; for (std::string const & s : strings) { - LL_CONT << " " << s; + LL_DEBUGS() << "received override: " << s << LL_ENDL; + +#if 0 + // for now messages are coming in llsd + LLSD override_data; + std::istringstream input(s); + LLSDSerialize::deserialize(override_data, input, s.length()); + LL_DEBUGS() << "deserialized override: " << override_data << LL_ENDL; +#else + std::string warn_msg, error_msg; + LLGLTFMaterial override_data; + override_data.fromJSON(s, warn_msg, error_msg); +#endif } - LL_CONT << LL_ENDL; + return true; } }; diff --git a/indra/newview/llmaterialeditor.cpp b/indra/newview/llmaterialeditor.cpp index f1b015fc84..735b4af689 100644 --- a/indra/newview/llmaterialeditor.cpp +++ b/indra/newview/llmaterialeditor.cpp @@ -200,8 +200,6 @@ LLMaterialEditor::LLMaterialEditor(const LLSD& key) , mHasUnsavedChanges(false) , mExpectedUploadCost(0) , mUploadingTexturesCount(0) - , mOverrideLocalId(0) - , mOverrideFace(0) { const LLInventoryItem* item = getItem(); if (item) @@ -1875,10 +1873,10 @@ void LLMaterialEditor::importMaterial() true); } -class LLRemderMaterialFunctor : public LLSelectedTEFunctor +class LLRenderMaterialFunctor : public LLSelectedTEFunctor { public: - LLRemderMaterialFunctor(const LLUUID &id) + LLRenderMaterialFunctor(const LLUUID &id) : mMatId(id) { } @@ -1897,29 +1895,59 @@ private: LLUUID mMatId; }; +class LLRenderMaterialOverrideFunctor : public LLSelectedTEFunctor +{ +public: + LLRenderMaterialOverrideFunctor(LLMaterialEditor * me, std::string const & url) + : mEditor(me), mCapUrl(url) + { + + } + + bool apply(LLViewerObject* objectp, S32 te) override + { + if (objectp && objectp->permModify() && objectp->getVolume()) + { + //LLVOVolume* vobjp = (LLVOVolume*)objectp; + S32 local_id = objectp->getLocalID(); + + LLSD overrides = llsd::map( + "local_id", local_id, + "side", te, + "overrides", LLSD::emptyMap() + ); + LLCoros::instance().launch("modifyMaterialCoro", std::bind(&LLMaterialEditor::modifyMaterialCoro, mEditor, mCapUrl, overrides)); + } + return true; + } + +private: + LLMaterialEditor * mEditor; + std::string mCapUrl; +}; + void LLMaterialEditor::applyToSelection() { -#if 0 // local preview placeholder hack - // Placehodler. Will be removed once override systems gets finished. - LLPointer<LLGLTFMaterial> mat = new LLGLTFMaterial(); - getGLTFMaterial(mat); - const LLUUID placeholder("984e183e-7811-4b05-a502-d79c6f978a98"); - gGLTFMaterialList.addMaterial(placeholder, mat); - LLRemderMaterialFunctor mat_func(placeholder); - LLObjectSelectionHandle selected_objects = LLSelectMgr::getInstance()->getSelection(); - //selected_objects->applyToTEs(&mat_func); -#else std::string url = gAgent.getRegionCapability("ModifyMaterialParams"); if (!url.empty()) { - LLSDMap overrides; - LLCoros::instance().launch("modifyMaterialCoro", std::bind(&LLMaterialEditor::modifyMaterialCoro, this, url, overrides)); + LLObjectSelectionHandle selected_objects = LLSelectMgr::getInstance()->getSelection(); + LLRenderMaterialOverrideFunctor override_func(this, url); + selected_objects->applyToTEs(&override_func); } else { LL_WARNS() << "not connected to materials capable region, missing ModifyMaterialParams cap" << LL_ENDL; + + // Fallback local preview. Will be removed once override systems is finished and new cap is deployed everywhere. + LLPointer<LLGLTFMaterial> mat = new LLGLTFMaterial(); + getGLTFMaterial(mat); + static const LLUUID placeholder("984e183e-7811-4b05-a502-d79c6f978a98"); + gGLTFMaterialList.addMaterial(placeholder, mat); + LLRenderMaterialFunctor mat_func(placeholder); + LLObjectSelectionHandle selected_objects = LLSelectMgr::getInstance()->getSelection(); + selected_objects->applyToTEs(&mat_func); } -#endif } void LLMaterialEditor::getGLTFMaterial(LLGLTFMaterial* mat) @@ -2323,13 +2351,10 @@ void LLMaterialEditor::modifyMaterialCoro(std::string cap_url, LLSD overrides) LLCore::HttpHeaders::ptr_t httpHeaders; httpOpts->setFollowRedirects(true); - LLSD body = llsd::map( - "local_id", S32(mOverrideLocalId), - "face", mOverrideFace, - "overrides", overrides - ); - LLSD result = httpAdapter->postAndSuspend(httpRequest, cap_url, body, httpOpts, httpHeaders); + LL_DEBUGS() << "Applying override via ModifyMaterialParams cap: " << overrides << LL_ENDL; + + LLSD result = httpAdapter->postAndSuspend(httpRequest, cap_url, overrides, httpOpts, httpHeaders); LLSD httpResults = result[LLCoreHttpUtil::HttpCoroutineAdapter::HTTP_RESULTS]; LLCore::HttpStatus status = LLCoreHttpUtil::HttpCoroutineAdapter::getStatusFromLLSD(httpResults); @@ -2343,9 +2368,3 @@ void LLMaterialEditor::modifyMaterialCoro(std::string cap_url, LLSD overrides) LL_WARNS() << "Failed to modify material: " << result["message"] << LL_ENDL; } } - -void LLMaterialEditor::setOverrideTarget(U32 local_id, S32 face) -{ - mOverrideLocalId = local_id; - mOverrideFace = face; -} diff --git a/indra/newview/llmaterialeditor.h b/indra/newview/llmaterialeditor.h index 3dabc6e26a..9bc6be4b92 100644 --- a/indra/newview/llmaterialeditor.h +++ b/indra/newview/llmaterialeditor.h @@ -218,7 +218,6 @@ public: void loadDefaults(); void modifyMaterialCoro(std::string cap_url, LLSD overrides); - void setOverrideTarget(U32 local_id, S32 face_id); private: void loadMaterial(const tinygltf::Model &model, const std::string &filename_lc, S32 index); @@ -272,8 +271,5 @@ private: S32 mExpectedUploadCost; std::string mMaterialNameShort; std::string mMaterialName; - - U32 mOverrideLocalId; - S32 mOverrideFace; }; diff --git a/indra/newview/llpanelface.cpp b/indra/newview/llpanelface.cpp index f93a0e7142..fd8bf044f8 100644 --- a/indra/newview/llpanelface.cpp +++ b/indra/newview/llpanelface.cpp @@ -4587,23 +4587,16 @@ void LLPanelFace::onPbrStartEditing() { dynamic_cast<LLMaterialEditor *>(LLFloaterReg::showInstance("material_editor", LLSD(LLUUID::null), TAKE_FOCUS_YES)); if (editor) { - LLObjectSelection *select = LLSelectMgr::getInstance()->getSelection(); - LLViewerObject * objectp = select->getFirstObject(); - LLUUID object_id = objectp->getID(); - bool identical; LLUUID material_id; LLSelectedTE::getPbrMaterialId(material_id, identical); - S32 face = 0; - - LL_DEBUGS() << "loading material live editor with asset " << material_id << " on object " << object_id << LL_ENDL; + LL_DEBUGS() << "loading material live editor with asset " << material_id << LL_ENDL; LLGLTFMaterial* material = gGLTFMaterialList.getMaterial(material_id); - editor->setTitle("Editing material on "s + object_id.asString()); + editor->setTitle("Editing material on selection"s); editor->setAssetId(material_id); editor->setFromGLTFMaterial(material); - editor->setOverrideTarget(objectp->getLocalID(), face); } } |