-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathTransformNode.cpp
82 lines (73 loc) · 2.25 KB
/
TransformNode.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
#include "artd/TransformNode.h"
#include "artd/SceneNode.h"
ARTD_BEGIN
TransformNode::TransformNode() {
setFlags(fHasTransform);
}
TransformNode::~TransformNode() {
setParent(nullptr); // will recursively detach all children from scene if attached
for(auto i = sceneChildren_.size(); i > 0;) {
--i;
sceneChildren_.erase(sceneChildren_.begin() + i);
}
}
bool
TransformNode::removeChild(SceneNode *child) {
if(child != nullptr) {
for(auto i = sceneChildren_.size(); i > 0;) {
--i;
if(sceneChildren_[i].get() == child) {
child->setParent(nullptr); // will detach from scene recursively if attached
sceneChildren_.erase(sceneChildren_.begin() + i);
if(sceneChildren_.size() < 1) {
clearFlags(fHasChildren);
}
return(true);
}
}
}
return(false);
}
void
TransformNode::setChildrenWorldTransformModified() {
for (ObjectPtr<SceneNode> &child : sceneChildren_) {
if(child->hasTransform()) {
auto tChild = static_cast<TransformNode*>(child.get());
tChild->setWorldTransformModified();
}
}
}
SceneNode *
TransformNode::addChild(ObjectPtr<SceneNode> child) {
if(child) {
TransformNode *parent = child->getParent();
if(parent != this) {
if(parent != nullptr) {
parent->removeChild(child);
}
sceneChildren_.push_back(child);
child->setParent(this);
setFlags(fHasChildren);
setChildrenWorldTransformModified();
}
}
return(child.get());
}
void
SceneNode::forAllChildrenInTree(const std::function<bool(SceneNode *child)> &doChild, int flags) {
if((flags & (DepthFirst | Inclusive)) == (Inclusive)) {
doChild(this);
}
if(hasChildren()) {
TransformNode *tNode ((TransformNode *)this);
for(auto i = tNode->sceneChildren_.size(); i > 0;) {
--i;
SceneNode &child = *(tNode->sceneChildren_[i]);
child.forAllChildrenInTree(doChild, flags | Inclusive);
}
}
if((flags & (DepthFirst | Inclusive)) == (DepthFirst | Inclusive)) {
doChild(this);
}
}
ARTD_END