[Bf-blender-cvs] [69c7ffff8bb] master: Transform: refactor createTransData splitting into more specific functions

Germano Cavalcante noreply at git.blender.org
Wed Feb 10 19:29:18 CET 2021


Commit: 69c7ffff8bbdaa585b51fe3e4e36a7f37b5759b7
Author: Germano Cavalcante
Date:   Wed Feb 10 15:19:51 2021 -0300
Branches: master
https://developer.blender.org/rB69c7ffff8bbdaa585b51fe3e4e36a7f37b5759b7

Transform: refactor createTransData splitting into more specific functions

Currently, `createTransData` is doing much more than the name implies.

This commit makes it clearer through smaller and more specific functions
what the real purpose of that function.

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

M	source/blender/editors/transform/transform.h
M	source/blender/editors/transform/transform_convert.c
M	source/blender/editors/transform/transform_generics.c

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

diff --git a/source/blender/editors/transform/transform.h b/source/blender/editors/transform/transform.h
index 02a7f41b384..24335b6b6b7 100644
--- a/source/blender/editors/transform/transform.h
+++ b/source/blender/editors/transform/transform.h
@@ -737,10 +737,6 @@ void setInputPostFct(MouseInput *mi, void (*post)(struct TransInfo *t, float val
 /** \name Generics
  * \{ */
 
-void initTransDataContainers_FromObjectData(TransInfo *t,
-                                            struct Object *obact,
-                                            struct Object **objects,
-                                            uint objects_len);
 void initTransInfo(struct bContext *C,
                    TransInfo *t,
                    struct wmOperator *op,
@@ -776,7 +772,7 @@ void calculatePropRatio(TransInfo *t);
 
 void transform_data_ext_rotate(TransData *td, float mat[3][3], bool use_drot);
 
-struct Object *transform_object_deform_pose_armature_get(TransInfo *t, struct Object *ob);
+struct Object *transform_object_deform_pose_armature_get(const TransInfo *t, struct Object *ob);
 
 void freeCustomNormalArray(TransInfo *t, TransDataContainer *tc, TransCustomData *custom_data);
 
diff --git a/source/blender/editors/transform/transform_convert.c b/source/blender/editors/transform/transform_convert.c
index ee2dd6d9b1f..6caa4727924 100644
--- a/source/blender/editors/transform/transform_convert.c
+++ b/source/blender/editors/transform/transform_convert.c
@@ -23,6 +23,7 @@
 
 #include "DNA_anim_types.h"
 #include "DNA_constraint_types.h"
+#include "DNA_mesh_types.h"
 
 #include "MEM_guardedalloc.h"
 
@@ -911,6 +912,7 @@ void special_aftertrans_update(bContext *C, TransInfo *t)
     case TC_LATTICE_VERTS:
     case TC_MBALL_VERTS:
     case TC_MESH_UV:
+    case TC_MESH_SKIN:
     case TC_OBJECT_TEXSPACE:
     case TC_PAINT_CURVE_VERTS:
     case TC_PARTICLE_VERTS:
@@ -978,7 +980,6 @@ static void init_proportional_edit(TransInfo *t)
   eTConvertType convert_type = t->data_type;
   switch (convert_type) {
     case TC_ACTION_DATA:
-    case TC_ARMATURE_VERTS:
     case TC_CURVE_VERTS:
     case TC_GRAPH_EDIT_DATA:
     case TC_GPENCIL:
@@ -993,7 +994,8 @@ static void init_proportional_edit(TransInfo *t)
     case TC_OBJECT:
     case TC_PARTICLE_VERTS:
       break;
-    case TC_POSE: /* See T32444. */
+    case TC_POSE: /* Disable PET, its not usable in pose mode yet T32444. */
+    case TC_ARMATURE_VERTS:
     case TC_CURSOR_IMAGE:
     case TC_CURSOR_VIEW3D:
     case TC_NLA_DATA:
@@ -1047,14 +1049,155 @@ static void init_proportional_edit(TransInfo *t)
   }
 }
 
-void createTransData(bContext *C, TransInfo *t)
+/* For multi object editing. */
+static void init_TransDataContainers(TransInfo *t,
+                                     Object *obact,
+                                     Object **objects,
+                                     uint objects_len)
 {
-  Scene *scene = t->scene;
-  ViewLayer *view_layer = t->view_layer;
-  Object *ob = OBACT(view_layer);
+  switch (t->data_type) {
+    case TC_POSE:
+    case TC_ARMATURE_VERTS:
+    case TC_CURVE_VERTS:
+    case TC_GPENCIL:
+    case TC_LATTICE_VERTS:
+    case TC_MBALL_VERTS:
+    case TC_MESH_VERTS:
+    case TC_MESH_EDGES:
+    case TC_MESH_SKIN:
+    case TC_MESH_UV:
+      break;
+    case TC_ACTION_DATA:
+    case TC_GRAPH_EDIT_DATA:
+    case TC_CURSOR_IMAGE:
+    case TC_CURSOR_VIEW3D:
+    case TC_MASKING_DATA:
+    case TC_NLA_DATA:
+    case TC_NODE_DATA:
+    case TC_OBJECT:
+    case TC_OBJECT_TEXSPACE:
+    case TC_PAINT_CURVE_VERTS:
+    case TC_PARTICLE_VERTS:
+    case TC_SCULPT:
+    case TC_SEQ_DATA:
+    case TC_TRACKING_DATA:
+    case TC_NONE:
+    default:
+      /* Does not support Multi object editing. */
+      return;
+  }
 
-  t->data_len_all = -1;
+  const eObjectMode object_mode = obact ? obact->mode : OB_MODE_OBJECT;
+  const short object_type = obact ? obact->type : -1;
+
+  if ((object_mode & OB_MODE_EDIT) || (t->data_type == TC_GPENCIL) ||
+      ((object_mode & OB_MODE_POSE) && (object_type == OB_ARMATURE))) {
+    if (t->data_container) {
+      MEM_freeN(t->data_container);
+    }
+
+    bool free_objects = false;
+    if (objects == NULL) {
+      objects = BKE_view_layer_array_from_objects_in_mode(
+          t->view_layer,
+          (t->spacetype == SPACE_VIEW3D) ? t->view : NULL,
+          &objects_len,
+          {
+              .object_mode = object_mode,
+              .no_dup_data = true,
+          });
+      free_objects = true;
+    }
+
+    t->data_container = MEM_callocN(sizeof(*t->data_container) * objects_len, __func__);
+    t->data_container_len = objects_len;
+
+    for (int i = 0; i < objects_len; i++) {
+      TransDataContainer *tc = &t->data_container[i];
+      if (((t->flag & T_NO_MIRROR) == 0) && ((t->options & CTX_NO_MIRROR) == 0) &&
+          (objects[i]->type == OB_MESH)) {
+        tc->use_mirror_axis_x = (((Mesh *)objects[i]->data)->symmetry & ME_SYMMETRY_X) != 0;
+        tc->use_mirror_axis_y = (((Mesh *)objects[i]->data)->symmetry & ME_SYMMETRY_Y) != 0;
+        tc->use_mirror_axis_z = (((Mesh *)objects[i]->data)->symmetry & ME_SYMMETRY_Z) != 0;
+      }
+
+      if (object_mode & OB_MODE_EDIT) {
+        tc->obedit = objects[i];
+        /* Check needed for UV's */
+        if ((t->flag & T_2D_EDIT) == 0) {
+          tc->use_local_mat = true;
+        }
+      }
+      else if (object_mode & OB_MODE_POSE) {
+        tc->poseobj = objects[i];
+        tc->use_local_mat = true;
+      }
+      else if (t->data_type == TC_GPENCIL) {
+        tc->use_local_mat = true;
+      }
+
+      if (tc->use_local_mat) {
+        BLI_assert((t->flag & T_2D_EDIT) == 0);
+        copy_m4_m4(tc->mat, objects[i]->obmat);
+        copy_m3_m4(tc->mat3, tc->mat);
+        /* for non-invertible scale matrices, invert_m4_m4_fallback()
+         * can still provide a valid pivot */
+        invert_m4_m4_fallback(tc->imat, tc->mat);
+        invert_m3_m3(tc->imat3, tc->mat3);
+        normalize_m3_m3(tc->mat3_unit, tc->mat3);
+      }
+      /* Otherwise leave as zero. */
+    }
+
+    if (free_objects) {
+      MEM_freeN(objects);
+    }
+  }
+}
+
+static eTFlag flags_from_data_type(eTConvertType data_type)
+{
+  switch (data_type) {
+    case TC_ACTION_DATA:
+    case TC_GRAPH_EDIT_DATA:
+    case TC_MASKING_DATA:
+    case TC_NLA_DATA:
+    case TC_NODE_DATA:
+    case TC_PAINT_CURVE_VERTS:
+    case TC_SEQ_DATA:
+    case TC_TRACKING_DATA:
+      return T_POINTS | T_2D_EDIT;
+    case TC_ARMATURE_VERTS:
+    case TC_CURVE_VERTS:
+    case TC_GPENCIL:
+    case TC_LATTICE_VERTS:
+    case TC_MBALL_VERTS:
+    case TC_MESH_VERTS:
+    case TC_MESH_SKIN:
+      return T_EDIT | T_POINTS;
+    case TC_MESH_EDGES:
+      return T_EDIT;
+    case TC_MESH_UV:
+      return T_EDIT | T_POINTS | T_2D_EDIT;
+    case TC_PARTICLE_VERTS:
+      return T_POINTS;
+    case TC_POSE:
+    case TC_CURSOR_IMAGE:
+    case TC_CURSOR_VIEW3D:
+    case TC_OBJECT:
+    case TC_OBJECT_TEXSPACE:
+    case TC_SCULPT:
+    case TC_NONE:
+    default:
+      break;
+  }
+  return 0;
+}
 
+static eTConvertType convert_type_get(const TransInfo *t, const Object **r_obj_armature)
+{
+  ViewLayer *view_layer = t->view_layer;
+  Object *ob = OBACT(view_layer);
   eTConvertType convert_type = TC_NONE;
 
   /* if tests must match recalcData for correct updates */
@@ -1074,19 +1217,12 @@ void createTransData(bContext *C, TransInfo *t)
     convert_type = TC_OBJECT_TEXSPACE;
   }
   else if (t->options & CTX_EDGE_DATA) {
-    t->flag |= T_EDIT;
     convert_type = TC_MESH_EDGES;
-    /* Multi object editing. */
-    initTransDataContainers_FromObjectData(t, ob, NULL, 0);
   }
   else if (t->options & CTX_GPENCIL_STROKES) {
-    t->options |= CTX_GPENCIL_STROKES;
-    t->flag |= T_POINTS | T_EDIT;
     convert_type = TC_GPENCIL;
-    initTransDataContainers_FromObjectData(t, ob, NULL, 0);
   }
   else if (t->spacetype == SPACE_IMAGE) {
-    t->flag |= T_POINTS | T_2D_EDIT;
     if (t->options & CTX_MASK) {
       convert_type = TC_MASKING_DATA;
     }
@@ -1096,41 +1232,25 @@ void createTransData(bContext *C, TransInfo *t)
       }
     }
     else if (t->obedit_type == OB_MESH) {
-      t->flag |= T_EDIT;
       convert_type = TC_MESH_UV;
-      initTransDataContainers_FromObjectData(t, ob, NULL, 0);
     }
   }
   else if (t->spacetype == SPACE_ACTION) {
-    t->flag |= T_POINTS | T_2D_EDIT;
-    t->obedit_type = -1;
     convert_type = TC_ACTION_DATA;
   }
   else if (t->spacetype == SPACE_NLA) {
-    t->flag |= T_POINTS | T_2D_EDIT;
-    t->obedit_type = -1;
     convert_type = TC_NLA_DATA;
   }
   else if (t->spacetype == SPACE_SEQ) {
-    t->flag |= T_POINTS | T_2D_EDIT;
-    t->obedit_type = -1;
-    t->num.flag |= NUM_NO_FRACTION; /* sequencer has no use for floating point transform. */
     convert_type = TC_SEQ_DATA;
   }
   else if (t->spacetype == SPACE_GRAPH) {
-    t->flag |= T_POINTS | T_2D_EDIT;
-    t->obedit_type = -1;
     convert_type = TC_GRAPH_EDIT_DATA;
   }
   else if (t->spacetype == SPACE_NODE) {
-    t->flag |= T_POINTS | T_2D_EDIT;
-    t->obedit_type = -1;
     convert_type = TC_NODE_DATA;
   }
   else if (t->spacetype == SPACE_CLIP) {
-    t->flag |= T_POINTS | T_2D_EDIT;
-    t->obedit_type = -1;
-
     if (t->options & CTX_MOVIECLIP) {
       convert_type = TC_TRACKING_DATA;
     }
@@ -1139,11 +1259,6 @@ void createTransData(bContext *C, TransInfo *t)
     }
   }
   else if (t->obedit_type != -1) {
-    t->flag |= T_EDIT | T_POINTS;
-
-    /* Multi object editing. */
-    initTransDataContainers_FromObjectData(t, ob, NULL, 0);
-
     if (t->obedit_type == OB_MESH) {
       if (t->mode == TFM_SKIN_RESIZE) {
         convert_type = TC_MESH_SKIN;
@@ -1162,38 +1277,25 @@ void createTransData(bContext *C, TransInfo *t)
       convert_type = TC_MBALL_VERTS;
     }
     else if (t->obedit_type == OB_ARMATURE) {
-      t->flag &= ~T_PROP_EDIT;
       convert_type = TC_ARMATURE_VERTS;
     }
   }
   else if (ob && (ob->mode & OB_MODE_POSE)) {
-    /* XXX this is currently limited to active armature only... */
-
-    /* XXX active-layer checking isn't done
-     * as that should probably be checked through context instead. */
-
-    /* Multi object editing. */
- 

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list