void NavigationMeshInstance::_notification(int p_what) { switch (p_what) { case NOTIFICATION_ENTER_TREE: { Spatial *c = this; while (c) { navigation = c->cast_to<Navigation>(); if (navigation) { if (enabled && navmesh.is_valid()) { nav_id = navigation->navmesh_create(navmesh, get_relative_transform(navigation), this); } break; } c = c->get_parent_spatial(); } if (navmesh.is_valid() && get_tree()->is_debugging_navigation_hint()) { MeshInstance *dm = memnew(MeshInstance); dm->set_mesh(navmesh->get_debug_mesh()); if (is_enabled()) { dm->set_material_override(get_tree()->get_debug_navigation_material()); } else { dm->set_material_override(get_tree()->get_debug_navigation_disabled_material()); } add_child(dm); debug_view = dm; } } break; case NOTIFICATION_TRANSFORM_CHANGED: { if (navigation && nav_id != -1) { navigation->navmesh_set_transform(nav_id, get_relative_transform(navigation)); } } break; case NOTIFICATION_EXIT_TREE: { if (navigation) { if (nav_id != -1) { navigation->navmesh_remove(nav_id); nav_id = -1; } } if (debug_view) { debug_view->queue_delete(); debug_view = NULL; } navigation = NULL; } break; } }
void NavigationMeshInstance::set_enabled(bool p_enabled) { if (enabled == p_enabled) return; enabled = p_enabled; if (!is_inside_tree()) return; if (!enabled) { if (nav_id != -1) { navigation->navmesh_remove(nav_id); nav_id = -1; } } else { if (navigation) { if (navmesh.is_valid()) { nav_id = navigation->navmesh_create(navmesh, get_relative_transform(navigation), this); } } } if (debug_view) { MeshInstance *dm = debug_view->cast_to<MeshInstance>(); if (is_enabled()) { dm->set_material_override(get_tree()->get_debug_navigation_material()); } else { dm->set_material_override(get_tree()->get_debug_navigation_disabled_material()); } } update_gizmo(); }