From 5ec051f1b04a9d52ae8293f7383a7745e4a70345 Mon Sep 17 00:00:00 2001 From: Casey Bianco-Davis Date: Sat, 2 Sep 2023 13:26:26 -0700 Subject: [PATCH 01/19] GPv3: Add edit mode transform operator (i.e translate, rotation, scale, opacity, radius) --- .../keyconfig/keymap_data/blender_default.py | 12 + .../startup/bl_ui/space_toolsystem_toolbar.py | 11 + scripts/startup/bl_ui/space_view3d.py | 6 +- .../blender/editors/transform/CMakeLists.txt | 1 + source/blender/editors/transform/transform.cc | 13 +- .../editors/transform/transform_convert.cc | 48 ++-- .../editors/transform/transform_convert.hh | 4 + .../transform_convert_greasepencil.cc | 263 ++++++++++++++++++ .../editors/transform/transform_generics.cc | 5 + .../editors/transform/transform_mode.cc | 47 ++-- .../transform/transform_mode_gpopacity.cc | 14 +- 11 files changed, 378 insertions(+), 46 deletions(-) create mode 100644 source/blender/editors/transform/transform_convert_greasepencil.cc diff --git a/scripts/presets/keyconfig/keymap_data/blender_default.py b/scripts/presets/keyconfig/keymap_data/blender_default.py index 7574e373fa3..f4417ac2dd1 100644 --- a/scripts/presets/keyconfig/keymap_data/blender_default.py +++ b/scripts/presets/keyconfig/keymap_data/blender_default.py @@ -4569,6 +4569,18 @@ def km_grease_pencil_edit(params): # Dissolve ("grease_pencil.dissolve", {"type": 'X', "value": 'PRESS', "ctrl": True}, None), ("grease_pencil.dissolve", {"type": 'DEL', "value": 'PRESS', "ctrl": True}, None), + + # Transform Actions. + *_template_items_transform_actions(params, use_bend=True, use_mirror=True, use_tosphere=True, use_shear=True), + ("transform.transform", {"type": 'S', "value": 'PRESS', "alt": True}, + {"properties": [("mode", 'CURVE_SHRINKFATTEN')]}), + ("transform.transform", {"type": 'F', "value": 'PRESS', "shift": True}, + {"properties": [("mode", 'GPENCIL_OPACITY')]}), + + # Proportional editing. + *_template_items_proportional_editing( + params, connected=True, toggle_data_path='tool_settings.use_proportional_edit'), + ]) return keymap diff --git a/scripts/startup/bl_ui/space_toolsystem_toolbar.py b/scripts/startup/bl_ui/space_toolsystem_toolbar.py index bd199c5affd..29128046a97 100644 --- a/scripts/startup/bl_ui/space_toolsystem_toolbar.py +++ b/scripts/startup/bl_ui/space_toolsystem_toolbar.py @@ -3034,6 +3034,17 @@ class VIEW3D_PT_tools_active(ToolSelectPanelHelper, Panel): ], 'EDIT_GREASE_PENCIL': [ *_tools_select, + _defs_view3d_generic.cursor, + None, + *_tools_transform, + None, + _defs_edit_curve.curve_radius, + ( + _defs_gpencil_edit.shear, + _defs_gpencil_edit.tosphere, + ), + None, + *_tools_annotate, ], 'PARTICLE': [ *_tools_select, diff --git a/scripts/startup/bl_ui/space_view3d.py b/scripts/startup/bl_ui/space_view3d.py index 4a389dc291a..b32cfd964a1 100644 --- a/scripts/startup/bl_ui/space_view3d.py +++ b/scripts/startup/bl_ui/space_view3d.py @@ -1111,10 +1111,10 @@ class VIEW3D_MT_transform(VIEW3D_MT_transform_base, Menu): if context.mode == 'EDIT_MESH': layout.operator("transform.shrink_fatten", text="Shrink/Fatten").alt_navigation = alt_navigation layout.operator("transform.skin_resize") - elif context.mode == 'EDIT_CURVE': + elif context.mode in ['EDIT_CURVE', 'EDIT_GREASE_PENCIL']: layout.operator("transform.transform", text="Radius").mode = 'CURVE_SHRINKFATTEN' - if context.mode != 'EDIT_CURVES': + if context.mode != 'EDIT_CURVES' and context.mode != 'EDIT_GREASE_PENCIL': layout.separator() props = layout.operator("transform.translate", text="Move Texture Space") props.texture_space = True @@ -5591,6 +5591,8 @@ class VIEW3D_MT_edit_greasepencil(Menu): def draw(self, _context): layout = self.layout + layout.menu("VIEW3D_MT_transform") + layout.menu("VIEW3D_MT_edit_greasepencil_delete") diff --git a/source/blender/editors/transform/CMakeLists.txt b/source/blender/editors/transform/CMakeLists.txt index b9f1f4b04e5..f6c2fa2b663 100644 --- a/source/blender/editors/transform/CMakeLists.txt +++ b/source/blender/editors/transform/CMakeLists.txt @@ -32,6 +32,7 @@ set(SRC transform_convert_curves.cc transform_convert_gpencil_legacy.cc transform_convert_graph.cc + transform_convert_greasepencil.cc transform_convert_lattice.cc transform_convert_mask.cc transform_convert_mball.cc diff --git a/source/blender/editors/transform/transform.cc b/source/blender/editors/transform/transform.cc index 2c93f5884e6..4f60c54c7c2 100644 --- a/source/blender/editors/transform/transform.cc +++ b/source/blender/editors/transform/transform.cc @@ -424,11 +424,16 @@ void removeAspectRatio(TransInfo *t, float vec[2]) static void viewRedrawForce(const bContext *C, TransInfo *t) { if (t->options & CTX_GPENCIL_STROKES) { - bGPdata *gpd = ED_gpencil_data_get_active(C); - if (gpd) { - DEG_id_tag_update(&gpd->id, ID_RECALC_GEOMETRY); + if (t->obedit_type == OB_GREASE_PENCIL) { + WM_event_add_notifier(C, NC_GEOM | ND_DATA, nullptr); + } + else if (t->obedit_type == OB_GPENCIL_LEGACY) { + bGPdata *gpd = ED_gpencil_data_get_active(C); + if (gpd) { + DEG_id_tag_update(&gpd->id, ID_RECALC_GEOMETRY); + } + WM_event_add_notifier(C, NC_GPENCIL | NA_EDITED, nullptr); } - WM_event_add_notifier(C, NC_GPENCIL | NA_EDITED, nullptr); } else if (t->spacetype == SPACE_VIEW3D) { if (t->options & CTX_PAINT_CURVE) { diff --git a/source/blender/editors/transform/transform_convert.cc b/source/blender/editors/transform/transform_convert.cc index adbb1e8f36a..1cb44dc1920 100644 --- a/source/blender/editors/transform/transform_convert.cc +++ b/source/blender/editors/transform/transform_convert.cc @@ -724,23 +724,24 @@ static int countAndCleanTransDataContainer(TransInfo *t) static void init_proportional_edit(TransInfo *t) { /* NOTE: Proportional editing is not usable in pose mode yet #32444. */ - if (!ELEM(t->data_type, - &TransConvertType_Action, - &TransConvertType_Curve, - &TransConvertType_Curves, - &TransConvertType_Graph, - &TransConvertType_GPencil, - &TransConvertType_Lattice, - &TransConvertType_Mask, - &TransConvertType_MBall, - &TransConvertType_Mesh, - &TransConvertType_MeshEdge, - &TransConvertType_MeshSkin, - &TransConvertType_MeshUV, - &TransConvertType_MeshVertCData, - &TransConvertType_Node, - &TransConvertType_Object, - &TransConvertType_Particle)) + if (!(ELEM(t->data_type, + &TransConvertType_Action, + &TransConvertType_Curve, + &TransConvertType_Curves, + &TransConvertType_Graph, + &TransConvertType_GPencil, + &TransConvertType_GreasePencil, + &TransConvertType_Lattice, + &TransConvertType_Mask, + &TransConvertType_MBall, + &TransConvertType_Mesh, + &TransConvertType_MeshEdge, + &TransConvertType_MeshSkin, + &TransConvertType_MeshUV, + &TransConvertType_MeshVertCData, + &TransConvertType_Node, + &TransConvertType_Object) || + ELEM(t->data_type, &TransConvertType_Particle))) { /* Disable proportional editing */ t->options |= CTX_NO_PET; @@ -803,6 +804,7 @@ static void init_TransDataContainers(TransInfo *t, &TransConvertType_Curve, &TransConvertType_Curves, &TransConvertType_GPencil, + &TransConvertType_GreasePencil, &TransConvertType_Lattice, &TransConvertType_MBall, &TransConvertType_Mesh, @@ -819,6 +821,7 @@ static void init_TransDataContainers(TransInfo *t, const short object_type = obact ? obact->type : -1; if ((object_mode & OB_MODE_EDIT) || (t->data_type == &TransConvertType_GPencil) || + (t->data_type == &TransConvertType_GreasePencil) || ((object_mode & OB_MODE_POSE) && (object_type == OB_ARMATURE))) { if (t->data_container) { @@ -866,6 +869,9 @@ static void init_TransDataContainers(TransInfo *t, else if (t->data_type == &TransConvertType_GPencil) { tc->use_local_mat = true; } + else if (t->data_type == &TransConvertType_GreasePencil) { + tc->use_local_mat = true; + } if (tc->use_local_mat) { BLI_assert((t->flag & T_2D_EDIT) == 0); @@ -916,7 +922,13 @@ static TransConvertTypeInfo *convert_type_get(const TransInfo *t, Object **r_obj return &TransConvertType_MeshEdge; } if (t->options & CTX_GPENCIL_STROKES) { - return &TransConvertType_GPencil; + if (t->obedit_type == OB_GREASE_PENCIL) { + return &TransConvertType_GreasePencil; + } + else if (t->obedit_type == OB_GPENCIL_LEGACY) { + return &TransConvertType_GPencil; + } + return nullptr; } if (t->spacetype == SPACE_IMAGE) { if (t->options & CTX_MASK) { diff --git a/source/blender/editors/transform/transform_convert.hh b/source/blender/editors/transform/transform_convert.hh index f149ad260f1..82ba7ecd811 100644 --- a/source/blender/editors/transform/transform_convert.hh +++ b/source/blender/editors/transform/transform_convert.hh @@ -143,6 +143,10 @@ extern TransConvertTypeInfo TransConvertType_Graph; extern TransConvertTypeInfo TransConvertType_GPencil; +/* `transform_convert_greasepencil.cc` */ + +extern TransConvertTypeInfo TransConvertType_GreasePencil; + /* `transform_convert_lattice.cc` */ extern TransConvertTypeInfo TransConvertType_Lattice; diff --git a/source/blender/editors/transform/transform_convert_greasepencil.cc b/source/blender/editors/transform/transform_convert_greasepencil.cc new file mode 100644 index 00000000000..241e0d1dd37 --- /dev/null +++ b/source/blender/editors/transform/transform_convert_greasepencil.cc @@ -0,0 +1,263 @@ +/* SPDX-FileCopyrightText: 2023 Blender Authors + * + * SPDX-License-Identifier: GPL-2.0-or-later */ + +/** \file + * \ingroup edtransform + */ + +#include "BLI_array.hh" +#include "BLI_inplace_priority_queue.hh" +#include "BLI_math_matrix.h" +#include "BLI_span.hh" + +#include "BKE_context.h" +#include "BKE_curves.hh" +#include "BKE_grease_pencil.hh" + +#include "ED_curves.hh" +#include "ED_grease_pencil.hh" + +#include "MEM_guardedalloc.h" + +#include "WM_api.hh" + +#include "transform.hh" +#include "transform_convert.hh" + +/* -------------------------------------------------------------------- */ +/** \name Grease Pencil Transform Creation + * \{ */ + +namespace blender::ed::transform::greasepencil { + +/* TODO: move and/or combine with the blender::ed::transform::curves. */ +static void calculate_curve_point_distances_for_proportional_editing( + const Span positions, MutableSpan r_distances) +{ + Array visited(positions.size(), false); + + InplacePriorityQueue> queue(r_distances); + while (!queue.is_empty()) { + int64_t index = queue.pop_index(); + if (visited[index]) { + continue; + } + visited[index] = true; + + /* TODO(Falk): Handle cyclic curves here. */ + if (index > 0 && !visited[index - 1]) { + int adjacent = index - 1; + float dist = r_distances[index] + math::distance(positions[index], positions[adjacent]); + if (dist < r_distances[adjacent]) { + r_distances[adjacent] = dist; + queue.priority_changed(adjacent); + } + } + if (index < positions.size() - 1 && !visited[index + 1]) { + int adjacent = index + 1; + float dist = r_distances[index] + math::distance(positions[index], positions[adjacent]); + if (dist < r_distances[adjacent]) { + r_distances[adjacent] = dist; + queue.priority_changed(adjacent); + } + } + } +} + +static void createTransGreasePencilVerts(bContext *C, TransInfo *t) +{ + Scene *scene = CTX_data_scene(C); + MutableSpan trans_data_contrainers(t->data_container, t->data_container_len); + IndexMaskMemory memory; + Array selection_per_layer_per_object(t->data_container_len); + const bool use_proportional_edit = (t->flag & T_PROP_EDIT_ALL) != 0; + const bool use_connected_only = (t->flag & T_PROP_CONNECTED) != 0; + int layer_offset = 0; + + /* Count selected elements per layer per object and create TransData structs. */ + for (const int i : trans_data_contrainers.index_range()) { + TransDataContainer &tc = trans_data_contrainers[i]; + GreasePencil &grease_pencil = *static_cast(tc.obedit->data); + + grease_pencil.foreach_editable_drawing( + scene->r.cfra, [&](int /*drawing_index*/, blender::bke::greasepencil::Drawing &drawing) { + bke::CurvesGeometry &curves = drawing.strokes_for_write(); + + if (use_proportional_edit) { + tc.data_len += curves.point_num; + } + else { + selection_per_layer_per_object[i + layer_offset] = + ed::curves::retrieve_selected_points(curves, memory); + tc.data_len += selection_per_layer_per_object[i + layer_offset].size(); + } + + layer_offset++; + }); + + if (tc.data_len > 0) { + tc.data = MEM_cnew_array(tc.data_len, __func__); + } + } + + layer_offset = 0; + /* Populate TransData structs. */ + for (const int i : trans_data_contrainers.index_range()) { + TransDataContainer &tc = trans_data_contrainers[i]; + if (tc.data_len == 0) { + continue; + } + GreasePencil &grease_pencil = *static_cast(tc.obedit->data); + + float mtx[3][3], smtx[3][3]; + copy_m3_m4(mtx, tc.obedit->object_to_world); + pseudoinverse_m3_m3(smtx, mtx, PSEUDOINVERSE_EPSILON); + + int layer_points_offset = 0; + + grease_pencil.foreach_editable_drawing( + scene->r.cfra, [&](int /*drawing_index*/, blender::bke::greasepencil::Drawing &drawing) { + bke::CurvesGeometry &curves = drawing.strokes_for_write(); + + MutableSpan positions = curves.positions_for_write(); + MutableSpan radii = drawing.radii_for_write(); + MutableSpan opacities = drawing.opacities_for_write(); + if (use_proportional_edit) { + const OffsetIndices points_by_curve = curves.points_by_curve(); + const VArray selection = *curves.attributes().lookup_or_default( + ".selection", ATTR_DOMAIN_POINT, true); + threading::parallel_for(curves.curves_range(), 512, [&](const IndexRange range) { + Vector closest_distances; + for (const int curve_i : range) { + const IndexRange points = points_by_curve[curve_i]; + const bool has_any_selected = ed::curves::has_anything_selected(selection, points); + if (!has_any_selected && use_connected_only) { + for (const int point_i : points) { + TransData &td = tc.data[point_i + layer_points_offset]; + td.flag |= TD_SKIP; + } + continue; + } + + closest_distances.reinitialize(points.size()); + closest_distances.fill(std::numeric_limits::max()); + + for (const int i : IndexRange(points.size())) { + const int point_i = points[i]; + TransData &td = tc.data[point_i + layer_points_offset]; + float3 *elem = &positions[point_i]; + + copy_v3_v3(td.iloc, *elem); + copy_v3_v3(td.center, td.iloc); + td.loc = *elem; + + td.flag = 0; + if (selection[point_i]) { + closest_distances[i] = 0.0f; + td.flag = TD_SELECTED; + } + + if (t->mode == TFM_CURVE_SHRINKFATTEN) { + float *radius = &radii[point_i]; + td.val = radius; + td.ival = *radius; + } + else if (t->mode == TFM_GPENCIL_OPACITY) { + float *opacity = &opacities[point_i]; + td.val = opacity; + td.ival = *opacity; + } + + td.ext = nullptr; + + copy_m3_m3(td.smtx, smtx); + copy_m3_m3(td.mtx, mtx); + } + + if (use_connected_only) { + calculate_curve_point_distances_for_proportional_editing( + positions.slice(points), closest_distances.as_mutable_span()); + for (const int i : IndexRange(points.size())) { + TransData &td = tc.data[points[i] + layer_points_offset]; + td.dist = closest_distances[i]; + } + } + } + }); + } + else { + const IndexMask selected_indices = selection_per_layer_per_object[i + layer_offset]; + threading::parallel_for( + selected_indices.index_range(), 1024, [&](const IndexRange range) { + for (const int selection_i : range) { + TransData *td = &tc.data[selection_i + layer_points_offset]; + const int point_i = selected_indices[selection_i]; + float3 *elem = &positions[point_i]; + + copy_v3_v3(td->iloc, *elem); + copy_v3_v3(td->center, td->iloc); + td->loc = *elem; + + if (t->mode == TFM_CURVE_SHRINKFATTEN) { + float *radius = &radii[point_i]; + td->val = radius; + td->ival = *radius; + } + else if (t->mode == TFM_GPENCIL_OPACITY) { + float *opacity = &opacities[point_i]; + td->val = opacity; + td->ival = *opacity; + } + + td->flag = TD_SELECTED; + td->ext = nullptr; + + copy_m3_m3(td->smtx, smtx); + copy_m3_m3(td->mtx, mtx); + } + }); + } + + if (use_proportional_edit) { + layer_points_offset += curves.point_num; + } + else { + layer_points_offset += selection_per_layer_per_object[i + layer_offset].size(); + } + layer_offset++; + }); + } +} + +static void recalcData_greasepencil(TransInfo *t) +{ + bContext *C = t->context; + Scene *scene = CTX_data_scene(C); + + const Span trans_data_contrainers(t->data_container, t->data_container_len); + for (const TransDataContainer &tc : trans_data_contrainers) { + GreasePencil &grease_pencil = *static_cast(tc.obedit->data); + + grease_pencil.foreach_editable_drawing( + scene->r.cfra, [&](int /*drawing_index*/, blender::bke::greasepencil::Drawing &drawing) { + bke::CurvesGeometry &curves = drawing.strokes_for_write(); + + curves.calculate_bezier_auto_handles(); + curves.tag_positions_changed(); + }); + + DEG_id_tag_update(&grease_pencil.id, ID_RECALC_GEOMETRY); + } +} + +} // namespace blender::ed::transform::greasepencil + +/** \} */ + +TransConvertTypeInfo TransConvertType_GreasePencil = { + /*flags*/ (T_EDIT | T_POINTS), + /*create_trans_data*/ blender::ed::transform::greasepencil::createTransGreasePencilVerts, + /*recalc_data*/ blender::ed::transform::greasepencil::recalcData_greasepencil, + /*special_aftertrans_update*/ nullptr, +}; diff --git a/source/blender/editors/transform/transform_generics.cc b/source/blender/editors/transform/transform_generics.cc index a0533ec0da1..dd243ffe0dc 100644 --- a/source/blender/editors/transform/transform_generics.cc +++ b/source/blender/editors/transform/transform_generics.cc @@ -226,6 +226,11 @@ void initTransInfo(bContext *C, TransInfo *t, wmOperator *op, const wmEvent *eve t->options |= CTX_GPENCIL_STROKES; } + /* Grease Pencil editing context */ + if (t->obedit_type == OB_GREASE_PENCIL && object_mode == OB_MODE_EDIT) { + t->options |= CTX_GPENCIL_STROKES; + } + /* Assign the space type, some exceptions for running in different mode */ if (area == nullptr) { /* background mode */ diff --git a/source/blender/editors/transform/transform_mode.cc b/source/blender/editors/transform/transform_mode.cc index c7fc9e5f2d8..bca6b0fc3b7 100644 --- a/source/blender/editors/transform/transform_mode.cc +++ b/source/blender/editors/transform/transform_mode.cc @@ -560,11 +560,17 @@ void ElementRotation_ex(const TransInfo *t, /* Apply gpencil falloff. */ if (t->options & CTX_GPENCIL_STROKES) { - bGPDstroke *gps = (bGPDstroke *)td->extra; - if (gps->runtime.multi_frame_falloff != 1.0f) { - float ident_mat[3][3]; - unit_m3(ident_mat); - interp_m3_m3m3(smat, ident_mat, smat, gps->runtime.multi_frame_falloff); + if (t->obedit_type == OB_GPENCIL_LEGACY) { + + bGPDstroke *gps = (bGPDstroke *)td->extra; + if (gps->runtime.multi_frame_falloff != 1.0f) { + float ident_mat[3][3]; + unit_m3(ident_mat); + interp_m3_m3m3(smat, ident_mat, smat, gps->runtime.multi_frame_falloff); + } + } + else if (t->obedit_type == OB_GREASE_PENCIL) { + /* pass */ } } @@ -1024,21 +1030,26 @@ void ElementResize(const TransInfo *t, * Operating on copies as a temporary solution. */ if (t->options & CTX_GPENCIL_STROKES) { - bGPDstroke *gps = (bGPDstroke *)td->extra; - mul_v3_fl(vec, td->factor * gps->runtime.multi_frame_falloff); + if (t->obedit_type == OB_GPENCIL_LEGACY) { + bGPDstroke *gps = (bGPDstroke *)td->extra; + mul_v3_fl(vec, td->factor * gps->runtime.multi_frame_falloff); - /* Scale stroke thickness. */ - if (td->val) { - NumInput num_evil = t->num; - float values_final_evil[4]; - copy_v4_v4(values_final_evil, t->values_final); - transform_snap_increment(t, values_final_evil); - applyNumInput(&num_evil, values_final_evil); + /* Scale stroke thickness. */ + if (td->val) { + NumInput num_evil = t->num; + float values_final_evil[4]; + copy_v4_v4(values_final_evil, t->values_final); + transform_snap_increment(t, values_final_evil); + applyNumInput(&num_evil, values_final_evil); - float ratio = values_final_evil[0]; - float transformed_value = td->ival * fabs(ratio); - *td->val = max_ff(interpf(transformed_value, td->ival, gps->runtime.multi_frame_falloff), - 0.001f); + float ratio = values_final_evil[0]; + float transformed_value = td->ival * fabs(ratio); + *td->val = max_ff(interpf(transformed_value, td->ival, gps->runtime.multi_frame_falloff), + 0.001f); + } + } + else if (t->obedit_type == OB_GREASE_PENCIL) { + mul_v3_fl(vec, td->factor); } } else { diff --git a/source/blender/editors/transform/transform_mode_gpopacity.cc b/source/blender/editors/transform/transform_mode_gpopacity.cc index 0a645af79ac..e92a3831877 100644 --- a/source/blender/editors/transform/transform_mode_gpopacity.cc +++ b/source/blender/editors/transform/transform_mode_gpopacity.cc @@ -60,10 +60,16 @@ static void applyGPOpacity(TransInfo *t) bool recalc = false; FOREACH_TRANS_DATA_CONTAINER (t, tc) { TransData *td = tc->data; - bGPdata *gpd = static_cast(td->ob->data); - const bool is_curve_edit = bool(GPENCIL_CURVE_EDIT_SESSIONS_ON(gpd)); - /* Only recalculate data when in curve edit mode. */ - if (is_curve_edit) { + + if (t->obedit_type == OB_GPENCIL_LEGACY) { + bGPdata *gpd = static_cast(td->ob->data); + const bool is_curve_edit = bool(GPENCIL_CURVE_EDIT_SESSIONS_ON(gpd)); + /* Only recalculate data when in curve edit mode. */ + if (is_curve_edit) { + recalc = true; + } + } + else if (t->obedit_type == OB_GREASE_PENCIL) { recalc = true; } -- 2.30.2 From 96c25a9f5c3c5aad9b006e5fc00dfb155017d713 Mon Sep 17 00:00:00 2001 From: Casey Bianco-Davis Date: Sat, 2 Sep 2023 14:57:16 -0700 Subject: [PATCH 02/19] GPv3: Fix transform gizmo not showing up --- source/blender/blenkernel/BKE_crazyspace.hh | 3 ++ .../blender/blenkernel/intern/crazyspace.cc | 8 +++++ .../editors/transform/transform_gizmo_3d.cc | 33 ++++++++++++++++++- 3 files changed, 43 insertions(+), 1 deletion(-) diff --git a/source/blender/blenkernel/BKE_crazyspace.hh b/source/blender/blenkernel/BKE_crazyspace.hh index b1df5f94c1c..7510b896685 100644 --- a/source/blender/blenkernel/BKE_crazyspace.hh +++ b/source/blender/blenkernel/BKE_crazyspace.hh @@ -54,5 +54,8 @@ GeometryDeformation get_evaluated_curves_deformation(const Depsgraph &depsgraph, GeometryDeformation get_evaluated_grease_pencil_drawing_deformation(const Object *ob_eval, const Object &ob_orig, int drawing_index); +GeometryDeformation get_evaluated_grease_pencil_drawing_deformation(const Depsgraph &depsgraph, + const Object &ob_orig, + int drawing_index); } // namespace blender::bke::crazyspace diff --git a/source/blender/blenkernel/intern/crazyspace.cc b/source/blender/blenkernel/intern/crazyspace.cc index 8afd618ca67..431a5f7d258 100644 --- a/source/blender/blenkernel/intern/crazyspace.cc +++ b/source/blender/blenkernel/intern/crazyspace.cc @@ -701,4 +701,12 @@ GeometryDeformation get_evaluated_grease_pencil_drawing_deformation(const Object return deformation; } +GeometryDeformation get_evaluated_grease_pencil_drawing_deformation(const Depsgraph &depsgraph, + const Object &ob_orig, + const int drawing_index) +{ + const Object *ob_eval = DEG_get_evaluated_object(&depsgraph, const_cast(&ob_orig)); + return get_evaluated_grease_pencil_drawing_deformation(ob_eval, ob_orig, drawing_index); +} + } // namespace blender::bke::crazyspace diff --git a/source/blender/editors/transform/transform_gizmo_3d.cc b/source/blender/editors/transform/transform_gizmo_3d.cc index b0eab61c9ae..86be8f66abb 100644 --- a/source/blender/editors/transform/transform_gizmo_3d.cc +++ b/source/blender/editors/transform/transform_gizmo_3d.cc @@ -10,6 +10,7 @@ * Used for 3D View */ +#include "BLI_array_utils.h" #include "BLI_function_ref.hh" #include "BLI_math_geom.h" #include "BLI_math_matrix.h" @@ -26,12 +27,12 @@ #include "BKE_editmesh.h" #include "BKE_global.h" #include "BKE_gpencil_legacy.h" +#include "BKE_grease_pencil.hh" #include "BKE_layer.h" #include "BKE_object.h" #include "BKE_paint.hh" #include "BKE_pointcache.h" #include "BKE_scene.h" -#include "BLI_array_utils.h" #include "WM_api.hh" #include "WM_message.hh" @@ -41,6 +42,7 @@ #include "ED_gizmo_library.hh" #include "ED_gizmo_utils.hh" #include "ED_gpencil_legacy.hh" +#include "ED_grease_pencil.hh" #include "ED_object.hh" #include "ED_particle.hh" #include "ED_screen.hh" @@ -807,6 +809,35 @@ static int gizmo_3d_foreach_selected(const bContext *C, } FOREACH_EDIT_OBJECT_END(); } + else if (obedit->type == OB_GREASE_PENCIL) { + FOREACH_EDIT_OBJECT_BEGIN (ob_iter, use_mat_local) { + GreasePencil &grease_pencil = *static_cast(ob_iter->data); + + float4x4 mat_local; + if (use_mat_local) { + mat_local = float4x4(obedit->world_to_object) * float4x4(ob_iter->object_to_world); + } + + grease_pencil.foreach_editable_drawing( + scene->r.cfra, [&](int drawing_index, blender::bke::greasepencil::Drawing &drawing) { + const bke::CurvesGeometry &curves = drawing.strokes(); + + const bke::crazyspace::GeometryDeformation deformation = + bke::crazyspace::get_evaluated_grease_pencil_drawing_deformation( + *depsgraph, *ob, drawing_index); + + IndexMaskMemory memory; + const IndexMask selected_points = ed::curves::retrieve_selected_points(curves, + memory); + const Span positions = deformation.positions; + totsel += selected_points.size(); + selected_points.foreach_index([&](const int point_i) { + run_coord_with_matrix(positions[point_i], use_mat_local, mat_local.ptr()); + }); + }); + } + FOREACH_EDIT_OBJECT_END(); + } #undef FOREACH_EDIT_OBJECT_BEGIN #undef FOREACH_EDIT_OBJECT_END -- 2.30.2 From ee01ebcdd505b1ae0026d9205f32f077d7d8b501 Mon Sep 17 00:00:00 2001 From: Casey Bianco-Davis Date: Sat, 2 Sep 2023 16:21:37 -0700 Subject: [PATCH 03/19] GPv3: Use const --- .../blender/editors/transform/transform_convert_greasepencil.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/blender/editors/transform/transform_convert_greasepencil.cc b/source/blender/editors/transform/transform_convert_greasepencil.cc index 241e0d1dd37..920f236d1c7 100644 --- a/source/blender/editors/transform/transform_convert_greasepencil.cc +++ b/source/blender/editors/transform/transform_convert_greasepencil.cc @@ -82,7 +82,7 @@ static void createTransGreasePencilVerts(bContext *C, TransInfo *t) grease_pencil.foreach_editable_drawing( scene->r.cfra, [&](int /*drawing_index*/, blender::bke::greasepencil::Drawing &drawing) { - bke::CurvesGeometry &curves = drawing.strokes_for_write(); + const bke::CurvesGeometry &curves = drawing.strokes(); if (use_proportional_edit) { tc.data_len += curves.point_num; -- 2.30.2 From 2b86203fa01925fd9422de8f64f6765e35755632 Mon Sep 17 00:00:00 2001 From: Casey Bianco-Davis Date: Wed, 27 Sep 2023 21:40:45 -0700 Subject: [PATCH 04/19] Cleanup: use "grease_pencil" instead of "greasepencil" --- source/blender/editors/transform/CMakeLists.txt | 2 +- source/blender/editors/transform/transform_convert.cc | 1 + ...ert_greasepencil.cc => transform_convert_grease_pencil.cc} | 4 ++-- 3 files changed, 4 insertions(+), 3 deletions(-) rename source/blender/editors/transform/{transform_convert_greasepencil.cc => transform_convert_grease_pencil.cc} (99%) diff --git a/source/blender/editors/transform/CMakeLists.txt b/source/blender/editors/transform/CMakeLists.txt index f6c2fa2b663..e60271b3645 100644 --- a/source/blender/editors/transform/CMakeLists.txt +++ b/source/blender/editors/transform/CMakeLists.txt @@ -32,7 +32,7 @@ set(SRC transform_convert_curves.cc transform_convert_gpencil_legacy.cc transform_convert_graph.cc - transform_convert_greasepencil.cc + transform_convert_grease_pencil.cc transform_convert_lattice.cc transform_convert_mask.cc transform_convert_mball.cc diff --git a/source/blender/editors/transform/transform_convert.cc b/source/blender/editors/transform/transform_convert.cc index 1cb44dc1920..99d585f4a52 100644 --- a/source/blender/editors/transform/transform_convert.cc +++ b/source/blender/editors/transform/transform_convert.cc @@ -724,6 +724,7 @@ static int countAndCleanTransDataContainer(TransInfo *t) static void init_proportional_edit(TransInfo *t) { /* NOTE: Proportional editing is not usable in pose mode yet #32444. */ + /* NOTE: This `ELEM` uses more than 16 elements and so has been split. */ if (!(ELEM(t->data_type, &TransConvertType_Action, &TransConvertType_Curve, diff --git a/source/blender/editors/transform/transform_convert_greasepencil.cc b/source/blender/editors/transform/transform_convert_grease_pencil.cc similarity index 99% rename from source/blender/editors/transform/transform_convert_greasepencil.cc rename to source/blender/editors/transform/transform_convert_grease_pencil.cc index 920f236d1c7..5ddede0e5b0 100644 --- a/source/blender/editors/transform/transform_convert_greasepencil.cc +++ b/source/blender/editors/transform/transform_convert_grease_pencil.cc @@ -230,7 +230,7 @@ static void createTransGreasePencilVerts(bContext *C, TransInfo *t) } } -static void recalcData_greasepencil(TransInfo *t) +static void recalcData_grease_pencil(TransInfo *t) { bContext *C = t->context; Scene *scene = CTX_data_scene(C); @@ -258,6 +258,6 @@ static void recalcData_greasepencil(TransInfo *t) TransConvertTypeInfo TransConvertType_GreasePencil = { /*flags*/ (T_EDIT | T_POINTS), /*create_trans_data*/ blender::ed::transform::greasepencil::createTransGreasePencilVerts, - /*recalc_data*/ blender::ed::transform::greasepencil::recalcData_greasepencil, + /*recalc_data*/ blender::ed::transform::greasepencil::recalcData_grease_pencil, /*special_aftertrans_update*/ nullptr, }; -- 2.30.2 From 040f15463c572bc883608e2cb2b876322d6babb2 Mon Sep 17 00:00:00 2001 From: Casey Bianco-Davis Date: Sat, 30 Sep 2023 14:27:36 -0700 Subject: [PATCH 05/19] Cleanup: share curve and grease pencil transform code. --- .../editors/transform/transform_convert.hh | 19 +- .../transform/transform_convert_curves.cc | 183 ++++++++++-------- .../transform_convert_grease_pencil.cc | 148 ++------------ 3 files changed, 144 insertions(+), 206 deletions(-) diff --git a/source/blender/editors/transform/transform_convert.hh b/source/blender/editors/transform/transform_convert.hh index 82ba7ecd811..b328ba1ae0d 100644 --- a/source/blender/editors/transform/transform_convert.hh +++ b/source/blender/editors/transform/transform_convert.hh @@ -11,6 +11,10 @@ #include "RE_engine.h" +#include "BKE_curves.hh" + +#include "BLI_index_mask.hh" + struct BMEditMesh; struct BMesh; struct BezTriple; @@ -106,6 +110,19 @@ void transform_convert_clip_mirror_modifier_apply(TransDataContainer *tc); */ void animrecord_check_state(TransInfo *t, ID *id); +/* `transform_convert_curves.cc` */ + +/** + * Used for both curves and grease pencil objects. + */ +void curvePopulateTransDataStructs(TransDataContainer &tc, + blender::bke::CurvesGeometry &curves, + blender::MutableSpan *value_attribute, + const blender::IndexMask &selected_indices, + const bool use_proportional_edit, + const bool use_connected_only, + const int data_offset); + /* `transform_convert_action.cc` */ extern TransConvertTypeInfo TransConvertType_Action; @@ -131,7 +148,7 @@ extern TransConvertTypeInfo TransConvertType_Cursor3D; extern TransConvertTypeInfo TransConvertType_Curve; -/* transform_convert_curves.cc */ +/* `transform_convert_curves.cc` */ extern TransConvertTypeInfo TransConvertType_Curves; diff --git a/source/blender/editors/transform/transform_convert_curves.cc b/source/blender/editors/transform/transform_convert_curves.cc index a40dd42041c..34d825dffe4 100644 --- a/source/blender/editors/transform/transform_convert_curves.cc +++ b/source/blender/editors/transform/transform_convert_curves.cc @@ -95,82 +95,13 @@ static void createTransCurvesVerts(bContext * /*C*/, TransInfo *t) Curves *curves_id = static_cast(tc.obedit->data); bke::CurvesGeometry &curves = curves_id->geometry.wrap(); - float mtx[3][3], smtx[3][3]; - copy_m3_m4(mtx, tc.obedit->object_to_world); - pseudoinverse_m3_m3(smtx, mtx, PSEUDOINVERSE_EPSILON); - - MutableSpan positions = curves.positions_for_write(); - if (use_proportional_edit) { - const OffsetIndices points_by_curve = curves.points_by_curve(); - const VArray selection = *curves.attributes().lookup_or_default( - ".selection", ATTR_DOMAIN_POINT, true); - threading::parallel_for(curves.curves_range(), 512, [&](const IndexRange range) { - Vector closest_distances; - for (const int curve_i : range) { - const IndexRange points = points_by_curve[curve_i]; - const bool has_any_selected = ed::curves::has_anything_selected(selection, points); - if (!has_any_selected && use_connected_only) { - for (const int point_i : points) { - TransData &td = tc.data[point_i]; - td.flag |= TD_SKIP; - } - continue; - } - - closest_distances.reinitialize(points.size()); - closest_distances.fill(std::numeric_limits::max()); - - for (const int i : IndexRange(points.size())) { - const int point_i = points[i]; - TransData &td = tc.data[point_i]; - float3 *elem = &positions[point_i]; - - copy_v3_v3(td.iloc, *elem); - copy_v3_v3(td.center, td.iloc); - td.loc = *elem; - - td.flag = 0; - if (selection[point_i]) { - closest_distances[i] = 0.0f; - td.flag = TD_SELECTED; - } - - td.ext = nullptr; - - copy_m3_m3(td.smtx, smtx); - copy_m3_m3(td.mtx, mtx); - } - - if (use_connected_only) { - calculate_curve_point_distances_for_proportional_editing( - positions.slice(points), closest_distances.as_mutable_span()); - for (const int i : IndexRange(points.size())) { - TransData &td = tc.data[points[i]]; - td.dist = closest_distances[i]; - } - } - } - }); - } - else { - const IndexMask selected_indices = selection_per_object[i]; - threading::parallel_for(selected_indices.index_range(), 1024, [&](const IndexRange range) { - for (const int selection_i : range) { - TransData *td = &tc.data[selection_i]; - float3 *elem = &positions[selected_indices[selection_i]]; - - copy_v3_v3(td->iloc, *elem); - copy_v3_v3(td->center, td->iloc); - td->loc = *elem; - - td->flag = TD_SELECTED; - td->ext = nullptr; - - copy_m3_m3(td->smtx, smtx); - copy_m3_m3(td->mtx, mtx); - } - }); - } + curvePopulateTransDataStructs(tc, + curves, + nullptr /* Currently no attributes. */, + selection_per_object[i], + use_proportional_edit, + use_connected_only, + 0 /* No data offset for curves. */); } } @@ -189,6 +120,106 @@ static void recalcData_curves(TransInfo *t) } // namespace blender::ed::transform::curves +void curvePopulateTransDataStructs(TransDataContainer &tc, + blender::bke::CurvesGeometry &curves, + blender::MutableSpan *value_attribute, + const blender::IndexMask &selected_indices, + const bool use_proportional_edit, + const bool use_connected_only, + const int data_offset) +{ + using namespace blender; + + float mtx[3][3], smtx[3][3]; + copy_m3_m4(mtx, tc.obedit->object_to_world); + pseudoinverse_m3_m3(smtx, mtx, PSEUDOINVERSE_EPSILON); + + MutableSpan positions = curves.positions_for_write(); + if (use_proportional_edit) { + const OffsetIndices points_by_curve = curves.points_by_curve(); + const VArray selection = *curves.attributes().lookup_or_default( + ".selection", ATTR_DOMAIN_POINT, true); + threading::parallel_for(curves.curves_range(), 512, [&](const IndexRange range) { + Vector closest_distances; + for (const int curve_i : range) { + const IndexRange points = points_by_curve[curve_i]; + const bool has_any_selected = ed::curves::has_anything_selected(selection, points); + if (!has_any_selected && use_connected_only) { + for (const int point_i : points) { + TransData &td = tc.data[point_i + data_offset]; + td.flag |= TD_SKIP; + } + continue; + } + + closest_distances.reinitialize(points.size()); + closest_distances.fill(std::numeric_limits::max()); + + for (const int i : IndexRange(points.size())) { + const int point_i = points[i]; + TransData &td = tc.data[point_i + data_offset]; + float3 *elem = &positions[point_i]; + + copy_v3_v3(td.iloc, *elem); + copy_v3_v3(td.center, td.iloc); + td.loc = *elem; + + td.flag = 0; + if (selection[point_i]) { + closest_distances[i] = 0.0f; + td.flag = TD_SELECTED; + } + + if (value_attribute != nullptr) { + float *value = &((*value_attribute)[point_i]); + td.val = value; + td.ival = *value; + } + + td.ext = nullptr; + + copy_m3_m3(td.smtx, smtx); + copy_m3_m3(td.mtx, mtx); + } + + if (use_connected_only) { + blender::ed::transform::curves::calculate_curve_point_distances_for_proportional_editing( + positions.slice(points), closest_distances.as_mutable_span()); + for (const int i : IndexRange(points.size())) { + TransData &td = tc.data[points[i] + data_offset]; + td.dist = closest_distances[i]; + } + } + } + }); + } + else { + threading::parallel_for(selected_indices.index_range(), 1024, [&](const IndexRange range) { + for (const int selection_i : range) { + TransData *td = &tc.data[selection_i + data_offset]; + const int point_i = selected_indices[selection_i]; + float3 *elem = &positions[point_i]; + + copy_v3_v3(td->iloc, *elem); + copy_v3_v3(td->center, td->iloc); + td->loc = *elem; + + if (value_attribute != nullptr) { + float *value = &((*value_attribute)[point_i]); + td->val = value; + td->ival = *value; + } + + td->flag = TD_SELECTED; + td->ext = nullptr; + + copy_m3_m3(td->smtx, smtx); + copy_m3_m3(td->mtx, mtx); + } + }); + } +} + /** \} */ TransConvertTypeInfo TransConvertType_Curves = { diff --git a/source/blender/editors/transform/transform_convert_grease_pencil.cc b/source/blender/editors/transform/transform_convert_grease_pencil.cc index 5ddede0e5b0..e4b4344a466 100644 --- a/source/blender/editors/transform/transform_convert_grease_pencil.cc +++ b/source/blender/editors/transform/transform_convert_grease_pencil.cc @@ -31,40 +31,6 @@ namespace blender::ed::transform::greasepencil { -/* TODO: move and/or combine with the blender::ed::transform::curves. */ -static void calculate_curve_point_distances_for_proportional_editing( - const Span positions, MutableSpan r_distances) -{ - Array visited(positions.size(), false); - - InplacePriorityQueue> queue(r_distances); - while (!queue.is_empty()) { - int64_t index = queue.pop_index(); - if (visited[index]) { - continue; - } - visited[index] = true; - - /* TODO(Falk): Handle cyclic curves here. */ - if (index > 0 && !visited[index - 1]) { - int adjacent = index - 1; - float dist = r_distances[index] + math::distance(positions[index], positions[adjacent]); - if (dist < r_distances[adjacent]) { - r_distances[adjacent] = dist; - queue.priority_changed(adjacent); - } - } - if (index < positions.size() - 1 && !visited[index + 1]) { - int adjacent = index + 1; - float dist = r_distances[index] + math::distance(positions[index], positions[adjacent]); - if (dist < r_distances[adjacent]) { - r_distances[adjacent] = dist; - queue.priority_changed(adjacent); - } - } - } -} - static void createTransGreasePencilVerts(bContext *C, TransInfo *t) { Scene *scene = CTX_data_scene(C); @@ -101,7 +67,9 @@ static void createTransGreasePencilVerts(bContext *C, TransInfo *t) } } + /* Reuse the variable `layer_offset` */ layer_offset = 0; + /* Populate TransData structs. */ for (const int i : trans_data_contrainers.index_range()) { TransDataContainer &tc = trans_data_contrainers[i]; @@ -120,110 +88,32 @@ static void createTransGreasePencilVerts(bContext *C, TransInfo *t) scene->r.cfra, [&](int /*drawing_index*/, blender::bke::greasepencil::Drawing &drawing) { bke::CurvesGeometry &curves = drawing.strokes_for_write(); - MutableSpan positions = curves.positions_for_write(); - MutableSpan radii = drawing.radii_for_write(); - MutableSpan opacities = drawing.opacities_for_write(); - if (use_proportional_edit) { - const OffsetIndices points_by_curve = curves.points_by_curve(); - const VArray selection = *curves.attributes().lookup_or_default( - ".selection", ATTR_DOMAIN_POINT, true); - threading::parallel_for(curves.curves_range(), 512, [&](const IndexRange range) { - Vector closest_distances; - for (const int curve_i : range) { - const IndexRange points = points_by_curve[curve_i]; - const bool has_any_selected = ed::curves::has_anything_selected(selection, points); - if (!has_any_selected && use_connected_only) { - for (const int point_i : points) { - TransData &td = tc.data[point_i + layer_points_offset]; - td.flag |= TD_SKIP; - } - continue; - } + const IndexMask selected_indices = selection_per_layer_per_object[i + layer_offset]; - closest_distances.reinitialize(points.size()); - closest_distances.fill(std::numeric_limits::max()); + MutableSpan *value_attribute = nullptr; - for (const int i : IndexRange(points.size())) { - const int point_i = points[i]; - TransData &td = tc.data[point_i + layer_points_offset]; - float3 *elem = &positions[point_i]; - - copy_v3_v3(td.iloc, *elem); - copy_v3_v3(td.center, td.iloc); - td.loc = *elem; - - td.flag = 0; - if (selection[point_i]) { - closest_distances[i] = 0.0f; - td.flag = TD_SELECTED; - } - - if (t->mode == TFM_CURVE_SHRINKFATTEN) { - float *radius = &radii[point_i]; - td.val = radius; - td.ival = *radius; - } - else if (t->mode == TFM_GPENCIL_OPACITY) { - float *opacity = &opacities[point_i]; - td.val = opacity; - td.ival = *opacity; - } - - td.ext = nullptr; - - copy_m3_m3(td.smtx, smtx); - copy_m3_m3(td.mtx, mtx); - } - - if (use_connected_only) { - calculate_curve_point_distances_for_proportional_editing( - positions.slice(points), closest_distances.as_mutable_span()); - for (const int i : IndexRange(points.size())) { - TransData &td = tc.data[points[i] + layer_points_offset]; - td.dist = closest_distances[i]; - } - } - } - }); + if (t->mode == TFM_CURVE_SHRINKFATTEN) { + MutableSpan radii = drawing.radii_for_write(); + value_attribute = &radii; } - else { - const IndexMask selected_indices = selection_per_layer_per_object[i + layer_offset]; - threading::parallel_for( - selected_indices.index_range(), 1024, [&](const IndexRange range) { - for (const int selection_i : range) { - TransData *td = &tc.data[selection_i + layer_points_offset]; - const int point_i = selected_indices[selection_i]; - float3 *elem = &positions[point_i]; - - copy_v3_v3(td->iloc, *elem); - copy_v3_v3(td->center, td->iloc); - td->loc = *elem; - - if (t->mode == TFM_CURVE_SHRINKFATTEN) { - float *radius = &radii[point_i]; - td->val = radius; - td->ival = *radius; - } - else if (t->mode == TFM_GPENCIL_OPACITY) { - float *opacity = &opacities[point_i]; - td->val = opacity; - td->ival = *opacity; - } - - td->flag = TD_SELECTED; - td->ext = nullptr; - - copy_m3_m3(td->smtx, smtx); - copy_m3_m3(td->mtx, mtx); - } - }); + else if (t->mode == TFM_GPENCIL_OPACITY) { + MutableSpan opacities = drawing.opacities_for_write(); + value_attribute = &opacities; } + curvePopulateTransDataStructs(tc, + curves, + value_attribute, + selected_indices, + use_proportional_edit, + use_connected_only, + layer_points_offset); + if (use_proportional_edit) { layer_points_offset += curves.point_num; } else { - layer_points_offset += selection_per_layer_per_object[i + layer_offset].size(); + layer_points_offset += selected_indices.size(); } layer_offset++; }); -- 2.30.2 From acefde0b0f25def7afdaaf4c7bd4404f45bae743 Mon Sep 17 00:00:00 2001 From: Casey Bianco-Davis Date: Sat, 30 Sep 2023 15:24:11 -0700 Subject: [PATCH 06/19] GPv3: Add forgotten menu items --- scripts/startup/bl_ui/space_toolsystem_toolbar.py | 15 +++++++++++++-- scripts/startup/bl_ui/space_view3d.py | 3 +++ 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/scripts/startup/bl_ui/space_toolsystem_toolbar.py b/scripts/startup/bl_ui/space_toolsystem_toolbar.py index 29128046a97..a5b244cdefc 100644 --- a/scripts/startup/bl_ui/space_toolsystem_toolbar.py +++ b/scripts/startup/bl_ui/space_toolsystem_toolbar.py @@ -366,6 +366,16 @@ class _defs_transform: draw_settings=draw_settings, ) + @ToolDef.from_fn + def bend(): + return dict( + idname="builtin.bend", + label="Bend", + icon="ops.gpencil.edit_bend", + widget=None, + keymap=(), + ) + @ToolDef.from_fn def transform(): def draw_settings(context, layout, tool): @@ -3039,9 +3049,10 @@ class VIEW3D_PT_tools_active(ToolSelectPanelHelper, Panel): *_tools_transform, None, _defs_edit_curve.curve_radius, + _defs_transform.bend, ( - _defs_gpencil_edit.shear, - _defs_gpencil_edit.tosphere, + _defs_transform.shear, + _defs_edit_mesh.tosphere, ), None, *_tools_annotate, diff --git a/scripts/startup/bl_ui/space_view3d.py b/scripts/startup/bl_ui/space_view3d.py index 416473b2b43..b76c2624a1a 100644 --- a/scripts/startup/bl_ui/space_view3d.py +++ b/scripts/startup/bl_ui/space_view3d.py @@ -5642,6 +5642,9 @@ class VIEW3D_MT_edit_greasepencil(Menu): def draw(self, _context): layout = self.layout layout.menu("VIEW3D_MT_transform") + layout.menu("VIEW3D_MT_mirror") + + layout.separator() layout.menu("VIEW3D_MT_edit_greasepencil_delete") -- 2.30.2 From bba3b74992181c3b94b0914903c6541d5faafe7e Mon Sep 17 00:00:00 2001 From: casey bianco-davis Date: Fri, 13 Oct 2023 17:19:43 -0700 Subject: [PATCH 07/19] Cleanup: rename function --- .../editors/transform/transform_convert.hh | 14 +++++----- .../transform/transform_convert_curves.cc | 28 +++++++++---------- .../transform_convert_grease_pencil.cc | 14 +++++----- 3 files changed, 28 insertions(+), 28 deletions(-) diff --git a/source/blender/editors/transform/transform_convert.hh b/source/blender/editors/transform/transform_convert.hh index 441a9fd402e..b0130c18cd9 100644 --- a/source/blender/editors/transform/transform_convert.hh +++ b/source/blender/editors/transform/transform_convert.hh @@ -115,13 +115,13 @@ void animrecord_check_state(TransInfo *t, ID *id); /** * Used for both curves and grease pencil objects. */ -void curvePopulateTransDataStructs(TransDataContainer &tc, - blender::bke::CurvesGeometry &curves, - blender::MutableSpan *value_attribute, - const blender::IndexMask &selected_indices, - const bool use_proportional_edit, - const bool use_connected_only, - const int data_offset); +void curve_populate_trans_data_structs(TransDataContainer &tc, + blender::bke::CurvesGeometry &curves, + blender::MutableSpan *value_attribute, + const blender::IndexMask &selected_indices, + const bool use_proportional_edit, + const bool use_connected_only, + const int data_offset); /* `transform_convert_action.cc` */ diff --git a/source/blender/editors/transform/transform_convert_curves.cc b/source/blender/editors/transform/transform_convert_curves.cc index 34d825dffe4..467ca842f4f 100644 --- a/source/blender/editors/transform/transform_convert_curves.cc +++ b/source/blender/editors/transform/transform_convert_curves.cc @@ -95,13 +95,13 @@ static void createTransCurvesVerts(bContext * /*C*/, TransInfo *t) Curves *curves_id = static_cast(tc.obedit->data); bke::CurvesGeometry &curves = curves_id->geometry.wrap(); - curvePopulateTransDataStructs(tc, - curves, - nullptr /* Currently no attributes. */, - selection_per_object[i], - use_proportional_edit, - use_connected_only, - 0 /* No data offset for curves. */); + curve_populate_trans_data_structs(tc, + curves, + nullptr /* Currently no attributes. */, + selection_per_object[i], + use_proportional_edit, + use_connected_only, + 0 /* No data offset for curves. */); } } @@ -120,13 +120,13 @@ static void recalcData_curves(TransInfo *t) } // namespace blender::ed::transform::curves -void curvePopulateTransDataStructs(TransDataContainer &tc, - blender::bke::CurvesGeometry &curves, - blender::MutableSpan *value_attribute, - const blender::IndexMask &selected_indices, - const bool use_proportional_edit, - const bool use_connected_only, - const int data_offset) +void curve_populate_trans_data_structs(TransDataContainer &tc, + blender::bke::CurvesGeometry &curves, + blender::MutableSpan *value_attribute, + const blender::IndexMask &selected_indices, + const bool use_proportional_edit, + const bool use_connected_only, + const int data_offset) { using namespace blender; diff --git a/source/blender/editors/transform/transform_convert_grease_pencil.cc b/source/blender/editors/transform/transform_convert_grease_pencil.cc index e4b4344a466..7cf8275a081 100644 --- a/source/blender/editors/transform/transform_convert_grease_pencil.cc +++ b/source/blender/editors/transform/transform_convert_grease_pencil.cc @@ -101,13 +101,13 @@ static void createTransGreasePencilVerts(bContext *C, TransInfo *t) value_attribute = &opacities; } - curvePopulateTransDataStructs(tc, - curves, - value_attribute, - selected_indices, - use_proportional_edit, - use_connected_only, - layer_points_offset); + curve_populate_trans_data_structs(tc, + curves, + value_attribute, + selected_indices, + use_proportional_edit, + use_connected_only, + layer_points_offset); if (use_proportional_edit) { layer_points_offset += curves.point_num; -- 2.30.2 From 30d012cc0b6ce7847a2d93687948512bc4a1d245 Mon Sep 17 00:00:00 2001 From: casey bianco-davis Date: Fri, 13 Oct 2023 17:26:20 -0700 Subject: [PATCH 08/19] Cleanup: remove const --- source/blender/editors/transform/transform_convert.hh | 6 +++--- .../blender/editors/transform/transform_convert_curves.cc | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/source/blender/editors/transform/transform_convert.hh b/source/blender/editors/transform/transform_convert.hh index b0130c18cd9..e7636dd85d9 100644 --- a/source/blender/editors/transform/transform_convert.hh +++ b/source/blender/editors/transform/transform_convert.hh @@ -119,9 +119,9 @@ void curve_populate_trans_data_structs(TransDataContainer &tc, blender::bke::CurvesGeometry &curves, blender::MutableSpan *value_attribute, const blender::IndexMask &selected_indices, - const bool use_proportional_edit, - const bool use_connected_only, - const int data_offset); + bool use_proportional_edit, + bool use_connected_only, + int data_offset); /* `transform_convert_action.cc` */ diff --git a/source/blender/editors/transform/transform_convert_curves.cc b/source/blender/editors/transform/transform_convert_curves.cc index 467ca842f4f..38293341b13 100644 --- a/source/blender/editors/transform/transform_convert_curves.cc +++ b/source/blender/editors/transform/transform_convert_curves.cc @@ -124,9 +124,9 @@ void curve_populate_trans_data_structs(TransDataContainer &tc, blender::bke::CurvesGeometry &curves, blender::MutableSpan *value_attribute, const blender::IndexMask &selected_indices, - const bool use_proportional_edit, - const bool use_connected_only, - const int data_offset) + bool use_proportional_edit, + bool use_connected_only, + int data_offset) { using namespace blender; -- 2.30.2 From 407cab7b858a32ad03ee8ac3464748ae3feee6bb Mon Sep 17 00:00:00 2001 From: casey bianco-davis Date: Fri, 13 Oct 2023 17:29:32 -0700 Subject: [PATCH 09/19] Cleanup: rename `data_offset` to `trans_data_offset` --- source/blender/editors/transform/transform_convert.hh | 2 +- .../editors/transform/transform_convert_curves.cc | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/source/blender/editors/transform/transform_convert.hh b/source/blender/editors/transform/transform_convert.hh index e7636dd85d9..be8675703b7 100644 --- a/source/blender/editors/transform/transform_convert.hh +++ b/source/blender/editors/transform/transform_convert.hh @@ -121,7 +121,7 @@ void curve_populate_trans_data_structs(TransDataContainer &tc, const blender::IndexMask &selected_indices, bool use_proportional_edit, bool use_connected_only, - int data_offset); + int trans_data_offset); /* `transform_convert_action.cc` */ diff --git a/source/blender/editors/transform/transform_convert_curves.cc b/source/blender/editors/transform/transform_convert_curves.cc index 38293341b13..5f05d1532e3 100644 --- a/source/blender/editors/transform/transform_convert_curves.cc +++ b/source/blender/editors/transform/transform_convert_curves.cc @@ -126,7 +126,7 @@ void curve_populate_trans_data_structs(TransDataContainer &tc, const blender::IndexMask &selected_indices, bool use_proportional_edit, bool use_connected_only, - int data_offset) + int trans_data_offset) { using namespace blender; @@ -146,7 +146,7 @@ void curve_populate_trans_data_structs(TransDataContainer &tc, const bool has_any_selected = ed::curves::has_anything_selected(selection, points); if (!has_any_selected && use_connected_only) { for (const int point_i : points) { - TransData &td = tc.data[point_i + data_offset]; + TransData &td = tc.data[point_i + trans_data_offset]; td.flag |= TD_SKIP; } continue; @@ -157,7 +157,7 @@ void curve_populate_trans_data_structs(TransDataContainer &tc, for (const int i : IndexRange(points.size())) { const int point_i = points[i]; - TransData &td = tc.data[point_i + data_offset]; + TransData &td = tc.data[point_i + trans_data_offset]; float3 *elem = &positions[point_i]; copy_v3_v3(td.iloc, *elem); @@ -186,7 +186,7 @@ void curve_populate_trans_data_structs(TransDataContainer &tc, blender::ed::transform::curves::calculate_curve_point_distances_for_proportional_editing( positions.slice(points), closest_distances.as_mutable_span()); for (const int i : IndexRange(points.size())) { - TransData &td = tc.data[points[i] + data_offset]; + TransData &td = tc.data[points[i] + trans_data_offset]; td.dist = closest_distances[i]; } } @@ -196,7 +196,7 @@ void curve_populate_trans_data_structs(TransDataContainer &tc, else { threading::parallel_for(selected_indices.index_range(), 1024, [&](const IndexRange range) { for (const int selection_i : range) { - TransData *td = &tc.data[selection_i + data_offset]; + TransData *td = &tc.data[selection_i + trans_data_offset]; const int point_i = selected_indices[selection_i]; float3 *elem = &positions[point_i]; -- 2.30.2 From eef5b7fe9134d01dcd9e4dc0c9c012555b8aff33 Mon Sep 17 00:00:00 2001 From: casey bianco-davis Date: Fri, 13 Oct 2023 17:31:35 -0700 Subject: [PATCH 10/19] Cleanup: improve comment --- .../editors/transform/transform_convert_curves.cc | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/source/blender/editors/transform/transform_convert_curves.cc b/source/blender/editors/transform/transform_convert_curves.cc index 5f05d1532e3..0055b058b36 100644 --- a/source/blender/editors/transform/transform_convert_curves.cc +++ b/source/blender/editors/transform/transform_convert_curves.cc @@ -95,13 +95,14 @@ static void createTransCurvesVerts(bContext * /*C*/, TransInfo *t) Curves *curves_id = static_cast(tc.obedit->data); bke::CurvesGeometry &curves = curves_id->geometry.wrap(); - curve_populate_trans_data_structs(tc, - curves, - nullptr /* Currently no attributes. */, - selection_per_object[i], - use_proportional_edit, - use_connected_only, - 0 /* No data offset for curves. */); + curve_populate_trans_data_structs( + tc, + curves, + nullptr /* Currently no transform for attributes other than position. */, + selection_per_object[i], + use_proportional_edit, + use_connected_only, + 0 /* No data offset for curves. */); } } -- 2.30.2 From 9de66cdbf9bb3174c17658265be9db78068f6bce Mon Sep 17 00:00:00 2001 From: casey bianco-davis Date: Fri, 13 Oct 2023 17:48:38 -0700 Subject: [PATCH 11/19] Cleanup: rename `drawing_index` to `layer_index` --- .../editors/transform/transform_convert_grease_pencil.cc | 6 +++--- source/blender/editors/transform/transform_gizmo_3d.cc | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/source/blender/editors/transform/transform_convert_grease_pencil.cc b/source/blender/editors/transform/transform_convert_grease_pencil.cc index 7cf8275a081..8af269e3672 100644 --- a/source/blender/editors/transform/transform_convert_grease_pencil.cc +++ b/source/blender/editors/transform/transform_convert_grease_pencil.cc @@ -47,7 +47,7 @@ static void createTransGreasePencilVerts(bContext *C, TransInfo *t) GreasePencil &grease_pencil = *static_cast(tc.obedit->data); grease_pencil.foreach_editable_drawing( - scene->r.cfra, [&](int /*drawing_index*/, blender::bke::greasepencil::Drawing &drawing) { + scene->r.cfra, [&](int /*layer_index*/, blender::bke::greasepencil::Drawing &drawing) { const bke::CurvesGeometry &curves = drawing.strokes(); if (use_proportional_edit) { @@ -85,7 +85,7 @@ static void createTransGreasePencilVerts(bContext *C, TransInfo *t) int layer_points_offset = 0; grease_pencil.foreach_editable_drawing( - scene->r.cfra, [&](int /*drawing_index*/, blender::bke::greasepencil::Drawing &drawing) { + scene->r.cfra, [&](int /*layer_index*/, blender::bke::greasepencil::Drawing &drawing) { bke::CurvesGeometry &curves = drawing.strokes_for_write(); const IndexMask selected_indices = selection_per_layer_per_object[i + layer_offset]; @@ -130,7 +130,7 @@ static void recalcData_grease_pencil(TransInfo *t) GreasePencil &grease_pencil = *static_cast(tc.obedit->data); grease_pencil.foreach_editable_drawing( - scene->r.cfra, [&](int /*drawing_index*/, blender::bke::greasepencil::Drawing &drawing) { + scene->r.cfra, [&](int /*layer_index*/, blender::bke::greasepencil::Drawing &drawing) { bke::CurvesGeometry &curves = drawing.strokes_for_write(); curves.calculate_bezier_auto_handles(); diff --git a/source/blender/editors/transform/transform_gizmo_3d.cc b/source/blender/editors/transform/transform_gizmo_3d.cc index 8eb0e561b03..4e98879d51f 100644 --- a/source/blender/editors/transform/transform_gizmo_3d.cc +++ b/source/blender/editors/transform/transform_gizmo_3d.cc @@ -819,12 +819,12 @@ static int gizmo_3d_foreach_selected(const bContext *C, } grease_pencil.foreach_editable_drawing( - scene->r.cfra, [&](int drawing_index, blender::bke::greasepencil::Drawing &drawing) { + scene->r.cfra, [&](int layer_index, blender::bke::greasepencil::Drawing &drawing) { const bke::CurvesGeometry &curves = drawing.strokes(); const bke::crazyspace::GeometryDeformation deformation = bke::crazyspace::get_evaluated_grease_pencil_drawing_deformation( - *depsgraph, *ob, drawing_index); + *depsgraph, *ob, layer_index); IndexMaskMemory memory; const IndexMask selected_points = ed::curves::retrieve_selected_points(curves, -- 2.30.2 From fb01fe761661b0c7df4885b986ff95fc091b6bb7 Mon Sep 17 00:00:00 2001 From: casey bianco-davis Date: Tue, 17 Oct 2023 13:43:53 -0700 Subject: [PATCH 12/19] Cleanup: rename `drawing_index` to `layer_index` --- source/blender/blenkernel/BKE_crazyspace.hh | 4 ++-- source/blender/blenkernel/intern/crazyspace.cc | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/source/blender/blenkernel/BKE_crazyspace.hh b/source/blender/blenkernel/BKE_crazyspace.hh index 7510b896685..f158af024eb 100644 --- a/source/blender/blenkernel/BKE_crazyspace.hh +++ b/source/blender/blenkernel/BKE_crazyspace.hh @@ -53,9 +53,9 @@ GeometryDeformation get_evaluated_curves_deformation(const Depsgraph &depsgraph, const Object &ob_orig); GeometryDeformation get_evaluated_grease_pencil_drawing_deformation(const Object *ob_eval, const Object &ob_orig, - int drawing_index); + int layer_index); GeometryDeformation get_evaluated_grease_pencil_drawing_deformation(const Depsgraph &depsgraph, const Object &ob_orig, - int drawing_index); + int layer_index); } // namespace blender::bke::crazyspace diff --git a/source/blender/blenkernel/intern/crazyspace.cc b/source/blender/blenkernel/intern/crazyspace.cc index 16de9376e20..f5212ed0af0 100644 --- a/source/blender/blenkernel/intern/crazyspace.cc +++ b/source/blender/blenkernel/intern/crazyspace.cc @@ -742,10 +742,10 @@ GeometryDeformation get_evaluated_grease_pencil_drawing_deformation(const Object GeometryDeformation get_evaluated_grease_pencil_drawing_deformation(const Depsgraph &depsgraph, const Object &ob_orig, - const int drawing_index) + const int layer_index) { const Object *ob_eval = DEG_get_evaluated_object(&depsgraph, const_cast(&ob_orig)); - return get_evaluated_grease_pencil_drawing_deformation(ob_eval, ob_orig, drawing_index); + return get_evaluated_grease_pencil_drawing_deformation(ob_eval, ob_orig, layer_index); } } // namespace blender::bke::crazyspace -- 2.30.2 From b0b3b75b34d1c097993a2994122aa85152d8b331 Mon Sep 17 00:00:00 2001 From: casey bianco-davis Date: Tue, 17 Oct 2023 14:21:43 -0700 Subject: [PATCH 13/19] Fix: bend warning --- .../presets/keyconfig/keymap_data/blender_default.py | 11 +++++++++++ scripts/startup/bl_ui/space_toolsystem_toolbar.py | 2 +- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/scripts/presets/keyconfig/keymap_data/blender_default.py b/scripts/presets/keyconfig/keymap_data/blender_default.py index af6e688d15e..2f60185dfa7 100644 --- a/scripts/presets/keyconfig/keymap_data/blender_default.py +++ b/scripts/presets/keyconfig/keymap_data/blender_default.py @@ -7273,6 +7273,16 @@ def km_3d_view_tool_shear(params): ]}, ) +def km_3d_view_tool_bend(params): + return ( + "3D View Tool: Bend", + {"space_type": 'VIEW_3D', "region_type": 'WINDOW'}, + {"items": [ + # No need for `tool_modifier` since this takes all input. + ("transform.bend", params.tool_maybe_tweak_event, + {"properties": [("release_confirm", True)]}), + ]}, + ) def km_3d_view_tool_measure(params): return ( @@ -8575,6 +8585,7 @@ def generate_keymaps(params=None): km_3d_view_tool_rotate(params), km_3d_view_tool_scale(params), km_3d_view_tool_shear(params), + km_3d_view_tool_bend(params), km_3d_view_tool_measure(params), km_3d_view_tool_interactive_add(params), km_3d_view_tool_pose_breakdowner(params), diff --git a/scripts/startup/bl_ui/space_toolsystem_toolbar.py b/scripts/startup/bl_ui/space_toolsystem_toolbar.py index 507eb27c676..1cbede60f72 100644 --- a/scripts/startup/bl_ui/space_toolsystem_toolbar.py +++ b/scripts/startup/bl_ui/space_toolsystem_toolbar.py @@ -373,7 +373,7 @@ class _defs_transform: label="Bend", icon="ops.gpencil.edit_bend", widget=None, - keymap=(), + keymap="3D View Tool: Bend", ) @ToolDef.from_fn -- 2.30.2 From dc8d9ab89ed2a9b3c855f211506bf938f65262f3 Mon Sep 17 00:00:00 2001 From: casey bianco-davis Date: Tue, 17 Oct 2023 15:29:01 -0700 Subject: [PATCH 14/19] Cleanup: use accessor --- .../editors/transform/transform_convert_grease_pencil.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/blender/editors/transform/transform_convert_grease_pencil.cc b/source/blender/editors/transform/transform_convert_grease_pencil.cc index 8af269e3672..180f55bc0e0 100644 --- a/source/blender/editors/transform/transform_convert_grease_pencil.cc +++ b/source/blender/editors/transform/transform_convert_grease_pencil.cc @@ -110,7 +110,7 @@ static void createTransGreasePencilVerts(bContext *C, TransInfo *t) layer_points_offset); if (use_proportional_edit) { - layer_points_offset += curves.point_num; + layer_points_offset += curves.points_num(); } else { layer_points_offset += selected_indices.size(); -- 2.30.2 From 918739c1cb738678f4ce652c8f28796c84461cf4 Mon Sep 17 00:00:00 2001 From: casey bianco-davis Date: Tue, 17 Oct 2023 15:34:10 -0700 Subject: [PATCH 15/19] Fix: add tag change for drawing --- .../blender/editors/transform/transform_convert_grease_pencil.cc | 1 + 1 file changed, 1 insertion(+) diff --git a/source/blender/editors/transform/transform_convert_grease_pencil.cc b/source/blender/editors/transform/transform_convert_grease_pencil.cc index 180f55bc0e0..b62588ea4b3 100644 --- a/source/blender/editors/transform/transform_convert_grease_pencil.cc +++ b/source/blender/editors/transform/transform_convert_grease_pencil.cc @@ -135,6 +135,7 @@ static void recalcData_grease_pencil(TransInfo *t) curves.calculate_bezier_auto_handles(); curves.tag_positions_changed(); + drawing.tag_positions_changed(); }); DEG_id_tag_update(&grease_pencil.id, ID_RECALC_GEOMETRY); -- 2.30.2 From ab7090aea351e2eea7008d60600e2d246ec9e634 Mon Sep 17 00:00:00 2001 From: casey bianco-davis Date: Tue, 17 Oct 2023 16:23:38 -0700 Subject: [PATCH 16/19] Cleanup: use `std::optional` instead of a pointer --- source/blender/editors/transform/transform_convert.hh | 2 +- .../editors/transform/transform_convert_curves.cc | 10 ++++++---- .../transform/transform_convert_grease_pencil.cc | 6 +++--- 3 files changed, 10 insertions(+), 8 deletions(-) diff --git a/source/blender/editors/transform/transform_convert.hh b/source/blender/editors/transform/transform_convert.hh index be8675703b7..c735ec53841 100644 --- a/source/blender/editors/transform/transform_convert.hh +++ b/source/blender/editors/transform/transform_convert.hh @@ -117,7 +117,7 @@ void animrecord_check_state(TransInfo *t, ID *id); */ void curve_populate_trans_data_structs(TransDataContainer &tc, blender::bke::CurvesGeometry &curves, - blender::MutableSpan *value_attribute, + std::optional> value_attribute, const blender::IndexMask &selected_indices, bool use_proportional_edit, bool use_connected_only, diff --git a/source/blender/editors/transform/transform_convert_curves.cc b/source/blender/editors/transform/transform_convert_curves.cc index 0055b058b36..54c117733cf 100644 --- a/source/blender/editors/transform/transform_convert_curves.cc +++ b/source/blender/editors/transform/transform_convert_curves.cc @@ -6,6 +6,8 @@ * \ingroup edtransform */ +#include + #include "BLI_array.hh" #include "BLI_inplace_priority_queue.hh" #include "BLI_math_matrix.h" @@ -98,7 +100,7 @@ static void createTransCurvesVerts(bContext * /*C*/, TransInfo *t) curve_populate_trans_data_structs( tc, curves, - nullptr /* Currently no transform for attributes other than position. */, + {} /* Currently no transform for attributes other than position. */, selection_per_object[i], use_proportional_edit, use_connected_only, @@ -123,7 +125,7 @@ static void recalcData_curves(TransInfo *t) void curve_populate_trans_data_structs(TransDataContainer &tc, blender::bke::CurvesGeometry &curves, - blender::MutableSpan *value_attribute, + std::optional> value_attribute, const blender::IndexMask &selected_indices, bool use_proportional_edit, bool use_connected_only, @@ -171,7 +173,7 @@ void curve_populate_trans_data_structs(TransDataContainer &tc, td.flag = TD_SELECTED; } - if (value_attribute != nullptr) { + if (value_attribute) { float *value = &((*value_attribute)[point_i]); td.val = value; td.ival = *value; @@ -205,7 +207,7 @@ void curve_populate_trans_data_structs(TransDataContainer &tc, copy_v3_v3(td->center, td->iloc); td->loc = *elem; - if (value_attribute != nullptr) { + if (value_attribute) { float *value = &((*value_attribute)[point_i]); td->val = value; td->ival = *value; diff --git a/source/blender/editors/transform/transform_convert_grease_pencil.cc b/source/blender/editors/transform/transform_convert_grease_pencil.cc index b62588ea4b3..54c7346a866 100644 --- a/source/blender/editors/transform/transform_convert_grease_pencil.cc +++ b/source/blender/editors/transform/transform_convert_grease_pencil.cc @@ -90,15 +90,15 @@ static void createTransGreasePencilVerts(bContext *C, TransInfo *t) const IndexMask selected_indices = selection_per_layer_per_object[i + layer_offset]; - MutableSpan *value_attribute = nullptr; + std::optional> value_attribute = {}; if (t->mode == TFM_CURVE_SHRINKFATTEN) { MutableSpan radii = drawing.radii_for_write(); - value_attribute = &radii; + value_attribute = radii; } else if (t->mode == TFM_GPENCIL_OPACITY) { MutableSpan opacities = drawing.opacities_for_write(); - value_attribute = &opacities; + value_attribute = opacities; } curve_populate_trans_data_structs(tc, -- 2.30.2 From eddc6712244e2618fbc7cac11bcb844926106868 Mon Sep 17 00:00:00 2001 From: casey bianco-davis Date: Wed, 18 Oct 2023 16:17:46 -0700 Subject: [PATCH 17/19] Cleanup: remove unneeded includes --- .../editors/transform/transform_convert_grease_pencil.cc | 9 --------- 1 file changed, 9 deletions(-) diff --git a/source/blender/editors/transform/transform_convert_grease_pencil.cc b/source/blender/editors/transform/transform_convert_grease_pencil.cc index 54c7346a866..fcbe3edd17d 100644 --- a/source/blender/editors/transform/transform_convert_grease_pencil.cc +++ b/source/blender/editors/transform/transform_convert_grease_pencil.cc @@ -6,22 +6,13 @@ * \ingroup edtransform */ -#include "BLI_array.hh" -#include "BLI_inplace_priority_queue.hh" #include "BLI_math_matrix.h" -#include "BLI_span.hh" #include "BKE_context.h" -#include "BKE_curves.hh" -#include "BKE_grease_pencil.hh" #include "ED_curves.hh" #include "ED_grease_pencil.hh" -#include "MEM_guardedalloc.h" - -#include "WM_api.hh" - #include "transform.hh" #include "transform_convert.hh" -- 2.30.2 From 2b5d21cd60c2a87a38ea718d82090d09432124f8 Mon Sep 17 00:00:00 2001 From: casey bianco-davis Date: Thu, 19 Oct 2023 16:53:07 -0700 Subject: [PATCH 18/19] Cleanup: Remove unneeded `blender::` --- .../editors/transform/transform_convert_grease_pencil.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/blender/editors/transform/transform_convert_grease_pencil.cc b/source/blender/editors/transform/transform_convert_grease_pencil.cc index fcbe3edd17d..a87a82f9bb0 100644 --- a/source/blender/editors/transform/transform_convert_grease_pencil.cc +++ b/source/blender/editors/transform/transform_convert_grease_pencil.cc @@ -81,7 +81,7 @@ static void createTransGreasePencilVerts(bContext *C, TransInfo *t) const IndexMask selected_indices = selection_per_layer_per_object[i + layer_offset]; - std::optional> value_attribute = {}; + std::optional> value_attribute = {}; if (t->mode == TFM_CURVE_SHRINKFATTEN) { MutableSpan radii = drawing.radii_for_write(); @@ -121,7 +121,7 @@ static void recalcData_grease_pencil(TransInfo *t) GreasePencil &grease_pencil = *static_cast(tc.obedit->data); grease_pencil.foreach_editable_drawing( - scene->r.cfra, [&](int /*layer_index*/, blender::bke::greasepencil::Drawing &drawing) { + scene->r.cfra, [&](int /*layer_index*/, bke::greasepencil::Drawing &drawing) { bke::CurvesGeometry &curves = drawing.strokes_for_write(); curves.calculate_bezier_auto_handles(); -- 2.30.2 From 094934425028e06d191da91452efb26997928ffa Mon Sep 17 00:00:00 2001 From: casey bianco-davis Date: Thu, 19 Oct 2023 16:55:44 -0700 Subject: [PATCH 19/19] Cleanup: remove unneeded constructor --- .../editors/transform/transform_convert_grease_pencil.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/blender/editors/transform/transform_convert_grease_pencil.cc b/source/blender/editors/transform/transform_convert_grease_pencil.cc index a87a82f9bb0..3d171110fbf 100644 --- a/source/blender/editors/transform/transform_convert_grease_pencil.cc +++ b/source/blender/editors/transform/transform_convert_grease_pencil.cc @@ -81,7 +81,7 @@ static void createTransGreasePencilVerts(bContext *C, TransInfo *t) const IndexMask selected_indices = selection_per_layer_per_object[i + layer_offset]; - std::optional> value_attribute = {}; + std::optional> value_attribute; if (t->mode == TFM_CURVE_SHRINKFATTEN) { MutableSpan radii = drawing.radii_for_write(); -- 2.30.2