| 
									
										
										
										
											2023-08-17 18:32:30 +02:00
										 |  |  | /**************************************************************************/ | 
					
						
							|  |  |  | /*  navigation_mesh_source_geometry_data_2d.h                             */ | 
					
						
							|  |  |  | /**************************************************************************/ | 
					
						
							|  |  |  | /*                         This file is part of:                          */ | 
					
						
							|  |  |  | /*                             GODOT ENGINE                               */ | 
					
						
							|  |  |  | /*                        https://godotengine.org                         */ | 
					
						
							|  |  |  | /**************************************************************************/ | 
					
						
							|  |  |  | /* Copyright (c) 2014-present Godot Engine contributors (see AUTHORS.md). */ | 
					
						
							|  |  |  | /* Copyright (c) 2007-2014 Juan Linietsky, Ariel Manzur.                  */ | 
					
						
							|  |  |  | /*                                                                        */ | 
					
						
							|  |  |  | /* Permission is hereby granted, free of charge, to any person obtaining  */ | 
					
						
							|  |  |  | /* a copy of this software and associated documentation files (the        */ | 
					
						
							|  |  |  | /* "Software"), to deal in the Software without restriction, including    */ | 
					
						
							|  |  |  | /* without limitation the rights to use, copy, modify, merge, publish,    */ | 
					
						
							|  |  |  | /* distribute, sublicense, and/or sell copies of the Software, and to     */ | 
					
						
							|  |  |  | /* permit persons to whom the Software is furnished to do so, subject to  */ | 
					
						
							|  |  |  | /* the following conditions:                                              */ | 
					
						
							|  |  |  | /*                                                                        */ | 
					
						
							|  |  |  | /* The above copyright notice and this permission notice shall be         */ | 
					
						
							|  |  |  | /* included in all copies or substantial portions of the Software.        */ | 
					
						
							|  |  |  | /*                                                                        */ | 
					
						
							|  |  |  | /* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,        */ | 
					
						
							|  |  |  | /* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF     */ | 
					
						
							|  |  |  | /* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. */ | 
					
						
							|  |  |  | /* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY   */ | 
					
						
							|  |  |  | /* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,   */ | 
					
						
							|  |  |  | /* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE      */ | 
					
						
							|  |  |  | /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.                 */ | 
					
						
							|  |  |  | /**************************************************************************/ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #ifndef NAVIGATION_MESH_SOURCE_GEOMETRY_DATA_2D_H
 | 
					
						
							|  |  |  | #define NAVIGATION_MESH_SOURCE_GEOMETRY_DATA_2D_H
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-12-20 22:05:53 +08:00
										 |  |  | #include "core/io/resource.h"
 | 
					
						
							| 
									
										
										
										
											2024-03-01 00:30:09 +01:00
										 |  |  | #include "core/os/rw_lock.h"
 | 
					
						
							| 
									
										
										
										
											2023-08-17 18:32:30 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | class NavigationMeshSourceGeometryData2D : public Resource { | 
					
						
							| 
									
										
										
										
											2024-11-08 11:37:23 +01:00
										 |  |  | 	friend class NavMeshGenerator2D; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-08-17 18:32:30 +02:00
										 |  |  | 	GDCLASS(NavigationMeshSourceGeometryData2D, Resource); | 
					
						
							| 
									
										
										
										
											2024-03-01 00:30:09 +01:00
										 |  |  | 	RWLock geometry_rwlock; | 
					
						
							| 
									
										
										
										
											2023-08-17 18:32:30 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	Vector<Vector<Vector2>> traversable_outlines; | 
					
						
							|  |  |  | 	Vector<Vector<Vector2>> obstruction_outlines; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-08-04 18:04:54 +02:00
										 |  |  | 	Rect2 bounds; | 
					
						
							|  |  |  | 	bool bounds_dirty = true; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-03-01 00:30:09 +01:00
										 |  |  | public: | 
					
						
							|  |  |  | 	struct ProjectedObstruction; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | private: | 
					
						
							|  |  |  | 	Vector<ProjectedObstruction> _projected_obstructions; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-08-17 18:32:30 +02:00
										 |  |  | protected: | 
					
						
							| 
									
										
										
										
											2024-03-01 00:30:09 +01:00
										 |  |  | 	bool _set(const StringName &p_name, const Variant &p_value); | 
					
						
							|  |  |  | 	bool _get(const StringName &p_name, Variant &r_ret) const; | 
					
						
							| 
									
										
										
										
											2023-08-17 18:32:30 +02:00
										 |  |  | 	static void _bind_methods(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | public: | 
					
						
							| 
									
										
										
										
											2024-03-01 00:30:09 +01:00
										 |  |  | 	struct ProjectedObstruction { | 
					
						
							|  |  |  | 		static inline uint32_t VERSION = 1; // Increase when format changes so we can detect outdated formats and provide compatibility.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		Vector<float> vertices; | 
					
						
							|  |  |  | 		bool carve = false; | 
					
						
							|  |  |  | 	}; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-08-17 18:32:30 +02:00
										 |  |  | 	void _set_traversable_outlines(const Vector<Vector<Vector2>> &p_traversable_outlines); | 
					
						
							| 
									
										
										
										
											2024-06-20 20:01:04 +02:00
										 |  |  | 	const Vector<Vector<Vector2>> &_get_traversable_outlines() const; | 
					
						
							| 
									
										
										
										
											2023-08-17 18:32:30 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	void _set_obstruction_outlines(const Vector<Vector<Vector2>> &p_obstruction_outlines); | 
					
						
							| 
									
										
										
										
											2024-06-20 20:01:04 +02:00
										 |  |  | 	const Vector<Vector<Vector2>> &_get_obstruction_outlines() const; | 
					
						
							| 
									
										
										
										
											2023-08-17 18:32:30 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	void _add_traversable_outline(const Vector<Vector2> &p_shape_outline); | 
					
						
							|  |  |  | 	void _add_obstruction_outline(const Vector<Vector2> &p_shape_outline); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// kept root node transform here on the geometry data
 | 
					
						
							|  |  |  | 	// if we add this transform to all exposed functions we need to break comp on all functions later
 | 
					
						
							|  |  |  | 	// when navmesh changes from global transform to relative to navregion
 | 
					
						
							|  |  |  | 	// but if it stays here we can just remove it and change the internal functions only
 | 
					
						
							|  |  |  | 	Transform2D root_node_transform; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	void set_traversable_outlines(const TypedArray<Vector<Vector2>> &p_traversable_outlines); | 
					
						
							|  |  |  | 	TypedArray<Vector<Vector2>> get_traversable_outlines() const; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	void set_obstruction_outlines(const TypedArray<Vector<Vector2>> &p_obstruction_outlines); | 
					
						
							|  |  |  | 	TypedArray<Vector<Vector2>> get_obstruction_outlines() const; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-04-20 13:15:55 +02:00
										 |  |  | 	void append_traversable_outlines(const TypedArray<Vector<Vector2>> &p_traversable_outlines); | 
					
						
							|  |  |  | 	void append_obstruction_outlines(const TypedArray<Vector<Vector2>> &p_obstruction_outlines); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-08-17 18:32:30 +02:00
										 |  |  | 	void add_traversable_outline(const PackedVector2Array &p_shape_outline); | 
					
						
							|  |  |  | 	void add_obstruction_outline(const PackedVector2Array &p_shape_outline); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-06-20 20:01:04 +02:00
										 |  |  | 	bool has_data(); | 
					
						
							| 
									
										
										
										
											2023-08-17 18:32:30 +02:00
										 |  |  | 	void clear(); | 
					
						
							| 
									
										
										
										
											2024-03-01 00:30:09 +01:00
										 |  |  | 	void clear_projected_obstructions(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	void add_projected_obstruction(const Vector<Vector2> &p_vertices, bool p_carve); | 
					
						
							|  |  |  | 	Vector<ProjectedObstruction> _get_projected_obstructions() const; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	void set_projected_obstructions(const Array &p_array); | 
					
						
							|  |  |  | 	Array get_projected_obstructions() const; | 
					
						
							| 
									
										
										
										
											2023-08-17 18:32:30 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-02-11 23:11:49 +01:00
										 |  |  | 	void merge(const Ref<NavigationMeshSourceGeometryData2D> &p_other_geometry); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-06-20 20:01:04 +02:00
										 |  |  | 	void set_data(const Vector<Vector<Vector2>> &p_traversable_outlines, const Vector<Vector<Vector2>> &p_obstruction_outlines, Vector<ProjectedObstruction> &p_projected_obstructions); | 
					
						
							|  |  |  | 	void get_data(Vector<Vector<Vector2>> &r_traversable_outlines, Vector<Vector<Vector2>> &r_obstruction_outlines, Vector<ProjectedObstruction> &r_projected_obstructions); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-08-04 18:04:54 +02:00
										 |  |  | 	Rect2 get_bounds(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-02-28 22:36:49 +01:00
										 |  |  | 	NavigationMeshSourceGeometryData2D() {} | 
					
						
							|  |  |  | 	~NavigationMeshSourceGeometryData2D() { clear(); } | 
					
						
							| 
									
										
										
										
											2023-08-17 18:32:30 +02:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #endif // NAVIGATION_MESH_SOURCE_GEOMETRY_DATA_2D_H
 |