gldemo
HierarchyObject.h
1 #pragma once
2 
3 
4 #include <qpoint.h>
5 #include <qstring.h>
6 #include <qabstractitemmodel.h>
7 
8 #include <vector>
9 #include <set>
10 #include <algorithm>
11 #include <glm/glm.hpp>
12 #include <glm/gtc/matrix_transform.hpp>
13 #include <glm/gtc/type_ptr.hpp>
14 
15 #include <functional>
16 #include <queue>
17 
18 #include "nesteddefs.h"
19 
20 
27 class HierarchyObject : public QAbstractItemModel {
28 
29 private:
31  std::vector<HierarchyObject*> children;
33  std::vector<Component*> components;
36 
37 public:
39  glm::mat4 transform;
41  QString name;
43  bool enabled;
44 
46  int childrenCount() { return children.size(); }
48  HierarchyObject* getChildren(int i) { return (children.size() > i && i >= 0) ? children[i] : NULL; }
50  HierarchyObject* getChildren(const QString& name);
52  int findChild(HierarchyObject* child);
54  int componentsCount() { return components.size(); }
57 
58  // ctor
59  HierarchyObject(const QString& name, HierarchyObject* parent = NULL);
60  ~HierarchyObject();
61 
64  glm::mat4 localToWorld();
67  glm::mat4 worldToLocal() {
68  return glm::inverse(localToWorld());
69  }
70 
71 
74  HierarchyObject* popChild(int index);
77  void insertChild(int index, HierarchyObject* child);
80  void moveChild(int oldIndex, int newIndex);
81 
82 
85  template <class T>
86  T* getComponent(int i) {
87  if (i < 0 || i >= components.size()) return NULL;
88  return dynamic_cast<T*>(components[i]);
89  }
90 
93  template <class T>
94  T* getComponent() {
95  for (auto component : components) {
96  if (dynamic_cast<T*>(component)) {
97  return dynamic_cast<T*>(component);
98  }
99  }
100  return NULL;
101  }
102 
105  Component * addComponent(Component* component);
106 
107 
109  void updateRecursively();
110 
112  void callRecursively(const std::function<void(HierarchyObject*)>& func, bool requireEnabled = false);
113 
114 
115  // -------------实现QAbstractItemModel的必选接口-----------------
116  // 获取给定元素的第row个子元素
117  QModelIndex index(int row, int column, const QModelIndex &parent = QModelIndex()) const;
118  // 获取给定元素的父元素
119  QModelIndex parent(const QModelIndex &index) const;
120  // 获取某元素的子节点数
121  int rowCount(const QModelIndex &parent = QModelIndex()) const;
122  // 2
123  int columnCount(const QModelIndex &parent = QModelIndex()) const;
124  // 取出数据
125  QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const;
126 
127  // ----------------------重写可选函数----------------------------
128  // 接收编辑name事件
129  bool setData(const QModelIndex & index, const QVariant & value, int role);
130  // 返回指定节点的各种显示属性
131  Qt::ItemFlags flags(const QModelIndex &index) const;
132  // 返回标题
133  QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const;
134 
135 };
136 
137 
void callRecursively(const std::function< void(HierarchyObject *)> &func, bool requireEnabled=false)
递归遍历子树
Definition: HierarchyObject.cpp:108
int componentsCount()
本节点挂载的组件数量
Definition: HierarchyObject.h:54
HierarchyObject * popChild(int index)
取出子节点
Definition: HierarchyObject.cpp:60
Component * addComponent(Component *component)
挂载组件
Definition: HierarchyObject.cpp:84
int findChild(HierarchyObject *child)
找到子节点序号
Definition: HierarchyObject.cpp:21
组件的基类。里面的事件会由widget调用
Definition: Component.h:15
glm::mat4 worldToLocal()
从世界坐标转局部坐标的矩阵
Definition: HierarchyObject.h:67
HierarchyObject * getParent()
获取父节点
Definition: HierarchyObject.h:56
bool enabled
如果为false,则其上及子节点上组件的onUpdate不会被调用
Definition: HierarchyObject.h:43
void updateRecursively()
递归更新子树
Definition: HierarchyObject.cpp:93
int childrenCount()
子节点数量
Definition: HierarchyObject.h:46
glm::mat4 transform
该节点局部到该节点父节点局部坐标的变换阵
Definition: HierarchyObject.h:39
表示场景树中的节点
Definition: HierarchyObject.h:27
void insertChild(int index, HierarchyObject *child)
放入子节点
Definition: HierarchyObject.cpp:68
QString name
节点名称
Definition: HierarchyObject.h:41
void moveChild(int oldIndex, int newIndex)
调整子节点顺序
Definition: HierarchyObject.cpp:74
HierarchyObject * parentObj
该节点的父节点
Definition: HierarchyObject.h:35
glm::mat4 localToWorld()
从局部坐标转世界坐标的矩阵
Definition: HierarchyObject.cpp:37
T * getComponent(int i)
获取第i个组件,cast成指定类型
Definition: HierarchyObject.h:86
std::vector< Component * > components
该节点挂载的组件列表
Definition: HierarchyObject.h:33
T * getComponent()
获取第一个指定类型的组件
Definition: HierarchyObject.h:94
std::vector< HierarchyObject * > children
子节点列表
Definition: HierarchyObject.h:31
HierarchyObject * getChildren(int i)
获取第i个子节点
Definition: HierarchyObject.h:48