SL-18008 Add Save and Edit buttons to right click menu for materials

master
Andrey Kleshchev 2022-10-17 23:33:27 +03:00
parent 5fc91f6911
commit a27e701530
5 changed files with 199 additions and 28 deletions

View File

@ -1401,6 +1401,16 @@ void LLMaterialEditor::loadMaterialFromFile(const std::string& filename, S32 ind
}
}
void LLMaterialEditor::loadLiveMaterial(LLGLTFMaterial * material, bool make_copy)
{
if (!material)
{
return;
}
LLMaterialEditor* me = (LLMaterialEditor*)LLFloaterReg::getInstance("material_editor");
me->loadMaterial(material, make_copy);
}
void LLMaterialEditor::loadMaterial(const tinygltf::Model &model_in, const std::string &filename_lc, S32 index)
{
if (model_in.materials.size() <= index)
@ -1505,6 +1515,40 @@ void LLMaterialEditor::loadMaterial(const tinygltf::Model &model_in, const std::
applyToSelection();
}
void LLMaterialEditor::loadMaterial(LLGLTFMaterial * material, bool make_copy)
{
setBaseColorId(material->mBaseColorId);
setMetallicRoughnessId(material->mMetallicRoughnessId);
setEmissiveId(material->mEmissiveId);
setNormalId(material->mNormalId);
setAlphaMode(material->getAlphaMode());
setAlphaCutoff(material->mAlphaCutoff);
setBaseColor(material->mBaseColor);
setEmissiveColor(material->mEmissiveColor);
setMetalnessFactor(material->mMetallicFactor);
setRoughnessFactor(material->mRoughnessFactor);
setDoubleSided(material->mDoubleSided);
if (make_copy)
{
setTitle(LLTrans::getString("New Material"));
}
// else ??? Think of a name for live editing
// Todo: At the moment it always makes a 'copy'
// Will need a way to expand existing material
// once overrides are done
setHasUnsavedChanges(make_copy);
openFloater();
setFocus(TRUE);
}
bool LLMaterialEditor::setFromGltfModel(const tinygltf::Model& model, S32 index, bool set_textures)
{
if (model.materials.size() > index)

View File

@ -104,6 +104,7 @@ public:
// @index if -1 and file contains more than one material,
// will promt to select specific one
static void loadMaterialFromFile(const std::string& filename, S32 index = -1);
static void loadLiveMaterial(LLGLTFMaterial * material, bool make_copy);
static void onLoadComplete(const LLUUID& asset_uuid, LLAssetType::EType type, void* user_data, S32 status, LLExtStat ext_status);
@ -221,6 +222,9 @@ public:
private:
void loadMaterial(const tinygltf::Model &model, const std::string &filename_lc, S32 index);
// if make_copy is set, will make a copy for saving,
// otherwise will edit existing material
void loadMaterial(LLGLTFMaterial * material, bool make_copy);
friend class LLMaterialFilePicker;

View File

@ -92,6 +92,7 @@
#include "llpanelblockedlist.h"
#include "llpanelmaininventory.h"
#include "llmarketplacefunctions.h"
#include "llmaterialeditor.h"
#include "llmenuoptionpathfindingrebakenavmesh.h"
#include "llmoveview.h"
#include "llnavigationbar.h"
@ -2781,6 +2782,50 @@ void handle_object_open()
LLFloaterReg::showInstance("openobject");
}
bool enable_object_edit_gltf_material()
{
struct LLSelectedTEGetmatId : public LLSelectedTEGetFunctor<LLUUID>
{
LLSelectedTEGetmatId() : mCanModify(true) {}
LLUUID get(LLViewerObject* object, S32 te_index)
{
mCanModify &= (bool)object->permModify();
// Todo: probabnly should compare material
// pointers instead
return object->getRenderMaterialID(te_index);
}
bool mCanModify;
} func;
LLUUID mat_id;
bool identical = LLSelectMgr::getInstance()->getSelection()->getSelectedTEValue(&func, mat_id);
LL_INFOS() << " Placeholder " << identical << " " << mat_id << LL_ENDL;
// Todo: this is a placeholder for overrides,
// it will have to make sure all selection is identical
return func.mCanModify;
}
bool enable_object_save_gltf_material()
{
struct LLSelectedTEGetmatId : public LLSelectedTEGetFunctor<LLUUID>
{
LLSelectedTEGetmatId() : mCanCopy(true) {}
LLUUID get(LLViewerObject* object, S32 te_index)
{
mCanCopy &= (bool)object->permCopy();
// permTransfer probably should be passed to editor instead
mCanCopy &= (bool)object->permTransfer();
return object->getRenderMaterialID(te_index);
}
bool mCanCopy;
} func;
LLUUID mat_id;
bool identical = LLSelectMgr::getInstance()->getSelection()->getSelectedTEValue(&func, mat_id);
LL_INFOS() << " Placeholder " << identical << " " << mat_id << LL_ENDL;
// Todo: this is a placeholder for overrides,
// it will have to make sure all selection is identical
return func.mCanCopy;
}
bool enable_object_open()
{
// Look for contents in root object, which is all the LLFloaterOpenObject
@ -2846,37 +2891,42 @@ class LLObjectBuild : public view_listener_t
}
};
void update_camera()
{
LLViewerParcelMgr::getInstance()->deselectLand();
if (gAgentCamera.getFocusOnAvatar() && !LLToolMgr::getInstance()->inEdit())
{
LLFloaterTools::sPreviousFocusOnAvatar = true;
LLObjectSelectionHandle selection = LLSelectMgr::getInstance()->getSelection();
if (selection->getSelectType() == SELECT_TYPE_HUD || !gSavedSettings.getBOOL("EditCameraMovement"))
{
// always freeze camera in space, even if camera doesn't move
// so, for example, follow cam scripts can't affect you when in build mode
gAgentCamera.setFocusGlobal(gAgentCamera.calcFocusPositionTargetGlobal(), LLUUID::null);
gAgentCamera.setFocusOnAvatar(FALSE, ANIMATE);
}
else
{
gAgentCamera.setFocusOnAvatar(FALSE, ANIMATE);
LLViewerObject* selected_objectp = selection->getFirstRootObject();
if (selected_objectp)
{
// zoom in on object center instead of where we clicked, as we need to see the manipulator handles
gAgentCamera.setFocusGlobal(selected_objectp->getPositionGlobal(), selected_objectp->getID());
gAgentCamera.cameraZoomIn(0.666f);
gAgentCamera.cameraOrbitOver(30.f * DEG_TO_RAD);
gViewerWindow->moveCursorToCenter();
}
}
}
}
void handle_object_edit()
{
LLViewerParcelMgr::getInstance()->deselectLand();
update_camera();
if (gAgentCamera.getFocusOnAvatar() && !LLToolMgr::getInstance()->inEdit())
{
LLFloaterTools::sPreviousFocusOnAvatar = true;
LLObjectSelectionHandle selection = LLSelectMgr::getInstance()->getSelection();
if (selection->getSelectType() == SELECT_TYPE_HUD || !gSavedSettings.getBOOL("EditCameraMovement"))
{
// always freeze camera in space, even if camera doesn't move
// so, for example, follow cam scripts can't affect you when in build mode
gAgentCamera.setFocusGlobal(gAgentCamera.calcFocusPositionTargetGlobal(), LLUUID::null);
gAgentCamera.setFocusOnAvatar(FALSE, ANIMATE);
}
else
{
gAgentCamera.setFocusOnAvatar(FALSE, ANIMATE);
LLViewerObject* selected_objectp = selection->getFirstRootObject();
if (selected_objectp)
{
// zoom in on object center instead of where we clicked, as we need to see the manipulator handles
gAgentCamera.setFocusGlobal(selected_objectp->getPositionGlobal(), selected_objectp->getID());
gAgentCamera.cameraZoomIn(0.666f);
gAgentCamera.cameraOrbitOver( 30.f * DEG_TO_RAD );
gViewerWindow->moveCursorToCenter();
}
}
}
LLFloaterReg::showInstance("build");
LLToolMgr::getInstance()->setCurrentToolset(gBasicToolset);
@ -2890,6 +2940,54 @@ void handle_object_edit()
return;
}
void load_life_gltf_material(bool copy)
{
LLObjectSelectionHandle selection = LLSelectMgr::getInstance()->getSelection();
// All materials are supposed to be identical, so pcik any node
LLViewerObject* object = selection->getFirstNode()->getObject();
if (!object)
{
return;
}
// This functionality is a plcaholder for overrides
// so id doesn't load object by id, but instead gets material directly
LLGLTFMaterial * mat = NULL;
const S32 num_tes = llmin((S32)object->getNumTEs(), (S32)object->getNumFaces()); // avatars have TEs but no faces
for (S32 face = 0; face < num_tes; ++face)
{
LLTextureEntry *te = object->getTE(face);
if (te->isSelected())
{
mat = te->getGLTFMaterial();
break;
}
}
if (mat == NULL)
{
return;
}
update_camera();
LLMaterialEditor::loadLiveMaterial(mat, copy);
LLViewerJoystick::getInstance()->moveObjects(true);
LLViewerJoystick::getInstance()->setNeedsReset(true);
}
void handle_object_edit_gltf_material()
{
load_life_gltf_material(false);
}
void handle_object_save_gltf_material()
{
load_life_gltf_material(true);
}
void handle_attachment_edit(const LLUUID& inv_item_id)
{
if (isAgentAvatarValid())
@ -9560,10 +9658,15 @@ void initialize_menus()
commit.add("Object.Buy", boost::bind(&handle_buy));
commit.add("Object.Edit", boost::bind(&handle_object_edit));
commit.add("Object.Edit", boost::bind(&handle_object_edit));
commit.add("Object.EditGLTFMaterial", boost::bind(&handle_object_edit_gltf_material));
commit.add("Object.SaveGLTFMaterial", boost::bind(&handle_object_save_gltf_material));
commit.add("Object.Inspect", boost::bind(&handle_object_inspect));
commit.add("Object.Open", boost::bind(&handle_object_open));
commit.add("Object.Take", boost::bind(&handle_take));
commit.add("Object.ShowInspector", boost::bind(&handle_object_show_inspector));
enable.add("Object.EnableEditGLTFMaterial", boost::bind(&enable_object_edit_gltf_material));
enable.add("Object.EnableSaveGLTFMaterial", boost::bind(&enable_object_save_gltf_material));
enable.add("Object.EnableOpen", boost::bind(&enable_object_open));
enable.add("Object.EnableTouch", boost::bind(&enable_object_touch, _1));
enable.add("Object.EnableDelete", boost::bind(&enable_object_delete));

View File

@ -90,6 +90,8 @@ void handle_gestures(void*);
void handle_sit_down(void*);
void handle_object_build(void*);
void handle_object_touch();
bool enable_object_edit_gltf_material();
bool enable_object_save_gltf_material();
bool enable_object_open();
void handle_object_open();
@ -108,6 +110,8 @@ void handle_zoom_to_object(LLUUID object_id);
void handle_object_return();
void handle_object_delete();
void handle_object_edit();
void handle_object_edit_gltf_material();
void handle_object_save_gltf_material();
void handle_attachment_edit(const LLUUID& inv_item_id);
void handle_attachment_touch(const LLUUID& inv_item_id);

View File

@ -21,6 +21,22 @@
<menu_item_call.on_enable
function="EnableEdit"/>
</menu_item_call>
<menu_item_call
label="Edit PBR Material"
name="EditGLTFMaterial">
<menu_item_call.on_click
function="Object.EditGLTFMaterial" />
<menu_item_call.on_enable
function="Object.EnableEditGLTFMaterial"/>
</menu_item_call>
<menu_item_call
label="Save material to inventory"
name="SaveGLTFMaterial">
<menu_item_call.on_click
function="Object.SaveGLTFMaterial" />
<menu_item_call.on_enable
function="Object.EnableSaveGLTFMaterial"/>
</menu_item_call>
<menu_item_call
label="Build"
name="Build">