metro-rts/src/nav_room.cpp
2024-08-16 00:14:04 +02:00

61 lines
1.7 KiB
C++

#include "nav_room.hpp"
#include "nav_marker.hpp"
#include "utils/godot_macros.hpp"
#include <godot_cpp/classes/global_constants.hpp>
#include <cmath>
void NavRoom::_bind_methods() {
#define CLASSNAME NavRoom
GDPROPERTY_HINTED(neighbours_inspector, gd::Variant::ARRAY, gd::PROPERTY_HINT_ARRAY_TYPE, GDNODETYPE("NavRoom"));
}
NavRoom *NavRoom::get_closest_room(gd::Vector3 const &closest_to) {
NavRoom *candidate{nullptr};
float shortest_distance{INFINITY};
for(NavRoom *room : NavRoom::rooms) {
float const distance{room->get_global_position().distance_squared_to(closest_to)};
if(distance < shortest_distance) {
shortest_distance = distance;
candidate = room;
}
}
return candidate;
}
void NavRoom::_enter_tree() {
NavRoom::rooms.push_back(this);
this->connect("child_entered_tree", callable_mp(this, &NavRoom::on_child_entered));
}
void NavRoom::_exit_tree() {
NavRoom::rooms.erase(this);
}
void NavRoom::on_child_entered(gd::Node *child) {
if(NavMarker *marker{gd::Object::cast_to<NavMarker>(child)})
this->markers.push_back(marker);
}
gd::Vector<NavRoom*> const &NavRoom::get_neighbours() const {
return this->neighbours;
}
gd::Vector<NavMarker*> const &NavRoom::get_markers() const {
return this->markers;
}
gd::Array NavRoom::get_neighbours_inspector() const {
gd::Array a{};
for(NavRoom *room : this->neighbours)
a.push_back(room);
return a;
}
void NavRoom::set_neighbours_inspector(gd::Array array) {
this->neighbours.clear();
while(!array.is_empty()) if(NavRoom *room{gd::Object::cast_to<NavRoom>(array.pop_front())})
this->neighbours.push_back(room);
}
gd::Vector<NavRoom*> NavRoom::rooms{};