Calamity Engine 1.0.0
A cross-platform 2D game engine written in C++ and SDL3.
Loading...
Searching...
No Matches
node.hpp
Go to the documentation of this file.
1#pragma once
2#include "../definitions.hpp"
3#include "../../services/services.hpp"
4#include "../../utils/utils.hpp"
5#include "components.hpp"
6#include "../../services/input/keycode.hpp"
7// #include "../../services/graphics/definitions.hpp"
8#include <iostream>
9#include <cereal/types/vector.hpp>
10#include <cereal/types/memory.hpp>
11
12class Window;
13struct Transform;
14
30class Node : public std::enable_shared_from_this<Node>
31{
32public:
33 std::string name;
36
38
39 std::vector<std::shared_ptr<Node>> children;
40 std::vector<std::shared_ptr<Component>> components;
41
42 Node(const std::string &name = "Node");
43 virtual ~Node();
44 void free();
45
46 Node *getOwner();
47 std::shared_ptr<Window> getWindow();
48 void setWindow(std::shared_ptr<Window> window);
49
50 // children
51 void addChild(std::shared_ptr<Node> child);
52 void removeChild(std::shared_ptr<Node> child);
53 std::shared_ptr<Node> getChild(std::string name);
54 std::shared_ptr<Node> getChildByIndex(int index);
55
56 // components
57 void addComponent(std::shared_ptr<Component> component);
58 void removeComponent(std::shared_ptr<Component> component);
59 template <typename T>
60 std::shared_ptr<T> getComponent()
61 {
62 for (size_t i = 0; i < components.size(); ++i)
63 {
64 if (T *c = dynamic_cast<T *>(components[i].get()))
65 return std::dynamic_pointer_cast<T>(components[i]);
66 }
67 return nullptr;
68 };
69 std::shared_ptr<Component> getComponentByIndex(int index);
70
71 // state functions
72 virtual void render(Graphics &graphics, Engine *engine, std::shared_ptr<Window> window) const;
73 virtual void update(float deltaTime);
74 virtual void physicsUpdate() const; // runs locked at 60fps
75 virtual void initialize();
76 virtual void postLoad();
77 virtual void input(InputEvent &event);
78 virtual void exit() const;
79
80 template <class Archive>
81 void save(Archive &ar) const
82 {
83 ar(CEREAL_NVP(name), CEREAL_NVP(transform), CEREAL_NVP(components), CEREAL_NVP(children));
84 }
85
86 template <class Archive>
87 void load(Archive &ar)
88 {
89 ar(CEREAL_NVP(name), CEREAL_NVP(transform), CEREAL_NVP(components), CEREAL_NVP(children));
90
91 // rewire component back-pointers
92 for (auto &c : components)
93 {
94 c->setNode(this);
95 }
96
97 // rewire child parent pointers
98 for (auto &child : children)
99 {
100 child->parent = this;
101 child->setWindow(getWindow());
102 }
103
104 // calling postload here won't work. postLoad is reserved specifically after deserialization of the entire node tree.
105 // it is called by whatever the fuck loads whatever the fuck.
106 }
107
108private:
109 std::shared_ptr<Window> window;
110};
Definition engine.hpp:35
Definition graphics.hpp:26
Definition input.hpp:62
Definition node.hpp:31
virtual void update(float deltaTime)
Definition node.cpp:96
std::shared_ptr< Node > getChild(std::string name)
Definition node.cpp:196
void addChild(std::shared_ptr< Node > child)
Definition node.cpp:36
void removeComponent(std::shared_ptr< Component > component)
Definition node.cpp:68
Transform transform
Definition node.hpp:34
std::shared_ptr< Window > getWindow()
Definition node.cpp:236
std::shared_ptr< Component > getComponentByIndex(int index)
Definition node.cpp:217
std::vector< std::shared_ptr< Node > > children
Definition node.hpp:39
Transform globalTransform
Definition node.hpp:35
void addComponent(std::shared_ptr< Component > component)
Definition node.cpp:60
virtual void postLoad()
Definition node.cpp:181
void save(Archive &ar) const
Definition node.hpp:81
virtual void exit() const
Definition node.cpp:119
virtual void input(InputEvent &event)
Definition node.cpp:168
void load(Archive &ar)
Definition node.hpp:87
std::shared_ptr< T > getComponent()
Definition node.hpp:60
virtual ~Node()
Definition node.cpp:16
std::string name
Definition node.hpp:33
virtual void initialize()
Definition node.cpp:145
Node * getOwner()
Definition node.cpp:226
void removeChild(std::shared_ptr< Node > child)
Definition node.cpp:46
virtual void physicsUpdate() const
Definition node.cpp:132
std::shared_ptr< Node > getChildByIndex(int index)
Definition node.cpp:208
void setWindow(std::shared_ptr< Window > window)
Definition node.cpp:251
void free()
Definition node.cpp:24
Node * parent
Definition node.hpp:37
std::vector< std::shared_ptr< Component > > components
Definition node.hpp:40
virtual void render(Graphics &graphics, Engine *engine, std::shared_ptr< Window > window) const
Definition node.cpp:80
Definition definitions.hpp:64
Definition definitions.hpp:259