@@ -68,37 +68,58 @@ bool LineGeometry::ComputeCorners(Point corners[4],
68
68
GeometryResult LineGeometry::GetPositionBuffer (const ContentContext& renderer,
69
69
const Entity& entity,
70
70
RenderPass& pass) const {
71
+ auto & host_buffer = pass.GetTransientsBuffer ();
72
+ using VT = SolidFillVertexShader::PerVertexData;
73
+
71
74
auto & transform = entity.GetTransform ();
72
75
auto radius = ComputeHalfWidth (transform);
73
76
74
- VertexBufferBuilder<SolidFillVertexShader::PerVertexData> vtx_builder ;
75
-
77
+ size_t count ;
78
+ BufferView vertex_buffer;
76
79
if (cap_ == Cap::kRound ) {
80
+ const Point & p0 = p0_;
81
+ const Point & p1 = p1_;
82
+
77
83
CircleTessellator tessellator (transform, radius);
78
- vtx_builder.Reserve (tessellator.GetCircleVertexCount ());
79
- tessellator.GenerateRoundCapLineTriangleStrip (
80
- [&vtx_builder](const Point & p) { //
81
- vtx_builder.AppendVertex ({.position = p});
82
- },
83
- p0_, p1_, radius);
84
+ count = tessellator.GetCircleVertexCount ();
85
+ vertex_buffer =
86
+ host_buffer.Emplace (count * sizeof (VT), alignof (VT),
87
+ [&tessellator, &p0, &p1, radius](uint8_t * buffer) {
88
+ auto vertices = reinterpret_cast <VT*>(buffer);
89
+ tessellator.GenerateRoundCapLineTriangleStrip (
90
+ [&vertices](const Point & p) { //
91
+ *vertices++ = {
92
+ .position = p,
93
+ };
94
+ },
95
+ p0, p1, radius);
96
+ });
84
97
} else {
85
98
Point corners[4 ];
86
99
if (ComputeCorners (corners, transform, cap_ == Cap::kSquare )) {
87
- vtx_builder.Reserve (4 );
88
- vtx_builder.AppendVertex ({.position = corners[0 ]});
89
- vtx_builder.AppendVertex ({.position = corners[1 ]});
90
- vtx_builder.AppendVertex ({.position = corners[2 ]});
91
- vtx_builder.AppendVertex ({.position = corners[3 ]});
100
+ count = 4 ;
101
+ vertex_buffer = host_buffer.Emplace (
102
+ count * sizeof (VT), alignof (VT), [&corners](uint8_t * buffer) {
103
+ auto vertices = reinterpret_cast <VT*>(buffer);
104
+ for (auto & corner : corners) {
105
+ *vertices++ = {
106
+ .position = corner,
107
+ };
108
+ }
109
+ });
110
+ } else {
111
+ return {};
92
112
}
93
113
}
94
- if (!vtx_builder.HasVertices ()) {
95
- return {};
96
- }
97
114
98
115
return GeometryResult{
99
116
.type = PrimitiveType::kTriangleStrip ,
100
117
.vertex_buffer =
101
- vtx_builder.CreateVertexBuffer (pass.GetTransientsBuffer ()),
118
+ {
119
+ .vertex_buffer = vertex_buffer,
120
+ .vertex_count = count,
121
+ .index_type = IndexType::kNone ,
122
+ },
102
123
.transform = Matrix::MakeOrthographic (pass.GetRenderTargetSize ()) *
103
124
entity.GetTransform (),
104
125
.prevent_overdraw = false ,
@@ -111,44 +132,64 @@ GeometryResult LineGeometry::GetPositionUVBuffer(Rect texture_coverage,
111
132
const ContentContext& renderer,
112
133
const Entity& entity,
113
134
RenderPass& pass) const {
135
+ auto & host_buffer = pass.GetTransientsBuffer ();
136
+ using VT = TextureFillVertexShader::PerVertexData;
137
+
114
138
auto & transform = entity.GetTransform ();
115
139
auto radius = ComputeHalfWidth (transform);
116
140
117
141
auto uv_transform =
118
142
texture_coverage.GetNormalizingTransform () * effect_transform;
119
- VertexBufferBuilder<TextureFillVertexShader::PerVertexData> vtx_builder;
120
143
144
+ size_t count;
145
+ BufferView vertex_buffer;
121
146
if (cap_ == Cap::kRound ) {
147
+ const Point & p0 = p0_;
148
+ const Point & p1 = p1_;
149
+
122
150
CircleTessellator tessellator (transform, radius);
123
- vtx_builder.Reserve (tessellator.GetCircleVertexCount ());
124
- tessellator.GenerateRoundCapLineTriangleStrip (
125
- [&vtx_builder, &uv_transform](const Point & p) {
126
- vtx_builder.AppendVertex ({
127
- .position = p,
128
- .texture_coords = uv_transform * p,
129
- });
130
- },
131
- p0_, p1_, radius);
151
+ count = tessellator.GetCircleVertexCount ();
152
+ vertex_buffer = host_buffer.Emplace (
153
+ count * sizeof (VT), alignof (VT),
154
+ [&tessellator, &uv_transform, &p0, &p1, radius](uint8_t * buffer) {
155
+ auto vertices = reinterpret_cast <VT*>(buffer);
156
+ tessellator.GenerateRoundCapLineTriangleStrip (
157
+ [&vertices, &uv_transform](const Point & p) { //
158
+ *vertices++ = {
159
+ .position = p,
160
+ .texture_coords = uv_transform * p,
161
+ };
162
+ },
163
+ p0, p1, radius);
164
+ });
132
165
} else {
133
166
Point corners[4 ];
134
167
if (ComputeCorners (corners, transform, cap_ == Cap::kSquare )) {
135
- vtx_builder.Reserve (4 );
136
- for (auto & corner : corners) {
137
- vtx_builder.AppendVertex ({
138
- .position = corner,
139
- .texture_coords = uv_transform * corner,
140
- });
141
- }
168
+ count = 4 ;
169
+ vertex_buffer =
170
+ host_buffer.Emplace (count * sizeof (VT), alignof (VT),
171
+ [&uv_transform, &corners](uint8_t * buffer) {
172
+ auto vertices = reinterpret_cast <VT*>(buffer);
173
+ for (auto & corner : corners) {
174
+ *vertices++ = {
175
+ .position = corner,
176
+ .texture_coords = uv_transform * corner,
177
+ };
178
+ }
179
+ });
180
+ } else {
181
+ return {};
142
182
}
143
183
}
144
- if (!vtx_builder.HasVertices ()) {
145
- return {};
146
- }
147
184
148
185
return GeometryResult{
149
186
.type = PrimitiveType::kTriangleStrip ,
150
187
.vertex_buffer =
151
- vtx_builder.CreateVertexBuffer (pass.GetTransientsBuffer ()),
188
+ {
189
+ .vertex_buffer = vertex_buffer,
190
+ .vertex_count = count,
191
+ .index_type = IndexType::kNone ,
192
+ },
152
193
.transform = Matrix::MakeOrthographic (pass.GetRenderTargetSize ()) *
153
194
entity.GetTransform (),
154
195
.prevent_overdraw = false ,
0 commit comments