|
@@ -391,6 +391,13 @@ COMMAND_2(region_set_transform, RID, p_region, Transform3D, p_transform) {
|
|
region->set_transform(p_transform);
|
|
region->set_transform(p_transform);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+Transform3D GodotNavigationServer::region_get_transform(RID p_region) const {
|
|
|
|
+ NavRegion *region = region_owner.get_or_null(p_region);
|
|
|
|
+ ERR_FAIL_NULL_V(region, Transform3D());
|
|
|
|
+
|
|
|
|
+ return region->get_transform();
|
|
|
|
+}
|
|
|
|
+
|
|
COMMAND_2(region_set_enter_cost, RID, p_region, real_t, p_enter_cost) {
|
|
COMMAND_2(region_set_enter_cost, RID, p_region, real_t, p_enter_cost) {
|
|
NavRegion *region = region_owner.get_or_null(p_region);
|
|
NavRegion *region = region_owner.get_or_null(p_region);
|
|
ERR_FAIL_NULL(region);
|
|
ERR_FAIL_NULL(region);
|
|
@@ -719,6 +726,13 @@ COMMAND_2(agent_set_neighbor_distance, RID, p_agent, real_t, p_distance) {
|
|
agent->set_neighbor_distance(p_distance);
|
|
agent->set_neighbor_distance(p_distance);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+real_t GodotNavigationServer::agent_get_neighbor_distance(RID p_agent) const {
|
|
|
|
+ NavAgent *agent = agent_owner.get_or_null(p_agent);
|
|
|
|
+ ERR_FAIL_NULL_V(agent, 0);
|
|
|
|
+
|
|
|
|
+ return agent->get_neighbor_distance();
|
|
|
|
+}
|
|
|
|
+
|
|
COMMAND_2(agent_set_max_neighbors, RID, p_agent, int, p_count) {
|
|
COMMAND_2(agent_set_max_neighbors, RID, p_agent, int, p_count) {
|
|
NavAgent *agent = agent_owner.get_or_null(p_agent);
|
|
NavAgent *agent = agent_owner.get_or_null(p_agent);
|
|
ERR_FAIL_NULL(agent);
|
|
ERR_FAIL_NULL(agent);
|
|
@@ -726,22 +740,43 @@ COMMAND_2(agent_set_max_neighbors, RID, p_agent, int, p_count) {
|
|
agent->set_max_neighbors(p_count);
|
|
agent->set_max_neighbors(p_count);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+int GodotNavigationServer::agent_get_max_neighbors(RID p_agent) const {
|
|
|
|
+ NavAgent *agent = agent_owner.get_or_null(p_agent);
|
|
|
|
+ ERR_FAIL_NULL_V(agent, 0);
|
|
|
|
+
|
|
|
|
+ return agent->get_max_neighbors();
|
|
|
|
+}
|
|
|
|
+
|
|
COMMAND_2(agent_set_time_horizon_agents, RID, p_agent, real_t, p_time_horizon) {
|
|
COMMAND_2(agent_set_time_horizon_agents, RID, p_agent, real_t, p_time_horizon) {
|
|
- ERR_FAIL_COND_MSG(p_time_horizon < 0.0, "Time horizion must be positive.");
|
|
|
|
|
|
+ ERR_FAIL_COND_MSG(p_time_horizon < 0.0, "Time horizon must be positive.");
|
|
NavAgent *agent = agent_owner.get_or_null(p_agent);
|
|
NavAgent *agent = agent_owner.get_or_null(p_agent);
|
|
ERR_FAIL_NULL(agent);
|
|
ERR_FAIL_NULL(agent);
|
|
|
|
|
|
agent->set_time_horizon_agents(p_time_horizon);
|
|
agent->set_time_horizon_agents(p_time_horizon);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+real_t GodotNavigationServer::agent_get_time_horizon_agents(RID p_agent) const {
|
|
|
|
+ NavAgent *agent = agent_owner.get_or_null(p_agent);
|
|
|
|
+ ERR_FAIL_NULL_V(agent, 0);
|
|
|
|
+
|
|
|
|
+ return agent->get_time_horizon_agents();
|
|
|
|
+}
|
|
|
|
+
|
|
COMMAND_2(agent_set_time_horizon_obstacles, RID, p_agent, real_t, p_time_horizon) {
|
|
COMMAND_2(agent_set_time_horizon_obstacles, RID, p_agent, real_t, p_time_horizon) {
|
|
- ERR_FAIL_COND_MSG(p_time_horizon < 0.0, "Time horizion must be positive.");
|
|
|
|
|
|
+ ERR_FAIL_COND_MSG(p_time_horizon < 0.0, "Time horizon must be positive.");
|
|
NavAgent *agent = agent_owner.get_or_null(p_agent);
|
|
NavAgent *agent = agent_owner.get_or_null(p_agent);
|
|
ERR_FAIL_NULL(agent);
|
|
ERR_FAIL_NULL(agent);
|
|
|
|
|
|
agent->set_time_horizon_obstacles(p_time_horizon);
|
|
agent->set_time_horizon_obstacles(p_time_horizon);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+real_t GodotNavigationServer::agent_get_time_horizon_obstacles(RID p_agent) const {
|
|
|
|
+ NavAgent *agent = agent_owner.get_or_null(p_agent);
|
|
|
|
+ ERR_FAIL_NULL_V(agent, 0);
|
|
|
|
+
|
|
|
|
+ return agent->get_time_horizon_obstacles();
|
|
|
|
+}
|
|
|
|
+
|
|
COMMAND_2(agent_set_radius, RID, p_agent, real_t, p_radius) {
|
|
COMMAND_2(agent_set_radius, RID, p_agent, real_t, p_radius) {
|
|
ERR_FAIL_COND_MSG(p_radius < 0.0, "Radius must be positive.");
|
|
ERR_FAIL_COND_MSG(p_radius < 0.0, "Radius must be positive.");
|
|
NavAgent *agent = agent_owner.get_or_null(p_agent);
|
|
NavAgent *agent = agent_owner.get_or_null(p_agent);
|
|
@@ -750,6 +785,13 @@ COMMAND_2(agent_set_radius, RID, p_agent, real_t, p_radius) {
|
|
agent->set_radius(p_radius);
|
|
agent->set_radius(p_radius);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+real_t GodotNavigationServer::agent_get_radius(RID p_agent) const {
|
|
|
|
+ NavAgent *agent = agent_owner.get_or_null(p_agent);
|
|
|
|
+ ERR_FAIL_NULL_V(agent, 0);
|
|
|
|
+
|
|
|
|
+ return agent->get_radius();
|
|
|
|
+}
|
|
|
|
+
|
|
COMMAND_2(agent_set_height, RID, p_agent, real_t, p_height) {
|
|
COMMAND_2(agent_set_height, RID, p_agent, real_t, p_height) {
|
|
ERR_FAIL_COND_MSG(p_height < 0.0, "Height must be positive.");
|
|
ERR_FAIL_COND_MSG(p_height < 0.0, "Height must be positive.");
|
|
NavAgent *agent = agent_owner.get_or_null(p_agent);
|
|
NavAgent *agent = agent_owner.get_or_null(p_agent);
|
|
@@ -758,6 +800,13 @@ COMMAND_2(agent_set_height, RID, p_agent, real_t, p_height) {
|
|
agent->set_height(p_height);
|
|
agent->set_height(p_height);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+real_t GodotNavigationServer::agent_get_height(RID p_agent) const {
|
|
|
|
+ NavAgent *agent = agent_owner.get_or_null(p_agent);
|
|
|
|
+ ERR_FAIL_NULL_V(agent, 0);
|
|
|
|
+
|
|
|
|
+ return agent->get_height();
|
|
|
|
+}
|
|
|
|
+
|
|
COMMAND_2(agent_set_max_speed, RID, p_agent, real_t, p_max_speed) {
|
|
COMMAND_2(agent_set_max_speed, RID, p_agent, real_t, p_max_speed) {
|
|
ERR_FAIL_COND_MSG(p_max_speed < 0.0, "Max speed must be positive.");
|
|
ERR_FAIL_COND_MSG(p_max_speed < 0.0, "Max speed must be positive.");
|
|
NavAgent *agent = agent_owner.get_or_null(p_agent);
|
|
NavAgent *agent = agent_owner.get_or_null(p_agent);
|
|
@@ -766,6 +815,13 @@ COMMAND_2(agent_set_max_speed, RID, p_agent, real_t, p_max_speed) {
|
|
agent->set_max_speed(p_max_speed);
|
|
agent->set_max_speed(p_max_speed);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+real_t GodotNavigationServer::agent_get_max_speed(RID p_agent) const {
|
|
|
|
+ NavAgent *agent = agent_owner.get_or_null(p_agent);
|
|
|
|
+ ERR_FAIL_NULL_V(agent, 0);
|
|
|
|
+
|
|
|
|
+ return agent->get_max_speed();
|
|
|
|
+}
|
|
|
|
+
|
|
COMMAND_2(agent_set_velocity, RID, p_agent, Vector3, p_velocity) {
|
|
COMMAND_2(agent_set_velocity, RID, p_agent, Vector3, p_velocity) {
|
|
NavAgent *agent = agent_owner.get_or_null(p_agent);
|
|
NavAgent *agent = agent_owner.get_or_null(p_agent);
|
|
ERR_FAIL_NULL(agent);
|
|
ERR_FAIL_NULL(agent);
|
|
@@ -773,6 +829,13 @@ COMMAND_2(agent_set_velocity, RID, p_agent, Vector3, p_velocity) {
|
|
agent->set_velocity(p_velocity);
|
|
agent->set_velocity(p_velocity);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+Vector3 GodotNavigationServer::agent_get_velocity(RID p_agent) const {
|
|
|
|
+ NavAgent *agent = agent_owner.get_or_null(p_agent);
|
|
|
|
+ ERR_FAIL_NULL_V(agent, Vector3());
|
|
|
|
+
|
|
|
|
+ return agent->get_velocity();
|
|
|
|
+}
|
|
|
|
+
|
|
COMMAND_2(agent_set_velocity_forced, RID, p_agent, Vector3, p_velocity) {
|
|
COMMAND_2(agent_set_velocity_forced, RID, p_agent, Vector3, p_velocity) {
|
|
NavAgent *agent = agent_owner.get_or_null(p_agent);
|
|
NavAgent *agent = agent_owner.get_or_null(p_agent);
|
|
ERR_FAIL_NULL(agent);
|
|
ERR_FAIL_NULL(agent);
|
|
@@ -787,6 +850,13 @@ COMMAND_2(agent_set_position, RID, p_agent, Vector3, p_position) {
|
|
agent->set_position(p_position);
|
|
agent->set_position(p_position);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+Vector3 GodotNavigationServer::agent_get_position(RID p_agent) const {
|
|
|
|
+ NavAgent *agent = agent_owner.get_or_null(p_agent);
|
|
|
|
+ ERR_FAIL_NULL_V(agent, Vector3());
|
|
|
|
+
|
|
|
|
+ return agent->get_position();
|
|
|
|
+}
|
|
|
|
+
|
|
bool GodotNavigationServer::agent_is_map_changed(RID p_agent) const {
|
|
bool GodotNavigationServer::agent_is_map_changed(RID p_agent) const {
|
|
NavAgent *agent = agent_owner.get_or_null(p_agent);
|
|
NavAgent *agent = agent_owner.get_or_null(p_agent);
|
|
ERR_FAIL_NULL_V(agent, false);
|
|
ERR_FAIL_NULL_V(agent, false);
|
|
@@ -809,18 +879,39 @@ COMMAND_2(agent_set_avoidance_callback, RID, p_agent, Callable, p_callback) {
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+bool GodotNavigationServer::agent_has_avoidance_callback(RID p_agent) const {
|
|
|
|
+ NavAgent *agent = agent_owner.get_or_null(p_agent);
|
|
|
|
+ ERR_FAIL_NULL_V(agent, false);
|
|
|
|
+
|
|
|
|
+ return agent->has_avoidance_callback();
|
|
|
|
+}
|
|
|
|
+
|
|
COMMAND_2(agent_set_avoidance_layers, RID, p_agent, uint32_t, p_layers) {
|
|
COMMAND_2(agent_set_avoidance_layers, RID, p_agent, uint32_t, p_layers) {
|
|
NavAgent *agent = agent_owner.get_or_null(p_agent);
|
|
NavAgent *agent = agent_owner.get_or_null(p_agent);
|
|
ERR_FAIL_NULL(agent);
|
|
ERR_FAIL_NULL(agent);
|
|
agent->set_avoidance_layers(p_layers);
|
|
agent->set_avoidance_layers(p_layers);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+uint32_t GodotNavigationServer::agent_get_avoidance_layers(RID p_agent) const {
|
|
|
|
+ NavAgent *agent = agent_owner.get_or_null(p_agent);
|
|
|
|
+ ERR_FAIL_NULL_V(agent, 0);
|
|
|
|
+
|
|
|
|
+ return agent->get_avoidance_layers();
|
|
|
|
+}
|
|
|
|
+
|
|
COMMAND_2(agent_set_avoidance_mask, RID, p_agent, uint32_t, p_mask) {
|
|
COMMAND_2(agent_set_avoidance_mask, RID, p_agent, uint32_t, p_mask) {
|
|
NavAgent *agent = agent_owner.get_or_null(p_agent);
|
|
NavAgent *agent = agent_owner.get_or_null(p_agent);
|
|
ERR_FAIL_NULL(agent);
|
|
ERR_FAIL_NULL(agent);
|
|
agent->set_avoidance_mask(p_mask);
|
|
agent->set_avoidance_mask(p_mask);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+uint32_t GodotNavigationServer::agent_get_avoidance_mask(RID p_agent) const {
|
|
|
|
+ NavAgent *agent = agent_owner.get_or_null(p_agent);
|
|
|
|
+ ERR_FAIL_NULL_V(agent, 0);
|
|
|
|
+
|
|
|
|
+ return agent->get_avoidance_mask();
|
|
|
|
+}
|
|
|
|
+
|
|
COMMAND_2(agent_set_avoidance_priority, RID, p_agent, real_t, p_priority) {
|
|
COMMAND_2(agent_set_avoidance_priority, RID, p_agent, real_t, p_priority) {
|
|
ERR_FAIL_COND_MSG(p_priority < 0.0, "Avoidance priority must be between 0.0 and 1.0 inclusive.");
|
|
ERR_FAIL_COND_MSG(p_priority < 0.0, "Avoidance priority must be between 0.0 and 1.0 inclusive.");
|
|
ERR_FAIL_COND_MSG(p_priority > 1.0, "Avoidance priority must be between 0.0 and 1.0 inclusive.");
|
|
ERR_FAIL_COND_MSG(p_priority > 1.0, "Avoidance priority must be between 0.0 and 1.0 inclusive.");
|
|
@@ -829,6 +920,13 @@ COMMAND_2(agent_set_avoidance_priority, RID, p_agent, real_t, p_priority) {
|
|
agent->set_avoidance_priority(p_priority);
|
|
agent->set_avoidance_priority(p_priority);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+real_t GodotNavigationServer::agent_get_avoidance_priority(RID p_agent) const {
|
|
|
|
+ NavAgent *agent = agent_owner.get_or_null(p_agent);
|
|
|
|
+ ERR_FAIL_NULL_V(agent, 0);
|
|
|
|
+
|
|
|
|
+ return agent->get_avoidance_priority();
|
|
|
|
+}
|
|
|
|
+
|
|
RID GodotNavigationServer::obstacle_create() {
|
|
RID GodotNavigationServer::obstacle_create() {
|
|
MutexLock lock(operations_mutex);
|
|
MutexLock lock(operations_mutex);
|
|
|
|
|
|
@@ -913,12 +1011,26 @@ COMMAND_2(obstacle_set_radius, RID, p_obstacle, real_t, p_radius) {
|
|
obstacle->set_radius(p_radius);
|
|
obstacle->set_radius(p_radius);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+real_t GodotNavigationServer::obstacle_get_radius(RID p_obstacle) const {
|
|
|
|
+ NavObstacle *obstacle = obstacle_owner.get_or_null(p_obstacle);
|
|
|
|
+ ERR_FAIL_NULL_V(obstacle, 0);
|
|
|
|
+
|
|
|
|
+ return obstacle->get_radius();
|
|
|
|
+}
|
|
|
|
+
|
|
COMMAND_2(obstacle_set_height, RID, p_obstacle, real_t, p_height) {
|
|
COMMAND_2(obstacle_set_height, RID, p_obstacle, real_t, p_height) {
|
|
NavObstacle *obstacle = obstacle_owner.get_or_null(p_obstacle);
|
|
NavObstacle *obstacle = obstacle_owner.get_or_null(p_obstacle);
|
|
ERR_FAIL_NULL(obstacle);
|
|
ERR_FAIL_NULL(obstacle);
|
|
obstacle->set_height(p_height);
|
|
obstacle->set_height(p_height);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+real_t GodotNavigationServer::obstacle_get_height(RID p_obstacle) const {
|
|
|
|
+ NavObstacle *obstacle = obstacle_owner.get_or_null(p_obstacle);
|
|
|
|
+ ERR_FAIL_NULL_V(obstacle, 0);
|
|
|
|
+
|
|
|
|
+ return obstacle->get_height();
|
|
|
|
+}
|
|
|
|
+
|
|
COMMAND_2(obstacle_set_velocity, RID, p_obstacle, Vector3, p_velocity) {
|
|
COMMAND_2(obstacle_set_velocity, RID, p_obstacle, Vector3, p_velocity) {
|
|
NavObstacle *obstacle = obstacle_owner.get_or_null(p_obstacle);
|
|
NavObstacle *obstacle = obstacle_owner.get_or_null(p_obstacle);
|
|
ERR_FAIL_NULL(obstacle);
|
|
ERR_FAIL_NULL(obstacle);
|
|
@@ -926,24 +1038,52 @@ COMMAND_2(obstacle_set_velocity, RID, p_obstacle, Vector3, p_velocity) {
|
|
obstacle->set_velocity(p_velocity);
|
|
obstacle->set_velocity(p_velocity);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+Vector3 GodotNavigationServer::obstacle_get_velocity(RID p_obstacle) const {
|
|
|
|
+ NavObstacle *obstacle = obstacle_owner.get_or_null(p_obstacle);
|
|
|
|
+ ERR_FAIL_NULL_V(obstacle, Vector3());
|
|
|
|
+
|
|
|
|
+ return obstacle->get_velocity();
|
|
|
|
+}
|
|
|
|
+
|
|
COMMAND_2(obstacle_set_position, RID, p_obstacle, Vector3, p_position) {
|
|
COMMAND_2(obstacle_set_position, RID, p_obstacle, Vector3, p_position) {
|
|
NavObstacle *obstacle = obstacle_owner.get_or_null(p_obstacle);
|
|
NavObstacle *obstacle = obstacle_owner.get_or_null(p_obstacle);
|
|
ERR_FAIL_NULL(obstacle);
|
|
ERR_FAIL_NULL(obstacle);
|
|
obstacle->set_position(p_position);
|
|
obstacle->set_position(p_position);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+Vector3 GodotNavigationServer::obstacle_get_position(RID p_obstacle) const {
|
|
|
|
+ NavObstacle *obstacle = obstacle_owner.get_or_null(p_obstacle);
|
|
|
|
+ ERR_FAIL_NULL_V(obstacle, Vector3());
|
|
|
|
+
|
|
|
|
+ return obstacle->get_position();
|
|
|
|
+}
|
|
|
|
+
|
|
void GodotNavigationServer::obstacle_set_vertices(RID p_obstacle, const Vector<Vector3> &p_vertices) {
|
|
void GodotNavigationServer::obstacle_set_vertices(RID p_obstacle, const Vector<Vector3> &p_vertices) {
|
|
NavObstacle *obstacle = obstacle_owner.get_or_null(p_obstacle);
|
|
NavObstacle *obstacle = obstacle_owner.get_or_null(p_obstacle);
|
|
ERR_FAIL_NULL(obstacle);
|
|
ERR_FAIL_NULL(obstacle);
|
|
obstacle->set_vertices(p_vertices);
|
|
obstacle->set_vertices(p_vertices);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+Vector<Vector3> GodotNavigationServer::obstacle_get_vertices(RID p_obstacle) const {
|
|
|
|
+ NavObstacle *obstacle = obstacle_owner.get_or_null(p_obstacle);
|
|
|
|
+ ERR_FAIL_NULL_V(obstacle, Vector<Vector3>());
|
|
|
|
+
|
|
|
|
+ return obstacle->get_vertices();
|
|
|
|
+}
|
|
|
|
+
|
|
COMMAND_2(obstacle_set_avoidance_layers, RID, p_obstacle, uint32_t, p_layers) {
|
|
COMMAND_2(obstacle_set_avoidance_layers, RID, p_obstacle, uint32_t, p_layers) {
|
|
NavObstacle *obstacle = obstacle_owner.get_or_null(p_obstacle);
|
|
NavObstacle *obstacle = obstacle_owner.get_or_null(p_obstacle);
|
|
ERR_FAIL_NULL(obstacle);
|
|
ERR_FAIL_NULL(obstacle);
|
|
obstacle->set_avoidance_layers(p_layers);
|
|
obstacle->set_avoidance_layers(p_layers);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+uint32_t GodotNavigationServer::obstacle_get_avoidance_layers(RID p_obstacle) const {
|
|
|
|
+ NavObstacle *obstacle = obstacle_owner.get_or_null(p_obstacle);
|
|
|
|
+ ERR_FAIL_NULL_V(obstacle, 0);
|
|
|
|
+
|
|
|
|
+ return obstacle->get_avoidance_layers();
|
|
|
|
+}
|
|
|
|
+
|
|
void GodotNavigationServer::parse_source_geometry_data(const Ref<NavigationMesh> &p_navigation_mesh, const Ref<NavigationMeshSourceGeometryData3D> &p_source_geometry_data, Node *p_root_node, const Callable &p_callback) {
|
|
void GodotNavigationServer::parse_source_geometry_data(const Ref<NavigationMesh> &p_navigation_mesh, const Ref<NavigationMeshSourceGeometryData3D> &p_source_geometry_data, Node *p_root_node, const Callable &p_callback) {
|
|
#ifndef _3D_DISABLED
|
|
#ifndef _3D_DISABLED
|
|
ERR_FAIL_COND_MSG(!Thread::is_main_thread(), "The SceneTree can only be parsed on the main thread. Call this function from the main thread or use call_deferred().");
|
|
ERR_FAIL_COND_MSG(!Thread::is_main_thread(), "The SceneTree can only be parsed on the main thread. Call this function from the main thread or use call_deferred().");
|