R-Type 0.1
Loading...
Searching...
No Matches
AABBCollider.hpp
1#pragma once
2
3#include <Registry.hpp>
4#include <cstdint>
5#include <nlohmann/json.hpp>
6#include <string>
7
11namespace Collider {
20enum CollisionLayer : std::uint32_t {
21 Player = 1 << 0,
22 Enemy = 1 << 1,
24 EnemyProjectile = 1 << 3,
25 Environment = 1 << 4
26};
27
29} // namespace Collider
30
31namespace component {
41 float offsetX = 0.f;
42 float offsetY = 0.f;
43 float width = 0.f;
44 float height = 0.f;
45
46 std::uint32_t layer = 1;
47 std::uint32_t mask = 0xFFFFFFFF;
48
49 bool trigger = true;
50};
51
57inline std::uint32_t stringToLayer(const std::string &name) {
58 if (name == "Player")
60 if (name == "Enemy")
62 if (name == "PlayerProjectile")
64 if (name == "EnemyProjectile")
66 if (name == "Environment")
68 return 0;
69}
70
77inline void aabbColliderFromJson(rtk::ecs::Registry &reg, std::size_t entity,
78 const nlohmann::json &data) {
79 component::AABBCollider collider{};
80 collider.offsetX = data.value("offsetX", data.value("offset_x", 0.0f));
81 collider.offsetY = data.value("offsetY", data.value("offset_y", 0.0f));
82 collider.width = data.value("width", 0.0f);
83 collider.height = data.value("height", 0.0f);
84 collider.trigger = data.value("trigger", true);
85
86 if (data.contains("layer") && data["layer"].is_string()) {
87 collider.layer = stringToLayer(data["layer"].get<std::string>());
88 } else {
89 collider.layer = data.value("layer", 1u);
90 }
91
92 if (data.contains("mask") && data["mask"].is_array()) {
93 collider.mask = 0;
94 for (const auto &maskStr : data["mask"]) {
95 collider.mask |= stringToLayer(maskStr.get<std::string>());
96 }
97 } else {
98 collider.mask = data.value("mask", 0xFFFFFFFFu);
99 }
100
101 reg.get_components<component::AABBCollider>().insert_at(entity, collider);
102}
103
105} // namespace component
std::uint32_t stringToLayer(const std::string &name)
Converts a layer name to its bit flag.
Definition AABBCollider.hpp:57
CollisionLayer
Bit flags naming the group a collider belongs to.
Definition AABBCollider.hpp:20
void aabbColliderFromJson(rtk::ecs::Registry &reg, std::size_t entity, const nlohmann::json &data)
Adds an AABBCollider to an entity from its blueprint data.
Definition AABBCollider.hpp:77
@ Environment
Stage walls and obstacles.
Definition AABBCollider.hpp:25
@ Enemy
Bydos enemies.
Definition AABBCollider.hpp:22
@ EnemyProjectile
Missiles fired by enemies.
Definition AABBCollider.hpp:24
@ PlayerProjectile
Missiles fired by players.
Definition AABBCollider.hpp:23
@ Player
Player ships.
Definition AABBCollider.hpp:21
Collision layer definitions.
Definition AABBCollider.hpp:11
Axis aligned bounding box used for collision detection.
Definition AABBCollider.hpp:40
std::uint32_t layer
Layers this collider belongs to.
Definition AABBCollider.hpp:46
float offsetY
Box offset from the entity position on y.
Definition AABBCollider.hpp:42
float height
Box height before scaling.
Definition AABBCollider.hpp:44
std::uint32_t mask
Layers this collider reacts to.
Definition AABBCollider.hpp:47
bool trigger
Reports overlaps without physical response.
Definition AABBCollider.hpp:49
float width
Box width before scaling.
Definition AABBCollider.hpp:43
float offsetX
Box offset from the entity position on x.
Definition AABBCollider.hpp:41