Fix GridMap Navigation transforms and debug
Fix GridMap navigation transforms and debug.
This commit is contained in:
parent
43f05bd6a0
commit
cb8d95c271
2 changed files with 41 additions and 1 deletions
|
@ -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());
|
||||
}
|
||||
|
@ -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();
|
||||
|
||||
|
@ -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;
|
||||
|
@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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();
|
||||
|
||||
|
|
|
@ -98,6 +98,7 @@ class GridMap : public Node3D {
|
|||
struct NavMesh {
|
||||
RID region;
|
||||
Transform3D xform;
|
||||
RID navmesh_debug_instance;
|
||||
};
|
||||
|
||||
struct MultimeshInstance {
|
||||
|
|
Loading…
Reference in a new issue