You've already forked godot
mirror of
https://github.com/godotengine/godot.git
synced 2025-11-06 12:20:30 +00:00
Fix GridMap Navigation transforms and debug
Fix GridMap navigation transforms and debug.
This commit is contained in:
@@ -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());
|
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++) {
|
for (int i = 0; i < g.multimesh_instances.size(); i++) {
|
||||||
RS::get_singleton()->instance_set_transform(g.multimesh_instances[i].instance, get_global_transform());
|
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
|
//erase navigation
|
||||||
for (const KeyValue<IndexKey, Octant::NavMesh> &E : g.navmesh_ids) {
|
for (const KeyValue<IndexKey, Octant::NavMesh> &E : g.navmesh_ids) {
|
||||||
NavigationServer3D::get_singleton()->free(E.value.region);
|
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();
|
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_transform(region, get_global_transform() * nm.xform);
|
||||||
NavigationServer3D::get_singleton()->region_set_map(region, get_world_3d()->get_navigation_map());
|
NavigationServer3D::get_singleton()->region_set_map(region, get_world_3d()->get_navigation_map());
|
||||||
nm.region = region;
|
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;
|
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);
|
NavigationServer3D::get_singleton()->free(F.value.region);
|
||||||
F.value.region = RID();
|
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
|
// Erase navigation
|
||||||
for (const KeyValue<IndexKey, Octant::NavMesh> &E : g.navmesh_ids) {
|
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();
|
g.navmesh_ids.clear();
|
||||||
|
|
||||||
|
|||||||
@@ -98,6 +98,7 @@ class GridMap : public Node3D {
|
|||||||
struct NavMesh {
|
struct NavMesh {
|
||||||
RID region;
|
RID region;
|
||||||
Transform3D xform;
|
Transform3D xform;
|
||||||
|
RID navmesh_debug_instance;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct MultimeshInstance {
|
struct MultimeshInstance {
|
||||||
|
|||||||
Reference in New Issue
Block a user