#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