Skip to content

Commit

Permalink
Fix GridMap Navigation transforms and debug
Browse files Browse the repository at this point in the history
Fix GridMap navigation transforms and debug.
  • Loading branch information
smix8 committed Jun 8, 2022
1 parent 43f05bd commit cb8d95c
Show file tree
Hide file tree
Showing 2 changed files with 41 additions and 1 deletion.
41 changes: 40 additions & 1 deletion modules/gridmap/grid_map.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -433,6 +433,18 @@ void GridMap::_octant_transform(const OctantKey &p_key) {
RS::get_singleton()->instance_set_transform(g.collision_debug_instance, get_global_transform());
}

// update transform for NavigationServer regions and navigation debugmesh instances
for (const KeyValue<IndexKey, Octant::NavMesh> &E : g.navmesh_ids) {
if (bake_navigation) {
if (E.value.region.is_valid()) {
NavigationServer3D::get_singleton()->region_set_transform(E.value.region, get_global_transform() * E.value.xform);
}
if (E.value.navmesh_debug_instance.is_valid()) {
RS::get_singleton()->instance_set_transform(E.value.navmesh_debug_instance, get_global_transform() * E.value.xform);
}
}
}

for (int i = 0; i < g.multimesh_instances.size(); i++) {
RS::get_singleton()->instance_set_transform(g.multimesh_instances[i].instance, get_global_transform());
}
Expand All @@ -456,6 +468,9 @@ bool GridMap::_octant_update(const OctantKey &p_key) {
//erase navigation
for (const KeyValue<IndexKey, Octant::NavMesh> &E : g.navmesh_ids) {
NavigationServer3D::get_singleton()->free(E.value.region);
if (E.value.navmesh_debug_instance.is_valid()) {
RS::get_singleton()->free(E.value.navmesh_debug_instance);
}
}
g.navmesh_ids.clear();

Expand Down Expand Up @@ -538,6 +553,21 @@ bool GridMap::_octant_update(const OctantKey &p_key) {
NavigationServer3D::get_singleton()->region_set_transform(region, get_global_transform() * nm.xform);
NavigationServer3D::get_singleton()->region_set_map(region, get_world_3d()->get_navigation_map());
nm.region = region;

// add navigation debugmesh visual instances if debug is enabled
SceneTree *st = SceneTree::get_singleton();
if (st && st->is_debugging_navigation_hint()) {
if (!nm.navmesh_debug_instance.is_valid()) {
RID navmesh_debug_rid = navmesh->get_debug_mesh()->get_rid();
nm.navmesh_debug_instance = RS::get_singleton()->instance_create();
RS::get_singleton()->instance_set_base(nm.navmesh_debug_instance, navmesh_debug_rid);
RS::get_singleton()->mesh_surface_set_material(navmesh_debug_rid, 0, st->get_debug_navigation_material()->get_rid());
}
if (is_inside_tree()) {
RS::get_singleton()->instance_set_scenario(nm.navmesh_debug_instance, get_world_3d()->get_scenario());
RS::get_singleton()->instance_set_transform(nm.navmesh_debug_instance, get_global_transform() * nm.xform);
}
}
}

g.navmesh_ids[E] = nm;
Expand Down Expand Up @@ -660,6 +690,10 @@ void GridMap::_octant_exit_world(const OctantKey &p_key) {
NavigationServer3D::get_singleton()->free(F.value.region);
F.value.region = RID();
}
if (F.value.navmesh_debug_instance.is_valid()) {
RS::get_singleton()->free(F.value.navmesh_debug_instance);
F.value.navmesh_debug_instance = RID();
}
}
}

Expand All @@ -678,7 +712,12 @@ void GridMap::_octant_clean_up(const OctantKey &p_key) {

// Erase navigation
for (const KeyValue<IndexKey, Octant::NavMesh> &E : g.navmesh_ids) {
NavigationServer3D::get_singleton()->free(E.value.region);
if (E.value.region.is_valid()) {
NavigationServer3D::get_singleton()->free(E.value.region);
}
if (E.value.navmesh_debug_instance.is_valid()) {
RS::get_singleton()->free(E.value.navmesh_debug_instance);
}
}
g.navmesh_ids.clear();

Expand Down
1 change: 1 addition & 0 deletions modules/gridmap/grid_map.h
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,7 @@ class GridMap : public Node3D {
struct NavMesh {
RID region;
Transform3D xform;
RID navmesh_debug_instance;
};

struct MultimeshInstance {
Expand Down

0 comments on commit cb8d95c

Please sign in to comment.