Commit: afe11eff8a96656dc456d075270ce473b81ee8e3 Author: jon denning Date: Wed Jul 20 17:12:13 2022 -0400 Branches: retopo_transform https://developer.blender.org/rBafe11eff8a96656dc456d075270ce473b81ee8e3
tweaked snap options and snap option descriptions - retopo mode changes layout and options under snap menu - retopo mode auto sets defaults on options not shown in menu - reworked descriptions of snap options =================================================================== M release/scripts/startup/bl_ui/space_view3d.py M source/blender/editors/transform/transform_snap.c M source/blender/editors/transform/transform_snap_object.cc M source/blender/makesrna/intern/rna_scene.c =================================================================== diff --git a/release/scripts/startup/bl_ui/space_view3d.py b/release/scripts/startup/bl_ui/space_view3d.py index f352c8fbec7..ab2ad3c3502 100644 --- a/release/scripts/startup/bl_ui/space_view3d.py +++ b/release/scripts/startup/bl_ui/space_view3d.py @@ -632,6 +632,14 @@ class VIEW3D_HT_header(Header): row = layout.row(align=True) row.prop(tool_settings, "use_snap", text="") + if object_mode == 'EDIT' and obj.type == 'MESH': + row.prop( + tool_settings, + "use_snap_retopology_mode", + text="", + icon='MOD_MESHDEFORM', + ) + sub = row.row(align=True) sub.popover( panel="VIEW3D_PT_snapping", @@ -6810,45 +6818,65 @@ class VIEW3D_PT_snapping(Panel): obj = context.active_object object_mode = obj.mode if obj else 'OBJECT' show_target_options = object_mode == 'EDIT' and obj.type not in {'LATTICE', 'META', 'FONT'} + multiple_objects = len(context.objects_in_mode) > 1 + retopo_mode = object_mode == 'EDIT' and tool_settings.use_snap_retopology_mode layout = self.layout col = layout.column() - if snap_elements != {'INCREMENT'} and show_target_options: + if show_target_options: col.prop( tool_settings, "use_snap_retopology_mode", - text="Use Retopology Mode", + text="Retopology Mode", # icon='MOD_MESHDEFORM', ) - col.label(text="Snap To") - col.prop(tool_settings, "snap_elements", expand=True) + if not retopo_mode: + col_snapto = col.column(align=True, heading="Snap To") + col_snapto.prop(tool_settings, "snap_elements", expand=True) + else: + col_snapto_edited = col.column(align=True, heading="Snap To Edited") + col_snapto_edited.prop_enum(tool_settings, "snap_elements", 'VERTEX') + col_snapto_edited.prop_enum(tool_settings, "snap_elements", 'EDGE') + col_snapto_edited.prop_enum(tool_settings, "snap_elements", 'EDGE_MIDPOINT') + col_snapto_edited.prop_enum(tool_settings, "snap_elements", 'EDGE_PERPENDICULAR') - if 'INCREMENT' in snap_elements: - col.prop(tool_settings, "use_snap_grid_absolute") + col_snapto_nonedited = col.column(align=True, heading="Snap To Non-Edited") + col_snapto_nonedited.prop_enum(tool_settings, "snap_elements", 'FACE') + col_snapto_nonedited.prop_enum(tool_settings, "snap_elements", 'FACE_NEAREST') if snap_elements - {'INCREMENT', 'FACE_NEAREST'}: - col.label(text="Snap With") - row = col.row(align=True) - row.prop(tool_settings, "snap_target", expand=True) + col_snapwith = col.column(align=True) + col_snapwith.label(text='Snap With') + col_snapwith.row().prop(tool_settings, "snap_target", expand=True) if snap_elements != {'INCREMENT'}: - col.label(text="Target Selection") - col_targetsel = col.column(align=True) - if show_target_options: - col_targetsel.prop( - tool_settings, - "use_snap_self", - text="Include Active", - icon='EDITMODE_HLT', - ) - col_targetsel.prop( - tool_settings, - "use_snap_edit", - text="Include Edited", - icon='OUTLINER_DATA_MESH', - ) + col_targetsel = col.column(align=True, heading="Target Selection") + if not retopo_mode and show_target_options: + if not multiple_objects: + col_targetsel.prop( + tool_settings, + 'use_snap_self', + text="Include Edited", + # description='Snap onto edited objects (Edit Mode Only)', + icon='EDITMODE_HLT', + ) + else: + col_targetsel.prop( + tool_settings, + "use_snap_self", + text="Include Active Edited", + # description='Snap onto active edited object (Edit Mode Only)', + icon='EDITMODE_HLT', + ) + col_targetsel.prop( + tool_settings, + "use_snap_edit", + text="Include Other Edited", + # description='Snap onto non-active edited object(s) (Edit Mode Only)', + icon='OUTLINER_DATA_MESH', + ) col_targetsel.prop( tool_settings, "use_snap_nonedit", @@ -6862,26 +6890,29 @@ class VIEW3D_PT_snapping(Panel): icon='RESTRICT_SELECT_OFF', ) - col.label(text="Options") + col_options = col.column(heading="Options") + if 'INCREMENT' in snap_elements: + col_options.prop(tool_settings, "use_snap_grid_absolute") + if snap_elements != {'INCREMENT'}: # TODO(@gfxcoder): Does WEIGHT_PAINT have any snapping? if object_mode in {'OBJECT', 'POSE', 'EDIT', 'WEIGHT_PAINT'}: - col.prop(tool_settings, "use_snap_align_rotation") + col_options.prop(tool_settings, "use_snap_align_rotation") if snap_elements != {'FACE_NEAREST'}: - col.prop(tool_settings, "use_snap_backface_culling") - if 'FACE' in snap_elements: - col.prop(tool_settings, "use_snap_project") + col_options.prop(tool_settings, "use_snap_backface_culling") + if 'FACE' in snap_elements and not retopo_mode: + col_options.prop(tool_settings, "use_snap_project") if 'FACE_NEAREST' in snap_elements: - col.prop(tool_settings, 'use_snap_to_same_target') + col_options.prop(tool_settings, 'use_snap_to_same_target') if object_mode == 'EDIT': - col.prop(tool_settings, 'snap_face_nearest_steps') + col_options.prop(tool_settings, 'snap_face_nearest_steps') if 'VOLUME' in snap_elements: - col.prop(tool_settings, "use_snap_peel_object") + col_options.prop(tool_settings, "use_snap_peel_object") - col.label(text="Affect") - row = col.row(align=True) - row.prop(tool_settings, "use_snap_translate", text="Move", toggle=True) - row.prop(tool_settings, "use_snap_rotate", text="Rotate", toggle=True) - row.prop(tool_settings, "use_snap_scale", text="Scale", toggle=True) + if not retopo_mode: + row = col.row(align=True, heading="Affect") + row.prop(tool_settings, "use_snap_translate", text="Move", toggle=True) + row.prop(tool_settings, "use_snap_rotate", text="Rotate", toggle=True) + row.prop(tool_settings, "use_snap_scale", text="Scale", toggle=True) class VIEW3D_PT_proportional_edit(Panel): diff --git a/source/blender/editors/transform/transform_snap.c b/source/blender/editors/transform/transform_snap.c index 35a344ba9e6..348c65054a2 100644 --- a/source/blender/editors/transform/transform_snap.c +++ b/source/blender/editors/transform/transform_snap.c @@ -168,9 +168,22 @@ bool activeSnap_SnappingAsGroup(const TransInfo *t) return true; } +static bool useSnapRetopoMode(const TransInfo *t) +{ + if (t->spacetype != SPACE_VIEW3D || t->obedit_type != OB_MESH) { + /* Not the correct context for retopology mode. */ + return false; + } + return t->settings->snap_flag & SCE_SNAP_RETOPOLOGY_MODE; +} + bool transformModeUseSnap(const TransInfo *t) { ToolSettings *ts = t->settings; + if (useSnapRetopoMode(t)) { + /* Always use snap when retopology mode is enabled. */ + return true; + } if (t->mode == TFM_TRANSLATION) { return (ts->snap_transform_mode_flag & SCE_SNAP_TRANSFORM_MODE_TRANSLATE) != 0; } @@ -845,6 +858,19 @@ static void initSnappingMode(TransInfo *t) } } +static void initSnappingRetopoMode(TransInfo *t) +{ + if (!useSnapRetopoMode(t)) { + /* Not using retopology mode. */ + return; + } + + /* Enable all possible targets. The targets will be filtered based on snap method. */ + t->tsnap.target_select &= ~(SCE_SNAP_TARGET_NOT_ACTIVE | SCE_SNAP_TARGET_NOT_EDITED | + SCE_SNAP_TARGET_NOT_NONEDITED); + t->tsnap.project = true; +} + void initSnapping(TransInfo *t, wmOperator *op) { ToolSettings *ts = t->settings; @@ -962,6 +988,7 @@ void initSnapping(TransInfo *t, wmOperator *op) t->tsnap.source_select = snap_source; initSnappingMode(t); + initSnappingRetopoMode(t); } void freeSnapping(TransInfo *t) diff --git a/source/blender/editors/transform/transform_snap_object.cc b/source/blender/editors/transform/transform_snap_object.cc index f195a13fb6c..e329048aad6 100644 --- a/source/blender/editors/transform/transform_snap_object.cc +++ b/source/blender/editors/transform/transform_snap_object.cc @@ -1267,7 +1267,7 @@ static bool nearest_world_tree(SnapObjectContext *UNUSED(sctx), /* compute offset between init co and prev co in local space */ float init_co_local[3], curr_co_local[3]; - float delta_local[3]; + float delta_local[3], delta_step[3]; mul_v3_m4v3(init_co_local, imat, init_co); mul_v3_m4v3(curr_co_local, imat, curr_co); sub_v3_v3v3(delta_local, curr_co_local, init_co_local); @@ -1290,8 +1290,9 @@ static bool nearest_world_tree(SnapObjectContext *UNUSED(sctx), *r_dist_sq = dist_sq; /* scale to make `snap_face_nearest_steps` steps */ - float step_scale_factor = 1.0f / max_ff(1.0f, (float)params->face_nearest_steps); - mul_v3_fl(delta_local, step_scale_factor); + int steps = max_ii(1, params->face_nearest_steps); + float factor = 1.0f / (float)steps; + mul_v3_v3fl(delta_step, delta_local @@ Diff output truncated at 10240 characters. @@ _______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org List details, subscription details or unsubscribe: https://lists.blender.org/mailman/listinfo/bf-blender-cvs