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:
authorSergey Sharybin <sergey.vfx@gmail.com>2018-05-31 15:44:48 +0300
committerSergey Sharybin <sergey.vfx@gmail.com>2018-05-31 19:07:55 +0300
commit126e6c8e1d2babc69795211e949d7fc03a81639e (patch)
tree8f54707052047bc9250831d4d3720f0e469c940e
parent59a516913e599ce29754d361246a0d8cb92bd314 (diff)
Transform: Read all data from original objects
This is now guaranteed to be in sync with evaluated state for an active dependency graph. Solves issue with duplicating animated object.
-rw-r--r--source/blender/editors/transform/transform_conversions.c61
1 files changed, 28 insertions, 33 deletions
diff --git a/source/blender/editors/transform/transform_conversions.c b/source/blender/editors/transform/transform_conversions.c
index b23caea7fb7..8bfe14dc6ea 100644
--- a/source/blender/editors/transform/transform_conversions.c
+++ b/source/blender/editors/transform/transform_conversions.c
@@ -1176,15 +1176,9 @@ static void createTransPose(TransInfo *t, Object **objects, uint objects_len)
/* use pose channels to fill trans data */
td = tc->data;
- Object *ob_eval = DEG_get_evaluated_object(CTX_data_depsgraph(t->context), ob);
- bPoseChannel *pchan, *pchan_eval;
- for (pchan = ob->pose->chanbase.first, pchan_eval = ob_eval->pose->chanbase.first;
- pchan && pchan_eval;
- pchan = pchan->next, pchan_eval = pchan_eval->next)
- {
- BLI_assert(pchan == pchan_eval || STREQ(pchan->bone->name, pchan_eval->bone->name));
+ for (bPoseChannel *pchan = ob->pose->chanbase.first; pchan; pchan = pchan->next) {
if (pchan->bone->flag & BONE_TRANSFORM) {
- add_pose_transdata(t, ob, pchan, ob_eval, pchan_eval, tc, td);
+ add_pose_transdata(t, ob, pchan, ob, pchan, tc, td);
td++;
}
}
@@ -5627,7 +5621,6 @@ static void ObjectToTransData(TransInfo *t, TransData *td, Object *ob)
{
Depsgraph *depsgraph = t->depsgraph;
Scene *scene = t->scene;
- Object *ob_eval = DEG_get_evaluated_object(depsgraph, ob);
bool constinv;
bool skip_invert = false;
@@ -5639,27 +5632,27 @@ static void ObjectToTransData(TransInfo *t, TransData *td, Object *ob)
// XXX: This needs fixing for COW. May need rigidbody_world from scene
if (BKE_rigidbody_check_sim_running(scene->rigidbody_world, ctime)) {
/* save original object transform */
- copy_v3_v3(td->ext->oloc, ob_eval->loc);
+ copy_v3_v3(td->ext->oloc, ob->loc);
if (ob->rotmode > 0) {
- copy_v3_v3(td->ext->orot, ob_eval->rot);
+ copy_v3_v3(td->ext->orot, ob->rot);
}
else if (ob->rotmode == ROT_MODE_AXISANGLE) {
- td->ext->orotAngle = ob_eval->rotAngle;
- copy_v3_v3(td->ext->orotAxis, ob_eval->rotAxis);
+ td->ext->orotAngle = ob->rotAngle;
+ copy_v3_v3(td->ext->orotAxis, ob->rotAxis);
}
else {
- copy_qt_qt(td->ext->oquat, ob_eval->quat);
+ copy_qt_qt(td->ext->oquat, ob->quat);
}
/* update object's loc/rot to get current rigid body transform */
- mat4_to_loc_rot_size(ob->loc, rot, scale, ob_eval->obmat);
- sub_v3_v3(ob->loc, ob_eval->dloc);
+ mat4_to_loc_rot_size(ob->loc, rot, scale, ob->obmat);
+ sub_v3_v3(ob->loc, ob->dloc);
BKE_object_mat3_to_rot(ob, rot, false); /* drot is already corrected here */
}
}
/* axismtx has the real orientation */
- copy_m3_m4(td->axismtx, ob_eval->obmat);
+ copy_m3_m4(td->axismtx, ob->obmat);
normalize_m3(td->axismtx);
td->con = ob->constraints.first;
@@ -5678,18 +5671,20 @@ static void ObjectToTransData(TransInfo *t, TransData *td, Object *ob)
Scene *scene_eval = DEG_get_evaluated_scene(t->depsgraph);
if (skip_invert == false && constinv == false) {
+ Object *ob_eval = DEG_get_evaluated_object(depsgraph, ob);
ob_eval->transflag |= OB_NO_CONSTRAINTS; /* BKE_object_where_is_calc_time checks this */
BKE_object_where_is_calc(t->depsgraph, scene_eval, ob_eval);
ob_eval->transflag &= ~OB_NO_CONSTRAINTS;
}
else {
+ Object *ob_eval = DEG_get_evaluated_object(depsgraph, ob);
BKE_object_where_is_calc(t->depsgraph, scene_eval, ob_eval);
}
td->ob = ob;
td->loc = ob->loc;
- copy_v3_v3(td->iloc, ob_eval->loc);
+ copy_v3_v3(td->iloc, ob->loc);
if (ob->rotmode > 0) {
td->ext->rot = ob->rot;
@@ -5697,8 +5692,8 @@ static void ObjectToTransData(TransInfo *t, TransData *td, Object *ob)
td->ext->rotAngle = NULL;
td->ext->quat = NULL;
- copy_v3_v3(td->ext->irot, ob_eval->rot);
- copy_v3_v3(td->ext->drot, ob_eval->drot);
+ copy_v3_v3(td->ext->irot, ob->rot);
+ copy_v3_v3(td->ext->drot, ob->drot);
}
else if (ob->rotmode == ROT_MODE_AXISANGLE) {
td->ext->rot = NULL;
@@ -5706,10 +5701,10 @@ static void ObjectToTransData(TransInfo *t, TransData *td, Object *ob)
td->ext->rotAngle = &ob->rotAngle;
td->ext->quat = NULL;
- td->ext->irotAngle = ob_eval->rotAngle;
- copy_v3_v3(td->ext->irotAxis, ob_eval->rotAxis);
- // td->ext->drotAngle = ob_eval->drotAngle; // XXX, not implemented
- // copy_v3_v3(td->ext->drotAxis, ob_eval->drotAxis); // XXX, not implemented
+ td->ext->irotAngle = ob->rotAngle;
+ copy_v3_v3(td->ext->irotAxis, ob->rotAxis);
+ // td->ext->drotAngle = ob->drotAngle; // XXX, not implemented
+ // copy_v3_v3(td->ext->drotAxis, ob->drotAxis); // XXX, not implemented
}
else {
td->ext->rot = NULL;
@@ -5717,18 +5712,18 @@ static void ObjectToTransData(TransInfo *t, TransData *td, Object *ob)
td->ext->rotAngle = NULL;
td->ext->quat = ob->quat;
- copy_qt_qt(td->ext->iquat, ob_eval->quat);
- copy_qt_qt(td->ext->dquat, ob_eval->dquat);
+ copy_qt_qt(td->ext->iquat, ob->quat);
+ copy_qt_qt(td->ext->dquat, ob->dquat);
}
- td->ext->rotOrder = ob_eval->rotmode;
+ td->ext->rotOrder = ob->rotmode;
td->ext->size = ob->size;
- copy_v3_v3(td->ext->isize, ob_eval->size);
- copy_v3_v3(td->ext->dscale, ob_eval->dscale);
+ copy_v3_v3(td->ext->isize, ob->size);
+ copy_v3_v3(td->ext->dscale, ob->dscale);
- copy_v3_v3(td->center, ob_eval->obmat[3]);
+ copy_v3_v3(td->center, ob->obmat[3]);
- copy_m4_m4(td->ext->obmat, ob_eval->obmat);
+ copy_m4_m4(td->ext->obmat, ob->obmat);
/* is there a need to set the global<->data space conversion matrices? */
if (ob->parent || constinv) {
@@ -5738,8 +5733,8 @@ static void ObjectToTransData(TransInfo *t, TransData *td, Object *ob)
* NOTE: some Constraints, and also Tracking should never get this
* done, as it doesn't work well.
*/
- BKE_object_to_mat3(ob_eval, obmtx);
- copy_m3_m4(totmat, ob_eval->obmat);
+ BKE_object_to_mat3(ob, obmtx);
+ copy_m3_m4(totmat, ob->obmat);
invert_m3_m3(obinv, totmat);
mul_m3_m3m3(td->smtx, obmtx, obinv);
invert_m3_m3(td->mtx, td->smtx);