4#include <glm/gtc/quaternion.hpp>
24 class SceneNode :
public std::enable_shared_from_this<SceneNode> {
155 void addChild(
const std::shared_ptr<SceneNode> &newChild);
165 void addChildren(std::vector<std::shared_ptr<SceneNode>> newChildren);
183 void removeChild(
const std::shared_ptr<SceneNode> &child);
223 std::vector<std::weak_ptr<SceneNode>>
getChildren()
const;
236 std::shared_ptr<SceneNode>
parent =
nullptr;
268 std::shared_ptr<SceneNode>
root;
285 const std::shared_ptr<SceneNode>&
getRoot()
const {
return root; }
300 bool disableCaching =
false);
320 static std::shared_ptr<SceneNode>
createNode(
const std::shared_ptr<SceneNode>& parent,
const bool disableCaching =
false);
331 static std::vector<std::shared_ptr<SceneNode>>
createNodes(
332 const std::shared_ptr<SceneNode>& parent,
334 bool disableCaching =
false);
344 static std::shared_ptr<RootNode>
createRoot(
bool disableCaching =
false) {
346 shared->registerWithEcs();
static entt::registry & get()
Gets the registry for all components.
Factory class for creating SceneNodes with proper parent-child relationships. This ensures that nodes...
static std::shared_ptr< SceneNode > createNode(const std::shared_ptr< SceneNode > &parent, const bool disableCaching=false)
Creates a new SceneNode with the specified parent.
static std::vector< std::shared_ptr< SceneNode > > createNodes(const std::shared_ptr< SceneNode > &parent, size_t count, bool disableCaching=false)
Creates multiple nodes under the same parent.
static std::shared_ptr< RootNode > createRoot(bool disableCaching=false)
Creates a new root node for a scene graph. This is the only way to create a parentless node,...
RootNode(entt::registry ®istry)
SceneGraph(const std::shared_ptr< SceneNode > &root)
Constructs a new Scene Graph object, initializing the root node.
std::shared_ptr< SceneNode > createNode(const Ecs::LocalTransform &transform, std::shared_ptr< SceneNode > parent, bool disableCaching=false)
Creates a node which tells you where an object is in the scene.
const std::shared_ptr< SceneNode > & getRoot() const
Gets the root node of the scene graph.
std::shared_ptr< SceneNode > root
std::vector< std::shared_ptr< SceneNode > > children
void removeChild(const std::shared_ptr< SceneNode > &child)
Removes a single child from this node.
std::vector< std::weak_ptr< SceneNode > > getChildren() const
Get a list of all children of this node.
void setWorldScale(const glm::vec3 &newScale)
sets the scale for this node
void setWorldPosition(const glm::vec3 &newLocation)
Sets the world position of the scene node. This will calculate the corresponding local position based...
bool isWorldMatrixDirty() const
Checks if the world matrix has to be recalculated.
void setWorldRotation(const glm::vec3 &newRotation)
Sets the world rotation of this node with euler angles.
void addChild(const std::shared_ptr< SceneNode > &newChild)
Adds a child node to this node.
void clearChildren()
Removes all children from this node.
bool isRoot() const
Checks if this node is the root node.
const glm::mat4 & getWorldMatrix() const
get the world matrix as a raw glm matrix
void updateWorldMatrix() const
void rotateWorld(const glm::vec3 &deltaRotation)
Applies an incremental rotation to the current world rotation using quaternion multiplication....
void markDirtyRecursive()
Marks this node and its children as dirty.
void setLocalModelMatrix(const glm::mat4 &newModelMatrix)
Overwrites all components of the transform.
SceneNode(entt::registry ®istry, bool disableCaching=false)
Constructs a new Scene Node object.
entt::registry * registry
Ecs::LocalTransform & getLocalTransform()
Gets the local transform of the scene node. The local transform is relative to the parent node.
std::shared_ptr< SceneNode > parent
void setWorldModelMatrix(const glm::mat4 &newModelMatrix)
Overwrites all components of this transform.
void addChildren(std::vector< std::shared_ptr< SceneNode > > newChildren)
adds new children to this node
entt::entity getEntity() const
Gets the entity associated with this scene node.
Data structs for the Entity Component System.
Log category system implementation.