bluecore/engine/SceneNode.cpp

151 lines
2.6 KiB
C++

#include "SceneNode.h"
namespace BlueCore
{
#define DEBUG_SCENEGRAPH
SceneNode::SceneNode() :
Named("unnamed SceneNode"), _Parent(0)
{
#ifdef DEBUG_SCENEGRAPH
clog << "SceneNode 'Unnamed SceneNode' created." << endline;
#endif
}
SceneNode::SceneNode(const std::string &name) :
Named(name), _Parent(0)
{
#ifdef DEBUG_SCENEGRAPH
clog << "SceneNode '" << name << "' created." << endline;
#endif
}
SceneNode::~SceneNode()
{
detachAll();
#ifdef DEBUG_SCENEGRAPH
clog << "SceneNode '" << getName() << "' deleted." << endline;
#endif
}
void SceneNode::attach(SceneNode *node)
{
if (node == 0)
return;
_Children.push_back(node);
node->_Parent = this;
node->addReference();
#ifdef DEBUG_SCENEGRAPH
clog << "SceneNode '" << node->getName() << "' attached to '"
<< this->getName() << "'" << endline;
#endif
}
void SceneNode::detach(SceneNode *node)
{
node->_Parent = 0;
node->removeReference();
_Children.remove(node);
#ifdef DEBUG_SCENEGRAPH
clog << "SceneNode '" << node->getName() << "' detach from '"
<< this->getName() << "'" << endline;
#endif
}
void SceneNode::detachAll()
{
SceneNodeList::iterator i;
for (i = _Children.begin(); i != _Children.end(); i++)
{
( *i )->_Parent = 0;
( *i )->removeReference();
}
_Children.clear();
}
SceneNode *SceneNode::getParent() const
{
return _Parent;
}
void SceneNode::detachFromParent()
{
if (_Parent)
_Parent->detach( this);
}
const SceneNode::SceneNodeList& SceneNode::getChildren() const
{
return _Children;
}
void SceneNode::update(Scalar time)
{
updateAbsoluteTransformation();
// if (isActive() )
{
SceneNodeList::iterator i;
for (i = _Children.begin(); i != _Children.end(); i++)
( *i )->update(time);
}
}
void SceneNode::queue(RenderQueue *queue, Camera *camera)
{
if (isActive())
{
SceneNodeList::iterator i;
for (i = _Children.begin(); i != _Children.end(); i++)
{
( *i )->queue(queue, camera);
}
}
}
const Transformation& SceneNode::getRelativeTransformation()
{
return _RelativeTransformation;
}
const Transformation& SceneNode::getAbsoluteTransformation()
{
return _AbsoluteTransformation;
}
void SceneNode::setRelativeTranslation(const Vector3 &translation)
{
_RelativeTransformation.translation = translation;
}
void SceneNode::setRelativeRotation(const Quaternion &rotation)
{
_RelativeTransformation.rotation = rotation;
}
void SceneNode::updateAbsoluteTransformation()
{
/*
if (_Parent )
_AbsoluteTranslation = _Parent->getAbsoluteTranslation()
+_Parent->getAbsoluteRotation().inversed() * _RelativeTranslation;
else
_AbsoluteTranslation = _RelativeTranslation;
*/
}
} // namespace BlueCore