[Bf-blender-cvs] [a863ba191d8] retopo_transform: Merge branch 'master' into D14591-transform_snap_nearest_old

jon denning noreply at git.blender.org
Sat Jul 16 13:00:36 CEST 2022


Commit: a863ba191d862cc8ad7e98e20df3433eb856ec25
Author: jon denning
Date:   Mon Jun 6 17:11:32 2022 -0400
Branches: retopo_transform
https://developer.blender.org/rBa863ba191d862cc8ad7e98e20df3433eb856ec25

Merge branch 'master' into D14591-transform_snap_nearest_old

===================================================================



===================================================================

diff --cc source/blender/editors/include/ED_transform_snap_object_context.h
index 71d7930222e,20353c21f93..f9de6604a68
--- a/source/blender/editors/include/ED_transform_snap_object_context.h
+++ b/source/blender/editors/include/ED_transform_snap_object_context.h
@@@ -26,15 -26,7 +26,6 @@@ struct View3D
  /* transform_snap_object.cc */
  
  /* ED_transform_snap_object_*** API */
- typedef enum eSnapTargetSelect {
-   SCE_SNAP_TARGET_ALL = 0,
-   SCE_SNAP_TARGET_NOT_SELECTED = (1 << 0),
-   SCE_SNAP_TARGET_NOT_ACTIVE = (1 << 1),
-   SCE_SNAP_TARGET_NOT_EDITED = (1 << 2),
-   SCE_SNAP_TARGET_ONLY_SELECTABLE = (1 << 3),
-   SCE_SNAP_TARGET_NOT_NONEDITED = (1 << 4),
- } eSnapTargetSelect;
--
  typedef enum eSnapEditType {
    SNAP_GEOM_FINAL = 0,
    SNAP_GEOM_CAGE = 1,
diff --cc source/blender/editors/transform/transform.h
index d46918e516b,e5ce1842a8e..b42a8d4913b
--- a/source/blender/editors/transform/transform.h
+++ b/source/blender/editors/transform/transform.h
@@@ -301,14 -301,14 +301,14 @@@ typedef struct TransSnap 
    /* Method(s) used for snapping source to target */
    eSnapMode mode;
    /* Part of source to snap to target */
-   eSnapTarget target;
-   /* Determines which objects are possible target, #eSnapTargetSelect */
-   char target_select;
+   eSnapSourceSelect source_select;
+   /* Determines which objects are possible target */
+   eSnapTargetSelect target_select;
    bool align;
    bool project;
 -  bool snap_self;
    bool peel;
    bool use_backface_culling;
 +  short face_nearest_steps;
    eTSnap status;
    /* Snapped Element Type (currently for objects only). */
    eSnapMode snapElem;
diff --cc source/blender/editors/transform/transform_ops.c
index a56341d227f,cd8a2f17554..1098e8cb90c
--- a/source/blender/editors/transform/transform_ops.c
+++ b/source/blender/editors/transform/transform_ops.c
@@@ -655,15 -645,15 +655,20 @@@ void Transform_Properties(struct wmOper
  
    if (flags & P_SNAP) {
      prop = RNA_def_boolean(ot->srna, "snap", 0, "Use Snapping Options", "");
 -    RNA_def_property_flag(prop, PROP_HIDDEN);
 +
 +    prop = RNA_def_enum(
 +        ot->srna, "snap_elements", rna_enum_snap_element_items, 0, "Snap to Elements", "");
 +    RNA_def_property_flag(prop, PROP_ENUM_FLAG);
 +
 +    RNA_def_boolean(ot->srna, "use_snap_project", false, "Project Individual Elements", "");
  
      if (flags & P_GEO_SNAP) {
-       RNA_def_enum(ot->srna, "snap_target", rna_enum_snap_target_items, 0, "Target", "");
+       /* TODO(@gfxcoder): Rename `snap_target` to `snap_source` to avoid
+        * previous ambiguity of "target" (now, "source" is geometry to be moved and "target" is
+        * geometry to which moved geometry is snapped).  Use "Source snap point" and "Point on
+        * source that will snap to target" for name and description, respectively. */
+       prop = RNA_def_enum(ot->srna, "snap_target", rna_enum_snap_source_items, 0, "Target", "");
 -      RNA_def_property_flag(prop, PROP_HIDDEN);
++      // RNA_def_property_flag(prop, PROP_HIDDEN);
        prop = RNA_def_float_vector(
            ot->srna, "snap_point", 3, NULL, -FLT_MAX, FLT_MAX, "Point", "", -FLT_MAX, FLT_MAX);
        RNA_def_property_flag(prop, PROP_HIDDEN);
diff --cc source/blender/editors/transform/transform_snap.c
index 98ced64ded8,400c351a5d5..3649e69281d
--- a/source/blender/editors/transform/transform_snap.c
+++ b/source/blender/editors/transform/transform_snap.c
@@@ -413,132 -349,87 +413,132 @@@ static void applyFaceProject(TransInfo 
      return;
    }
  
 +#if 0
 +  if (tc->use_local_mat) {
 +    mul_m4_v3(tc->imat, loc);
 +  }
 +#endif
 +
    float tvec[3];
 -  int i;
 +  sub_v3_v3v3(tvec, loc, iloc);
  
 -  /* XXX FLICKER IN OBJECT MODE */
 -  FOREACH_TRANS_DATA_CONTAINER (t, tc) {
 -    TransData *td = tc->data;
 -    for (i = 0; i < tc->data_len; i++, td++) {
 -      float iloc[3], loc[3], no[3];
 -      float mval_fl[2];
 -      if (td->flag & TD_SKIP) {
 -        continue;
 -      }
 +  mul_m3_v3(td->smtx, tvec);
  
 -      if ((t->flag & T_PROP_EDIT) && (td->factor == 0.0f)) {
 -        continue;
 -      }
 +  add_v3_v3(td->loc, tvec);
  
 -      copy_v3_v3(iloc, td->loc);
 -      if (tc->use_local_mat) {
 -        mul_m4_v3(tc->mat, iloc);
 -      }
 -      else if (t->options & CTX_OBJECT) {
 -        BKE_object_eval_transform_all(t->depsgraph, t->scene, td->ob);
 -        copy_v3_v3(iloc, td->ob->obmat[3]);
 -      }
 +  if (t->tsnap.align && (t->options & CTX_OBJECT)) {
 +    /* handle alignment as well */
 +    const float *original_normal;
 +    float mat[3][3];
  
 -      if (ED_view3d_project_float_global(t->region, iloc, mval_fl, V3D_PROJ_TEST_NOP) ==
 -          V3D_PROJ_RET_OK) {
 -        eSnapMode hit = ED_transform_snap_object_project_view3d(
 -            t->tsnap.object_context,
 -            t->depsgraph,
 -            t->region,
 -            t->view,
 -            SCE_SNAP_MODE_FACE,
 -            &(const struct SnapObjectParams){
 -                .snap_target_select = t->tsnap.target_select,
 -                .edit_mode_type = (t->flag & T_EDIT) != 0 ? SNAP_GEOM_EDIT : SNAP_GEOM_FINAL,
 -                .use_occlusion_test = false,
 -                .use_backface_culling = t->tsnap.use_backface_culling,
 -            },
 -            mval_fl,
 -            NULL,
 -            0,
 -            loc,
 -            no);
 -        if (hit != SCE_SNAP_MODE_FACE) {
 -          return;
 -        }
 +    /* In pose mode, we want to align normals with Y axis of bones... */
 +    original_normal = td->axismtx[2];
 +
 +    rotation_between_vecs_to_mat3(mat, original_normal, no);
 +
 +    transform_data_ext_rotate(td, mat, true);
 +
 +    /* TODO: support constraints for rotation too? see #ElementRotation. */
 +  }
 +}
 +
 +static void applyFaceNearest(TransInfo *t, TransDataContainer *tc, TransData *td)
 +{
 +  if (!(t->tsnap.mode & SCE_SNAP_MODE_FACE_NEAREST)) {
 +    return;
 +  }
 +
 +  float init_loc[3];
 +  float prev_loc[3];
 +  float snap_loc[3], snap_no[3];
 +
 +  copy_v3_v3(init_loc, td->iloc);
 +  copy_v3_v3(prev_loc, td->loc);
 +  if (tc->use_local_mat) {
 +    mul_m4_v3(tc->mat, init_loc);
 +    mul_m4_v3(tc->mat, prev_loc);
 +  }
 +  else if (t->options & CTX_OBJECT) {
 +    BKE_object_eval_transform_all(t->depsgraph, t->scene, td->ob);
 +    copy_v3_v3(init_loc, td->ob->obmat[3]);
 +  }
 +
 +  eSnapMode hit = ED_transform_snap_object_project_view3d(
 +      t->tsnap.object_context,
 +      t->depsgraph,
 +      t->region,
 +      t->view,
 +      SCE_SNAP_MODE_FACE_NEAREST,
 +      &(const struct SnapObjectParams){
 +          .snap_target_select = t->tsnap.target_select,
 +          .edit_mode_type = (t->flag & T_EDIT) != 0 ? SNAP_GEOM_EDIT : SNAP_GEOM_FINAL,
 +          .use_occlusion_test = false,
 +          .use_backface_culling = false,
 +          .face_nearest_steps = t->tsnap.face_nearest_steps,
 +          .keep_on_same_target = t->tsnap.flag & SCE_SNAP_KEEP_ON_SAME_OBJECT,
 +      },
 +      init_loc,
 +      NULL,
 +      prev_loc,
 +      0,
 +      snap_loc,
 +      snap_no);
 +
 +  if (hit != SCE_SNAP_MODE_FACE_NEAREST) {
 +    return;
 +  }
  
  #if 0
 -          if (tc->use_local_mat) {
 -            mul_m4_v3(tc->imat, loc);
 -          }
 +  if (tc->use_local_mat) {
 +    mul_m4_v3(tc->imat, loc);
 +  }
  #endif
  
 -        sub_v3_v3v3(tvec, loc, iloc);
 +  float tvec[3];
 +  sub_v3_v3v3(tvec, snap_loc, prev_loc);
 +  mul_m3_v3(td->smtx, tvec);
 +  add_v3_v3(td->loc, tvec);
 +
 +  if (t->tsnap.align && (t->options & CTX_OBJECT)) {
 +    /* handle alignment as well */
 +    const float *init_no;
 +    float mat[3][3];
  
 -        mul_m3_v3(td->smtx, tvec);
 +    /* In pose mode, we want to align normals with Y axis of bones... */
 +    init_no = td->axismtx[2];
  
 -        add_v3_v3(td->loc, tvec);
 +    rotation_between_vecs_to_mat3(mat, init_no, snap_no);
  
 -        if (t->tsnap.align && (t->options & CTX_OBJECT)) {
 -          /* handle alignment as well */
 -          const float *original_normal;
 -          float mat[3][3];
 +    transform_data_ext_rotate(td, mat, true);
  
 -          /* In pose mode, we want to align normals with Y axis of bones... */
 -          original_normal = td->axismtx[2];
 +    /* TODO: support constraints for rotation too? see #ElementRotation. */
 +  }
 +}
  
 -          rotation_between_vecs_to_mat3(mat, original_normal, no);
 +void applySnappingIndividual(TransInfo *t)
 +{
 +  if (!activeSnap_SnappingIndividual(t)) {
 +    return;
 +  }
  
 -          transform_data_ext_rotate(td, mat, true);
 +  /* XXX FLICKER IN OBJECT MODE */
 +  FOREACH_TRANS_DATA_CONTAINER (t, tc) {
 +    TransData *td = tc->data;
 +    for (int i = 0; i < tc->data_len; i++, td++) {
 +      if (td->flag & TD_SKIP) {
 +        continue;
 +      }
  
 -          /* TODO: support constraints for rotation too? see #ElementRotation. */
 -        }
 +      if ((t->flag & T_PROP_EDIT) && (td->factor == 0.0f)) {
 +        continue;
        }
+     }
  
-       applyFaceProject(t, tc, td);
-       applyFaceNearest(t, tc, td);
++    applyFaceProject(t, tc, td);
++    applyFaceNearest(t, tc, td);
  #if 0 /* TODO: support this? */
 -        constraintTransLim(t, td);
 +      constraintTransLim(t, td);
  #endif
-     }
    }
  }
  
@@@ -878,14 -764,12 +878,17 @@@ void initSnapping(TransInfo *t, wmOpera
      if (RNA_property_boolean_get(op->ptr, prop)) {
        t->modifiers |= MOD_SNAP;
  
 +      if ((prop = RNA_struct_find_property(op->ptr, "snap_elements")) &&
 +          RNA_property_is_set(op->ptr, prop)) {
 +        t->tsnap.mode = RNA_property_enum_get(op->ptr, prop);
 +      }
 +
        if ((prop = RNA_struct_find_property(op->ptr, "snap_target")) &&
            RNA_property_is_set(op->ptr, prop)) {
-         snap_target = RNA_property_enum_get(op->ptr, prop);
+         /* TODO(@gfxcoder): Rename `snap_target` to `snap_source` to avoid
+          * previous ambiguity of "target" (now, "source" is geometry to be moved and "target" is
+          * geometry to which moved geometry is snapped). */
+         snap_source = RNA_property_enum_get(op->ptr, prop);
        }
  
        if ((prop = RNA_struct_find_property(op->ptr, "snap_point")) &&
@@@ -1178,7 -1026,7 +1181,7 @@@ static

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list