[Bf-blender-cvs] [cd75125c488] soc-2021-uv-editor-improvements: UV: Keymaps for offsetting selected UVs
Siddhartha Jejurkar
noreply at git.blender.org
Sat Jul 17 18:00:10 CEST 2021
Commit: cd75125c48859fc2dfb9891ce14d3a5ff9aeda7f
Author: Siddhartha Jejurkar
Date: Sat Jul 17 21:26:51 2021 +0530
Branches: soc-2021-uv-editor-improvements
https://developer.blender.org/rBcd75125c48859fc2dfb9891ce14d3a5ff9aeda7f
UV: Keymaps for offsetting selected UVs
Adds keymaps to offset selected UVs by a fixed distance in a specified direction.
Refer T78405
===================================================================
M release/scripts/presets/keyconfig/keymap_data/blender_default.py
M source/blender/editors/uvedit/uvedit_ops.c
===================================================================
diff --git a/release/scripts/presets/keyconfig/keymap_data/blender_default.py b/release/scripts/presets/keyconfig/keymap_data/blender_default.py
index 4319e3a962b..0e76f0c7e18 100644
--- a/release/scripts/presets/keyconfig/keymap_data/blender_default.py
+++ b/release/scripts/presets/keyconfig/keymap_data/blender_default.py
@@ -941,6 +941,22 @@ def km_uv_editor(params):
("transform.translate", {"type": params.select_tweak, "value": 'ANY'}, None),
("transform.rotate", {"type": 'R', "value": 'PRESS'}, None),
("transform.resize", {"type": 'S', "value": 'PRESS'}, None),
+ ("uv.offset", {"type": 'UP_ARROW', "value": 'PRESS', "ctrl": True},
+ {"properties": [("offset_direction", 'UDIM_UP')]}),
+ ("uv.offset", {"type": 'DOWN_ARROW', "value": 'PRESS', "ctrl": True},
+ {"properties": [("offset_direction", 'UDIM_DOWN')]}),
+ ("uv.offset", {"type": 'LEFT_ARROW', "value": 'PRESS', "ctrl": True},
+ {"properties": [("offset_direction", 'UDIM_LEFT')]}),
+ ("uv.offset", {"type": 'RIGHT_ARROW', "value": 'PRESS', "ctrl": True},
+ {"properties": [("offset_direction", 'UDIM_RIGHT')]}),
+ ("uv.offset", {"type": 'UP_ARROW', "value": 'PRESS', "alt": True},
+ {"properties": [("offset_direction", 'DYNAMIC_GRID_UP')]}),
+ ("uv.offset", {"type": 'DOWN_ARROW', "value": 'PRESS', "alt": True},
+ {"properties": [("offset_direction", 'DYNAMIC_GRID_DOWN')]}),
+ ("uv.offset", {"type": 'LEFT_ARROW', "value": 'PRESS', "alt": True},
+ {"properties": [("offset_direction", 'DYNAMIC_GRID_LEFT')]}),
+ ("uv.offset", {"type": 'RIGHT_ARROW', "value": 'PRESS', "alt": True},
+ {"properties": [("offset_direction", 'DYNAMIC_GRID_RIGHT')]}),
("transform.shear", {"type": 'S', "value": 'PRESS', "shift": True, "ctrl": True, "alt": True}, None),
("transform.mirror", {"type": 'M', "value": 'PRESS', "ctrl": True}, None),
("wm.context_toggle", {"type": 'TAB', "value": 'PRESS', "shift": True},
diff --git a/source/blender/editors/uvedit/uvedit_ops.c b/source/blender/editors/uvedit/uvedit_ops.c
index ee1980e5908..6f308d32d86 100644
--- a/source/blender/editors/uvedit/uvedit_ops.c
+++ b/source/blender/editors/uvedit/uvedit_ops.c
@@ -1338,6 +1338,176 @@ static void UV_OT_snap_selected(wmOperatorType *ot)
/** \} */
+/* -------------------------------------------------------------------- */
+/** \name UV offset Operator
+ * \{ */
+
+/* Pixel offset (defined in T78405) is currently not implemented in the operator */
+enum {
+ UDIM_OFFSET_UP = 0,
+ UDIM_OFFSET_DOWN,
+ UDIM_OFFSET_LEFT,
+ UDIM_OFFSET_RIGHT,
+ DYNAMIC_GRID_OFFSET_UP,
+ DYNAMIC_GRID_OFFSET_DOWN,
+ DYNAMIC_GRID_OFFSET_LEFT,
+ DYNAMIC_GRID_OFFSET_RIGHT,
+};
+
+static int uv_offset_exec(bContext *C, wmOperator *op)
+{
+ Scene *scene = CTX_data_scene(C);
+ ViewLayer *view_layer = CTX_data_view_layer(C);
+ const SpaceImage *sima = CTX_wm_space_image(C);
+ const ToolSettings *ts = scene->toolsettings;
+ // const bool synced_selection = (ts->uv_flag & UV_SYNC_SELECTION) != 0;
+ int dynamic_grid_size = (sima->flag & SI_DYNAMIC_GRID) ? sima->dynamic_grid_size : 0;
+
+ const int offset_direction = RNA_enum_get(op->ptr, "offset_direction");
+ float uv_offset[2] = {0.0f, 0.0f};
+
+ /* Assign offset based on the keymap input */
+ switch (offset_direction) {
+ case UDIM_OFFSET_UP: {
+ uv_offset[1] = 1.0f;
+ break;
+ }
+ case UDIM_OFFSET_DOWN: {
+ uv_offset[1] = -1.0f;
+ break;
+ }
+ case UDIM_OFFSET_LEFT: {
+ uv_offset[0] = -1.0f;
+ break;
+ }
+ case UDIM_OFFSET_RIGHT: {
+ uv_offset[0] = 1.0f;
+ break;
+ }
+ case DYNAMIC_GRID_OFFSET_UP: {
+ if (dynamic_grid_size) {
+ uv_offset[1] = 1.0f / ((float)dynamic_grid_size);
+ }
+ else { /* Dynamic Grid not in use */
+ return OPERATOR_CANCELLED;
+ }
+ break;
+ }
+ case DYNAMIC_GRID_OFFSET_DOWN: {
+ if (dynamic_grid_size) {
+ uv_offset[1] = (-1.0f) / ((float)dynamic_grid_size);
+ }
+ else { /* Dynamic Grid not in use */
+ return OPERATOR_CANCELLED;
+ }
+ break;
+ }
+ case DYNAMIC_GRID_OFFSET_RIGHT: {
+ if (dynamic_grid_size) {
+ uv_offset[0] = 1.0f / ((float)dynamic_grid_size);
+ }
+ else { /* Dynamic Grid not in use */
+ return OPERATOR_CANCELLED;
+ }
+ break;
+ }
+ case DYNAMIC_GRID_OFFSET_LEFT: {
+ if (dynamic_grid_size) {
+ uv_offset[0] = (-1.0f) / ((float)dynamic_grid_size);
+ }
+ else { /* Dynamic Grid not in use */
+ return OPERATOR_CANCELLED;
+ }
+ break;
+ }
+ default: {
+ /* No valid use case */
+ return OPERATOR_CANCELLED;
+ }
+ }
+
+ BMFace *efa;
+ BMLoop *l;
+ BMIter iter, liter;
+ MLoopUV *luv;
+
+ uint objects_len = 0;
+ Object **objects = BKE_view_layer_array_from_objects_in_edit_mode_unique_data_with_uvs(
+ view_layer, ((View3D *)NULL), &objects_len);
+
+ for (uint ob_index = 0; ob_index < objects_len; ob_index++) {
+ Object *obedit = objects[ob_index];
+ BMEditMesh *em = BKE_editmesh_from_object(obedit);
+ const int cd_loop_uv_offset = CustomData_get_offset(&em->bm->ldata, CD_MLOOPUV);
+
+ if ((ts->uv_flag & UV_SYNC_SELECTION) && (em->bm->totvertsel == 0)) {
+ continue;
+ }
+
+ BM_ITER_MESH (efa, &iter, em->bm, BM_FACES_OF_MESH) {
+ if (!uvedit_face_visible_test(scene, efa)) {
+ continue;
+ }
+
+ BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) {
+ luv = BM_ELEM_CD_GET_VOID_P(l, cd_loop_uv_offset);
+ if (luv->flag & MLOOPUV_VERTSEL) {
+ add_v2_v2(luv->uv, uv_offset);
+ }
+ /* FAILS in some cases with UV sync selection. Find out why??? */
+ }
+ }
+ /* if uv_offset is not zero, then UV elements were updated */
+ if (!is_zero_v2(uv_offset)) {
+ DEG_id_tag_update(obedit->data, ID_RECALC_GEOMETRY);
+ WM_main_add_notifier(NC_GEOM | ND_DATA, obedit->data);
+ }
+ }
+ MEM_freeN(objects);
+
+ return OPERATOR_FINISHED;
+}
+
+/* Refer Task description given in T78405 */
+static void UV_OT_offset(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name = "Offset UVs";
+ ot->idname = "UV_OT_offset";
+ ot->description = "Offset selected UVs by a fixed distance in a specified direction";
+
+ /* api callbacks */
+ ot->exec = uv_offset_exec;
+ ot->poll = ED_operator_uvedit_space_image;
+
+ /* flags */
+ ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
+
+ /* RNA properties */
+ static const EnumPropertyItem offset_direction[] = {
+ {UDIM_OFFSET_UP, "UDIM_UP", 0, "Udim Up", ""},
+ {UDIM_OFFSET_DOWN, "UDIM_DOWN", 0, "Udim Down", ""},
+ {UDIM_OFFSET_LEFT, "UDIM_LEFT", 0, "Udim Left", ""},
+ {UDIM_OFFSET_RIGHT, "UDIM_RIGHT", 0, "Udim Right", ""},
+ {DYNAMIC_GRID_OFFSET_UP, "DYNAMIC_GRID_UP", 0, "Dynamic grid Up", ""},
+ {DYNAMIC_GRID_OFFSET_DOWN, "DYNAMIC_GRID_DOWN", 0, "Dynamic grid Down", ""},
+ {DYNAMIC_GRID_OFFSET_LEFT, "DYNAMIC_GRID_LEFT", 0, "Dynamic grid Left", ""},
+ {DYNAMIC_GRID_OFFSET_RIGHT, "DYNAMIC_GRID_RIGHT", 0, "Dynamic grid Right", ""},
+ {0, NULL, 0, NULL, NULL},
+ };
+
+ PropertyRNA *prop;
+ prop = RNA_def_enum(ot->srna,
+ "offset_direction",
+ offset_direction,
+ 0,
+ "UV Offset Direction",
+ "Offset and direction for moving selected UVs");
+ RNA_def_property_flag(prop, PROP_SKIP_SAVE | PROP_HIDDEN);
+}
+
+/** \} */
+
/* -------------------------------------------------------------------- */
/** \name Pin UV's Operator
* \{ */
@@ -2056,6 +2226,7 @@ void ED_operatortypes_uvedit(void)
WM_operatortype_append(UV_OT_weld);
WM_operatortype_append(UV_OT_remove_doubles);
WM_operatortype_append(UV_OT_pin);
+ WM_operatortype_append(UV_OT_offset);
WM_operatortype_append(UV_OT_average_islands_scale);
WM_operatortype_append(UV_OT_cube_project);
More information about the Bf-blender-cvs
mailing list