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>2020-06-08 14:23:04 +0300
committerGermano Cavalcante <germano.costa@ig.com.br>2020-06-08 14:23:37 +0300
commit1c189aa70aff01f72ae1fc2eacefcf924ede62c7 (patch)
treed761b96ee31bb3f02d05ae4873251b72fea68668 /source/blender/editors/transform/transform_generics.c
parent335c1e48ee5b3008fbae48b7de4d0f2b6b2f30b9 (diff)
Fix T70873: Pivot Center doesn't compute mirror elements
Diffstat (limited to 'source/blender/editors/transform/transform_generics.c')
-rw-r--r--source/blender/editors/transform/transform_generics.c87
1 files changed, 56 insertions, 31 deletions
diff --git a/source/blender/editors/transform/transform_generics.c b/source/blender/editors/transform/transform_generics.c
index beafbfab1ff..78c47014d62 100644
--- a/source/blender/editors/transform/transform_generics.c
+++ b/source/blender/editors/transform/transform_generics.c
@@ -180,9 +180,9 @@ void initTransDataContainers_FromObjectData(TransInfo *t,
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->mirror.axis_x = (((Mesh *)objects[i]->data)->editflag & ME_EDIT_MIRROR_X) != 0;
- tc->mirror.axis_y = (((Mesh *)objects[i]->data)->editflag & ME_EDIT_MIRROR_Y) != 0;
- tc->mirror.axis_z = (((Mesh *)objects[i]->data)->editflag & ME_EDIT_MIRROR_Z) != 0;
+ tc->use_mirror_axis_x = (((Mesh *)objects[i]->data)->editflag & ME_EDIT_MIRROR_X) != 0;
+ tc->use_mirror_axis_y = (((Mesh *)objects[i]->data)->editflag & ME_EDIT_MIRROR_Y) != 0;
+ tc->use_mirror_axis_z = (((Mesh *)objects[i]->data)->editflag & ME_EDIT_MIRROR_Z) != 0;
}
if (object_mode & OB_MODE_EDIT) {
@@ -821,9 +821,9 @@ void postTrans(bContext *C, TransInfo *t)
}
MEM_freeN(tc->data);
+ MEM_SAFE_FREE(tc->data_mirror);
MEM_SAFE_FREE(tc->data_ext);
MEM_SAFE_FREE(tc->data_2d);
- MEM_SAFE_FREE(tc->mirror.data);
}
}
@@ -880,12 +880,18 @@ void applyTransObjects(TransInfo *t)
recalcData(t);
}
-static void restoreElement(TransData *td)
+static void transdata_restore_basic(TransDataBasic *td_basic)
{
/* TransData for crease has no loc */
- if (td->loc) {
- copy_v3_v3(td->loc, td->iloc);
+ if (td_basic->loc) {
+ copy_v3_v3(td_basic->loc, td_basic->iloc);
}
+}
+
+static void restoreElement(TransData *td)
+{
+ transdata_restore_basic((TransDataBasic *)td);
+
if (td->val) {
*td->val = td->ival;
}
@@ -921,11 +927,16 @@ void restoreTransObjects(TransInfo *t)
TransData *td;
TransData2D *td2d;
+ TransDataMirror *tdm;
for (td = tc->data; td < tc->data + tc->data_len; td++) {
restoreElement(td);
}
+ for (tdm = tc->data_mirror; tdm < tc->data_mirror + tc->data_mirror_len; tdm++) {
+ transdata_restore_basic((TransDataBasic *)tdm);
+ }
+
for (td2d = tc->data_2d; tc->data_2d && td2d < tc->data_2d + tc->data_len; td2d++) {
if (td2d->h1) {
td2d->h1[0] = td2d->ih1[0];
@@ -1040,25 +1051,41 @@ void calculateCenterCursorGraph2D(TransInfo *t, float r_center[2])
}
}
+static bool transdata_center_global_get(const TransDataContainer *tc,
+ const TransDataBasic *td_basic,
+ float r_vec[3])
+{
+ if (td_basic->flag & TD_SELECTED) {
+ if (!(td_basic->flag & TD_NOCENTER)) {
+ if (tc->use_local_mat) {
+ mul_v3_m4v3(r_vec, tc->mat, td_basic->center);
+ }
+ else {
+ copy_v3_v3(r_vec, td_basic->center);
+ }
+ return true;
+ }
+ }
+ return false;
+}
+
void calculateCenterMedian(TransInfo *t, float r_center[3])
{
float partial[3] = {0.0f, 0.0f, 0.0f};
int total = 0;
FOREACH_TRANS_DATA_CONTAINER (t, tc) {
+ float center[3];
for (int i = 0; i < tc->data_len; i++) {
- if (tc->data[i].flag & TD_SELECTED) {
- if (!(tc->data[i].flag & TD_NOCENTER)) {
- if (tc->use_local_mat) {
- float v[3];
- mul_v3_m4v3(v, tc->mat, tc->data[i].center);
- add_v3_v3(partial, v);
- }
- else {
- add_v3_v3(partial, tc->data[i].center);
- }
- total++;
- }
+ if (transdata_center_global_get(tc, (TransDataBasic *)&tc->data[i], center)) {
+ add_v3_v3(partial, center);
+ total++;
+ }
+ }
+ for (int i = 0; i < tc->data_mirror_len; i++) {
+ if (transdata_center_global_get(tc, (TransDataBasic *)&tc->data_mirror[i], center)) {
+ add_v3_v3(partial, center);
+ total++;
}
}
}
@@ -1074,19 +1101,17 @@ void calculateCenterBound(TransInfo *t, float r_center[3])
bool changed = false;
INIT_MINMAX(min, max);
FOREACH_TRANS_DATA_CONTAINER (t, tc) {
+ float center[3];
for (int i = 0; i < tc->data_len; i++) {
- if (tc->data[i].flag & TD_SELECTED) {
- if (!(tc->data[i].flag & TD_NOCENTER)) {
- if (tc->use_local_mat) {
- float v[3];
- mul_v3_m4v3(v, tc->mat, tc->data[i].center);
- minmax_v3v3_v3(min, max, v);
- }
- else {
- minmax_v3v3_v3(min, max, tc->data[i].center);
- }
- changed = true;
- }
+ if (transdata_center_global_get(tc, (TransDataBasic *)&tc->data[i], center)) {
+ minmax_v3v3_v3(min, max, center);
+ changed = true;
+ }
+ }
+ for (int i = 0; i < tc->data_mirror_len; i++) {
+ if (transdata_center_global_get(tc, (TransDataBasic *)&tc->data_mirror[i], center)) {
+ minmax_v3v3_v3(min, max, center);
+ changed = true;
}
}
}