163 lines
3.9 KiB
C++
163 lines
3.9 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::render(RenderDevice *device, Camera *camera)
|
|
{
|
|
if (isActive() )
|
|
{
|
|
SceneNodeList::iterator i;
|
|
|
|
for (i = _Children.begin(); i != _Children.end(); i++)
|
|
{
|
|
( *i )->render(device, 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
|