40class SceneNode :
public std::enable_shared_from_this<SceneNode<Type>>
42 struct Private {
explicit Private() =
default; };
60 std::weak_ptr<SceneNode>
parent,
63 std::string_view
name)
65 _coordinate_system{
Math::BasicDualQuaternion<Type>::make_coordinate_system(rotation, translation.x, translation.y, translation.z) },
79 static std::shared_ptr<SceneNode<Type>>
make()
81 return std::make_shared<SceneNode<Type>>(Private{});
85 std::weak_ptr<SceneNode<Type>>
parent()
const {
return _parent; }
92 std::string_view
name()
const {
return _name; }
96 std::string_view
name = std::string_view())
98 std::shared_ptr<SceneNode<Type>> new_node =
make( this->weak_from_this(), translation, rotation,
name );
100 _children.push_back( new_node );
107 auto iter = std::ranges::find(_children, item_to_detach);
109 if (iter != _children.end())
112 (*iter)->_parent.reset();
113 _children.erase(iter);
119 assert( std::ranges::find(_children, node) == _children.end() );
121 _children.push_back( node );
122 node->_parent = this->weak_from_this();
128 using namespace Math;
137 return result.dual().imaginary();
145 return result.translation();
151 if (_parent.expired())
152 return _coordinate_system;
154 return _parent.lock()->concatenatedTransforms() * _coordinate_system;
158 std::weak_ptr<SceneNode<Type>> _parent;
159 SceneNodeList<Type> _children;
165 std::string_view
name)
167 return std::make_shared<SceneNode<Type>>(Private{},
parent, translation, rotation,
name);
constexpr BasicDualQuaternion< T > conjugate() const
constexpr const T & real() const
const SceneNodeList< Type > & children() const
void attachChild(std::shared_ptr< SceneNode< Type > > node)
std::string_view name() const
const Math::BasicDualQuaternion< Type > & coordinate_system() const
std::weak_ptr< SceneNode< Type > > parent() const
Math::BasicDualQuaternion< Type > & coordinate_system()
Math::BasicDualQuaternion< Type > concatenatedTransforms() const
std::vector< std::shared_ptr< SceneNode< T > > > SceneNodeList
static std::shared_ptr< SceneNode< Type > > make()
void detachChild(std::shared_ptr< SceneNode< Type > > item_to_detach)
SceneNode(Private, std::weak_ptr< SceneNode > parent, const Math::BasicVector3D< Type > &translation, const Math::BasicQuaternion< Type > &rotation, std::string_view name)
Math::BasicVector3D< Type > localToWorld(const Math::BasicVector3D< Type > &local_coordinate) const
std::weak_ptr< SceneNode< Type > > createChildNode(const Math::BasicVector3D< Type > &translation=Math::BasicVector3D< Type >::zero(), const Math::BasicQuaternion< Type > &rotation=Math::BasicQuaternion< Type >::identity(), std::string_view name=std::string_view())