Browse Source

Allow to compile templates without navigation features

Michael Alexsander 3 tháng trước cách đây
mục cha
commit
556933306a
79 tập tin đã thay đổi với 653 bổ sung208 xóa
  1. 15 1
      SConstruct
  2. 2 0
      core/config/project_settings.cpp
  3. 1 1
      editor/import/3d/resource_importer_scene.cpp
  4. 1 1
      editor/plugins/gizmos/navigation_link_3d_gizmo_plugin.cpp
  5. 1 1
      editor/plugins/gizmos/navigation_region_3d_gizmo_plugin.cpp
  6. 1 1
      editor/plugins/mesh_instance_3d_editor_plugin.cpp
  7. 1 1
      editor/plugins/mesh_library_editor_plugin.cpp
  8. 1 1
      editor/plugins/navigation_link_2d_editor_plugin.h
  9. 1 1
      editor/plugins/navigation_obstacle_2d_editor_plugin.h
  10. 1 1
      editor/plugins/navigation_obstacle_3d_editor_plugin.cpp
  11. 1 1
      editor/plugins/navigation_polygon_editor_plugin.cpp
  12. 51 3
      main/main.cpp
  13. 102 21
      main/performance.cpp
  14. 4 0
      modules/csg/csg_shape.cpp
  15. 2 0
      modules/csg/csg_shape.h
  16. 2 0
      modules/csg/register_types.cpp
  17. 38 13
      modules/gridmap/grid_map.cpp
  18. 8 2
      modules/gridmap/grid_map.h
  19. 2 0
      modules/gridmap/register_types.cpp
  20. 1 1
      modules/navigation_2d/config.py
  21. 1 1
      modules/navigation_3d/3d/navigation_mesh_generator.h
  22. 4 1
      modules/navigation_3d/config.py
  23. 1 1
      modules/navigation_3d/editor/navigation_mesh_editor_plugin.cpp
  24. 2 0
      scene/2d/SCsub
  25. 4 1
      scene/2d/mesh_instance_2d.cpp
  26. 2 0
      scene/2d/mesh_instance_2d.h
  27. 4 1
      scene/2d/multimesh_instance_2d.cpp
  28. 2 0
      scene/2d/multimesh_instance_2d.h
  29. 6 0
      scene/2d/navigation/SCsub
  30. 1 1
      scene/2d/navigation/navigation_agent_2d.cpp
  31. 0 0
      scene/2d/navigation/navigation_agent_2d.h
  32. 0 0
      scene/2d/navigation/navigation_link_2d.cpp
  33. 0 0
      scene/2d/navigation/navigation_link_2d.h
  34. 0 0
      scene/2d/navigation/navigation_obstacle_2d.cpp
  35. 0 0
      scene/2d/navigation/navigation_obstacle_2d.h
  36. 0 0
      scene/2d/navigation/navigation_region_2d.cpp
  37. 0 0
      scene/2d/navigation/navigation_region_2d.h
  38. 4 0
      scene/2d/physics/static_body_2d.cpp
  39. 2 0
      scene/2d/physics/static_body_2d.h
  40. 6 0
      scene/2d/polygon_2d.cpp
  41. 4 0
      scene/2d/polygon_2d.h
  42. 4 0
      scene/2d/tile_map.compat.inc
  43. 20 0
      scene/2d/tile_map.cpp
  44. 14 2
      scene/2d/tile_map.h
  45. 17 1
      scene/2d/tile_map_layer.cpp
  46. 8 0
      scene/2d/tile_map_layer.h
  47. 2 0
      scene/3d/SCsub
  48. 8 3
      scene/3d/mesh_instance_3d.cpp
  49. 6 0
      scene/3d/mesh_instance_3d.h
  50. 4 0
      scene/3d/multimesh_instance_3d.cpp
  51. 6 0
      scene/3d/multimesh_instance_3d.h
  52. 6 0
      scene/3d/navigation/SCsub
  53. 1 1
      scene/3d/navigation/navigation_agent_3d.cpp
  54. 0 0
      scene/3d/navigation/navigation_agent_3d.h
  55. 0 0
      scene/3d/navigation/navigation_link_3d.cpp
  56. 0 0
      scene/3d/navigation/navigation_link_3d.h
  57. 0 0
      scene/3d/navigation/navigation_obstacle_3d.cpp
  58. 0 0
      scene/3d/navigation/navigation_obstacle_3d.h
  59. 0 0
      scene/3d/navigation/navigation_region_3d.cpp
  60. 0 0
      scene/3d/navigation/navigation_region_3d.h
  61. 4 0
      scene/3d/physics/static_body_3d.cpp
  62. 4 0
      scene/3d/physics/static_body_3d.h
  63. 54 25
      scene/register_scene_types.cpp
  64. 4 3
      scene/resources/2d/SCsub
  65. 4 0
      scene/resources/2d/tile_set.compat.inc
  66. 99 67
      scene/resources/2d/tile_set.cpp
  67. 21 12
      scene/resources/2d/tile_set.h
  68. 2 1
      scene/resources/3d/SCsub
  69. 15 1
      scene/resources/world_2d.cpp
  70. 4 0
      scene/resources/world_2d.h
  71. 7 1
      servers/navigation/SCsub
  72. 13 1
      servers/register_server_types.cpp
  73. 1 1
      tests/scene/test_navigation_agent_2d.h
  74. 1 1
      tests/scene/test_navigation_agent_3d.h
  75. 1 1
      tests/scene/test_navigation_obstacle_2d.h
  76. 1 1
      tests/scene/test_navigation_obstacle_3d.h
  77. 1 1
      tests/scene/test_navigation_region_2d.h
  78. 1 1
      tests/scene/test_navigation_region_3d.h
  79. 41 28
      tests/test_main.cpp

+ 15 - 1
SConstruct

