@@ -70,44 +70,37 @@ bool LineGeometry::ComputeCorners(Point corners[4],
7070GeometryResult LineGeometry::GetPositionBuffer (const ContentContext& renderer,
7171 const Entity& entity,
7272 RenderPass& pass) {
73- std::vector<Point> vertices;
7473 auto & transform = entity.GetTransformation ();
7574 auto radius = ComputeHalfWidth (transform);
7675
76+ VertexBufferBuilder<SolidFillVertexShader::PerVertexData> vtx_builder;
77+
7778 if (cap_ == Cap::kRound ) {
7879 CircleTessellator tessellator (transform, radius);
79- vertices. reserve (tessellator.GetCircleVertexCount ());
80+ vtx_builder. Reserve (tessellator.GetCircleVertexCount ());
8081 tessellator.GenerateRoundCapLineTriangleStrip (
81- [&vertices ](const Point& p) { //
82- vertices. push_back (p );
82+ [&vtx_builder ](const Point& p) { //
83+ vtx_builder. AppendVertex ({. position = p} );
8384 },
8485 p0_, p1_, radius);
8586 } else {
8687 Point corners[4 ];
8788 if (ComputeCorners (corners, transform, cap_ == Cap::kSquare )) {
88- vertices. reserve (4 );
89- vertices. push_back ( corners[0 ]);
90- vertices. push_back ( corners[1 ]);
91- vertices. push_back ( corners[2 ]);
92- vertices. push_back ( corners[3 ]);
89+ vtx_builder. Reserve (4 );
90+ vtx_builder. AppendVertex ({. position = corners[0 ]} );
91+ vtx_builder. AppendVertex ({. position = corners[1 ]} );
92+ vtx_builder. AppendVertex ({. position = corners[2 ]} );
93+ vtx_builder. AppendVertex ({. position = corners[3 ]} );
9394 }
9495 }
95- if (vertices. empty ()) {
96+ if (!vtx_builder. HasVertices ()) {
9697 return {};
9798 }
9899
99- static_assert (sizeof (Point) == 2 * sizeof (float ));
100- static_assert (alignof (Point) == alignof (float ));
101100 return GeometryResult{
102101 .type = PrimitiveType::kTriangleStrip ,
103102 .vertex_buffer =
104- {
105- .vertex_buffer = pass.GetTransientsBuffer ().Emplace (
106- vertices.data (), vertices.size () * sizeof (Point),
107- alignof (Point)),
108- .vertex_count = vertices.size (),
109- .index_type = IndexType::kNone ,
110- },
103+ vtx_builder.CreateVertexBuffer (pass.GetTransientsBuffer ()),
111104 .transform = Matrix::MakeOrthographic (pass.GetRenderTargetSize ()) *
112105 entity.GetTransformation (),
113106 .prevent_overdraw = false ,
@@ -120,52 +113,44 @@ GeometryResult LineGeometry::GetPositionUVBuffer(Rect texture_coverage,
120113 const ContentContext& renderer,
121114 const Entity& entity,
122115 RenderPass& pass) {
123- std::vector<Point> vertices;
124116 auto & transform = entity.GetTransformation ();
125117 auto radius = ComputeHalfWidth (transform);
126118
127119 auto uv_transform =
128120 texture_coverage.GetNormalizingTransform () * effect_transform;
121+ VertexBufferBuilder<TextureFillVertexShader::PerVertexData> vtx_builder;
129122
130123 if (cap_ == Cap::kRound ) {
131124 CircleTessellator tessellator (transform, radius);
132- vertices. reserve (tessellator.GetCircleVertexCount () * 2 );
125+ vtx_builder. Reserve (tessellator.GetCircleVertexCount ());
133126 tessellator.GenerateRoundCapLineTriangleStrip (
134- [&vertices, &uv_transform](const Point& p) {
135- vertices.push_back (p);
136- vertices.push_back (uv_transform * p);
127+ [&vtx_builder, &uv_transform](const Point& p) {
128+ vtx_builder.AppendVertex ({
129+ .position = p,
130+ .texture_coords = uv_transform * p,
131+ });
137132 },
138133 p0_, p1_, radius);
139134 } else {
140135 Point corners[4 ];
141136 if (ComputeCorners (corners, transform, cap_ == Cap::kSquare )) {
142- vertices.reserve (8 );
143- vertices.push_back (corners[0 ]);
144- vertices.push_back (uv_transform * corners[0 ]);
145- vertices.push_back (corners[1 ]);
146- vertices.push_back (uv_transform * corners[1 ]);
147- vertices.push_back (corners[2 ]);
148- vertices.push_back (uv_transform * corners[2 ]);
149- vertices.push_back (corners[3 ]);
150- vertices.push_back (uv_transform * corners[3 ]);
137+ vtx_builder.Reserve (4 );
138+ for (auto & corner : corners) {
139+ vtx_builder.AppendVertex ({
140+ .position = corner,
141+ .texture_coords = uv_transform * corner,
142+ });
143+ }
151144 }
152145 }
153- if (vertices. empty ()) {
146+ if (!vtx_builder. HasVertices ()) {
154147 return {};
155148 }
156149
157- static_assert (sizeof (Point) == 2 * sizeof (float ));
158- static_assert (alignof (Point) == alignof (float ));
159150 return GeometryResult{
160151 .type = PrimitiveType::kTriangleStrip ,
161152 .vertex_buffer =
162- {
163- .vertex_buffer = pass.GetTransientsBuffer ().Emplace (
164- vertices.data (), vertices.size () * sizeof (Point),
165- alignof (Point)),
166- .vertex_count = vertices.size () / 2 ,
167- .index_type = IndexType::kNone ,
168- },
153+ vtx_builder.CreateVertexBuffer (pass.GetTransientsBuffer ()),
169154 .transform = Matrix::MakeOrthographic (pass.GetRenderTargetSize ()) *
170155 entity.GetTransformation (),
171156 .prevent_overdraw = false ,
0 commit comments