Merge pull request #71679 from kleonc/draw_polyline_line_strip
`CanvasItem::draw_polyline` Support thin polylines drawn using line strip
This commit is contained in:
commit
9fc40123ab
8 changed files with 51 additions and 19 deletions
|
@ -42,10 +42,11 @@
|
|||
<param index="3" name="end_angle" type="float" />
|
||||
<param index="4" name="point_count" type="int" />
|
||||
<param index="5" name="color" type="Color" />
|
||||
<param index="6" name="width" type="float" default="1.0" />
|
||||
<param index="6" name="width" type="float" default="-1.0" />
|
||||
<param index="7" name="antialiased" type="bool" default="false" />
|
||||
<description>
|
||||
Draws an unfilled arc between the given angles. The larger the value of [param point_count], the smoother the curve. See also [method draw_circle].
|
||||
Draws an unfilled arc between the given angles with a uniform [param color] and [param width] and optional antialiasing (supported only for positive [param width]). The larger the value of [param point_count], the smoother the curve. See also [method draw_circle].
|
||||
If [param width] is negative, then the arc is drawn using [constant RenderingServer.PRIMITIVE_LINE_STRIP]. This means that when the CanvasItem is scaled, the arc will remain thin. If this behavior is not desired, then pass a positive [param width] like [code]1.0[/code].
|
||||
The arc is drawn from [param start_angle] towards the value of [param end_angle] so in clockwise direction if [code]start_angle < end_angle[/code] and counter-clockwise otherwise. Passing the same angles but in reversed order will produce the same arc. If absolute difference of [param start_angle] and [param end_angle] is greater than [constant @GDScript.TAU] radians, then a full circle arc is drawn (i.e. arc will not overlap itself).
|
||||
</description>
|
||||
</method>
|
||||
|
@ -243,20 +244,22 @@
|
|||
<return type="void" />
|
||||
<param index="0" name="points" type="PackedVector2Array" />
|
||||
<param index="1" name="color" type="Color" />
|
||||
<param index="2" name="width" type="float" default="1.0" />
|
||||
<param index="2" name="width" type="float" default="-1.0" />
|
||||
<param index="3" name="antialiased" type="bool" default="false" />
|
||||
<description>
|
||||
Draws interconnected line segments with a uniform [param color] and [param width] and optional antialiasing. When drawing large amounts of lines, this is faster than using individual [method draw_line] calls. To draw disconnected lines, use [method draw_multiline] instead. See also [method draw_polygon].
|
||||
Draws interconnected line segments with a uniform [param color] and [param width] and optional antialiasing (supported only for positive [param width]). When drawing large amounts of lines, this is faster than using individual [method draw_line] calls. To draw disconnected lines, use [method draw_multiline] instead. See also [method draw_polygon].
|
||||
If [param width] is negative, the polyline is drawn using [constant RenderingServer.PRIMITIVE_LINE_STRIP]. This means that when the CanvasItem is scaled, the polyline will remain thin. If this behavior is not desired, then pass a positive [param width] like [code]1.0[/code].
|
||||
</description>
|
||||
</method>
|
||||
<method name="draw_polyline_colors">
|
||||
<return type="void" />
|
||||
<param index="0" name="points" type="PackedVector2Array" />
|
||||
<param index="1" name="colors" type="PackedColorArray" />
|
||||
<param index="2" name="width" type="float" default="1.0" />
|
||||
<param index="2" name="width" type="float" default="-1.0" />
|
||||
<param index="3" name="antialiased" type="bool" default="false" />
|
||||
<description>
|
||||
Draws interconnected line segments with a uniform [param width] and segment-by-segment coloring, and optional antialiasing. Colors assigned to line segments match by index between [param points] and [param colors]. When drawing large amounts of lines, this is faster than using individual [method draw_line] calls. To draw disconnected lines, use [method draw_multiline_colors] instead. See also [method draw_polygon].
|
||||
Draws interconnected line segments with a uniform [param width] and segment-by-segment coloring, and optional antialiasing (supported only for positive [param width]). Colors assigned to line segments match by index between [param points] and [param colors]. When drawing large amounts of lines, this is faster than using individual [method draw_line] calls. To draw disconnected lines, use [method draw_multiline_colors] instead. See also [method draw_polygon].
|
||||
If [param width] is negative, then the polyline is drawn using [constant RenderingServer.PRIMITIVE_LINE_STRIP]. This means that when the CanvasItem is scaled, the polyline will remain thin. If this behavior is not desired, then pass a positive [param width] like [code]1.0[/code].
|
||||
</description>
|
||||
</method>
|
||||
<method name="draw_primitive">
|
||||
|
|
|
@ -291,7 +291,7 @@
|
|||
<param index="0" name="item" type="RID" />
|
||||
<param index="1" name="points" type="PackedVector2Array" />
|
||||
<param index="2" name="colors" type="PackedColorArray" />
|
||||
<param index="3" name="width" type="float" default="1.0" />
|
||||
<param index="3" name="width" type="float" default="-1.0" />
|
||||
<param index="4" name="antialiased" type="bool" default="false" />
|
||||
<description>
|
||||
</description>
|
||||
|
|
|
@ -976,9 +976,9 @@ void CanvasItem::_bind_methods() {
|
|||
|
||||
ClassDB::bind_method(D_METHOD("draw_line", "from", "to", "color", "width", "antialiased"), &CanvasItem::draw_line, DEFVAL(-1.0), DEFVAL(false));
|
||||
ClassDB::bind_method(D_METHOD("draw_dashed_line", "from", "to", "color", "width", "dash", "aligned"), &CanvasItem::draw_dashed_line, DEFVAL(-1.0), DEFVAL(2.0), DEFVAL(true));
|
||||
ClassDB::bind_method(D_METHOD("draw_polyline", "points", "color", "width", "antialiased"), &CanvasItem::draw_polyline, DEFVAL(1.0), DEFVAL(false));
|
||||
ClassDB::bind_method(D_METHOD("draw_polyline_colors", "points", "colors", "width", "antialiased"), &CanvasItem::draw_polyline_colors, DEFVAL(1.0), DEFVAL(false));
|
||||
ClassDB::bind_method(D_METHOD("draw_arc", "center", "radius", "start_angle", "end_angle", "point_count", "color", "width", "antialiased"), &CanvasItem::draw_arc, DEFVAL(1.0), DEFVAL(false));
|
||||
ClassDB::bind_method(D_METHOD("draw_polyline", "points", "color", "width", "antialiased"), &CanvasItem::draw_polyline, DEFVAL(-1.0), DEFVAL(false));
|
||||
ClassDB::bind_method(D_METHOD("draw_polyline_colors", "points", "colors", "width", "antialiased"), &CanvasItem::draw_polyline_colors, DEFVAL(-1.0), DEFVAL(false));
|
||||
ClassDB::bind_method(D_METHOD("draw_arc", "center", "radius", "start_angle", "end_angle", "point_count", "color", "width", "antialiased"), &CanvasItem::draw_arc, DEFVAL(-1.0), DEFVAL(false));
|
||||
ClassDB::bind_method(D_METHOD("draw_multiline", "points", "color", "width"), &CanvasItem::draw_multiline, DEFVAL(-1.0));
|
||||
ClassDB::bind_method(D_METHOD("draw_multiline_colors", "points", "colors", "width"), &CanvasItem::draw_multiline_colors, DEFVAL(-1.0));
|
||||
ClassDB::bind_method(D_METHOD("draw_rect", "rect", "color", "filled", "width"), &CanvasItem::draw_rect, DEFVAL(true), DEFVAL(-1.0));
|
||||
|
|
|
@ -249,9 +249,9 @@ public:
|
|||
|
||||
void draw_dashed_line(const Point2 &p_from, const Point2 &p_to, const Color &p_color, real_t p_width = -1.0, real_t p_dash = 2.0, bool p_aligned = true);
|
||||
void draw_line(const Point2 &p_from, const Point2 &p_to, const Color &p_color, real_t p_width = -1.0, bool p_antialiased = false);
|
||||
void draw_polyline(const Vector<Point2> &p_points, const Color &p_color, real_t p_width = 1.0, bool p_antialiased = false);
|
||||
void draw_polyline_colors(const Vector<Point2> &p_points, const Vector<Color> &p_colors, real_t p_width = 1.0, bool p_antialiased = false);
|
||||
void draw_arc(const Vector2 &p_center, real_t p_radius, real_t p_start_angle, real_t p_end_angle, int p_point_count, const Color &p_color, real_t p_width = 1.0, bool p_antialiased = false);
|
||||
void draw_polyline(const Vector<Point2> &p_points, const Color &p_color, real_t p_width = -1.0, bool p_antialiased = false);
|
||||
void draw_polyline_colors(const Vector<Point2> &p_points, const Vector<Color> &p_colors, real_t p_width = -1.0, bool p_antialiased = false);
|
||||
void draw_arc(const Vector2 &p_center, real_t p_radius, real_t p_start_angle, real_t p_end_angle, int p_point_count, const Color &p_color, real_t p_width = -1.0, bool p_antialiased = false);
|
||||
void draw_multiline(const Vector<Point2> &p_points, const Color &p_color, real_t p_width = -1.0);
|
||||
void draw_multiline_colors(const Vector<Point2> &p_points, const Vector<Color> &p_colors, real_t p_width = -1.0);
|
||||
void draw_rect(const Rect2 &p_rect, const Color &p_color, bool p_filled = true, real_t p_width = -1.0);
|
||||
|
|
|
@ -821,6 +821,38 @@ void RendererCanvasCull::canvas_item_add_polyline(RID p_item, const Vector<Point
|
|||
|
||||
Vector<int> indices;
|
||||
int point_count = p_points.size();
|
||||
|
||||
Item::CommandPolygon *pline = canvas_item->alloc_command<Item::CommandPolygon>();
|
||||
ERR_FAIL_COND(!pline);
|
||||
|
||||
if (p_width < 0) {
|
||||
if (p_antialiased) {
|
||||
WARN_PRINT("Antialiasing is not supported for thin polylines drawn using line strips (`p_width < 0`).");
|
||||
}
|
||||
|
||||
pline->primitive = RS::PRIMITIVE_LINE_STRIP;
|
||||
|
||||
if (p_colors.size() == 1 || p_colors.size() == point_count) {
|
||||
pline->polygon.create(indices, p_points, p_colors);
|
||||
} else {
|
||||
Vector<Color> colors;
|
||||
if (p_colors.is_empty()) {
|
||||
colors.push_back(color);
|
||||
} else {
|
||||
colors.resize(point_count);
|
||||
Color *colors_ptr = colors.ptrw();
|
||||
for (int i = 0; i < point_count; i++) {
|
||||
if (i < p_colors.size()) {
|
||||
color = p_colors[i];
|
||||
}
|
||||
colors_ptr[i] = color;
|
||||
}
|
||||
}
|
||||
pline->polygon.create(indices, p_points, colors);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
int polyline_point_count = point_count * 2;
|
||||
|
||||
bool loop = p_points[0].is_equal_approx(p_points[point_count - 1]);
|
||||
|
@ -845,9 +877,6 @@ void RendererCanvasCull::canvas_item_add_polyline(RID p_item, const Vector<Point
|
|||
}
|
||||
}
|
||||
|
||||
Item::CommandPolygon *pline = canvas_item->alloc_command<Item::CommandPolygon>();
|
||||
ERR_FAIL_COND(!pline);
|
||||
|
||||
PackedColorArray colors;
|
||||
PackedVector2Array points;
|
||||
|
||||
|
|
|
@ -222,7 +222,7 @@ public:
|
|||
void canvas_item_set_update_when_visible(RID p_item, bool p_update);
|
||||
|
||||
void canvas_item_add_line(RID p_item, const Point2 &p_from, const Point2 &p_to, const Color &p_color, float p_width = -1.0, bool p_antialiased = false);
|
||||
void canvas_item_add_polyline(RID p_item, const Vector<Point2> &p_points, const Vector<Color> &p_colors, float p_width = 1.0, bool p_antialiased = false);
|
||||
void canvas_item_add_polyline(RID p_item, const Vector<Point2> &p_points, const Vector<Color> &p_colors, float p_width = -1.0, bool p_antialiased = false);
|
||||
void canvas_item_add_multiline(RID p_item, const Vector<Point2> &p_points, const Vector<Color> &p_colors, float p_width = -1.0);
|
||||
void canvas_item_add_rect(RID p_item, const Rect2 &p_rect, const Color &p_color);
|
||||
void canvas_item_add_circle(RID p_item, const Point2 &p_pos, float p_radius, const Color &p_color);
|
||||
|
|
|
@ -2595,7 +2595,7 @@ void RenderingServer::_bind_methods() {
|
|||
/* Primitives */
|
||||
|
||||
ClassDB::bind_method(D_METHOD("canvas_item_add_line", "item", "from", "to", "color", "width", "antialiased"), &RenderingServer::canvas_item_add_line, DEFVAL(-1.0), DEFVAL(false));
|
||||
ClassDB::bind_method(D_METHOD("canvas_item_add_polyline", "item", "points", "colors", "width", "antialiased"), &RenderingServer::canvas_item_add_polyline, DEFVAL(1.0), DEFVAL(false));
|
||||
ClassDB::bind_method(D_METHOD("canvas_item_add_polyline", "item", "points", "colors", "width", "antialiased"), &RenderingServer::canvas_item_add_polyline, DEFVAL(-1.0), DEFVAL(false));
|
||||
ClassDB::bind_method(D_METHOD("canvas_item_add_rect", "item", "rect", "color"), &RenderingServer::canvas_item_add_rect);
|
||||
ClassDB::bind_method(D_METHOD("canvas_item_add_circle", "item", "pos", "radius", "color"), &RenderingServer::canvas_item_add_circle);
|
||||
ClassDB::bind_method(D_METHOD("canvas_item_add_texture_rect", "item", "rect", "texture", "tile", "modulate", "transpose"), &RenderingServer::canvas_item_add_texture_rect, DEFVAL(false), DEFVAL(Color(1, 1, 1)), DEFVAL(false));
|
||||
|
|
|
@ -1335,7 +1335,7 @@ public:
|
|||
};
|
||||
|
||||
virtual void canvas_item_add_line(RID p_item, const Point2 &p_from, const Point2 &p_to, const Color &p_color, float p_width = -1.0, bool p_antialiased = false) = 0;
|
||||
virtual void canvas_item_add_polyline(RID p_item, const Vector<Point2> &p_points, const Vector<Color> &p_colors, float p_width = 1.0, bool p_antialiased = false) = 0;
|
||||
virtual void canvas_item_add_polyline(RID p_item, const Vector<Point2> &p_points, const Vector<Color> &p_colors, float p_width = -1.0, bool p_antialiased = false) = 0;
|
||||
virtual void canvas_item_add_multiline(RID p_item, const Vector<Point2> &p_points, const Vector<Color> &p_colors, float p_width = -1.0) = 0;
|
||||
virtual void canvas_item_add_rect(RID p_item, const Rect2 &p_rect, const Color &p_color) = 0;
|
||||
virtual void canvas_item_add_circle(RID p_item, const Point2 &p_pos, float p_radius, const Color &p_color) = 0;
|
||||
|
|
Loading…
Reference in a new issue