Ember
A C++ 20 'game engine' built with SDL3 with wide platform support.
node.h
Go to the documentation of this file.
1 #pragma once
2 #include "../systems/input_manager.h"
3 #include "../systems/logging_sys.h"
4 #include "core/engine_structs.h"
5 #include "core/renderer/shader.h"
7 #include "transform_node.h"
8 
9 
10 
11 class Renderer;
12 
25 class Node2D {
26 public:
27  Node2D();
28 
29  explicit Node2D(std::string name) : _name(std::move(name)) {
30  }
31 
32  void set_z_index(int index);
33 
34  [[nodiscard]] int get_z_index() const;
35 
36  [[nodiscard]] int get_effective_z_index() const;
37 
38  void print_tree(int indent = 0) const;
39 
40  void change_visibility(bool visible);
41 
42  void translate(float dx, float dy);
43 
44  void rotate(float radians);
45 
46  void scale(float sx, float sy);
47 
48 
49  [[nodiscard]] Transform2D get_global_transform() const;
50 
51  [[nodiscard]] Transform2D get_transform() const;
52 
53  void set_transform(const Transform2D& transform);
54 
55  void add_child(const std::string& base_name, Node2D* node);
56 
57  Node2D* get_node(const std::string& path);
58 
59  template <typename T>
60  T* get_node();
61 
62  virtual void ready();
63 
64  virtual void process(double delta_time);
65 
66  virtual void draw(Renderer* renderer);
67 
68  virtual void input(const InputManager* input);
69 
70  virtual void draw_inspector();
71 
72  virtual void draw_hierarchy();
73 
74  void queue_free();
75 
76  virtual ~Node2D();
77 
78  [[nodiscard]] const std::string& get_name() const;
79 
80  [[nodiscard]] bool is_visible() const;
81 
82  [[nodiscard]] bool is_effective_visible() const;
83 
85 
86  bool is_alive() const;
87 
88 protected:
90 
91  std::string _name = "Node";
92 
93  int _z_index = 0;
94 
95  bool _is_visible = true;
96 
97  bool _is_ready = false;
98 
99  bool _to_free = false;
100 private:
101  Node2D* _parent = nullptr;
103 };
104 
105 
106 template <typename T>
108  if (auto self_as_t = dynamic_cast<T*>(this)) {
109  return self_as_t;
110  }
111 
112  for (auto& [name, child] : _nodes) {
113  if (auto val = dynamic_cast<T*>(child)) {
114  return val;
115  }
116  }
117 
118  for (auto& [name, child] : _nodes) {
119  if (auto val = child->get_node<T>()) {
120  return val;
121  }
122  }
123 
124  LOG_WARN("Node of requested type %s was not found.", typeid(T).name());
125 
126  return nullptr;
127 }
128 
129 
130 inline Node2D* g_selected_node = nullptr;
Definition: input_manager.h:117
2D Node base class for scene graph.
Definition: node.h:25
void change_visibility(bool visible)
Definition: node.cpp:153
int get_effective_z_index() const
Definition: node.cpp:31
virtual void ready()
Definition: node.cpp:157
bool _is_visible
Definition: node.h:95
HashMap< std::string, Node2D * > & get_tree()
Definition: node.cpp:144
virtual void draw(Renderer *renderer)
Definition: node.cpp:189
Transform2D _transform
Definition: node.h:89
void print_tree(int indent=0) const
Definition: node.cpp:38
void rotate(float radians)
Definition: node.cpp:8
virtual void draw_hierarchy()
Definition: node.cpp:256
int _z_index
Definition: node.h:93
std::string _name
Definition: node.h:91
virtual void draw_inspector()
Definition: node.cpp:210
virtual void process(double delta_time)
Definition: node.cpp:171
bool is_visible() const
Definition: node.cpp:130
Transform2D get_transform() const
Definition: node.cpp:65
void add_child(const std::string &base_name, Node2D *node)
Definition: node.cpp:85
void translate(float dx, float dy)
Definition: node.cpp:4
void set_transform(const Transform2D &transform)
Definition: node.cpp:69
Node2D(std::string name)
Definition: node.h:29
const std::string & get_name() const
Definition: node.cpp:126
void set_z_index(int index)
Definition: node.cpp:18
bool _is_ready
Definition: node.h:97
bool is_alive() const
Definition: node.cpp:148
void queue_free()
Definition: node.cpp:306
Transform2D get_global_transform() const
Definition: node.cpp:50
virtual ~Node2D()
Definition: node.cpp:74
T * get_node()
Definition: node.h:107
bool _to_free
Definition: node.h:99
int get_z_index() const
Definition: node.cpp:27
virtual void input(const InputManager *input)
Definition: node.cpp:199
bool is_effective_visible() const
Definition: node.cpp:134
void scale(float sx, float sy)
Definition: node.cpp:12
Base class for all renderers.
Definition: ember_core.h:109
std::unordered_map< K, V > HashMap
Definition: imports.h:12
#define LOG_WARN(...)
WARNING logging.
Definition: logging_sys.h:120
Node2D * g_selected_node
Definition: node.h:130
Transform struct 2D.
Definition: transform_node.h:11