فهرست منبع

Implement missing navgiation polygon debugging in tilemap

Benedikt Bär 7 سال پیش
والد
کامیت
84d60b0829
1فایلهای تغییر یافته به همراه55 افزوده شده و 0 حذف شده
  1. 55 0
      scene/2d/tile_map.cpp

+ 55 - 0
scene/2d/tile_map.cpp

@@ -265,12 +265,18 @@ void TileMap::_update_dirty_quadrants() {
 
 	SceneTree *st = SceneTree::get_singleton();
 	Color debug_collision_color;
+	Color debug_navigation_color;
 
 	bool debug_shapes = st && st->is_debugging_collisions_hint();
 	if (debug_shapes) {
 		debug_collision_color = st->get_debug_collisions_color();
 	}
 
+	bool debug_navigation = st && st->is_debugging_navigation_hint();
+	if (debug_navigation) {
+		debug_navigation_color = st->get_debug_navigation_color();
+	}
+
 	while (dirty_quadrant_list.first()) {
 
 		Quadrant &q = *dirty_quadrant_list.first()->self();
@@ -497,6 +503,55 @@ void TileMap::_update_dirty_quadrants() {
 					np.id = pid;
 					np.xform = xform;
 					q.navpoly_ids[E->key()] = np;
+
+					if (debug_navigation) {
+						RID debug_navigation_item = vs->canvas_item_create();
+						vs->canvas_item_set_parent(debug_navigation_item, canvas_item);
+						vs->canvas_item_set_z_as_relative_to_parent(debug_navigation_item, false);
+						vs->canvas_item_set_z_index(debug_navigation_item, VS::CANVAS_ITEM_Z_MAX - 2); // Display one below collision debug
+
+						if (debug_navigation_item.is_valid()) {
+							PoolVector<Vector2> navigation_polygon_vertices = navpoly->get_vertices();
+							int vsize = navigation_polygon_vertices.size();
+
+							if (vsize > 2) {
+								Vector<Color> colors;
+								Vector<Vector2> vertices;
+								vertices.resize(vsize);
+								colors.resize(vsize);
+								{
+									PoolVector<Vector2>::Read vr = navigation_polygon_vertices.read();
+									for (int i = 0; i < vsize; i++) {
+										vertices[i] = vr[i];
+										colors[i] = debug_navigation_color;
+									}
+								}
+
+								Vector<int> indices;
+
+								for (int i = 0; i < navpoly->get_polygon_count(); i++) {
+									Vector<int> polygon = navpoly->get_polygon(i);
+
+									for (int j = 2; j < polygon.size(); j++) {
+
+										int kofs[3] = { 0, j - 1, j };
+										for (int k = 0; k < 3; k++) {
+
+											int idx = polygon[kofs[k]];
+											ERR_FAIL_INDEX(idx, vsize);
+											indices.push_back(idx);
+										}
+									}
+								}
+								Transform2D navxform;
+								navxform.set_origin(offset.floor());
+								_fix_cell_transform(navxform, c, npoly_ofs + center_ofs, s);
+
+								vs->canvas_item_set_transform(debug_navigation_item, navxform);
+								vs->canvas_item_add_triangle_array(debug_navigation_item, indices, vertices, colors);
+							}
+						}
+					}
 				}
 			}