diff --git a/servers/rendering/renderer_canvas_cull.cpp b/servers/rendering/renderer_canvas_cull.cpp index 706477cedb4..3a94835e141 100644 --- a/servers/rendering/renderer_canvas_cull.cpp +++ b/servers/rendering/renderer_canvas_cull.cpp @@ -880,8 +880,9 @@ void RendererCanvasCull::canvas_item_add_polyline(RID p_item, const Vectoralloc_command(); - ERR_FAIL_COND(!pline_begin); - - Item::CommandPolygon *pline_begin_left_corner = canvas_item->alloc_command(); - ERR_FAIL_COND(!pline_begin_left_corner); - - Item::CommandPolygon *pline_begin_right_corner = canvas_item->alloc_command(); - ERR_FAIL_COND(!pline_begin_right_corner); - - Item::CommandPolygon *pline_end = canvas_item->alloc_command(); - ERR_FAIL_COND(!pline_end); - - Item::CommandPolygon *pline_end_left_corner = canvas_item->alloc_command(); - ERR_FAIL_COND(!pline_end_left_corner); - - Item::CommandPolygon *pline_end_right_corner = canvas_item->alloc_command(); - ERR_FAIL_COND(!pline_end_right_corner); - Item::CommandPolygon *pline_left = canvas_item->alloc_command(); ERR_FAIL_COND(!pline_left); Item::CommandPolygon *pline_right = canvas_item->alloc_command(); ERR_FAIL_COND(!pline_right); - // Makes nine triangle strips for drawing the antialiased line. + PackedColorArray colors_left; + PackedVector2Array points_left; - Vector2 *points_begin_ptr = points_begin.ptrw(); - Vector2 *points_begin_left_corner_ptr = points_begin_left_corner.ptrw(); - Vector2 *points_begin_right_corner_ptr = points_begin_right_corner.ptrw(); - Vector2 *points_end_ptr = points_end.ptrw(); - Vector2 *points_end_left_corner_ptr = points_end_left_corner.ptrw(); - Vector2 *points_end_right_corner_ptr = points_end_right_corner.ptrw(); - Vector2 *points_left_ptr = points_left.ptrw(); - Vector2 *points_right_ptr = points_right.ptrw(); + PackedColorArray colors_right; + PackedVector2Array points_right; + + // 2+2 additional vertices for begin+end corners. + // 1 additional vertex to swap the orientation of the triangles within the end corner's quad. + colors_left.resize(polyline_point_count + (loop ? 0 : 5)); + points_left.resize(polyline_point_count + (loop ? 0 : 5)); + + colors_right.resize(polyline_point_count + (loop ? 0 : 5)); + points_right.resize(polyline_point_count + (loop ? 0 : 5)); - Color *colors_begin_ptr = colors_begin.ptrw(); - Color *colors_begin_left_corner_ptr = colors_begin_left_corner.ptrw(); - Color *colors_begin_right_corner_ptr = colors_begin_right_corner.ptrw(); - Color *colors_end_ptr = colors_end.ptrw(); - Color *colors_end_left_corner_ptr = colors_end_left_corner.ptrw(); - Color *colors_end_right_corner_ptr = colors_end_right_corner.ptrw(); Color *colors_left_ptr = colors_left.ptrw(); + Vector2 *points_left_ptr = points_left.ptrw(); + + Vector2 *points_right_ptr = points_right.ptrw(); Color *colors_right_ptr = colors_right.ptrw(); Vector2 prev_segment_dir; @@ -1014,118 +949,86 @@ void RendererCanvasCull::canvas_item_add_polyline(RID p_item, const Vectorprimitive = RS::PRIMITIVE_TRIANGLE_STRIP; - pline_begin->polygon.create(indices, points_begin, colors_begin); - - pline_begin_left_corner->primitive = RS::PRIMITIVE_TRIANGLE_STRIP; - pline_begin_left_corner->polygon.create(indices, points_begin_left_corner, colors_begin_left_corner); - - pline_begin_right_corner->primitive = RS::PRIMITIVE_TRIANGLE_STRIP; - pline_begin_right_corner->polygon.create(indices, points_begin_right_corner, colors_begin_right_corner); - - pline_end->primitive = RS::PRIMITIVE_TRIANGLE_STRIP; - pline_end->polygon.create(indices, points_end, colors_end); - - pline_end_left_corner->primitive = RS::PRIMITIVE_TRIANGLE_STRIP; - pline_end_left_corner->polygon.create(indices, points_end_left_corner, colors_end_left_corner); - - pline_end_right_corner->primitive = RS::PRIMITIVE_TRIANGLE_STRIP; - pline_end_right_corner->polygon.create(indices, points_end_right_corner, colors_end_right_corner); - pline_left->primitive = RS::PRIMITIVE_TRIANGLE_STRIP; pline_left->polygon.create(indices, points_left, colors_left);