@@ -222,6 +222,8 @@ opts.Add(BoolVariable("disable_3d", "Disable 3D nodes for a smaller executable",
 opts.Add(BoolVariable("disable_advanced_gui", "Disable advanced GUI nodes and behaviors", False))
 opts.Add(BoolVariable("disable_advanced_gui", "Disable advanced GUI nodes and behaviors", False))
 opts.Add(BoolVariable("disable_physics_2d", "Disable 2D physics nodes and server", False))
 opts.Add(BoolVariable("disable_physics_2d", "Disable 2D physics nodes and server", False))
 opts.Add(BoolVariable("disable_physics_3d", "Disable 3D physics nodes and server", False))
 opts.Add(BoolVariable("disable_physics_3d", "Disable 3D physics nodes and server", False))
+opts.Add(BoolVariable("disable_navigation_2d", "Disable 2D navigation features", False))
+opts.Add(BoolVariable("disable_navigation_3d", "Disable 3D navigation features", False))
 opts.Add(BoolVariable("disable_xr", "Disable XR nodes and server", False))
 opts.Add(BoolVariable("disable_xr", "Disable XR nodes and server", False))
 opts.Add("build_profile", "Path to a file containing a feature build profile", "")
 opts.Add("build_profile", "Path to a file containing a feature build profile", "")
 opts.Add(BoolVariable("modules_enabled_by_default", "If no, disable all modules except ones explicitly enabled", True))
 opts.Add(BoolVariable("modules_enabled_by_default", "If no, disable all modules except ones explicitly enabled", True))
@@ -934,7 +936,14 @@ sys.modules.pop("detect")
 
 
 if env.editor_build:
 if env.editor_build:
     unsupported_opts = []
     unsupported_opts = []
-    for disable_opt in ["disable_3d", "disable_advanced_gui", "disable_physics_2d", "disable_physics_3d"]:
+    for disable_opt in [
+        "disable_3d",
+        "disable_advanced_gui",
+        "disable_physics_2d",
+        "disable_physics_3d",
+        "disable_navigation_2d",
+        "disable_navigation_3d",
+    ]:
         if env[disable_opt]:
         if env[disable_opt]:
             unsupported_opts.append(disable_opt)
             unsupported_opts.append(disable_opt)
     if unsupported_opts != []:
     if unsupported_opts != []:
@@ -948,6 +957,7 @@ if env.editor_build:
 if env["disable_3d"]:
 if env["disable_3d"]:
     env.Append(CPPDEFINES=["_3D_DISABLED"])
     env.Append(CPPDEFINES=["_3D_DISABLED"])
     env["disable_physics_3d"] = True
     env["disable_physics_3d"] = True
+    env["disable_navigation_3d"] = True
     env["disable_xr"] = True
     env["disable_xr"] = True
 if env["disable_advanced_gui"]:
 if env["disable_advanced_gui"]:
     env.Append(CPPDEFINES=["ADVANCED_GUI_DISABLED"])
     env.Append(CPPDEFINES=["ADVANCED_GUI_DISABLED"])
@@ -955,6 +965,10 @@ if env["disable_physics_2d"]:
     env.Append(CPPDEFINES=["PHYSICS_2D_DISABLED"])
     env.Append(CPPDEFINES=["PHYSICS_2D_DISABLED"])
 if env["disable_physics_3d"]:
 if env["disable_physics_3d"]:
     env.Append(CPPDEFINES=["PHYSICS_3D_DISABLED"])
     env.Append(CPPDEFINES=["PHYSICS_3D_DISABLED"])
+if env["disable_navigation_2d"]:
+    env.Append(CPPDEFINES=["NAVIGATION_2D_DISABLED"])
+if env["disable_navigation_3d"]:
+    env.Append(CPPDEFINES=["NAVIGATION_3D_DISABLED"])
 if env["disable_xr"]:
 if env["disable_xr"]:
     env.Append(CPPDEFINES=["XR_DISABLED"])
     env.Append(CPPDEFINES=["XR_DISABLED"])
 if env["minizip"]:
 if env["minizip"]:

+ 2 - 0
core/config/project_settings.cpp

@@ -1630,6 +1630,7 @@ ProjectSettings::ProjectSettings() {
 	GLOBAL_DEF_INTERNAL("internationalization/locale/translations_pot_files", PackedStringArray());
 	GLOBAL_DEF_INTERNAL("internationalization/locale/translations_pot_files", PackedStringArray());
 	GLOBAL_DEF_INTERNAL("internationalization/locale/translation_add_builtin_strings_to_pot", false);
 	GLOBAL_DEF_INTERNAL("internationalization/locale/translation_add_builtin_strings_to_pot", false);
 
 
+#if !defined(NAVIGATION_2D_DISABLED) || !defined(NAVIGATION_3D_DISABLED)
 	GLOBAL_DEF("navigation/world/map_use_async_iterations", true);
 	GLOBAL_DEF("navigation/world/map_use_async_iterations", true);
 
 
 	GLOBAL_DEF("navigation/avoidance/thread_model/avoidance_use_multiple_threads", true);
 	GLOBAL_DEF("navigation/avoidance/thread_model/avoidance_use_multiple_threads", true);
@@ -1640,6 +1641,7 @@ ProjectSettings::ProjectSettings() {
 	GLOBAL_DEF("navigation/baking/use_crash_prevention_checks", true);
 	GLOBAL_DEF("navigation/baking/use_crash_prevention_checks", true);
 	GLOBAL_DEF("navigation/baking/thread_model/baking_use_multiple_threads", true);
 	GLOBAL_DEF("navigation/baking/thread_model/baking_use_multiple_threads", true);
 	GLOBAL_DEF("navigation/baking/thread_model/baking_use_high_priority_threads", true);
 	GLOBAL_DEF("navigation/baking/thread_model/baking_use_high_priority_threads", true);
+#endif // !defined(NAVIGATION_2D_DISABLED) || !defined(NAVIGATION_3D_DISABLED)
 
 
 	ProjectSettings::get_singleton()->add_hidden_prefix("input/");
 	ProjectSettings::get_singleton()->add_hidden_prefix("input/");
 }
 }

+ 1 - 1
editor/import/3d/resource_importer_scene.cpp

@@ -40,7 +40,7 @@
 #include "editor/import/3d/scene_import_settings.h"
 #include "editor/import/3d/scene_import_settings.h"
 #include "scene/3d/importer_mesh_instance_3d.h"
 #include "scene/3d/importer_mesh_instance_3d.h"
 #include "scene/3d/mesh_instance_3d.h"
 #include "scene/3d/mesh_instance_3d.h"
-#include "scene/3d/navigation_region_3d.h"
+#include "scene/3d/navigation/navigation_region_3d.h"
 #include "scene/3d/occluder_instance_3d.h"
 #include "scene/3d/occluder_instance_3d.h"
 #include "scene/3d/physics/area_3d.h"
 #include "scene/3d/physics/area_3d.h"
 #include "scene/3d/physics/collision_shape_3d.h"
 #include "scene/3d/physics/collision_shape_3d.h"

+ 1 - 1
editor/plugins/gizmos/navigation_link_3d_gizmo_plugin.cpp

@@ -32,7 +32,7 @@
 
 
 #include "editor/editor_undo_redo_manager.h"
 #include "editor/editor_undo_redo_manager.h"
 #include "editor/plugins/node_3d_editor_plugin.h"
 #include "editor/plugins/node_3d_editor_plugin.h"
-#include "scene/3d/navigation_link_3d.h"
+#include "scene/3d/navigation/navigation_link_3d.h"
 #include "servers/navigation_server_3d.h"
 #include "servers/navigation_server_3d.h"
 
 
 NavigationLink3DGizmoPlugin::NavigationLink3DGizmoPlugin() {
 NavigationLink3DGizmoPlugin::NavigationLink3DGizmoPlugin() {

+ 1 - 1
editor/plugins/gizmos/navigation_region_3d_gizmo_plugin.cpp

@@ -31,7 +31,7 @@
 #include "navigation_region_3d_gizmo_plugin.h"
 #include "navigation_region_3d_gizmo_plugin.h"
 
 
 #include "core/math/random_pcg.h"
 #include "core/math/random_pcg.h"
-#include "scene/3d/navigation_region_3d.h"
+#include "scene/3d/navigation/navigation_region_3d.h"
 #include "servers/navigation_server_3d.h"
 #include "servers/navigation_server_3d.h"
 
 
 NavigationRegion3DGizmoPlugin::NavigationRegion3DGizmoPlugin() {
 NavigationRegion3DGizmoPlugin::NavigationRegion3DGizmoPlugin() {

+ 1 - 1
editor/plugins/mesh_instance_3d_editor_plugin.cpp

@@ -36,7 +36,7 @@
 #include "editor/multi_node_edit.h"
 #include "editor/multi_node_edit.h"
 #include "editor/plugins/node_3d_editor_plugin.h"
 #include "editor/plugins/node_3d_editor_plugin.h"
 #include "editor/themes/editor_scale.h"
 #include "editor/themes/editor_scale.h"
-#include "scene/3d/navigation_region_3d.h"
+#include "scene/3d/navigation/navigation_region_3d.h"
 #include "scene/3d/physics/collision_shape_3d.h"
 #include "scene/3d/physics/collision_shape_3d.h"
 #include "scene/3d/physics/static_body_3d.h"
 #include "scene/3d/physics/static_body_3d.h"
 #include "scene/gui/aspect_ratio_container.h"
 #include "scene/gui/aspect_ratio_container.h"

+ 1 - 1
editor/plugins/mesh_library_editor_plugin.cpp

@@ -39,7 +39,7 @@
 #include "editor/plugins/node_3d_editor_plugin.h"
 #include "editor/plugins/node_3d_editor_plugin.h"
 #include "main/main.h"
 #include "main/main.h"
 #include "scene/3d/mesh_instance_3d.h"
 #include "scene/3d/mesh_instance_3d.h"
-#include "scene/3d/navigation_region_3d.h"
+#include "scene/3d/navigation/navigation_region_3d.h"
 #include "scene/3d/physics/static_body_3d.h"
 #include "scene/3d/physics/static_body_3d.h"
 #include "scene/gui/menu_button.h"
 #include "scene/gui/menu_button.h"
 #include "scene/resources/packed_scene.h"
 #include "scene/resources/packed_scene.h"

+ 1 - 1
editor/plugins/navigation_link_2d_editor_plugin.h

@@ -31,7 +31,7 @@
 #pragma once
 #pragma once
 
 
 #include "editor/plugins/editor_plugin.h"
 #include "editor/plugins/editor_plugin.h"
-#include "scene/2d/navigation_link_2d.h"
+#include "scene/2d/navigation/navigation_link_2d.h"
 
 
 class CanvasItemEditor;
 class CanvasItemEditor;
 
 

+ 1 - 1
editor/plugins/navigation_obstacle_2d_editor_plugin.h

@@ -31,7 +31,7 @@
 #pragma once
 #pragma once
 
 
 #include "editor/plugins/abstract_polygon_2d_editor.h"
 #include "editor/plugins/abstract_polygon_2d_editor.h"
-#include "scene/2d/navigation_obstacle_2d.h"
+#include "scene/2d/navigation/navigation_obstacle_2d.h"
 
 
 class NavigationObstacle2DEditor : public AbstractPolygon2DEditor {
 class NavigationObstacle2DEditor : public AbstractPolygon2DEditor {
 	GDCLASS(NavigationObstacle2DEditor, AbstractPolygon2DEditor);
 	GDCLASS(NavigationObstacle2DEditor, AbstractPolygon2DEditor);

+ 1 - 1
editor/plugins/navigation_obstacle_3d_editor_plugin.cpp

@@ -36,7 +36,7 @@
 #include "editor/editor_string_names.h"
 #include "editor/editor_string_names.h"
 #include "editor/editor_undo_redo_manager.h"
 #include "editor/editor_undo_redo_manager.h"
 #include "editor/plugins/node_3d_editor_plugin.h"
 #include "editor/plugins/node_3d_editor_plugin.h"
-#include "scene/3d/navigation_obstacle_3d.h"
+#include "scene/3d/navigation/navigation_obstacle_3d.h"
 #include "scene/gui/button.h"
 #include "scene/gui/button.h"
 #include "scene/gui/dialogs.h"
 #include "scene/gui/dialogs.h"
 #include "servers/navigation_server_3d.h"
 #include "servers/navigation_server_3d.h"

+ 1 - 1
editor/plugins/navigation_polygon_editor_plugin.cpp

@@ -33,7 +33,7 @@
 #include "editor/editor_node.h"
 #include "editor/editor_node.h"
 #include "editor/editor_settings.h"
 #include "editor/editor_settings.h"
 #include "editor/editor_undo_redo_manager.h"
 #include "editor/editor_undo_redo_manager.h"
-#include "scene/2d/navigation_region_2d.h"
+#include "scene/2d/navigation/navigation_region_2d.h"
 #include "scene/gui/dialogs.h"
 #include "scene/gui/dialogs.h"
 
 
 Ref<NavigationPolygon> NavigationPolygonEditor::_ensure_navpoly() const {
 Ref<NavigationPolygon> NavigationPolygonEditor::_ensure_navpoly() const {

+ 51 - 3
main/main.cpp

@@ -72,25 +72,30 @@
 #include "servers/display_server.h"
 #include "servers/display_server.h"
 #include "servers/movie_writer/movie_writer.h"
 #include "servers/movie_writer/movie_writer.h"
 #include "servers/movie_writer/movie_writer_mjpeg.h"
 #include "servers/movie_writer/movie_writer_mjpeg.h"
-#include "servers/navigation_server_3d.h"
-#include "servers/navigation_server_3d_dummy.h"
 #include "servers/register_server_types.h"
 #include "servers/register_server_types.h"
 #include "servers/rendering/rendering_server_default.h"
 #include "servers/rendering/rendering_server_default.h"
 #include "servers/text/text_server_dummy.h"
 #include "servers/text/text_server_dummy.h"
 #include "servers/text_server.h"
 #include "servers/text_server.h"
 
 
 // 2D
 // 2D
+#ifndef NAVIGATION_2D_DISABLED
 #include "servers/navigation_server_2d.h"
 #include "servers/navigation_server_2d.h"
 #include "servers/navigation_server_2d_dummy.h"
 #include "servers/navigation_server_2d_dummy.h"
+#endif // NAVIGATION_2D_DISABLED
 #ifndef PHYSICS_2D_DISABLED
 #ifndef PHYSICS_2D_DISABLED
 #include "servers/physics_server_2d.h"
 #include "servers/physics_server_2d.h"
 #include "servers/physics_server_2d_dummy.h"
 #include "servers/physics_server_2d_dummy.h"
 #endif // PHYSICS_2D_DISABLED
 #endif // PHYSICS_2D_DISABLED
 
 
+// 3D
 #ifndef PHYSICS_3D_DISABLED
 #ifndef PHYSICS_3D_DISABLED
 #include "servers/physics_server_3d.h"
 #include "servers/physics_server_3d.h"
 #include "servers/physics_server_3d_dummy.h"
 #include "servers/physics_server_3d_dummy.h"
 #endif // PHYSICS_3D_DISABLED
 #endif // PHYSICS_3D_DISABLED
+#ifndef NAVIGATION_3D_DISABLED
+#include "servers/navigation_server_3d.h"
+#include "servers/navigation_server_3d_dummy.h"
+#endif // NAVIGATION_3D_DISABLED
 #ifndef _3D_DISABLED
 #ifndef _3D_DISABLED
 #include "servers/xr_server.h"
 #include "servers/xr_server.h"
 #endif // _3D_DISABLED
 #endif // _3D_DISABLED
@@ -754,8 +759,12 @@ Error Main::test_setup() {
 	// Default theme will be initialized later, after modules and ScriptServer are ready.
 	// Default theme will be initialized later, after modules and ScriptServer are ready.
 	initialize_theme_db();
 	initialize_theme_db();
 
 
+#ifndef NAVIGATION_3D_DISABLED
 	NavigationServer3DManager::initialize_server();
 	NavigationServer3DManager::initialize_server();
+#endif // NAVIGATION_3D_DISABLED
+#ifndef NAVIGATION_2D_DISABLED
 	NavigationServer2DManager::initialize_server();
 	NavigationServer2DManager::initialize_server();
+#endif // NAVIGATION_2D_DISABLED
 
 
 	register_scene_types();
 	register_scene_types();
 	register_driver_types();
 	register_driver_types();
@@ -839,8 +848,12 @@ void Main::test_cleanup() {
 
 
 	finalize_theme_db();
 	finalize_theme_db();
 
 
+#ifndef NAVIGATION_2D_DISABLED
 	NavigationServer2DManager::finalize_server();
 	NavigationServer2DManager::finalize_server();
+#endif // NAVIGATION_2D_DISABLED
+#ifndef NAVIGATION_3D_DISABLED
 	NavigationServer3DManager::finalize_server();
 	NavigationServer3DManager::finalize_server();
+#endif // NAVIGATION_3D_DISABLED
 
 
 	GDExtensionManager::get_singleton()->deinitialize_extensions(GDExtension::INITIALIZATION_LEVEL_SERVERS);
 	GDExtensionManager::get_singleton()->deinitialize_extensions(GDExtension::INITIALIZATION_LEVEL_SERVERS);
 	uninitialize_modules(MODULE_INITIALIZATION_LEVEL_SERVERS);
 	uninitialize_modules(MODULE_INITIALIZATION_LEVEL_SERVERS);
@@ -3496,10 +3509,16 @@ Error Main::setup2(bool p_show_boot_logo) {
 	// Default theme will be initialized later, after modules and ScriptServer are ready.
 	// Default theme will be initialized later, after modules and ScriptServer are ready.
 	initialize_theme_db();
 	initialize_theme_db();
 
 
+#if !defined(NAVIGATION_2D_DISABLED) || !defined(NAVIGATION_3D_DISABLED)
 	MAIN_PRINT("Main: Load Navigation");
 	MAIN_PRINT("Main: Load Navigation");
+#endif // !defined(NAVIGATION_2D_DISABLED) || !defined(NAVIGATION_3D_DISABLED)
 
 
+#ifndef NAVIGATION_3D_DISABLED
 	NavigationServer3DManager::initialize_server();
 	NavigationServer3DManager::initialize_server();
+#endif // NAVIGATION_3D_DISABLED
+#ifndef NAVIGATION_2D_DISABLED
 	NavigationServer2DManager::initialize_server();
 	NavigationServer2DManager::initialize_server();
+#endif // NAVIGATION_2D_DISABLED
 
 
 	register_scene_types();
 	register_scene_types();
 	register_driver_types();
 	register_driver_types();
@@ -4102,20 +4121,33 @@ int Main::start() {
 		if (debug_paths) {
 		if (debug_paths) {
 			sml->set_debug_paths_hint(true);
 			sml->set_debug_paths_hint(true);
 		}
 		}
+
 		if (debug_navigation) {
 		if (debug_navigation) {
 			sml->set_debug_navigation_hint(true);
 			sml->set_debug_navigation_hint(true);
+#ifndef NAVIGATION_2D_DISABLED
 			NavigationServer2D::get_singleton()->set_debug_navigation_enabled(true);
 			NavigationServer2D::get_singleton()->set_debug_navigation_enabled(true);
+#endif // NAVIGATION_2D_DISABLED
+#ifndef NAVIGATION_3D_DISABLED
 			NavigationServer3D::get_singleton()->set_debug_navigation_enabled(true);
 			NavigationServer3D::get_singleton()->set_debug_navigation_enabled(true);
+#endif // NAVIGATION_3D_DISABLED
 		}
 		}
 		if (debug_avoidance) {
 		if (debug_avoidance) {
+#ifndef NAVIGATION_2D_DISABLED
 			NavigationServer2D::get_singleton()->set_debug_avoidance_enabled(true);
 			NavigationServer2D::get_singleton()->set_debug_avoidance_enabled(true);
+#endif // NAVIGATION_2D_DISABLED
+#ifndef NAVIGATION_3D_DISABLED
 			NavigationServer3D::get_singleton()->set_debug_avoidance_enabled(true);
 			NavigationServer3D::get_singleton()->set_debug_avoidance_enabled(true);
+#endif // NAVIGATION_3D_DISABLED
 		}
 		}
 		if (debug_navigation || debug_avoidance) {
 		if (debug_navigation || debug_avoidance) {
+#ifndef NAVIGATION_2D_DISABLED
 			NavigationServer2D::get_singleton()->set_active(true);
 			NavigationServer2D::get_singleton()->set_active(true);
 			NavigationServer2D::get_singleton()->set_debug_enabled(true);
 			NavigationServer2D::get_singleton()->set_debug_enabled(true);
+#endif // NAVIGATION_2D_DISABLED
+#ifndef NAVIGATION_3D_DISABLED
 			NavigationServer3D::get_singleton()->set_active(true);
 			NavigationServer3D::get_singleton()->set_active(true);
 			NavigationServer3D::get_singleton()->set_debug_enabled(true);
 			NavigationServer3D::get_singleton()->set_debug_enabled(true);
+#endif // NAVIGATION_3D_DISABLED
 		}
 		}
 		if (debug_canvas_item_redraw) {
 		if (debug_canvas_item_redraw) {
 			RenderingServer::get_singleton()->canvas_item_set_debug_redraw(true);
 			RenderingServer::get_singleton()->canvas_item_set_debug_redraw(true);
@@ -4546,7 +4578,9 @@ bool Main::iteration() {
 
 
 	uint64_t physics_process_ticks = 0;
 	uint64_t physics_process_ticks = 0;
 	uint64_t process_ticks = 0;
 	uint64_t process_ticks = 0;
+#if !defined(NAVIGATION_2D_DISABLED) || !defined(NAVIGATION_3D_DISABLED)
 	uint64_t navigation_process_ticks = 0;
 	uint64_t navigation_process_ticks = 0;
+#endif // !defined(NAVIGATION_2D_DISABLED) || !defined(NAVIGATION_3D_DISABLED)
 
 
 	frame += ticks_elapsed;
 	frame += ticks_elapsed;
 
 
@@ -4565,8 +4599,12 @@ bool Main::iteration() {
 	XRServer::get_singleton()->_process();
 	XRServer::get_singleton()->_process();
 #endif // XR_DISABLED
 #endif // XR_DISABLED
 
 
+#ifndef NAVIGATION_2D_DISABLED
 	NavigationServer2D::get_singleton()->sync();
 	NavigationServer2D::get_singleton()->sync();
+#endif // NAVIGATION_2D_DISABLED
+#ifndef NAVIGATION_3D_DISABLED
 	NavigationServer3D::get_singleton()->sync();
 	NavigationServer3D::get_singleton()->sync();
+#endif // NAVIGATION_3D_DISABLED
 
 
 	for (int iters = 0; iters < advance.physics_steps; ++iters) {
 	for (int iters = 0; iters < advance.physics_steps; ++iters) {
 		if (Input::get_singleton()->is_agile_input_event_flushing()) {
 		if (Input::get_singleton()->is_agile_input_event_flushing()) {
@@ -4606,15 +4644,21 @@ bool Main::iteration() {
 			break;
 			break;
 		}
 		}
 
 
+#if !defined(NAVIGATION_2D_DISABLED) || !defined(NAVIGATION_3D_DISABLED)
 		uint64_t navigation_begin = OS::get_singleton()->get_ticks_usec();
 		uint64_t navigation_begin = OS::get_singleton()->get_ticks_usec();
 
 
+#ifndef NAVIGATION_2D_DISABLED
 		NavigationServer2D::get_singleton()->process(physics_step * time_scale);
 		NavigationServer2D::get_singleton()->process(physics_step * time_scale);
+#endif // NAVIGATION_2D_DISABLED
+#ifndef NAVIGATION_3D_DISABLED
 		NavigationServer3D::get_singleton()->process(physics_step * time_scale);
 		NavigationServer3D::get_singleton()->process(physics_step * time_scale);
+#endif // NAVIGATION_3D_DISABLED
 
 
 		navigation_process_ticks = MAX(navigation_process_ticks, OS::get_singleton()->get_ticks_usec() - navigation_begin); // keep the largest one for reference
 		navigation_process_ticks = MAX(navigation_process_ticks, OS::get_singleton()->get_ticks_usec() - navigation_begin); // keep the largest one for reference
 		navigation_process_max = MAX(OS::get_singleton()->get_ticks_usec() - navigation_begin, navigation_process_max);
 		navigation_process_max = MAX(OS::get_singleton()->get_ticks_usec() - navigation_begin, navigation_process_max);
 
 
 		message_queue->flush();
 		message_queue->flush();
+#endif // !defined(NAVIGATION_2D_DISABLED) || !defined(NAVIGATION_3D_DISABLED)
 
 
 #ifndef PHYSICS_3D_DISABLED
 #ifndef PHYSICS_3D_DISABLED
 		PhysicsServer3D::get_singleton()->end_sync();
 		PhysicsServer3D::get_singleton()->end_sync();
@@ -4850,9 +4894,13 @@ void Main::cleanup(bool p_force) {
 
 
 	finalize_theme_db();
 	finalize_theme_db();
 
 
-	// Before deinitializing server extensions, finalize servers which may be loaded as extensions.
+// Before deinitializing server extensions, finalize servers which may be loaded as extensions.
+#ifndef NAVIGATION_2D_DISABLED
 	NavigationServer2DManager::finalize_server();
 	NavigationServer2DManager::finalize_server();
+#endif // NAVIGATION_2D_DISABLED
+#ifndef NAVIGATION_3D_DISABLED
 	NavigationServer3DManager::finalize_server();
 	NavigationServer3DManager::finalize_server();
+#endif // NAVIGATION_3D_DISABLED
 	finalize_physics();
 	finalize_physics();
 
 
 	GDExtensionManager::get_singleton()->deinitialize_extensions(GDExtension::INITIALIZATION_LEVEL_SERVERS);
 	GDExtensionManager::get_singleton()->deinitialize_extensions(GDExtension::INITIALIZATION_LEVEL_SERVERS);

+ 102 - 21
main/performance.cpp

@@ -35,8 +35,12 @@
 #include "scene/main/node.h"
 #include "scene/main/node.h"
 #include "scene/main/scene_tree.h"
 #include "scene/main/scene_tree.h"
 #include "servers/audio_server.h"
 #include "servers/audio_server.h"
+#ifndef NAVIGATION_2D_DISABLED
 #include "servers/navigation_server_2d.h"
 #include "servers/navigation_server_2d.h"
+#endif // NAVIGATION_2D_DISABLED
+#ifndef NAVIGATION_3D_DISABLED
 #include "servers/navigation_server_3d.h"
 #include "servers/navigation_server_3d.h"
+#endif // NAVIGATION_3D_DISABLED
 #include "servers/rendering_server.h"
 #include "servers/rendering_server.h"
 
 
 #ifndef PHYSICS_2D_DISABLED
 #ifndef PHYSICS_2D_DISABLED
@@ -84,6 +88,7 @@ void Performance::_bind_methods() {
 	BIND_ENUM_CONSTANT(PHYSICS_3D_ISLAND_COUNT);
 	BIND_ENUM_CONSTANT(PHYSICS_3D_ISLAND_COUNT);
 #endif // _3D_DISABLED
 #endif // _3D_DISABLED
 	BIND_ENUM_CONSTANT(AUDIO_OUTPUT_LATENCY);
 	BIND_ENUM_CONSTANT(AUDIO_OUTPUT_LATENCY);
+#if !defined(NAVIGATION_2D_DISABLED) || !defined(NAVIGATION_3D_DISABLED)
 	BIND_ENUM_CONSTANT(NAVIGATION_ACTIVE_MAPS);
 	BIND_ENUM_CONSTANT(NAVIGATION_ACTIVE_MAPS);
 	BIND_ENUM_CONSTANT(NAVIGATION_REGION_COUNT);
 	BIND_ENUM_CONSTANT(NAVIGATION_REGION_COUNT);
 	BIND_ENUM_CONSTANT(NAVIGATION_AGENT_COUNT);
 	BIND_ENUM_CONSTANT(NAVIGATION_AGENT_COUNT);
@@ -94,11 +99,13 @@ void Performance::_bind_methods() {
 	BIND_ENUM_CONSTANT(NAVIGATION_EDGE_CONNECTION_COUNT);
 	BIND_ENUM_CONSTANT(NAVIGATION_EDGE_CONNECTION_COUNT);
 	BIND_ENUM_CONSTANT(NAVIGATION_EDGE_FREE_COUNT);
 	BIND_ENUM_CONSTANT(NAVIGATION_EDGE_FREE_COUNT);
 	BIND_ENUM_CONSTANT(NAVIGATION_OBSTACLE_COUNT);
 	BIND_ENUM_CONSTANT(NAVIGATION_OBSTACLE_COUNT);
+#endif // !defined(NAVIGATION_2D_DISABLED) || !defined(NAVIGATION_3D_DISABLED)
 	BIND_ENUM_CONSTANT(PIPELINE_COMPILATIONS_CANVAS);
 	BIND_ENUM_CONSTANT(PIPELINE_COMPILATIONS_CANVAS);
 	BIND_ENUM_CONSTANT(PIPELINE_COMPILATIONS_MESH);
 	BIND_ENUM_CONSTANT(PIPELINE_COMPILATIONS_MESH);
 	BIND_ENUM_CONSTANT(PIPELINE_COMPILATIONS_SURFACE);
 	BIND_ENUM_CONSTANT(PIPELINE_COMPILATIONS_SURFACE);
 	BIND_ENUM_CONSTANT(PIPELINE_COMPILATIONS_DRAW);
 	BIND_ENUM_CONSTANT(PIPELINE_COMPILATIONS_DRAW);
 	BIND_ENUM_CONSTANT(PIPELINE_COMPILATIONS_SPECIALIZATION);
 	BIND_ENUM_CONSTANT(PIPELINE_COMPILATIONS_SPECIALIZATION);
+#ifndef NAVIGATION_2D_DISABLED
 	BIND_ENUM_CONSTANT(NAVIGATION_2D_ACTIVE_MAPS);
 	BIND_ENUM_CONSTANT(NAVIGATION_2D_ACTIVE_MAPS);
 	BIND_ENUM_CONSTANT(NAVIGATION_2D_REGION_COUNT);
 	BIND_ENUM_CONSTANT(NAVIGATION_2D_REGION_COUNT);
 	BIND_ENUM_CONSTANT(NAVIGATION_2D_AGENT_COUNT);
 	BIND_ENUM_CONSTANT(NAVIGATION_2D_AGENT_COUNT);
@@ -109,6 +116,8 @@ void Performance::_bind_methods() {
 	BIND_ENUM_CONSTANT(NAVIGATION_2D_EDGE_CONNECTION_COUNT);
 	BIND_ENUM_CONSTANT(NAVIGATION_2D_EDGE_CONNECTION_COUNT);
 	BIND_ENUM_CONSTANT(NAVIGATION_2D_EDGE_FREE_COUNT);
 	BIND_ENUM_CONSTANT(NAVIGATION_2D_EDGE_FREE_COUNT);
 	BIND_ENUM_CONSTANT(NAVIGATION_2D_OBSTACLE_COUNT);
 	BIND_ENUM_CONSTANT(NAVIGATION_2D_OBSTACLE_COUNT);
+#endif // NAVIGATION_2D_DISABLED
+#ifndef NAVIGATION_3D_DISABLED
 	BIND_ENUM_CONSTANT(NAVIGATION_3D_ACTIVE_MAPS);
 	BIND_ENUM_CONSTANT(NAVIGATION_3D_ACTIVE_MAPS);
 	BIND_ENUM_CONSTANT(NAVIGATION_3D_REGION_COUNT);
 	BIND_ENUM_CONSTANT(NAVIGATION_3D_REGION_COUNT);
 	BIND_ENUM_CONSTANT(NAVIGATION_3D_AGENT_COUNT);
 	BIND_ENUM_CONSTANT(NAVIGATION_3D_AGENT_COUNT);
@@ -119,6 +128,7 @@ void Performance::_bind_methods() {
 	BIND_ENUM_CONSTANT(NAVIGATION_3D_EDGE_CONNECTION_COUNT);
 	BIND_ENUM_CONSTANT(NAVIGATION_3D_EDGE_CONNECTION_COUNT);
 	BIND_ENUM_CONSTANT(NAVIGATION_3D_EDGE_FREE_COUNT);
 	BIND_ENUM_CONSTANT(NAVIGATION_3D_EDGE_FREE_COUNT);
 	BIND_ENUM_CONSTANT(NAVIGATION_3D_OBSTACLE_COUNT);
 	BIND_ENUM_CONSTANT(NAVIGATION_3D_OBSTACLE_COUNT);
+#endif // NAVIGATION_3D_DISABLED
 	BIND_ENUM_CONSTANT(MONITOR_MAX);
 	BIND_ENUM_CONSTANT(MONITOR_MAX);
 }
 }
 
 
@@ -158,6 +168,7 @@ String Performance::get_monitor_name(Monitor p_monitor) const {
 		PNAME("physics_3d/collision_pairs"),
 		PNAME("physics_3d/collision_pairs"),
 		PNAME("physics_3d/islands"),
 		PNAME("physics_3d/islands"),
 		PNAME("audio/driver/output_latency"),
 		PNAME("audio/driver/output_latency"),
+#if !defined(NAVIGATION_2D_DISABLED) || !defined(NAVIGATION_3D_DISABLED)
 		PNAME("navigation/active_maps"),
 		PNAME("navigation/active_maps"),
 		PNAME("navigation/regions"),
 		PNAME("navigation/regions"),
 		PNAME("navigation/agents"),
 		PNAME("navigation/agents"),
@@ -168,11 +179,13 @@ String Performance::get_monitor_name(Monitor p_monitor) const {
 		PNAME("navigation/edges_connected"),
 		PNAME("navigation/edges_connected"),
 		PNAME("navigation/edges_free"),
 		PNAME("navigation/edges_free"),
 		PNAME("navigation/obstacles"),
 		PNAME("navigation/obstacles"),
+#endif // !defined(NAVIGATION_2D_DISABLED) || !defined(NAVIGATION_3D_DISABLED)
 		PNAME("pipeline/compilations_canvas"),
 		PNAME("pipeline/compilations_canvas"),
 		PNAME("pipeline/compilations_mesh"),
 		PNAME("pipeline/compilations_mesh"),
 		PNAME("pipeline/compilations_surface"),
 		PNAME("pipeline/compilations_surface"),
 		PNAME("pipeline/compilations_draw"),
 		PNAME("pipeline/compilations_draw"),
 		PNAME("pipeline/compilations_specialization"),
 		PNAME("pipeline/compilations_specialization"),
+#ifndef NAVIGATION_2D_DISABLED
 		PNAME("navigation_2d/active_maps"),
 		PNAME("navigation_2d/active_maps"),
 		PNAME("navigation_2d/regions"),
 		PNAME("navigation_2d/regions"),
 		PNAME("navigation_2d/agents"),
 		PNAME("navigation_2d/agents"),
@@ -183,6 +196,8 @@ String Performance::get_monitor_name(Monitor p_monitor) const {
 		PNAME("navigation_2d/edges_connected"),
 		PNAME("navigation_2d/edges_connected"),
 		PNAME("navigation_2d/edges_free"),
 		PNAME("navigation_2d/edges_free"),
 		PNAME("navigation_2d/obstacles"),
 		PNAME("navigation_2d/obstacles"),
+#endif // NAVIGATION_2D_DISABLED
+#ifndef NAVIGATION_3D_DISABLED
 		PNAME("navigation_3d/active_maps"),
 		PNAME("navigation_3d/active_maps"),
 		PNAME("navigation_3d/regions"),
 		PNAME("navigation_3d/regions"),
 		PNAME("navigation_3d/agents"),
 		PNAME("navigation_3d/agents"),
@@ -193,6 +208,7 @@ String Performance::get_monitor_name(Monitor p_monitor) const {
 		PNAME("navigation_3d/edges_connected"),
 		PNAME("navigation_3d/edges_connected"),
 		PNAME("navigation_3d/edges_free"),
 		PNAME("navigation_3d/edges_free"),
 		PNAME("navigation_3d/obstacles"),
 		PNAME("navigation_3d/obstacles"),
+#endif // NAVIGATION_3D_DISABLED
 	};
 	};
 	static_assert(std::size(names) == MONITOR_MAX);
 	static_assert(std::size(names) == MONITOR_MAX);
 
 
@@ -200,6 +216,8 @@ String Performance::get_monitor_name(Monitor p_monitor) const {
 }
 }
 
 
 double Performance::get_monitor(Monitor p_monitor) const {
 double Performance::get_monitor(Monitor p_monitor) const {
+	int info = 0;
+
 	switch (p_monitor) {
 	switch (p_monitor) {
 		case TIME_FPS:
 		case TIME_FPS:
 			return Engine::get_singleton()->get_frames_per_second();
 			return Engine::get_singleton()->get_frames_per_second();
@@ -280,36 +298,96 @@ double Performance::get_monitor(Monitor p_monitor) const {
 			return AudioServer::get_singleton()->get_output_latency();
 			return AudioServer::get_singleton()->get_output_latency();
 
 
 		case NAVIGATION_ACTIVE_MAPS:
 		case NAVIGATION_ACTIVE_MAPS:
-			return NavigationServer2D::get_singleton()->get_process_info(NavigationServer2D::INFO_ACTIVE_MAPS) +
-					NavigationServer3D::get_singleton()->get_process_info(NavigationServer3D::INFO_ACTIVE_MAPS);
+#ifndef NAVIGATION_2D_DISABLED
+			info = NavigationServer2D::get_singleton()->get_process_info(NavigationServer2D::INFO_ACTIVE_MAPS);
+#endif // NAVIGATION_2D_DISABLED
+#ifndef NAVIGATION_3D_DISABLED
+			info += NavigationServer3D::get_singleton()->get_process_info(NavigationServer3D::INFO_ACTIVE_MAPS);
+#endif // NAVIGATION_3D_DISABLED
+			return info;
+
 		case NAVIGATION_REGION_COUNT:
 		case NAVIGATION_REGION_COUNT:
-			return NavigationServer2D::get_singleton()->get_process_info(NavigationServer2D::INFO_REGION_COUNT) +
-					NavigationServer3D::get_singleton()->get_process_info(NavigationServer3D::INFO_REGION_COUNT);
+#ifndef NAVIGATION_2D_DISABLED
+			info = NavigationServer2D::get_singleton()->get_process_info(NavigationServer2D::INFO_REGION_COUNT);
+#endif // NAVIGATION_2D_DISABLED
+#ifndef NAVIGATION_3D_DISABLED
+			info += NavigationServer3D::get_singleton()->get_process_info(NavigationServer3D::INFO_REGION_COUNT);
+#endif // NAVIGATION_3D_DISABLED
+			return info;
+
 		case NAVIGATION_AGENT_COUNT:
 		case NAVIGATION_AGENT_COUNT:
-			return NavigationServer2D::get_singleton()->get_process_info(NavigationServer2D::INFO_AGENT_COUNT) +
-					NavigationServer3D::get_singleton()->get_process_info(NavigationServer3D::INFO_AGENT_COUNT);
+#ifndef NAVIGATION_2D_DISABLED
+			info = NavigationServer2D::get_singleton()->get_process_info(NavigationServer2D::INFO_AGENT_COUNT);
+#endif // NAVIGATION_2D_DISABLED
+#ifndef NAVIGATION_3D_DISABLED
+			info += NavigationServer3D::get_singleton()->get_process_info(NavigationServer3D::INFO_AGENT_COUNT);
+#endif // NAVIGATION_3D_DISABLED
+			return info;
+
 		case NAVIGATION_LINK_COUNT:
 		case NAVIGATION_LINK_COUNT:
-			return NavigationServer2D::get_singleton()->get_process_info(NavigationServer2D::INFO_LINK_COUNT) +
-					NavigationServer3D::get_singleton()->get_process_info(NavigationServer3D::INFO_LINK_COUNT);
+#ifndef NAVIGATION_2D_DISABLED
+			info = NavigationServer2D::get_singleton()->get_process_info(NavigationServer2D::INFO_LINK_COUNT);
+#endif // NAVIGATION_2D_DISABLED
+#ifndef NAVIGATION_3D_DISABLED
+			info += NavigationServer3D::get_singleton()->get_process_info(NavigationServer3D::INFO_LINK_COUNT);
+#endif // NAVIGATION_3D_DISABLED
+			return info;
+
 		case NAVIGATION_POLYGON_COUNT:
 		case NAVIGATION_POLYGON_COUNT:
-			return NavigationServer2D::get_singleton()->get_process_info(NavigationServer2D::INFO_POLYGON_COUNT) +
-					NavigationServer3D::get_singleton()->get_process_info(NavigationServer3D::INFO_POLYGON_COUNT);
+#ifndef NAVIGATION_2D_DISABLED
+			info = NavigationServer2D::get_singleton()->get_process_info(NavigationServer2D::INFO_POLYGON_COUNT);
+#endif // NAVIGATION_2D_DISABLED
+#ifndef NAVIGATION_3D_DISABLED
+			info += NavigationServer3D::get_singleton()->get_process_info(NavigationServer3D::INFO_POLYGON_COUNT);
+#endif // NAVIGATION_3D_DISABLED
+			return info;
+
 		case NAVIGATION_EDGE_COUNT:
 		case NAVIGATION_EDGE_COUNT:
-			return NavigationServer2D::get_singleton()->get_process_info(NavigationServer2D::INFO_EDGE_COUNT) +
-					NavigationServer3D::get_singleton()->get_process_info(NavigationServer3D::INFO_EDGE_COUNT);
+#ifndef NAVIGATION_2D_DISABLED
+			info = NavigationServer2D::get_singleton()->get_process_info(NavigationServer2D::INFO_EDGE_COUNT);
+#endif // NAVIGATION_2D_DISABLED
+#ifndef NAVIGATION_3D_DISABLED
+			info += NavigationServer3D::get_singleton()->get_process_info(NavigationServer3D::INFO_EDGE_COUNT);
+#endif // NAVIGATION_3D_DISABLED
+			return info;
+
 		case NAVIGATION_EDGE_MERGE_COUNT:
 		case NAVIGATION_EDGE_MERGE_COUNT:
-			return NavigationServer2D::get_singleton()->get_process_info(NavigationServer2D::INFO_EDGE_MERGE_COUNT) +
-					NavigationServer3D::get_singleton()->get_process_info(NavigationServer3D::INFO_EDGE_MERGE_COUNT);
+#ifndef NAVIGATION_2D_DISABLED
+			info = NavigationServer2D::get_singleton()->get_process_info(NavigationServer2D::INFO_EDGE_MERGE_COUNT);
+#endif // NAVIGATION_2D_DISABLED
+#ifndef NAVIGATION_3D_DISABLED
+			info += NavigationServer3D::get_singleton()->get_process_info(NavigationServer3D::INFO_EDGE_MERGE_COUNT);
+#endif // NAVIGATION_3D_DISABLED
+			return info;
+
 		case NAVIGATION_EDGE_CONNECTION_COUNT:
 		case NAVIGATION_EDGE_CONNECTION_COUNT:
-			return NavigationServer2D::get_singleton()->get_process_info(NavigationServer2D::INFO_EDGE_CONNECTION_COUNT) +
-					NavigationServer3D::get_singleton()->get_process_info(NavigationServer3D::INFO_EDGE_CONNECTION_COUNT);
+#ifndef NAVIGATION_2D_DISABLED
+			info = NavigationServer2D::get_singleton()->get_process_info(NavigationServer2D::INFO_EDGE_CONNECTION_COUNT);
+#endif // NAVIGATION_2D_DISABLED
+#ifndef NAVIGATION_3D_DISABLED
+			info += NavigationServer3D::get_singleton()->get_process_info(NavigationServer3D::INFO_EDGE_CONNECTION_COUNT);
+#endif // NAVIGATION_3D_DISABLED
+			return info;
+
 		case NAVIGATION_EDGE_FREE_COUNT:
 		case NAVIGATION_EDGE_FREE_COUNT:
-			return NavigationServer2D::get_singleton()->get_process_info(NavigationServer2D::INFO_EDGE_FREE_COUNT) +
-					NavigationServer3D::get_singleton()->get_process_info(NavigationServer3D::INFO_EDGE_FREE_COUNT);
-		case NAVIGATION_OBSTACLE_COUNT:
-			return NavigationServer2D::get_singleton()->get_process_info(NavigationServer2D::INFO_OBSTACLE_COUNT) +
-					NavigationServer3D::get_singleton()->get_process_info(NavigationServer3D::INFO_OBSTACLE_COUNT);
+#ifndef NAVIGATION_2D_DISABLED
+			info = NavigationServer2D::get_singleton()->get_process_info(NavigationServer2D::INFO_EDGE_FREE_COUNT);
+#endif // NAVIGATION_2D_DISABLED
+#ifndef NAVIGATION_3D_DISABLED
+			info += NavigationServer3D::get_singleton()->get_process_info(NavigationServer3D::INFO_EDGE_FREE_COUNT);
+#endif // NAVIGATION_3D_DISABLED
+			return info;
 
 
+		case NAVIGATION_OBSTACLE_COUNT:
+#ifndef NAVIGATION_2D_DISABLED
+			info = NavigationServer2D::get_singleton()->get_process_info(NavigationServer2D::INFO_OBSTACLE_COUNT);
+#endif // NAVIGATION_2D_DISABLED
+#ifndef NAVIGATION_3D_DISABLED
+			info += NavigationServer3D::get_singleton()->get_process_info(NavigationServer3D::INFO_OBSTACLE_COUNT);
+#endif // NAVIGATION_3D_DISABLED
+			return info;
+
+#ifndef NAVIGATION_2D_DISABLED
 		case NAVIGATION_2D_ACTIVE_MAPS:
 		case NAVIGATION_2D_ACTIVE_MAPS:
 			return NavigationServer2D::get_singleton()->get_process_info(NavigationServer2D::INFO_ACTIVE_MAPS);
 			return NavigationServer2D::get_singleton()->get_process_info(NavigationServer2D::INFO_ACTIVE_MAPS);
 		case NAVIGATION_2D_REGION_COUNT:
 		case NAVIGATION_2D_REGION_COUNT:
@@ -330,7 +408,9 @@ double Performance::get_monitor(Monitor p_monitor) const {
 			return NavigationServer2D::get_singleton()->get_process_info(NavigationServer2D::INFO_EDGE_FREE_COUNT);
 			return NavigationServer2D::get_singleton()->get_process_info(NavigationServer2D::INFO_EDGE_FREE_COUNT);
 		case NAVIGATION_2D_OBSTACLE_COUNT:
 		case NAVIGATION_2D_OBSTACLE_COUNT:
 			return NavigationServer2D::get_singleton()->get_process_info(NavigationServer2D::INFO_OBSTACLE_COUNT);
 			return NavigationServer2D::get_singleton()->get_process_info(NavigationServer2D::INFO_OBSTACLE_COUNT);
+#endif // NAVIGATION_2D_DISABLED
 
 
+#ifndef NAVIGATION_3D_DISABLED
 		case NAVIGATION_3D_ACTIVE_MAPS:
 		case NAVIGATION_3D_ACTIVE_MAPS:
 			return NavigationServer3D::get_singleton()->get_process_info(NavigationServer3D::INFO_ACTIVE_MAPS);
 			return NavigationServer3D::get_singleton()->get_process_info(NavigationServer3D::INFO_ACTIVE_MAPS);
 		case NAVIGATION_3D_REGION_COUNT:
 		case NAVIGATION_3D_REGION_COUNT:
@@ -351,6 +431,7 @@ double Performance::get_monitor(Monitor p_monitor) const {
 			return NavigationServer3D::get_singleton()->get_process_info(NavigationServer3D::INFO_EDGE_FREE_COUNT);
 			return NavigationServer3D::get_singleton()->get_process_info(NavigationServer3D::INFO_EDGE_FREE_COUNT);
 		case NAVIGATION_3D_OBSTACLE_COUNT:
 		case NAVIGATION_3D_OBSTACLE_COUNT:
 			return NavigationServer3D::get_singleton()->get_process_info(NavigationServer3D::INFO_OBSTACLE_COUNT);
 			return NavigationServer3D::get_singleton()->get_process_info(NavigationServer3D::INFO_OBSTACLE_COUNT);
+#endif // NAVIGATION_3D_DISABLED
 
 
 		default: {
 		default: {
 		}
 		}

+ 4 - 0
modules/csg/csg_shape.cpp

@@ -36,10 +36,13 @@
 #include "core/math/geometry_2d.h"
 #include "core/math/geometry_2d.h"
 #include "scene/resources/3d/navigation_mesh_source_geometry_data_3d.h"
 #include "scene/resources/3d/navigation_mesh_source_geometry_data_3d.h"
 #include "scene/resources/navigation_mesh.h"
 #include "scene/resources/navigation_mesh.h"
+#ifndef NAVIGATION_3D_DISABLED
 #include "servers/navigation_server_3d.h"
 #include "servers/navigation_server_3d.h"
+#endif // NAVIGATION_3D_DISABLED
 
 
 #include <manifold/manifold.h>
 #include <manifold/manifold.h>
 
 
+#ifndef NAVIGATION_3D_DISABLED
 Callable CSGShape3D::_navmesh_source_geometry_parsing_callback;
 Callable CSGShape3D::_navmesh_source_geometry_parsing_callback;
 RID CSGShape3D::_navmesh_source_geometry_parser;
 RID CSGShape3D::_navmesh_source_geometry_parser;
 
 
@@ -76,6 +79,7 @@ void CSGShape3D::navmesh_parse_source_geometry(const Ref<NavigationMesh> &p_navi
 		}
 		}
 	}
 	}
 }
 }
+#endif // NAVIGATION_3D_DISABLED
 
 
 #ifndef PHYSICS_3D_DISABLED
 #ifndef PHYSICS_3D_DISABLED
 void CSGShape3D::set_use_collision(bool p_enable) {
 void CSGShape3D::set_use_collision(bool p_enable) {

+ 2 - 0
modules/csg/csg_shape.h

@@ -184,6 +184,7 @@ public:
 
 
 	virtual Ref<TriangleMesh> generate_triangle_mesh() const override;
 	virtual Ref<TriangleMesh> generate_triangle_mesh() const override;
 
 
+#ifndef NAVIGATION_3D_DISABLED
 private:
 private:
 	static Callable _navmesh_source_geometry_parsing_callback;
 	static Callable _navmesh_source_geometry_parsing_callback;
 	static RID _navmesh_source_geometry_parser;
 	static RID _navmesh_source_geometry_parser;
@@ -191,6 +192,7 @@ private:
 public:
 public:
 	static void navmesh_parse_init();
 	static void navmesh_parse_init();
 	static void navmesh_parse_source_geometry(const Ref<NavigationMesh> &p_navigation_mesh, Ref<NavigationMeshSourceGeometryData3D> p_source_geometry_data, Node *p_node);
 	static void navmesh_parse_source_geometry(const Ref<NavigationMesh> &p_navigation_mesh, Ref<NavigationMeshSourceGeometryData3D> p_source_geometry_data, Node *p_node);
+#endif // NAVIGATION_3D_DISABLED
 
 
 	CSGShape3D();
 	CSGShape3D();
 	~CSGShape3D();
 	~CSGShape3D();

+ 2 - 0
modules/csg/register_types.cpp

@@ -47,7 +47,9 @@ void initialize_csg_module(ModuleInitializationLevel p_level) {
 		GDREGISTER_CLASS(CSGTorus3D);
 		GDREGISTER_CLASS(CSGTorus3D);
 		GDREGISTER_CLASS(CSGPolygon3D);
 		GDREGISTER_CLASS(CSGPolygon3D);
 		GDREGISTER_CLASS(CSGCombiner3D);
 		GDREGISTER_CLASS(CSGCombiner3D);
+#ifndef NAVIGATION_3D_DISABLED
 		CSGShape3D::navmesh_parse_init();
 		CSGShape3D::navmesh_parse_init();
+#endif // NAVIGATION_3D_DISABLED
 	}
 	}
 #ifdef TOOLS_ENABLED
 #ifdef TOOLS_ENABLED
 	if (p_level == MODULE_INITIALIZATION_LEVEL_EDITOR) {
 	if (p_level == MODULE_INITIALIZATION_LEVEL_EDITOR) {

+ 38 - 13
modules/gridmap/grid_map.cpp

@@ -45,11 +45,14 @@
 #include "scene/resources/3d/sphere_shape_3d.h"
 #include "scene/resources/3d/sphere_shape_3d.h"
 #include "scene/resources/physics_material.h"
 #include "scene/resources/physics_material.h"
 #include "scene/resources/surface_tool.h"
 #include "scene/resources/surface_tool.h"
-#include "servers/navigation_server_3d.h"
 #include "servers/rendering_server.h"
 #include "servers/rendering_server.h"
 
 
+#ifndef NAVIGATION_3D_DISABLED
+#include "servers/navigation_server_3d.h"
+
 Callable GridMap::_navmesh_source_geometry_parsing_callback;
 Callable GridMap::_navmesh_source_geometry_parsing_callback;
 RID GridMap::_navmesh_source_geometry_parser;
 RID GridMap::_navmesh_source_geometry_parser;
+#endif // NAVIGATION_3D_DISABLED
 
 
 bool GridMap::_set(const StringName &p_name, const Variant &p_value) {
 bool GridMap::_set(const StringName &p_name, const Variant &p_value) {
 	String name = p_name;
 	String name = p_name;
@@ -247,6 +250,7 @@ bool GridMap::is_baking_navigation() {
 	return bake_navigation;
 	return bake_navigation;
 }
 }
 
 
+#ifndef NAVIGATION_3D_DISABLED
 void GridMap::set_navigation_map(RID p_navigation_map) {
 void GridMap::set_navigation_map(RID p_navigation_map) {
 	map_override = p_navigation_map;
 	map_override = p_navigation_map;
 	for (const KeyValue<OctantKey, Octant *> &E : octant_map) {
 	for (const KeyValue<OctantKey, Octant *> &E : octant_map) {
@@ -267,6 +271,7 @@ RID GridMap::get_navigation_map() const {
 	}
 	}
 	return RID();
 	return RID();
 }
 }
+#endif // NAVIGATION_3D_DISABLED
 
 
 void GridMap::set_mesh_library(const Ref<MeshLibrary> &p_mesh_library) {
 void GridMap::set_mesh_library(const Ref<MeshLibrary> &p_mesh_library) {
 	if (mesh_library.is_valid()) {
 	if (mesh_library.is_valid()) {
@@ -541,6 +546,7 @@ void GridMap::_octant_transform(const OctantKey &p_key) {
 	}
 	}
 #endif // PHYSICS_3D_DISABLED
 #endif // PHYSICS_3D_DISABLED
 
 
+#ifndef NAVIGATION_3D_DISABLED
 	// update transform for NavigationServer regions and navigation debugmesh instances
 	// update transform for NavigationServer regions and navigation debugmesh instances
 	for (const KeyValue<IndexKey, Octant::NavigationCell> &E : g.navigation_cell_ids) {
 	for (const KeyValue<IndexKey, Octant::NavigationCell> &E : g.navigation_cell_ids) {
 		if (bake_navigation) {
 		if (bake_navigation) {
@@ -552,6 +558,7 @@ void GridMap::_octant_transform(const OctantKey &p_key) {
 			}
 			}
 		}
 		}
 	}
 	}
+#endif // NAVIGATION_3D_DISABLED
 
 
 	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());
@@ -575,6 +582,7 @@ bool GridMap::_octant_update(const OctantKey &p_key) {
 	}
 	}
 #endif // PHYSICS_3D_DISABLED
 #endif // PHYSICS_3D_DISABLED
 
 
+#ifndef NAVIGATION_3D_DISABLED
 	//erase navigation
 	//erase navigation
 	for (KeyValue<IndexKey, Octant::NavigationCell> &E : g.navigation_cell_ids) {
 	for (KeyValue<IndexKey, Octant::NavigationCell> &E : g.navigation_cell_ids) {
 		if (E.value.region.is_valid()) {
 		if (E.value.region.is_valid()) {
@@ -587,6 +595,7 @@ bool GridMap::_octant_update(const OctantKey &p_key) {
 		}
 		}
 	}
 	}
 	g.navigation_cell_ids.clear();
 	g.navigation_cell_ids.clear();
+#endif // NAVIGATION_3D_DISABLED
 
 
 	//erase multimeshes
 	//erase multimeshes
 
 
@@ -656,6 +665,7 @@ bool GridMap::_octant_update(const OctantKey &p_key) {
 		}
 		}
 #endif // PHYSICS_3D_DISABLED
 #endif // PHYSICS_3D_DISABLED
 
 
+#ifndef NAVIGATION_3D_DISABLED
 		// add the item's navigation_mesh at given xform to GridMap's Navigation ancestor
 		// add the item's navigation_mesh at given xform to GridMap's Navigation ancestor
 		Ref<NavigationMesh> navigation_mesh = mesh_library->get_item_navigation_mesh(c.item);
 		Ref<NavigationMesh> navigation_mesh = mesh_library->get_item_navigation_mesh(c.item);
 		if (navigation_mesh.is_valid()) {
 		if (navigation_mesh.is_valid()) {
@@ -696,13 +706,14 @@ bool GridMap::_octant_update(const OctantKey &p_key) {
 			}
 			}
 			g.navigation_cell_ids[E] = nm;
 			g.navigation_cell_ids[E] = nm;
 		}
 		}
+#endif // NAVIGATION_3D_DISABLED
 	}
 	}
 
 
-#ifdef DEBUG_ENABLED
+#if defined(DEBUG_ENABLED) && !defined(NAVIGATION_3D_DISABLED)
 	if (bake_navigation) {
 	if (bake_navigation) {
 		_update_octant_navigation_debug_edge_connections_mesh(p_key);
 		_update_octant_navigation_debug_edge_connections_mesh(p_key);
 	}
 	}
-#endif // DEBUG_ENABLED
+#endif // defined(DEBUG_ENABLED) && !defined(NAVIGATION_3D_DISABLED)
 
 
 	//update multimeshes, only if not baked
 	//update multimeshes, only if not baked
 	if (baked_meshes.size() == 0) {
 	if (baked_meshes.size() == 0) {
@@ -806,6 +817,7 @@ void GridMap::_octant_enter_world(const OctantKey &p_key) {
 		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());
 	}
 	}
 
 
+#ifndef NAVIGATION_3D_DISABLED
 	if (bake_navigation && mesh_library.is_valid()) {
 	if (bake_navigation && mesh_library.is_valid()) {
 		for (KeyValue<IndexKey, Octant::NavigationCell> &F : g.navigation_cell_ids) {
 		for (KeyValue<IndexKey, Octant::NavigationCell> &F : g.navigation_cell_ids) {
 			if (cell_map.has(F.key) && F.value.region.is_valid() == false) {
 			if (cell_map.has(F.key) && F.value.region.is_valid() == false) {
@@ -840,6 +852,7 @@ void GridMap::_octant_enter_world(const OctantKey &p_key) {
 		}
 		}
 #endif // DEBUG_ENABLED
 #endif // DEBUG_ENABLED
 	}
 	}
+#endif // NAVIGATION_3D_DISABLED
 }
 }
 
 
 void GridMap::_octant_exit_world(const OctantKey &p_key) {
 void GridMap::_octant_exit_world(const OctantKey &p_key) {
@@ -847,7 +860,9 @@ void GridMap::_octant_exit_world(const OctantKey &p_key) {
 #ifndef PHYSICS_3D_DISABLED
 #ifndef PHYSICS_3D_DISABLED
 	ERR_FAIL_NULL(PhysicsServer3D::get_singleton());
 	ERR_FAIL_NULL(PhysicsServer3D::get_singleton());
 #endif // PHYSICS_3D_DISABLED
 #endif // PHYSICS_3D_DISABLED
+#ifndef NAVIGATION_3D_DISABLED
 	ERR_FAIL_NULL(NavigationServer3D::get_singleton());
 	ERR_FAIL_NULL(NavigationServer3D::get_singleton());
+#endif // NAVIGATION_3D_DISABLED
 
 
 	ERR_FAIL_COND(!octant_map.has(p_key));
 	ERR_FAIL_COND(!octant_map.has(p_key));
 	Octant &g = *octant_map[p_key];
 	Octant &g = *octant_map[p_key];
@@ -865,6 +880,7 @@ void GridMap::_octant_exit_world(const OctantKey &p_key) {
 		RS::get_singleton()->instance_set_scenario(g.multimesh_instances[i].instance, RID());
 		RS::get_singleton()->instance_set_scenario(g.multimesh_instances[i].instance, RID());
 	}
 	}
 
 
+#ifndef NAVIGATION_3D_DISABLED
 	for (KeyValue<IndexKey, Octant::NavigationCell> &F : g.navigation_cell_ids) {
 	for (KeyValue<IndexKey, Octant::NavigationCell> &F : g.navigation_cell_ids) {
 		if (F.value.region.is_valid()) {
 		if (F.value.region.is_valid()) {
 			NavigationServer3D::get_singleton()->free(F.value.region);
 			NavigationServer3D::get_singleton()->free(F.value.region);
@@ -875,6 +891,7 @@ void GridMap::_octant_exit_world(const OctantKey &p_key) {
 			F.value.navigation_mesh_debug_instance = RID();
 			F.value.navigation_mesh_debug_instance = RID();
 		}
 		}
 	}
 	}
+#endif // NAVIGATION_3D_DISABLED
 
 
 #ifdef DEBUG_ENABLED
 #ifdef DEBUG_ENABLED
 	if (bake_navigation) {
 	if (bake_navigation) {
@@ -894,7 +911,9 @@ void GridMap::_octant_clean_up(const OctantKey &p_key) {
 #ifndef PHYSICS_3D_DISABLED
 #ifndef PHYSICS_3D_DISABLED
 	ERR_FAIL_NULL(PhysicsServer3D::get_singleton());
 	ERR_FAIL_NULL(PhysicsServer3D::get_singleton());
 #endif // PHYSICS_3D_DISABLED
 #endif // PHYSICS_3D_DISABLED
+#ifndef NAVIGATION_3D_DISABLED
 	ERR_FAIL_NULL(NavigationServer3D::get_singleton());
 	ERR_FAIL_NULL(NavigationServer3D::get_singleton());
+#endif // NAVIGATION_3D_DISABLED
 
 
 	ERR_FAIL_COND(!octant_map.has(p_key));
 	ERR_FAIL_COND(!octant_map.has(p_key));
 	Octant &g = *octant_map[p_key];
 	Octant &g = *octant_map[p_key];
@@ -910,6 +929,7 @@ void GridMap::_octant_clean_up(const OctantKey &p_key) {
 	PhysicsServer3D::get_singleton()->free(g.static_body);
 	PhysicsServer3D::get_singleton()->free(g.static_body);
 #endif // PHYSICS_3D_DISABLED
 #endif // PHYSICS_3D_DISABLED
 
 
+#ifndef NAVIGATION_3D_DISABLED
 	// Erase navigation
 	// Erase navigation
 	for (const KeyValue<IndexKey, Octant::NavigationCell> &E : g.navigation_cell_ids) {
 	for (const KeyValue<IndexKey, Octant::NavigationCell> &E : g.navigation_cell_ids) {
 		if (E.value.region.is_valid()) {
 		if (E.value.region.is_valid()) {
@@ -920,6 +940,7 @@ void GridMap::_octant_clean_up(const OctantKey &p_key) {
 		}
 		}
 	}
 	}
 	g.navigation_cell_ids.clear();
 	g.navigation_cell_ids.clear();
+#endif // NAVIGATION_3D_DISABLED
 
 
 #ifdef DEBUG_ENABLED
 #ifdef DEBUG_ENABLED
 	if (bake_navigation) {
 	if (bake_navigation) {
@@ -958,11 +979,11 @@ void GridMap::_notification(int p_what) {
 		} break;
 		} break;
 
 
 		case NOTIFICATION_ENTER_TREE: {
 		case NOTIFICATION_ENTER_TREE: {
-#ifdef DEBUG_ENABLED
+#if defined(DEBUG_ENABLED) && !defined(NAVIGATION_3D_DISABLED)
 			if (bake_navigation && NavigationServer3D::get_singleton()->get_debug_navigation_enabled()) {
 			if (bake_navigation && NavigationServer3D::get_singleton()->get_debug_navigation_enabled()) {
 				_update_navigation_debug_edge_connections();
 				_update_navigation_debug_edge_connections();
 			}
 			}
-#endif // DEBUG_ENABLED
+#endif // defined(DEBUG_ENABLED) && !defined(NAVIGATION_3D_DISABLED)
 			_update_visibility();
 			_update_visibility();
 		} break;
 		} break;
 
 
@@ -1109,8 +1130,10 @@ void GridMap::_bind_methods() {
 	ClassDB::bind_method(D_METHOD("set_bake_navigation", "bake_navigation"), &GridMap::set_bake_navigation);
 	ClassDB::bind_method(D_METHOD("set_bake_navigation", "bake_navigation"), &GridMap::set_bake_navigation);
 	ClassDB::bind_method(D_METHOD("is_baking_navigation"), &GridMap::is_baking_navigation);
 	ClassDB::bind_method(D_METHOD("is_baking_navigation"), &GridMap::is_baking_navigation);
 
 
+#ifndef NAVIGATION_3D_DISABLED
 	ClassDB::bind_method(D_METHOD("set_navigation_map", "navigation_map"), &GridMap::set_navigation_map);
 	ClassDB::bind_method(D_METHOD("set_navigation_map", "navigation_map"), &GridMap::set_navigation_map);
 	ClassDB::bind_method(D_METHOD("get_navigation_map"), &GridMap::get_navigation_map);
 	ClassDB::bind_method(D_METHOD("get_navigation_map"), &GridMap::get_navigation_map);
+#endif // NAVIGATION_3D_DISABLED
 
 
 	ClassDB::bind_method(D_METHOD("set_mesh_library", "mesh_library"), &GridMap::set_mesh_library);
 	ClassDB::bind_method(D_METHOD("set_mesh_library", "mesh_library"), &GridMap::set_mesh_library);
 	ClassDB::bind_method(D_METHOD("get_mesh_library"), &GridMap::get_mesh_library);
 	ClassDB::bind_method(D_METHOD("get_mesh_library"), &GridMap::get_mesh_library);
@@ -1373,12 +1396,13 @@ RID GridMap::get_bake_mesh_instance(int p_idx) {
 
 
 GridMap::GridMap() {
 GridMap::GridMap() {
 	set_notify_transform(true);
 	set_notify_transform(true);
-#ifdef DEBUG_ENABLED
+#if defined(DEBUG_ENABLED) && !defined(NAVIGATION_3D_DISABLED)
 	NavigationServer3D::get_singleton()->connect("map_changed", callable_mp(this, &GridMap::_navigation_map_changed));
 	NavigationServer3D::get_singleton()->connect("map_changed", callable_mp(this, &GridMap::_navigation_map_changed));
 	NavigationServer3D::get_singleton()->connect("navigation_debug_changed", callable_mp(this, &GridMap::_update_navigation_debug_edge_connections));
 	NavigationServer3D::get_singleton()->connect("navigation_debug_changed", callable_mp(this, &GridMap::_update_navigation_debug_edge_connections));
-#endif // DEBUG_ENABLED
+#endif // defined(DEBUG_ENABLED) && !defined(NAVIGATION_3D_DISABLED)
 }
 }
 
 
+#ifndef NAVIGATION_3D_DISABLED
 void GridMap::navmesh_parse_init() {
 void GridMap::navmesh_parse_init() {
 	ERR_FAIL_NULL(NavigationServer3D::get_singleton());
 	ERR_FAIL_NULL(NavigationServer3D::get_singleton());
 	if (!_navmesh_source_geometry_parser.is_valid()) {
 	if (!_navmesh_source_geometry_parser.is_valid()) {
@@ -1518,8 +1542,9 @@ void GridMap::navmesh_parse_source_geometry(const Ref<NavigationMesh> &p_navigat
 	}
 	}
 #endif // PHYSICS_3D_DISABLED
 #endif // PHYSICS_3D_DISABLED
 }
 }
+#endif // NAVIGATION_3D_DISABLED
 
 
-#ifdef DEBUG_ENABLED
+#if defined(DEBUG_ENABLED) && !defined(NAVIGATION_3D_DISABLED)
 void GridMap::_update_navigation_debug_edge_connections() {
 void GridMap::_update_navigation_debug_edge_connections() {
 	if (bake_navigation) {
 	if (bake_navigation) {
 		for (const KeyValue<OctantKey, Octant *> &E : octant_map) {
 		for (const KeyValue<OctantKey, Octant *> &E : octant_map) {
@@ -1533,17 +1558,17 @@ void GridMap::_navigation_map_changed(RID p_map) {
 		_update_navigation_debug_edge_connections();
 		_update_navigation_debug_edge_connections();
 	}
 	}
 }
 }
-#endif // DEBUG_ENABLED
+#endif // defined(DEBUG_ENABLED) && !defined(NAVIGATION_3D_DISABLED)
 
 
 GridMap::~GridMap() {
 GridMap::~GridMap() {
 	clear();
 	clear();
-#ifdef DEBUG_ENABLED
+#if defined(DEBUG_ENABLED) && !defined(NAVIGATION_3D_DISABLED)
 	NavigationServer3D::get_singleton()->disconnect("map_changed", callable_mp(this, &GridMap::_navigation_map_changed));
 	NavigationServer3D::get_singleton()->disconnect("map_changed", callable_mp(this, &GridMap::_navigation_map_changed));
 	NavigationServer3D::get_singleton()->disconnect("navigation_debug_changed", callable_mp(this, &GridMap::_update_navigation_debug_edge_connections));
 	NavigationServer3D::get_singleton()->disconnect("navigation_debug_changed", callable_mp(this, &GridMap::_update_navigation_debug_edge_connections));
-#endif // DEBUG_ENABLED
+#endif // defined(DEBUG_ENABLED) && !defined(NAVIGATION_3D_DISABLED)
 }
 }
 
 
-#ifdef DEBUG_ENABLED
+#if defined(DEBUG_ENABLED) && !defined(NAVIGATION_3D_DISABLED)
 void GridMap::_update_octant_navigation_debug_edge_connections_mesh(const OctantKey &p_key) {
 void GridMap::_update_octant_navigation_debug_edge_connections_mesh(const OctantKey &p_key) {
 	ERR_FAIL_COND(!octant_map.has(p_key));
 	ERR_FAIL_COND(!octant_map.has(p_key));
 	Octant &g = *octant_map[p_key];
 	Octant &g = *octant_map[p_key];
@@ -1641,4 +1666,4 @@ void GridMap::_update_octant_navigation_debug_edge_connections_mesh(const Octant
 		RS::get_singleton()->instance_set_visible(g.navigation_debug_edge_connections_instance, false);
 		RS::get_singleton()->instance_set_visible(g.navigation_debug_edge_connections_instance, false);
 	}
 	}
 }
 }
-#endif // DEBUG_ENABLED
+#endif // defined(DEBUG_ENABLED) && !defined(NAVIGATION_3D_DISABLED)

+ 8 - 2
modules/gridmap/grid_map.h

@@ -200,11 +200,11 @@ class GridMap : public Node3D {
 	bool _octant_update(const OctantKey &p_key);
 	bool _octant_update(const OctantKey &p_key);
 	void _octant_clean_up(const OctantKey &p_key);
 	void _octant_clean_up(const OctantKey &p_key);
 	void _octant_transform(const OctantKey &p_key);
 	void _octant_transform(const OctantKey &p_key);
-#ifdef DEBUG_ENABLED
+#if defined(DEBUG_ENABLED) && !defined(NAVIGATION_3D_DISABLED)
 	void _update_octant_navigation_debug_edge_connections_mesh(const OctantKey &p_key);
 	void _update_octant_navigation_debug_edge_connections_mesh(const OctantKey &p_key);
 	void _navigation_map_changed(RID p_map);
 	void _navigation_map_changed(RID p_map);
 	void _update_navigation_debug_edge_connections();
 	void _update_navigation_debug_edge_connections();
-#endif // DEBUG_ENABLED
+#endif // defined(DEBUG_ENABLED) && !defined(NAVIGATION_3D_DISABLED)
 	bool awaiting_update = false;
 	bool awaiting_update = false;
 
 
 	void _queue_octants_dirty();
 	void _queue_octants_dirty();
@@ -264,8 +264,10 @@ public:
 	void set_bake_navigation(bool p_bake_navigation);
 	void set_bake_navigation(bool p_bake_navigation);
 	bool is_baking_navigation();
 	bool is_baking_navigation();
 
 
+#ifndef NAVIGATION_3D_DISABLED
 	void set_navigation_map(RID p_navigation_map);
 	void set_navigation_map(RID p_navigation_map);
 	RID get_navigation_map() const;
 	RID get_navigation_map() const;
+#endif // NAVIGATION_3D_DISABLED
 
 
 	void set_mesh_library(const Ref<MeshLibrary> &p_mesh_library);
 	void set_mesh_library(const Ref<MeshLibrary> &p_mesh_library);
 	Ref<MeshLibrary> get_mesh_library() const;
 	Ref<MeshLibrary> get_mesh_library() const;
@@ -309,13 +311,17 @@ public:
 	Array get_bake_meshes();
 	Array get_bake_meshes();
 	RID get_bake_mesh_instance(int p_idx);
 	RID get_bake_mesh_instance(int p_idx);
 
 
+#ifndef NAVIGATION_3D_DISABLED
 private:
 private:
 	static Callable _navmesh_source_geometry_parsing_callback;
 	static Callable _navmesh_source_geometry_parsing_callback;
 	static RID _navmesh_source_geometry_parser;
 	static RID _navmesh_source_geometry_parser;
+#endif // NAVIGATION_3D_DISABLED
 
 
 public:
 public:
+#ifndef NAVIGATION_3D_DISABLED
 	static void navmesh_parse_init();
 	static void navmesh_parse_init();
 	static void navmesh_parse_source_geometry(const Ref<NavigationMesh> &p_navigation_mesh, Ref<NavigationMeshSourceGeometryData3D> p_source_geometry_data, Node *p_node);
 	static void navmesh_parse_source_geometry(const Ref<NavigationMesh> &p_navigation_mesh, Ref<NavigationMeshSourceGeometryData3D> p_source_geometry_data, Node *p_node);
+#endif // NAVIGATION_3D_DISABLED
 
 
 	GridMap();
 	GridMap();
 	~GridMap();
 	~GridMap();

+ 2 - 0
modules/gridmap/register_types.cpp

@@ -43,7 +43,9 @@
 void initialize_gridmap_module(ModuleInitializationLevel p_level) {
 void initialize_gridmap_module(ModuleInitializationLevel p_level) {
 	if (p_level == MODULE_INITIALIZATION_LEVEL_SCENE) {
 	if (p_level == MODULE_INITIALIZATION_LEVEL_SCENE) {
 		GDREGISTER_CLASS(GridMap);
 		GDREGISTER_CLASS(GridMap);
+#ifndef NAVIGATION_3D_DISABLED
 		GridMap::navmesh_parse_init();
 		GridMap::navmesh_parse_init();
+#endif // NAVIGATION_3D_DISABLED
 	}
 	}
 #ifdef TOOLS_ENABLED
 #ifdef TOOLS_ENABLED
 	if (p_level == MODULE_INITIALIZATION_LEVEL_EDITOR) {
 	if (p_level == MODULE_INITIALIZATION_LEVEL_EDITOR) {

+ 1 - 1
modules/navigation_2d/config.py

@@ -1,5 +1,5 @@
 def can_build(env, platform):
 def can_build(env, platform):
-    return True
+    return not env["disable_navigation_2d"]
 
 
 
 
 def configure(env):
 def configure(env):

+ 1 - 1
modules/navigation_3d/3d/navigation_mesh_generator.h

@@ -30,7 +30,7 @@
 
 
 #pragma once
 #pragma once
 
 
-#include "scene/3d/navigation_region_3d.h"
+#include "scene/3d/navigation/navigation_region_3d.h"
 #include "scene/resources/navigation_mesh.h"
 #include "scene/resources/navigation_mesh.h"
 
 
 class NavigationMeshSourceGeometryData3D;
 class NavigationMeshSourceGeometryData3D;

+ 4 - 1
modules/navigation_3d/config.py

@@ -1,6 +1,9 @@
 def can_build(env, platform):
 def can_build(env, platform):
+    if env["disable_navigation_3d"]:
+        return False
+
     env.module_add_dependencies("navigation", ["csg", "gridmap"], True)
     env.module_add_dependencies("navigation", ["csg", "gridmap"], True)
-    return not env["disable_3d"]
+    return True
 
 
 
 
 def configure(env):
 def configure(env):

+ 1 - 1
modules/navigation_3d/editor/navigation_mesh_editor_plugin.cpp

@@ -32,7 +32,7 @@
 
 
 #include "editor/editor_node.h"
 #include "editor/editor_node.h"
 #include "editor/editor_string_names.h"
 #include "editor/editor_string_names.h"
-#include "scene/3d/navigation_region_3d.h"
+#include "scene/3d/navigation/navigation_region_3d.h"
 #include "scene/gui/box_container.h"
 #include "scene/gui/box_container.h"
 #include "scene/gui/button.h"
 #include "scene/gui/button.h"
 #include "scene/gui/dialogs.h"
 #include "scene/gui/dialogs.h"

+ 2 - 0
scene/2d/SCsub

@@ -8,3 +8,5 @@ env.add_source_files(env.scene_sources, "*.cpp")
 # Chain load SCsubs
 # Chain load SCsubs
 if not env["disable_physics_2d"]:
 if not env["disable_physics_2d"]:
     SConscript("physics/SCsub")
     SConscript("physics/SCsub")
+if not env["disable_navigation_2d"]:
+    SConscript("navigation/SCsub")

+ 4 - 1
scene/2d/mesh_instance_2d.cpp

@@ -30,13 +30,14 @@
 
 
 #include "mesh_instance_2d.h"
 #include "mesh_instance_2d.h"
 
 
+#ifndef NAVIGATION_2D_DISABLED
 #include "scene/resources/2d/navigation_mesh_source_geometry_data_2d.h"
 #include "scene/resources/2d/navigation_mesh_source_geometry_data_2d.h"
 #include "scene/resources/2d/navigation_polygon.h"
 #include "scene/resources/2d/navigation_polygon.h"
-#include "scene/scene_string_names.h"
 #include "servers/navigation_server_2d.h"
 #include "servers/navigation_server_2d.h"
 
 
 #include "thirdparty/clipper2/include/clipper2/clipper.h"
 #include "thirdparty/clipper2/include/clipper2/clipper.h"
 #include "thirdparty/misc/polypartition.h"
 #include "thirdparty/misc/polypartition.h"
+#endif // NAVIGATION_2D_DISABLED
 
 
 Callable MeshInstance2D::_navmesh_source_geometry_parsing_callback;
 Callable MeshInstance2D::_navmesh_source_geometry_parsing_callback;
 RID MeshInstance2D::_navmesh_source_geometry_parser;
 RID MeshInstance2D::_navmesh_source_geometry_parser;
@@ -117,6 +118,7 @@ bool MeshInstance2D::_edit_use_rect() const {
 }
 }
 #endif // DEBUG_ENABLED
 #endif // DEBUG_ENABLED
 
 
+#ifndef NAVIGATION_2D_DISABLED
 void MeshInstance2D::navmesh_parse_init() {
 void MeshInstance2D::navmesh_parse_init() {
 	ERR_FAIL_NULL(NavigationServer2D::get_singleton());
 	ERR_FAIL_NULL(NavigationServer2D::get_singleton());
 	if (!_navmesh_source_geometry_parser.is_valid()) {
 	if (!_navmesh_source_geometry_parser.is_valid()) {
@@ -211,6 +213,7 @@ void MeshInstance2D::navmesh_parse_source_geometry(const Ref<NavigationPolygon>
 		p_source_geometry_data->add_obstruction_outline(shape_outline);
 		p_source_geometry_data->add_obstruction_outline(shape_outline);
 	}
 	}
 }
 }
+#endif // NAVIGATION_2D_DISABLED
 
 
 MeshInstance2D::MeshInstance2D() {
 MeshInstance2D::MeshInstance2D() {
 }
 }

+ 2 - 0
scene/2d/mesh_instance_2d.h

@@ -63,8 +63,10 @@ private:
 	static RID _navmesh_source_geometry_parser;
 	static RID _navmesh_source_geometry_parser;
 
 
 public:
 public:
+#ifndef NAVIGATION_2D_DISABLED
 	static void navmesh_parse_init();
 	static void navmesh_parse_init();
 	static void navmesh_parse_source_geometry(const Ref<NavigationPolygon> &p_navigation_mesh, Ref<NavigationMeshSourceGeometryData2D> p_source_geometry_data, Node *p_node);
 	static void navmesh_parse_source_geometry(const Ref<NavigationPolygon> &p_navigation_mesh, Ref<NavigationMeshSourceGeometryData2D> p_source_geometry_data, Node *p_node);
+#endif // NAVIGATION_2D_DISABLED
 
 
 	MeshInstance2D();
 	MeshInstance2D();
 };
 };

+ 4 - 1
scene/2d/multimesh_instance_2d.cpp

@@ -30,13 +30,14 @@
 
 
 #include "multimesh_instance_2d.h"
 #include "multimesh_instance_2d.h"
 
 
+#ifndef NAVIGATION_2D_DISABLED
 #include "scene/resources/2d/navigation_mesh_source_geometry_data_2d.h"
 #include "scene/resources/2d/navigation_mesh_source_geometry_data_2d.h"
 #include "scene/resources/2d/navigation_polygon.h"
 #include "scene/resources/2d/navigation_polygon.h"
-#include "scene/scene_string_names.h"
 #include "servers/navigation_server_2d.h"
 #include "servers/navigation_server_2d.h"
 
 
 #include "thirdparty/clipper2/include/clipper2/clipper.h"
 #include "thirdparty/clipper2/include/clipper2/clipper.h"
 #include "thirdparty/misc/polypartition.h"
 #include "thirdparty/misc/polypartition.h"
+#endif // NAVIGATION_2D_DISABLED
 
 
 Callable MultiMeshInstance2D::_navmesh_source_geometry_parsing_callback;
 Callable MultiMeshInstance2D::_navmesh_source_geometry_parsing_callback;
 RID MultiMeshInstance2D::_navmesh_source_geometry_parser;
 RID MultiMeshInstance2D::_navmesh_source_geometry_parser;
@@ -106,6 +107,7 @@ Rect2 MultiMeshInstance2D::_edit_get_rect() const {
 }
 }
 #endif // DEBUG_ENABLED
 #endif // DEBUG_ENABLED
 
 
+#ifndef NAVIGATION_2D_DISABLED
 void MultiMeshInstance2D::navmesh_parse_init() {
 void MultiMeshInstance2D::navmesh_parse_init() {
 	ERR_FAIL_NULL(NavigationServer2D::get_singleton());
 	ERR_FAIL_NULL(NavigationServer2D::get_singleton());
 	if (!_navmesh_source_geometry_parser.is_valid()) {
 	if (!_navmesh_source_geometry_parser.is_valid()) {
@@ -209,6 +211,7 @@ void MultiMeshInstance2D::navmesh_parse_source_geometry(const Ref<NavigationPoly
 		}
 		}
 	}
 	}
 }
 }
+#endif // NAVIGATION_2D_DISABLED
 
 
 MultiMeshInstance2D::MultiMeshInstance2D() {
 MultiMeshInstance2D::MultiMeshInstance2D() {
 }
 }

+ 2 - 0
scene/2d/multimesh_instance_2d.h

@@ -63,8 +63,10 @@ private:
 	static RID _navmesh_source_geometry_parser;
 	static RID _navmesh_source_geometry_parser;
 
 
 public:
 public:
+#ifndef NAVIGATION_2D_DISABLED
 	static void navmesh_parse_init();
 	static void navmesh_parse_init();
 	static void navmesh_parse_source_geometry(const Ref<NavigationPolygon> &p_navigation_mesh, Ref<NavigationMeshSourceGeometryData2D> p_source_geometry_data, Node *p_node);
 	static void navmesh_parse_source_geometry(const Ref<NavigationPolygon> &p_navigation_mesh, Ref<NavigationMeshSourceGeometryData2D> p_source_geometry_data, Node *p_node);
+#endif // NAVIGATION_2D_DISABLED
 
 
 	MultiMeshInstance2D();
 	MultiMeshInstance2D();
 	~MultiMeshInstance2D();
 	~MultiMeshInstance2D();

+ 6 - 0
scene/2d/navigation/SCsub

@@ -0,0 +1,6 @@
+#!/usr/bin/env python
+from misc.utility.scons_hints import *
+
+Import("env")
+
+env.add_source_files(env.scene_sources, "*.cpp")

+ 1 - 1
scene/2d/navigation_agent_2d.cpp → scene/2d/navigation/navigation_agent_2d.cpp

@@ -31,7 +31,7 @@
 #include "navigation_agent_2d.h"
 #include "navigation_agent_2d.h"
 
 
 #include "core/math/geometry_2d.h"
 #include "core/math/geometry_2d.h"
-#include "scene/2d/navigation_link_2d.h"
+#include "scene/2d/navigation/navigation_link_2d.h"
 #include "scene/resources/world_2d.h"
 #include "scene/resources/world_2d.h"
 #include "servers/navigation_server_2d.h"
 #include "servers/navigation_server_2d.h"
 
 

+ 0 - 0
scene/2d/navigation_agent_2d.h → scene/2d/navigation/navigation_agent_2d.h


+ 0 - 0
scene/2d/navigation_link_2d.cpp → scene/2d/navigation/navigation_link_2d.cpp


+ 0 - 0
scene/2d/navigation_link_2d.h → scene/2d/navigation/navigation_link_2d.h


+ 0 - 0
scene/2d/navigation_obstacle_2d.cpp → scene/2d/navigation/navigation_obstacle_2d.cpp


+ 0 - 0
scene/2d/navigation_obstacle_2d.h → scene/2d/navigation/navigation_obstacle_2d.h


+ 0 - 0
scene/2d/navigation_region_2d.cpp → scene/2d/navigation/navigation_region_2d.cpp


+ 0 - 0
scene/2d/navigation_region_2d.h → scene/2d/navigation/navigation_region_2d.h


+ 4 - 0
scene/2d/physics/static_body_2d.cpp

@@ -30,6 +30,7 @@
 
 
 #include "static_body_2d.h"
 #include "static_body_2d.h"
 
 
+#ifndef NAVIGATION_2D_DISABLED
 #include "scene/resources/2d/capsule_shape_2d.h"
 #include "scene/resources/2d/capsule_shape_2d.h"
 #include "scene/resources/2d/circle_shape_2d.h"
 #include "scene/resources/2d/circle_shape_2d.h"
 #include "scene/resources/2d/concave_polygon_shape_2d.h"
 #include "scene/resources/2d/concave_polygon_shape_2d.h"
@@ -38,6 +39,7 @@
 #include "scene/resources/2d/navigation_polygon.h"
 #include "scene/resources/2d/navigation_polygon.h"
 #include "scene/resources/2d/rectangle_shape_2d.h"
 #include "scene/resources/2d/rectangle_shape_2d.h"
 #include "servers/navigation_server_2d.h"
 #include "servers/navigation_server_2d.h"
+#endif // NAVIGATION_2D_DISABLED
 
 
 Callable StaticBody2D::_navmesh_source_geometry_parsing_callback;
 Callable StaticBody2D::_navmesh_source_geometry_parsing_callback;
 RID StaticBody2D::_navmesh_source_geometry_parser;
 RID StaticBody2D::_navmesh_source_geometry_parser;
@@ -89,6 +91,7 @@ void StaticBody2D::_reload_physics_characteristics() {
 	}
 	}
 }
 }
 
 
+#ifndef NAVIGATION_2D_DISABLED
 void StaticBody2D::navmesh_parse_init() {
 void StaticBody2D::navmesh_parse_init() {
 	ERR_FAIL_NULL(NavigationServer2D::get_singleton());
 	ERR_FAIL_NULL(NavigationServer2D::get_singleton());
 	if (!_navmesh_source_geometry_parser.is_valid()) {
 	if (!_navmesh_source_geometry_parser.is_valid()) {
@@ -213,6 +216,7 @@ void StaticBody2D::navmesh_parse_source_geometry(const Ref<NavigationPolygon> &p
 		}
 		}
 	}
 	}
 }
 }
+#endif // NAVIGATION_2D_DISABLED
 
 
 void StaticBody2D::_bind_methods() {
 void StaticBody2D::_bind_methods() {
 	ClassDB::bind_method(D_METHOD("set_constant_linear_velocity", "vel"), &StaticBody2D::set_constant_linear_velocity);
 	ClassDB::bind_method(D_METHOD("set_constant_linear_velocity", "vel"), &StaticBody2D::set_constant_linear_velocity);

+ 2 - 0
scene/2d/physics/static_body_2d.h

@@ -63,9 +63,11 @@ private:
 	static Callable _navmesh_source_geometry_parsing_callback;
 	static Callable _navmesh_source_geometry_parsing_callback;
 	static RID _navmesh_source_geometry_parser;
 	static RID _navmesh_source_geometry_parser;
 
 
+#ifndef NAVIGATION_2D_DISABLED
 public:
 public:
 	static void navmesh_parse_init();
 	static void navmesh_parse_init();
 	static void navmesh_parse_source_geometry(const Ref<NavigationPolygon> &p_navigation_mesh, Ref<NavigationMeshSourceGeometryData2D> p_source_geometry_data, Node *p_node);
 	static void navmesh_parse_source_geometry(const Ref<NavigationPolygon> &p_navigation_mesh, Ref<NavigationMeshSourceGeometryData2D> p_source_geometry_data, Node *p_node);
+#endif // NAVIGATION_2D_DISABLED
 
 
 private:
 private:
 	void _reload_physics_characteristics();
 	void _reload_physics_characteristics();

+ 6 - 0
scene/2d/polygon_2d.cpp

@@ -31,13 +31,17 @@
 #include "polygon_2d.h"
 #include "polygon_2d.h"
 
 
 #include "core/math/geometry_2d.h"
 #include "core/math/geometry_2d.h"
+#ifndef NAVIGATION_2D_DISABLED
 #include "scene/resources/2d/navigation_mesh_source_geometry_data_2d.h"
 #include "scene/resources/2d/navigation_mesh_source_geometry_data_2d.h"
 #include "scene/resources/2d/navigation_polygon.h"
 #include "scene/resources/2d/navigation_polygon.h"
 #include "servers/navigation_server_2d.h"
 #include "servers/navigation_server_2d.h"
+#endif // NAVIGATION_2D_DISABLED
 #include "skeleton_2d.h"
 #include "skeleton_2d.h"
 
 
+#ifndef NAVIGATION_2D_DISABLED
 Callable Polygon2D::_navmesh_source_geometry_parsing_callback;
 Callable Polygon2D::_navmesh_source_geometry_parsing_callback;
 RID Polygon2D::_navmesh_source_geometry_parser;
 RID Polygon2D::_navmesh_source_geometry_parser;
+#endif // NAVIGATION_2D_DISABLED
 
 
 #ifdef TOOLS_ENABLED
 #ifdef TOOLS_ENABLED
 Dictionary Polygon2D::_edit_get_state() const {
 Dictionary Polygon2D::_edit_get_state() const {
@@ -610,6 +614,7 @@ NodePath Polygon2D::get_skeleton() const {
 	return skeleton;
 	return skeleton;
 }
 }
 
 
+#ifndef NAVIGATION_2D_DISABLED
 void Polygon2D::navmesh_parse_init() {
 void Polygon2D::navmesh_parse_init() {
 	ERR_FAIL_NULL(NavigationServer2D::get_singleton());
 	ERR_FAIL_NULL(NavigationServer2D::get_singleton());
 	if (!_navmesh_source_geometry_parser.is_valid()) {
 	if (!_navmesh_source_geometry_parser.is_valid()) {
@@ -639,6 +644,7 @@ void Polygon2D::navmesh_parse_source_geometry(const Ref<NavigationPolygon> &p_na
 		p_source_geometry_data->add_obstruction_outline(shape_outline);
 		p_source_geometry_data->add_obstruction_outline(shape_outline);
 	}
 	}
 }
 }
+#endif // NAVIGATION_2D_DISABLED
 
 
 void Polygon2D::_bind_methods() {
 void Polygon2D::_bind_methods() {
 	ClassDB::bind_method(D_METHOD("set_polygon", "polygon"), &Polygon2D::set_polygon);
 	ClassDB::bind_method(D_METHOD("set_polygon", "polygon"), &Polygon2D::set_polygon);

+ 4 - 0
scene/2d/polygon_2d.h

@@ -152,13 +152,17 @@ public:
 	void set_skeleton(const NodePath &p_skeleton);
 	void set_skeleton(const NodePath &p_skeleton);
 	NodePath get_skeleton() const;
 	NodePath get_skeleton() const;
 
 
+#ifndef NAVIGATION_2D_DISABLED
 private:
 private:
 	static Callable _navmesh_source_geometry_parsing_callback;
 	static Callable _navmesh_source_geometry_parsing_callback;
 	static RID _navmesh_source_geometry_parser;
 	static RID _navmesh_source_geometry_parser;
+#endif // NAVIGATION_2D_DISABLED
 
 
 public:
 public:
+#ifndef NAVIGATION_2D_DISABLED
 	static void navmesh_parse_init();
 	static void navmesh_parse_init();
 	static void navmesh_parse_source_geometry(const Ref<NavigationPolygon> &p_navigation_mesh, Ref<NavigationMeshSourceGeometryData2D> p_source_geometry_data, Node *p_node);
 	static void navmesh_parse_source_geometry(const Ref<NavigationPolygon> &p_navigation_mesh, Ref<NavigationMeshSourceGeometryData2D> p_source_geometry_data, Node *p_node);
+#endif // NAVIGATION_2D_DISABLED
 
 
 	Polygon2D();
 	Polygon2D();
 	~Polygon2D();
 	~Polygon2D();

+ 4 - 0
scene/2d/tile_map.compat.inc

@@ -46,16 +46,20 @@ TileMap::VisibilityMode TileMap::_get_collision_visibility_mode_bind_compat_8711
 	return get_collision_visibility_mode();
 	return get_collision_visibility_mode();
 }
 }
 
 
+#ifndef NAVIGATION_2D_DISABLED
 TileMap::VisibilityMode TileMap::_get_navigation_visibility_mode_bind_compat_87115() {
 TileMap::VisibilityMode TileMap::_get_navigation_visibility_mode_bind_compat_87115() {
 	return get_navigation_visibility_mode();
 	return get_navigation_visibility_mode();
 }
 }
+#endif // NAVIGATION_2D_DISABLED
 
 
 void TileMap::_bind_compatibility_methods() {
 void TileMap::_bind_compatibility_methods() {
 	ClassDB::bind_compatibility_method(D_METHOD("get_used_rect"), &TileMap::_get_used_rect_bind_compat_78328);
 	ClassDB::bind_compatibility_method(D_METHOD("get_used_rect"), &TileMap::_get_used_rect_bind_compat_78328);
 	ClassDB::bind_compatibility_method(D_METHOD("set_quadrant_size", "quadrant_size"), &TileMap::_set_quadrant_size_compat_81070);
 	ClassDB::bind_compatibility_method(D_METHOD("set_quadrant_size", "quadrant_size"), &TileMap::_set_quadrant_size_compat_81070);
 	ClassDB::bind_compatibility_method(D_METHOD("get_quadrant_size"), &TileMap::_get_quadrant_size_compat_81070);
 	ClassDB::bind_compatibility_method(D_METHOD("get_quadrant_size"), &TileMap::_get_quadrant_size_compat_81070);
 	ClassDB::bind_compatibility_method(D_METHOD("get_collision_visibility_mode"), &TileMap::_get_collision_visibility_mode_bind_compat_87115);
 	ClassDB::bind_compatibility_method(D_METHOD("get_collision_visibility_mode"), &TileMap::_get_collision_visibility_mode_bind_compat_87115);
+#ifndef NAVIGATION_2D_DISABLED
 	ClassDB::bind_compatibility_method(D_METHOD("get_navigation_visibility_mode"), &TileMap::_get_navigation_visibility_mode_bind_compat_87115);
 	ClassDB::bind_compatibility_method(D_METHOD("get_navigation_visibility_mode"), &TileMap::_get_navigation_visibility_mode_bind_compat_87115);
+#endif // NAVIGATION_2D_DISABLED
 }
 }
 
 
 #endif
 #endif

+ 20 - 0
scene/2d/tile_map.cpp

@@ -32,8 +32,10 @@
 #include "tile_map.compat.inc"
 #include "tile_map.compat.inc"
 
 
 #include "core/io/marshalls.h"
 #include "core/io/marshalls.h"
+#ifndef NAVIGATION_2D_DISABLED
 #include "scene/resources/2d/navigation_mesh_source_geometry_data_2d.h"
 #include "scene/resources/2d/navigation_mesh_source_geometry_data_2d.h"
 #include "servers/navigation_server_2d.h"
 #include "servers/navigation_server_2d.h"
+#endif // NAVIGATION_2D_DISABLED
 
 
 #define TILEMAP_CALL_FOR_LAYER(layer, function, ...) \
 #define TILEMAP_CALL_FOR_LAYER(layer, function, ...) \
 	if (layer < 0) {                                 \
 	if (layer < 0) {                                 \
@@ -49,8 +51,10 @@
 	ERR_FAIL_INDEX_V(layer, (int)layers.size(), err_value);       \
 	ERR_FAIL_INDEX_V(layer, (int)layers.size(), err_value);       \
 	return layers[layer]->function(__VA_ARGS__);
 	return layers[layer]->function(__VA_ARGS__);
 
 
+#ifndef NAVIGATION_2D_DISABLED
 Callable TileMap::_navmesh_source_geometry_parsing_callback;
 Callable TileMap::_navmesh_source_geometry_parsing_callback;
 RID TileMap::_navmesh_source_geometry_parser;
 RID TileMap::_navmesh_source_geometry_parser;
+#endif // NAVIGATION_2D_DISABLED
 
 
 void TileMap::_tile_set_changed() {
 void TileMap::_tile_set_changed() {
 	update_configuration_warnings();
 	update_configuration_warnings();
@@ -376,6 +380,7 @@ int TileMap::get_layer_z_index(int p_layer) const {
 	TILEMAP_CALL_FOR_LAYER_V(p_layer, 0, get_z_index);
 	TILEMAP_CALL_FOR_LAYER_V(p_layer, 0, get_z_index);
 }
 }
 
 
+#ifndef NAVIGATION_2D_DISABLED
 void TileMap::set_layer_navigation_enabled(int p_layer, bool p_enabled) {
 void TileMap::set_layer_navigation_enabled(int p_layer, bool p_enabled) {
 	TILEMAP_CALL_FOR_LAYER(p_layer, set_navigation_enabled, p_enabled);
 	TILEMAP_CALL_FOR_LAYER(p_layer, set_navigation_enabled, p_enabled);
 }
 }
@@ -391,6 +396,7 @@ void TileMap::set_layer_navigation_map(int p_layer, RID p_map) {
 RID TileMap::get_layer_navigation_map(int p_layer) const {
 RID TileMap::get_layer_navigation_map(int p_layer) const {
 	TILEMAP_CALL_FOR_LAYER_V(p_layer, RID(), get_navigation_map);
 	TILEMAP_CALL_FOR_LAYER_V(p_layer, RID(), get_navigation_map);
 }
 }
+#endif // NAVIGATION_2D_DISABLED
 
 
 void TileMap::set_collision_animatable(bool p_collision_animatable) {
 void TileMap::set_collision_animatable(bool p_collision_animatable) {
 	if (collision_animatable == p_collision_animatable) {
 	if (collision_animatable == p_collision_animatable) {
@@ -423,6 +429,7 @@ TileMap::VisibilityMode TileMap::get_collision_visibility_mode() const {
 	return collision_visibility_mode;
 	return collision_visibility_mode;
 }
 }
 
 
+#ifndef NAVIGATION_2D_DISABLED
 void TileMap::set_navigation_visibility_mode(TileMap::VisibilityMode p_show_navigation) {
 void TileMap::set_navigation_visibility_mode(TileMap::VisibilityMode p_show_navigation) {
 	if (navigation_visibility_mode == p_show_navigation) {
 	if (navigation_visibility_mode == p_show_navigation) {
 		return;
 		return;
@@ -437,6 +444,7 @@ void TileMap::set_navigation_visibility_mode(TileMap::VisibilityMode p_show_navi
 TileMap::VisibilityMode TileMap::get_navigation_visibility_mode() const {
 TileMap::VisibilityMode TileMap::get_navigation_visibility_mode() const {
 	return navigation_visibility_mode;
 	return navigation_visibility_mode;
 }
 }
+#endif // NAVIGATION_2D_DISABLED
 
 
 void TileMap::set_y_sort_enabled(bool p_enable) {
 void TileMap::set_y_sort_enabled(bool p_enable) {
 	if (is_y_sort_enabled() == p_enable) {
 	if (is_y_sort_enabled() == p_enable) {
@@ -898,8 +906,10 @@ PackedStringArray TileMap::get_configuration_warnings() const {
 
 
 void TileMap::_bind_methods() {
 void TileMap::_bind_methods() {
 #ifndef DISABLE_DEPRECATED
 #ifndef DISABLE_DEPRECATED
+#ifndef NAVIGATION_2D_DISABLED
 	ClassDB::bind_method(D_METHOD("set_navigation_map", "layer", "map"), &TileMap::set_layer_navigation_map);
 	ClassDB::bind_method(D_METHOD("set_navigation_map", "layer", "map"), &TileMap::set_layer_navigation_map);
 	ClassDB::bind_method(D_METHOD("get_navigation_map", "layer"), &TileMap::get_layer_navigation_map);
 	ClassDB::bind_method(D_METHOD("get_navigation_map", "layer"), &TileMap::get_layer_navigation_map);
+#endif // NAVIGATION_2D_DISABLED
 	ClassDB::bind_method(D_METHOD("force_update", "layer"), &TileMap::force_update, DEFVAL(-1));
 	ClassDB::bind_method(D_METHOD("force_update", "layer"), &TileMap::force_update, DEFVAL(-1));
 #endif // DISABLE_DEPRECATED
 #endif // DISABLE_DEPRECATED
 
 
@@ -925,18 +935,22 @@ void TileMap::_bind_methods() {
 	ClassDB::bind_method(D_METHOD("get_layer_y_sort_origin", "layer"), &TileMap::get_layer_y_sort_origin);
 	ClassDB::bind_method(D_METHOD("get_layer_y_sort_origin", "layer"), &TileMap::get_layer_y_sort_origin);
 	ClassDB::bind_method(D_METHOD("set_layer_z_index", "layer", "z_index"), &TileMap::set_layer_z_index);
 	ClassDB::bind_method(D_METHOD("set_layer_z_index", "layer", "z_index"), &TileMap::set_layer_z_index);
 	ClassDB::bind_method(D_METHOD("get_layer_z_index", "layer"), &TileMap::get_layer_z_index);
 	ClassDB::bind_method(D_METHOD("get_layer_z_index", "layer"), &TileMap::get_layer_z_index);
+#ifndef NAVIGATION_2D_DISABLED
 	ClassDB::bind_method(D_METHOD("set_layer_navigation_enabled", "layer", "enabled"), &TileMap::set_layer_navigation_enabled);
 	ClassDB::bind_method(D_METHOD("set_layer_navigation_enabled", "layer", "enabled"), &TileMap::set_layer_navigation_enabled);
 	ClassDB::bind_method(D_METHOD("is_layer_navigation_enabled", "layer"), &TileMap::is_layer_navigation_enabled);
 	ClassDB::bind_method(D_METHOD("is_layer_navigation_enabled", "layer"), &TileMap::is_layer_navigation_enabled);
 	ClassDB::bind_method(D_METHOD("set_layer_navigation_map", "layer", "map"), &TileMap::set_layer_navigation_map);
 	ClassDB::bind_method(D_METHOD("set_layer_navigation_map", "layer", "map"), &TileMap::set_layer_navigation_map);
 	ClassDB::bind_method(D_METHOD("get_layer_navigation_map", "layer"), &TileMap::get_layer_navigation_map);
 	ClassDB::bind_method(D_METHOD("get_layer_navigation_map", "layer"), &TileMap::get_layer_navigation_map);
+#endif // NAVIGATION_2D_DISABLED
 
 
 	ClassDB::bind_method(D_METHOD("set_collision_animatable", "enabled"), &TileMap::set_collision_animatable);
 	ClassDB::bind_method(D_METHOD("set_collision_animatable", "enabled"), &TileMap::set_collision_animatable);
 	ClassDB::bind_method(D_METHOD("is_collision_animatable"), &TileMap::is_collision_animatable);
 	ClassDB::bind_method(D_METHOD("is_collision_animatable"), &TileMap::is_collision_animatable);
 	ClassDB::bind_method(D_METHOD("set_collision_visibility_mode", "collision_visibility_mode"), &TileMap::set_collision_visibility_mode);
 	ClassDB::bind_method(D_METHOD("set_collision_visibility_mode", "collision_visibility_mode"), &TileMap::set_collision_visibility_mode);
 	ClassDB::bind_method(D_METHOD("get_collision_visibility_mode"), &TileMap::get_collision_visibility_mode);
 	ClassDB::bind_method(D_METHOD("get_collision_visibility_mode"), &TileMap::get_collision_visibility_mode);
 
 
+#ifndef NAVIGATION_2D_DISABLED
 	ClassDB::bind_method(D_METHOD("set_navigation_visibility_mode", "navigation_visibility_mode"), &TileMap::set_navigation_visibility_mode);
 	ClassDB::bind_method(D_METHOD("set_navigation_visibility_mode", "navigation_visibility_mode"), &TileMap::set_navigation_visibility_mode);
 	ClassDB::bind_method(D_METHOD("get_navigation_visibility_mode"), &TileMap::get_navigation_visibility_mode);
 	ClassDB::bind_method(D_METHOD("get_navigation_visibility_mode"), &TileMap::get_navigation_visibility_mode);
+#endif // NAVIGATION_2D_DISABLED
 
 
 	ClassDB::bind_method(D_METHOD("set_cell", "layer", "coords", "source_id", "atlas_coords", "alternative_tile"), &TileMap::set_cell, DEFVAL(TileSet::INVALID_SOURCE), DEFVAL(TileSetSource::INVALID_ATLAS_COORDS), DEFVAL(0));
 	ClassDB::bind_method(D_METHOD("set_cell", "layer", "coords", "source_id", "atlas_coords", "alternative_tile"), &TileMap::set_cell, DEFVAL(TileSet::INVALID_SOURCE), DEFVAL(TileSetSource::INVALID_ATLAS_COORDS), DEFVAL(0));
 	ClassDB::bind_method(D_METHOD("erase_cell", "layer", "coords"), &TileMap::erase_cell);
 	ClassDB::bind_method(D_METHOD("erase_cell", "layer", "coords"), &TileMap::erase_cell);
@@ -986,7 +1000,9 @@ void TileMap::_bind_methods() {
 	ADD_PROPERTY(PropertyInfo(Variant::INT, "rendering_quadrant_size", PROPERTY_HINT_RANGE, "1,128,1"), "set_rendering_quadrant_size", "get_rendering_quadrant_size");
 	ADD_PROPERTY(PropertyInfo(Variant::INT, "rendering_quadrant_size", PROPERTY_HINT_RANGE, "1,128,1"), "set_rendering_quadrant_size", "get_rendering_quadrant_size");
 	ADD_PROPERTY(PropertyInfo(Variant::BOOL, "collision_animatable"), "set_collision_animatable", "is_collision_animatable");
 	ADD_PROPERTY(PropertyInfo(Variant::BOOL, "collision_animatable"), "set_collision_animatable", "is_collision_animatable");
 	ADD_PROPERTY(PropertyInfo(Variant::INT, "collision_visibility_mode", PROPERTY_HINT_ENUM, "Default,Force Show,Force Hide"), "set_collision_visibility_mode", "get_collision_visibility_mode");
 	ADD_PROPERTY(PropertyInfo(Variant::INT, "collision_visibility_mode", PROPERTY_HINT_ENUM, "Default,Force Show,Force Hide"), "set_collision_visibility_mode", "get_collision_visibility_mode");
+#ifndef NAVIGATION_2D_DISABLED
 	ADD_PROPERTY(PropertyInfo(Variant::INT, "navigation_visibility_mode", PROPERTY_HINT_ENUM, "Default,Force Show,Force Hide"), "set_navigation_visibility_mode", "get_navigation_visibility_mode");
 	ADD_PROPERTY(PropertyInfo(Variant::INT, "navigation_visibility_mode", PROPERTY_HINT_ENUM, "Default,Force Show,Force Hide"), "set_navigation_visibility_mode", "get_navigation_visibility_mode");
+#endif // NAVIGATION_2D_DISABLED
 
 
 	ADD_ARRAY("layers", "layer_");
 	ADD_ARRAY("layers", "layer_");
 
 
@@ -1021,7 +1037,9 @@ TileMap::TileMap() {
 		base_property_helper.register_property(PropertyInfo(Variant::BOOL, "y_sort_enabled"), defaults->is_y_sort_enabled(), &TileMap::set_layer_y_sort_enabled, &TileMap::is_layer_y_sort_enabled);
 		base_property_helper.register_property(PropertyInfo(Variant::BOOL, "y_sort_enabled"), defaults->is_y_sort_enabled(), &TileMap::set_layer_y_sort_enabled, &TileMap::is_layer_y_sort_enabled);
 		base_property_helper.register_property(PropertyInfo(Variant::INT, "y_sort_origin", PROPERTY_HINT_NONE, "suffix:px"), defaults->get_y_sort_origin(), &TileMap::set_layer_y_sort_origin, &TileMap::get_layer_y_sort_origin);
 		base_property_helper.register_property(PropertyInfo(Variant::INT, "y_sort_origin", PROPERTY_HINT_NONE, "suffix:px"), defaults->get_y_sort_origin(), &TileMap::set_layer_y_sort_origin, &TileMap::get_layer_y_sort_origin);
 		base_property_helper.register_property(PropertyInfo(Variant::INT, "z_index"), defaults->get_z_index(), &TileMap::set_layer_z_index, &TileMap::get_layer_z_index);
 		base_property_helper.register_property(PropertyInfo(Variant::INT, "z_index"), defaults->get_z_index(), &TileMap::set_layer_z_index, &TileMap::get_layer_z_index);
+#ifndef NAVIGATION_2D_DISABLED
 		base_property_helper.register_property(PropertyInfo(Variant::BOOL, "navigation_enabled"), defaults->is_navigation_enabled(), &TileMap::set_layer_navigation_enabled, &TileMap::is_layer_navigation_enabled);
 		base_property_helper.register_property(PropertyInfo(Variant::BOOL, "navigation_enabled"), defaults->is_navigation_enabled(), &TileMap::set_layer_navigation_enabled, &TileMap::is_layer_navigation_enabled);
+#endif // NAVIGATION_2D_DISABLED
 		base_property_helper.register_property(PropertyInfo(Variant::PACKED_INT32_ARRAY, "tile_data", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NO_EDITOR), Vector<int>(), &TileMap::_set_layer_tile_data, &TileMap::_get_tile_map_data_using_compatibility_format);
 		base_property_helper.register_property(PropertyInfo(Variant::PACKED_INT32_ARRAY, "tile_data", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NO_EDITOR), Vector<int>(), &TileMap::_set_layer_tile_data, &TileMap::_get_tile_map_data_using_compatibility_format);
 		PropertyListHelper::register_base_helper(&base_property_helper);
 		PropertyListHelper::register_base_helper(&base_property_helper);
 
 
@@ -1031,6 +1049,7 @@ TileMap::TileMap() {
 	property_helper.setup_for_instance(base_property_helper, this);
 	property_helper.setup_for_instance(base_property_helper, this);
 }
 }
 
 
+#ifndef NAVIGATION_2D_DISABLED
 void TileMap::navmesh_parse_init() {
 void TileMap::navmesh_parse_init() {
 	ERR_FAIL_NULL(NavigationServer2D::get_singleton());
 	ERR_FAIL_NULL(NavigationServer2D::get_singleton());
 	if (!_navmesh_source_geometry_parser.is_valid()) {
 	if (!_navmesh_source_geometry_parser.is_valid()) {
@@ -1058,6 +1077,7 @@ void TileMap::navmesh_parse_source_geometry(const Ref<NavigationPolygon> &p_navi
 		}
 		}
 	}
 	}
 }
 }
+#endif // NAVIGATION_2D_DISABLED
 
 
 #undef TILEMAP_CALL_FOR_LAYER
 #undef TILEMAP_CALL_FOR_LAYER
 #undef TILEMAP_CALL_FOR_LAYER_V
 #undef TILEMAP_CALL_FOR_LAYER_V

+ 14 - 2
scene/2d/tile_map.h

@@ -35,7 +35,9 @@
 #include "scene/resources/2d/tile_set.h"
 #include "scene/resources/2d/tile_set.h"
 
 
 class Control;
 class Control;
+#ifndef NAVIGATION_2D_DISABLED
 class NavigationMeshSourceGeometryData2D;
 class NavigationMeshSourceGeometryData2D;
+#endif // NAVIGATION_2D_DISABLED
 class TileMapLayer;
 class TileMapLayer;
 class TerrainConstraint;
 class TerrainConstraint;
 
 
@@ -58,8 +60,6 @@ public:
 	};
 	};
 
 
 private:
 private:
-	friend class TileSetPlugin;
-
 	// A compatibility enum to specify how is the data if formatted.
 	// A compatibility enum to specify how is the data if formatted.
 	mutable TileMapDataFormat format = TileMapDataFormat::TILE_MAP_DATA_FORMAT_3;
 	mutable TileMapDataFormat format = TileMapDataFormat::TILE_MAP_DATA_FORMAT_3;
 
 
@@ -68,7 +68,9 @@ private:
 	int rendering_quadrant_size = 16;
 	int rendering_quadrant_size = 16;
 	bool collision_animatable = false;
 	bool collision_animatable = false;
 	VisibilityMode collision_visibility_mode = VISIBILITY_MODE_DEFAULT;
 	VisibilityMode collision_visibility_mode = VISIBILITY_MODE_DEFAULT;
+#ifndef NAVIGATION_2D_DISABLED
 	VisibilityMode navigation_visibility_mode = VISIBILITY_MODE_DEFAULT;
 	VisibilityMode navigation_visibility_mode = VISIBILITY_MODE_DEFAULT;
+#endif // NAVIGATION_2D_DISABLED
 
 
 	// Layers.
 	// Layers.
 	LocalVector<TileMapLayer *> layers;
 	LocalVector<TileMapLayer *> layers;
@@ -104,7 +106,9 @@ protected:
 	void _set_quadrant_size_compat_81070(int p_quadrant_size);
 	void _set_quadrant_size_compat_81070(int p_quadrant_size);
 	int _get_quadrant_size_compat_81070() const;
 	int _get_quadrant_size_compat_81070() const;
 	VisibilityMode _get_collision_visibility_mode_bind_compat_87115();
 	VisibilityMode _get_collision_visibility_mode_bind_compat_87115();
+#ifndef NAVIGATION_2D_DISABLED
 	VisibilityMode _get_navigation_visibility_mode_bind_compat_87115();
 	VisibilityMode _get_navigation_visibility_mode_bind_compat_87115();
+#endif // NAVIGATION_2D_DISABLED
 
 
 	static void _bind_compatibility_methods();
 	static void _bind_compatibility_methods();
 #endif // DISABLE_DEPRECATED
 #endif // DISABLE_DEPRECATED
@@ -143,10 +147,12 @@ public:
 	int get_layer_y_sort_origin(int p_layer) const;
 	int get_layer_y_sort_origin(int p_layer) const;
 	void set_layer_z_index(int p_layer, int p_z_index);
 	void set_layer_z_index(int p_layer, int p_z_index);
 	int get_layer_z_index(int p_layer) const;
 	int get_layer_z_index(int p_layer) const;
+#ifndef NAVIGATION_2D_DISABLED
 	void set_layer_navigation_enabled(int p_layer, bool p_enabled);
 	void set_layer_navigation_enabled(int p_layer, bool p_enabled);
 	bool is_layer_navigation_enabled(int p_layer) const;
 	bool is_layer_navigation_enabled(int p_layer) const;
 	void set_layer_navigation_map(int p_layer, RID p_map);
 	void set_layer_navigation_map(int p_layer, RID p_map);
 	RID get_layer_navigation_map(int p_layer) const;
 	RID get_layer_navigation_map(int p_layer) const;
+#endif // NAVIGATION_2D_DISABLED
 
 
 	void set_collision_animatable(bool p_collision_animatable);
 	void set_collision_animatable(bool p_collision_animatable);
 	bool is_collision_animatable() const;
 	bool is_collision_animatable() const;
@@ -155,8 +161,10 @@ public:
 	void set_collision_visibility_mode(VisibilityMode p_show_collision);
 	void set_collision_visibility_mode(VisibilityMode p_show_collision);
 	VisibilityMode get_collision_visibility_mode() const;
 	VisibilityMode get_collision_visibility_mode() const;
 
 
+#ifndef NAVIGATION_2D_DISABLED
 	void set_navigation_visibility_mode(VisibilityMode p_show_navigation);
 	void set_navigation_visibility_mode(VisibilityMode p_show_navigation);
 	VisibilityMode get_navigation_visibility_mode() const;
 	VisibilityMode get_navigation_visibility_mode() const;
+#endif // NAVIGATION_2D_DISABLED
 
 
 	// Cells accessors.
 	// Cells accessors.
 	void set_cell(int p_layer, const Vector2i &p_coords, int p_source_id = TileSet::INVALID_SOURCE, const Vector2i p_atlas_coords = TileSetSource::INVALID_ATLAS_COORDS, int p_alternative_tile = 0);
 	void set_cell(int p_layer, const Vector2i &p_coords, int p_source_id = TileSet::INVALID_SOURCE, const Vector2i p_atlas_coords = TileSetSource::INVALID_ATLAS_COORDS, int p_alternative_tile = 0);
@@ -240,13 +248,17 @@ public:
 	// Configuration warnings.
 	// Configuration warnings.
 	PackedStringArray get_configuration_warnings() const override;
 	PackedStringArray get_configuration_warnings() const override;
 
 
+#ifndef NAVIGATION_2D_DISABLED
 private:
 private:
 	static Callable _navmesh_source_geometry_parsing_callback;
 	static Callable _navmesh_source_geometry_parsing_callback;
 	static RID _navmesh_source_geometry_parser;
 	static RID _navmesh_source_geometry_parser;
+#endif // NAVIGATION_2D_DISABLED
 
 
+#ifndef NAVIGATION_2D_DISABLED
 public:
 public:
 	static void navmesh_parse_init();
 	static void navmesh_parse_init();
 	static void navmesh_parse_source_geometry(const Ref<NavigationPolygon> &p_navigation_mesh, Ref<NavigationMeshSourceGeometryData2D> p_source_geometry_data, Node *p_node);
 	static void navmesh_parse_source_geometry(const Ref<NavigationPolygon> &p_navigation_mesh, Ref<NavigationMeshSourceGeometryData2D> p_source_geometry_data, Node *p_node);
+#endif // NAVIGATION_2D_DISABLED
 
 
 	TileMap();
 	TileMap();
 };
 };

+ 17 - 1
scene/2d/tile_map_layer.cpp

@@ -37,14 +37,16 @@
 #include "scene/gui/control.h"
 #include "scene/gui/control.h"
 #include "scene/resources/2d/navigation_mesh_source_geometry_data_2d.h"
 #include "scene/resources/2d/navigation_mesh_source_geometry_data_2d.h"
 #include "scene/resources/world_2d.h"
 #include "scene/resources/world_2d.h"
-#include "servers/navigation_server_2d.h"
 
 
 #ifndef PHYSICS_2D_DISABLED
 #ifndef PHYSICS_2D_DISABLED
 #include "servers/physics_server_2d.h"
 #include "servers/physics_server_2d.h"
 #endif // PHYSICS_3D_DISABLED
 #endif // PHYSICS_3D_DISABLED
 
 
+#ifndef NAVIGATION_2D_DISABLED
+#include "servers/navigation_server_2d.h"
 Callable TileMapLayer::_navmesh_source_geometry_parsing_callback;
 Callable TileMapLayer::_navmesh_source_geometry_parsing_callback;
 RID TileMapLayer::_navmesh_source_geometry_parser;
 RID TileMapLayer::_navmesh_source_geometry_parser;
+#endif // NAVIGATION_2D_DISABLED
 
 
 Vector2i TileMapLayer::_coords_to_quadrant_coords(const Vector2i &p_coords, const int p_quadrant_size) const {
 Vector2i TileMapLayer::_coords_to_quadrant_coords(const Vector2i &p_coords, const int p_quadrant_size) const {
 	return Vector2i(
 	return Vector2i(
@@ -149,7 +151,9 @@ void TileMapLayer::_debug_update(bool p_force_cleanup) {
 			CellData &cell_data = *cell_data_list_element->self();
 			CellData &cell_data = *cell_data_list_element->self();
 			if (cell_data.cell.source_id != TileSet::INVALID_SOURCE) {
 			if (cell_data.cell.source_id != TileSet::INVALID_SOURCE) {
 				_rendering_draw_cell_debug(ci, quadrant_pos, cell_data);
 				_rendering_draw_cell_debug(ci, quadrant_pos, cell_data);
+#ifndef NAVIGATION_2D_DISABLED
 				_navigation_draw_cell_debug(ci, quadrant_pos, cell_data);
 				_navigation_draw_cell_debug(ci, quadrant_pos, cell_data);
+#endif // NAVIGATION_2D_DISABLED
 				_scenes_draw_cell_debug(ci, quadrant_pos, cell_data);
 				_scenes_draw_cell_debug(ci, quadrant_pos, cell_data);
 				debug_quadrant->drawn_to = true;
 				debug_quadrant->drawn_to = true;
 			}
 			}
@@ -1138,6 +1142,7 @@ void TileMapLayer::_physics_draw_quadrant_debug(const RID &p_canvas_item, DebugQ
 #endif // DEBUG_ENABLED
 #endif // DEBUG_ENABLED
 #endif // PHYSICS_2D_DISABLED
 #endif // PHYSICS_2D_DISABLED
 
 
+#ifndef NAVIGATION_2D_DISABLED
 /////////////////////////////// Navigation //////////////////////////////////////
 /////////////////////////////// Navigation //////////////////////////////////////
 
 
 void TileMapLayer::_navigation_update(bool p_force_cleanup) {
 void TileMapLayer::_navigation_update(bool p_force_cleanup) {
@@ -1410,6 +1415,7 @@ void TileMapLayer::_navigation_draw_cell_debug(const RID &p_canvas_item, const V
 	}
 	}
 }
 }
 #endif // DEBUG_ENABLED
 #endif // DEBUG_ENABLED
+#endif // NAVIGATION_2D_DISABLED
 
 
 /////////////////////////////// Scenes //////////////////////////////////////
 /////////////////////////////// Scenes //////////////////////////////////////
 
 
@@ -1885,7 +1891,9 @@ void TileMapLayer::_internal_update(bool p_force_cleanup) {
 #ifndef PHYSICS_2D_DISABLED
 #ifndef PHYSICS_2D_DISABLED
 	_physics_update(p_force_cleanup);
 	_physics_update(p_force_cleanup);
 #endif // PHYSICS_2D_DISABLED
 #endif // PHYSICS_2D_DISABLED
+#ifndef NAVIGATION_2D_DISABLED
 	_navigation_update(p_force_cleanup);
 	_navigation_update(p_force_cleanup);
+#endif // NAVIGATION_2D_DISABLED
 	_scenes_update(p_force_cleanup);
 	_scenes_update(p_force_cleanup);
 #ifdef DEBUG_ENABLED
 #ifdef DEBUG_ENABLED
 	_debug_update(p_force_cleanup);
 	_debug_update(p_force_cleanup);
@@ -1989,7 +1997,9 @@ void TileMapLayer::_notification(int p_what) {
 #ifndef PHYSICS_2D_DISABLED
 #ifndef PHYSICS_2D_DISABLED
 	_physics_notification(p_what);
 	_physics_notification(p_what);
 #endif // PHYSICS_2D_DISABLED
 #endif // PHYSICS_2D_DISABLED
+#ifndef NAVIGATION_2D_DISABLED
 	_navigation_notification(p_what);
 	_navigation_notification(p_what);
+#endif // NAVIGATION_2D_DISABLED
 }
 }
 
 
 void TileMapLayer::_bind_methods() {
 void TileMapLayer::_bind_methods() {
@@ -2067,12 +2077,14 @@ void TileMapLayer::_bind_methods() {
 	ClassDB::bind_method(D_METHOD("set_occlusion_enabled", "enabled"), &TileMapLayer::set_occlusion_enabled);
 	ClassDB::bind_method(D_METHOD("set_occlusion_enabled", "enabled"), &TileMapLayer::set_occlusion_enabled);
 	ClassDB::bind_method(D_METHOD("is_occlusion_enabled"), &TileMapLayer::is_occlusion_enabled);
 	ClassDB::bind_method(D_METHOD("is_occlusion_enabled"), &TileMapLayer::is_occlusion_enabled);
 
 
+#ifndef NAVIGATION_2D_DISABLED
 	ClassDB::bind_method(D_METHOD("set_navigation_enabled", "enabled"), &TileMapLayer::set_navigation_enabled);
 	ClassDB::bind_method(D_METHOD("set_navigation_enabled", "enabled"), &TileMapLayer::set_navigation_enabled);
 	ClassDB::bind_method(D_METHOD("is_navigation_enabled"), &TileMapLayer::is_navigation_enabled);
 	ClassDB::bind_method(D_METHOD("is_navigation_enabled"), &TileMapLayer::is_navigation_enabled);
 	ClassDB::bind_method(D_METHOD("set_navigation_map", "map"), &TileMapLayer::set_navigation_map);
 	ClassDB::bind_method(D_METHOD("set_navigation_map", "map"), &TileMapLayer::set_navigation_map);
 	ClassDB::bind_method(D_METHOD("get_navigation_map"), &TileMapLayer::get_navigation_map);
 	ClassDB::bind_method(D_METHOD("get_navigation_map"), &TileMapLayer::get_navigation_map);
 	ClassDB::bind_method(D_METHOD("set_navigation_visibility_mode", "show_navigation"), &TileMapLayer::set_navigation_visibility_mode);
 	ClassDB::bind_method(D_METHOD("set_navigation_visibility_mode", "show_navigation"), &TileMapLayer::set_navigation_visibility_mode);
 	ClassDB::bind_method(D_METHOD("get_navigation_visibility_mode"), &TileMapLayer::get_navigation_visibility_mode);
 	ClassDB::bind_method(D_METHOD("get_navigation_visibility_mode"), &TileMapLayer::get_navigation_visibility_mode);
+#endif // NAVIGATION_2D_DISABLED
 
 
 	GDVIRTUAL_BIND(_use_tile_data_runtime_update, "coords");
 	GDVIRTUAL_BIND(_use_tile_data_runtime_update, "coords");
 	GDVIRTUAL_BIND(_tile_data_runtime_update, "coords", "tile_data");
 	GDVIRTUAL_BIND(_tile_data_runtime_update, "coords", "tile_data");
@@ -2092,9 +2104,11 @@ void TileMapLayer::_bind_methods() {
 	ADD_PROPERTY(PropertyInfo(Variant::BOOL, "use_kinematic_bodies"), "set_use_kinematic_bodies", "is_using_kinematic_bodies");
 	ADD_PROPERTY(PropertyInfo(Variant::BOOL, "use_kinematic_bodies"), "set_use_kinematic_bodies", "is_using_kinematic_bodies");
 	ADD_PROPERTY(PropertyInfo(Variant::INT, "collision_visibility_mode", PROPERTY_HINT_ENUM, "Default,Force Show,Force Hide"), "set_collision_visibility_mode", "get_collision_visibility_mode");
 	ADD_PROPERTY(PropertyInfo(Variant::INT, "collision_visibility_mode", PROPERTY_HINT_ENUM, "Default,Force Show,Force Hide"), "set_collision_visibility_mode", "get_collision_visibility_mode");
 	ADD_PROPERTY(PropertyInfo(Variant::INT, "physics_quadrant_size"), "set_physics_quadrant_size", "get_physics_quadrant_size");
 	ADD_PROPERTY(PropertyInfo(Variant::INT, "physics_quadrant_size"), "set_physics_quadrant_size", "get_physics_quadrant_size");
+#ifndef NAVIGATION_2D_DISABLED
 	ADD_GROUP("Navigation", "");
 	ADD_GROUP("Navigation", "");
 	ADD_PROPERTY(PropertyInfo(Variant::BOOL, "navigation_enabled"), "set_navigation_enabled", "is_navigation_enabled");
 	ADD_PROPERTY(PropertyInfo(Variant::BOOL, "navigation_enabled"), "set_navigation_enabled", "is_navigation_enabled");
 	ADD_PROPERTY(PropertyInfo(Variant::INT, "navigation_visibility_mode", PROPERTY_HINT_ENUM, "Default,Force Show,Force Hide"), "set_navigation_visibility_mode", "get_navigation_visibility_mode");
 	ADD_PROPERTY(PropertyInfo(Variant::INT, "navigation_visibility_mode", PROPERTY_HINT_ENUM, "Default,Force Show,Force Hide"), "set_navigation_visibility_mode", "get_navigation_visibility_mode");
+#endif // NAVIGATION_2D_DISABLED
 
 
 	ADD_SIGNAL(MethodInfo(CoreStringName(changed)));
 	ADD_SIGNAL(MethodInfo(CoreStringName(changed)));
 
 
@@ -3233,6 +3247,7 @@ bool TileMapLayer::is_occlusion_enabled() const {
 	return occlusion_enabled;
 	return occlusion_enabled;
 }
 }
 
 
+#ifndef NAVIGATION_2D_DISABLED
 void TileMapLayer::set_navigation_enabled(bool p_enabled) {
 void TileMapLayer::set_navigation_enabled(bool p_enabled) {
 	if (navigation_enabled == p_enabled) {
 	if (navigation_enabled == p_enabled) {
 		return;
 		return;
@@ -3395,6 +3410,7 @@ void TileMapLayer::navmesh_parse_source_geometry(const Ref<NavigationPolygon> &p
 #endif // PHYSICS_2D_DISABLED
 #endif // PHYSICS_2D_DISABLED
 	}
 	}
 }
 }
+#endif // NAVIGATION_2D_DISABLED
 
 
 TileMapLayer::TileMapLayer() {
 TileMapLayer::TileMapLayer() {
 	set_notify_transform(true);
 	set_notify_transform(true);

+ 8 - 0
scene/2d/tile_map_layer.h

@@ -32,7 +32,9 @@
 
 
 #include "scene/resources/2d/tile_set.h"
 #include "scene/resources/2d/tile_set.h"
 
 
+#ifndef NAVIGATION_2D_DISABLED
 class NavigationMeshSourceGeometryData2D;
 class NavigationMeshSourceGeometryData2D;
+#endif // NAVIGATION_2D_DISABLED
 class TileSetAtlasSource;
 class TileSetAtlasSource;
 class TileMap;
 class TileMap;
 
 
@@ -454,6 +456,7 @@ private:
 #endif // DEBUG_ENABLED
 #endif // DEBUG_ENABLED
 #endif // PHYSICS_2D_DISABLED
 #endif // PHYSICS_2D_DISABLED
 
 
+#ifndef NAVIGATION_2D_DISABLED
 	bool _navigation_was_cleaned_up = false;
 	bool _navigation_was_cleaned_up = false;
 	void _navigation_update(bool p_force_cleanup);
 	void _navigation_update(bool p_force_cleanup);
 	void _navigation_notification(int p_what);
 	void _navigation_notification(int p_what);
@@ -462,6 +465,7 @@ private:
 #ifdef DEBUG_ENABLED
 #ifdef DEBUG_ENABLED
 	void _navigation_draw_cell_debug(const RID &p_canvas_item, const Vector2 &p_quadrant_pos, const CellData &r_cell_data);
 	void _navigation_draw_cell_debug(const RID &p_canvas_item, const Vector2 &p_quadrant_pos, const CellData &r_cell_data);
 #endif // DEBUG_ENABLED
 #endif // DEBUG_ENABLED
+#endif // NAVIGATION_2D_DISABLED
 
 
 	bool _scenes_was_cleaned_up = false;
 	bool _scenes_was_cleaned_up = false;
 	void _scenes_update(bool p_force_cleanup);
 	void _scenes_update(bool p_force_cleanup);
@@ -618,12 +622,16 @@ public:
 	DebugVisibilityMode get_navigation_visibility_mode() const;
 	DebugVisibilityMode get_navigation_visibility_mode() const;
 
 
 private:
 private:
+#ifndef NAVIGATION_2D_DISABLED
 	static Callable _navmesh_source_geometry_parsing_callback;
 	static Callable _navmesh_source_geometry_parsing_callback;
 	static RID _navmesh_source_geometry_parser;
 	static RID _navmesh_source_geometry_parser;
+#endif // NAVIGATION_2D_DISABLED
 
 
 public:
 public:
+#ifndef NAVIGATION_2D_DISABLED
 	static void navmesh_parse_init();
 	static void navmesh_parse_init();
 	static void navmesh_parse_source_geometry(const Ref<NavigationPolygon> &p_navigation_mesh, Ref<NavigationMeshSourceGeometryData2D> p_source_geometry_data, Node *p_node);
 	static void navmesh_parse_source_geometry(const Ref<NavigationPolygon> &p_navigation_mesh, Ref<NavigationMeshSourceGeometryData2D> p_source_geometry_data, Node *p_node);
+#endif // NAVIGATION_2D_DISABLED
 
 
 	TileMapLayer();
 	TileMapLayer();
 	~TileMapLayer();
 	~TileMapLayer();

+ 2 - 0
scene/3d/SCsub

@@ -8,5 +8,7 @@ env.add_source_files(env.scene_sources, "*.cpp")
 # Chain load SCsubs
 # Chain load SCsubs
 if not env["disable_physics_3d"]:
 if not env["disable_physics_3d"]:
     SConscript("physics/SCsub")
     SConscript("physics/SCsub")
+if not env["disable_navigation_3d"]:
+    SConscript("navigation/SCsub")
 if not env["disable_xr"]:
 if not env["disable_xr"]:
     SConscript("xr/SCsub")
     SConscript("xr/SCsub")

+ 8 - 3
scene/3d/mesh_instance_3d.cpp

@@ -31,9 +31,6 @@
 #include "mesh_instance_3d.h"
 #include "mesh_instance_3d.h"
 
 
 #include "scene/3d/skeleton_3d.h"
 #include "scene/3d/skeleton_3d.h"
-#include "scene/resources/3d/navigation_mesh_source_geometry_data_3d.h"
-#include "scene/resources/navigation_mesh.h"
-#include "servers/navigation_server_3d.h"
 
 
 #ifndef PHYSICS_3D_DISABLED
 #ifndef PHYSICS_3D_DISABLED
 #include "scene/3d/physics/collision_shape_3d.h"
 #include "scene/3d/physics/collision_shape_3d.h"
@@ -42,8 +39,14 @@
 #include "scene/resources/3d/convex_polygon_shape_3d.h"
 #include "scene/resources/3d/convex_polygon_shape_3d.h"
 #endif // PHYSICS_3D_DISABLED
 #endif // PHYSICS_3D_DISABLED
 
 
+#ifndef NAVIGATION_3D_DISABLED
+#include "scene/resources/3d/navigation_mesh_source_geometry_data_3d.h"
+#include "scene/resources/navigation_mesh.h"
+#include "servers/navigation_server_3d.h"
+
 Callable MeshInstance3D::_navmesh_source_geometry_parsing_callback;
 Callable MeshInstance3D::_navmesh_source_geometry_parsing_callback;
 RID MeshInstance3D::_navmesh_source_geometry_parser;
 RID MeshInstance3D::_navmesh_source_geometry_parser;
+#endif // NAVIGATION_3D_DISABLED
 
 
 bool MeshInstance3D::_set(const StringName &p_name, const Variant &p_value) {
 bool MeshInstance3D::_set(const StringName &p_name, const Variant &p_value) {
 	//this is not _too_ bad performance wise, really. it only arrives here if the property was not set anywhere else.
 	//this is not _too_ bad performance wise, really. it only arrives here if the property was not set anywhere else.
@@ -853,6 +856,7 @@ Ref<TriangleMesh> MeshInstance3D::generate_triangle_mesh() const {
 	return Ref<TriangleMesh>();
 	return Ref<TriangleMesh>();
 }
 }
 
 
+#ifndef NAVIGATION_3D_DISABLED
 void MeshInstance3D::navmesh_parse_init() {
 void MeshInstance3D::navmesh_parse_init() {
 	ERR_FAIL_NULL(NavigationServer3D::get_singleton());
 	ERR_FAIL_NULL(NavigationServer3D::get_singleton());
 	if (!_navmesh_source_geometry_parser.is_valid()) {
 	if (!_navmesh_source_geometry_parser.is_valid()) {
@@ -878,6 +882,7 @@ void MeshInstance3D::navmesh_parse_source_geometry(const Ref<NavigationMesh> &p_
 		}
 		}
 	}
 	}
 }
 }
+#endif // NAVIGATION_3D_DISABLED
 
 
 void MeshInstance3D::_bind_methods() {
 void MeshInstance3D::_bind_methods() {
 	ClassDB::bind_method(D_METHOD("set_mesh", "mesh"), &MeshInstance3D::set_mesh);
 	ClassDB::bind_method(D_METHOD("set_mesh", "mesh"), &MeshInstance3D::set_mesh);

+ 6 - 0
scene/3d/mesh_instance_3d.h

@@ -33,8 +33,10 @@
 #include "core/templates/local_vector.h"
 #include "core/templates/local_vector.h"
 #include "scene/3d/visual_instance_3d.h"
 #include "scene/3d/visual_instance_3d.h"
 
 
+#ifndef NAVIGATION_3D_DISABLED
 class NavigationMesh;
 class NavigationMesh;
 class NavigationMeshSourceGeometryData3D;
 class NavigationMeshSourceGeometryData3D;
+#endif // NAVIGATION_3D_DISABLED
 class Skin;
 class Skin;
 class SkinReference;
 class SkinReference;
 
 
@@ -110,13 +112,17 @@ public:
 
 
 	virtual Ref<TriangleMesh> generate_triangle_mesh() const override;
 	virtual Ref<TriangleMesh> generate_triangle_mesh() const override;
 
 
+#ifndef NAVIGATION_3D_DISABLED
 private:
 private:
 	static Callable _navmesh_source_geometry_parsing_callback;
 	static Callable _navmesh_source_geometry_parsing_callback;
 	static RID _navmesh_source_geometry_parser;
 	static RID _navmesh_source_geometry_parser;
+#endif // NAVIGATION_3D_DISABLED
 
 
 public:
 public:
+#ifndef NAVIGATION_3D_DISABLED
 	static void navmesh_parse_init();
 	static void navmesh_parse_init();
 	static void navmesh_parse_source_geometry(const Ref<NavigationMesh> &p_navigation_mesh, Ref<NavigationMeshSourceGeometryData3D> p_source_geometry_data, Node *p_node);
 	static void navmesh_parse_source_geometry(const Ref<NavigationMesh> &p_navigation_mesh, Ref<NavigationMeshSourceGeometryData3D> p_source_geometry_data, Node *p_node);
+#endif // NAVIGATION_3D_DISABLED
 
 
 	MeshInstance3D();
 	MeshInstance3D();
 	~MeshInstance3D();
 	~MeshInstance3D();

+ 4 - 0
scene/3d/multimesh_instance_3d.cpp

@@ -30,12 +30,14 @@
 
 
 #include "multimesh_instance_3d.h"
 #include "multimesh_instance_3d.h"
 
 
+#ifndef NAVIGATION_3D_DISABLED
 #include "scene/resources/3d/navigation_mesh_source_geometry_data_3d.h"
 #include "scene/resources/3d/navigation_mesh_source_geometry_data_3d.h"
 #include "scene/resources/navigation_mesh.h"
 #include "scene/resources/navigation_mesh.h"
 #include "servers/navigation_server_3d.h"
 #include "servers/navigation_server_3d.h"
 
 
 Callable MultiMeshInstance3D::_navmesh_source_geometry_parsing_callback;
 Callable MultiMeshInstance3D::_navmesh_source_geometry_parsing_callback;
 RID MultiMeshInstance3D::_navmesh_source_geometry_parser;
 RID MultiMeshInstance3D::_navmesh_source_geometry_parser;
+#endif // NAVIGATION_3D_DISABLED
 
 
 void MultiMeshInstance3D::_refresh_interpolated() {
 void MultiMeshInstance3D::_refresh_interpolated() {
 	if (is_inside_tree() && multimesh.is_valid()) {
 	if (is_inside_tree() && multimesh.is_valid()) {
@@ -103,6 +105,7 @@ AABB MultiMeshInstance3D::get_aabb() const {
 	}
 	}
 }
 }
 
 
+#ifndef NAVIGATION_3D_DISABLED
 void MultiMeshInstance3D::navmesh_parse_init() {
 void MultiMeshInstance3D::navmesh_parse_init() {
 	ERR_FAIL_NULL(NavigationServer3D::get_singleton());
 	ERR_FAIL_NULL(NavigationServer3D::get_singleton());
 	if (!_navmesh_source_geometry_parser.is_valid()) {
 	if (!_navmesh_source_geometry_parser.is_valid()) {
@@ -137,6 +140,7 @@ void MultiMeshInstance3D::navmesh_parse_source_geometry(const Ref<NavigationMesh
 		}
 		}
 	}
 	}
 }
 }
+#endif // NAVIGATION_3D_DISABLED
 
 
 MultiMeshInstance3D::MultiMeshInstance3D() {
 MultiMeshInstance3D::MultiMeshInstance3D() {
 }
 }

+ 6 - 0
scene/3d/multimesh_instance_3d.h

@@ -33,8 +33,10 @@
 #include "scene/3d/visual_instance_3d.h"
 #include "scene/3d/visual_instance_3d.h"
 #include "scene/resources/multimesh.h"
 #include "scene/resources/multimesh.h"
 
 
+#ifndef NAVIGATION_3D_DISABLED
 class NavigationMesh;
 class NavigationMesh;
 class NavigationMeshSourceGeometryData3D;
 class NavigationMeshSourceGeometryData3D;
+#endif // NAVIGATION_3D_DISABLED
 
 
 class MultiMeshInstance3D : public GeometryInstance3D {
 class MultiMeshInstance3D : public GeometryInstance3D {
 	GDCLASS(MultiMeshInstance3D, GeometryInstance3D);
 	GDCLASS(MultiMeshInstance3D, GeometryInstance3D);
@@ -57,12 +59,16 @@ public:
 	virtual AABB get_aabb() const override;
 	virtual AABB get_aabb() const override;
 
 
 private:
 private:
+#ifndef NAVIGATION_3D_DISABLED
 	static Callable _navmesh_source_geometry_parsing_callback;
 	static Callable _navmesh_source_geometry_parsing_callback;
 	static RID _navmesh_source_geometry_parser;
 	static RID _navmesh_source_geometry_parser;
+#endif // NAVIGATION_3D_DISABLED
 
 
 public:
 public:
+#ifndef NAVIGATION_3D_DISABLED
 	static void navmesh_parse_init();
 	static void navmesh_parse_init();
 	static void navmesh_parse_source_geometry(const Ref<NavigationMesh> &p_navigation_mesh, Ref<NavigationMeshSourceGeometryData3D> p_source_geometry_data, Node *p_node);
 	static void navmesh_parse_source_geometry(const Ref<NavigationMesh> &p_navigation_mesh, Ref<NavigationMeshSourceGeometryData3D> p_source_geometry_data, Node *p_node);
+#endif // NAVIGATION_3D_DISABLED
 
 
 	MultiMeshInstance3D();
 	MultiMeshInstance3D();
 	~MultiMeshInstance3D();
 	~MultiMeshInstance3D();

+ 6 - 0
scene/3d/navigation/SCsub

@@ -0,0 +1,6 @@
+#!/usr/bin/env python
+from misc.utility.scons_hints import *
+
+Import("env")
+
+env.add_source_files(env.scene_sources, "*.cpp")

+ 1 - 1
scene/3d/navigation_agent_3d.cpp → scene/3d/navigation/navigation_agent_3d.cpp

@@ -30,7 +30,7 @@
 
 
 #include "navigation_agent_3d.h"
 #include "navigation_agent_3d.h"
 
 
-#include "scene/3d/navigation_link_3d.h"
+#include "scene/3d/navigation/navigation_link_3d.h"
 #include "servers/navigation_server_3d.h"
 #include "servers/navigation_server_3d.h"
 
 
 void NavigationAgent3D::_bind_methods() {
 void NavigationAgent3D::_bind_methods() {

+ 0 - 0
scene/3d/navigation_agent_3d.h → scene/3d/navigation/navigation_agent_3d.h


+ 0 - 0
scene/3d/navigation_link_3d.cpp → scene/3d/navigation/navigation_link_3d.cpp


+ 0 - 0
scene/3d/navigation_link_3d.h → scene/3d/navigation/navigation_link_3d.h


+ 0 - 0
scene/3d/navigation_obstacle_3d.cpp → scene/3d/navigation/navigation_obstacle_3d.cpp


+ 0 - 0
scene/3d/navigation_obstacle_3d.h → scene/3d/navigation/navigation_obstacle_3d.h


+ 0 - 0
scene/3d/navigation_region_3d.cpp → scene/3d/navigation/navigation_region_3d.cpp


+ 0 - 0
scene/3d/navigation_region_3d.h → scene/3d/navigation/navigation_region_3d.h


+ 4 - 0
scene/3d/physics/static_body_3d.cpp

@@ -30,6 +30,7 @@
 
 
 #include "static_body_3d.h"
 #include "static_body_3d.h"
 
 
+#ifndef NAVIGATION_3D_DISABLED
 #include "core/math/convex_hull.h"
 #include "core/math/convex_hull.h"
 #include "scene/resources/3d/box_shape_3d.h"
 #include "scene/resources/3d/box_shape_3d.h"
 #include "scene/resources/3d/capsule_shape_3d.h"
 #include "scene/resources/3d/capsule_shape_3d.h"
@@ -47,6 +48,7 @@
 
 
 Callable StaticBody3D::_navmesh_source_geometry_parsing_callback;
 Callable StaticBody3D::_navmesh_source_geometry_parsing_callback;
 RID StaticBody3D::_navmesh_source_geometry_parser;
 RID StaticBody3D::_navmesh_source_geometry_parser;
+#endif // NAVIGATION_3D_DISABLED
 
 
 void StaticBody3D::set_physics_material_override(const Ref<PhysicsMaterial> &p_physics_material_override) {
 void StaticBody3D::set_physics_material_override(const Ref<PhysicsMaterial> &p_physics_material_override) {
 	if (physics_material_override.is_valid()) {
 	if (physics_material_override.is_valid()) {
@@ -95,6 +97,7 @@ void StaticBody3D::_reload_physics_characteristics() {
 	}
 	}
 }
 }
 
 
+#ifndef NAVIGATION_3D_DISABLED
 void StaticBody3D::navmesh_parse_init() {
 void StaticBody3D::navmesh_parse_init() {
 	ERR_FAIL_NULL(NavigationServer3D::get_singleton());
 	ERR_FAIL_NULL(NavigationServer3D::get_singleton());
 	if (!_navmesh_source_geometry_parser.is_valid()) {
 	if (!_navmesh_source_geometry_parser.is_valid()) {
@@ -226,6 +229,7 @@ void StaticBody3D::navmesh_parse_source_geometry(const Ref<NavigationMesh> &p_na
 		}
 		}
 	}
 	}
 }
 }
+#endif // NAVIGATION_3D_DISABLED
 
 
 void StaticBody3D::_bind_methods() {
 void StaticBody3D::_bind_methods() {
 	ClassDB::bind_method(D_METHOD("set_constant_linear_velocity", "vel"), &StaticBody3D::set_constant_linear_velocity);
 	ClassDB::bind_method(D_METHOD("set_constant_linear_velocity", "vel"), &StaticBody3D::set_constant_linear_velocity);

+ 4 - 0
scene/3d/physics/static_body_3d.h

@@ -32,8 +32,10 @@
 
 
 #include "scene/3d/physics/physics_body_3d.h"
 #include "scene/3d/physics/physics_body_3d.h"
 
 
+#ifndef NAVIGATION_3D_DISABLED
 class NavigationMesh;
 class NavigationMesh;
 class NavigationMeshSourceGeometryData3D;
 class NavigationMeshSourceGeometryData3D;
+#endif // NAVIGATION_3D_DISABLED
 
 
 class StaticBody3D : public PhysicsBody3D {
 class StaticBody3D : public PhysicsBody3D {
 	GDCLASS(StaticBody3D, PhysicsBody3D);
 	GDCLASS(StaticBody3D, PhysicsBody3D);
@@ -62,10 +64,12 @@ public:
 private:
 private:
 	void _reload_physics_characteristics();
 	void _reload_physics_characteristics();
 
 
+#ifndef NAVIGATION_3D_DISABLED
 	static Callable _navmesh_source_geometry_parsing_callback;
 	static Callable _navmesh_source_geometry_parsing_callback;
 	static RID _navmesh_source_geometry_parser;
 	static RID _navmesh_source_geometry_parser;
 
 
 public:
 public:
 	static void navmesh_parse_init();
 	static void navmesh_parse_init();
 	static void navmesh_parse_source_geometry(const Ref<NavigationMesh> &p_navigation_mesh, Ref<NavigationMeshSourceGeometryData3D> p_source_geometry_data, Node *p_node);
 	static void navmesh_parse_source_geometry(const Ref<NavigationMesh> &p_navigation_mesh, Ref<NavigationMeshSourceGeometryData3D> p_source_geometry_data, Node *p_node);
+#endif // NAVIGATION_3D_DISABLED
 };
 };

+ 54 - 25
scene/register_scene_types.cpp

@@ -131,7 +131,9 @@
 #include "scene/resources/mesh_data_tool.h"
 #include "scene/resources/mesh_data_tool.h"
 #include "scene/resources/mesh_texture.h"
 #include "scene/resources/mesh_texture.h"
 #include "scene/resources/multimesh.h"
 #include "scene/resources/multimesh.h"
+#if !defined(NAVIGATION_2D_DISABLED) || !defined(NAVIGATION_3D_DISABLED)
 #include "scene/resources/navigation_mesh.h"
 #include "scene/resources/navigation_mesh.h"
+#endif // !defined(NAVIGATION_2D_DISABLED) || !defined(NAVIGATION_3D_DISABLED)
 #include "scene/resources/packed_scene.h"
 #include "scene/resources/packed_scene.h"
 #include "scene/resources/particle_process_material.h"
 #include "scene/resources/particle_process_material.h"
 #include "scene/resources/placeholder_textures.h"
 #include "scene/resources/placeholder_textures.h"
@@ -174,10 +176,6 @@
 #include "scene/2d/marker_2d.h"
 #include "scene/2d/marker_2d.h"
 #include "scene/2d/mesh_instance_2d.h"
 #include "scene/2d/mesh_instance_2d.h"
 #include "scene/2d/multimesh_instance_2d.h"
 #include "scene/2d/multimesh_instance_2d.h"
-#include "scene/2d/navigation_agent_2d.h"
-#include "scene/2d/navigation_link_2d.h"
-#include "scene/2d/navigation_obstacle_2d.h"
-#include "scene/2d/navigation_region_2d.h"
 #include "scene/2d/parallax_2d.h"
 #include "scene/2d/parallax_2d.h"
 #include "scene/2d/parallax_background.h"
 #include "scene/2d/parallax_background.h"
 #include "scene/2d/parallax_layer.h"
 #include "scene/2d/parallax_layer.h"
@@ -189,8 +187,6 @@
 #include "scene/2d/tile_map.h"
 #include "scene/2d/tile_map.h"
 #include "scene/2d/tile_map_layer.h"
 #include "scene/2d/tile_map_layer.h"
 #include "scene/2d/visible_on_screen_notifier_2d.h"
 #include "scene/2d/visible_on_screen_notifier_2d.h"
-#include "scene/resources/2d/navigation_mesh_source_geometry_data_2d.h"
-#include "scene/resources/2d/navigation_polygon.h"
 #include "scene/resources/2d/polygon_path_finder.h"
 #include "scene/resources/2d/polygon_path_finder.h"
 #include "scene/resources/2d/skeleton/skeleton_modification_2d.h"
 #include "scene/resources/2d/skeleton/skeleton_modification_2d.h"
 #include "scene/resources/2d/skeleton/skeleton_modification_2d_ccdik.h"
 #include "scene/resources/2d/skeleton/skeleton_modification_2d_ccdik.h"
@@ -202,6 +198,15 @@
 #include "scene/resources/2d/tile_set.h"
 #include "scene/resources/2d/tile_set.h"
 #include "scene/resources/world_2d.h"
 #include "scene/resources/world_2d.h"
 
 
+#ifndef NAVIGATION_2D_DISABLED
+#include "scene/2d/navigation/navigation_agent_2d.h"
+#include "scene/2d/navigation/navigation_link_2d.h"
+#include "scene/2d/navigation/navigation_obstacle_2d.h"
+#include "scene/2d/navigation/navigation_region_2d.h"
+#include "scene/resources/2d/navigation_mesh_source_geometry_data_2d.h"
+#include "scene/resources/2d/navigation_polygon.h"
+#endif // NAVIGATION_2D_DISABLED
+
 #ifndef _3D_DISABLED
 #ifndef _3D_DISABLED
 #include "scene/3d/audio_listener_3d.h"
 #include "scene/3d/audio_listener_3d.h"
 #include "scene/3d/audio_stream_player_3d.h"
 #include "scene/3d/audio_stream_player_3d.h"
@@ -221,10 +226,6 @@
 #include "scene/3d/marker_3d.h"
 #include "scene/3d/marker_3d.h"
 #include "scene/3d/mesh_instance_3d.h"
 #include "scene/3d/mesh_instance_3d.h"
 #include "scene/3d/multimesh_instance_3d.h"
 #include "scene/3d/multimesh_instance_3d.h"
-#include "scene/3d/navigation_agent_3d.h"
-#include "scene/3d/navigation_link_3d.h"
-#include "scene/3d/navigation_obstacle_3d.h"
-#include "scene/3d/navigation_region_3d.h"
 #include "scene/3d/node_3d.h"
 #include "scene/3d/node_3d.h"
 #include "scene/3d/occluder_instance_3d.h"
 #include "scene/3d/occluder_instance_3d.h"
 #include "scene/3d/path_3d.h"
 #include "scene/3d/path_3d.h"
@@ -238,12 +239,6 @@
 #include "scene/3d/visible_on_screen_notifier_3d.h"
 #include "scene/3d/visible_on_screen_notifier_3d.h"
 #include "scene/3d/voxel_gi.h"
 #include "scene/3d/voxel_gi.h"
 #include "scene/3d/world_environment.h"
 #include "scene/3d/world_environment.h"
-#ifndef XR_DISABLED
-#include "scene/3d/xr/xr_body_modifier_3d.h"
-#include "scene/3d/xr/xr_face_modifier_3d.h"
-#include "scene/3d/xr/xr_hand_modifier_3d.h"
-#include "scene/3d/xr/xr_nodes.h"
-#endif // XR_DISABLED
 #include "scene/animation/root_motion_view.h"
 #include "scene/animation/root_motion_view.h"
 #include "scene/resources/3d/fog_material.h"
 #include "scene/resources/3d/fog_material.h"
 #include "scene/resources/3d/importer_mesh.h"
 #include "scene/resources/3d/importer_mesh.h"
@@ -252,6 +247,19 @@
 #include "scene/resources/3d/primitive_meshes.h"
 #include "scene/resources/3d/primitive_meshes.h"
 #include "scene/resources/3d/sky_material.h"
 #include "scene/resources/3d/sky_material.h"
 #include "scene/resources/3d/world_3d.h"
 #include "scene/resources/3d/world_3d.h"
+#ifndef NAVIGATION_3D_DISABLED
+#include "scene/3d/navigation/navigation_agent_3d.h"
+#include "scene/3d/navigation/navigation_link_3d.h"
+#include "scene/3d/navigation/navigation_obstacle_3d.h"
+#include "scene/3d/navigation/navigation_region_3d.h"
+#include "scene/resources/3d/navigation_mesh_source_geometry_data_3d.h"
+#endif // NAVIGATION_3D_DISABLED
+#ifndef XR_DISABLED
+#include "scene/3d/xr/xr_body_modifier_3d.h"
+#include "scene/3d/xr/xr_face_modifier_3d.h"
+#include "scene/3d/xr/xr_hand_modifier_3d.h"
+#include "scene/3d/xr/xr_nodes.h"
+#endif // XR_DISABLED
 #endif // _3D_DISABLED
 #endif // _3D_DISABLED
 
 
 #if !defined(PHYSICS_2D_DISABLED) || !defined(PHYSICS_3D_DISABLED)
 #if !defined(PHYSICS_2D_DISABLED) || !defined(PHYSICS_3D_DISABLED)
@@ -684,10 +692,13 @@ void register_scene_types() {
 	GDREGISTER_CLASS(Generic6DOFJoint3D);
 	GDREGISTER_CLASS(Generic6DOFJoint3D);
 #endif // PHYSICS_3D_DISABLED
 #endif // PHYSICS_3D_DISABLED
 
 
+#ifndef NAVIGATION_3D_DISABLED
+	GDREGISTER_CLASS(NavigationMeshSourceGeometryData3D);
 	GDREGISTER_CLASS(NavigationRegion3D);
 	GDREGISTER_CLASS(NavigationRegion3D);
 	GDREGISTER_CLASS(NavigationAgent3D);
 	GDREGISTER_CLASS(NavigationAgent3D);
 	GDREGISTER_CLASS(NavigationObstacle3D);
 	GDREGISTER_CLASS(NavigationObstacle3D);
 	GDREGISTER_CLASS(NavigationLink3D);
 	GDREGISTER_CLASS(NavigationLink3D);
+#endif // NAVIGATION_3D_DISABLED
 
 
 	OS::get_singleton()->yield(); // may take time to init
 	OS::get_singleton()->yield(); // may take time to init
 #endif // _3D_DISABLED
 #endif // _3D_DISABLED
@@ -942,7 +953,6 @@ void register_scene_types() {
 	BaseMaterial3D::init_shaders();
 	BaseMaterial3D::init_shaders();
 
 
 	GDREGISTER_CLASS(MeshLibrary);
 	GDREGISTER_CLASS(MeshLibrary);
-	GDREGISTER_CLASS(NavigationMeshSourceGeometryData3D);
 
 
 	OS::get_singleton()->yield(); // may take time to init
 	OS::get_singleton()->yield(); // may take time to init
 
 
@@ -1054,6 +1064,10 @@ void register_scene_types() {
 	OS::get_singleton()->yield(); // may take time to init
 	OS::get_singleton()->yield(); // may take time to init
 
 
 	GDREGISTER_CLASS(AudioStreamPlayer2D);
 	GDREGISTER_CLASS(AudioStreamPlayer2D);
+	GDREGISTER_CLASS(Curve2D);
+	GDREGISTER_CLASS(Path2D);
+	GDREGISTER_CLASS(PathFollow2D);
+
 #ifndef PHYSICS_2D_DISABLED
 #ifndef PHYSICS_2D_DISABLED
 	GDREGISTER_ABSTRACT_CLASS(Shape2D);
 	GDREGISTER_ABSTRACT_CLASS(Shape2D);
 	GDREGISTER_CLASS(WorldBoundaryShape2D);
 	GDREGISTER_CLASS(WorldBoundaryShape2D);
@@ -1065,18 +1079,19 @@ void register_scene_types() {
 	GDREGISTER_CLASS(ConvexPolygonShape2D);
 	GDREGISTER_CLASS(ConvexPolygonShape2D);
 	GDREGISTER_CLASS(ConcavePolygonShape2D);
 	GDREGISTER_CLASS(ConcavePolygonShape2D);
 #endif // PHYSICS_2D_DISABLED
 #endif // PHYSICS_2D_DISABLED
-	GDREGISTER_CLASS(Curve2D);
-	GDREGISTER_CLASS(Path2D);
-	GDREGISTER_CLASS(PathFollow2D);
-	GDREGISTER_CLASS(PolygonPathFinder);
 
 
+#if !defined(NAVIGATION_2D_DISABLED) || !defined(NAVIGATION_3D_DISABLED)
 	GDREGISTER_CLASS(NavigationMesh);
 	GDREGISTER_CLASS(NavigationMesh);
+#endif // !defined(NAVIGATION_2D_DISABLED) || !defined(NAVIGATION_3D_DISABLED)
+
+#ifndef NAVIGATION_2D_DISABLED
 	GDREGISTER_CLASS(NavigationMeshSourceGeometryData2D);
 	GDREGISTER_CLASS(NavigationMeshSourceGeometryData2D);
 	GDREGISTER_CLASS(NavigationPolygon);
 	GDREGISTER_CLASS(NavigationPolygon);
 	GDREGISTER_CLASS(NavigationRegion2D);
 	GDREGISTER_CLASS(NavigationRegion2D);
 	GDREGISTER_CLASS(NavigationAgent2D);
 	GDREGISTER_CLASS(NavigationAgent2D);
 	GDREGISTER_CLASS(NavigationObstacle2D);
 	GDREGISTER_CLASS(NavigationObstacle2D);
 	GDREGISTER_CLASS(NavigationLink2D);
 	GDREGISTER_CLASS(NavigationLink2D);
+	GDREGISTER_CLASS(PolygonPathFinder);
 
 
 	OS::get_singleton()->yield(); // may take time to init
 	OS::get_singleton()->yield(); // may take time to init
 
 
@@ -1090,7 +1105,9 @@ void register_scene_types() {
 #ifndef PHYSICS_2D_DISABLED
 #ifndef PHYSICS_2D_DISABLED
 	StaticBody2D::navmesh_parse_init();
 	StaticBody2D::navmesh_parse_init();
 #endif // PHYSICS_2D_DISABLED
 #endif // PHYSICS_2D_DISABLED
-#ifndef _3D_DISABLED
+#endif // NAVIGATION_2D_DISABLED
+
+#ifndef NAVIGATION_3D_DISABLED
 	// 3D nodes that support navmesh baking need to server register their source geometry parsers.
 	// 3D nodes that support navmesh baking need to server register their source geometry parsers.
 	MeshInstance3D::navmesh_parse_init();
 	MeshInstance3D::navmesh_parse_init();
 	MultiMeshInstance3D::navmesh_parse_init();
 	MultiMeshInstance3D::navmesh_parse_init();
@@ -1098,9 +1115,11 @@ void register_scene_types() {
 #ifndef PHYSICS_3D_DISABLED
 #ifndef PHYSICS_3D_DISABLED
 	StaticBody3D::navmesh_parse_init();
 	StaticBody3D::navmesh_parse_init();
 #endif // PHYSICS_3D_DISABLED
 #endif // PHYSICS_3D_DISABLED
-#endif // _3D_DISABLED
+#endif // NAVIGATION_3D_DISABLED
 
 
+#if !defined(NAVIGATION_2D_DISABLED) || !defined(NAVIGATION_3D_DISABLED)
 	OS::get_singleton()->yield(); // may take time to init
 	OS::get_singleton()->yield(); // may take time to init
+#endif // !defined(NAVIGATION_2D_DISABLED) || !defined(NAVIGATION_3D_DISABLED)
 
 
 	GDREGISTER_ABSTRACT_CLASS(SceneState);
 	GDREGISTER_ABSTRACT_CLASS(SceneState);
 	GDREGISTER_CLASS(PackedScene);
 	GDREGISTER_CLASS(PackedScene);
@@ -1116,8 +1135,10 @@ void register_scene_types() {
 	ClassDB::add_compatibility_class("BitmapFont", "FontFile");
 	ClassDB::add_compatibility_class("BitmapFont", "FontFile");
 	ClassDB::add_compatibility_class("DynamicFont", "FontFile");
 	ClassDB::add_compatibility_class("DynamicFont", "FontFile");
 	ClassDB::add_compatibility_class("DynamicFontData", "FontFile");
 	ClassDB::add_compatibility_class("DynamicFontData", "FontFile");
+#ifndef NAVIGATION_3D_DISABLED
 	ClassDB::add_compatibility_class("Navigation3D", "Node3D");
 	ClassDB::add_compatibility_class("Navigation3D", "Node3D");
 	ClassDB::add_compatibility_class("Navigation2D", "Node2D");
 	ClassDB::add_compatibility_class("Navigation2D", "Node2D");
+#endif // NAVIGATION_3D_DISABLED
 	ClassDB::add_compatibility_class("OpenSimplexNoise", "FastNoiseLite");
 	ClassDB::add_compatibility_class("OpenSimplexNoise", "FastNoiseLite");
 	ClassDB::add_compatibility_class("ProximityGroup", "Node3D");
 	ClassDB::add_compatibility_class("ProximityGroup", "Node3D");
 	ClassDB::add_compatibility_class("ToolButton", "Button");
 	ClassDB::add_compatibility_class("ToolButton", "Button");
@@ -1164,13 +1185,17 @@ void register_scene_types() {
 	ClassDB::add_compatibility_class("Listener", "AudioListener3D");
 	ClassDB::add_compatibility_class("Listener", "AudioListener3D");
 	ClassDB::add_compatibility_class("MeshInstance", "MeshInstance3D");
 	ClassDB::add_compatibility_class("MeshInstance", "MeshInstance3D");
 	ClassDB::add_compatibility_class("MultiMeshInstance", "MultiMeshInstance3D");
 	ClassDB::add_compatibility_class("MultiMeshInstance", "MultiMeshInstance3D");
+#ifndef NAVIGATION_3D_DISABLED
 	ClassDB::add_compatibility_class("NavigationAgent", "NavigationAgent3D");
 	ClassDB::add_compatibility_class("NavigationAgent", "NavigationAgent3D");
 	ClassDB::add_compatibility_class("NavigationMeshInstance", "NavigationRegion3D");
 	ClassDB::add_compatibility_class("NavigationMeshInstance", "NavigationRegion3D");
 	ClassDB::add_compatibility_class("NavigationObstacle", "NavigationObstacle3D");
 	ClassDB::add_compatibility_class("NavigationObstacle", "NavigationObstacle3D");
-	ClassDB::add_compatibility_class("NavigationPolygonInstance", "NavigationRegion2D");
 	ClassDB::add_compatibility_class("NavigationRegion", "NavigationRegion3D");
 	ClassDB::add_compatibility_class("NavigationRegion", "NavigationRegion3D");
-	ClassDB::add_compatibility_class("Navigation2DServer", "NavigationServer2D");
 	ClassDB::add_compatibility_class("NavigationServer", "NavigationServer3D");
 	ClassDB::add_compatibility_class("NavigationServer", "NavigationServer3D");
+#endif // NAVIGATION_3D_DISABLED
+#ifndef NAVIGATION_2D_DISABLED
+	ClassDB::add_compatibility_class("NavigationPolygonInstance", "NavigationRegion2D");
+	ClassDB::add_compatibility_class("Navigation2DServer", "NavigationServer2D");
+#endif // NAVIGATION_2D_DISABLED
 	ClassDB::add_compatibility_class("OmniLight", "OmniLight3D");
 	ClassDB::add_compatibility_class("OmniLight", "OmniLight3D");
 	ClassDB::add_compatibility_class("PanoramaSky", "Sky");
 	ClassDB::add_compatibility_class("PanoramaSky", "Sky");
 	ClassDB::add_compatibility_class("Particles", "GPUParticles3D");
 	ClassDB::add_compatibility_class("Particles", "GPUParticles3D");
@@ -1306,9 +1331,13 @@ void register_scene_types() {
 
 
 	for (int i = 0; i < 32; i++) {
 	for (int i = 0; i < 32; i++) {
 		GLOBAL_DEF_BASIC(vformat("%s/layer_%d", PNAME("layer_names/2d_physics"), i + 1), "");
 		GLOBAL_DEF_BASIC(vformat("%s/layer_%d", PNAME("layer_names/2d_physics"), i + 1), "");
+#ifndef NAVIGATION_2D_DISABLED
 		GLOBAL_DEF_BASIC(vformat("%s/layer_%d", PNAME("layer_names/2d_navigation"), i + 1), "");
 		GLOBAL_DEF_BASIC(vformat("%s/layer_%d", PNAME("layer_names/2d_navigation"), i + 1), "");
+#endif // NAVIGATION_2D_DISABLED
 		GLOBAL_DEF_BASIC(vformat("%s/layer_%d", PNAME("layer_names/3d_physics"), i + 1), "");
 		GLOBAL_DEF_BASIC(vformat("%s/layer_%d", PNAME("layer_names/3d_physics"), i + 1), "");
+#ifndef NAVIGATION_3D_DISABLED
 		GLOBAL_DEF_BASIC(vformat("%s/layer_%d", PNAME("layer_names/3d_navigation"), i + 1), "");
 		GLOBAL_DEF_BASIC(vformat("%s/layer_%d", PNAME("layer_names/3d_navigation"), i + 1), "");
+#endif // NAVIGATION_3D_DISABLED
 	}
 	}
 
 
 	for (int i = 0; i < 32; i++) {
 	for (int i = 0; i < 32; i++) {

+ 4 - 3
scene/resources/2d/SCsub

@@ -3,9 +3,6 @@ from misc.utility.scons_hints import *
 
 
 Import("env")
 Import("env")
 
 
-env.add_source_files(env.scene_sources, "navigation_mesh_source_geometry_data_2d.cpp")
-env.add_source_files(env.scene_sources, "navigation_polygon.cpp")
-env.add_source_files(env.scene_sources, "polygon_path_finder.cpp")
 env.add_source_files(env.scene_sources, "tile_set.cpp")
 env.add_source_files(env.scene_sources, "tile_set.cpp")
 
 
 if not env["disable_physics_2d"]:
 if not env["disable_physics_2d"]:
@@ -18,5 +15,9 @@ if not env["disable_physics_2d"]:
     env.add_source_files(env.scene_sources, "separation_ray_shape_2d.cpp")
     env.add_source_files(env.scene_sources, "separation_ray_shape_2d.cpp")
     env.add_source_files(env.scene_sources, "shape_2d.cpp")
     env.add_source_files(env.scene_sources, "shape_2d.cpp")
     env.add_source_files(env.scene_sources, "world_boundary_shape_2d.cpp")
     env.add_source_files(env.scene_sources, "world_boundary_shape_2d.cpp")
+if not env["disable_navigation_2d"]:
+    env.add_source_files(env.scene_sources, "navigation_mesh_source_geometry_data_2d.cpp")
+    env.add_source_files(env.scene_sources, "navigation_polygon.cpp")
+    env.add_source_files(env.scene_sources, "polygon_path_finder.cpp")
 
 
 SConscript("skeleton/SCsub")
 SConscript("skeleton/SCsub")

+ 4 - 0
scene/resources/2d/tile_set.compat.inc

@@ -32,16 +32,20 @@
 
 
 #include "tile_set.h"
 #include "tile_set.h"
 
 
+#ifndef NAVIGATION_2D_DISABLED
 Ref<NavigationPolygon> TileData::_get_navigation_polygon_bind_compat_84660(int p_layer_id) const {
 Ref<NavigationPolygon> TileData::_get_navigation_polygon_bind_compat_84660(int p_layer_id) const {
 	return get_navigation_polygon(p_layer_id, false, false, false);
 	return get_navigation_polygon(p_layer_id, false, false, false);
 }
 }
+#endif // NAVIGATION_2D_DISABLED
 
 
 Ref<OccluderPolygon2D> TileData::_get_occluder_bind_compat_84660(int p_layer_id) const {
 Ref<OccluderPolygon2D> TileData::_get_occluder_bind_compat_84660(int p_layer_id) const {
 	return get_occluder_polygon(p_layer_id, 0, false, false, false);
 	return get_occluder_polygon(p_layer_id, 0, false, false, false);
 }
 }
 
 
 void TileData::_bind_compatibility_methods() {
 void TileData::_bind_compatibility_methods() {
+#ifndef NAVIGATION_2D_DISABLED
 	ClassDB::bind_compatibility_method(D_METHOD("get_navigation_polygon"), &TileData::_get_navigation_polygon_bind_compat_84660);
 	ClassDB::bind_compatibility_method(D_METHOD("get_navigation_polygon"), &TileData::_get_navigation_polygon_bind_compat_84660);
+#endif // NAVIGATION_2D_DISABLED
 	ClassDB::bind_compatibility_method(D_METHOD("get_occluder"), &TileData::_get_occluder_bind_compat_84660);
 	ClassDB::bind_compatibility_method(D_METHOD("get_occluder"), &TileData::_get_occluder_bind_compat_84660);
 }
 }
 
 

+ 99 - 67
scene/resources/2d/tile_set.cpp

@@ -37,7 +37,10 @@
 #include "core/templates/rb_set.h"
 #include "core/templates/rb_set.h"
 #include "scene/gui/control.h"
 #include "scene/gui/control.h"
 #include "scene/resources/image_texture.h"
 #include "scene/resources/image_texture.h"
+
+#ifndef NAVIGATION_2D_DISABLED
 #include "servers/navigation_server_2d.h"
 #include "servers/navigation_server_2d.h"
+#endif // NAVIGATION_2D_DISABLED
 
 
 /////////////////////////////// TileMapPattern //////////////////////////////////////
 /////////////////////////////// TileMapPattern //////////////////////////////////////
 
 
@@ -965,6 +968,7 @@ bool TileSet::is_valid_terrain_peering_bit(int p_terrain_set, TileSet::CellNeigh
 	return is_valid_terrain_peering_bit_for_mode(terrain_mode, p_peering_bit);
 	return is_valid_terrain_peering_bit_for_mode(terrain_mode, p_peering_bit);
 }
 }
 
 
+#ifndef NAVIGATION_2D_DISABLED
 // Navigation
 // Navigation
 int TileSet::get_navigation_layers_count() const {
 int TileSet::get_navigation_layers_count() const {
 	return navigation_layers.size();
 	return navigation_layers.size();
@@ -1039,6 +1043,7 @@ bool TileSet::get_navigation_layer_layer_value(int p_layer_index, int p_layer_nu
 
 
 	return get_navigation_layer_layers(p_layer_index) & (1 << (p_layer_number - 1));
 	return get_navigation_layer_layers(p_layer_index) & (1 << (p_layer_number - 1));
 }
 }
+#endif // NAVIGATION_2D_DISABLED
 
 
 // Custom data.
 // Custom data.
 int TileSet::get_custom_data_layers_count() const {
 int TileSet::get_custom_data_layers_count() const {
@@ -3413,6 +3418,7 @@ void TileSet::_compatibility_conversion() {
 						tile_data->add_occluder_polygon(0);
 						tile_data->add_occluder_polygon(0);
 						tile_data->set_occluder_polygon(0, 0, occluder);
 						tile_data->set_occluder_polygon(0, 0, occluder);
 					}
 					}
+#ifndef NAVIGATION_2D_DISABLED
 					if (ctd->navigation.is_valid()) {
 					if (ctd->navigation.is_valid()) {
 						if (get_navigation_layers_count() < 1) {
 						if (get_navigation_layers_count() < 1) {
 							add_navigation_layer();
 							add_navigation_layer();
@@ -3425,6 +3431,7 @@ void TileSet::_compatibility_conversion() {
 						navigation->set_vertices(vertices);
 						navigation->set_vertices(vertices);
 						tile_data->set_navigation_polygon(0, navigation);
 						tile_data->set_navigation_polygon(0, navigation);
 					}
 					}
+#endif // NAVIGATION_2D_DISABLED
 
 
 					tile_data->set_z_index(ctd->z_index);
 					tile_data->set_z_index(ctd->z_index);
 
 
@@ -3522,6 +3529,7 @@ void TileSet::_compatibility_conversion() {
 								tile_data->add_occluder_polygon(0);
 								tile_data->add_occluder_polygon(0);
 								tile_data->set_occluder_polygon(0, 0, occluder);
 								tile_data->set_occluder_polygon(0, 0, occluder);
 							}
 							}
+#ifndef NAVIGATION_2D_DISABLED
 							if (ctd->autotile_navpoly_map.has(coords)) {
 							if (ctd->autotile_navpoly_map.has(coords)) {
 								if (get_navigation_layers_count() < 1) {
 								if (get_navigation_layers_count() < 1) {
 									add_navigation_layer();
 									add_navigation_layer();
@@ -3534,6 +3542,7 @@ void TileSet::_compatibility_conversion() {
 								navigation->set_vertices(vertices);
 								navigation->set_vertices(vertices);
 								tile_data->set_navigation_polygon(0, navigation);
 								tile_data->set_navigation_polygon(0, navigation);
 							}
 							}
+#endif // NAVIGATION_2D_DISABLED
 							if (ctd->autotile_priority_map.has(coords)) {
 							if (ctd->autotile_priority_map.has(coords)) {
 								tile_data->set_probability(ctd->autotile_priority_map[coords]);
 								tile_data->set_probability(ctd->autotile_priority_map[coords]);
 							}
 							}
@@ -3732,7 +3741,9 @@ bool TileSet::_set(const StringName &p_name, const Variant &p_value) {
 					if (p[0].get_type() == Variant::VECTOR2) {
 					if (p[0].get_type() == Variant::VECTOR2) {
 						last_coord = p[0];
 						last_coord = p[0];
 					} else if (p[0].get_type() == Variant::OBJECT) {
 					} else if (p[0].get_type() == Variant::OBJECT) {
+#ifndef NAVIGATION_2D_DISABLED
 						ctd->autotile_navpoly_map.insert(last_coord, p[0]);
 						ctd->autotile_navpoly_map.insert(last_coord, p[0]);
+#endif // NAVIGATION_2D_DISABLED
 					}
 					}
 					p.pop_front();
 					p.pop_front();
 				}
 				}
@@ -3794,7 +3805,9 @@ bool TileSet::_set(const StringName &p_name, const Variant &p_value) {
 		} else if (what == "occluder") {
 		} else if (what == "occluder") {
 			ctd->occluder = p_value;
 			ctd->occluder = p_value;
 		} else if (what == "navigation") {
 		} else if (what == "navigation") {
+#ifndef NAVIGATION_2D_DISABLED
 			ctd->navigation = p_value;
 			ctd->navigation = p_value;
+#endif // NAVIGATION_2D_DISABLED
 
 
 			/*
 			/*
 		// IGNORED FOR NOW, they seem duplicated data compared to the shapes array
 		// IGNORED FOR NOW, they seem duplicated data compared to the shapes array
@@ -3913,6 +3926,7 @@ bool TileSet::_set(const StringName &p_name, const Variant &p_value) {
 				}
 				}
 			}
 			}
 		} else if (components.size() == 2 && components[0].begins_with("navigation_layer_") && components[0].trim_prefix("navigation_layer_").is_valid_int()) {
 		} else if (components.size() == 2 && components[0].begins_with("navigation_layer_") && components[0].trim_prefix("navigation_layer_").is_valid_int()) {
+#ifndef NAVIGATION_2D_DISABLED
 			// Navigation layers.
 			// Navigation layers.
 			int index = components[0].trim_prefix("navigation_layer_").to_int();
 			int index = components[0].trim_prefix("navigation_layer_").to_int();
 			ERR_FAIL_COND_V(index < 0, false);
 			ERR_FAIL_COND_V(index < 0, false);
@@ -3924,6 +3938,7 @@ bool TileSet::_set(const StringName &p_name, const Variant &p_value) {
 				set_navigation_layer_layers(index, p_value);
 				set_navigation_layer_layers(index, p_value);
 				return true;
 				return true;
 			}
 			}
+#endif // NAVIGATION_2D_DISABLED
 		} else if (components.size() == 2 && components[0].begins_with("custom_data_layer_") && components[0].trim_prefix("custom_data_layer_").is_valid_int()) {
 		} else if (components.size() == 2 && components[0].begins_with("custom_data_layer_") && components[0].trim_prefix("custom_data_layer_").is_valid_int()) {
 			// Custom data layers.
 			// Custom data layers.
 			int index = components[0].trim_prefix("custom_data_layer_").to_int();
 			int index = components[0].trim_prefix("custom_data_layer_").to_int();
@@ -4057,10 +4072,12 @@ bool TileSet::_get(const StringName &p_name, Variant &r_ret) const {
 		if (index < 0 || index >= navigation_layers.size()) {
 		if (index < 0 || index >= navigation_layers.size()) {
 			return false;
 			return false;
 		}
 		}
+#ifndef NAVIGATION_2D_DISABLED
 		if (components[1] == "layers") {
 		if (components[1] == "layers") {
 			r_ret = get_navigation_layer_layers(index);
 			r_ret = get_navigation_layer_layers(index);
 			return true;
 			return true;
 		}
 		}
+#endif // NAVIGATION_2D_DISABLED
 	} else if (components.size() == 2 && components[0].begins_with("custom_data_layer_") && components[0].trim_prefix("custom_data_layer_").is_valid_int()) {
 	} else if (components.size() == 2 && components[0].begins_with("custom_data_layer_") && components[0].trim_prefix("custom_data_layer_").is_valid_int()) {
 		// Custom data layers.
 		// Custom data layers.
 		int index = components[0].trim_prefix("custom_data_layer_").to_int();
 		int index = components[0].trim_prefix("custom_data_layer_").to_int();
@@ -4294,6 +4311,7 @@ void TileSet::_bind_methods() {
 	ClassDB::bind_method(D_METHOD("set_terrain_color", "terrain_set", "terrain_index", "color"), &TileSet::set_terrain_color);
 	ClassDB::bind_method(D_METHOD("set_terrain_color", "terrain_set", "terrain_index", "color"), &TileSet::set_terrain_color);
 	ClassDB::bind_method(D_METHOD("get_terrain_color", "terrain_set", "terrain_index"), &TileSet::get_terrain_color);
 	ClassDB::bind_method(D_METHOD("get_terrain_color", "terrain_set", "terrain_index"), &TileSet::get_terrain_color);
 
 
+#ifndef NAVIGATION_2D_DISABLED
 	// Navigation
 	// Navigation
 	ClassDB::bind_method(D_METHOD("get_navigation_layers_count"), &TileSet::get_navigation_layers_count);
 	ClassDB::bind_method(D_METHOD("get_navigation_layers_count"), &TileSet::get_navigation_layers_count);
 	ClassDB::bind_method(D_METHOD("add_navigation_layer", "to_position"), &TileSet::add_navigation_layer, DEFVAL(-1));
 	ClassDB::bind_method(D_METHOD("add_navigation_layer", "to_position"), &TileSet::add_navigation_layer, DEFVAL(-1));
@@ -4303,6 +4321,7 @@ void TileSet::_bind_methods() {
 	ClassDB::bind_method(D_METHOD("get_navigation_layer_layers", "layer_index"), &TileSet::get_navigation_layer_layers);
 	ClassDB::bind_method(D_METHOD("get_navigation_layer_layers", "layer_index"), &TileSet::get_navigation_layer_layers);
 	ClassDB::bind_method(D_METHOD("set_navigation_layer_layer_value", "layer_index", "layer_number", "value"), &TileSet::set_navigation_layer_layer_value);
 	ClassDB::bind_method(D_METHOD("set_navigation_layer_layer_value", "layer_index", "layer_number", "value"), &TileSet::set_navigation_layer_layer_value);
 	ClassDB::bind_method(D_METHOD("get_navigation_layer_layer_value", "layer_index", "layer_number"), &TileSet::get_navigation_layer_layer_value);
 	ClassDB::bind_method(D_METHOD("get_navigation_layer_layer_value", "layer_index", "layer_number"), &TileSet::get_navigation_layer_layer_value);
+#endif // NAVIGATION_2D_DISABLED
 
 
 	// Custom data
 	// Custom data
 	ClassDB::bind_method(D_METHOD("get_custom_data_layers_count"), &TileSet::get_custom_data_layers_count);
 	ClassDB::bind_method(D_METHOD("get_custom_data_layers_count"), &TileSet::get_custom_data_layers_count);
@@ -4350,7 +4369,9 @@ void TileSet::_bind_methods() {
 	ADD_GROUP("", "");
 	ADD_GROUP("", "");
 	ADD_ARRAY("physics_layers", "physics_layer_");
 	ADD_ARRAY("physics_layers", "physics_layer_");
 	ADD_ARRAY("terrain_sets", "terrain_set_");
 	ADD_ARRAY("terrain_sets", "terrain_set_");
+#ifndef NAVIGATION_2D_DISABLED
 	ADD_ARRAY("navigation_layers", "navigation_layer_");
 	ADD_ARRAY("navigation_layers", "navigation_layer_");
+#endif // NAVIGATION_2D_DISABLED
 	ADD_ARRAY("custom_data_layers", "custom_data_layer_");
 	ADD_ARRAY("custom_data_layers", "custom_data_layer_");
 
 
 	// -- Enum binding --
 	// -- Enum binding --
@@ -4558,6 +4579,7 @@ void TileSetAtlasSource::remove_terrain(int p_terrain_set, int p_index) {
 	}
 	}
 }
 }
 
 
+#ifndef NAVIGATION_2D_DISABLED
 void TileSetAtlasSource::add_navigation_layer(int p_to_pos) {
 void TileSetAtlasSource::add_navigation_layer(int p_to_pos) {
 	for (KeyValue<Vector2i, TileAlternativesData> E_tile : tiles) {
 	for (KeyValue<Vector2i, TileAlternativesData> E_tile : tiles) {
 		for (KeyValue<int, TileData *> E_alternative : E_tile.value.alternatives) {
 		for (KeyValue<int, TileData *> E_alternative : E_tile.value.alternatives) {
@@ -4581,6 +4603,7 @@ void TileSetAtlasSource::remove_navigation_layer(int p_index) {
 		}
 		}
 	}
 	}
 }
 }
+#endif // NAVIGATION_2D_DISABLED
 
 
 void TileSetAtlasSource::add_custom_data_layer(int p_to_pos) {
 void TileSetAtlasSource::add_custom_data_layer(int p_to_pos) {
 	for (KeyValue<Vector2i, TileAlternativesData> E_tile : tiles) {
 	for (KeyValue<Vector2i, TileAlternativesData> E_tile : tiles) {
@@ -5932,7 +5955,9 @@ void TileData::notify_tile_data_properties_should_change() {
 			terrain_peering_bits[bit_index] = -1;
 			terrain_peering_bits[bit_index] = -1;
 		}
 		}
 	}
 	}
+#ifndef NAVIGATION_2D_DISABLED
 	navigation.resize(tile_set->get_navigation_layers_count());
 	navigation.resize(tile_set->get_navigation_layers_count());
+#endif // NAVIGATION_2D_DISABLED
 
 
 	// Convert custom data to the new type.
 	// Convert custom data to the new type.
 	custom_data.resize(tile_set->get_custom_data_layers_count());
 	custom_data.resize(tile_set->get_custom_data_layers_count());
@@ -6071,6 +6096,7 @@ void TileData::remove_terrain(int p_terrain_set, int p_index) {
 	}
 	}
 }
 }
 
 
+#ifndef NAVIGATION_2D_DISABLED
 void TileData::add_navigation_layer(int p_to_pos) {
 void TileData::add_navigation_layer(int p_to_pos) {
 	if (p_to_pos < 0) {
 	if (p_to_pos < 0) {
 		p_to_pos = navigation.size();
 		p_to_pos = navigation.size();
@@ -6090,6 +6116,7 @@ void TileData::remove_navigation_layer(int p_index) {
 	ERR_FAIL_INDEX(p_index, navigation.size());
 	ERR_FAIL_INDEX(p_index, navigation.size());
 	navigation.remove_at(p_index);
 	navigation.remove_at(p_index);
 }
 }
+#endif // NAVIGATION_2D_DISABLED
 
 
 void TileData::add_custom_data_layer(int p_to_pos) {
 void TileData::add_custom_data_layer(int p_to_pos) {
 	if (p_to_pos < 0) {
 	if (p_to_pos < 0) {
@@ -6142,8 +6169,10 @@ TileData *TileData::duplicate() {
 	// Terrain
 	// Terrain
 	output->terrain_set = -1;
 	output->terrain_set = -1;
 	memcpy(output->terrain_peering_bits, terrain_peering_bits, 16 * sizeof(int));
 	memcpy(output->terrain_peering_bits, terrain_peering_bits, 16 * sizeof(int));
+#ifndef NAVIGATION_2D_DISABLED
 	// Navigation
 	// Navigation
 	output->navigation = navigation;
 	output->navigation = navigation;
+#endif // NAVIGATION_2D_DISABLED
 	// Misc
 	// Misc
 	output->probability = probability;
 	output->probability = probability;
 	// Custom data
 	// Custom data
@@ -6531,6 +6560,7 @@ TileSet::TerrainsPattern TileData::get_terrains_pattern() const {
 	return output;
 	return output;
 }
 }
 
 
+#ifndef NAVIGATION_2D_DISABLED
 // Navigation
 // Navigation
 void TileData::set_navigation_polygon(int p_layer_id, Ref<NavigationPolygon> p_navigation_polygon) {
 void TileData::set_navigation_polygon(int p_layer_id, Ref<NavigationPolygon> p_navigation_polygon) {
 	ERR_FAIL_INDEX(p_layer_id, navigation.size());
 	ERR_FAIL_INDEX(p_layer_id, navigation.size());
@@ -6578,6 +6608,7 @@ Ref<NavigationPolygon> TileData::get_navigation_polygon(int p_layer_id, bool p_f
 		return I->value;
 		return I->value;
 	}
 	}
 }
 }
+#endif // NAVIGATION_2D_DISABLED
 
 
 // Misc
 // Misc
 void TileData::set_probability(float p_probability) {
 void TileData::set_probability(float p_probability) {
@@ -6706,9 +6737,9 @@ bool TileData::_set(const StringName &p_name, const Variant &p_value) {
 				return true;
 				return true;
 			}
 			}
 		}
 		}
-	} else
+	}
 #ifndef PHYSICS_2D_DISABLED
 #ifndef PHYSICS_2D_DISABLED
-			if (components.size() >= 2 && components[0].begins_with("physics_layer_") && components[0].trim_prefix("physics_layer_").is_valid_int()) {
+	else if (components.size() >= 2 && components[0].begins_with("physics_layer_") && components[0].trim_prefix("physics_layer_").is_valid_int()) {
 		// Physics layers.
 		// Physics layers.
 		int layer_index = components[0].trim_prefix("physics_layer_").to_int();
 		int layer_index = components[0].trim_prefix("physics_layer_").to_int();
 		ERR_FAIL_COND_V(layer_index < 0, false);
 		ERR_FAIL_COND_V(layer_index < 0, false);
@@ -6763,51 +6794,54 @@ bool TileData::_set(const StringName &p_name, const Variant &p_value) {
 				return true;
 				return true;
 			}
 			}
 		}
 		}
-	} else
+	}
 #endif // PHYSICS_2D_DISABLED
 #endif // PHYSICS_2D_DISABLED
-		if (components.size() == 2 && components[0].begins_with("navigation_layer_") && components[0].trim_prefix("navigation_layer_").is_valid_int()) {
-			// Navigation layers.
-			int layer_index = components[0].trim_prefix("navigation_layer_").to_int();
-			ERR_FAIL_COND_V(layer_index < 0, false);
-			if (components[1] == "polygon") {
-				Ref<NavigationPolygon> polygon = p_value;
-
-				if (layer_index >= navigation.size()) {
-					if (tile_set) {
-						return false;
-					} else {
-						navigation.resize(layer_index + 1);
-					}
-				}
-				set_navigation_polygon(layer_index, polygon);
-				return true;
-			}
-		} else if (components.size() == 2 && components[0] == "terrains_peering_bit") {
-			// Terrains.
-			for (int i = 0; i < TileSet::CELL_NEIGHBOR_MAX; i++) {
-				TileSet::CellNeighbor bit = TileSet::CellNeighbor(i);
-				if (components[1] == TileSet::CELL_NEIGHBOR_ENUM_TO_TEXT[i]) {
-					set_terrain_peering_bit(bit, p_value);
-					return true;
-				}
-			}
-			return false;
-		} else if (components.size() == 1 && components[0].begins_with("custom_data_") && components[0].trim_prefix("custom_data_").is_valid_int()) {
-			// Custom data layers.
-			int layer_index = components[0].trim_prefix("custom_data_").to_int();
-			ERR_FAIL_COND_V(layer_index < 0, false);
+#ifndef NAVIGATION_2D_DISABLED
+	else if (components.size() == 2 && components[0].begins_with("navigation_layer_") && components[0].trim_prefix("navigation_layer_").is_valid_int()) {
+		// Navigation layers.
+		int layer_index = components[0].trim_prefix("navigation_layer_").to_int();
+		ERR_FAIL_COND_V(layer_index < 0, false);
+		if (components[1] == "polygon") {
+			Ref<NavigationPolygon> polygon = p_value;
 
 
-			if (layer_index >= custom_data.size()) {
+			if (layer_index >= navigation.size()) {
 				if (tile_set) {
 				if (tile_set) {
 					return false;
 					return false;
 				} else {
 				} else {
-					custom_data.resize(layer_index + 1);
+					navigation.resize(layer_index + 1);
 				}
 				}
 			}
 			}
-			set_custom_data_by_layer_id(layer_index, p_value);
-
+			set_navigation_polygon(layer_index, polygon);
 			return true;
 			return true;
 		}
 		}
+	}
+#endif // NAVIGATION_2D_DISABLED
+	else if (components.size() == 2 && components[0] == "terrains_peering_bit") {
+		// Terrains.
+		for (int i = 0; i < TileSet::CELL_NEIGHBOR_MAX; i++) {
+			TileSet::CellNeighbor bit = TileSet::CellNeighbor(i);
+			if (components[1] == TileSet::CELL_NEIGHBOR_ENUM_TO_TEXT[i]) {
+				set_terrain_peering_bit(bit, p_value);
+				return true;
+			}
+		}
+		return false;
+	} else if (components.size() == 1 && components[0].begins_with("custom_data_") && components[0].trim_prefix("custom_data_").is_valid_int()) {
+		// Custom data layers.
+		int layer_index = components[0].trim_prefix("custom_data_").to_int();
+		ERR_FAIL_COND_V(layer_index < 0, false);
+
+		if (layer_index >= custom_data.size()) {
+			if (tile_set) {
+				return false;
+			} else {
+				custom_data.resize(layer_index + 1);
+			}
+		}
+		set_custom_data_by_layer_id(layer_index, p_value);
+
+		return true;
+	}
 
 
 	return false;
 	return false;
 }
 }
@@ -6854,9 +6888,9 @@ bool TileData::_get(const StringName &p_name, Variant &r_ret) const {
 					return true;
 					return true;
 				}
 				}
 			}
 			}
-		} else
+		}
 #ifndef PHYSICS_2D_DISABLED
 #ifndef PHYSICS_2D_DISABLED
-				if (components.size() >= 2 && components[0].begins_with("physics_layer_") && components[0].trim_prefix("physics_layer_").is_valid_int()) {
+		else if (components.size() >= 2 && components[0].begins_with("physics_layer_") && components[0].trim_prefix("physics_layer_").is_valid_int()) {
 			// Physics layers.
 			// Physics layers.
 			int layer_index = components[0].trim_prefix("physics_layer_").to_int();
 			int layer_index = components[0].trim_prefix("physics_layer_").to_int();
 			ERR_FAIL_COND_V(layer_index < 0, false);
 			ERR_FAIL_COND_V(layer_index < 0, false);
@@ -6892,38 +6926,32 @@ bool TileData::_get(const StringName &p_name, Variant &r_ret) const {
 					return true;
 					return true;
 				}
 				}
 			}
 			}
-		} else
+		}
 #endif // PHYSICS_2D_DISABLED
 #endif // PHYSICS_2D_DISABLED
-			if (components.size() == 2 && components[0] == "terrains_peering_bit") {
-				// Terrains.
-				for (int i = 0; i < TileSet::CELL_NEIGHBOR_MAX; i++) {
-					if (components[1] == TileSet::CELL_NEIGHBOR_ENUM_TO_TEXT[i]) {
-						r_ret = terrain_peering_bits[i];
-						return true;
-					}
-				}
-				return false;
-			} else if (components.size() == 2 && components[0].begins_with("navigation_layer_") && components[0].trim_prefix("navigation_layer_").is_valid_int()) {
-				// Occlusion layers.
-				int layer_index = components[0].trim_prefix("navigation_layer_").to_int();
-				ERR_FAIL_COND_V(layer_index < 0, false);
-				if (layer_index >= navigation.size()) {
-					return false;
-				}
-				if (components[1] == "polygon") {
-					r_ret = get_navigation_polygon(layer_index);
+		else if (components.size() == 2 && components[0] == "terrains_peering_bit") {
+			// Terrains.
+			for (int i = 0; i < TileSet::CELL_NEIGHBOR_MAX; i++) {
+				if (components[1] == TileSet::CELL_NEIGHBOR_ENUM_TO_TEXT[i]) {
+					r_ret = terrain_peering_bits[i];
 					return true;
 					return true;
 				}
 				}
-			} else if (components.size() == 1 && components[0].begins_with("custom_data_") && components[0].trim_prefix("custom_data_").is_valid_int()) {
-				// Custom data layers.
-				int layer_index = components[0].trim_prefix("custom_data_").to_int();
-				ERR_FAIL_COND_V(layer_index < 0, false);
-				if (layer_index >= custom_data.size()) {
-					return false;
-				}
-				r_ret = get_custom_data_by_layer_id(layer_index);
+			}
+			return false;
+		}
+#ifndef NAVIGATION_2D_DISABLED
+		else if (components.size() == 2 && components[0].begins_with("navigation_layer_") && components[0].trim_prefix("navigation_layer_").is_valid_int()) {
+			// Occlusion layers.
+			int layer_index = components[0].trim_prefix("navigation_layer_").to_int();
+			ERR_FAIL_COND_V(layer_index < 0, false);
+			if (layer_index >= navigation.size()) {
+				return false;
+			}
+			if (components[1] == "polygon") {
+				r_ret = get_navigation_polygon(layer_index);
 				return true;
 				return true;
 			}
 			}
+		}
+#endif // NAVIGATION_2D_DISABLED
 	}
 	}
 
 
 	return false;
 	return false;
@@ -7007,6 +7035,7 @@ void TileData::_get_property_list(List<PropertyInfo> *p_list) const {
 			}
 			}
 		}
 		}
 
 
+#ifndef NAVIGATION_2D_DISABLED
 		// Navigation layers.
 		// Navigation layers.
 		p_list->push_back(PropertyInfo(Variant::NIL, GNAME("Navigation", ""), PROPERTY_HINT_NONE, "", PROPERTY_USAGE_GROUP));
 		p_list->push_back(PropertyInfo(Variant::NIL, GNAME("Navigation", ""), PROPERTY_HINT_NONE, "", PROPERTY_USAGE_GROUP));
 		for (int i = 0; i < navigation.size(); i++) {
 		for (int i = 0; i < navigation.size(); i++) {
@@ -7016,6 +7045,7 @@ void TileData::_get_property_list(List<PropertyInfo> *p_list) const {
 			}
 			}
 			p_list->push_back(property_info);
 			p_list->push_back(property_info);
 		}
 		}
+#endif // NAVIGATION_2D_DISABLED
 
 
 		// Custom data layers.
 		// Custom data layers.
 		p_list->push_back(PropertyInfo(Variant::NIL, GNAME("Custom Data", "custom_data_"), PROPERTY_HINT_NONE, "custom_data_", PROPERTY_USAGE_GROUP));
 		p_list->push_back(PropertyInfo(Variant::NIL, GNAME("Custom Data", "custom_data_"), PROPERTY_HINT_NONE, "custom_data_", PROPERTY_USAGE_GROUP));
@@ -7090,9 +7120,11 @@ void TileData::_bind_methods() {
 	ClassDB::bind_method(D_METHOD("get_terrain_peering_bit", "peering_bit"), &TileData::get_terrain_peering_bit);
 	ClassDB::bind_method(D_METHOD("get_terrain_peering_bit", "peering_bit"), &TileData::get_terrain_peering_bit);
 	ClassDB::bind_method(D_METHOD("is_valid_terrain_peering_bit", "peering_bit"), &TileData::is_valid_terrain_peering_bit);
 	ClassDB::bind_method(D_METHOD("is_valid_terrain_peering_bit", "peering_bit"), &TileData::is_valid_terrain_peering_bit);
 
 
+#ifndef NAVIGATION_2D_DISABLED
 	// Navigation
 	// Navigation
 	ClassDB::bind_method(D_METHOD("set_navigation_polygon", "layer_id", "navigation_polygon"), &TileData::set_navigation_polygon);
 	ClassDB::bind_method(D_METHOD("set_navigation_polygon", "layer_id", "navigation_polygon"), &TileData::set_navigation_polygon);
 	ClassDB::bind_method(D_METHOD("get_navigation_polygon", "layer_id", "flip_h", "flip_v", "transpose"), &TileData::get_navigation_polygon, DEFVAL(false), DEFVAL(false), DEFVAL(false));
 	ClassDB::bind_method(D_METHOD("get_navigation_polygon", "layer_id", "flip_h", "flip_v", "transpose"), &TileData::get_navigation_polygon, DEFVAL(false), DEFVAL(false), DEFVAL(false));
+#endif // NAVIGATION_2D_DISABLED
 
 
 	// Misc.
 	// Misc.
 	ClassDB::bind_method(D_METHOD("set_probability", "probability"), &TileData::set_probability);
 	ClassDB::bind_method(D_METHOD("set_probability", "probability"), &TileData::set_probability);

+ 21 - 12
scene/resources/2d/tile_set.h

@@ -36,13 +36,17 @@
 #include "core/templates/rb_set.h"
 #include "core/templates/rb_set.h"
 #include "scene/2d/light_occluder_2d.h"
 #include "scene/2d/light_occluder_2d.h"
 #include "scene/main/canvas_item.h"
 #include "scene/main/canvas_item.h"
+#include "scene/resources/image_texture.h"
+#include "scene/resources/packed_scene.h"
+#include "scene/resources/physics_material.h"
+
 #ifndef PHYSICS_2D_DISABLED
 #ifndef PHYSICS_2D_DISABLED
 #include "scene/resources/2d/convex_polygon_shape_2d.h"
 #include "scene/resources/2d/convex_polygon_shape_2d.h"
 #endif // PHYSICS_2D_DISABLED
 #endif // PHYSICS_2D_DISABLED
+
+#ifndef NAVIGATION_2D_DISABLED
 #include "scene/resources/2d/navigation_polygon.h"
 #include "scene/resources/2d/navigation_polygon.h"
-#include "scene/resources/image_texture.h"
-#include "scene/resources/packed_scene.h"
-#include "scene/resources/physics_material.h"
+#endif // NAVIGATION_2D_DISABLED
 
 
 #ifndef DISABLE_DEPRECATED
 #ifndef DISABLE_DEPRECATED
 #include "scene/resources/shader.h"
 #include "scene/resources/shader.h"
@@ -53,12 +57,6 @@ class TileSetSource;
 class TileSetAtlasSource;
 class TileSetAtlasSource;
 class TileData;
 class TileData;
 
 
-// Forward-declare the plugins.
-class TileSetPlugin;
-class TileSetPluginAtlasRendering;
-class TileSetPluginAtlasPhysics;
-class TileSetPluginAtlasNavigation;
-
 union TileMapCell {
 union TileMapCell {
 	struct {
 	struct {
 		int16_t source_id;
 		int16_t source_id;
@@ -178,14 +176,18 @@ private:
 		int autotile_spacing = 0;
 		int autotile_spacing = 0;
 		HashMap<Vector2i, int> autotile_bitmask_flags;
 		HashMap<Vector2i, int> autotile_bitmask_flags;
 		HashMap<Vector2i, Ref<OccluderPolygon2D>> autotile_occluder_map;
 		HashMap<Vector2i, Ref<OccluderPolygon2D>> autotile_occluder_map;
+#ifndef NAVIGATION_2D_DISABLED
 		HashMap<Vector2i, Ref<NavigationPolygon>> autotile_navpoly_map;
 		HashMap<Vector2i, Ref<NavigationPolygon>> autotile_navpoly_map;
+#endif // NAVIGATION_2D_DISABLED
 		HashMap<Vector2i, int> autotile_priority_map;
 		HashMap<Vector2i, int> autotile_priority_map;
 		HashMap<Vector2i, int> autotile_z_index_map;
 		HashMap<Vector2i, int> autotile_z_index_map;
 
 
 		Vector<CompatibilityShapeData> shapes;
 		Vector<CompatibilityShapeData> shapes;
 		Ref<OccluderPolygon2D> occluder;
 		Ref<OccluderPolygon2D> occluder;
 		Vector2 occluder_offset;
 		Vector2 occluder_offset;
+#ifndef NAVIGATION_2D_DISABLED
 		Ref<NavigationPolygon> navigation;
 		Ref<NavigationPolygon> navigation;
+#endif // NAVIGATION_2D_DISABLED
 		Vector2 navigation_offset;
 		Vector2 navigation_offset;
 		int z_index = 0;
 		int z_index = 0;
 	};
 	};
@@ -406,9 +408,6 @@ protected:
 	static void _bind_methods();
 	static void _bind_methods();
 
 
 public:
 public:
-	// --- Plugins ---
-	Vector<TileSetPlugin *> get_tile_set_atlas_plugins() const;
-
 	// --- Accessors for TileSet data ---
 	// --- Accessors for TileSet data ---
 
 
 	// -- Shape and layout --
 	// -- Shape and layout --
@@ -481,6 +480,7 @@ public:
 	bool is_valid_terrain_peering_bit_for_mode(TileSet::TerrainMode p_terrain_mode, TileSet::CellNeighbor p_peering_bit) const;
 	bool is_valid_terrain_peering_bit_for_mode(TileSet::TerrainMode p_terrain_mode, TileSet::CellNeighbor p_peering_bit) const;
 	bool is_valid_terrain_peering_bit(int p_terrain_set, TileSet::CellNeighbor p_peering_bit) const;
 	bool is_valid_terrain_peering_bit(int p_terrain_set, TileSet::CellNeighbor p_peering_bit) const;
 
 
+#ifndef NAVIGATION_2D_DISABLED
 	// Navigation
 	// Navigation
 	int get_navigation_layers_count() const;
 	int get_navigation_layers_count() const;
 	void add_navigation_layer(int p_index = -1);
 	void add_navigation_layer(int p_index = -1);
@@ -490,6 +490,7 @@ public:
 	uint32_t get_navigation_layer_layers(int p_layer_index) const;
 	uint32_t get_navigation_layer_layers(int p_layer_index) const;
 	void set_navigation_layer_layer_value(int p_layer_index, int p_layer_number, bool p_value);
 	void set_navigation_layer_layer_value(int p_layer_index, int p_layer_number, bool p_value);
 	bool get_navigation_layer_layer_value(int p_layer_index, int p_layer_number) const;
 	bool get_navigation_layer_layer_value(int p_layer_index, int p_layer_number) const;
+#endif // NAVIGATION_2D_DISABLED
 
 
 	// Custom data
 	// Custom data
 	int get_custom_data_layers_count() const;
 	int get_custom_data_layers_count() const;
@@ -704,9 +705,11 @@ public:
 	virtual void add_terrain(int p_terrain_set, int p_index) override;
 	virtual void add_terrain(int p_terrain_set, int p_index) override;
 	virtual void move_terrain(int p_terrain_set, int p_from_index, int p_to_pos) override;
 	virtual void move_terrain(int p_terrain_set, int p_from_index, int p_to_pos) override;
 	virtual void remove_terrain(int p_terrain_set, int p_index) override;
 	virtual void remove_terrain(int p_terrain_set, int p_index) override;
+#ifndef NAVIGATION_2D_DISABLED
 	virtual void add_navigation_layer(int p_index) override;
 	virtual void add_navigation_layer(int p_index) override;
 	virtual void move_navigation_layer(int p_from_index, int p_to_pos) override;
 	virtual void move_navigation_layer(int p_from_index, int p_to_pos) override;
 	virtual void remove_navigation_layer(int p_index) override;
 	virtual void remove_navigation_layer(int p_index) override;
+#endif // NAVIGATION_2D_DISABLED
 	virtual void add_custom_data_layer(int p_index) override;
 	virtual void add_custom_data_layer(int p_index) override;
 	virtual void move_custom_data_layer(int p_from_index, int p_to_pos) override;
 	virtual void move_custom_data_layer(int p_from_index, int p_to_pos) override;
 	virtual void remove_custom_data_layer(int p_index) override;
 	virtual void remove_custom_data_layer(int p_index) override;
@@ -886,12 +889,14 @@ private:
 	int terrain = -1;
 	int terrain = -1;
 	int terrain_peering_bits[16] = { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 };
 	int terrain_peering_bits[16] = { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 };
 
 
+#ifndef NAVIGATION_2D_DISABLED
 	// Navigation
 	// Navigation
 	struct NavigationLayerTileData {
 	struct NavigationLayerTileData {
 		Ref<NavigationPolygon> navigation_polygon;
 		Ref<NavigationPolygon> navigation_polygon;
 		mutable HashMap<int, Ref<NavigationPolygon>> transformed_navigation_polygon;
 		mutable HashMap<int, Ref<NavigationPolygon>> transformed_navigation_polygon;
 	};
 	};
 	Vector<NavigationLayerTileData> navigation;
 	Vector<NavigationLayerTileData> navigation;
+#endif // NAVIGATION_2D_DISABLED
 
 
 	// Misc
 	// Misc
 	double probability = 1.0;
 	double probability = 1.0;
@@ -906,7 +911,9 @@ protected:
 	static void _bind_methods();
 	static void _bind_methods();
 
 
 #ifndef DISABLE_DEPRECATED
 #ifndef DISABLE_DEPRECATED
+#ifndef NAVIGATION_2D_DISABLED
 	Ref<NavigationPolygon> _get_navigation_polygon_bind_compat_84660(int p_layer_id) const;
 	Ref<NavigationPolygon> _get_navigation_polygon_bind_compat_84660(int p_layer_id) const;
+#endif // NAVIGATION_2D_DISABLED
 	Ref<OccluderPolygon2D> _get_occluder_bind_compat_84660(int p_layer_id) const;
 	Ref<OccluderPolygon2D> _get_occluder_bind_compat_84660(int p_layer_id) const;
 
 
 	static void _bind_compatibility_methods();
 	static void _bind_compatibility_methods();
@@ -1004,9 +1011,11 @@ public:
 
 
 	TileSet::TerrainsPattern get_terrains_pattern() const; // Not exposed.
 	TileSet::TerrainsPattern get_terrains_pattern() const; // Not exposed.
 
 
+#ifndef NAVIGATION_2D_DISABLED
 	// Navigation
 	// Navigation
 	void set_navigation_polygon(int p_layer_id, Ref<NavigationPolygon> p_navigation_polygon);
 	void set_navigation_polygon(int p_layer_id, Ref<NavigationPolygon> p_navigation_polygon);
 	Ref<NavigationPolygon> get_navigation_polygon(int p_layer_id, bool p_flip_h = false, bool p_flip_v = false, bool p_transpose = false) const;
 	Ref<NavigationPolygon> get_navigation_polygon(int p_layer_id, bool p_flip_h = false, bool p_flip_v = false, bool p_transpose = false) const;
+#endif // NAVIGATION_2D_DISABLED
 
 
 	// Misc
 	// Misc
 	void set_probability(float p_probability);
 	void set_probability(float p_probability);

+ 2 - 1
scene/resources/3d/SCsub

@@ -6,7 +6,6 @@ Import("env")
 env.add_source_files(env.scene_sources, "fog_material.cpp")
 env.add_source_files(env.scene_sources, "fog_material.cpp")
 env.add_source_files(env.scene_sources, "importer_mesh.cpp")
 env.add_source_files(env.scene_sources, "importer_mesh.cpp")
 env.add_source_files(env.scene_sources, "mesh_library.cpp")
 env.add_source_files(env.scene_sources, "mesh_library.cpp")
-env.add_source_files(env.scene_sources, "navigation_mesh_source_geometry_data_3d.cpp")
 env.add_source_files(env.scene_sources, "primitive_meshes.cpp")
 env.add_source_files(env.scene_sources, "primitive_meshes.cpp")
 env.add_source_files(env.scene_sources, "skin.cpp")
 env.add_source_files(env.scene_sources, "skin.cpp")
 env.add_source_files(env.scene_sources, "sky_material.cpp")
 env.add_source_files(env.scene_sources, "sky_material.cpp")
@@ -25,3 +24,5 @@ if not env["disable_physics_3d"]:
     env.add_source_files(env.scene_sources, "shape_3d.cpp")
     env.add_source_files(env.scene_sources, "shape_3d.cpp")
     env.add_source_files(env.scene_sources, "sphere_shape_3d.cpp")
     env.add_source_files(env.scene_sources, "sphere_shape_3d.cpp")
     env.add_source_files(env.scene_sources, "world_boundary_shape_3d.cpp")
     env.add_source_files(env.scene_sources, "world_boundary_shape_3d.cpp")
+if not env["disable_navigation_3d"]:
+    env.add_source_files(env.scene_sources, "navigation_mesh_source_geometry_data_3d.cpp")

+ 15 - 1
scene/resources/world_2d.cpp

@@ -32,9 +32,12 @@
 
 
 #include "core/config/project_settings.h"
 #include "core/config/project_settings.h"
 #include "scene/2d/visible_on_screen_notifier_2d.h"
 #include "scene/2d/visible_on_screen_notifier_2d.h"
-#include "servers/navigation_server_2d.h"
 #include "servers/rendering_server.h"
 #include "servers/rendering_server.h"
 
 
+#ifndef NAVIGATION_2D_DISABLED
+#include "servers/navigation_server_2d.h"
+#endif // NAVIGATION_2D_DISABLED
+
 RID World2D::get_canvas() const {
 RID World2D::get_canvas() const {
 	return canvas;
 	return canvas;
 }
 }
@@ -53,6 +56,7 @@ RID World2D::get_space() const {
 }
 }
 #endif // PHYSICS_2D_DISABLED
 #endif // PHYSICS_2D_DISABLED
 
 
+#ifndef NAVIGATION_2D_DISABLED
 RID World2D::get_navigation_map() const {
 RID World2D::get_navigation_map() const {
 	if (navigation_map.is_null()) {
 	if (navigation_map.is_null()) {
 		navigation_map = NavigationServer2D::get_singleton()->map_create();
 		navigation_map = NavigationServer2D::get_singleton()->map_create();
@@ -64,6 +68,7 @@ RID World2D::get_navigation_map() const {
 	}
 	}
 	return navigation_map;
 	return navigation_map;
 }
 }
+#endif // NAVIGATION_2D_DISABLED
 
 
 #ifndef PHYSICS_2D_DISABLED
 #ifndef PHYSICS_2D_DISABLED
 PhysicsDirectSpaceState2D *World2D::get_direct_space_state() {
 PhysicsDirectSpaceState2D *World2D::get_direct_space_state() {
@@ -73,14 +78,18 @@ PhysicsDirectSpaceState2D *World2D::get_direct_space_state() {
 
 
 void World2D::_bind_methods() {
 void World2D::_bind_methods() {
 	ClassDB::bind_method(D_METHOD("get_canvas"), &World2D::get_canvas);
 	ClassDB::bind_method(D_METHOD("get_canvas"), &World2D::get_canvas);
+#ifndef NAVIGATION_2D_DISABLED
 	ClassDB::bind_method(D_METHOD("get_navigation_map"), &World2D::get_navigation_map);
 	ClassDB::bind_method(D_METHOD("get_navigation_map"), &World2D::get_navigation_map);
+#endif // NAVIGATION_2D_DISABLED
 #ifndef PHYSICS_2D_DISABLED
 #ifndef PHYSICS_2D_DISABLED
 	ClassDB::bind_method(D_METHOD("get_space"), &World2D::get_space);
 	ClassDB::bind_method(D_METHOD("get_space"), &World2D::get_space);
 	ClassDB::bind_method(D_METHOD("get_direct_space_state"), &World2D::get_direct_space_state);
 	ClassDB::bind_method(D_METHOD("get_direct_space_state"), &World2D::get_direct_space_state);
 #endif // PHYSICS_2D_DISABLED
 #endif // PHYSICS_2D_DISABLED
 
 
 	ADD_PROPERTY(PropertyInfo(Variant::RID, "canvas", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NONE), "", "get_canvas");
 	ADD_PROPERTY(PropertyInfo(Variant::RID, "canvas", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NONE), "", "get_canvas");
+#ifndef NAVIGATION_2D_DISABLED
 	ADD_PROPERTY(PropertyInfo(Variant::RID, "navigation_map", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NONE), "", "get_navigation_map");
 	ADD_PROPERTY(PropertyInfo(Variant::RID, "navigation_map", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NONE), "", "get_navigation_map");
+#endif // NAVIGATION_2D_DISABLED
 #ifndef PHYSICS_2D_DISABLED
 #ifndef PHYSICS_2D_DISABLED
 	ADD_PROPERTY(PropertyInfo(Variant::RID, "space", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NONE), "", "get_space");
 	ADD_PROPERTY(PropertyInfo(Variant::RID, "space", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NONE), "", "get_space");
 	ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "direct_space_state", PROPERTY_HINT_RESOURCE_TYPE, "PhysicsDirectSpaceState2D", PROPERTY_USAGE_NONE), "", "get_direct_space_state");
 	ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "direct_space_state", PROPERTY_HINT_RESOURCE_TYPE, "PhysicsDirectSpaceState2D", PROPERTY_USAGE_NONE), "", "get_direct_space_state");
@@ -104,14 +113,19 @@ World2D::~World2D() {
 #ifndef PHYSICS_2D_DISABLED
 #ifndef PHYSICS_2D_DISABLED
 	ERR_FAIL_NULL(PhysicsServer2D::get_singleton());
 	ERR_FAIL_NULL(PhysicsServer2D::get_singleton());
 #endif // PHYSICS_2D_DISABLED
 #endif // PHYSICS_2D_DISABLED
+#ifndef NAVIGATION_2D_DISABLED
 	ERR_FAIL_NULL(NavigationServer2D::get_singleton());
 	ERR_FAIL_NULL(NavigationServer2D::get_singleton());
+#endif // NAVIGATION_2D_DISABLED
+
 	RenderingServer::get_singleton()->free(canvas);
 	RenderingServer::get_singleton()->free(canvas);
 #ifndef PHYSICS_2D_DISABLED
 #ifndef PHYSICS_2D_DISABLED
 	if (space.is_valid()) {
 	if (space.is_valid()) {
 		PhysicsServer2D::get_singleton()->free(space);
 		PhysicsServer2D::get_singleton()->free(space);
 	}
 	}
 #endif // PHYSICS_2D_DISABLED
 #endif // PHYSICS_2D_DISABLED
+#ifndef NAVIGATION_2D_DISABLED
 	if (navigation_map.is_valid()) {
 	if (navigation_map.is_valid()) {
 		NavigationServer2D::get_singleton()->free(navigation_map);
 		NavigationServer2D::get_singleton()->free(navigation_map);
 	}
 	}
+#endif // NAVIGATION_2D_DISABLED
 }
 }

+ 4 - 0
scene/resources/world_2d.h

@@ -45,7 +45,9 @@ class World2D : public Resource {
 
 
 	RID canvas;
 	RID canvas;
 	mutable RID space;
 	mutable RID space;
+#ifndef NAVIGATION_2D_DISABLED
 	mutable RID navigation_map;
 	mutable RID navigation_map;
+#endif // NAVIGATION_2D_DISABLED
 
 
 	HashSet<Viewport *> viewports;
 	HashSet<Viewport *> viewports;
 
 
@@ -55,7 +57,9 @@ protected:
 
 
 public:
 public:
 	RID get_canvas() const;
 	RID get_canvas() const;
+#ifndef NAVIGATION_2D_DISABLED
 	RID get_navigation_map() const;
 	RID get_navigation_map() const;
+#endif // NAVIGATION_2D_DISABLED
 
 
 #ifndef PHYSICS_2D_DISABLED
 #ifndef PHYSICS_2D_DISABLED
 	RID get_space() const;
 	RID get_space() const;

+ 7 - 1
servers/navigation/SCsub

@@ -3,4 +3,10 @@ from misc.utility.scons_hints import *
 
 
 Import("env")
 Import("env")
 
 
-env.add_source_files(env.servers_sources, "*.cpp")
+if not env["disable_navigation_2d"]:
+    env.add_source_files(env.servers_sources, "navigation_path_query_parameters_2d.cpp")
+    env.add_source_files(env.servers_sources, "navigation_path_query_result_2d.cpp")
+
+if not env["disable_navigation_3d"]:
+    env.add_source_files(env.servers_sources, "navigation_path_query_parameters_3d.cpp")
+    env.add_source_files(env.servers_sources, "navigation_path_query_result_3d.cpp")

+ 13 - 1
servers/register_server_types.cpp

@@ -80,15 +80,19 @@
 #include "text_server.h"
 #include "text_server.h"
 
 
 // 2D physics and navigation.
 // 2D physics and navigation.
+#ifndef NAVIGATION_2D_DISABLED
 #include "navigation_server_2d.h"
 #include "navigation_server_2d.h"
+#endif // NAVIGATION_2D_DISABLED
 #ifndef PHYSICS_2D_DISABLED
 #ifndef PHYSICS_2D_DISABLED
 #include "physics_server_2d.h"
 #include "physics_server_2d.h"
 #include "physics_server_2d_dummy.h"
 #include "physics_server_2d_dummy.h"
 #include "servers/extensions/physics_server_2d_extension.h"
 #include "servers/extensions/physics_server_2d_extension.h"
 #endif // PHYSICS_2D_DISABLED
 #endif // PHYSICS_2D_DISABLED
 
 
-// 3D physics and navigation (3D navigation is needed for 2D).
+// 3D physics and navigation.
+#ifndef NAVIGATION_3D_DISABLED
 #include "navigation_server_3d.h"
 #include "navigation_server_3d.h"
+#endif // NAVIGATION_3D_DISABLED
 #ifndef PHYSICS_3D_DISABLED
 #ifndef PHYSICS_3D_DISABLED
 #include "physics_server_3d.h"
 #include "physics_server_3d.h"
 #include "physics_server_3d_dummy.h"
 #include "physics_server_3d_dummy.h"
@@ -282,9 +286,11 @@ void register_server_types() {
 	PhysicsServer2DManager::get_singleton()->register_server("Dummy", callable_mp_static(_create_dummy_physics_server_2d));
 	PhysicsServer2DManager::get_singleton()->register_server("Dummy", callable_mp_static(_create_dummy_physics_server_2d));
 #endif // PHYSICS_2D_DISABLED
 #endif // PHYSICS_2D_DISABLED
 
 
+#ifndef NAVIGATION_2D_DISABLED
 	GDREGISTER_ABSTRACT_CLASS(NavigationServer2D);
 	GDREGISTER_ABSTRACT_CLASS(NavigationServer2D);
 	GDREGISTER_CLASS(NavigationPathQueryParameters2D);
 	GDREGISTER_CLASS(NavigationPathQueryParameters2D);
 	GDREGISTER_CLASS(NavigationPathQueryResult2D);
 	GDREGISTER_CLASS(NavigationPathQueryResult2D);
+#endif // NAVIGATION_2D_DISABLED
 
 
 #ifndef PHYSICS_3D_DISABLED
 #ifndef PHYSICS_3D_DISABLED
 	// Physics 3D
 	// Physics 3D
@@ -330,9 +336,11 @@ void register_server_types() {
 	GDREGISTER_ABSTRACT_CLASS(XRTracker);
 	GDREGISTER_ABSTRACT_CLASS(XRTracker);
 #endif // XR_DISABLED
 #endif // XR_DISABLED
 
 
+#ifndef NAVIGATION_3D_DISABLED
 	GDREGISTER_ABSTRACT_CLASS(NavigationServer3D);
 	GDREGISTER_ABSTRACT_CLASS(NavigationServer3D);
 	GDREGISTER_CLASS(NavigationPathQueryParameters3D);
 	GDREGISTER_CLASS(NavigationPathQueryParameters3D);
 	GDREGISTER_CLASS(NavigationPathQueryResult3D);
 	GDREGISTER_CLASS(NavigationPathQueryResult3D);
+#endif // NAVIGATION_3D_DISABLED
 
 
 	writer_mjpeg = memnew(MovieWriterMJPEG);
 	writer_mjpeg = memnew(MovieWriterMJPEG);
 	MovieWriter::add_writer(writer_mjpeg);
 	MovieWriter::add_writer(writer_mjpeg);
@@ -361,8 +369,12 @@ void register_server_singletons() {
 	Engine::get_singleton()->add_singleton(Engine::Singleton("CameraServer", CameraServer::get_singleton(), "CameraServer"));
 	Engine::get_singleton()->add_singleton(Engine::Singleton("CameraServer", CameraServer::get_singleton(), "CameraServer"));
 	Engine::get_singleton()->add_singleton(Engine::Singleton("DisplayServer", DisplayServer::get_singleton(), "DisplayServer"));
 	Engine::get_singleton()->add_singleton(Engine::Singleton("DisplayServer", DisplayServer::get_singleton(), "DisplayServer"));
 	Engine::get_singleton()->add_singleton(Engine::Singleton("NativeMenu", NativeMenu::get_singleton(), "NativeMenu"));
 	Engine::get_singleton()->add_singleton(Engine::Singleton("NativeMenu", NativeMenu::get_singleton(), "NativeMenu"));
+#ifndef NAVIGATION_2D_DISABLED
 	Engine::get_singleton()->add_singleton(Engine::Singleton("NavigationServer2D", NavigationServer2D::get_singleton(), "NavigationServer2D"));
 	Engine::get_singleton()->add_singleton(Engine::Singleton("NavigationServer2D", NavigationServer2D::get_singleton(), "NavigationServer2D"));
+#endif // NAVIGATION_2D_DISABLED
+#ifndef NAVIGATION_3D_DISABLED
 	Engine::get_singleton()->add_singleton(Engine::Singleton("NavigationServer3D", NavigationServer3D::get_singleton(), "NavigationServer3D"));
 	Engine::get_singleton()->add_singleton(Engine::Singleton("NavigationServer3D", NavigationServer3D::get_singleton(), "NavigationServer3D"));
+#endif // NAVIGATION_3D_DISABLED
 	Engine::get_singleton()->add_singleton(Engine::Singleton("RenderingServer", RenderingServer::get_singleton(), "RenderingServer"));
 	Engine::get_singleton()->add_singleton(Engine::Singleton("RenderingServer", RenderingServer::get_singleton(), "RenderingServer"));
 
 
 #ifndef PHYSICS_2D_DISABLED
 #ifndef PHYSICS_2D_DISABLED

+ 1 - 1
tests/scene/test_navigation_agent_2d.h

@@ -30,7 +30,7 @@
 
 
 #pragma once
 #pragma once
 
 
-#include "scene/2d/navigation_agent_2d.h"
+#include "scene/2d/navigation/navigation_agent_2d.h"
 #include "scene/2d/node_2d.h"
 #include "scene/2d/node_2d.h"
 #include "scene/main/window.h"
 #include "scene/main/window.h"
 #include "scene/resources/world_2d.h"
 #include "scene/resources/world_2d.h"

+ 1 - 1
tests/scene/test_navigation_agent_3d.h

@@ -30,7 +30,7 @@
 
 
 #pragma once
 #pragma once
 
 
-#include "scene/3d/navigation_agent_3d.h"
+#include "scene/3d/navigation/navigation_agent_3d.h"
 #include "scene/3d/node_3d.h"
 #include "scene/3d/node_3d.h"
 #include "scene/main/window.h"
 #include "scene/main/window.h"
 
 

+ 1 - 1
tests/scene/test_navigation_obstacle_2d.h

@@ -30,7 +30,7 @@
 
 
 #pragma once
 #pragma once
 
 
-#include "scene/2d/navigation_obstacle_2d.h"
+#include "scene/2d/navigation/navigation_obstacle_2d.h"
 #include "scene/main/window.h"
 #include "scene/main/window.h"
 
 
 #include "tests/test_macros.h"
 #include "tests/test_macros.h"

+ 1 - 1
tests/scene/test_navigation_obstacle_3d.h

@@ -30,7 +30,7 @@
 
 
 #pragma once
 #pragma once
 
 
-#include "scene/3d/navigation_obstacle_3d.h"
+#include "scene/3d/navigation/navigation_obstacle_3d.h"
 #include "scene/main/window.h"
 #include "scene/main/window.h"
 
 
 #include "tests/test_macros.h"
 #include "tests/test_macros.h"

+ 1 - 1
tests/scene/test_navigation_region_2d.h

@@ -30,7 +30,7 @@
 
 
 #pragma once
 #pragma once
 
 
-#include "scene/2d/navigation_region_2d.h"
+#include "scene/2d/navigation/navigation_region_2d.h"
 #include "scene/main/window.h"
 #include "scene/main/window.h"
 
 
 #include "tests/test_macros.h"
 #include "tests/test_macros.h"

+ 1 - 1
tests/scene/test_navigation_region_3d.h

@@ -31,7 +31,7 @@
 #pragma once
 #pragma once
 
 
 #include "scene/3d/mesh_instance_3d.h"
 #include "scene/3d/mesh_instance_3d.h"
-#include "scene/3d/navigation_region_3d.h"
+#include "scene/3d/navigation/navigation_region_3d.h"
 #include "scene/main/window.h"
 #include "scene/main/window.h"
 #include "scene/resources/3d/primitive_meshes.h"
 #include "scene/resources/3d/primitive_meshes.h"
 
 

+ 41 - 28
tests/test_main.cpp

@@ -135,9 +135,6 @@
 #include "tests/scene/test_parallax_2d.h"
 #include "tests/scene/test_parallax_2d.h"
 #include "tests/scene/test_path_2d.h"
 #include "tests/scene/test_path_2d.h"
 #include "tests/scene/test_path_follow_2d.h"
 #include "tests/scene/test_path_follow_2d.h"
-#ifndef PHYSICS_3D_DISABLED
-#include "tests/scene/test_physics_material.h"
-#endif // PHYSICS_3D_DISABLED
 #include "tests/scene/test_sprite_frames.h"
 #include "tests/scene/test_sprite_frames.h"
 #include "tests/scene/test_style_box_texture.h"
 #include "tests/scene/test_style_box_texture.h"
 #include "tests/scene/test_texture_progress_bar.h"
 #include "tests/scene/test_texture_progress_bar.h"
@@ -163,6 +160,22 @@
 #include "tests/scene/test_tree.h"
 #include "tests/scene/test_tree.h"
 #endif // ADVANCED_GUI_DISABLED
 #endif // ADVANCED_GUI_DISABLED
 
 
+#ifndef _3D_DISABLED
+#include "tests/scene/test_arraymesh.h"
+#include "tests/scene/test_camera_3d.h"
+#include "tests/scene/test_gltf_document.h"
+#include "tests/scene/test_path_3d.h"
+#include "tests/scene/test_path_follow_3d.h"
+#include "tests/scene/test_primitives.h"
+#include "tests/scene/test_skeleton_3d.h"
+#include "tests/scene/test_sky.h"
+#endif // _3D_DISABLED
+
+#ifndef PHYSICS_3D_DISABLED
+#include "tests/scene/test_height_map_shape_3d.h"
+#include "tests/scene/test_physics_material.h"
+#endif // PHYSICS_3D_DISABLED
+
 #ifdef MODULE_NAVIGATION_2D_ENABLED
 #ifdef MODULE_NAVIGATION_2D_ENABLED
 #include "tests/scene/test_navigation_agent_2d.h"
 #include "tests/scene/test_navigation_agent_2d.h"
 #include "tests/scene/test_navigation_obstacle_2d.h"
 #include "tests/scene/test_navigation_obstacle_2d.h"
@@ -170,7 +183,6 @@
 #include "tests/servers/test_navigation_server_2d.h"
 #include "tests/servers/test_navigation_server_2d.h"
 #endif // MODULE_NAVIGATION_2D_ENABLED
 #endif // MODULE_NAVIGATION_2D_ENABLED
 
 
-#ifndef _3D_DISABLED
 #ifdef MODULE_NAVIGATION_3D_ENABLED
 #ifdef MODULE_NAVIGATION_3D_ENABLED
 #include "tests/scene/test_navigation_agent_3d.h"
 #include "tests/scene/test_navigation_agent_3d.h"
 #include "tests/scene/test_navigation_obstacle_3d.h"
 #include "tests/scene/test_navigation_obstacle_3d.h"
@@ -178,29 +190,20 @@
 #include "tests/servers/test_navigation_server_3d.h"
 #include "tests/servers/test_navigation_server_3d.h"
 #endif // MODULE_NAVIGATION_3D_ENABLED
 #endif // MODULE_NAVIGATION_3D_ENABLED
 
 
-#include "tests/scene/test_arraymesh.h"
-#include "tests/scene/test_camera_3d.h"
-#include "tests/scene/test_gltf_document.h"
-#ifndef PHYSICS_3D_DISABLED
-#include "tests/scene/test_height_map_shape_3d.h"
-#endif // PHYSICS_3D_DISABLED
-#include "tests/scene/test_path_3d.h"
-#include "tests/scene/test_path_follow_3d.h"
-#include "tests/scene/test_primitives.h"
-#include "tests/scene/test_skeleton_3d.h"
-#include "tests/scene/test_sky.h"
-#endif // _3D_DISABLED
-
 #include "modules/modules_tests.gen.h"
 #include "modules/modules_tests.gen.h"
 
 
 #include "tests/display_server_mock.h"
 #include "tests/display_server_mock.h"
 #include "tests/test_macros.h"
 #include "tests/test_macros.h"
 
 
 #include "scene/theme/theme_db.h"
 #include "scene/theme/theme_db.h"
+
+#ifndef NAVIGATION_2D_DISABLED
 #include "servers/navigation_server_2d.h"
 #include "servers/navigation_server_2d.h"
-#ifndef _3D_DISABLED
+#endif // NAVIGATION_2D_DISABLED
+#ifndef NAVIGATION_3D_DISABLED
 #include "servers/navigation_server_3d.h"
 #include "servers/navigation_server_3d.h"
-#endif // _3D_DISABLED
+#endif // NAVIGATION_3D_DISABLED
+
 #ifndef PHYSICS_2D_DISABLED
 #ifndef PHYSICS_2D_DISABLED
 #include "servers/physics_server_2d.h"
 #include "servers/physics_server_2d.h"
 #include "servers/physics_server_2d_dummy.h"
 #include "servers/physics_server_2d_dummy.h"
@@ -209,6 +212,7 @@
 #include "servers/physics_server_3d.h"
 #include "servers/physics_server_3d.h"
 #include "servers/physics_server_3d_dummy.h"
 #include "servers/physics_server_3d_dummy.h"
 #endif // PHYSICS_3D_DISABLED
 #endif // PHYSICS_3D_DISABLED
+
 #include "servers/rendering/rendering_server_default.h"
 #include "servers/rendering/rendering_server_default.h"
 
 
 int test_main(int argc, char *argv[]) {
 int test_main(int argc, char *argv[]) {
@@ -289,10 +293,13 @@ struct GodotTestCaseListener : public doctest::IReporter {
 #ifndef PHYSICS_3D_DISABLED
 #ifndef PHYSICS_3D_DISABLED
 	PhysicsServer3D *physics_server_3d = nullptr;
 	PhysicsServer3D *physics_server_3d = nullptr;
 #endif // PHYSICS_3D_DISABLED
 #endif // PHYSICS_3D_DISABLED
-#ifndef _3D_DISABLED
-	NavigationServer3D *navigation_server_3d = nullptr;
-#endif // _3D_DISABLED
+
+#ifndef NAVIGATION_2D_DISABLED
 	NavigationServer2D *navigation_server_2d = nullptr;
 	NavigationServer2D *navigation_server_2d = nullptr;
+#endif // NAVIGATION_2D_DISABLED
+#ifndef NAVIGATION_3D_DISABLED
+	NavigationServer3D *navigation_server_3d = nullptr;
+#endif // NAVIGATION_3D_DISABLED
 
 
 	void test_case_start(const doctest::TestCaseData &p_in) override {
 	void test_case_start(const doctest::TestCaseData &p_in) override {
 		reinitialize();
 		reinitialize();
@@ -341,10 +348,12 @@ struct GodotTestCaseListener : public doctest::IReporter {
 #endif // PHYSICS_2D_DISABLED
 #endif // PHYSICS_2D_DISABLED
 
 
 			ERR_PRINT_OFF;
 			ERR_PRINT_OFF;
-#ifndef _3D_DISABLED
+#ifndef NAVIGATION_3D_DISABLED
 			navigation_server_3d = NavigationServer3DManager::new_default_server();
 			navigation_server_3d = NavigationServer3DManager::new_default_server();
-#endif // _3D_DISABLED
+#endif // NAVIGATION_3D_DISABLED
+#ifndef NAVIGATION_2D_DISABLED
 			navigation_server_2d = NavigationServer2DManager::new_default_server();
 			navigation_server_2d = NavigationServer2DManager::new_default_server();
+#endif // NAVIGATION_2D_DISABLED
 			ERR_PRINT_ON;
 			ERR_PRINT_ON;
 
 
 			memnew(InputMap);
 			memnew(InputMap);
@@ -376,21 +385,23 @@ struct GodotTestCaseListener : public doctest::IReporter {
 			return;
 			return;
 		}
 		}
 
 
-#ifndef _3D_DISABLED
+#ifndef NAVIGATION_3D_DISABLED
 		if (suite_name.contains("[Navigation3D]") && navigation_server_3d == nullptr) {
 		if (suite_name.contains("[Navigation3D]") && navigation_server_3d == nullptr) {
 			ERR_PRINT_OFF;
 			ERR_PRINT_OFF;
 			navigation_server_3d = NavigationServer3DManager::new_default_server();
 			navigation_server_3d = NavigationServer3DManager::new_default_server();
 			ERR_PRINT_ON;
 			ERR_PRINT_ON;
 			return;
 			return;
 		}
 		}
-#endif // _3D_DISABLED
+#endif // NAVIGATION_3D_DISABLED
 
 
+#ifndef NAVIGATION_2D_DISABLED
 		if (suite_name.contains("[Navigation2D]") && navigation_server_2d == nullptr) {
 		if (suite_name.contains("[Navigation2D]") && navigation_server_2d == nullptr) {
 			ERR_PRINT_OFF;
 			ERR_PRINT_OFF;
 			navigation_server_2d = NavigationServer2DManager::new_default_server();
 			navigation_server_2d = NavigationServer2DManager::new_default_server();
 			ERR_PRINT_ON;
 			ERR_PRINT_ON;
 			return;
 			return;
 		}
 		}
+#endif // NAVIGATION_2D_DISABLED
 	}
 	}
 
 
 	void test_case_end(const doctest::CurrentTestCaseStats &) override {
 	void test_case_end(const doctest::CurrentTestCaseStats &) override {
@@ -420,17 +431,19 @@ struct GodotTestCaseListener : public doctest::IReporter {
 			memdelete(SceneTree::get_singleton());
 			memdelete(SceneTree::get_singleton());
 		}
 		}
 
 
-#ifndef _3D_DISABLED
+#ifndef NAVIGATION_3D_DISABLED
 		if (navigation_server_3d) {
 		if (navigation_server_3d) {
 			memdelete(navigation_server_3d);
 			memdelete(navigation_server_3d);
 			navigation_server_3d = nullptr;
 			navigation_server_3d = nullptr;
 		}
 		}
-#endif // _3D_DISABLED
+#endif // NAVIGATION_3D_DISABLED
 
 
+#ifndef NAVIGATION_2D_DISABLED
 		if (navigation_server_2d) {
 		if (navigation_server_2d) {
 			memdelete(navigation_server_2d);
 			memdelete(navigation_server_2d);
 			navigation_server_2d = nullptr;
 			navigation_server_2d = nullptr;
 		}
 		}
+#endif // NAVIGATION_2D_DISABLED
 
 
 #ifndef PHYSICS_3D_DISABLED
 #ifndef PHYSICS_3D_DISABLED
 		if (physics_server_3d) {
 		if (physics_server_3d) {