summaryrefslogtreecommitdiff
path: root/indra
diff options
context:
space:
mode:
Diffstat (limited to 'indra')
-rw-r--r--indra/llprimitive/llgltfmaterial.cpp2
-rw-r--r--indra/newview/llgltfmateriallist.cpp36
-rw-r--r--indra/newview/llgltfmateriallist.h2
-rw-r--r--indra/newview/llmaterialeditor.cpp98
-rw-r--r--indra/newview/llmaterialeditor.h8
-rw-r--r--indra/newview/llpanelface.cpp39
-rw-r--r--indra/newview/llpanelface.h3
-rw-r--r--indra/newview/llviewermenufile.cpp4
-rw-r--r--indra/newview/llviewerobject.cpp2
-rw-r--r--indra/newview/skins/default/xui/en/panel_tools_texture.xml38
10 files changed, 191 insertions, 41 deletions
diff --git a/indra/llprimitive/llgltfmaterial.cpp b/indra/llprimitive/llgltfmaterial.cpp
index 6164234d6c..9743bad7a7 100644
--- a/indra/llprimitive/llgltfmaterial.cpp
+++ b/indra/llprimitive/llgltfmaterial.cpp
@@ -241,6 +241,7 @@ void LLGLTFMaterial::writeToModel(tinygltf::Model& model, S32 mat_index) const
material_out.alphaCutoff = mAlphaCutoff;
mBaseColor.write(material_out.pbrMetallicRoughness.baseColorFactor);
+ material_out.emissiveFactor.resize(3); // 0 size by default
mEmissiveColor.write(material_out.emissiveFactor);
material_out.pbrMetallicRoughness.metallicFactor = mMetallicFactor;
@@ -477,6 +478,7 @@ void LLGLTFMaterial::writeOverridesToModel(tinygltf::Model& model, S32 mat_index
if (mEmissiveColor != base_material->mEmissiveColor)
{
+ material_out.emissiveFactor.resize(3); // 0 size by default
mEmissiveColor.write(material_out.emissiveFactor);
}
diff --git a/indra/newview/llgltfmateriallist.cpp b/indra/newview/llgltfmateriallist.cpp
index ab7a6495c4..d91a448bc8 100644
--- a/indra/newview/llgltfmateriallist.cpp
+++ b/indra/newview/llgltfmateriallist.cpp
@@ -31,6 +31,7 @@
#include "lldispatcher.h"
#include "llfetchedgltfmaterial.h"
#include "llfilesystem.h"
+#include "llmaterialeditor.h"
#include "llsdserialize.h"
#include "lltinygltfhelper.h"
#include "llviewercontrol.h"
@@ -116,6 +117,12 @@ namespace
if (!success)
{
LL_WARNS() << "failed to parse GLTF override data. errors: " << error_msg << " | warnings: " << warn_msg << LL_ENDL;
+
+ // unblock material editor
+ if (obj && obj->isAnySelected())
+ {
+ LLMaterialEditor::updateLive(object_id, sides[i].asInteger());
+ }
}
else
{
@@ -128,16 +135,25 @@ namespace
// object not ready to receive override data, queue for later
gGLTFMaterialList.queueOverrideUpdate(object_id, side, override_data);
}
+ else if (obj && obj->isAnySelected())
+ {
+ LLMaterialEditor::updateLive(object_id, side);
+ }
}
}
if (obj && side_set.size() != obj->getNumTEs())
{ // object exists and at least one texture entry needs to have its override data nulled out
+ bool object_has_selection = obj->isAnySelected();
for (int i = 0; i < obj->getNumTEs(); ++i)
{
if (side_set.find(i) == side_set.end())
{
obj->setTEGLTFMaterialOverride(i, nullptr);
+ if (object_has_selection)
+ {
+ LLMaterialEditor::updateLive(object_id, i);
+ }
}
}
}
@@ -150,9 +166,14 @@ namespace
if (clear_all && obj)
{ // override list was empty or an error occurred, null out all overrides for this object
+ bool object_has_selection = obj->isAnySelected();
for (int i = 0; i < obj->getNumTEs(); ++i)
{
obj->setTEGLTFMaterialOverride(i, nullptr);
+ if (object_has_selection)
+ {
+ LLMaterialEditor::updateLive(obj->getID(), i);
+ }
}
}
return true;
@@ -180,6 +201,7 @@ void LLGLTFMaterialList::applyQueuedOverrides(LLViewerObject* obj)
if (iter != mQueuedOverrides.end())
{
+ bool object_has_selection = obj->isAnySelected();
override_list_t& overrides = iter->second;
for (int i = 0; i < overrides.size(); ++i)
{
@@ -190,6 +212,10 @@ void LLGLTFMaterialList::applyQueuedOverrides(LLViewerObject* obj)
return;
}
obj->setTEGLTFMaterialOverride(i, overrides[i]);
+ if (object_has_selection)
+ {
+ LLMaterialEditor::updateLive(id, i);
+ }
}
}
@@ -355,7 +381,7 @@ void LLGLTFMaterialList::registerCallbacks()
}
// static
-void LLGLTFMaterialList::modifyMaterialCoro(std::string cap_url, LLSD overrides)
+void LLGLTFMaterialList::modifyMaterialCoro(std::string cap_url, LLSD overrides, void(*done_callback)(bool) )
{
LLCore::HttpRequest::policy_t httpPolicy(LLCore::HttpRequest::DEFAULT_POLICY_ID);
LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t
@@ -373,12 +399,20 @@ void LLGLTFMaterialList::modifyMaterialCoro(std::string cap_url, LLSD overrides)
LLSD httpResults = result[LLCoreHttpUtil::HttpCoroutineAdapter::HTTP_RESULTS];
LLCore::HttpStatus status = LLCoreHttpUtil::HttpCoroutineAdapter::getStatusFromLLSD(httpResults);
+ bool success = true;
if (!status)
{
LL_WARNS() << "Failed to modify material." << LL_ENDL;
+ success = false;
}
else if (!result["success"].asBoolean())
{
LL_WARNS() << "Failed to modify material: " << result["message"] << LL_ENDL;
+ success = false;
+ }
+
+ if (done_callback)
+ {
+ done_callback(success);
}
}
diff --git a/indra/newview/llgltfmateriallist.h b/indra/newview/llgltfmateriallist.h
index b74e0b3ec2..bfdd9e5e32 100644
--- a/indra/newview/llgltfmateriallist.h
+++ b/indra/newview/llgltfmateriallist.h
@@ -57,7 +57,7 @@ public:
// "object_id": LLUUID - object to be modified
// "side": integer - index of face to be modified
// "gltf_json" : string - GLTF compliant json of override data (optional, if omitted any existing override data will be cleared)
- static void modifyMaterialCoro(std::string cap_url, LLSD overrides);
+ static void modifyMaterialCoro(std::string cap_url, LLSD overrides, void(*done_callback)(bool));
// save an override update for later (for example, if an override arrived for an unknown object)
void queueOverrideUpdate(const LLUUID& id, S32 side, LLGLTFMaterial* override_data);
diff --git a/indra/newview/llmaterialeditor.cpp b/indra/newview/llmaterialeditor.cpp
index 533f882d39..20fee6686c 100644
--- a/indra/newview/llmaterialeditor.cpp
+++ b/indra/newview/llmaterialeditor.cpp
@@ -86,6 +86,9 @@ static const U32 MATERIAL_DOUBLE_SIDED_DIRTY = 0x1 << 9;
static const U32 MATERIAL_ALPHA_MODE_DIRTY = 0x1 << 10;
static const U32 MATERIAL_ALPHA_CUTOFF_DIRTY = 0x1 << 11;
+LLUUID LLMaterialEditor::mOverrideObjectId;
+S32 LLMaterialEditor::mOverrideObjectTE = -1;
+
LLFloaterComboOptions::LLFloaterComboOptions()
: LLFloater(LLSD())
{
@@ -1513,13 +1516,22 @@ void LLMaterialEditor::loadMaterialFromFile(const std::string& filename, S32 ind
);
}
}
+
void LLMaterialEditor::onSelectionChanged()
{
// This won't get deletion or deselectAll()
// Might need to handle that separately
- mUnsavedChanges = 0;
- clearTextures();
- setFromSelection();
+
+ // Drop selection updates if we are waiting for
+ // overrides to finish aplying to not reset values
+ // (might need a timeout)
+ if (!mOverrideInProgress)
+ {
+ clearTextures();
+ setFromSelection();
+ }
+
+ // At the moment all cahges are 'live' so don't reset dirty flags
// saveLiveValues(); todo
}
@@ -1554,6 +1566,44 @@ void LLMaterialEditor::saveLiveValues()
LLSelectMgr::getInstance()->getSelection()->applyToObjects(&savefunc);
}
+void LLMaterialEditor::updateLive()
+{
+ const LLSD floater_key(LIVE_MATERIAL_EDITOR_KEY);
+ LLFloater* instance = LLFloaterReg::findInstance("material_editor", floater_key);
+ if (instance && LLFloater::isVisible(instance))
+ {
+ LLMaterialEditor* me = (LLMaterialEditor*)instance;
+ if (me)
+ {
+ me->mOverrideInProgress = false;
+ me->clearTextures();
+ me->setFromSelection();
+ }
+ }
+}
+
+void LLMaterialEditor::updateLive(const LLUUID &object_id, S32 te)
+{
+ if (mOverrideObjectId != object_id
+ || mOverrideObjectTE != te)
+ {
+ // Not an update we are waiting for
+ return;
+ }
+ const LLSD floater_key(LIVE_MATERIAL_EDITOR_KEY);
+ LLFloater* instance = LLFloaterReg::findInstance("material_editor", floater_key);
+ if (instance && LLFloater::isVisible(instance))
+ {
+ LLMaterialEditor* me = (LLMaterialEditor*)instance;
+ if (me)
+ {
+ me->mOverrideInProgress = false;
+ me->clearTextures();
+ me->setFromSelection();
+ }
+ }
+}
+
void LLMaterialEditor::loadLive()
{
// Allow only one 'live' instance
@@ -1561,6 +1611,7 @@ void LLMaterialEditor::loadLive()
LLMaterialEditor* me = (LLMaterialEditor*)LLFloaterReg::getInstance("material_editor", floater_key);
if (me)
{
+ me->mOverrideInProgress = false;
me->setFromSelection();
me->setTitle(me->getString("material_override_title"));
me->childSetVisible("save", false);
@@ -2136,11 +2187,21 @@ public:
"side", te,
"gltf_json", overrides_json
);
- LLCoros::instance().launch("modifyMaterialCoro", std::bind(&LLGLTFMaterialList::modifyMaterialCoro, mCapUrl, overrides));
+ LLCoros::instance().launch("modifyMaterialCoro", std::bind(&LLGLTFMaterialList::modifyMaterialCoro, mCapUrl, overrides, modifyCallback));
}
return true;
}
+ static void modifyCallback(bool success)
+ {
+ if (!success)
+ {
+ // something went wrong update selection
+ LLMaterialEditor::updateLive();
+ }
+ // else we will get updateLive(obj, id) from aplied overrides
+ }
+
private:
LLMaterialEditor * mEditor;
std::string mCapUrl;
@@ -2160,10 +2221,22 @@ void LLMaterialEditor::applyToSelection()
std::string url = gAgent.getRegionCapability("ModifyMaterialParams");
if (!url.empty())
{
- LLObjectSelectionHandle selected_objects = LLSelectMgr::getInstance()->getSelection();
- // TODO figure out how to get the right asset id in cases where we don't have a good one
- LLRenderMaterialOverrideFunctor override_func(this, url);
- selected_objects->applyToTEs(&override_func);
+ // Don't send data if there is nothing to send.
+ // Some UI elements will cause multiple commits,
+ // like spin ctrls on click and on down
+ if (mUnsavedChanges != 0)
+ {
+ mOverrideInProgress = true;
+ LLObjectSelectionHandle selected_objects = LLSelectMgr::getInstance()->getSelection();
+ LLRenderMaterialOverrideFunctor override_func(this, url);
+ if (!selected_objects->applyToTEs(&override_func))
+ {
+ mOverrideInProgress = false;
+ }
+
+ // we posted all changes
+ mUnsavedChanges = 0;
+ }
}
else
{
@@ -2228,6 +2301,7 @@ bool LLMaterialEditor::setFromSelection()
, mIdenticalTexMetal(true)
, mIdenticalTexEmissive(true)
, mIdenticalTexNormal(true)
+ , mObjectTE(-1)
, mFirst(true)
{}
@@ -2265,6 +2339,8 @@ bool LLMaterialEditor::setFromSelection()
mTexMetalId = tex_metal_id;
mTexEmissiveId = tex_emissive_id;
mTexNormalId = tex_normal_id;
+ mObjectTE = te_index;
+ mObjectId = objectp->getID();
mFirst = false;
}
else
@@ -2299,6 +2375,8 @@ bool LLMaterialEditor::setFromSelection()
LLUUID mTexMetalId;
LLUUID mTexEmissiveId;
LLUUID mTexNormalId;
+ LLUUID mObjectId;
+ S32 mObjectTE;
LLPointer<LLGLTFMaterial> mMaterial;
} func(mIsOverride);
@@ -2325,6 +2403,10 @@ bool LLMaterialEditor::setFromSelection()
mMetallicTextureCtrl->setTentative(!func.mIdenticalTexMetal);
mEmissiveTextureCtrl->setTentative(!func.mIdenticalTexEmissive);
mNormalTextureCtrl->setTentative(!func.mIdenticalTexNormal);
+
+ // Memorize selection data for filtering further updates
+ mOverrideObjectId = func.mObjectId;
+ mOverrideObjectTE = func.mObjectTE;
}
return func.mMaterial.notNull();
diff --git a/indra/newview/llmaterialeditor.h b/indra/newview/llmaterialeditor.h
index 091f51234f..749cd4cd54 100644
--- a/indra/newview/llmaterialeditor.h
+++ b/indra/newview/llmaterialeditor.h
@@ -103,8 +103,11 @@ public:
// will promt to select specific one
static void loadMaterialFromFile(const std::string& filename, S32 index = -1);
- void onSelectionChanged(); // // live overrides selection changes
+ void onSelectionChanged(); // live overrides selection changes
void saveLiveValues(); // for restoration on cancel
+
+ static void updateLive();
+ static void updateLive(const LLUUID &object_id, S32 te);
static void loadLive();
static void loadObjectSave();
@@ -281,8 +284,11 @@ private:
// if true, this instance is live instance editing overrides
bool mIsOverride = false;
+ bool mOverrideInProgress = false;
// local id, texture ids per face for object overrides
// for "cancel" support
+ static LLUUID mOverrideObjectId; // static to avoid searching for the floater
+ static S32 mOverrideObjectTE;
std::map<U32, uuid_vec_t> mObjectOverridesSavedValues;
boost::signals2::connection mSelectionUpdateSlot;
};
diff --git a/indra/newview/llpanelface.cpp b/indra/newview/llpanelface.cpp
index 6d8d19c57c..f884cfe842 100644
--- a/indra/newview/llpanelface.cpp
+++ b/indra/newview/llpanelface.cpp
@@ -201,6 +201,8 @@ BOOL LLPanelFace::postBuild()
childSetAction("button align",&LLPanelFace::onClickAutoFix,this);
childSetAction("button align textures", &LLPanelFace::onAlignTexture, this);
+ childSetAction("pbr_from_inventory", &LLPanelFace::onClickBtnLoadInvPBR, this);
+ childSetAction("edit_selected_pbr", &LLPanelFace::onClickBtnEditPBR, this);
LLTextureCtrl* mTextureCtrl;
LLTextureCtrl* mShinyTextureCtrl;
@@ -237,9 +239,6 @@ BOOL LLPanelFace::postBuild()
pbr_ctrl->setDnDFilterPermMask(PERM_COPY | PERM_TRANSFER);
pbr_ctrl->setBakeTextureEnabled(false);
pbr_ctrl->setInventoryPickType(LLTextureCtrl::PICK_MATERIAL);
-
- // TODO - design real UI for activating live editing
- pbr_ctrl->setRightMouseUpCallback(boost::bind(&LLPanelFace::onPbrStartEditing, this));
}
mTextureCtrl = getChild<LLTextureCtrl>("texture control");
@@ -968,6 +967,8 @@ void LLPanelFace::updateUI(bool force_set_values /*false*/)
pbr_ctrl->setImageAssetID(pbr_id);
has_pbr_material = pbr_id.notNull();
}
+ getChildView("pbr_from_inventory")->setEnabled(editable);
+ getChildView("edit_selected_pbr")->setEnabled(editable && has_pbr_material);
LLTextureCtrl* texture_ctrl = getChild<LLTextureCtrl>("texture control");
LLTextureCtrl* shinytexture_ctrl = getChild<LLTextureCtrl>("shinytexture control");
@@ -1469,8 +1470,8 @@ void LLPanelFace::updateUI(bool force_set_values /*false*/)
LLSelectedTE::getGlow(glow,identical_glow);
getChild<LLUICtrl>("glow")->setValue(glow);
getChild<LLUICtrl>("glow")->setTentative(!identical_glow);
- getChildView("glow")->setEnabled(editable && !has_pbr_material);
- getChildView("glow label")->setEnabled(editable && !has_pbr_material);
+ getChildView("glow")->setEnabled(editable);
+ getChildView("glow label")->setEnabled(editable);
}
{
@@ -1746,6 +1747,8 @@ void LLPanelFace::updateUI(bool force_set_values /*false*/)
getChildView("label shininess")->setEnabled(FALSE);
getChildView("label bumpiness")->setEnabled(FALSE);
getChildView("button align")->setEnabled(FALSE);
+ getChildView("pbr_from_inventory")->setEnabled(FALSE);
+ getChildView("edit_selected_pbr")->setEnabled(FALSE);
//getChildView("has media")->setEnabled(FALSE);
//getChildView("media info set")->setEnabled(FALSE);
@@ -2677,6 +2680,8 @@ void LLPanelFace::updateVisibility()
// PBR controls
getChildView("pbr_control")->setVisible(show_pbr);
+ getChildView("pbr_from_inventory")->setVisible(show_pbr);
+ getChildView("edit_selected_pbr")->setVisible(show_pbr);
}
// static
@@ -3651,6 +3656,19 @@ void LLPanelFace::onAlignTexture(void* userdata)
self->alignTestureLayer();
}
+void LLPanelFace::onClickBtnLoadInvPBR(void* userdata)
+{
+ // Shouldn't this be "save to inventory?"
+ LLPanelFace* self = (LLPanelFace*)userdata;
+ LLTextureCtrl* pbr_ctrl = self->findChild<LLTextureCtrl>("pbr_control");
+ pbr_ctrl->showPicker(true);
+}
+
+void LLPanelFace::onClickBtnEditPBR(void* userdata)
+{
+ LLMaterialEditor::loadLive();
+}
+
enum EPasteMode
{
PASTE_COLOR,
@@ -4580,17 +4598,6 @@ void LLPanelFace::onPbrSelectionChanged(LLInventoryItem* itemp)
}
}
-void LLPanelFace::onPbrStartEditing()
-{
- bool identical;
- LLUUID material_id;
- LLSelectedTE::getPbrMaterialId(material_id, identical);
-
- LL_DEBUGS() << "loading material live editor with asset " << material_id << LL_ENDL;
-
- LLMaterialEditor::loadLive();
-}
-
bool LLPanelFace::isIdenticalPlanarTexgen()
{
LLTextureEntry::e_texgen selected_texgen = LLTextureEntry::TEX_GEN_DEFAULT;
diff --git a/indra/newview/llpanelface.h b/indra/newview/llpanelface.h
index cc46116545..38d81e44ba 100644
--- a/indra/newview/llpanelface.h
+++ b/indra/newview/llpanelface.h
@@ -228,6 +228,8 @@ protected:
static void onCommitRepeatsPerMeter( LLUICtrl* ctrl, void* userinfo);
static void onClickAutoFix(void*);
static void onAlignTexture(void*);
+ static void onClickBtnLoadInvPBR(void* userdata);
+ static void onClickBtnEditPBR(void* userdata);
public: // needs to be accessible to selection manager
void onCopyColor(); // records all selected faces
@@ -438,7 +440,6 @@ private:
*/
void onTextureSelectionChanged(LLInventoryItem* itemp);
void onPbrSelectionChanged(LLInventoryItem* itemp);
- void onPbrStartEditing();
LLMenuButton* mMenuClipboardColor;
LLMenuButton* mMenuClipboardTexture;
diff --git a/indra/newview/llviewermenufile.cpp b/indra/newview/llviewermenufile.cpp
index ffa2ce865e..25eb3eff1d 100644
--- a/indra/newview/llviewermenufile.cpp
+++ b/indra/newview/llviewermenufile.cpp
@@ -106,8 +106,7 @@ class LLFileEnableUploadMaterial : public view_listener_t
{
bool handleEvent(const LLSD& userdata)
{
- LLMaterialEditor* me = (LLMaterialEditor*)LLFloaterReg::findInstance("material_editor");
- if (me && me->isShown())
+ if (!gAgent.getRegionCapability("UpdateMaterialAgentInventory").empty())
{
return false;
}
@@ -1145,6 +1144,7 @@ void init_menu_file()
view_listener_t::addEnable(new LLFileEnableUpload(), "File.EnableUpload");
view_listener_t::addEnable(new LLFileEnableUploadModel(), "File.EnableUploadModel");
+ view_listener_t::addEnable(new LLFileEnableUploadMaterial(), "File.EnableUploadMaterial");
view_listener_t::addMenu(new LLMeshEnabled(), "File.MeshEnabled");
view_listener_t::addMenu(new LLMeshUploadVisible(), "File.VisibleUploadModel");
diff --git a/indra/newview/llviewerobject.cpp b/indra/newview/llviewerobject.cpp
index 6fcad1a8c7..43525a3173 100644
--- a/indra/newview/llviewerobject.cpp
+++ b/indra/newview/llviewerobject.cpp
@@ -7212,7 +7212,7 @@ void LLViewerObject::setRenderMaterialID(S32 te_in, const LLUUID& id, bool updat
gAgent.getRegionCapability("ModifyMaterialParams"),
llsd::map(
"object_id", getID(),
- "side", te)));
+ "side", te), nullptr));
}
// update and send LLRenderMaterialParams
diff --git a/indra/newview/skins/default/xui/en/panel_tools_texture.xml b/indra/newview/skins/default/xui/en/panel_tools_texture.xml
index ff2323784c..e2d571324f 100644
--- a/indra/newview/skins/default/xui/en/panel_tools_texture.xml
+++ b/indra/newview/skins/default/xui/en/panel_tools_texture.xml
@@ -239,28 +239,46 @@
width="160" />
<texture_picker
can_apply_immediately="true"
- default_image_name="Default"
- fallback_image="materials_ui_x_24.png"
+ allow_no_texture="true"
follows="left|top"
height="80"
- label="Texture "
+ label="PBR "
layout="topleft"
left="10"
- name="texture control"
- tool_tip="Click to choose a picture"
+ name="pbr_control"
+ tool_tip="Click to choose a pbr material"
top_pad="5"
width="64" />
+ <button
+ follows="left|top"
+ height="23"
+ layout="topleft"
+ left_pad="10"
+ top_delta="0"
+ name="pbr_from_inventory"
+ label="Choose from inventory"
+ width="140"/>
+ <button
+ follows="left|top"
+ height="23"
+ layout="topleft"
+ left_delta="0"
+ top_pad="4"
+ name="edit_selected_pbr"
+ label="Edit Selected"
+ width="140"/>
<texture_picker
can_apply_immediately="true"
- allow_no_texture="true"
+ default_image_name="Default"
+ fallback_image="materials_ui_x_24.png"
follows="left|top"
height="80"
- label="PBR "
+ label="Texture "
layout="topleft"
left="10"
- name="pbr_control"
- tool_tip="Click to choose a pbr material"
- top_delta="0"
+ name="texture control"
+ tool_tip="Click to choose a picture"
+ top_delta="-27"
width="64" />
<text
type="string"