Kaynağa Gözat

Merge pull request #12593 from DmDerbin/master

AStar: implementation of get_point_connections
Poommetee Ketson 7 yıl önce
ebeveyn
işleme
9aebdd2ae8
3 değiştirilmiş dosya ile 40 ekleme ve 0 silme
  1. 17 0
      core/math/a_star.cpp
  2. 1 0
      core/math/a_star.h
  3. 22 0
      doc/classes/AStar.xml

+ 17 - 0
core/math/a_star.cpp

@@ -159,6 +159,21 @@ Array AStar::get_points() {
 	return point_list;
 }
 
+PoolVector<int> AStar::get_point_connections(int p_id) {
+
+	ERR_FAIL_COND_V(!points.has(p_id), PoolVector<int>());
+
+	PoolVector<int> point_list;
+
+	Point *p = points[p_id];
+
+	for (int i = 0; i < p->neighbours.size(); i++) {
+		point_list.push_back(p->neighbours[i]->id);
+	}
+
+	return point_list;
+}
+
 bool AStar::are_points_connected(int p_id, int p_with_id) const {
 
 	Segment s(p_id, p_with_id);
@@ -444,6 +459,8 @@ void AStar::_bind_methods() {
 	ClassDB::bind_method(D_METHOD("has_point", "id"), &AStar::has_point);
 	ClassDB::bind_method(D_METHOD("get_points"), &AStar::get_points);
 
+	ClassDB::bind_method(D_METHOD("get_point_connections"), &AStar::get_point_connections);
+
 	ClassDB::bind_method(D_METHOD("connect_points", "id", "to_id", "bidirectional"), &AStar::connect_points, DEFVAL(true));
 	ClassDB::bind_method(D_METHOD("disconnect_points", "id", "to_id"), &AStar::disconnect_points);
 	ClassDB::bind_method(D_METHOD("are_points_connected", "id", "to_id"), &AStar::are_points_connected);

+ 1 - 0
core/math/a_star.h

@@ -109,6 +109,7 @@ public:
 	void set_point_weight_scale(int p_id, real_t p_weight_scale);
 	void remove_point(int p_id);
 	bool has_point(int p_id) const;
+	PoolVector<int> get_point_connections(int p_id);
 	Array get_points();
 
 	void connect_points(int p_id, int p_with_id, bool bidirectional = true);

+ 22 - 0
doc/classes/AStar.xml

@@ -243,6 +243,28 @@
 				Sets the [code]weight_scale[/code] for the point with the given id.
 			</description>
 		</method>
+		<method name="get_point_connections">
+			<return type="PoolIntArray">
+			</return>
+			<argument index="0" name="id" type="int">
+			</argument>
+			<description>
+				Returns an array with the ids of the points that form the connect with the given point. 
+				[codeblock]
+				var as = AStar.new()
+				
+				as.add_point(1, Vector3(0,0,0))
+				as.add_point(2, Vector3(0,1,0))
+				as.add_point(3, Vector3(1,1,0))
+				as.add_point(4, Vector3(2,0,0))
+				
+				as.connect_points(1, 2, true)
+				as.connect_points(1, 3, true)
+				
+				var neighbors = as.get_point_connections(1) # returns [2, 3]
+				[/codeblock]
+			</description>
+		</method>
 	</methods>
 	<constants>
 	</constants>