Skip to content
This repository was archived by the owner on Feb 25, 2025. It is now read-only.
Prev Previous commit
style feedback from review
  • Loading branch information
flar committed Nov 30, 2023
commit 16fa52dadb490b70fd9269f556370799c17d962b
43 changes: 22 additions & 21 deletions impeller/entity/geometry/ellipse_geometry.cc
Original file line number Diff line number Diff line change
Expand Up @@ -22,21 +22,22 @@ GeometryResult EllipseGeometry::GetPositionBuffer(

Scalar radius = radius_;
const Point& center = center_;
std::shared_ptr<Tessellator> t = renderer.GetTessellator();
CircleTessellator tessellator(t, entity.GetTransform(), radius_);
size_t count = tessellator.GetCircleVertexCount();
auto vertex_buffer =
host_buffer.Emplace(count * sizeof(VT), alignof(VT),
[&tessellator, &center, radius](uint8_t* buffer) {
auto vertices = reinterpret_cast<VT*>(buffer);
tessellator.GenerateCircleTriangleStrip(
[&vertices](const Point& p) { //
*vertices++ = {
.position = p,
};
},
center, radius);
});
std::shared_ptr<Tessellator> tessellator = renderer.GetTessellator();
CircleTessellator circle_tessellator(tessellator, entity.GetTransform(),
radius_);
size_t count = circle_tessellator.GetCircleVertexCount();
auto vertex_buffer = host_buffer.Emplace(
count * sizeof(VT), alignof(VT),
[&circle_tessellator, &center, radius](uint8_t* buffer) {
auto vertices = reinterpret_cast<VT*>(buffer);
circle_tessellator.GenerateCircleTriangleStrip(
[&vertices](const Point& p) { //
*vertices++ = {
.position = p,
};
},
center, radius);
});

return GeometryResult{
.type = PrimitiveType::kTriangleStrip,
Expand Down Expand Up @@ -66,14 +67,15 @@ GeometryResult EllipseGeometry::GetPositionUVBuffer(

Scalar radius = radius_;
const Point& center = center_;
std::shared_ptr<Tessellator> t = renderer.GetTessellator();
CircleTessellator tessellator(t, entity.GetTransform(), radius_);
size_t count = tessellator.GetCircleVertexCount();
std::shared_ptr<Tessellator> tessellator = renderer.GetTessellator();
CircleTessellator circle_tessellator(tessellator, entity.GetTransform(),
radius_);
size_t count = circle_tessellator.GetCircleVertexCount();
auto vertex_buffer = host_buffer.Emplace(
count * sizeof(VT), alignof(VT),
[&tessellator, &uv_transform, &center, radius](uint8_t* buffer) {
[&circle_tessellator, &uv_transform, &center, radius](uint8_t* buffer) {
auto vertices = reinterpret_cast<VT*>(buffer);
tessellator.GenerateCircleTriangleStrip(
circle_tessellator.GenerateCircleTriangleStrip(
[&vertices, &uv_transform](const Point& p) { //
*vertices++ = {
.position = p,
Expand All @@ -91,7 +93,6 @@ GeometryResult EllipseGeometry::GetPositionUVBuffer(
.vertex_count = count,
.index_type = IndexType::kNone,
},
// .vertex_buffer = vtx_builder.CreateVertexBuffer(host_buffer),
.transform = Matrix::MakeOrthographic(pass.GetRenderTargetSize()) *
entity.GetTransform(),
.prevent_overdraw = false,
Expand Down
43 changes: 23 additions & 20 deletions impeller/entity/geometry/line_geometry.cc
Original file line number Diff line number Diff line change
Expand Up @@ -80,21 +80,22 @@ GeometryResult LineGeometry::GetPositionBuffer(const ContentContext& renderer,
const Point& p0 = p0_;
const Point& p1 = p1_;

std::shared_ptr<Tessellator> t = renderer.GetTessellator();
CircleTessellator tessellator(t, entity.GetTransform(), radius);
count = tessellator.GetCircleVertexCount();
vertex_buffer =
host_buffer.Emplace(count * sizeof(VT), alignof(VT),
[&tessellator, &p0, &p1, radius](uint8_t* buffer) {
auto vertices = reinterpret_cast<VT*>(buffer);
tessellator.GenerateRoundCapLineTriangleStrip(
[&vertices](const Point& p) { //
*vertices++ = {
.position = p,
};
},
p0, p1, radius);
});
std::shared_ptr<Tessellator> tessellator = renderer.GetTessellator();
CircleTessellator circle_tessellator(tessellator, entity.GetTransform(),
radius);
count = circle_tessellator.GetCircleVertexCount();
vertex_buffer = host_buffer.Emplace(
count * sizeof(VT), alignof(VT),
[&circle_tessellator, &p0, &p1, radius](uint8_t* buffer) {
auto vertices = reinterpret_cast<VT*>(buffer);
circle_tessellator.GenerateRoundCapLineTriangleStrip(
[&vertices](const Point& p) { //
*vertices++ = {
.position = p,
};
},
p0, p1, radius);
});
} else {
Point corners[4];
if (ComputeCorners(corners, transform, cap_ == Cap::kSquare)) {
Expand Down Expand Up @@ -148,14 +149,16 @@ GeometryResult LineGeometry::GetPositionUVBuffer(Rect texture_coverage,
const Point& p0 = p0_;
const Point& p1 = p1_;

std::shared_ptr<Tessellator> t = renderer.GetTessellator();
CircleTessellator tessellator(t, entity.GetTransform(), radius);
count = tessellator.GetCircleVertexCount();
std::shared_ptr<Tessellator> tessellator = renderer.GetTessellator();
CircleTessellator circle_tessellator(tessellator, entity.GetTransform(),
radius);
count = circle_tessellator.GetCircleVertexCount();
vertex_buffer = host_buffer.Emplace(
count * sizeof(VT), alignof(VT),
[&tessellator, &uv_transform, &p0, &p1, radius](uint8_t* buffer) {
[&circle_tessellator, &uv_transform, &p0, &p1,
radius](uint8_t* buffer) {
auto vertices = reinterpret_cast<VT*>(buffer);
tessellator.GenerateRoundCapLineTriangleStrip(
circle_tessellator.GenerateRoundCapLineTriangleStrip(
[&vertices, &uv_transform](const Point& p) { //
*vertices++ = {
.position = p,
Expand Down
12 changes: 7 additions & 5 deletions impeller/entity/geometry/point_field_geometry.cc
Original file line number Diff line number Diff line change
Expand Up @@ -83,19 +83,21 @@ PointFieldGeometry::GetPositionBufferCPU(const ContentContext& renderer,
VertexBufferBuilder<SolidFillVertexShader::PerVertexData> vtx_builder;

if (round_) {
std::shared_ptr<Tessellator> t = renderer.GetTessellator();
CircleTessellator tessellator(t, entity.GetTransform(), radius_);
std::shared_ptr<Tessellator> tessellator = renderer.GetTessellator();
CircleTessellator circle_tessellator(tessellator, entity.GetTransform(),
radius_);

// Get triangulation relative to {0, 0} so we can translate it to each
// point in turn.
std::vector<Point> circle_vertices;
circle_vertices.reserve(tessellator.GetCircleVertexCount());
tessellator.GenerateCircleTriangleStrip(
circle_vertices.reserve(circle_tessellator.GetCircleVertexCount());
circle_tessellator.GenerateCircleTriangleStrip(
[&circle_vertices](const Point& p) { //
circle_vertices.push_back(p);
},
{}, radius);
FML_DCHECK(circle_vertices.size() == tessellator.GetCircleVertexCount());
FML_DCHECK(circle_vertices.size() ==
circle_tessellator.GetCircleVertexCount());

vtx_builder.Reserve((circle_vertices.size() + 2) * points_.size() - 2);
for (auto& center : points_) {
Expand Down
21 changes: 11 additions & 10 deletions impeller/tessellator/circle_tessellator_unittests.cc
Original file line number Diff line number Diff line change
Expand Up @@ -12,13 +12,14 @@ namespace impeller {
namespace testing {

TEST(CircleTessellator, DivisionVertexCounts) {
auto t = std::make_shared<Tessellator>();
auto tessellator = std::make_shared<Tessellator>();

auto test = [&t](const Matrix& transform, Scalar radius) {
CircleTessellator tessellator(t, transform, radius);
size_t quadrant_divisions = tessellator.GetQuadrantDivisionCount();
auto test = [&tessellator](const Matrix& transform, Scalar radius) {
CircleTessellator circle_tessellator(tessellator, transform, radius);
size_t quadrant_divisions = circle_tessellator.GetQuadrantDivisionCount();

EXPECT_EQ(tessellator.GetCircleVertexCount(), (quadrant_divisions + 1) * 4)
EXPECT_EQ(circle_tessellator.GetCircleVertexCount(),
(quadrant_divisions + 1) * 4)
<< "transform = " << transform << ", radius = " << radius;

// Confirm the approximation error is within the currently accepted
Expand Down Expand Up @@ -51,14 +52,14 @@ TEST(CircleTessellator, DivisionVertexCounts) {
}

TEST(CircleTessellator, CircleTessellationVertices) {
auto t = std::make_shared<Tessellator>();
auto tessellator = std::make_shared<Tessellator>();

auto test = [&t](Scalar pixel_radius, Point center, Scalar radius) {
CircleTessellator tessellator(t, {}, pixel_radius);
auto test = [&tessellator](Scalar pixel_radius, Point center, Scalar radius) {
CircleTessellator circle_tessellator(tessellator, {}, pixel_radius);

auto vertex_count = tessellator.GetCircleVertexCount();
auto vertex_count = circle_tessellator.GetCircleVertexCount();
auto vertices = std::vector<Point>();
tessellator.GenerateCircleTriangleStrip(
circle_tessellator.GenerateCircleTriangleStrip(
[&vertices](const Point& p) { //
vertices.push_back(p);
},
Expand Down