diff --git a/doc/classes/RenderingServer.xml b/doc/classes/RenderingServer.xml index 299365ddfd..5a73ad34ba 100644 --- a/doc/classes/RenderingServer.xml +++ b/doc/classes/RenderingServer.xml @@ -457,13 +457,6 @@ [b]Note:[/b] The equivalent node is [CanvasItem]. - - - - - Ends draw call pre-sorting. See [method canvas_item_set_presort_level]. - - @@ -625,14 +618,6 @@ Sets a parent [CanvasItem] to the [CanvasItem]. The item will inherit transform, modulation and visibility from its parent, like [CanvasItem] nodes in the scene tree. - - - - - - Starts draw call pre-sorting or changes the pre-sorting level. All subsequent draw calls until [method canvas_item_flush_presort] is called are sorted according to the [param order] (in ascending order) and texture usage, to ensure draw call batching. The original call order is not preserved, except [method canvas_item_add_set_transform], [method canvas_item_add_clip_ignore], and [method canvas_item_add_animation_slice] effects. Draw calls made before the first [method canvas_item_set_presort_level] call or after [method canvas_item_flush_presort] is called are also not affected. [param order] should be greater or equal to zero. - - diff --git a/drivers/gles3/rasterizer_canvas_gles3.cpp b/drivers/gles3/rasterizer_canvas_gles3.cpp index cd018933b0..3b570522c9 100644 --- a/drivers/gles3/rasterizer_canvas_gles3.cpp +++ b/drivers/gles3/rasterizer_canvas_gles3.cpp @@ -446,7 +446,7 @@ void RasterizerCanvasGLES3::canvas_render_items(RID p_to_render_target, Item *p_ } if (ci->skeleton.is_valid()) { - const Item::Command *c = ci->first_command; + const Item::Command *c = ci->commands; while (c) { if (c->type == Item::Command::TYPE_MESH) { @@ -876,7 +876,7 @@ void RasterizerCanvasGLES3::_record_item_commands(const Item *p_item, RID p_rend } const RSE::CanvasItemTextureRepeat base_texture_repeat = p_item->texture_repeat == RSE::CANVAS_ITEM_TEXTURE_REPEAT_DEFAULT ? state.default_repeat : p_item->texture_repeat; - const Item::Command *c = p_item->first_command; + const Item::Command *c = p_item->commands; while (c) { if (skipping && c->type != Item::Command::TYPE_ANIMATION_SLICE) { c = c->next; diff --git a/editor/script/script_text_editor.cpp b/editor/script/script_text_editor.cpp index 87ae2b2dde..b01b678d0f 100644 --- a/editor/script/script_text_editor.cpp +++ b/editor/script/script_text_editor.cpp @@ -586,18 +586,14 @@ Array ScriptTextEditor::_inline_object_parse(const String &p_text) { } void ScriptTextEditor::_inline_object_draw(const Dictionary &p_info, const Rect2 &p_rect) { - // Note: this method uses pre-sorted draw, draw call order is ignored, use `canvas_item_set_presort_level` to specify draw order. See TextEdit::DrawStep. if (_is_valid_color_info(p_info)) { Rect2 col_rect = p_rect.grow(-4); if (color_alpha_texture.is_null()) { color_alpha_texture = inline_color_picker->get_theme_icon("sample_bg", "ColorPicker"); } RID text_ci = code_editor->get_text_editor()->get_text_canvas_item(); - RenderingServer::get_singleton()->canvas_item_set_presort_level(text_ci, TextEdit::DrawStep::DRAW_STEP_TEXT_OUTLINE); RS::get_singleton()->canvas_item_add_rect(text_ci, p_rect.grow(-3), Color(1, 1, 1)); - RenderingServer::get_singleton()->canvas_item_set_presort_level(text_ci, TextEdit::DrawStep::DRAW_STEP_TEXT); color_alpha_texture->draw_rect(text_ci, col_rect); - RenderingServer::get_singleton()->canvas_item_set_presort_level(text_ci, TextEdit::DrawStep::DRAW_STEP_TEXT_OVERLAY); RS::get_singleton()->canvas_item_add_rect(text_ci, col_rect, Color(p_info["color"])); } } diff --git a/scene/gui/code_edit.cpp b/scene/gui/code_edit.cpp index 0808d13288..776afd599f 100644 --- a/scene/gui/code_edit.cpp +++ b/scene/gui/code_edit.cpp @@ -1525,7 +1525,6 @@ bool CodeEdit::is_drawing_executing_lines_gutter() const { } void CodeEdit::_main_gutter_draw_callback(int p_line, int p_gutter, const Rect2 &p_region) { - // Note: this method uses pre-sorted draw, draw call order is ignored, use `canvas_item_set_presort_level` to specify draw order. See TextEdit::DrawStep. bool hovering = get_hovered_gutter() == Vector2i(main_gutter, p_line); RID ci = get_text_canvas_item(); if (draw_breakpoints && theme_cache.breakpoint_icon.is_valid()) { @@ -1716,7 +1715,6 @@ int CodeEdit::get_line_numbers_min_digits() const { } void CodeEdit::_line_number_draw_callback(int p_line, int p_gutter, const Rect2 &p_region) { - // Note: this method uses pre-sorted draw, draw call order is ignored, use `canvas_item_set_presort_level` to specify draw order. See TextEdit::DrawStep. if (!Rect2(Vector2(0, 0), get_size()).intersects(p_region)) { return; } @@ -1779,7 +1777,6 @@ bool CodeEdit::is_drawing_fold_gutter() const { } void CodeEdit::_fold_gutter_draw_callback(int p_line, int p_gutter, Rect2 p_region) { - // Note: this method uses pre-sorted draw, draw call order is ignored, use `canvas_item_set_presort_level` to specify draw order. See TextEdit::DrawStep. if (!can_fold_line(p_line) && !is_line_folded(p_line)) { set_line_gutter_clickable(p_line, fold_gutter, false); return; diff --git a/scene/gui/label.cpp b/scene/gui/label.cpp index 4651afdc20..4de80ad740 100644 --- a/scene/gui/label.cpp +++ b/scene/gui/label.cpp @@ -804,7 +804,6 @@ void Label::_notification(int p_what) { int visible_glyphs = total_glyphs * visible_ratio; int line_index = 0; - // Note: part of this method between this comment and `canvas_item_flush_presort` call uses pre-sorted draw, draw call order is ignored, use `canvas_item_set_presort_level` to specify draw order. for (int p = 0; p < paragraphs.size(); p++) { const Paragraph ¶ = paragraphs[p]; if (line_index + para.lines_rid.size() <= lines_skipped) { @@ -844,17 +843,12 @@ void Label::_notification(int p_what) { int processed_glyphs_step = 0; // Draw shadow outline. - int draw_step = 0; if (font_shadow_color.a != 0 && shadow_outline_size > 0) { - RenderingServer::get_singleton()->canvas_item_set_presort_level(ci, draw_step); - draw_step++; draw_text(rtl, ellipsis_pos, ellipsis_gl_size, ellipsis_glyphs, trim_chars, para.start, visible_chars, trim_glyphs_ltr, processed_glyphs_step, processed_glyphs, visible_glyphs, trim_glyphs_rtl, total_glyphs, ci, ofs, gl_size, trim_pos, glyphs, font_shadow_color, draw_glyph_shadow_outline, shadow_outline_size, shadow_ofs); } // Draw shadow. if (font_shadow_color.a > 0) { - RenderingServer::get_singleton()->canvas_item_set_presort_level(ci, draw_step); - draw_step++; draw_text(rtl, ellipsis_pos, ellipsis_gl_size, ellipsis_glyphs, trim_chars, para.start, visible_chars, trim_glyphs_ltr, processed_glyphs_step, processed_glyphs, visible_glyphs, trim_glyphs_rtl, total_glyphs, ci, ofs, gl_size, trim_pos, glyphs, font_shadow_color, draw_glyph_shadow, shadow_ofs); } @@ -865,12 +859,9 @@ void Label::_notification(int p_what) { for (int draw_iteration_index = draw_iterations - 1; draw_iteration_index >= 0; --draw_iteration_index) { LabelSettings::StackedShadowData stacked_shadow_data = stacked_shadow_datas[draw_iteration_index]; if (stacked_shadow_data.outline_size > 0) { - RenderingServer::get_singleton()->canvas_item_set_presort_level(ci, draw_step); - draw_step++; draw_text(rtl, ellipsis_pos, ellipsis_gl_size, ellipsis_glyphs, trim_chars, para.start, visible_chars, trim_glyphs_ltr, processed_glyphs_step, processed_glyphs, visible_glyphs, trim_glyphs_rtl, total_glyphs, ci, ofs, gl_size, trim_pos, glyphs, stacked_shadow_data.color, draw_glyph_shadow_outline, stacked_shadow_data.outline_size, stacked_shadow_data.offset); } - RenderingServer::get_singleton()->canvas_item_set_presort_level(ci, draw_step); - draw_step++; + draw_text(rtl, ellipsis_pos, ellipsis_gl_size, ellipsis_glyphs, trim_chars, para.start, visible_chars, trim_glyphs_ltr, processed_glyphs_step, processed_glyphs, visible_glyphs, trim_glyphs_rtl, total_glyphs, ci, ofs, gl_size, trim_pos, glyphs, stacked_shadow_data.color, draw_glyph_shadow, stacked_shadow_data.offset); } } @@ -894,8 +885,6 @@ void Label::_notification(int p_what) { if (stacked_outline_data.size <= 0) { continue; } - RenderingServer::get_singleton()->canvas_item_set_presort_level(ci, draw_step); - draw_step++; draw_text(rtl, ellipsis_pos, ellipsis_gl_size, ellipsis_glyphs, trim_chars, para.start, visible_chars, trim_glyphs_ltr, processed_glyphs_step, processed_glyphs, visible_glyphs, trim_glyphs_rtl, total_glyphs, ci, ofs, gl_size, trim_pos, glyphs, stacked_outline_data.color, draw_glyph_outline, stacked_outline_draw_size); stacked_outline_draw_size -= stacked_outline_data.size; } @@ -903,15 +892,11 @@ void Label::_notification(int p_what) { // Draw outline. if (outline_size > 0 && font_outline_color.a != 0) { - RenderingServer::get_singleton()->canvas_item_set_presort_level(ci, draw_step); - draw_step++; draw_text(rtl, ellipsis_pos, ellipsis_gl_size, ellipsis_glyphs, trim_chars, para.start, visible_chars, trim_glyphs_ltr, processed_glyphs_step, processed_glyphs, visible_glyphs, trim_glyphs_rtl, total_glyphs, ci, ofs, gl_size, trim_pos, glyphs, font_outline_color, draw_glyph_outline, outline_size); } // Draw text. { - RenderingServer::get_singleton()->canvas_item_set_presort_level(ci, draw_step); - draw_step++; draw_text(rtl, ellipsis_pos, ellipsis_gl_size, ellipsis_glyphs, trim_chars, para.start, visible_chars, trim_glyphs_ltr, processed_glyphs_step, processed_glyphs, visible_glyphs, trim_glyphs_rtl, total_glyphs, ci, ofs, gl_size, trim_pos, glyphs, font_color, draw_glyph); } @@ -922,7 +907,6 @@ void Label::_notification(int p_what) { line_index += para.lines_rid.size(); } } - RenderingServer::get_singleton()->canvas_item_flush_presort(ci); } break; case NOTIFICATION_THEME_CHANGED: { diff --git a/scene/gui/line_edit.cpp b/scene/gui/line_edit.cpp index 1d436b9b78..b6209ab35f 100644 --- a/scene/gui/line_edit.cpp +++ b/scene/gui/line_edit.cpp @@ -1519,13 +1519,11 @@ void LineEdit::_notification(int p_what) { int gl_size = TS->shaped_text_get_glyph_count(text_rid); // Draw text. - // Note: part of this method between this comment and `canvas_item_flush_presort` call uses pre-sorted draw, draw call order is ignored, use `canvas_item_set_presort_level` to specify draw order. ofs.y += TS->shaped_text_get_ascent(text_rid); Color font_outline_color = theme_cache.font_outline_color; int outline_size = theme_cache.font_outline_size; if (outline_size > 0 && font_outline_color.a > 0) { Vector2 oofs = ofs; - RenderingServer::get_singleton()->canvas_item_set_presort_level(ci, DRAW_STEP_OUTLINE); for (int i = 0; i < gl_size; i++) { for (int j = 0; j < glyphs[i].repeat; j++) { if (std::ceil(oofs.x) >= x_ofs && (oofs.x + glyphs[i].advance) <= ofs_max) { @@ -1540,7 +1538,6 @@ void LineEdit::_notification(int p_what) { } } } - RenderingServer::get_singleton()->canvas_item_set_presort_level(ci, DRAW_STEP_TEXT); for (int i = 0; i < gl_size; i++) { bool selected = selection.enabled && glyphs[i].start >= selection.begin && glyphs[i].end <= selection.end; for (int j = 0; j < glyphs[i].repeat; j++) { @@ -1557,7 +1554,6 @@ void LineEdit::_notification(int p_what) { break; } } - RenderingServer::get_singleton()->canvas_item_flush_presort(ci); // Draw carets. ofs.x = x_ofs + scroll_offset; diff --git a/scene/gui/line_edit.h b/scene/gui/line_edit.h index 303bde6162..f1e8477eed 100644 --- a/scene/gui/line_edit.h +++ b/scene/gui/line_edit.h @@ -91,11 +91,6 @@ public: }; private: - enum LEDrawStep { - DRAW_STEP_OUTLINE, - DRAW_STEP_TEXT, - }; - HorizontalAlignment alignment = HORIZONTAL_ALIGNMENT_LEFT; bool editing = false; diff --git a/scene/gui/rich_text_label.cpp b/scene/gui/rich_text_label.cpp index ac1bdef9b0..c60934be26 100644 --- a/scene/gui/rich_text_label.cpp +++ b/scene/gui/rich_text_label.cpp @@ -1078,8 +1078,7 @@ void RichTextLabel::_update_table_size(ItemTable *p_table) { } } -int RichTextLabel::_draw_line(ItemFrame *p_frame, int p_line, const Vector2 &p_ofs, int p_width, float p_vsep, const Color &p_base_color, int p_outline_size, const Color &p_outline_color, const Color &p_font_shadow_color, int p_shadow_outline_size, const Point2 &p_shadow_ofs, int &r_processed_glyphs, int p_draw_step) { - // Note: this method uses pre-sorted draw, draw call order is ignored, use `canvas_item_set_presort_level` to specify draw order. +int RichTextLabel::_draw_line(ItemFrame *p_frame, int p_line, const Vector2 &p_ofs, int p_width, float p_vsep, const Color &p_base_color, int p_outline_size, const Color &p_outline_color, const Color &p_font_shadow_color, int p_shadow_outline_size, const Point2 &p_shadow_ofs, int &r_processed_glyphs) { ERR_FAIL_NULL_V(p_frame, 0); ERR_FAIL_COND_V(p_line < 0 || p_line >= (int)p_frame->lines.size(), 0); @@ -1110,10 +1109,8 @@ int RichTextLabel::_draw_line(ItemFrame *p_frame, int p_line, const Vector2 &p_o bool skip_dc = (trim_chars && l.char_offset > visible_characters) || (trim_glyphs_ltr && (r_processed_glyphs >= visible_glyphs)) || (trim_glyphs_rtl && (r_processed_glyphs < total_glyphs - visible_glyphs)); if (!skip_dc) { if (l.dc_ol_size > 0) { - RenderingServer::get_singleton()->canvas_item_set_presort_level(ci, p_draw_step + DRAW_STEP_OUTLINE); l.text_buf->draw_dropcap_outline(ci, p_ofs + ((rtl) ? Vector2() : Vector2(l.offset.x, 0)), l.dc_ol_size, l.dc_ol_color); } - RenderingServer::get_singleton()->canvas_item_set_presort_level(ci, p_draw_step + DRAW_STEP_TEXT); l.text_buf->draw_dropcap(ci, p_ofs + ((rtl) ? Vector2() : Vector2(l.offset.x, 0)), l.dc_color); } @@ -1181,24 +1178,20 @@ int RichTextLabel::_draw_line(ItemFrame *p_frame, int p_line, const Vector2 &p_o Color font_outline_color = l.prefix_outline_color == Color(0, 0, 0, 0) ? _find_outline_color(l.from, p_base_color) : l.prefix_outline_color; Color font_shadow_color = p_font_shadow_color * Color(1, 1, 1, font_color.a); if (rtl) { - RenderingServer::get_singleton()->canvas_item_set_presort_level(ci, p_draw_step + DRAW_STEP_OUTLINE); if (p_shadow_outline_size > 0 && font_shadow_color.a != 0.0) { l.text_prefix->draw_outline(ci, p_ofs + Vector2(off.x + length, 0) + p_shadow_ofs, p_shadow_outline_size, font_shadow_color); } if (outline_size > 0 && font_outline_color.a != 0.0) { l.text_prefix->draw_outline(ci, p_ofs + Vector2(off.x + length, 0), outline_size, font_outline_color); } - RenderingServer::get_singleton()->canvas_item_set_presort_level(ci, p_draw_step + DRAW_STEP_TEXT); l.text_prefix->draw(ci, p_ofs + Vector2(off.x + length, 0), font_color); } else { - RenderingServer::get_singleton()->canvas_item_set_presort_level(ci, p_draw_step + DRAW_STEP_OUTLINE); if (p_shadow_outline_size > 0 && font_shadow_color.a != 0.0) { l.text_prefix->draw_outline(ci, p_ofs + Vector2(off.x - l.text_prefix->get_size().x, 0) + p_shadow_ofs, p_shadow_outline_size, font_shadow_color); } if (outline_size > 0 && font_outline_color.a != 0.0) { l.text_prefix->draw_outline(ci, p_ofs + Vector2(off.x - l.text_prefix->get_size().x, 0), outline_size, font_outline_color); } - RenderingServer::get_singleton()->canvas_item_set_presort_level(ci, p_draw_step + DRAW_STEP_TEXT); l.text_prefix->draw(ci, p_ofs + Vector2(off.x - l.text_prefix->get_size().x, 0), font_color); } } @@ -1232,7 +1225,7 @@ int RichTextLabel::_draw_line(ItemFrame *p_frame, int p_line, const Vector2 &p_o } int processed_glyphs_step = 0; - for (int step = DRAW_STEP_BACKGROUND; step < DRAW_STEP_TEXT_MAX; step++) { + for (int step = DRAW_STEP_BACKGROUND; step < DRAW_STEP_MAX; step++) { if (step == DRAW_STEP_TEXT) { // Draw inlined objects. Array objects = TS->shaped_text_get_objects(rid); @@ -1253,7 +1246,6 @@ int RichTextLabel::_draw_line(ItemFrame *p_frame, int p_line, const Vector2 &p_o switch (it->type) { case ITEM_IMAGE: { ItemImage *img = static_cast(it); - RenderingServer::get_singleton()->canvas_item_set_presort_level(ci, p_draw_step + DRAW_STEP_TEXT); if (img->pad) { Size2 pad_size = rect.size.min(img->image->get_size()); Vector2 pad_off = (rect.size - pad_size) / 2; @@ -1282,6 +1274,7 @@ int RichTextLabel::_draw_line(ItemFrame *p_frame, int p_line, const Vector2 &p_o table_ofs -= Vector2(h_separation * 0.5, v_separation * 0.5).floor(); } + bool right_has_border = false; int idx = 0; for (Item *E : table->subitems) { ItemFrame *frame = static_cast(E); @@ -1308,19 +1301,29 @@ int RichTextLabel::_draw_line(ItemFrame *p_frame, int p_line, const Vector2 &p_o row_bg = frame->even_row_bg != Color(0, 0, 0, 0) ? frame->even_row_bg : even_row_bg; } if (row_bg.a > 0.0) { - RenderingServer::get_singleton()->canvas_item_set_presort_level(ci, p_draw_step + DRAW_STEP_CELL_BACKGROUND); - draw_rect(cell_rect, row_bg, true); + if (right_has_border) { + // To prevent the border of the right cell from being covered. + cell_rect.size.x -= 1; + draw_rect(cell_rect, row_bg, true); + cell_rect.size.x += 1; + } else { + draw_rect(cell_rect, row_bg, true); + } } + right_has_border = false; + Color bc = frame->border != Color(0, 0, 0, 0) ? frame->border : border; if (bc.a > 0.0) { - RenderingServer::get_singleton()->canvas_item_set_presort_level(ci, p_draw_step + DRAW_STEP_CELL_BORDER); + if (rtl && col < col_count - 1) { + right_has_border = true; + } draw_rect(cell_rect, bc, false); } } for (int j = 0; j < (int)frame->lines.size(); j++) { - _draw_line(frame, j, p_ofs + rect.position + off + Vector2(0, frame->lines[j].offset.y), rect.size.x, 0, p_base_color, p_outline_size, p_outline_color, p_font_shadow_color, p_shadow_outline_size, p_shadow_ofs, r_processed_glyphs, p_draw_step + DRAW_STEP_MAX); + _draw_line(frame, j, p_ofs + rect.position + off + Vector2(0, frame->lines[j].offset.y), rect.size.x, 0, p_base_color, p_outline_size, p_outline_color, p_font_shadow_color, p_shadow_outline_size, p_shadow_ofs, r_processed_glyphs); } idx++; } @@ -1331,7 +1334,6 @@ int RichTextLabel::_draw_line(ItemFrame *p_frame, int p_line, const Vector2 &p_o } } } - RenderingServer::get_singleton()->canvas_item_set_presort_level(ci, p_draw_step + step); Vector2 off_step = off; processed_glyphs_step = r_processed_glyphs; @@ -2837,11 +2839,10 @@ void RichTextLabel::_notification(int p_what) { // New cache draw. Point2 ofs = text_rect.get_position() + Vector2(0, vbegin + main->lines[from_line].offset.y - vofs); int processed_glyphs = 0; - // Note: this loop uses pre-sorted draw, draw call order is ignored, use `canvas_item_set_presort_level` to specify draw order. while (ofs.y < size.height - v_limit && from_line < to_line) { MutexLock lock(main->lines[from_line].text_buf->get_mutex()); - int drawn_lines = _draw_line(main, from_line, ofs, text_rect.size.x, vsep, theme_cache.default_color, theme_cache.outline_size, theme_cache.font_outline_color, theme_cache.font_shadow_color, theme_cache.shadow_outline_size, shadow_ofs, processed_glyphs, 0); + int drawn_lines = _draw_line(main, from_line, ofs, text_rect.size.x, vsep, theme_cache.default_color, theme_cache.outline_size, theme_cache.font_outline_color, theme_cache.font_shadow_color, theme_cache.shadow_outline_size, shadow_ofs, processed_glyphs); visible_line_count += drawn_lines; if (drawn_lines > 0) { visible_paragraph_count++; @@ -2849,7 +2850,6 @@ void RichTextLabel::_notification(int p_what) { ofs.y += main->lines[from_line].text_buf->get_size().y + main->lines[from_line].text_buf->get_line_count() * (theme_cache.line_separation + vsep) + (theme_cache.paragraph_separation); from_line++; } - RenderingServer::get_singleton()->canvas_item_flush_presort(ci); if (scroll_follow_visible_characters && scroll_active) { scroll_visible = follow_vc_pos > 0; if (scroll_visible) { diff --git a/scene/gui/rich_text_label.h b/scene/gui/rich_text_label.h index b8024b3a76..0c1fb8a05d 100644 --- a/scene/gui/rich_text_label.h +++ b/scene/gui/rich_text_label.h @@ -57,9 +57,6 @@ class RichTextLabel : public Control { DRAW_STEP_OUTLINE, DRAW_STEP_TEXT, DRAW_STEP_FOREGROUND, - DRAW_STEP_TEXT_MAX, - DRAW_STEP_CELL_BACKGROUND = DRAW_STEP_TEXT_MAX, - DRAW_STEP_CELL_BORDER, DRAW_STEP_MAX, }; @@ -669,7 +666,7 @@ private: void _update_table_size(ItemTable *p_table); void _update_line_font(ItemFrame *p_frame, int p_line, const Ref &p_base_font, int p_base_font_size); - int _draw_line(ItemFrame *p_frame, int p_line, const Vector2 &p_ofs, int p_width, float p_vsep, const Color &p_base_color, int p_outline_size, const Color &p_outline_color, const Color &p_font_shadow_color, int p_shadow_outline_size, const Point2 &p_shadow_ofs, int &r_processed_glyphs, int p_draw_step); + int _draw_line(ItemFrame *p_frame, int p_line, const Vector2 &p_ofs, int p_width, float p_vsep, const Color &p_base_color, int p_outline_size, const Color &p_outline_color, const Color &p_font_shadow_color, int p_shadow_outline_size, const Point2 &p_shadow_ofs, int &r_processed_glyphs); float _find_click_in_line(ItemFrame *p_frame, int p_line, const Vector2 &p_ofs, int p_width, float p_vsep, const Point2i &p_click, ItemFrame **r_click_frame = nullptr, int *r_click_line = nullptr, Item **r_click_item = nullptr, int *r_click_char = nullptr, bool p_table = false, bool p_meta = false); void _accessibility_update_line(RID p_id, ItemFrame *p_frame, int p_line, const Vector2 &p_ofs, int p_width, float p_vsep); diff --git a/scene/gui/text_edit.cpp b/scene/gui/text_edit.cpp index 4786d7b0f9..cd092bd4ff 100644 --- a/scene/gui/text_edit.cpp +++ b/scene/gui/text_edit.cpp @@ -1336,7 +1336,6 @@ void TextEdit::_notification(int p_what) { _draw_guidelines(); // Draw main text. - // Note: part of this method between this comment and `canvas_item_flush_presort` call uses pre-sorted draw, draw call order is ignored, use `canvas_item_set_presort_level` to specify draw order. line_drawing_cache.clear(); int row_height = draw_placeholder ? placeholder_line_height + theme_cache.line_spacing : get_line_height(); int line = first_vis_line; @@ -1409,7 +1408,6 @@ void TextEdit::_notification(int p_what) { break; } - RenderingServer::get_singleton()->canvas_item_set_presort_level(text_ci, DRAW_STEP_LINE_BACKGROUND); if (text.get_line_background_color(line).a > 0.0) { if (rtl) { RS::get_singleton()->canvas_item_add_rect(text_ci, Rect2(size.width - xmargin_end, ofs_y, xmargin_end - xmargin_beg, row_height), text.get_line_background_color(line)); @@ -1419,7 +1417,6 @@ void TextEdit::_notification(int p_what) { } // Draw current line highlight. - RenderingServer::get_singleton()->canvas_item_set_presort_level(text_ci, DRAW_STEP_LINE_HIGHLIGHT); if (highlight_current_line && highlighted_lines.has(Pair(line, line_wrap_index))) { if (rtl) { RS::get_singleton()->canvas_item_add_rect(text_ci, Rect2(size.width - xmargin_end, ofs_y, xmargin_end, row_height), theme_cache.current_line_color); @@ -1454,10 +1451,8 @@ void TextEdit::_notification(int p_what) { int yofs = ofs_y + (row_height - tl->get_size().y) / 2; if (theme_cache.outline_size > 0 && theme_cache.outline_color.a > 0) { - RenderingServer::get_singleton()->canvas_item_set_presort_level(text_ci, DRAW_STEP_TEXT_OUTLINE); tl->draw_outline(text_ci, Point2(gutter_offset, yofs), theme_cache.outline_size, theme_cache.outline_color); } - RenderingServer::get_singleton()->canvas_item_set_presort_level(text_ci, DRAW_STEP_TEXT); tl->draw(text_ci, Point2(gutter_offset, yofs), get_line_gutter_item_color(line, g)); } break; case GUTTER_TYPE_ICON: { @@ -1489,7 +1484,7 @@ void TextEdit::_notification(int p_what) { if (rtl) { gutter_rect.position.x = size.width - gutter_rect.position.x - gutter_rect.size.x; } - RenderingServer::get_singleton()->canvas_item_set_presort_level(text_ci, DRAW_STEP_TEXT); + icon->draw_rect(text_ci, gutter_rect, false, get_line_gutter_item_color(line, g)); } break; case GUTTER_TYPE_CUSTOM: { @@ -1498,7 +1493,6 @@ void TextEdit::_notification(int p_what) { if (rtl) { gutter_rect.position.x = size.width - gutter_rect.position.x - gutter_rect.size.x; } - RenderingServer::get_singleton()->canvas_item_set_presort_level(text_ci, DRAW_STEP_TEXT); gutter.custom_draw_callback.call(line, g, Rect2(gutter_rect)); } } break; @@ -1532,7 +1526,6 @@ void TextEdit::_notification(int p_what) { // Draw selections. float char_w = theme_cache.font->get_char_size(' ', theme_cache.font_size).width; - RenderingServer::get_singleton()->canvas_item_set_presort_level(text_ci, DRAW_STEP_TEXT_SELECTION); for (int c = 0; c < get_caret_count(); c++) { if (!clipped && has_selection(c) && line >= get_selection_from_line(c) && line <= get_selection_to_line(c)) { int sel_from = (line > get_selection_from_line(c)) ? TS->shaped_text_get_range(rid).x : get_selection_from_column(c); @@ -1575,7 +1568,6 @@ void TextEdit::_notification(int p_what) { } int start = TS->shaped_text_get_range(rid).x; - RenderingServer::get_singleton()->canvas_item_set_presort_level(text_ci, DRAW_STEP_SEARCH_HIGHLIGHT); if (!clipped && !search_text.is_empty()) { // Search highlight int search_text_col = _get_column_pos_of_word(search_text, str, search_flags, 0); int search_text_len = search_text.length(); @@ -1662,7 +1654,6 @@ void TextEdit::_notification(int p_what) { int last_visible_char = TS->shaped_text_get_range(rid).x; float char_ofs = 0; - RenderingServer::get_singleton()->canvas_item_set_presort_level(text_ci, DRAW_STEP_TEXT_OUTLINE); if (theme_cache.outline_size > 0 && theme_cache.outline_color.a > 0) { for (int j = 0; j < gl_size; j++) { for (int k = 0; k < glyphs[j].repeat; k++) { @@ -1689,7 +1680,6 @@ void TextEdit::_notification(int p_what) { } } - RenderingServer::get_singleton()->canvas_item_set_presort_level(text_ci, DRAW_STEP_TEXT); for (int j = 0; j < gl_size; j++) { for (const Pair &color_data : color_map) { if (color_data.first <= glyphs[j].start) { @@ -1780,7 +1770,6 @@ void TextEdit::_notification(int p_what) { cache_entry.first_visible_chars.push_back(first_visible_char); cache_entry.last_visible_chars.push_back(last_visible_char); - RenderingServer::get_singleton()->canvas_item_set_presort_level(text_ci, DRAW_STEP_TEXT_OVERLAY); // is_line_folded if (line_wrap_index == line_wrap_amount && line < text.size() - 1 && _is_line_hidden(line + 1)) { int xofs = char_ofs + char_margin + (_get_folded_eol_icon()->get_width() / 2); @@ -1965,7 +1954,6 @@ void TextEdit::_notification(int p_what) { line_drawing_cache[line] = cache_entry; } } - RenderingServer::get_singleton()->canvas_item_flush_presort(text_ci); if (has_focus()) { _update_ime_window_position(); diff --git a/scene/gui/text_edit.h b/scene/gui/text_edit.h index a075a9b449..8470cccd39 100644 --- a/scene/gui/text_edit.h +++ b/scene/gui/text_edit.h @@ -121,16 +121,6 @@ public: SEARCH_BACKWARDS = 4 }; - enum DrawStep { - DRAW_STEP_LINE_BACKGROUND, - DRAW_STEP_LINE_HIGHLIGHT, - DRAW_STEP_TEXT_SELECTION, - DRAW_STEP_SEARCH_HIGHLIGHT, - DRAW_STEP_TEXT_OUTLINE, - DRAW_STEP_TEXT, - DRAW_STEP_TEXT_OVERLAY, - }; - private: struct GutterInfo { GutterType type = GutterType::GUTTER_TYPE_STRING; diff --git a/servers/rendering/renderer_canvas_cull.cpp b/servers/rendering/renderer_canvas_cull.cpp index b4ebb89a9b..9a0c442d8f 100644 --- a/servers/rendering/renderer_canvas_cull.cpp +++ b/servers/rendering/renderer_canvas_cull.cpp @@ -222,7 +222,7 @@ void RendererCanvasCull::_attach_canvas_item_for_draw(RendererCanvasCull::Item * // We have two choices now, if user has drawn something, we must assume users wants to draw the "mask", so compute the size based on this. // If nothing has been drawn, we just take it over and draw it ourselves. - if (ci->canvas_group->fit_empty && (ci->first_command == nullptr || (ci->first_command->next == nullptr && ci->first_command->type == RendererCanvasCull::Item::Command::TYPE_RECT && (static_cast(ci->first_command)->flags & RendererCanvasRender::CANVAS_RECT_IS_GROUP)))) { + if (ci->canvas_group->fit_empty && (ci->commands == nullptr || (ci->commands->next == nullptr && ci->commands->type == RendererCanvasCull::Item::Command::TYPE_RECT && (static_cast(ci->commands)->flags & RendererCanvasRender::CANVAS_RECT_IS_GROUP)))) { // No commands, or sole command is the one used to draw, so we (re)create the draw command. ci->clear(); @@ -257,14 +257,14 @@ void RendererCanvasCull::_attach_canvas_item_for_draw(RendererCanvasCull::Item * } } - if (((ci->first_command != nullptr || ci->visibility_notifier) && p_clip_rect.intersects(p_global_rect, true)) || ci->vp_render || ci->copy_back_buffer) { + if (((ci->commands != nullptr || ci->visibility_notifier) && p_clip_rect.intersects(p_global_rect, true)) || ci->vp_render || ci->copy_back_buffer) { // Something to draw? if (ci->update_when_visible) { RenderingServerDefault::redraw_request(); } - if (ci->first_command != nullptr || ci->copy_back_buffer) { + if (ci->commands != nullptr || ci->copy_back_buffer) { ci->final_transform = !ci->use_identity_transform ? p_transform : _current_camera_transform; ci->final_modulate = p_modulate * ci->self_modulate; ci->global_rect_cache = p_global_rect; @@ -330,12 +330,6 @@ void RendererCanvasCull::_cull_canvas_item(Item *p_canvas_item, const Transform2 return; } -#ifdef DEBUG_ENABLED - if (!ci->presort_commands.is_empty()) { - WARN_PRINT(vformat("Presort list for canvas item %x was not flushed!", ci->self.get_id())); - } -#endif - Rect2 rect = ci->get_rect(); if (ci->visibility_notifier) { @@ -466,7 +460,7 @@ void RendererCanvasCull::_cull_canvas_item(Item *p_canvas_item, const Transform2 } } else { RendererCanvasRender::Item *canvas_group_from = nullptr; - bool use_canvas_group = ci->canvas_group != nullptr && (ci->canvas_group->fit_empty || ci->first_command != nullptr); + bool use_canvas_group = ci->canvas_group != nullptr && (ci->canvas_group->fit_empty || ci->commands != nullptr); if (use_canvas_group) { int zidx = p_z - RSE::CANVAS_ITEM_Z_MIN; canvas_group_from = r_z_last_list[zidx]; @@ -476,7 +470,7 @@ void RendererCanvasCull::_cull_canvas_item(Item *p_canvas_item, const Transform2 } } else { RendererCanvasRender::Item *canvas_group_from = nullptr; - bool use_canvas_group = ci->canvas_group != nullptr && (ci->canvas_group->fit_empty || ci->first_command != nullptr); + bool use_canvas_group = ci->canvas_group != nullptr && (ci->canvas_group->fit_empty || ci->commands != nullptr); if (use_canvas_group) { int zidx = p_z - RSE::CANVAS_ITEM_Z_MIN; canvas_group_from = r_z_last_list[zidx]; @@ -750,89 +744,12 @@ float RendererCanvasCull::canvas_item_get_compensated_antialiasing_width(float p return p_width; } -void RendererCanvasCull::canvas_item_set_presort_level(RID p_item, int64_t p_order) { - Item *canvas_item = canvas_item_owner.get_or_null(p_item); - ERR_FAIL_NULL(canvas_item); - ERR_FAIL_COND(p_order < 0); - - if (canvas_item->presort_level == -1) { - canvas_item->presort_prev_command = canvas_item->last_command; - if (!canvas_item->presort_prev_state.is_base_state()) { - canvas_item->presort_states.push_back(canvas_item->presort_prev_state); - canvas_item->presort_state = 0; - } - } - canvas_item->presort_level = p_order; -} - -void RendererCanvasCull::_update_presort_state(Item *p_canvas_item, int32_t p_old_state, int32_t p_new_state, Item::Command **r_prev_command) { - const Item::PresortState &old_state = (p_old_state >= 0) ? p_canvas_item->presort_states[p_old_state] : Item::PresortState(); - const Item::PresortState &new_state = (p_new_state >= 0) ? p_canvas_item->presort_states[p_new_state] : Item::PresortState(); - if (old_state.transform != new_state.transform) { - Item::CommandTransform *tr = p_canvas_item->alloc_command(false); - if (tr) { - tr->xform = new_state.transform; - _insert_command(p_canvas_item, r_prev_command, tr); - } - } - if (old_state.clip_ignore != new_state.clip_ignore) { - Item::CommandClipIgnore *ci = p_canvas_item->alloc_command(false); - if (ci) { - ci->ignore = new_state.clip_ignore; - _insert_command(p_canvas_item, r_prev_command, ci); - } - } - if (old_state.animation_length != new_state.animation_length || old_state.slice_begin != new_state.slice_begin || old_state.slice_end != new_state.slice_end || old_state.offset != new_state.offset) { - Item::CommandAnimationSlice *as = p_canvas_item->alloc_command(false); - if (as) { - as->animation_length = new_state.animation_length; - as->slice_begin = new_state.slice_begin; - as->slice_end = new_state.slice_end; - as->offset = new_state.offset; - _insert_command(p_canvas_item, r_prev_command, as); - } - } -} - -void RendererCanvasCull::canvas_item_flush_presort(RID p_item) { - Item *canvas_item = canvas_item_owner.get_or_null(p_item); - ERR_FAIL_NULL(canvas_item); - - canvas_item->presort_commands.sort_custom(); - if (!canvas_item->presort_commands.is_empty()) { - Item::Command *prev_command = canvas_item->presort_prev_command; - int32_t start_presort_state = canvas_item->presort_prev_state.is_base_state() ? -1 : 0; - int32_t prev_presort_state = start_presort_state; - for (Item::PresortData &pd : canvas_item->presort_commands) { - if (prev_presort_state != pd.state) { - _update_presort_state(canvas_item, prev_presort_state, pd.state, &prev_command); - prev_presort_state = pd.state; - } - _insert_command(canvas_item, &prev_command, pd.command); - } - if (start_presort_state != prev_presort_state) { - _update_presort_state(canvas_item, prev_presort_state, start_presort_state, &prev_command); - } - prev_command->next = nullptr; - canvas_item->last_command = prev_command; - } - canvas_item->presort_commands.clear(); - canvas_item->presort_states.clear(); - canvas_item->presort_prev_command = nullptr; - canvas_item->presort_level = -1; - canvas_item->presort_state = -1; - canvas_item->presort_prev_state = Item::PresortState(); -} - void RendererCanvasCull::canvas_item_add_line(RID p_item, const Point2 &p_from, const Point2 &p_to, const Color &p_color, float p_width, bool p_antialiased) { Item *canvas_item = canvas_item_owner.get_or_null(p_item); ERR_FAIL_NULL(canvas_item); Item::CommandPrimitive *line = canvas_item->alloc_command(); ERR_FAIL_NULL(line); - if (canvas_item->presort_level >= 0) { - canvas_item->presort_commands.push_back({ line, canvas_item->presort_level, canvas_item->presort_state }); - } Vector2 diff = (p_from - p_to); Vector2 dir = diff.orthogonal().normalized(); @@ -889,9 +806,6 @@ void RendererCanvasCull::canvas_item_add_line(RID p_item, const Point2 &p_from, { Item::CommandPrimitive *left_border = canvas_item->alloc_command(); ERR_FAIL_NULL(left_border); - if (canvas_item->presort_level >= 0) { - canvas_item->presort_commands.push_back({ left_border, canvas_item->presort_level, canvas_item->presort_state }); - } left_border->points[0] = begin_left; left_border->points[1] = begin_left + border; @@ -908,9 +822,6 @@ void RendererCanvasCull::canvas_item_add_line(RID p_item, const Point2 &p_from, { Item::CommandPrimitive *right_border = canvas_item->alloc_command(); ERR_FAIL_NULL(right_border); - if (canvas_item->presort_level >= 0) { - canvas_item->presort_commands.push_back({ right_border, canvas_item->presort_level, canvas_item->presort_state }); - } right_border->points[0] = begin_right; right_border->points[1] = begin_right - border; @@ -927,9 +838,6 @@ void RendererCanvasCull::canvas_item_add_line(RID p_item, const Point2 &p_from, { Item::CommandPrimitive *top_border = canvas_item->alloc_command(); ERR_FAIL_NULL(top_border); - if (canvas_item->presort_level >= 0) { - canvas_item->presort_commands.push_back({ top_border, canvas_item->presort_level, canvas_item->presort_state }); - } top_border->points[0] = begin_left; top_border->points[1] = begin_left + border2; @@ -946,9 +854,6 @@ void RendererCanvasCull::canvas_item_add_line(RID p_item, const Point2 &p_from, { Item::CommandPrimitive *bottom_border = canvas_item->alloc_command(); ERR_FAIL_NULL(bottom_border); - if (canvas_item->presort_level >= 0) { - canvas_item->presort_commands.push_back({ bottom_border, canvas_item->presort_level, canvas_item->presort_state }); - } bottom_border->points[0] = end_left; bottom_border->points[1] = end_left - border2; @@ -965,9 +870,6 @@ void RendererCanvasCull::canvas_item_add_line(RID p_item, const Point2 &p_from, { Item::CommandPrimitive *top_left_corner = canvas_item->alloc_command(); ERR_FAIL_NULL(top_left_corner); - if (canvas_item->presort_level >= 0) { - canvas_item->presort_commands.push_back({ top_left_corner, canvas_item->presort_level, canvas_item->presort_state }); - } top_left_corner->points[0] = begin_left; top_left_corner->points[1] = begin_left + border2; @@ -984,9 +886,6 @@ void RendererCanvasCull::canvas_item_add_line(RID p_item, const Point2 &p_from, { Item::CommandPrimitive *top_right_corner = canvas_item->alloc_command(); ERR_FAIL_NULL(top_right_corner); - if (canvas_item->presort_level >= 0) { - canvas_item->presort_commands.push_back({ top_right_corner, canvas_item->presort_level, canvas_item->presort_state }); - } top_right_corner->points[0] = begin_right; top_right_corner->points[1] = begin_right + border2; @@ -1003,9 +902,6 @@ void RendererCanvasCull::canvas_item_add_line(RID p_item, const Point2 &p_from, { Item::CommandPrimitive *bottom_left_corner = canvas_item->alloc_command(); ERR_FAIL_NULL(bottom_left_corner); - if (canvas_item->presort_level >= 0) { - canvas_item->presort_commands.push_back({ bottom_left_corner, canvas_item->presort_level, canvas_item->presort_state }); - } bottom_left_corner->points[0] = end_left; bottom_left_corner->points[1] = end_left - border2; @@ -1022,9 +918,6 @@ void RendererCanvasCull::canvas_item_add_line(RID p_item, const Point2 &p_from, { Item::CommandPrimitive *bottom_right_corner = canvas_item->alloc_command(); ERR_FAIL_NULL(bottom_right_corner); - if (canvas_item->presort_level >= 0) { - canvas_item->presort_commands.push_back({ bottom_right_corner, canvas_item->presort_level, canvas_item->presort_state }); - } bottom_right_corner->points[0] = end_right; bottom_right_corner->points[1] = end_right - border2; @@ -1096,9 +989,6 @@ void RendererCanvasCull::canvas_item_add_polyline(RID p_item, const Vectoralloc_command(); ERR_FAIL_NULL(pline); - if (canvas_item->presort_level >= 0) { - canvas_item->presort_commands.push_back({ pline, canvas_item->presort_level, canvas_item->presort_state }); - } if (p_antialiased) { p_width = canvas_item_get_compensated_antialiasing_width(p_width); @@ -1175,15 +1065,9 @@ void RendererCanvasCull::canvas_item_add_polyline(RID p_item, const Vectoralloc_command(); ERR_FAIL_NULL(pline_left); - if (canvas_item->presort_level >= 0) { - canvas_item->presort_commands.push_back({ pline_left, canvas_item->presort_level, canvas_item->presort_state }); - } Item::CommandPolygon *pline_right = canvas_item->alloc_command(); ERR_FAIL_NULL(pline_right); - if (canvas_item->presort_level >= 0) { - canvas_item->presort_commands.push_back({ pline_right, canvas_item->presort_level, canvas_item->presort_state }); - } PackedColorArray colors_left; PackedVector2Array points_left; @@ -1390,10 +1274,6 @@ void RendererCanvasCull::canvas_item_add_multiline(RID p_item, const Vectoralloc_command(); ERR_FAIL_NULL(pline); - if (canvas_item->presort_level >= 0) { - canvas_item->presort_commands.push_back({ pline, canvas_item->presort_level, canvas_item->presort_state }); - } - pline->primitive = RSE::PRIMITIVE_LINES; pline->polygon.create(Vector(), p_points, colors); } else { @@ -1426,10 +1306,6 @@ void RendererCanvasCull::canvas_item_add_rect(RID p_item, const Rect2 &p_rect, c Item::CommandRect *rect = canvas_item->alloc_command(); ERR_FAIL_NULL(rect); - if (canvas_item->presort_level >= 0) { - canvas_item->presort_commands.push_back({ rect, canvas_item->presort_level, canvas_item->presort_state }); - } - rect->modulate = p_color; rect->rect = rect_adjusted; @@ -1460,9 +1336,6 @@ void RendererCanvasCull::canvas_item_add_rect(RID p_item, const Rect2 &p_rect, c { Item::CommandPrimitive *left_border = canvas_item->alloc_command(); ERR_FAIL_NULL(left_border); - if (canvas_item->presort_level >= 0) { - canvas_item->presort_commands.push_back({ left_border, canvas_item->presort_level, canvas_item->presort_state }); - } left_border->points[0] = begin_left; left_border->points[1] = begin_left + border; @@ -1479,9 +1352,6 @@ void RendererCanvasCull::canvas_item_add_rect(RID p_item, const Rect2 &p_rect, c { Item::CommandPrimitive *right_border = canvas_item->alloc_command(); ERR_FAIL_NULL(right_border); - if (canvas_item->presort_level >= 0) { - canvas_item->presort_commands.push_back({ right_border, canvas_item->presort_level, canvas_item->presort_state }); - } right_border->points[0] = begin_right; right_border->points[1] = begin_right - border; @@ -1498,9 +1368,6 @@ void RendererCanvasCull::canvas_item_add_rect(RID p_item, const Rect2 &p_rect, c { Item::CommandPrimitive *top_border = canvas_item->alloc_command(); ERR_FAIL_NULL(top_border); - if (canvas_item->presort_level >= 0) { - canvas_item->presort_commands.push_back({ top_border, canvas_item->presort_level, canvas_item->presort_state }); - } top_border->points[0] = begin_left; top_border->points[1] = begin_left + border2; @@ -1517,9 +1384,6 @@ void RendererCanvasCull::canvas_item_add_rect(RID p_item, const Rect2 &p_rect, c { Item::CommandPrimitive *bottom_border = canvas_item->alloc_command(); ERR_FAIL_NULL(bottom_border); - if (canvas_item->presort_level >= 0) { - canvas_item->presort_commands.push_back({ bottom_border, canvas_item->presort_level, canvas_item->presort_state }); - } bottom_border->points[0] = end_left; bottom_border->points[1] = end_left - border2; @@ -1536,9 +1400,6 @@ void RendererCanvasCull::canvas_item_add_rect(RID p_item, const Rect2 &p_rect, c { Item::CommandPrimitive *top_left_corner = canvas_item->alloc_command(); ERR_FAIL_NULL(top_left_corner); - if (canvas_item->presort_level >= 0) { - canvas_item->presort_commands.push_back({ top_left_corner, canvas_item->presort_level, canvas_item->presort_state }); - } top_left_corner->points[0] = begin_left; top_left_corner->points[1] = begin_left + border2; @@ -1555,9 +1416,6 @@ void RendererCanvasCull::canvas_item_add_rect(RID p_item, const Rect2 &p_rect, c { Item::CommandPrimitive *top_right_corner = canvas_item->alloc_command(); ERR_FAIL_NULL(top_right_corner); - if (canvas_item->presort_level >= 0) { - canvas_item->presort_commands.push_back({ top_right_corner, canvas_item->presort_level, canvas_item->presort_state }); - } top_right_corner->points[0] = begin_right; top_right_corner->points[1] = begin_right + border2; @@ -1574,9 +1432,6 @@ void RendererCanvasCull::canvas_item_add_rect(RID p_item, const Rect2 &p_rect, c { Item::CommandPrimitive *bottom_left_corner = canvas_item->alloc_command(); ERR_FAIL_NULL(bottom_left_corner); - if (canvas_item->presort_level >= 0) { - canvas_item->presort_commands.push_back({ bottom_left_corner, canvas_item->presort_level, canvas_item->presort_state }); - } bottom_left_corner->points[0] = end_left; bottom_left_corner->points[1] = end_left - border2; @@ -1593,9 +1448,6 @@ void RendererCanvasCull::canvas_item_add_rect(RID p_item, const Rect2 &p_rect, c { Item::CommandPrimitive *bottom_right_corner = canvas_item->alloc_command(); ERR_FAIL_NULL(bottom_right_corner); - if (canvas_item->presort_level >= 0) { - canvas_item->presort_commands.push_back({ bottom_right_corner, canvas_item->presort_level, canvas_item->presort_state }); - } bottom_right_corner->points[0] = end_right; bottom_right_corner->points[1] = end_right - border2; @@ -1629,9 +1481,6 @@ void RendererCanvasCull::canvas_item_add_ellipse(RID p_item, const Point2 &p_pos { Item::CommandPolygon *ellipse = canvas_item->alloc_command(); ERR_FAIL_NULL(ellipse); - if (canvas_item->presort_level >= 0) { - canvas_item->presort_commands.push_back({ ellipse, canvas_item->presort_level, canvas_item->presort_state }); - } ellipse->primitive = RSE::PRIMITIVE_TRIANGLES; @@ -1677,10 +1526,6 @@ void RendererCanvasCull::canvas_item_add_ellipse(RID p_item, const Point2 &p_pos Item::CommandPolygon *feather = canvas_item->alloc_command(); ERR_FAIL_NULL(feather); - if (canvas_item->presort_level >= 0) { - canvas_item->presort_commands.push_back({ feather, canvas_item->presort_level, canvas_item->presort_state }); - } - feather->primitive = RSE::PRIMITIVE_TRIANGLE_STRIP; Color transparent = Color(p_color, 0.0); @@ -1728,10 +1573,6 @@ void RendererCanvasCull::canvas_item_add_texture_rect(RID p_item, const Rect2 &p Item::CommandRect *rect = canvas_item->alloc_command(); ERR_FAIL_NULL(rect); - if (canvas_item->presort_level >= 0) { - canvas_item->presort_commands.push_back({ rect, canvas_item->presort_level, canvas_item->presort_state }); - } - rect->modulate = p_modulate; rect->rect = p_rect; rect->flags = 0; @@ -1763,10 +1604,6 @@ void RendererCanvasCull::canvas_item_add_msdf_texture_rect_region(RID p_item, co Item::CommandRect *rect = canvas_item->alloc_command(); ERR_FAIL_NULL(rect); - if (canvas_item->presort_level >= 0) { - canvas_item->presort_commands.push_back({ rect, canvas_item->presort_level, canvas_item->presort_state }); - } - rect->modulate = p_modulate; rect->rect = p_rect; @@ -1801,10 +1638,6 @@ void RendererCanvasCull::canvas_item_add_lcd_texture_rect_region(RID p_item, con Item::CommandRect *rect = canvas_item->alloc_command(); ERR_FAIL_NULL(rect); - if (canvas_item->presort_level >= 0) { - canvas_item->presort_commands.push_back({ rect, canvas_item->presort_level, canvas_item->presort_state }); - } - rect->modulate = p_modulate; rect->rect = p_rect; @@ -1837,10 +1670,6 @@ void RendererCanvasCull::canvas_item_add_texture_rect_region(RID p_item, const R Item::CommandRect *rect = canvas_item->alloc_command(); ERR_FAIL_NULL(rect); - if (canvas_item->presort_level >= 0) { - canvas_item->presort_commands.push_back({ rect, canvas_item->presort_level, canvas_item->presort_state }); - } - rect->modulate = p_modulate; rect->rect = p_rect; @@ -1882,9 +1711,6 @@ void RendererCanvasCull::canvas_item_add_nine_patch(RID p_item, const Rect2 &p_r Item::CommandNinePatch *style = canvas_item->alloc_command(); ERR_FAIL_NULL(style); - if (canvas_item->presort_level >= 0) { - canvas_item->presort_commands.push_back({ style, canvas_item->presort_level, canvas_item->presort_state }); - } style->texture = p_texture; @@ -1909,9 +1735,6 @@ void RendererCanvasCull::canvas_item_add_primitive(RID p_item, const Vectoralloc_command(); ERR_FAIL_NULL(prim); - if (canvas_item->presort_level >= 0) { - canvas_item->presort_commands.push_back({ prim, canvas_item->presort_level, canvas_item->presort_state }); - } for (int i = 0; i < p_points.size(); i++) { prim->points[i] = p_points[i]; @@ -1948,12 +1771,7 @@ void RendererCanvasCull::canvas_item_add_polygon(RID p_item, const Vectoralloc_command(); ERR_FAIL_NULL(polygon); - if (canvas_item->presort_level >= 0) { - canvas_item->presort_commands.push_back({ polygon, canvas_item->presort_level, canvas_item->presort_state }); - } - polygon->primitive = RSE::PRIMITIVE_TRIANGLES; - polygon->texture = p_texture; polygon->polygon.create(indices, p_points, p_colors, p_uvs); } @@ -1971,9 +1789,6 @@ void RendererCanvasCull::canvas_item_add_triangle_array(RID p_item, const Vector Item::CommandPolygon *polygon = canvas_item->alloc_command(); ERR_FAIL_NULL(polygon); - if (canvas_item->presort_level >= 0) { - canvas_item->presort_commands.push_back({ polygon, canvas_item->presort_level, canvas_item->presort_state }); - } polygon->texture = p_texture; @@ -1985,28 +1800,10 @@ void RendererCanvasCull::canvas_item_add_triangle_array(RID p_item, const Vector void RendererCanvasCull::canvas_item_add_set_transform(RID p_item, const Transform2D &p_transform) { Item *canvas_item = canvas_item_owner.get_or_null(p_item); ERR_FAIL_NULL(canvas_item); - if (canvas_item->presort_level >= 0) { - Item::PresortState st; - if (canvas_item->presort_state >= 0) { - st = canvas_item->presort_states[canvas_item->presort_state]; - } - if (st.transform == p_transform) { - return; - } - st.transform = p_transform; - if (st.is_base_state()) { - canvas_item->presort_state = -1; - } else { - canvas_item->presort_states.push_back(st); - canvas_item->presort_state = canvas_item->presort_states.size() - 1; - } - return; - } Item::CommandTransform *tr = canvas_item->alloc_command(); ERR_FAIL_NULL(tr); tr->xform = p_transform; - canvas_item->presort_prev_state.transform = p_transform; } void RendererCanvasCull::canvas_item_add_mesh(RID p_item, const RID &p_mesh, const Transform2D &p_transform, const Color &p_modulate, RID p_texture) { @@ -2016,10 +1813,6 @@ void RendererCanvasCull::canvas_item_add_mesh(RID p_item, const RID &p_mesh, con Item::CommandMesh *m = canvas_item->alloc_command(); ERR_FAIL_NULL(m); - if (canvas_item->presort_level >= 0) { - canvas_item->presort_commands.push_back({ m, canvas_item->presort_level, canvas_item->presort_state }); - } - m->mesh = p_mesh; if (canvas_item->skeleton.is_valid()) { m->mesh_instance = RSG::mesh_storage->mesh_instance_create(p_mesh); @@ -2038,10 +1831,6 @@ void RendererCanvasCull::canvas_item_add_particles(RID p_item, RID p_particles, Item::CommandParticles *part = canvas_item->alloc_command(); ERR_FAIL_NULL(part); - if (canvas_item->presort_level >= 0) { - canvas_item->presort_commands.push_back({ part, canvas_item->presort_level, canvas_item->presort_state }); - } - part->particles = p_particles; part->texture = p_texture; @@ -2056,10 +1845,6 @@ void RendererCanvasCull::canvas_item_add_multimesh(RID p_item, RID p_mesh, RID p Item::CommandMultiMesh *mm = canvas_item->alloc_command(); ERR_FAIL_NULL(mm); - if (canvas_item->presort_level >= 0) { - canvas_item->presort_commands.push_back({ mm, canvas_item->presort_level, canvas_item->presort_state }); - } - mm->multimesh = p_mesh; mm->texture = p_texture; @@ -2068,53 +1853,15 @@ void RendererCanvasCull::canvas_item_add_multimesh(RID p_item, RID p_mesh, RID p void RendererCanvasCull::canvas_item_add_clip_ignore(RID p_item, bool p_ignore) { Item *canvas_item = canvas_item_owner.get_or_null(p_item); ERR_FAIL_NULL(canvas_item); - if (canvas_item->presort_level >= 0) { - Item::PresortState st; - if (canvas_item->presort_state >= 0) { - st = canvas_item->presort_states[canvas_item->presort_state]; - } - if (st.clip_ignore == p_ignore) { - return; - } - st.clip_ignore = p_ignore; - if (st.is_base_state()) { - canvas_item->presort_state = -1; - } else { - canvas_item->presort_states.push_back(st); - canvas_item->presort_state = canvas_item->presort_states.size() - 1; - } - return; - } Item::CommandClipIgnore *ci = canvas_item->alloc_command(); ERR_FAIL_NULL(ci); ci->ignore = p_ignore; - canvas_item->presort_prev_state.clip_ignore = p_ignore; } void RendererCanvasCull::canvas_item_add_animation_slice(RID p_item, double p_animation_length, double p_slice_begin, double p_slice_end, double p_offset) { Item *canvas_item = canvas_item_owner.get_or_null(p_item); ERR_FAIL_NULL(canvas_item); - if (canvas_item->presort_level >= 0) { - Item::PresortState st; - if (canvas_item->presort_state >= 0) { - st = canvas_item->presort_states[canvas_item->presort_state]; - } - if (st.animation_length == p_animation_length && st.slice_begin == p_slice_begin && st.slice_end == p_slice_end && st.offset == p_offset) { - return; - } - st.animation_length = p_animation_length; - st.slice_begin = p_slice_begin; - st.slice_end = p_slice_end; - st.offset = p_offset; - if (st.is_base_state()) { - canvas_item->presort_state = -1; - } else { - canvas_item->presort_states.push_back(st); - canvas_item->presort_state = canvas_item->presort_states.size() - 1; - } - return; - } Item::CommandAnimationSlice *as = canvas_item->alloc_command(); ERR_FAIL_NULL(as); @@ -2122,11 +1869,6 @@ void RendererCanvasCull::canvas_item_add_animation_slice(RID p_item, double p_an as->slice_begin = p_slice_begin; as->slice_end = p_slice_end; as->offset = p_offset; - - canvas_item->presort_prev_state.animation_length = p_animation_length; - canvas_item->presort_prev_state.slice_begin = p_slice_begin; - canvas_item->presort_prev_state.slice_end = p_slice_end; - canvas_item->presort_prev_state.offset = p_offset; } void RendererCanvasCull::canvas_item_set_sort_children_by_y(RID p_item, bool p_enable) { @@ -2162,7 +1904,7 @@ void RendererCanvasCull::canvas_item_attach_skeleton(RID p_item, RID p_skeleton) } canvas_item->skeleton = p_skeleton; - Item::Command *c = canvas_item->first_command; + Item::Command *c = canvas_item->commands; while (c) { if (c->type == Item::Command::TYPE_MESH) { @@ -2204,12 +1946,6 @@ void RendererCanvasCull::canvas_item_clear(RID p_item) { Item *canvas_item = canvas_item_owner.get_or_null(p_item); ERR_FAIL_NULL(canvas_item); - canvas_item->presort_commands.clear(); - canvas_item->presort_states.clear(); - canvas_item->presort_prev_command = nullptr; - canvas_item->presort_level = -1; - canvas_item->presort_state = -1; - canvas_item->presort_prev_state = Item::PresortState(); canvas_item->clear(); #ifdef DEBUG_ENABLED diff --git a/servers/rendering/renderer_canvas_cull.h b/servers/rendering/renderer_canvas_cull.h index 8037ad90e9..de9b929060 100644 --- a/servers/rendering/renderer_canvas_cull.h +++ b/servers/rendering/renderer_canvas_cull.h @@ -63,95 +63,6 @@ public: Vector child_items; - struct PresortData { - Item::Command *command = nullptr; - int32_t level = 0; - int32_t state = -1; - }; - struct PresortDataCompare { - _FORCE_INLINE_ bool operator()(const PresortData &l, const PresortData &r) const { - if (l.level == r.level) { - uint64_t l_rid = 0; - uint64_t r_rid = 0; - switch (l.command->type) { - case Item::Command::Type::TYPE_RECT: { - l_rid = static_cast(l.command)->texture.get_id(); - } break; - case Item::Command::Type::TYPE_NINEPATCH: { - l_rid = static_cast(l.command)->texture.get_id(); - } break; - case Item::Command::Type::TYPE_POLYGON: { - l_rid = static_cast(l.command)->texture.get_id(); - } break; - case Item::Command::Type::TYPE_PRIMITIVE: { - l_rid = static_cast(l.command)->texture.get_id(); - } break; - case Item::Command::Type::TYPE_MESH: { - l_rid = static_cast(l.command)->texture.get_id(); - } break; - case Item::Command::Type::TYPE_MULTIMESH: { - l_rid = static_cast(l.command)->texture.get_id(); - } break; - case Item::Command::Type::TYPE_PARTICLES: { - l_rid = static_cast(l.command)->texture.get_id(); - } break; - default: { - l_rid = 0; - } break; - } - switch (r.command->type) { - case Item::Command::Type::TYPE_RECT: { - r_rid = static_cast(r.command)->texture.get_id(); - } break; - case Item::Command::Type::TYPE_NINEPATCH: { - r_rid = static_cast(r.command)->texture.get_id(); - } break; - case Item::Command::Type::TYPE_POLYGON: { - r_rid = static_cast(r.command)->texture.get_id(); - } break; - case Item::Command::Type::TYPE_PRIMITIVE: { - r_rid = static_cast(r.command)->texture.get_id(); - } break; - case Item::Command::Type::TYPE_MESH: { - r_rid = static_cast(r.command)->texture.get_id(); - } break; - case Item::Command::Type::TYPE_MULTIMESH: { - r_rid = static_cast(r.command)->texture.get_id(); - } break; - case Item::Command::Type::TYPE_PARTICLES: { - r_rid = static_cast(r.command)->texture.get_id(); - } break; - default: { - r_rid = 0; - } break; - } - return l_rid < r_rid; - } else { - return l.level < r.level; - } - } - }; - - struct PresortState { - Transform2D transform; - bool clip_ignore = false; - double animation_length = 0.0; - double slice_begin = 0.0; - double slice_end = 0.0; - double offset = 0.0; - - _FORCE_INLINE_ bool is_base_state() const { - return transform == Transform2D() && !clip_ignore && animation_length == 0.0 && slice_begin == 0.0 && slice_end == 0.0 && offset == 0.0; - } - }; - - int32_t presort_level = -1; - int32_t presort_state = -1; - Item::Command *presort_prev_command = nullptr; - Item::PresortState presort_prev_state; - LocalVector presort_commands; - LocalVector presort_states; - struct VisibilityNotifierData { Rect2 area; Callable enter_callable; @@ -194,16 +105,6 @@ public: } }; - _FORCE_INLINE_ void _insert_command(Item *p_canvas_item, Item::Command **r_prev_command, Item::Command *p_command) const { - if (*r_prev_command) { - (*r_prev_command)->next = p_command; - } else { - p_canvas_item->first_command = p_command; - } - *r_prev_command = p_command; - } - void _update_presort_state(Item *p_canvas_item, int32_t p_old_state, int32_t p_new_state, Item::Command **r_prev_command); - void _item_queue_update(Item *p_item, bool p_update_dependencies); SelfList::List _item_update_list; @@ -379,9 +280,6 @@ public: void canvas_item_add_clip_ignore(RID p_item, bool p_ignore); void canvas_item_add_animation_slice(RID p_item, double p_animation_length, double p_slice_begin, double p_slice_end, double p_offset); - void canvas_item_set_presort_level(RID p_item, int64_t p_order); - void canvas_item_flush_presort(RID p_item); - void canvas_item_set_sort_children_by_y(RID p_item, bool p_enable); void canvas_item_set_z_index(RID p_item, int p_z); void canvas_item_set_z_as_relative_to_parent(RID p_item, bool p_enable); diff --git a/servers/rendering/renderer_canvas_render.cpp b/servers/rendering/renderer_canvas_render.cpp index f968134e42..a6ad263d1d 100644 --- a/servers/rendering/renderer_canvas_render.cpp +++ b/servers/rendering/renderer_canvas_render.cpp @@ -41,7 +41,7 @@ const Rect2 &RendererCanvasRender::Item::get_rect() const { //must update rect - if (first_command == nullptr) { + if (commands == nullptr) { rect = Rect2(); rect_dirty = false; return rect; @@ -51,7 +51,7 @@ const Rect2 &RendererCanvasRender::Item::get_rect() const { bool found_xform = false; bool first = true; - const Item::Command *c = first_command; + const Item::Command *c = commands; while (c) { Rect2 r; diff --git a/servers/rendering/renderer_canvas_render.h b/servers/rendering/renderer_canvas_render.h index 735a61519c..d452bc3611 100644 --- a/servers/rendering/renderer_canvas_render.h +++ b/servers/rendering/renderer_canvas_render.h @@ -374,8 +374,7 @@ public: const Rect2 &get_rect() const; - Command *heap_command = nullptr; - Command *first_command = nullptr; + Command *commands = nullptr; Command *last_command = nullptr; Vector blocks; uint32_t current_block; @@ -384,16 +383,15 @@ public: #endif template - T *alloc_command(bool p_set_next = true) { + T *alloc_command() { T *command = nullptr; - if (heap_command == nullptr) { + if (commands == nullptr) { // As the most common use case of canvas items is to // use only one command, the first is done with it's // own allocation. The rest of them use blocks. command = memnew(T); command->next = nullptr; - heap_command = command; - first_command = command; + commands = command; last_command = command; } else { //Subsequent commands go into a block. @@ -420,9 +418,7 @@ public: void *memory = c->memory + c->usage; command = memnew_placement(memory, T); command->next = nullptr; - if (p_set_next) { - last_command->next = command; - } + last_command->next = command; last_command = command; c->usage += sizeof(T); break; @@ -434,14 +430,14 @@ public: } void clear() { - // The `heap_command` is always allocated on heap + // The first one is always allocated on heap // the rest go in the blocks - Command *c = first_command; + Command *c = commands; while (c) { Command *n = c->next; - if (c == heap_command) { - memdelete(heap_command); - heap_command = nullptr; + if (c == commands) { + memdelete(commands); + commands = nullptr; } else { c->~Command(); } @@ -455,9 +451,8 @@ public: } } - heap_command = nullptr; last_command = nullptr; - first_command = nullptr; + commands = nullptr; current_block = 0; clip = false; rect_dirty = true; @@ -470,9 +465,8 @@ public: RSE::CanvasItemTextureRepeat texture_repeat; Item() { - heap_command = nullptr; + commands = nullptr; last_command = nullptr; - first_command = nullptr; current_block = 0; light_mask = 1; vp_render = nullptr; diff --git a/servers/rendering/renderer_rd/renderer_canvas_render_rd.cpp b/servers/rendering/renderer_rd/renderer_canvas_render_rd.cpp index 095cdaa158..fad67ae1a3 100644 --- a/servers/rendering/renderer_rd/renderer_canvas_render_rd.cpp +++ b/servers/rendering/renderer_rd/renderer_canvas_render_rd.cpp @@ -795,7 +795,7 @@ void RendererCanvasRenderRD::canvas_render_items(RID p_to_render_target, Item *p } if (ci->skeleton.is_valid()) { - const Item::Command *c = ci->first_command; + const Item::Command *c = ci->commands; while (c) { if (c->type == Item::Command::TYPE_MESH) { @@ -2397,7 +2397,7 @@ void RendererCanvasRenderRD::_record_item_commands(const Item *p_item, RenderTar r_current_batch->use_lighting = use_lighting; } - const Item::Command *c = p_item->first_command; + const Item::Command *c = p_item->commands; while (c) { if (skipping && c->type != Item::Command::TYPE_ANIMATION_SLICE) { c = c->next; diff --git a/servers/rendering/rendering_server.cpp b/servers/rendering/rendering_server.cpp index b106a0a23b..84b634f39b 100644 --- a/servers/rendering/rendering_server.cpp +++ b/servers/rendering/rendering_server.cpp @@ -3365,9 +3365,6 @@ void RenderingServer::_bind_methods() { ClassDB::bind_method(D_METHOD("canvas_item_set_copy_to_backbuffer", "item", "enabled", "rect"), &RenderingServer::canvas_item_set_copy_to_backbuffer); ClassDB::bind_method(D_METHOD("canvas_item_attach_skeleton", "item", "skeleton"), &RenderingServer::canvas_item_attach_skeleton); - ClassDB::bind_method(D_METHOD("canvas_item_set_presort_level", "item", "order"), &RenderingServer::canvas_item_set_presort_level); - ClassDB::bind_method(D_METHOD("canvas_item_flush_presort", "item"), &RenderingServer::canvas_item_flush_presort); - ClassDB::bind_method(D_METHOD("canvas_item_clear", "item"), &RenderingServer::canvas_item_clear); ClassDB::bind_method(D_METHOD("canvas_item_set_draw_index", "item", "index"), &RenderingServer::canvas_item_set_draw_index); ClassDB::bind_method(D_METHOD("canvas_item_set_material", "item", "material"), &RenderingServer::canvas_item_set_material); diff --git a/servers/rendering/rendering_server.h b/servers/rendering/rendering_server.h index fff5040d2d..78f63933c9 100644 --- a/servers/rendering/rendering_server.h +++ b/servers/rendering/rendering_server.h @@ -844,9 +844,6 @@ public: virtual void canvas_item_add_clip_ignore(RID p_item, bool p_ignore) = 0; virtual void canvas_item_add_animation_slice(RID p_item, double p_animation_length, double p_slice_begin, double p_slice_end, double p_offset) = 0; - virtual void canvas_item_set_presort_level(RID p_item, int64_t p_order) = 0; - virtual void canvas_item_flush_presort(RID p_item) = 0; - virtual void canvas_item_set_sort_children_by_y(RID p_item, bool p_enable) = 0; virtual void canvas_item_set_z_index(RID p_item, int p_z) = 0; virtual void canvas_item_set_z_as_relative_to_parent(RID p_item, bool p_enable) = 0; diff --git a/servers/rendering/rendering_server_default.h b/servers/rendering/rendering_server_default.h index a6f0c56d0e..e91b58e748 100644 --- a/servers/rendering/rendering_server_default.h +++ b/servers/rendering/rendering_server_default.h @@ -1050,9 +1050,6 @@ public: FUNC2(canvas_item_add_clip_ignore, RID, bool) FUNC5(canvas_item_add_animation_slice, RID, double, double, double, double) - FUNC2(canvas_item_set_presort_level, RID, int64_t); - FUNC1(canvas_item_flush_presort, RID); - FUNC2(canvas_item_set_sort_children_by_y, RID, bool) FUNC2(canvas_item_set_z_index, RID, int) FUNC2(canvas_item_set_z_as_relative_to_parent, RID, bool)