[Bf-blender-cvs] [126e6c8e1d2] blender2.8: Transform: Read all data from original objects

Sergey Sharybin noreply at git.blender.org
Thu May 31 18:11:17 CEST 2018


Commit: 126e6c8e1d2babc69795211e949d7fc03a81639e
Author: Sergey Sharybin
Date:   Thu May 31 14:44:48 2018 +0200
Branches: blender2.8
https://developer.blender.org/rB126e6c8e1d2babc69795211e949d7fc03a81639e

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.

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

M	source/blender/editors/transform/transform_conversions.c

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

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);



More information about the Bf-blender-cvs mailing list