Add methods to draw ellipses
This commit is contained in:
@ -1419,56 +1419,56 @@ void RendererCanvasCull::canvas_item_add_rect(RID p_item, const Rect2 &p_rect, c
|
||||
}
|
||||
}
|
||||
|
||||
void RendererCanvasCull::canvas_item_add_circle(RID p_item, const Point2 &p_pos, float p_radius, const Color &p_color, bool p_antialiased) {
|
||||
void RendererCanvasCull::canvas_item_add_ellipse(RID p_item, const Point2 &p_pos, float p_major, float p_minor, const Color &p_color, bool p_antialiased) {
|
||||
Item *canvas_item = canvas_item_owner.get_or_null(p_item);
|
||||
ERR_FAIL_NULL(canvas_item);
|
||||
|
||||
static const int circle_segments = 64;
|
||||
static const int ellipse_segments = 64;
|
||||
|
||||
{
|
||||
Item::CommandPolygon *circle = canvas_item->alloc_command<Item::CommandPolygon>();
|
||||
ERR_FAIL_NULL(circle);
|
||||
Item::CommandPolygon *ellipse = canvas_item->alloc_command<Item::CommandPolygon>();
|
||||
ERR_FAIL_NULL(ellipse);
|
||||
|
||||
circle->primitive = RS::PRIMITIVE_TRIANGLES;
|
||||
ellipse->primitive = RS::PRIMITIVE_TRIANGLES;
|
||||
|
||||
Vector<int> indices;
|
||||
Vector<Vector2> points;
|
||||
|
||||
points.resize(circle_segments + 2);
|
||||
points.resize(ellipse_segments + 2);
|
||||
Vector2 *points_ptr = points.ptrw();
|
||||
|
||||
// Store circle center in the last point.
|
||||
points_ptr[circle_segments + 1] = p_pos;
|
||||
// Store ellipse center in the last point.
|
||||
points_ptr[ellipse_segments + 1] = p_pos;
|
||||
|
||||
const real_t circle_point_step = Math::TAU / circle_segments;
|
||||
const real_t ellipse_point_step = Math::TAU / ellipse_segments;
|
||||
|
||||
for (int i = 0; i < circle_segments + 1; i++) {
|
||||
float angle = i * circle_point_step;
|
||||
points_ptr[i].x = Math::cos(angle) * p_radius;
|
||||
points_ptr[i].y = Math::sin(angle) * p_radius;
|
||||
for (int i = 0; i < ellipse_segments + 1; i++) {
|
||||
float angle = i * ellipse_point_step;
|
||||
points_ptr[i].x = Math::cos(angle) * p_major;
|
||||
points_ptr[i].y = Math::sin(angle) * p_minor;
|
||||
points_ptr[i] += p_pos;
|
||||
}
|
||||
|
||||
indices.resize(circle_segments * 3);
|
||||
indices.resize(ellipse_segments * 3);
|
||||
int *indices_ptr = indices.ptrw();
|
||||
|
||||
for (int i = 0; i < circle_segments; i++) {
|
||||
indices_ptr[i * 3 + 0] = circle_segments + 1;
|
||||
for (int i = 0; i < ellipse_segments; i++) {
|
||||
indices_ptr[i * 3 + 0] = ellipse_segments + 1;
|
||||
indices_ptr[i * 3 + 1] = i;
|
||||
indices_ptr[i * 3 + 2] = i + 1;
|
||||
}
|
||||
|
||||
Vector<Color> color;
|
||||
color.push_back(p_color);
|
||||
circle->polygon.create(indices, points, color);
|
||||
ellipse->polygon.create(indices, points, color);
|
||||
}
|
||||
|
||||
if (p_antialiased) {
|
||||
float border_size = FEATHER_SIZE;
|
||||
|
||||
const float diameter = p_radius * 2.0f;
|
||||
if (0.0f <= diameter && diameter < 1.0f) {
|
||||
border_size *= p_radius;
|
||||
const float max_axis = fmax(p_major, p_minor) * 2.0f;
|
||||
if (0.0f <= max_axis && max_axis < 1.0f) {
|
||||
border_size *= max_axis * 0.5f;
|
||||
}
|
||||
|
||||
Item::CommandPolygon *feather = canvas_item->alloc_command<Item::CommandPolygon>();
|
||||
@ -1481,25 +1481,25 @@ void RendererCanvasCull::canvas_item_add_circle(RID p_item, const Point2 &p_pos,
|
||||
Vector<Color> colors;
|
||||
Vector<Vector2> points;
|
||||
|
||||
points.resize(2 * circle_segments + 2);
|
||||
colors.resize(2 * circle_segments + 2);
|
||||
points.resize(2 * ellipse_segments + 2);
|
||||
colors.resize(2 * ellipse_segments + 2);
|
||||
|
||||
const real_t circle_point_step = Math::TAU / circle_segments;
|
||||
const real_t ellipse_point_step = Math::TAU / ellipse_segments;
|
||||
|
||||
Vector2 *points_ptr = points.ptrw();
|
||||
Color *colors_ptr = colors.ptrw();
|
||||
|
||||
for (int i = 0; i < circle_segments + 1; i++) {
|
||||
const float angle = i * circle_point_step;
|
||||
for (int i = 0; i < ellipse_segments + 1; i++) {
|
||||
const float angle = i * ellipse_point_step;
|
||||
const float c = Math::cos(angle);
|
||||
const float s = Math::sin(angle);
|
||||
|
||||
points_ptr[i * 2].x = c * p_radius;
|
||||
points_ptr[i * 2].y = s * p_radius;
|
||||
points_ptr[i * 2].x = c * p_major;
|
||||
points_ptr[i * 2].y = s * p_minor;
|
||||
points_ptr[i * 2] += p_pos;
|
||||
|
||||
points_ptr[i * 2 + 1].x = c * (p_radius + border_size);
|
||||
points_ptr[i * 2 + 1].y = s * (p_radius + border_size);
|
||||
points_ptr[i * 2 + 1].x = c * (p_major + border_size);
|
||||
points_ptr[i * 2 + 1].y = s * (p_minor + border_size);
|
||||
points_ptr[i * 2 + 1] += p_pos;
|
||||
|
||||
colors_ptr[i * 2] = p_color;
|
||||
@ -1510,6 +1510,10 @@ void RendererCanvasCull::canvas_item_add_circle(RID p_item, const Point2 &p_pos,
|
||||
}
|
||||
}
|
||||
|
||||
void RendererCanvasCull::canvas_item_add_circle(RID p_item, const Point2 &p_pos, float p_radius, const Color &p_color, bool p_antialiased) {
|
||||
canvas_item_add_ellipse(p_item, p_pos, p_radius, p_radius, p_color, p_antialiased);
|
||||
}
|
||||
|
||||
void RendererCanvasCull::canvas_item_add_texture_rect(RID p_item, const Rect2 &p_rect, RID p_texture, bool p_tile, const Color &p_modulate, bool p_transpose) {
|
||||
Item *canvas_item = canvas_item_owner.get_or_null(p_item);
|
||||
ERR_FAIL_NULL(canvas_item);
|
||||
|
||||
@ -259,6 +259,7 @@ public:
|
||||
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, bool p_antialiased = false);
|
||||
void canvas_item_add_rect(RID p_item, const Rect2 &p_rect, const Color &p_color, bool p_antialiased);
|
||||
void canvas_item_add_ellipse(RID p_item, const Point2 &p_pos, float p_major, float p_minor, const Color &p_color, bool p_antialiased = false);
|
||||
void canvas_item_add_circle(RID p_item, const Point2 &p_pos, float p_radius, const Color &p_color, bool p_antialiased);
|
||||
void canvas_item_add_texture_rect(RID p_item, const Rect2 &p_rect, RID p_texture, bool p_tile = false, const Color &p_modulate = Color(1, 1, 1), bool p_transpose = false);
|
||||
void canvas_item_add_texture_rect_region(RID p_item, const Rect2 &p_rect, RID p_texture, const Rect2 &p_src_rect, const Color &p_modulate = Color(1, 1, 1), bool p_transpose = false, bool p_clip_uv = false);
|
||||
|
||||
@ -982,6 +982,7 @@ public:
|
||||
FUNC5(canvas_item_add_polyline, RID, const Vector<Point2> &, const Vector<Color> &, float, bool)
|
||||
FUNC5(canvas_item_add_multiline, RID, const Vector<Point2> &, const Vector<Color> &, float, bool)
|
||||
FUNC4(canvas_item_add_rect, RID, const Rect2 &, const Color &, bool)
|
||||
FUNC6(canvas_item_add_ellipse, RID, const Point2 &, float, float, const Color &, bool)
|
||||
FUNC5(canvas_item_add_circle, RID, const Point2 &, float, const Color &, bool)
|
||||
FUNC6(canvas_item_add_texture_rect, RID, const Rect2 &, RID, bool, const Color &, bool)
|
||||
FUNC7(canvas_item_add_texture_rect_region, RID, const Rect2 &, RID, const Rect2 &, const Color &, bool, bool)
|
||||
|
||||
@ -3304,6 +3304,7 @@ void RenderingServer::_bind_methods() {
|
||||
ClassDB::bind_method(D_METHOD("canvas_item_add_multiline", "item", "points", "colors", "width", "antialiased"), &RenderingServer::canvas_item_add_multiline, DEFVAL(-1.0), DEFVAL(false));
|
||||
ClassDB::bind_method(D_METHOD("canvas_item_add_rect", "item", "rect", "color", "antialiased"), &RenderingServer::canvas_item_add_rect, DEFVAL(false));
|
||||
ClassDB::bind_method(D_METHOD("canvas_item_add_circle", "item", "pos", "radius", "color", "antialiased"), &RenderingServer::canvas_item_add_circle, DEFVAL(false));
|
||||
ClassDB::bind_method(D_METHOD("canvas_item_add_ellipse", "item", "pos", "major", "minor", "color", "antialiased"), &RenderingServer::canvas_item_add_ellipse, DEFVAL(false));
|
||||
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));
|
||||
ClassDB::bind_method(D_METHOD("canvas_item_add_msdf_texture_rect_region", "item", "rect", "texture", "src_rect", "modulate", "outline_size", "px_range", "scale"), &RenderingServer::canvas_item_add_msdf_texture_rect_region, DEFVAL(Color(1, 1, 1)), DEFVAL(0), DEFVAL(1.0), DEFVAL(1.0));
|
||||
ClassDB::bind_method(D_METHOD("canvas_item_add_lcd_texture_rect_region", "item", "rect", "texture", "src_rect", "modulate"), &RenderingServer::canvas_item_add_lcd_texture_rect_region);
|
||||
|
||||
@ -1579,6 +1579,7 @@ public:
|
||||
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, bool p_antialiased = false) = 0;
|
||||
virtual void canvas_item_add_rect(RID p_item, const Rect2 &p_rect, const Color &p_color, bool p_antialiased = false) = 0;
|
||||
virtual void canvas_item_add_ellipse(RID p_item, const Point2 &p_pos, float p_major, float p_minor, const Color &p_color, bool p_antialiased = false) = 0;
|
||||
virtual void canvas_item_add_circle(RID p_item, const Point2 &p_pos, float p_radius, const Color &p_color, bool p_antialiased = false) = 0;
|
||||
virtual void canvas_item_add_texture_rect(RID p_item, const Rect2 &p_rect, RID p_texture, bool p_tile = false, const Color &p_modulate = Color(1, 1, 1), bool p_transpose = false) = 0;
|
||||
virtual void canvas_item_add_texture_rect_region(RID p_item, const Rect2 &p_rect, RID p_texture, const Rect2 &p_src_rect, const Color &p_modulate = Color(1, 1, 1), bool p_transpose = false, bool p_clip_uv = false) = 0;
|
||||
|
||||
Reference in New Issue
Block a user