Ember
A C++ 20 'game engine' built with SDL3 with wide platform support.
phys_obj.h
Go to the documentation of this file.
1 #pragma once
2 
3 #include "collision_shapes.h"
4 
5 
14 class PhysicsObject2D : public Node2D {
15 public:
17 
18 
19  void ready() override = 0;
20  void process(double delta_time) override = 0;
21  void draw(Renderer* renderer) override = 0;
22 
23  void set_layer(uint8_t new_layer);
24  void set_collision_mask(uint8_t mask);
25  void add_collision_layer(uint8_t target_layer);
26  void remove_collision_layer(uint8_t target_layer);
27 
28  void set_collision_layers(const std::initializer_list<uint8_t>& layers);
29 
30  [[nodiscard]] uint8_t get_collision_layer() const;
31 
32  [[nodiscard]] uint16_t get_collision_mask() const;
33  ~PhysicsObject2D() override;
34 
35  void on_body_entered(const std::function<void(Node2D*)>& callback);
36 
37  void on_body_exited(const std::function<void(Node2D*)>& callback);
38 
39  std::unordered_set<PhysicsObject2D*> overlapping;
40  std::vector<std::function<void(Node2D*)>> on_enter_callbacks;
41  std::vector<std::function<void(Node2D*)>> on_exit_callbacks;
42 
43  b2BodyId body_id = b2_nullBodyId;
44 
45  std::unique_ptr<CollisionShape> collision_shape;
46 
47 protected:
48  bool is_disabled = false;
49 
50  glm::vec4 color = glm::vec4(1, 0, 0, 0.5f);
51 
52 private:
53  uint8_t layer = 0; // < (0-15)
54  uint16_t collision_mask = 0xFFFF; // 16 bits for layers
55 };
2D Node base class for scene graph.
Definition: node.h:25
2D physical object node.
Definition: phys_obj.h:14
glm::vec4 color
Definition: phys_obj.h:50
void process(double delta_time) override=0
~PhysicsObject2D() override
Definition: phys_obj.cpp:8
b2BodyId body_id
Definition: phys_obj.h:43
bool is_disabled
Definition: phys_obj.h:48
void set_layer(uint8_t new_layer)
Definition: phys_obj.cpp:10
void set_collision_mask(uint8_t mask)
Definition: phys_obj.cpp:16
uint8_t get_collision_layer() const
Definition: phys_obj.cpp:40
std::vector< std::function< void(Node2D *)> > on_enter_callbacks
Definition: phys_obj.h:40
uint16_t get_collision_mask() const
Definition: phys_obj.cpp:44
void draw(Renderer *renderer) override=0
void remove_collision_layer(uint8_t target_layer)
Definition: phys_obj.cpp:25
void on_body_exited(const std::function< void(Node2D *)> &callback)
Definition: phys_obj.cpp:53
PhysicsObject2D()
Definition: phys_obj.cpp:4
std::unique_ptr< CollisionShape > collision_shape
Definition: phys_obj.h:45
void on_body_entered(const std::function< void(Node2D *)> &callback)
Definition: phys_obj.cpp:49
void set_collision_layers(const std::initializer_list< uint8_t > &layers)
Definition: phys_obj.cpp:31
void ready() override=0
void add_collision_layer(uint8_t target_layer)
Definition: phys_obj.cpp:19
std::vector< std::function< void(Node2D *)> > on_exit_callbacks
Definition: phys_obj.h:41
std::unordered_set< PhysicsObject2D * > overlapping
Definition: phys_obj.h:39
Base class for all renderers.
Definition: ember_core.h:109