mirror of
				https://github.com/godotengine/godot.git
				synced 2025-10-31 13:41:03 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			98 lines
		
	
	
	
		
			3.6 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			98 lines
		
	
	
	
		
			3.6 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| /**************************************************************************/
 | |
| /*  polygon_path_finder.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 POLYGON_PATH_FINDER_H
 | |
| #define POLYGON_PATH_FINDER_H
 | |
| 
 | |
| #include "core/io/resource.h"
 | |
| 
 | |
| class PolygonPathFinder : public Resource {
 | |
| 	GDCLASS(PolygonPathFinder, Resource);
 | |
| 
 | |
| 	struct Point {
 | |
| 		Vector2 pos;
 | |
| 		HashSet<int> connections;
 | |
| 		float distance = 0.0;
 | |
| 		float penalty = 0.0;
 | |
| 		int prev = 0;
 | |
| 	};
 | |
| 
 | |
| 	union Edge {
 | |
| 		struct {
 | |
| 			int32_t points[2];
 | |
| 		};
 | |
| 		uint64_t key = 0;
 | |
| 
 | |
| 		_FORCE_INLINE_ bool operator==(const Edge &p_edge) const {
 | |
| 			return key == p_edge.key;
 | |
| 		}
 | |
| 		_FORCE_INLINE_ static uint32_t hash(const Edge &p_edge) {
 | |
| 			return hash_one_uint64(p_edge.key);
 | |
| 		}
 | |
| 
 | |
| 		Edge(int a = 0, int b = 0) {
 | |
| 			if (a > b) {
 | |
| 				SWAP(a, b);
 | |
| 			}
 | |
| 			points[0] = a;
 | |
| 			points[1] = b;
 | |
| 		}
 | |
| 	};
 | |
| 
 | |
| 	Vector2 outside_point;
 | |
| 	Rect2 bounds;
 | |
| 
 | |
| 	Vector<Point> points;
 | |
| 	HashSet<Edge, Edge> edges;
 | |
| 
 | |
| 	bool _is_point_inside(const Vector2 &p_point) const;
 | |
| 
 | |
| 	void _set_data(const Dictionary &p_data);
 | |
| 	Dictionary _get_data() const;
 | |
| 
 | |
| protected:
 | |
| 	static void _bind_methods();
 | |
| 
 | |
| public:
 | |
| 	void setup(const Vector<Vector2> &p_points, const Vector<int> &p_connections);
 | |
| 	Vector<Vector2> find_path(const Vector2 &p_from, const Vector2 &p_to);
 | |
| 
 | |
| 	void set_point_penalty(int p_point, float p_penalty);
 | |
| 	float get_point_penalty(int p_point) const;
 | |
| 
 | |
| 	bool is_point_inside(const Vector2 &p_point) const;
 | |
| 	Vector2 get_closest_point(const Vector2 &p_point) const;
 | |
| 	Vector<Vector2> get_intersections(const Vector2 &p_from, const Vector2 &p_to) const;
 | |
| 	Rect2 get_bounds() const;
 | |
| 
 | |
| 	PolygonPathFinder();
 | |
| };
 | |
| 
 | |
| #endif // POLYGON_PATH_FINDER_H
 | 
