Skip to content

Commit e625565

Browse files
committed
Merge pull request godotengine#106396 from chocola-mint/canvas-item-add-triangle-array-count
Implement the `count` parameter in `RenderingServer.canvas_item_add_triangle_array`
2 parents 8134f3f + 101dc98 commit e625565

File tree

8 files changed

+20
-18
lines changed

8 files changed

+20
-18
lines changed

doc/classes/RenderingServer.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -410,7 +410,7 @@
410410
<param index="8" name="count" type="int" default="-1" />
411411
<description>
412412
Draws a triangle array on the [CanvasItem] pointed to by the [param item] [RID]. This is internally used by [Line2D] and [StyleBoxFlat] for rendering. [method canvas_item_add_triangle_array] is highly flexible, but more complex to use than [method canvas_item_add_polygon].
413-
[b]Note:[/b] [param count] is unused and can be left unspecified.
413+
[b]Note:[/b] If [param count] is set to a non-negative value, only the first [code]count * 3[/code] indices (corresponding to [code skip-lint]count[/code] triangles) will be drawn. Otherwise, all indices are drawn.
414414
</description>
415415
</method>
416416
<method name="canvas_item_attach_skeleton">

drivers/gles3/rasterizer_canvas_gles3.cpp

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2424,7 +2424,7 @@ void RasterizerCanvasGLES3::reset_canvas() {
24242424
void RasterizerCanvasGLES3::draw_lens_distortion_rect(const Rect2 &p_rect, float p_k1, float p_k2, const Vector2 &p_eye_center, float p_oversample) {
24252425
}
24262426

2427-
RendererCanvasRender::PolygonID RasterizerCanvasGLES3::request_polygon(const Vector<int> &p_indices, const Vector<Point2> &p_points, const Vector<Color> &p_colors, const Vector<Point2> &p_uvs, const Vector<int> &p_bones, const Vector<float> &p_weights) {
2427+
RendererCanvasRender::PolygonID RasterizerCanvasGLES3::request_polygon(const Vector<int> &p_indices, const Vector<Point2> &p_points, const Vector<Color> &p_colors, const Vector<Point2> &p_uvs, const Vector<int> &p_bones, const Vector<float> &p_weights, int p_count) {
24282428
// We interleave the vertex data into one big VBO to improve cache coherence
24292429
uint32_t vertex_count = p_points.size();
24302430
uint32_t stride = 2;
@@ -2552,15 +2552,15 @@ RendererCanvasRender::PolygonID RasterizerCanvasGLES3::request_polygon(const Vec
25522552
if (p_indices.size()) {
25532553
//create indices, as indices were requested
25542554
Vector<uint8_t> index_buffer;
2555-
index_buffer.resize(p_indices.size() * sizeof(int32_t));
2555+
index_buffer.resize(p_count * sizeof(int32_t));
25562556
{
25572557
uint8_t *w = index_buffer.ptrw();
2558-
memcpy(w, p_indices.ptr(), sizeof(int32_t) * p_indices.size());
2558+
memcpy(w, p_indices.ptr(), sizeof(int32_t) * p_count);
25592559
}
25602560
glGenBuffers(1, &pb.index_buffer);
25612561
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, pb.index_buffer);
2562-
GLES3::Utilities::get_singleton()->buffer_allocate_data(GL_ELEMENT_ARRAY_BUFFER, pb.index_buffer, p_indices.size() * 4, index_buffer.ptr(), GL_STATIC_DRAW, "Polygon 2D index buffer");
2563-
pb.count = p_indices.size();
2562+
GLES3::Utilities::get_singleton()->buffer_allocate_data(GL_ELEMENT_ARRAY_BUFFER, pb.index_buffer, p_count * 4, index_buffer.ptr(), GL_STATIC_DRAW, "Polygon 2D index buffer");
2563+
pb.count = p_count;
25642564
}
25652565

25662566
glBindVertexArray(0);

drivers/gles3/rasterizer_canvas_gles3.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -200,7 +200,7 @@ class RasterizerCanvasGLES3 : public RendererCanvasRender {
200200
PolygonID last_id = 0;
201201
} polygon_buffers;
202202

203-
RendererCanvasRender::PolygonID request_polygon(const Vector<int> &p_indices, const Vector<Point2> &p_points, const Vector<Color> &p_colors, const Vector<Point2> &p_uvs = Vector<Point2>(), const Vector<int> &p_bones = Vector<int>(), const Vector<float> &p_weights = Vector<float>()) override;
203+
RendererCanvasRender::PolygonID request_polygon(const Vector<int> &p_indices, const Vector<Point2> &p_points, const Vector<Color> &p_colors, const Vector<Point2> &p_uvs = Vector<Point2>(), const Vector<int> &p_bones = Vector<int>(), const Vector<float> &p_weights = Vector<float>(), int p_count = -1) override;
204204
void free_polygon(PolygonID p_polygon) override;
205205

206206
struct InstanceData {

servers/rendering/dummy/rasterizer_canvas_dummy.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@
3434

3535
class RasterizerCanvasDummy : public RendererCanvasRender {
3636
public:
37-
PolygonID request_polygon(const Vector<int> &p_indices, const Vector<Point2> &p_points, const Vector<Color> &p_colors, const Vector<Point2> &p_uvs = Vector<Point2>(), const Vector<int> &p_bones = Vector<int>(), const Vector<float> &p_weights = Vector<float>()) override { return 0; }
37+
PolygonID request_polygon(const Vector<int> &p_indices, const Vector<Point2> &p_points, const Vector<Color> &p_colors, const Vector<Point2> &p_uvs = Vector<Point2>(), const Vector<int> &p_bones = Vector<int>(), const Vector<float> &p_weights = Vector<float>(), int p_count = -1) override { return 0; }
3838
void free_polygon(PolygonID p_polygon) override {}
3939

4040
void canvas_render_items(RID p_to_render_target, Item *p_item_list, const Color &p_modulate, Light *p_light_list, Light *p_directional_list, const Transform2D &p_canvas_transform, RS::CanvasItemTextureFilter p_default_filter, RS::CanvasItemTextureRepeat p_default_repeat, bool p_snap_2d_vertices_to_pixel, bool &r_sdf_used, RenderingMethod::RenderInfo *r_render_info = nullptr) override {}

servers/rendering/renderer_canvas_cull.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1735,7 +1735,7 @@ void RendererCanvasCull::canvas_item_add_triangle_array(RID p_item, const Vector
17351735

17361736
polygon->texture = p_texture;
17371737

1738-
polygon->polygon.create(p_indices, p_points, p_colors, p_uvs, p_bones, p_weights);
1738+
polygon->polygon.create(p_indices, p_points, p_colors, p_uvs, p_bones, p_weights, p_count);
17391739

17401740
polygon->primitive = RS::PRIMITIVE_TRIANGLES;
17411741
}

servers/rendering/renderer_canvas_render.h

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -130,16 +130,18 @@ class RendererCanvasRender {
130130
//easier wrap to avoid mistakes
131131

132132
typedef uint64_t PolygonID;
133-
virtual PolygonID request_polygon(const Vector<int> &p_indices, const Vector<Point2> &p_points, const Vector<Color> &p_colors, const Vector<Point2> &p_uvs = Vector<Point2>(), const Vector<int> &p_bones = Vector<int>(), const Vector<float> &p_weights = Vector<float>()) = 0;
133+
virtual PolygonID request_polygon(const Vector<int> &p_indices, const Vector<Point2> &p_points, const Vector<Color> &p_colors, const Vector<Point2> &p_uvs = Vector<Point2>(), const Vector<int> &p_bones = Vector<int>(), const Vector<float> &p_weights = Vector<float>(), int p_count = -1) = 0;
134134
virtual void free_polygon(PolygonID p_polygon) = 0;
135135

136136
//also easier to wrap to avoid mistakes
137137
struct Polygon {
138138
PolygonID polygon_id;
139139
Rect2 rect_cache;
140140

141-
_FORCE_INLINE_ void create(const Vector<int> &p_indices, const Vector<Point2> &p_points, const Vector<Color> &p_colors, const Vector<Point2> &p_uvs = Vector<Point2>(), const Vector<int> &p_bones = Vector<int>(), const Vector<float> &p_weights = Vector<float>()) {
141+
_FORCE_INLINE_ void create(const Vector<int> &p_indices, const Vector<Point2> &p_points, const Vector<Color> &p_colors, const Vector<Point2> &p_uvs = Vector<Point2>(), const Vector<int> &p_bones = Vector<int>(), const Vector<float> &p_weights = Vector<float>(), int p_count = -1) {
142142
ERR_FAIL_COND(polygon_id != 0);
143+
int count = p_count < 0 ? p_indices.size() : p_count * 3;
144+
ERR_FAIL_COND(count > p_indices.size());
143145
{
144146
uint32_t pc = p_points.size();
145147
const Vector2 *v2 = p_points.ptr();
@@ -148,7 +150,7 @@ class RendererCanvasRender {
148150
rect_cache.expand_to(v2[i]);
149151
}
150152
}
151-
polygon_id = singleton->request_polygon(p_indices, p_points, p_colors, p_uvs, p_bones, p_weights);
153+
polygon_id = singleton->request_polygon(p_indices, p_points, p_colors, p_uvs, p_bones, p_weights, count);
152154
}
153155

154156
_FORCE_INLINE_ Polygon() { polygon_id = 0; }

servers/rendering/renderer_rd/renderer_canvas_render_rd.cpp

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,7 @@ void RendererCanvasRenderRD::_update_transform_to_mat4(const Transform3D &p_tran
100100
p_mat4[15] = 1;
101101
}
102102

103-
RendererCanvasRender::PolygonID RendererCanvasRenderRD::request_polygon(const Vector<int> &p_indices, const Vector<Point2> &p_points, const Vector<Color> &p_colors, const Vector<Point2> &p_uvs, const Vector<int> &p_bones, const Vector<float> &p_weights) {
103+
RendererCanvasRender::PolygonID RendererCanvasRenderRD::request_polygon(const Vector<int> &p_indices, const Vector<Point2> &p_points, const Vector<Color> &p_colors, const Vector<Point2> &p_uvs, const Vector<int> &p_bones, const Vector<float> &p_weights, int p_count) {
104104
// Care must be taken to generate array formats
105105
// in ways where they could be reused, so we will
106106
// put single-occurring elements first, and repeated
@@ -311,14 +311,14 @@ RendererCanvasRender::PolygonID RendererCanvasRenderRD::request_polygon(const Ve
311311
if (p_indices.size()) {
312312
//create indices, as indices were requested
313313
Vector<uint8_t> index_buffer;
314-
index_buffer.resize(p_indices.size() * sizeof(int32_t));
314+
index_buffer.resize(p_count * sizeof(int32_t));
315315
{
316316
uint8_t *w = index_buffer.ptrw();
317317
memcpy(w, p_indices.ptr(), sizeof(int32_t) * p_indices.size());
318318
}
319-
pb.index_buffer = RD::get_singleton()->index_buffer_create(p_indices.size(), RD::INDEX_BUFFER_FORMAT_UINT32, index_buffer);
320-
pb.indices = RD::get_singleton()->index_array_create(pb.index_buffer, 0, p_indices.size());
321-
pb.primitive_count = p_indices.size();
319+
pb.index_buffer = RD::get_singleton()->index_buffer_create(p_count, RD::INDEX_BUFFER_FORMAT_UINT32, index_buffer);
320+
pb.indices = RD::get_singleton()->index_array_create(pb.index_buffer, 0, p_count);
321+
pb.primitive_count = p_count;
322322
}
323323

324324
pb.vertex_format_id = vertex_id;

servers/rendering/renderer_rd/renderer_canvas_render_rd.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -638,7 +638,7 @@ class RendererCanvasRenderRD : public RendererCanvasRender {
638638
void _update_occluder_buffer(uint32_t p_size);
639639

640640
public:
641-
PolygonID request_polygon(const Vector<int> &p_indices, const Vector<Point2> &p_points, const Vector<Color> &p_colors, const Vector<Point2> &p_uvs = Vector<Point2>(), const Vector<int> &p_bones = Vector<int>(), const Vector<float> &p_weights = Vector<float>()) override;
641+
PolygonID request_polygon(const Vector<int> &p_indices, const Vector<Point2> &p_points, const Vector<Color> &p_colors, const Vector<Point2> &p_uvs = Vector<Point2>(), const Vector<int> &p_bones = Vector<int>(), const Vector<float> &p_weights = Vector<float>(), int p_count = -1) override;
642642
void free_polygon(PolygonID p_polygon) override;
643643

644644
RID light_create() override;

0 commit comments

Comments
 (0)