aboutsummaryrefslogtreecommitdiff
path: root/NvBlast/tools/ArtistTools/source/BlastPlugin/Window/BlastSceneTree.h
diff options
context:
space:
mode:
Diffstat (limited to 'NvBlast/tools/ArtistTools/source/BlastPlugin/Window/BlastSceneTree.h')
-rw-r--r--NvBlast/tools/ArtistTools/source/BlastPlugin/Window/BlastSceneTree.h284
1 files changed, 284 insertions, 0 deletions
diff --git a/NvBlast/tools/ArtistTools/source/BlastPlugin/Window/BlastSceneTree.h b/NvBlast/tools/ArtistTools/source/BlastPlugin/Window/BlastSceneTree.h
new file mode 100644
index 0000000..540f420
--- /dev/null
+++ b/NvBlast/tools/ArtistTools/source/BlastPlugin/Window/BlastSceneTree.h
@@ -0,0 +1,284 @@
+#ifndef BLASTSCENETREE_H
+#define BLASTSCENETREE_H
+
+#include <QtWidgets/QDockWidget>
+#include "ui_BlastSceneTree.h"
+#include "ProjectParams.h"
+#include <vector>
+#include <string>
+#include <QtCore/QMap>
+
+class QTreeWidgetItem;
+class BlastAsset;
+
+enum EBlastNodeType
+{
+ eBond,
+ eChunk,
+ eAsset,
+ eProjectile,
+ eGraphicsMesh,
+ eAssetInstance,
+ eLandmark,
+ eComposite,
+};
+
+class BlastNode
+{
+public:
+ BlastNode(const std::string& inName, void* inData)
+ : name(inName)
+ , _data(inData)
+ {
+ }
+
+ void* getData() { return _data; }
+ void setParent(BlastNode* parent) { _parent = parent; }
+ BlastNode* getParent() { return _parent; }
+ virtual EBlastNodeType getType() = 0;
+ virtual bool getVisible() = 0;
+ virtual void setVisible(bool val) = 0;
+
+ std::string name;
+ std::vector<BlastNode*> children;
+
+protected:
+ void* _data;
+ BlastNode* _parent;
+};
+
+class BlastBondNode : public BlastNode
+{
+public:
+ BlastBondNode(const std::string& inName, BPPBond& inData)
+ : BlastNode(inName, &inData)
+ {
+ }
+ virtual EBlastNodeType getType() { return eBond; }
+ virtual bool getVisible() { return ((BPPBond*)_data)->visible; }
+ virtual void setVisible(bool val) { ((BPPBond*)_data)->visible = val; }
+
+private:
+ std::vector<BlastNode*> children;
+};
+
+class BlastChunkNode : public BlastNode
+{
+public:
+ BlastChunkNode(const std::string& inName, BPPChunk& inData, void* assetPtr)
+ : BlastNode(inName, &inData)
+ {
+ _assetPtr = assetPtr;
+ }
+ virtual EBlastNodeType getType() { return eChunk; }
+ virtual bool getVisible() { return ((BPPChunk*)_data)->visible; }
+ virtual void setVisible(bool val);// { ((BPPChunk*)_data)->visible = val; }
+ void setSelected(bool val);
+ bool isSupport() { return ((BPPChunk*)_data)->support; }
+ void* _assetPtr;
+};
+
+class BlastAssetNode : public BlastNode
+{
+public:
+ BlastAssetNode(const std::string& inName, BPPAsset& inData)
+ : BlastNode(inName, &inData)
+ {
+ }
+ virtual EBlastNodeType getType() { return eAsset; }
+ virtual bool getVisible() { return ((BPPAsset*)_data)->visible; }
+ virtual void setVisible(bool val) { ((BPPAsset*)_data)->visible = val; }
+};
+
+class BlastProjectileNode : public BlastNode
+{
+public:
+ BlastProjectileNode(const std::string& inName, BPPProjectile& inData)
+ : BlastNode(inName, &inData)
+ {
+ }
+ virtual EBlastNodeType getType() { return eProjectile; }
+ virtual bool getVisible() { return ((BPPProjectile*)_data)->visible; }
+ virtual void setVisible(bool val) { ((BPPProjectile*)_data)->visible = val; }
+};
+
+class BlastGraphicsMeshNode : public BlastNode
+{
+public:
+ BlastGraphicsMeshNode(const std::string& inName, BPPGraphicsMesh& inData)
+ : BlastNode(inName, &inData)
+ {
+ }
+ virtual EBlastNodeType getType() { return eGraphicsMesh; }
+ virtual bool getVisible() { return ((BPPGraphicsMesh*)_data)->visible; }
+ virtual void setVisible(bool val) { ((BPPGraphicsMesh*)_data)->visible = val; }
+};
+
+class BlastAssetInstanceNode : public BlastNode
+{
+public:
+ BlastAssetInstanceNode(const std::string& inName, BPPAssetInstance& inData)
+ : BlastNode(inName, &inData)
+ {
+ }
+ virtual EBlastNodeType getType() { return eAssetInstance; }
+ virtual bool getVisible() { return ((BPPAssetInstance*)_data)->visible; }
+ virtual void setVisible(bool val) { ((BPPAssetInstance*)_data)->visible = val; }
+ void setSelected(bool val);
+};
+
+class BlastLandmarkNode : public BlastNode
+{
+public:
+ BlastLandmarkNode(const std::string& inName, BPPLandmark& inData)
+ : BlastNode(inName, &inData)
+ {
+ }
+ virtual EBlastNodeType getType() { return eLandmark; }
+ virtual bool getVisible() { return ((BPPLandmark*)_data)->visible; }
+ virtual void setVisible(bool val) { ((BPPLandmark*)_data)->visible = val; }
+};
+
+class BlastCompositeNode : public BlastNode
+{
+public:
+ BlastCompositeNode(const std::string& inName, BPPComposite& inData)
+ : BlastNode(inName, &inData)
+ {
+ }
+ virtual EBlastNodeType getType() { return eComposite; }
+ virtual bool getVisible() { return ((BPPComposite*)_data)->visible; }
+ virtual void setVisible(bool val) { ((BPPComposite*)_data)->visible = val; }
+};
+
+class BlastTreeData
+{
+public:
+ static BlastTreeData& ins();
+ static bool isChild(BlastChunkNode* parent, BlastChunkNode* child);
+ static std::vector<BlastChunkNode*> getTopChunkNodes(std::vector<BlastChunkNode*>& nodes);
+ static bool isRoot(BlastChunkNode* node);
+ static bool isLeaf(BlastChunkNode* node);
+ static void makeSupport(BlastChunkNode* node);
+ static void makeStaticSupport(BlastChunkNode* node);
+ static void removeSupport(BlastChunkNode* node);
+
+ BlastNode* getBlastNodeByProjectData(void* blastProjectData);
+ BlastCompositeNode* getCompsiteNode() { return _composite; }
+ std::vector<BlastAssetNode*>& getAssetNodes() { return _assets; }
+ std::vector<BlastProjectileNode*>& getProjectileNodes() { return _projectiles; }
+ std::vector<BlastGraphicsMeshNode*>& getGraphicsMeshNodes() { return _graphicsMeshes; }
+ std::vector<BlastChunkNode*> getChunkNodeByBlastChunk(const BlastAsset* asset, const std::vector<uint32_t>& chunkIndexes);
+ bool isCompleteSupportAsset(const BlastAsset* asset);
+ bool isCompleteSupportAsset(const BlastAssetNode* node);
+ bool isOverlapSupportAsset(const BlastAsset* asset);
+ bool isOverlapSupportAsset(const BlastAssetNode* node);
+ void update();
+
+ void updateVisible(uint32_t assetIndex, uint32_t chunkIndex, bool visible);
+
+private:
+ BlastTreeData();
+ void _addChunkNode(const BPPChunk& parentData, BPPAsset& asset, BlastChunkNode* parentNode, void* assetPtr);
+ void _freeBlastNode();
+ BlastAssetNode* _getAssetNode(const BlastAsset* asset);
+
+private:
+ BlastCompositeNode* _composite;
+ std::vector<BlastAssetNode*> _assets;
+ std::vector<BlastProjectileNode*> _projectiles;
+ std::vector<BlastGraphicsMeshNode*> _graphicsMeshes;
+ std::map<void*, BlastNode*> _blastProjectDataToNodeMap;
+};
+
+class ISceneObserver
+{
+public:
+ virtual void dataSelected(std::vector<BlastNode*> selections) = 0;
+};
+
+class VisualButton : public QWidget
+{
+ Q_OBJECT
+public:
+ VisualButton(QWidget* parent, BlastNode* blastItem);
+
+protected slots:
+ void on_visualbility_toggled(bool checked);
+private:
+ void _updateBlast(bool visible);
+
+private:
+ QPushButton* _button;
+ BlastNode* _blastItem;
+};
+
+class BlastSceneTree : public QDockWidget, public ISceneObserver
+{
+ Q_OBJECT
+
+public:
+ static BlastSceneTree* ins();
+
+ BlastSceneTree(QWidget *parent = 0);
+ ~BlastSceneTree();
+
+ void updateValues(bool updataData = true);
+
+ virtual void dataSelected(std::vector<BlastNode*> selections);
+
+ void addObserver(ISceneObserver* observer);
+ void removeObserver(ISceneObserver* observer);
+
+ void updateVisible(uint32_t assetIndex, uint32_t chunkIndex, bool visible);
+ void updateChunkItemSelection();
+
+ void makeSupport();
+ void makeStaticSupport();
+ void removeSupport();
+ void bondChunks();
+ void bondChunksWithJoints();
+ void removeAllBonds();
+
+protected slots:
+ void on_btnAsset_clicked();
+ void on_assetComposite_clicked();
+ void on_btnChunk_clicked();
+ void on_btnBond_clicked();
+ void on_btnProjectile_clicked();
+ void on_blastSceneTree_customContextMenuRequested(const QPoint &pos);
+ void on_blastSceneTree_itemSelectionChanged();
+ void onMakeSupportMenuItemClicked();
+ void onMakeStaticSupportMenuItemClicked();
+ void onRemoveSupportMenuItemClicked();
+ void onBondChunksMenuItemClicked();
+ void onBondChunksWithJointsMenuItemClicked();
+ void onRemoveAllBondsMenuItemClicked();
+
+private:
+ void _updateTreeUIs();
+ void _addChunkUI(const BlastNode* parentNode, QTreeWidgetItem* parentTreeItem);
+ void _updateChunkTreeItemAndMenu(BPPChunk* chunk, QTreeWidgetItem* chunkItem);
+ void _updateChunkTreeItems();
+
+ void _selectTreeItem(BlastNode* node);
+
+ //void _createTestData();
+
+private:
+ Ui::BlastSceneTree ui;
+ QMap<QTreeWidgetItem*, BlastNode*> _treeItemDataMap;
+ QMap<BlastNode*, QTreeWidgetItem*> _treeDataItemMap;
+ QMenu* _treeChunkContextMenu;
+ QMenu* _treeBondContextMenu;
+ QAction* _makeSupportAction;
+ QAction* _makeStaticSupportAction;
+ QAction* _removeSupportAction;
+ QAction* _bondChunksAction;
+ QAction* _bondChunksWithJointsAction;
+ QAction* _removeAllBondsAction;
+ std::vector<ISceneObserver*> _observers;
+ bool _updateData;
+};
+
+#endif // BLASTSCENETREE_H