diff options
Diffstat (limited to 'modules/gridmap')
| -rw-r--r-- | modules/gridmap/doc_classes/GridMap.xml | 6 | ||||
| -rw-r--r-- | modules/gridmap/grid_map.cpp | 81 | ||||
| -rw-r--r-- | modules/gridmap/grid_map.h | 10 | ||||
| -rw-r--r-- | modules/gridmap/grid_map_editor_plugin.cpp | 39 | ||||
| -rw-r--r-- | modules/gridmap/icons/GridMap.svg | 2 | 
5 files changed, 88 insertions, 50 deletions
diff --git a/modules/gridmap/doc_classes/GridMap.xml b/modules/gridmap/doc_classes/GridMap.xml index e28cc57f9b..9b6fa138e5 100644 --- a/modules/gridmap/doc_classes/GridMap.xml +++ b/modules/gridmap/doc_classes/GridMap.xml @@ -184,6 +184,9 @@  		</method>  	</methods>  	<members> +		<member name="bake_navigation" type="bool" setter="set_bake_navigation" getter="is_baking_navigation" default="false"> +			If [code]true[/code], this GridMap bakes a navigation region. +		</member>  		<member name="cell_center_x" type="bool" setter="set_center_x" getter="get_center_x" default="true">  			If [code]true[/code], grid items are centered on the X axis.  		</member> @@ -214,6 +217,9 @@  		<member name="mesh_library" type="MeshLibrary" setter="set_mesh_library" getter="get_mesh_library">  			The assigned [MeshLibrary].  		</member> +		<member name="navigation_layers" type="int" setter="set_navigation_layers" getter="get_navigation_layers" default="1"> +			The navigation layers the GridMap generates its navigable regions in. +		</member>  	</members>  	<signals>  		<signal name="cell_size_changed"> diff --git a/modules/gridmap/grid_map.cpp b/modules/gridmap/grid_map.cpp index e7c252dc53..eaceaac33c 100644 --- a/modules/gridmap/grid_map.cpp +++ b/modules/gridmap/grid_map.cpp @@ -152,6 +152,7 @@ uint32_t GridMap::get_collision_mask() const {  }  void GridMap::set_collision_mask_bit(int p_bit, bool p_value) { +	ERR_FAIL_INDEX_MSG(p_bit, 32, "Collision mask bit must be between 0 and 31 inclusive.");  	uint32_t mask = get_collision_mask();  	if (p_value) {  		mask |= 1 << p_bit; @@ -162,23 +163,44 @@ void GridMap::set_collision_mask_bit(int p_bit, bool p_value) {  }  bool GridMap::get_collision_mask_bit(int p_bit) const { +	ERR_FAIL_INDEX_V_MSG(p_bit, 32, false, "Collision mask bit must be between 0 and 31 inclusive.");  	return get_collision_mask() & (1 << p_bit);  }  void GridMap::set_collision_layer_bit(int p_bit, bool p_value) { -	uint32_t mask = get_collision_layer(); +	ERR_FAIL_INDEX_MSG(p_bit, 32, "Collision layer bit must be between 0 and 31 inclusive."); +	uint32_t layer = get_collision_layer();  	if (p_value) { -		mask |= 1 << p_bit; +		layer |= 1 << p_bit;  	} else { -		mask &= ~(1 << p_bit); +		layer &= ~(1 << p_bit);  	} -	set_collision_layer(mask); +	set_collision_layer(layer);  }  bool GridMap::get_collision_layer_bit(int p_bit) const { +	ERR_FAIL_INDEX_V_MSG(p_bit, 32, false, "Collision layer bit must be between 0 and 31 inclusive.");  	return get_collision_layer() & (1 << p_bit);  } +void GridMap::set_bake_navigation(bool p_bake_navigation) { +	bake_navigation = p_bake_navigation; +	_recreate_octant_data(); +} + +bool GridMap::is_baking_navigation() { +	return bake_navigation; +} + +void GridMap::set_navigation_layers(uint32_t p_layers) { +	navigation_layers = p_layers; +	_recreate_octant_data(); +} + +uint32_t GridMap::get_navigation_layers() { +	return navigation_layers; +} +  void GridMap::set_mesh_library(const Ref<MeshLibrary> &p_mesh_library) {  	if (!mesh_library.is_null()) {  		mesh_library->unregister_owner(this); @@ -474,13 +496,15 @@ bool GridMap::_octant_update(const OctantKey &p_key) {  			Octant::NavMesh nm;  			nm.xform = xform * mesh_library->get_item_navmesh_transform(c.item); -			if (navigation) { +			if (bake_navigation) {  				RID region = NavigationServer3D::get_singleton()->region_create(); +				NavigationServer3D::get_singleton()->region_set_layers(region, navigation_layers);  				NavigationServer3D::get_singleton()->region_set_navmesh(region, navmesh); -				NavigationServer3D::get_singleton()->region_set_transform(region, navigation->get_global_transform() * nm.xform); -				NavigationServer3D::get_singleton()->region_set_map(region, navigation->get_rid()); +				NavigationServer3D::get_singleton()->region_set_transform(region, get_global_transform() * mesh_library->get_item_navmesh_transform(c.item)); +				NavigationServer3D::get_singleton()->region_set_map(region, get_world_3d()->get_navigation_map());  				nm.region = region;  			} +  			g.navmesh_ids[E->get()] = nm;  		}  	} @@ -564,15 +588,17 @@ void GridMap::_octant_enter_world(const OctantKey &p_key) {  		RS::get_singleton()->instance_set_transform(g.multimesh_instances[i].instance, get_global_transform());  	} -	if (navigation && mesh_library.is_valid()) { +	if (bake_navigation && mesh_library.is_valid()) {  		for (Map<IndexKey, Octant::NavMesh>::Element *F = g.navmesh_ids.front(); F; F = F->next()) {  			if (cell_map.has(F->key()) && F->get().region.is_valid() == false) {  				Ref<NavigationMesh> nm = mesh_library->get_item_navmesh(cell_map[F->key()].item);  				if (nm.is_valid()) {  					RID region = NavigationServer3D::get_singleton()->region_create(); +					NavigationServer3D::get_singleton()->region_set_layers(region, navigation_layers);  					NavigationServer3D::get_singleton()->region_set_navmesh(region, nm); -					NavigationServer3D::get_singleton()->region_set_transform(region, navigation->get_global_transform() * F->get().xform); -					NavigationServer3D::get_singleton()->region_set_map(region, navigation->get_rid()); +					NavigationServer3D::get_singleton()->region_set_transform(region, get_global_transform() * F->get().xform); +					NavigationServer3D::get_singleton()->region_set_map(region, get_world_3d()->get_navigation_map()); +  					F->get().region = region;  				}  			} @@ -594,12 +620,10 @@ void GridMap::_octant_exit_world(const OctantKey &p_key) {  		RS::get_singleton()->instance_set_scenario(g.multimesh_instances[i].instance, RID());  	} -	if (navigation) { -		for (Map<IndexKey, Octant::NavMesh>::Element *F = g.navmesh_ids.front(); F; F = F->next()) { -			if (F->get().region.is_valid()) { -				NavigationServer3D::get_singleton()->free(F->get().region); -				F->get().region = RID(); -			} +	for (Map<IndexKey, Octant::NavMesh>::Element *F = g.navmesh_ids.front(); F; F = F->next()) { +		if (F->get().region.is_valid()) { +			NavigationServer3D::get_singleton()->free(F->get().region); +			F->get().region = RID();  		}  	}  } @@ -635,16 +659,6 @@ void GridMap::_octant_clean_up(const OctantKey &p_key) {  void GridMap::_notification(int p_what) {  	switch (p_what) {  		case NOTIFICATION_ENTER_WORLD: { -			Node3D *c = this; -			while (c) { -				navigation = Object::cast_to<Navigation3D>(c); -				if (navigation) { -					break; -				} - -				c = Object::cast_to<Node3D>(c->get_parent()); -			} -  			last_transform = get_global_transform();  			for (Map<OctantKey, Octant *>::Element *E = octant_map.front(); E; E = E->next()) { @@ -679,8 +693,6 @@ void GridMap::_notification(int p_what) {  				_octant_exit_world(E->key());  			} -			navigation = nullptr; -  			//_queue_octants_dirty(MAP_DIRTY_INSTANCES|MAP_DIRTY_TRANSFORMS);  			//_update_octants_callback();  			//_update_area_instances(); @@ -707,6 +719,10 @@ void GridMap::_update_visibility() {  			RS::get_singleton()->instance_set_visible(mi.instance, is_visible_in_tree());  		}  	} + +	for (int i = 0; i < baked_meshes.size(); i++) { +		RS::get_singleton()->instance_set_visible(baked_meshes[i].instance, is_visible_in_tree()); +	}  }  void GridMap::_queue_octants_dirty() { @@ -785,6 +801,12 @@ void GridMap::_bind_methods() {  	ClassDB::bind_method(D_METHOD("set_collision_layer_bit", "bit", "value"), &GridMap::set_collision_layer_bit);  	ClassDB::bind_method(D_METHOD("get_collision_layer_bit", "bit"), &GridMap::get_collision_layer_bit); +	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("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_mesh_library", "mesh_library"), &GridMap::set_mesh_library);  	ClassDB::bind_method(D_METHOD("get_mesh_library"), &GridMap::get_mesh_library); @@ -838,6 +860,9 @@ void GridMap::_bind_methods() {  	ADD_GROUP("Collision", "collision_");  	ADD_PROPERTY(PropertyInfo(Variant::INT, "collision_layer", PROPERTY_HINT_LAYERS_3D_PHYSICS), "set_collision_layer", "get_collision_layer");  	ADD_PROPERTY(PropertyInfo(Variant::INT, "collision_mask", PROPERTY_HINT_LAYERS_3D_PHYSICS), "set_collision_mask", "get_collision_mask"); +	ADD_GROUP("Navigation", ""); +	ADD_PROPERTY(PropertyInfo(Variant::BOOL, "bake_navigation"), "set_bake_navigation", "is_baking_navigation"); +	ADD_PROPERTY(PropertyInfo(Variant::INT, "navigation_layers", PROPERTY_HINT_LAYERS_3D_NAVIGATION), "set_navigation_layers", "get_navigation_layers");  	BIND_CONSTANT(INVALID_CELL_ITEM); diff --git a/modules/gridmap/grid_map.h b/modules/gridmap/grid_map.h index e5ec4bb602..4c04d492f7 100644 --- a/modules/gridmap/grid_map.h +++ b/modules/gridmap/grid_map.h @@ -31,7 +31,6 @@  #ifndef GRID_MAP_H  #define GRID_MAP_H -#include "scene/3d/navigation_3d.h"  #include "scene/3d/node_3d.h"  #include "scene/resources/mesh_library.h"  #include "scene/resources/multimesh.h" @@ -135,6 +134,8 @@ class GridMap : public Node3D {  	uint32_t collision_layer = 1;  	uint32_t collision_mask = 1; +	bool bake_navigation = false; +	uint32_t navigation_layers = 1;  	Transform last_transform; @@ -145,7 +146,6 @@ class GridMap : public Node3D {  	bool center_y = true;  	bool center_z = true;  	float cell_scale = 1.0; -	Navigation3D *navigation = nullptr;  	bool clip = false;  	bool clip_above = true; @@ -223,6 +223,12 @@ public:  	void set_collision_mask_bit(int p_bit, bool p_value);  	bool get_collision_mask_bit(int p_bit) const; +	void set_bake_navigation(bool p_bake_navigation); +	bool is_baking_navigation(); + +	void set_navigation_layers(uint32_t p_layers); +	uint32_t get_navigation_layers(); +  	void set_mesh_library(const Ref<MeshLibrary> &p_mesh_library);  	Ref<MeshLibrary> get_mesh_library() const; diff --git a/modules/gridmap/grid_map_editor_plugin.cpp b/modules/gridmap/grid_map_editor_plugin.cpp index da9cdb9bc5..813b4b9689 100644 --- a/modules/gridmap/grid_map_editor_plugin.cpp +++ b/modules/gridmap/grid_map_editor_plugin.cpp @@ -386,13 +386,13 @@ bool GridMapEditor::do_input_action(Camera3D *p_camera, const Point2 &p_point, b  	}  	int cell[3]; -	float cell_size[3] = { node->get_cell_size().x, node->get_cell_size().y, node->get_cell_size().z }; +	Vector3 cell_size = node->get_cell_size();  	for (int i = 0; i < 3; i++) {  		if (i == edit_axis) {  			cell[i] = edit_floor[i];  		} else { -			cell[i] = inters[i] / node->get_cell_size()[i]; +			cell[i] = inters[i] / cell_size[i];  			if (inters[i] < 0) {  				cell[i] -= 1; // Compensate negative.  			} @@ -436,6 +436,7 @@ bool GridMapEditor::do_input_action(Camera3D *p_camera, const Point2 &p_point, b  		}  		return true;  	} +  	if (input_action == INPUT_PAINT) {  		SetItem si;  		si.position = Vector3i(cell[0], cell[1], cell[2]); @@ -545,7 +546,7 @@ void GridMapEditor::_update_paste_indicator() {  		return;  	} -	Vector3 center = 0.5 * Vector3(float(node->get_center_x()), float(node->get_center_y()), float(node->get_center_z())); +	Vector3 center = 0.5 * Vector3(real_t(node->get_center_x()), real_t(node->get_center_y()), real_t(node->get_center_z()));  	Vector3 scale = (Vector3(1, 1, 1) + (paste_indicator.end - paste_indicator.begin)) * node->get_cell_size();  	Transform xf;  	xf.scale(scale); @@ -614,13 +615,13 @@ bool GridMapEditor::forward_spatial_input_event(Camera3D *p_camera, const Ref<In  	Ref<InputEventMouseButton> mb = p_event;  	if (mb.is_valid()) { -		if (mb->get_button_index() == BUTTON_WHEEL_UP && (mb->get_command() || mb->get_shift())) { +		if (mb->get_button_index() == MOUSE_BUTTON_WHEEL_UP && (mb->is_command_pressed() || mb->is_shift_pressed())) {  			if (mb->is_pressed()) {  				floor->set_value(floor->get_value() + mb->get_factor());  			}  			return true; // Eaten. -		} else if (mb->get_button_index() == BUTTON_WHEEL_DOWN && (mb->get_command() || mb->get_shift())) { +		} else if (mb->get_button_index() == MOUSE_BUTTON_WHEEL_DOWN && (mb->is_command_pressed() || mb->is_shift_pressed())) {  			if (mb->is_pressed()) {  				floor->set_value(floor->get_value() - mb->get_factor());  			} @@ -629,24 +630,24 @@ bool GridMapEditor::forward_spatial_input_event(Camera3D *p_camera, const Ref<In  		if (mb->is_pressed()) {  			Node3DEditorViewport::NavigationScheme nav_scheme = (Node3DEditorViewport::NavigationScheme)EditorSettings::get_singleton()->get("editors/3d/navigation/navigation_scheme").operator int(); -			if ((nav_scheme == Node3DEditorViewport::NAVIGATION_MAYA || nav_scheme == Node3DEditorViewport::NAVIGATION_MODO) && mb->get_alt()) { +			if ((nav_scheme == Node3DEditorViewport::NAVIGATION_MAYA || nav_scheme == Node3DEditorViewport::NAVIGATION_MODO) && mb->is_alt_pressed()) {  				input_action = INPUT_NONE; -			} else if (mb->get_button_index() == BUTTON_LEFT) { +			} else if (mb->get_button_index() == MOUSE_BUTTON_LEFT) {  				bool can_edit = (node && node->get_mesh_library().is_valid());  				if (input_action == INPUT_PASTE) {  					_do_paste();  					input_action = INPUT_NONE;  					_update_paste_indicator(); -				} else if (mb->get_shift() && can_edit) { +				} else if (mb->is_shift_pressed() && can_edit) {  					input_action = INPUT_SELECT;  					last_selection = selection; -				} else if (mb->get_command() && can_edit) { +				} else if (mb->is_command_pressed() && can_edit) {  					input_action = INPUT_PICK;  				} else {  					input_action = INPUT_PAINT;  					set_items.clear();  				} -			} else if (mb->get_button_index() == BUTTON_RIGHT) { +			} else if (mb->get_button_index() == MOUSE_BUTTON_RIGHT) {  				if (input_action == INPUT_PASTE) {  					_clear_clipboard_data();  					input_action = INPUT_NONE; @@ -665,7 +666,7 @@ bool GridMapEditor::forward_spatial_input_event(Camera3D *p_camera, const Ref<In  			return do_input_action(p_camera, Point2(mb->get_position().x, mb->get_position().y), true);  		} else { -			if ((mb->get_button_index() == BUTTON_RIGHT && input_action == INPUT_ERASE) || (mb->get_button_index() == BUTTON_LEFT && input_action == INPUT_PAINT)) { +			if ((mb->get_button_index() == MOUSE_BUTTON_RIGHT && input_action == INPUT_ERASE) || (mb->get_button_index() == MOUSE_BUTTON_LEFT && input_action == INPUT_PAINT)) {  				if (set_items.size()) {  					undo_redo->create_action(TTR("GridMap Paint"));  					for (List<SetItem>::Element *E = set_items.front(); E; E = E->next()) { @@ -684,19 +685,19 @@ bool GridMapEditor::forward_spatial_input_event(Camera3D *p_camera, const Ref<In  				return set_items.size() > 0;  			} -			if (mb->get_button_index() == BUTTON_LEFT && input_action == INPUT_SELECT) { +			if (mb->get_button_index() == MOUSE_BUTTON_LEFT && input_action == INPUT_SELECT) {  				undo_redo->create_action("GridMap Selection");  				undo_redo->add_do_method(this, "_set_selection", selection.active, selection.begin, selection.end);  				undo_redo->add_undo_method(this, "_set_selection", last_selection.active, last_selection.begin, last_selection.end);  				undo_redo->commit_action();  			} -			if (mb->get_button_index() == BUTTON_LEFT && input_action != INPUT_NONE) { +			if (mb->get_button_index() == MOUSE_BUTTON_LEFT && input_action != INPUT_NONE) {  				set_items.clear();  				input_action = INPUT_NONE;  				return true;  			} -			if (mb->get_button_index() == BUTTON_RIGHT && (input_action == INPUT_ERASE || input_action == INPUT_PASTE)) { +			if (mb->get_button_index() == MOUSE_BUTTON_RIGHT && (input_action == INPUT_ERASE || input_action == INPUT_PASTE)) {  				input_action = INPUT_NONE;  				return true;  			} @@ -731,7 +732,7 @@ bool GridMapEditor::forward_spatial_input_event(Camera3D *p_camera, const Ref<In  				}  			} -			if (k->get_shift() && selection.active && input_action != INPUT_PASTE) { +			if (k->is_shift_pressed() && selection.active && input_action != INPUT_PASTE) {  				if (k->get_keycode() == options->get_popup()->get_item_accelerator(options->get_popup()->get_item_index(MENU_OPTION_PREV_LEVEL))) {  					selection.click[edit_axis]--;  					_validate_selection(); @@ -748,7 +749,7 @@ bool GridMapEditor::forward_spatial_input_event(Camera3D *p_camera, const Ref<In  	Ref<InputEventPanGesture> pan_gesture = p_event;  	if (pan_gesture.is_valid()) { -		if (pan_gesture->get_alt() && (pan_gesture->get_command() || pan_gesture->get_shift())) { +		if (pan_gesture->is_alt_pressed() && (pan_gesture->is_command_pressed() || pan_gesture->is_shift_pressed())) {  			const real_t delta = pan_gesture->get_delta().y * 0.5;  			accumulated_floor_delta += delta;  			int step = 0; @@ -809,12 +810,12 @@ void GridMapEditor::_mesh_library_palette_input(const Ref<InputEvent> &p_ie) {  	const Ref<InputEventMouseButton> mb = p_ie;  	// Zoom in/out using Ctrl + mouse wheel -	if (mb.is_valid() && mb->is_pressed() && mb->get_command()) { -		if (mb->is_pressed() && mb->get_button_index() == BUTTON_WHEEL_UP) { +	if (mb.is_valid() && mb->is_pressed() && mb->is_command_pressed()) { +		if (mb->is_pressed() && mb->get_button_index() == MOUSE_BUTTON_WHEEL_UP) {  			size_slider->set_value(size_slider->get_value() + 0.2);  		} -		if (mb->is_pressed() && mb->get_button_index() == BUTTON_WHEEL_DOWN) { +		if (mb->is_pressed() && mb->get_button_index() == MOUSE_BUTTON_WHEEL_DOWN) {  			size_slider->set_value(size_slider->get_value() - 0.2);  		}  	} diff --git a/modules/gridmap/icons/GridMap.svg b/modules/gridmap/icons/GridMap.svg index 7a36fd888c..e208257855 100644 --- a/modules/gridmap/icons/GridMap.svg +++ b/modules/gridmap/icons/GridMap.svg @@ -1 +1 @@ -<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m8 1-6 3v8l6 3 6-3v-2l-2-1-4 2-2-1v-4l2-1v-2l2-1zm4 2-2 1v2l2 1 2-1v-2z" fill="#fc9c9c" fill-opacity=".99608"/></svg> +<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m8 1-6 3v8l6 3 6-3v-2l-2-1-4 2-2-1v-4l2-1v-2l2-1zm4 2-2 1v2l2 1 2-1v-2z" fill="#fc7f7f" fill-opacity=".99608"/></svg>  |