66 lines
1.5 KiB
C++
66 lines
1.5 KiB
C++
#include "graphicalcontainernode.h"
|
|
#include "scenetree.h"
|
|
|
|
GraphicalContainerNode::~GraphicalContainerNode()
|
|
{
|
|
setSceneTree(nullptr);
|
|
for(GraphicalNode* child : m_children)
|
|
delete child;
|
|
}
|
|
|
|
void GraphicalContainerNode::update()
|
|
{
|
|
if(m_transformChanged)
|
|
m_combinedTransform = m_transform * m_parentTransform;
|
|
for(GraphicalNode* child : m_children)
|
|
{
|
|
if(m_transformChanged)
|
|
child->setParentTransform(m_combinedTransform);
|
|
child->update();
|
|
}
|
|
}
|
|
|
|
void GraphicalContainerNode::setSceneTree(SceneTree* tree)
|
|
{
|
|
SceneNode::setSceneTree(tree);
|
|
for(GraphicalNode* child : m_children)
|
|
child->setSceneTree(tree);
|
|
}
|
|
|
|
void GraphicalContainerNode::addChild(GraphicalNode *node)
|
|
{
|
|
if(node != nullptr)
|
|
{
|
|
if(m_scene != nullptr)
|
|
node->setSceneTree(m_scene);
|
|
m_children.push_back(node);
|
|
node->m_parent = this;
|
|
node->setParentTransform(m_transform);
|
|
node->setParentVisible(isVisible());
|
|
}
|
|
}
|
|
|
|
void GraphicalContainerNode::removeChild(GraphicalNode *node)
|
|
{
|
|
if(node != nullptr)
|
|
{
|
|
for(auto it = m_children.begin(); it != m_children.end();)
|
|
{
|
|
if(*it == node)
|
|
{
|
|
it = m_children.erase(it);
|
|
node->m_parent = nullptr;
|
|
node->setSceneTree(nullptr);
|
|
}
|
|
else
|
|
++it;
|
|
}
|
|
}
|
|
}
|
|
|
|
void GraphicalContainerNode::updateVisibility(bool visible)
|
|
{
|
|
for(GraphicalNode* child : m_children)
|
|
child->setParentVisible(visible);
|
|
}
|