Kaynağa Gözat

Clean up and fix some situations where triangulation may fail, closes #26366

Juan Linietsky 6 yıl önce
ebeveyn
işleme
1b8f56c099

+ 3 - 1
scene/2d/polygon_2d.cpp

@@ -307,7 +307,9 @@ void Polygon2D::_notification(int p_what) {
 
 			if (invert || polygons.size() == 0) {
 				Vector<int> indices = Geometry::triangulate_polygon(points);
-				VS::get_singleton()->canvas_item_add_triangle_array(get_canvas_item(), indices, points, colors, uvs, bones, weights, texture.is_valid() ? texture->get_rid() : RID());
+				if (indices.size()) {
+					VS::get_singleton()->canvas_item_add_triangle_array(get_canvas_item(), indices, points, colors, uvs, bones, weights, texture.is_valid() ? texture->get_rid() : RID());
+				}
 			} else {
 				//draw individual polygons
 				Vector<int> total_indices;

+ 8 - 7
servers/visual/visual_server_canvas.cpp

@@ -758,11 +758,12 @@ void VisualServerCanvas::canvas_item_add_triangle_array(RID p_item, const Vector
 	Item *canvas_item = canvas_item_owner.getornull(p_item);
 	ERR_FAIL_COND(!canvas_item);
 
-	int ps = p_points.size();
-	ERR_FAIL_COND(!p_colors.empty() && p_colors.size() != ps && p_colors.size() != 1);
-	ERR_FAIL_COND(!p_uvs.empty() && p_uvs.size() != ps);
-	ERR_FAIL_COND(!p_bones.empty() && p_bones.size() != ps * 4);
-	ERR_FAIL_COND(!p_weights.empty() && p_weights.size() != ps * 4);
+	int vertex_count = p_points.size();
+	ERR_FAIL_COND(vertex_count==0);
+	ERR_FAIL_COND(!p_colors.empty() && p_colors.size() != vertex_count && p_colors.size() != 1);
+	ERR_FAIL_COND(!p_uvs.empty() && p_uvs.size() != vertex_count);
+	ERR_FAIL_COND(!p_bones.empty() && p_bones.size() != vertex_count * 4);
+	ERR_FAIL_COND(!p_weights.empty() && p_weights.size() != vertex_count * 4);
 
 	Vector<int> indices = p_indices;
 
@@ -770,9 +771,9 @@ void VisualServerCanvas::canvas_item_add_triangle_array(RID p_item, const Vector
 
 	if (indices.empty()) {
 
-		ERR_FAIL_COND(ps % 3 != 0);
+		ERR_FAIL_COND(vertex_count % 3 != 0);
 		if (p_count == -1)
-			count = ps;
+			count = vertex_count;
 	} else {
 
 		ERR_FAIL_COND(indices.size() % 3 != 0);