Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGermano Cavalcante <germano.costa@ig.com.br>2021-02-10 21:19:51 +0300
committerGermano Cavalcante <germano.costa@ig.com.br>2021-02-10 21:29:05 +0300
commit69c7ffff8bbdaa585b51fe3e4e36a7f37b5759b7 (patch)
tree75beef97674d1c468342c35847f526efd07676e6
parent62f0d51681a9d810b8d5481467679194df6f4b83 (diff)
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.
-rw-r--r--source/blender/editors/transform/transform.h6
-rw-r--r--source/blender/editors/transform/transform_convert.c259
-rw-r--r--source/blender/editors/transform/transform_generics.c76
3 files changed, 198 insertions, 143 deletions
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. */
- initTransDataContainers_FromObjectData(t, ob, NULL, 0);
convert_type = TC_POSE;
}
else if (ob && (ob->mode & OB_MODE_ALL_WEIGHT_PAINT) && !(t->options & CTX_PAINT_CURVE)) {
Object *ob_armature = transform_object_deform_pose_armature_get(t, ob);
if (ob_armature) {
- Object *objects[1];
- objects[0] = ob_armature;
- uint objects_len = 1;
- initTransDataContainers_FromObjectData(t, ob_armature, objects, objects_len);
+ *r_obj_armature = ob_armature;
convert_type = TC_POSE;
}
}
else if (ob && (ob->mode & OB_MODE_PARTICLE_EDIT) &&
- PE_start_edit(PE_get_current(t->depsgraph, scene, ob))) {
- t->flag |= T_POINTS;
+ PE_start_edit(PE_get_current(t->depsgraph, t->scene, ob))) {
convert_type = TC_PARTICLE_VERTS;
}
else if (ob && (ob->mode & OB_MODE_ALL_PAINT)) {
if ((t->options & CTX_PAINT_CURVE) && !ELEM(t->mode, TFM_SHEAR, TFM_SHRINKFATTEN)) {
- t->flag |= T_POINTS | T_2D_EDIT;
convert_type = TC_PAINT_CURVE_VERTS;
}
}
@@ -1205,30 +1307,40 @@ void createTransData(bContext *C, TransInfo *t)
/* In grease pencil all transformations must be canceled if not Object or Edit. */
}
else {
- t->options |= CTX_OBJECT;
+ convert_type = TC_OBJECT;
+ }
- /* Needed for correct Object.obmat after duplication, see: T62135. */
- BKE_scene_graph_evaluated_ensure(t->depsgraph, CTX_data_main(t->context));
+ return convert_type;
+}
- if ((scene->toolsettings->transform_flag & SCE_XFORM_DATA_ORIGIN) != 0) {
- t->options |= CTX_OBMODE_XFORM_OBDATA;
- }
- if ((scene->toolsettings->transform_flag & SCE_XFORM_SKIP_CHILDREN) != 0) {
- t->options |= CTX_OBMODE_XFORM_SKIP_CHILDREN;
- }
+void createTransData(bContext *C, TransInfo *t)
+{
+ t->data_len_all = -1;
- convert_type = TC_OBJECT;
+ Object *ob_armature = NULL;
+ t->data_type = convert_type_get(t, &ob_armature);
+ t->flag |= flags_from_data_type(t->data_type);
+
+ if (ob_armature) {
+ init_TransDataContainers(t, ob_armature, &ob_armature, 1);
+ }
+ else {
+ ViewLayer *view_layer = t->view_layer;
+ Object *ob = OBACT(view_layer);
+ init_TransDataContainers(t, ob, NULL, 0);
}
- t->data_type = convert_type;
- switch (convert_type) {
+ switch (t->data_type) {
case TC_ACTION_DATA:
+ t->obedit_type = -1;
createTransActionData(C, t);
break;
case TC_POSE:
t->options |= CTX_POSE_BONE;
+
+ /* XXX active-layer checking isn't done
+ * as that should probably be checked through context instead. */
createTransPose(t);
- /* Disable PET, its not usable in pose mode yet T32444. */
break;
case TC_ARMATURE_VERTS:
createTransArmatureVerts(t);
@@ -1243,6 +1355,7 @@ void createTransData(bContext *C, TransInfo *t)
createTransCurveVerts(t);
break;
case TC_GRAPH_EDIT_DATA:
+ t->obedit_type = -1;
createTransGraphEditData(C, t);
break;
case TC_GPENCIL:
@@ -1252,6 +1365,9 @@ void createTransData(bContext *C, TransInfo *t)
createTransLatticeVerts(t);
break;
case TC_MASKING_DATA:
+ if (t->spacetype == SPACE_CLIP) {
+ t->obedit_type = -1;
+ }
createTransMaskingData(C, t);
break;
case TC_MBALL_VERTS:
@@ -1270,12 +1386,25 @@ void createTransData(bContext *C, TransInfo *t)
createTransUVs(C, t);
break;
case TC_NLA_DATA:
+ t->obedit_type = -1;
createTransNlaData(C, t);
break;
case TC_NODE_DATA:
+ t->obedit_type = -1;
createTransNodeData(t);
break;
case TC_OBJECT:
+ t->options |= CTX_OBJECT;
+
+ /* Needed for correct Object.obmat after duplication, see: T62135. */
+ BKE_scene_graph_evaluated_ensure(t->depsgraph, CTX_data_main(t->context));
+
+ if ((t->settings->transform_flag & SCE_XFORM_DATA_ORIGIN) != 0) {
+ t->options |= CTX_OBMODE_XFORM_OBDATA;
+ }
+ if ((t->settings->transform_flag & SCE_XFORM_SKIP_CHILDREN) != 0) {
+ t->options |= CTX_OBMODE_XFORM_SKIP_CHILDREN;
+ }
createTransObject(C, t);
/* Check if we're transforming the camera from the camera */
if ((t->spacetype == SPACE_VIEW3D) && (t->region->regiontype == RGN_TYPE_WINDOW)) {
@@ -1305,9 +1434,12 @@ void createTransData(bContext *C, TransInfo *t)
createTransSculpt(C, t);
break;
case TC_SEQ_DATA:
+ t->obedit_type = -1;
+ t->num.flag |= NUM_NO_FRACTION; /* sequencer has no use for floating point transform. */
createTransSeqData(t);
break;
case TC_TRACKING_DATA:
+ t->obedit_type = -1;
createTransTrackingData(C, t);
break;
case TC_NONE:
@@ -1319,6 +1451,7 @@ void createTransData(bContext *C, TransInfo *t)
}
countAndCleanTransDataContainer(t);
+
init_proportional_edit(t);
BLI_assert((!(t->flag & T_EDIT)) == (!(t->obedit_type != -1)));
diff --git a/source/blender/editors/transform/transform_generics.c b/source/blender/editors/transform/transform_generics.c
index 92719933afb..6fca49495e9 100644
--- a/source/blender/editors/transform/transform_generics.c
+++ b/source/blender/editors/transform/transform_generics.c
@@ -26,7 +26,6 @@
#include "MEM_guardedalloc.h"
#include "DNA_gpencil_types.h"
-#include "DNA_mesh_types.h"
#include "BLI_blenlib.h"
#include "BLI_math.h"
@@ -120,79 +119,6 @@ void resetTransRestrictions(TransInfo *t)
t->flag &= ~T_ALL_RESTRICTIONS;
}
-void initTransDataContainers_FromObjectData(TransInfo *t,
- Object *obact,
- Object **objects,
- uint objects_len)
-{
- 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->options & CTX_GPENCIL_STROKES) ||
- ((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->options & CTX_GPENCIL_STROKES) {
- 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);
- }
- }
-}
-
/**
* Setup internal data, mouse, vectors
*
@@ -1456,7 +1382,7 @@ void transform_data_ext_rotate(TransData *td, float mat[3][3], bool use_drot)
}
}
-Object *transform_object_deform_pose_armature_get(TransInfo *t, Object *ob)
+Object *transform_object_deform_pose_armature_get(const TransInfo *t, Object *ob)
{
if (!(ob->mode & OB_MODE_ALL_WEIGHT_PAINT)) {
return NULL;