From 3589c5489a7d6548eb1397c1124a498823ef43f3 Mon Sep 17 00:00:00 2001 From: Philipp Oeser Date: Tue, 4 Mar 2025 09:35:12 +0100 Subject: [PATCH 1/3] Fix: Cursor snapping does not work for Curves bezier handles For this to work, we have to take into account handles in TransVert as well. Behavior is the same as in legacy curves (meaning that if the control point itself is selected, the handles are ignores). Part of #133448 (same thing for grease pencil, which I plan to also make part of TransVert, but better solve for Curves first, so we can share code here). Pull Request: https://projects.blender.org/blender/blender/pulls/134945 --- .../editors/curves/intern/curves_data.cc | 46 ++++++++++++++----- source/blender/editors/include/ED_curves.hh | 4 +- source/blender/editors/util/ed_transverts.cc | 3 +- 3 files changed, 39 insertions(+), 14 deletions(-) diff --git a/source/blender/editors/curves/intern/curves_data.cc b/source/blender/editors/curves/intern/curves_data.cc index f5ae554f01d..fa73bf394dd 100644 --- a/source/blender/editors/curves/intern/curves_data.cc +++ b/source/blender/editors/curves/intern/curves_data.cc @@ -22,22 +22,44 @@ Vector> get_curves_positions_for_write(bke::CurvesGeometry & return positions_per_attribute; } -void transverts_from_curves_positions_create(bke::CurvesGeometry &curves, TransVertStore *tvs) +void transverts_from_curves_positions_create(bke::CurvesGeometry &curves, + TransVertStore *tvs, + const bool skip_handles) { + const Span selection_names = ed::curves::get_curves_selection_attribute_names(curves); + IndexMaskMemory memory; - IndexMask selection = retrieve_selected_points(curves, memory); - MutableSpan positions = curves.positions_for_write(); + std::array selection; + for (const int i : selection_names.index_range()) { + selection[i] = ed::curves::retrieve_selected_points(curves, selection_names[i], memory); + } - tvs->transverts = static_cast( - MEM_calloc_arrayN(selection.size(), sizeof(TransVert), __func__)); - tvs->transverts_tot = selection.size(); + if (skip_handles) { + /* When the control point is selected, both handles are ignored. */ + selection[1] = IndexMask::from_difference(selection[1], selection[0], memory); + selection[2] = IndexMask::from_difference(selection[2], selection[0], memory); + } - selection.foreach_index(GrainSize(1024), [&](const int64_t i, const int64_t pos) { - TransVert &tv = tvs->transverts[pos]; - tv.loc = positions[i]; - tv.flag = SELECT; - copy_v3_v3(tv.oldloc, tv.loc); - }); + const int size = selection[0].size() + selection[1].size() + selection[2].size(); + if (size == 0) { + return; + } + + tvs->transverts = static_cast(MEM_calloc_arrayN(size, sizeof(TransVert), __func__)); + tvs->transverts_tot = size; + + int offset = 0; + const Vector> positions = ed::curves::get_curves_positions_for_write(curves); + for (const int attribute_i : positions.index_range()) { + selection[attribute_i].foreach_index(GrainSize(1024), [&](const int64_t i, const int64_t pos) { + TransVert &tv = tvs->transverts[pos + offset]; + tv.loc = positions[attribute_i][i]; + tv.flag = SELECT; + copy_v3_v3(tv.oldloc, tv.loc); + }); + + offset += selection[attribute_i].size(); + } } float (*point_normals_array_create(const Curves *curves_id))[3] diff --git a/source/blender/editors/include/ED_curves.hh b/source/blender/editors/include/ED_curves.hh index 7aedb3fa870..28013696328 100644 --- a/source/blender/editors/include/ED_curves.hh +++ b/source/blender/editors/include/ED_curves.hh @@ -118,7 +118,9 @@ void ensure_surface_deformation_node_exists(bContext &C, Object &curves_ob); * `ED_transverts_create_from_obedit` in `view3d_snap.cc`). * \note The `TransVert` elements in \a tvs are expected to write to the positions of \a curves. */ -void transverts_from_curves_positions_create(bke::CurvesGeometry &curves, TransVertStore *tvs); +void transverts_from_curves_positions_create(bke::CurvesGeometry &curves, + TransVertStore *tvs, + const bool skip_handles); /* -------------------------------------------------------------------- */ /** \name Poll Functions diff --git a/source/blender/editors/util/ed_transverts.cc b/source/blender/editors/util/ed_transverts.cc index 709dfd06327..f164ab42a9c 100644 --- a/source/blender/editors/util/ed_transverts.cc +++ b/source/blender/editors/util/ed_transverts.cc @@ -504,7 +504,8 @@ void ED_transverts_create_from_obedit(TransVertStore *tvs, const Object *obedit, } else if (obedit->type == OB_CURVES) { Curves *curves_id = static_cast(obedit->data); - blender::ed::curves::transverts_from_curves_positions_create(curves_id->geometry.wrap(), tvs); + blender::ed::curves::transverts_from_curves_positions_create( + curves_id->geometry.wrap(), tvs, ((mode & TM_SKIP_HANDLES) != 0)); } if (!tvs->transverts_tot && tvs->transverts) { From 64c15823f72c199cc30375f69cfa5a20b685dc89 Mon Sep 17 00:00:00 2001 From: Philipp Oeser Date: Tue, 4 Mar 2025 09:35:27 +0100 Subject: [PATCH 2/3] Fix #135355: ops.render.opengl() in the console wont return {'FINISHED'} Caused by 40ac21e5a5 [does not remember/resore the previous ScrArea & ARegion anymore]. Without this, the operator reporting might get confused by using the wrong area/region, so added back NOTE: I tried to just notify `NC_SPACE | ND_SPACE_INFO_REPORT` in `screen_opengl_render_end` (same as in `wm_operator_finished` > `wm_operator_register`), but to no avail... Think this is quite good pratice to leave us with the original area/ region anyways though. Thx @brecht for improvements (restoring in `screen_opengl_render_init` already, also taking care of restoring in some early out cases) Co-authored-by: Brecht Van Lommel Pull Request: https://projects.blender.org/blender/blender/pulls/135394 --- .../blender/editors/render/render_opengl.cc | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/source/blender/editors/render/render_opengl.cc b/source/blender/editors/render/render_opengl.cc index c55090185e9..95e27acadf8 100644 --- a/source/blender/editors/render/render_opengl.cc +++ b/source/blender/editors/render/render_opengl.cc @@ -693,6 +693,8 @@ static bool screen_opengl_render_init(bContext *C, wmOperator *op) WorkSpace *workspace = CTX_wm_workspace(C); Scene *scene = CTX_data_scene(C); + ScrArea *prev_area = CTX_wm_area(C); + ARegion *prev_region = CTX_wm_region(C); GPUOffScreen *ofs; OGLRender *oglrender; int sizex, sizey; @@ -716,6 +718,12 @@ static bool screen_opengl_render_init(bContext *C, wmOperator *op) return false; } + if (!is_animation && is_write_still && BKE_imtype_is_movie(scene->r.im_format.imtype)) { + BKE_report( + op->reports, RPT_ERROR, "Cannot write a single file with an animation format selected"); + return false; + } + if (is_sequencer) { is_view_context = false; } @@ -732,12 +740,6 @@ static bool screen_opengl_render_init(bContext *C, wmOperator *op) } } - if (!is_animation && is_write_still && BKE_imtype_is_movie(scene->r.im_format.imtype)) { - BKE_report( - op->reports, RPT_ERROR, "Cannot write a single file with an animation format selected"); - return false; - } - /* stop all running jobs, except screen one. currently previews frustrate Render */ WM_jobs_kill_all_except(wm, CTX_wm_screen(C)); @@ -756,6 +758,8 @@ static bool screen_opengl_render_init(bContext *C, wmOperator *op) if (!ofs) { BKE_reportf(op->reports, RPT_ERROR, "Failed to create OpenGL off-screen buffer, %s", err_out); + CTX_wm_area_set(C, prev_area); + CTX_wm_region_set(C, prev_region); return false; } @@ -850,6 +854,9 @@ static bool screen_opengl_render_init(bContext *C, wmOperator *op) } } + CTX_wm_area_set(C, prev_area); + CTX_wm_region_set(C, prev_region); + return true; } From 7fcb5657769bff7bfc122c9da2d15610b65b07c9 Mon Sep 17 00:00:00 2001 From: Philipp Oeser Date: Tue, 4 Mar 2025 09:35:42 +0100 Subject: [PATCH 3/3] Fix #135330: Incorrect pasted flipped armature keyframes Caused by 6d832ee5b3 The bone names were flipped correctly, however, we were missing the actual FCurve BezTriple flipping. This was caused by passing the wrong FCurve into `do_curve_mirror_flippping` -- this function is checking for existence of the FCurve in the `KeyframeCopyBuffer`, so we gotta pass `fcurve_in_copy_buffer` (instead of the new fcu). Pull Request: https://projects.blender.org/blender/blender/pulls/135381 --- source/blender/editors/animation/keyframes_general.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/blender/editors/animation/keyframes_general.cc b/source/blender/editors/animation/keyframes_general.cc index 5f4c8a94d08..cefffa5ff16 100644 --- a/source/blender/editors/animation/keyframes_general.cc +++ b/source/blender/editors/animation/keyframes_general.cc @@ -1970,7 +1970,7 @@ static void paste_animedit_keys_fcurve(FCurve *fcu, BezTriple bezt_copy = *bezt; if (flip) { - do_curve_mirror_flippping(*fcu, bezt_copy); + do_curve_mirror_flippping(fcurve_in_copy_buffer, bezt_copy); } add_v2_v2(bezt_copy.vec[0], offset);