From 55923ade68237ae6a344efe23c2656ed7ba976c2 Mon Sep 17 00:00:00 2001 From: smix8 <52464204+smix8@users.noreply.github.com> Date: Sun, 19 Jun 2022 13:23:13 +0200 Subject: Add navigation layer bitmask helper functions Adds helper functions to work with the navigation layer bitmask. --- modules/gridmap/doc_classes/GridMap.xml | 17 ++++++++++++++++- modules/gridmap/grid_map.cpp | 23 ++++++++++++++++++++++- modules/gridmap/grid_map.h | 5 ++++- 3 files changed, 42 insertions(+), 3 deletions(-) (limited to 'modules') diff --git a/modules/gridmap/doc_classes/GridMap.xml b/modules/gridmap/doc_classes/GridMap.xml index 407ce961c8..499f54e3ba 100644 --- a/modules/gridmap/doc_classes/GridMap.xml +++ b/modules/gridmap/doc_classes/GridMap.xml @@ -73,6 +73,13 @@ Returns an array of [Transform3D] and [Mesh] references corresponding to the non-empty cells in the grid. The transforms are specified in world space. + + + + + Returns whether or not the specified layer of the [member navigation_layers] bitmask is enabled, given a [code]layer_number[/code] between 1 and 32. + + @@ -133,6 +140,14 @@ Based on [code]value[/code], enables or disables the specified layer in the [member collision_mask], given a [code]layer_number[/code] between 1 and 32. + + + + + + Based on [code]value[/code], enables or disables the specified layer in the [member navigation_layers] bitmask, given a [code]layer_number[/code] between 1 and 32. + + @@ -177,7 +192,7 @@ The assigned [MeshLibrary]. - The navigation layers the GridMap generates its navigable regions in. + A bitmask determining all navigation layers the GridMap generated navigation regions belong to. These navigation layers can be checked upon when requesting a path with [method NavigationServer3D.map_get_path]. Overrides the default friction and bounce physics properties for the whole [GridMap]. diff --git a/modules/gridmap/grid_map.cpp b/modules/gridmap/grid_map.cpp index 0e34b5907e..7d80cbef7c 100644 --- a/modules/gridmap/grid_map.cpp +++ b/modules/gridmap/grid_map.cpp @@ -231,10 +231,28 @@ void GridMap::set_navigation_layers(uint32_t p_navigation_layers) { _recreate_octant_data(); } -uint32_t GridMap::get_navigation_layers() { +uint32_t GridMap::get_navigation_layers() const { return navigation_layers; } +void GridMap::set_navigation_layer_value(int p_layer_number, bool p_value) { + ERR_FAIL_COND_MSG(p_layer_number < 1, "Navigation layer number must be between 1 and 32 inclusive."); + ERR_FAIL_COND_MSG(p_layer_number > 32, "Navigation layer number must be between 1 and 32 inclusive."); + uint32_t _navigation_layers = get_navigation_layers(); + if (p_value) { + _navigation_layers |= 1 << (p_layer_number - 1); + } else { + _navigation_layers &= ~(1 << (p_layer_number - 1)); + } + set_navigation_layers(_navigation_layers); +} + +bool GridMap::get_navigation_layer_value(int p_layer_number) const { + ERR_FAIL_COND_V_MSG(p_layer_number < 1, false, "Navigation layer number must be between 1 and 32 inclusive."); + ERR_FAIL_COND_V_MSG(p_layer_number > 32, false, "Navigation layer number must be between 1 and 32 inclusive."); + return get_navigation_layers() & (1 << (p_layer_number - 1)); +} + void GridMap::set_mesh_library(const Ref &p_mesh_library) { if (!mesh_library.is_null()) { mesh_library->unregister_owner(this); @@ -885,6 +903,9 @@ void GridMap::_bind_methods() { ClassDB::bind_method(D_METHOD("set_navigation_layers", "layers"), &GridMap::set_navigation_layers); ClassDB::bind_method(D_METHOD("get_navigation_layers"), &GridMap::get_navigation_layers); + ClassDB::bind_method(D_METHOD("set_navigation_layer_value", "layer_number", "value"), &GridMap::set_navigation_layer_value); + ClassDB::bind_method(D_METHOD("get_navigation_layer_value", "layer_number"), &GridMap::get_navigation_layer_value); + 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); diff --git a/modules/gridmap/grid_map.h b/modules/gridmap/grid_map.h index 08ed4d3d12..078a1d9de5 100644 --- a/modules/gridmap/grid_map.h +++ b/modules/gridmap/grid_map.h @@ -239,7 +239,10 @@ public: bool is_baking_navigation(); void set_navigation_layers(uint32_t p_navigation_layers); - uint32_t get_navigation_layers(); + uint32_t get_navigation_layers() const; + + void set_navigation_layer_value(int p_layer_number, bool p_value); + bool get_navigation_layer_value(int p_layer_number) const; void set_mesh_library(const Ref &p_mesh_library); Ref get_mesh_library() const; -- cgit v1.2.3