bluecore/engine/SceneNode.cpp

174 lines
3.1 KiB
C++
Raw Permalink Normal View History

2008-01-16 12:45:17 +01:00
#include "SceneNode.h"
2008-01-20 11:16:37 +01:00
namespace BlueCore
{
2008-01-16 12:45:17 +01:00
#define DEBUG_SCENEGRAPH
SceneNode::SceneNode() :
2008-01-20 11:16:37 +01:00
Named("unnamed SceneNode"), _Parent(0)
2008-01-16 12:45:17 +01:00
{
#ifdef DEBUG_SCENEGRAPH
2008-01-20 11:16:37 +01:00
clog << "SceneNode 'Unnamed SceneNode' created." << endline;
2008-01-16 12:45:17 +01:00
#endif
}
SceneNode::SceneNode(const std::string &name) :
2008-01-20 11:16:37 +01:00
Named(name), _Parent(0)
2008-01-16 12:45:17 +01:00
{
#ifdef DEBUG_SCENEGRAPH
2008-01-20 11:16:37 +01:00
clog << "SceneNode '" << name << "' created." << endline;
2008-01-16 12:45:17 +01:00
#endif
}
SceneNode::~SceneNode()
{
2008-01-20 11:16:37 +01:00
detachAll();
2008-01-16 12:45:17 +01:00
2008-01-20 11:16:37 +01:00
#ifdef DEBUG_SCENEGRAPH
clog << "SceneNode '" << getName() << "' deleted." << endline;
#endif
2008-01-16 12:45:17 +01:00
}
void SceneNode::attach(SceneNode *node)
{
2008-01-20 11:16:37 +01:00
if (node == 0)
return;
2008-01-16 12:45:17 +01:00
2008-01-20 11:16:37 +01:00
_Children.push_back(node);
2008-01-16 12:45:17 +01:00
2008-01-20 11:16:37 +01:00
node->_Parent = this;
2008-01-16 12:45:17 +01:00
2008-01-20 11:16:37 +01:00
node->addReference();
2008-01-16 12:45:17 +01:00
#ifdef DEBUG_SCENEGRAPH
2008-01-20 11:16:37 +01:00
clog << "SceneNode '" << node->getName() << "' attached to '"
<< this->getName() << "'" << endline;
2008-01-16 12:45:17 +01:00
#endif
}
void SceneNode::detach(SceneNode *node)
{
2008-01-20 11:16:37 +01:00
node->_Parent = 0;
node->removeReference();
2008-01-16 12:45:17 +01:00
2008-01-20 11:16:37 +01:00
_Children.remove(node);
2008-01-16 12:45:17 +01:00
#ifdef DEBUG_SCENEGRAPH
2008-01-20 11:16:37 +01:00
clog << "SceneNode '" << node->getName() << "' detach from '"
<< this->getName() << "'" << endline;
2008-01-16 12:45:17 +01:00
#endif
}
void SceneNode::detachAll()
{
2008-01-20 11:16:37 +01:00
SceneNodeList::iterator i;
2008-01-16 12:45:17 +01:00
2008-01-20 11:16:37 +01:00
for (i = _Children.begin(); i != _Children.end(); i++)
{
( *i )->_Parent = 0;
( *i )->removeReference();
}
2008-01-16 12:45:17 +01:00
2008-01-20 11:16:37 +01:00
_Children.clear();
2008-01-16 12:45:17 +01:00
}
SceneNode *SceneNode::getParent() const
{
2008-01-20 11:16:37 +01:00
return _Parent;
2008-01-16 12:45:17 +01:00
}
void SceneNode::detachFromParent()
{
2008-01-20 11:16:37 +01:00
if (_Parent)
_Parent->detach( this);
2008-01-16 12:45:17 +01:00
}
2008-01-20 11:16:37 +01:00
const SceneNode::SceneNodeList& SceneNode::getChildren() const
2008-01-16 12:45:17 +01:00
{
2008-01-20 11:16:37 +01:00
return _Children;
2008-01-16 12:45:17 +01:00
}
void SceneNode::update(Scalar time)
{
2008-01-20 11:16:37 +01:00
updateAbsoluteTransformation();
2008-01-16 12:45:17 +01:00
2008-01-20 11:16:37 +01:00
// if (isActive() )
{
SceneNodeList::iterator i;
2008-01-16 12:45:17 +01:00
2008-01-20 11:16:37 +01:00
for (i = _Children.begin(); i != _Children.end(); i++)
( *i )->update(time);
}
2008-01-16 12:45:17 +01:00
}
2008-01-20 11:16:37 +01:00
void SceneNode::queue(RenderQueue *queue, Camera *camera)
2008-01-16 12:45:17 +01:00
{
2008-01-20 11:16:37 +01:00
if (isActive())
{
2008-01-24 23:16:53 +01:00
if (_Model.valid())
queue->addOpaqueItem(_Model, _AbsoluteTransformation.translation,
_AbsoluteTransformation.rotation);
2008-01-16 12:45:17 +01:00
2008-01-24 23:16:53 +01:00
SceneNodeList::iterator i;
2008-01-20 11:16:37 +01:00
for (i = _Children.begin(); i != _Children.end(); i++)
{
( *i )->queue(queue, camera);
}
}
2008-01-16 12:45:17 +01:00
}
const Transformation& SceneNode::getRelativeTransformation()
{
2008-01-20 11:16:37 +01:00
return _RelativeTransformation;
2008-01-16 12:45:17 +01:00
}
const Transformation& SceneNode::getAbsoluteTransformation()
{
2008-01-20 11:16:37 +01:00
return _AbsoluteTransformation;
2008-01-16 12:45:17 +01:00
}
void SceneNode::setRelativeTranslation(const Vector3 &translation)
{
2008-01-20 11:16:37 +01:00
_RelativeTransformation.translation = translation;
2008-01-16 12:45:17 +01:00
}
2008-01-20 11:16:37 +01:00
void SceneNode::setRelativeRotation(const Quaternion &rotation)
2008-01-16 12:45:17 +01:00
{
2008-01-20 11:16:37 +01:00
_RelativeTransformation.rotation = rotation;
2008-01-16 12:45:17 +01:00
}
void SceneNode::updateAbsoluteTransformation()
{
2008-01-24 23:16:53 +01:00
if (_Parent)
{
_AbsoluteTransformation.translation = _Parent->getAbsoluteTransformation().translation
+_Parent->getAbsoluteTransformation().rotation.inversed().apply(_RelativeTransformation.translation);
}
else
_AbsoluteTransformation.translation = _RelativeTransformation.translation;
}
void SceneNode::setRigidBody(RigidBody* body)
{
_RigidBody = body;
}
RigidBody* SceneNode::getRigidBody()
{
return _RigidBody.pointer();
}
void SceneNode::setModel(Model* model)
{
_Model = model;
}
Model* SceneNode::getModel()
{
return _Model.pointer();
2008-01-16 12:45:17 +01:00
}
} // namespace BlueCore