summaryrefslogtreecommitdiff
path: root/indra
diff options
context:
space:
mode:
Diffstat (limited to 'indra')
-rw-r--r--indra/newview/llfloatergltfasseteditor.cpp108
-rw-r--r--indra/newview/llfloatergltfasseteditor.h8
-rw-r--r--indra/newview/llselectmgr.cpp12
3 files changed, 119 insertions, 9 deletions
diff --git a/indra/newview/llfloatergltfasseteditor.cpp b/indra/newview/llfloatergltfasseteditor.cpp
index f21b8032d0..c1946e9f96 100644
--- a/indra/newview/llfloatergltfasseteditor.cpp
+++ b/indra/newview/llfloatergltfasseteditor.cpp
@@ -52,8 +52,6 @@ LLFloaterGLTFAssetEditor::LLFloaterGLTFAssetEditor(const LLSD& key)
LLFloaterGLTFAssetEditor::~LLFloaterGLTFAssetEditor()
{
- gIdleCallbacks.deleteFunction(idle, this);
-
if (mScroller)
{
removeChild(mScroller);
@@ -120,7 +118,7 @@ void LLFloaterGLTFAssetEditor::initFolderRoot()
// Insert that scroller into the panel widgets hierarchy
mItemListPanel->addChild(mScroller);
- // Create the root model and view for all conversation sessions
+ // Create the root model
LLGLTFFolderItem* base_item = new LLGLTFFolderItem(mGLTFViewModel);
LLFolderView::Params p(LLUICtrlFactory::getDefaultParams<LLFolderView>());
@@ -144,15 +142,33 @@ void LLFloaterGLTFAssetEditor::initFolderRoot()
mFolderRoot->setOpen(true);
mFolderRoot->setSelectCallback([this](const std::deque<LLFolderViewItem*>& items, bool user_action) { onFolderSelectionChanged(items, user_action); });
mScroller->setVisible(true);
-
- gIdleCallbacks.addFunction(idle, this);
}
void LLFloaterGLTFAssetEditor::onOpen(const LLSD& key)
{
+ gIdleCallbacks.addFunction(idle, this);
loadFromSelection();
}
+void LLFloaterGLTFAssetEditor::onClose(bool app_quitting)
+{
+ gIdleCallbacks.deleteFunction(idle, this);
+ mAsset = nullptr;
+ mObject = nullptr;
+
+}
+
+void LLFloaterGLTFAssetEditor::clearRoot()
+{
+ LLFolderViewFolder::folders_t::iterator folders_it = mFolderRoot->getFoldersBegin();
+ while (folders_it != mFolderRoot->getFoldersEnd())
+ {
+ (*folders_it)->destroyView();
+ folders_it = mFolderRoot->getFoldersBegin();
+ }
+ mNodeToItemMap.clear();
+}
+
void LLFloaterGLTFAssetEditor::idle(void* user_data)
{
LLFloaterGLTFAssetEditor* floater = (LLFloaterGLTFAssetEditor*)user_data;
@@ -216,6 +232,8 @@ void LLFloaterGLTFAssetEditor::loadFromNode(S32 node_id, LLFolderViewFolder* par
view->setVisible(true);
view->setOpen(true);
+ mNodeToItemMap[node_id] = view;
+
for (S32& node_id : node.mChildren)
{
loadFromNode(node_id, view);
@@ -246,8 +264,12 @@ void LLFloaterGLTFAssetEditor::loadFromNode(S32 node_id, LLFolderViewFolder* par
void LLFloaterGLTFAssetEditor::loadFromSelection()
{
- if (!mFolderRoot || LLSelectMgr::getInstance()->getSelection()->getObjectCount() != 1)
+ clearRoot();
+
+ if (LLSelectMgr::getInstance()->getSelection()->getObjectCount() != 1)
{
+ mAsset = nullptr;
+ mObject = nullptr;
return;
}
@@ -255,14 +277,19 @@ void LLFloaterGLTFAssetEditor::loadFromSelection()
LLViewerObject* objectp = node->getObject();
if (!objectp)
{
+ mAsset = nullptr;
+ mObject = nullptr;
return;
}
- mAsset = objectp->mGLTFAsset;
- if (!mAsset)
+ if (!objectp->mGLTFAsset)
{
+ mAsset = nullptr;
+ mObject = nullptr;
return;
}
+ mAsset = objectp->mGLTFAsset;
+ mObject = objectp;
if (node->mName.empty())
{
@@ -289,7 +316,6 @@ void LLFloaterGLTFAssetEditor::loadFromSelection()
LLGLTFFolderItem* listener = new LLGLTFFolderItem(i, name, LLGLTFFolderItem::TYPE_SCENE, mGLTFViewModel);
-
LLFolderViewFolder::Params p;
p.name = name;
p.root = mFolderRoot;
@@ -316,6 +342,50 @@ void LLFloaterGLTFAssetEditor::loadFromSelection()
mFolderRoot->update();
}
+void LLFloaterGLTFAssetEditor::dirty()
+{
+ if (!mObject || !mAsset || !mFolderRoot)
+ {
+ closeFloater();
+ return;
+ }
+
+ if (LLSelectMgr::getInstance()->getSelection()->getObjectCount() > 1)
+ {
+ closeFloater();
+ return;
+ }
+
+ LLSelectNode* node = LLSelectMgr::getInstance()->getSelection()->getFirstNode(NULL);
+ if (!node)
+ {
+ // not yet updated?
+ // Todo: Subscribe to deletion in some way
+ return;
+ }
+
+ LLViewerObject* objectp = node->getObject();
+ if (mObject != objectp || !objectp->mGLTFAsset)
+ {
+ closeFloater();
+ return;
+ }
+
+ if (mAsset != objectp->mGLTFAsset)
+ {
+ loadFromSelection();
+ return;
+ }
+
+ auto found = mNodeToItemMap.find(node->mSelectedGLTFNode);
+ if (found != mNodeToItemMap.end())
+ {
+ LLFolderViewItem* itemp = found->second;
+ itemp->arrangeAndSet(true, false);
+ loadNodeTransforms(node->mSelectedGLTFNode);
+ }
+}
+
void LLFloaterGLTFAssetEditor::onFolderSelectionChanged(const std::deque<LLFolderViewItem*>& items, bool user_action)
{
if (items.empty())
@@ -329,10 +399,30 @@ void LLFloaterGLTFAssetEditor::onFolderSelectionChanged(const std::deque<LLFolde
switch (vmi->getType())
{
+ case LLGLTFFolderItem::TYPE_SCENE:
+ {
+ setTransformsEnabled(false);
+ LLSelectMgr::getInstance()->selectObjectOnly(mObject, SELECT_ALL_TES, -1, -1);
+ break;
+ }
case LLGLTFFolderItem::TYPE_NODE:
{
setTransformsEnabled(true);
loadNodeTransforms(vmi->getItemId());
+ LLSelectMgr::getInstance()->selectObjectOnly(mObject, SELECT_ALL_TES, vmi->getItemId(), 0);
+ break;
+ }
+ case LLGLTFFolderItem::TYPE_MESH:
+ case LLGLTFFolderItem::TYPE_SKIN:
+ {
+ if (item->getParent()) // should be a node
+ {
+ LLFolderViewFolder* parent = item->getParentFolder();
+ LLGLTFFolderItem* parent_vmi = static_cast<LLGLTFFolderItem*>(parent->getViewModelItem());
+ LLSelectMgr::getInstance()->selectObjectOnly(mObject, SELECT_ALL_TES, parent_vmi->getItemId(), 0);
+ }
+
+ setTransformsEnabled(false);
break;
}
default:
diff --git a/indra/newview/llfloatergltfasseteditor.h b/indra/newview/llfloatergltfasseteditor.h
index e35ed30ed0..b0ba8941b9 100644
--- a/indra/newview/llfloatergltfasseteditor.h
+++ b/indra/newview/llfloatergltfasseteditor.h
@@ -42,6 +42,7 @@ namespace LL
class LLSpinCtrl;
class LLMenuButton;
+class LLViewerObject;
class LLFloaterGLTFAssetEditor : public LLFloater
{
@@ -51,6 +52,7 @@ public:
bool postBuild() override;
void onOpen(const LLSD& key) override;
+ void onClose(bool app_quitting) override;
void initFolderRoot();
LLGLTFViewModel& getRootViewModel() { return mGLTFViewModel; }
@@ -60,6 +62,8 @@ public:
void loadFromNode(S32 node, LLFolderViewFolder* parent);
void loadFromSelection();
+ void dirty();
+
protected:
void onFolderSelectionChanged(const std::deque<LLFolderViewItem*>& items, bool user_action);
void onCommitTransform();
@@ -69,8 +73,11 @@ protected:
void setTransformsEnabled(bool val);
void loadNodeTransforms(S32 id);
+ void clearRoot();
+
private:
+ LLPointer<LLViewerObject> mObject;
std::shared_ptr<LL::GLTF::Asset> mAsset;
// Folder view related
@@ -79,6 +86,7 @@ private:
LLPanel* mItemListPanel = nullptr;
LLFolderView* mFolderRoot = nullptr;
LLScrollContainer* mScroller = nullptr;
+ std::map<S32, LLFolderViewItem*> mNodeToItemMap;
// Transforms panel
LLVector3 mLastEulerDegrees;
diff --git a/indra/newview/llselectmgr.cpp b/indra/newview/llselectmgr.cpp
index b3420f9c57..17f968b921 100644
--- a/indra/newview/llselectmgr.cpp
+++ b/indra/newview/llselectmgr.cpp
@@ -56,6 +56,7 @@
#include "llattachmentsmgr.h"
#include "llviewerwindow.h"
#include "lldrawable.h"
+#include "llfloatergltfasseteditor.h"
#include "llfloaterinspect.h"
#include "llfloaterreporter.h"
#include "llfloaterreg.h"
@@ -467,6 +468,11 @@ LLObjectSelectionHandle LLSelectMgr::selectObjectOnly(LLViewerObject* object, S3
if (object->isSelected() ) {
// make sure point at position is updated
updatePointAt();
+ LLSelectNode* nodep = mSelectedObjects->findNode(object);
+ if (nodep)
+ {
+ nodep->selectGLTFNode(gltf_node, gltf_primitive, true);
+ }
gEditMenuHandler = this;
return NULL;
}
@@ -7187,6 +7193,12 @@ void dialog_refresh_all()
{
panel_task_info->dirty();
}
+
+ LLFloaterGLTFAssetEditor * gltf_editor = LLFloaterReg::getTypedInstance<LLFloaterGLTFAssetEditor>("gltf_asset_editor");
+ if (gltf_editor)
+ {
+ gltf_editor->dirty();
+ }
}
S32 get_family_count(LLViewerObject *parent)