16 : points_(
std::move(points)), radius_(radius), round_(round) {}
33 Scalar min_size = 0.5f / max_basis;
34 Scalar radius = std::max(radius_, min_size);
37 VertexBufferBuilder<SolidFillVertexShader::PerVertexData> vtx_builder;
44 std::vector<Point> circle_vertices;
45 circle_vertices.reserve(generator.GetVertexCount());
46 generator.GenerateVertices([&circle_vertices](
const Point& p) {
47 circle_vertices.push_back(p);
49 FML_DCHECK(circle_vertices.size() == generator.GetVertexCount());
51 vtx_builder.Reserve((circle_vertices.size() + 2) * points_.size() - 2);
52 for (
auto& center : points_) {
53 if (vtx_builder.HasVertices()) {
54 vtx_builder.AppendVertex(vtx_builder.Last());
55 vtx_builder.AppendVertex({center + circle_vertices[0]});
58 for (
auto& vertex : circle_vertices) {
59 vtx_builder.AppendVertex({center + vertex});
63 vtx_builder.Reserve(6 * points_.size() - 2);
64 for (
auto& point : points_) {
65 auto first =
Point(point.x - radius, point.y - radius);
67 if (vtx_builder.HasVertices()) {
68 vtx_builder.AppendVertex(vtx_builder.Last());
69 vtx_builder.AppendVertex({first});
73 vtx_builder.AppendVertex({first});
74 vtx_builder.AppendVertex({{point.x + radius, point.y - radius}});
75 vtx_builder.AppendVertex({{point.x - radius, point.y + radius}});
76 vtx_builder.AppendVertex({{point.x + radius, point.y + radius}});
80 return GeometryResult{
82 .vertex_buffer = vtx_builder.CreateVertexBuffer(host_buffer),
88 std::optional<Rect> PointFieldGeometry::GetCoverage(
90 if (points_.size() > 0) {
93 auto first = points_.begin();
94 auto last = points_.end();
97 auto right = first->x;
98 auto bottom = first->y;
99 for (
auto it = first + 1; it < last; ++it) {
100 left = std::min(left, it->x);
101 top = std::min(top, it->y);
102 right = std::max(right, it->x);
103 bottom = std::max(bottom, it->y);
106 right + radius_, bottom + radius_);
107 return coverage.TransformBounds(
transform);