Apply transforms on parents and children #55494

Closed
opened 2018-06-15 15:26:49 +02:00 by Julien Kaspar · 28 comments
Member

Blender Version
Broken: 2.8 5073ee0bb27

Short description of error
When a parent and it's children are selected and you apply the transforms, the parenting relation is ignored.
If the parent is scaled to 0.5 in all axes and the child is still at a scale of 1, and all get their scale applied, the parent gets set back to 1 and the child will grow to twice the size with a scale of 1.

**Blender Version** Broken: 2.8 5073ee0bb27 **Short description of error** When a parent and it's children are selected and you apply the transforms, the parenting relation is ignored. If the parent is scaled to 0.5 in all axes and the child is still at a scale of 1, and all get their scale applied, the parent gets set back to 1 and the child will grow to twice the size with a scale of 1.
Author
Member

Added subscriber: @JulienKaspar

Added subscriber: @JulienKaspar

blender/blender#64294 was marked as duplicate of this issue

blender/blender#64294 was marked as duplicate of this issue

blender/blender#64293 was marked as duplicate of this issue

blender/blender#64293 was marked as duplicate of this issue

blender/blender#63833 was marked as duplicate of this issue

blender/blender#63833 was marked as duplicate of this issue

blender/blender#63387 was marked as duplicate of this issue

blender/blender#63387 was marked as duplicate of this issue

blender/blender#58073 was marked as duplicate of this issue

blender/blender#58073 was marked as duplicate of this issue
Campbell Barton self-assigned this 2018-06-18 09:11:04 +02:00

Looked into this, the issue is apply-transform modifies the original data, then immediately evaluates parent/child relationships - which now use CoW evaluated meshes which don't have the changes from the source objects.

Looking into this further, the evaluated objects are used inconsistently, see: BKE_object_workob_calc_parent.

Note: issue is in apply_objects_internal - problem funcs are around ignore_parent_tx.

Looked into this, the issue is apply-transform modifies the original data, then immediately evaluates parent/child relationships - which now use CoW evaluated meshes which don't have the changes from the source objects. Looking into this further, the evaluated objects are used inconsistently, see: `BKE_object_workob_calc_parent`. Note: issue is in `apply_objects_internal` - problem funcs are around `ignore_parent_tx`.
Campbell Barton removed their assignment 2018-07-05 11:15:01 +02:00
Sergey Sharybin was assigned by Campbell Barton 2018-07-05 11:15:01 +02:00

Added subscribers: @Sergey, @ideasman42

Added subscribers: @Sergey, @ideasman42

As far as I can see the solution is not to mix evaluated & original object matrices - Or, rewrite this operator to work in a completely different way,

This relates to policy for handling copy on write, assigning to @sergey.

As far as I can see the solution is not to mix evaluated & original object matrices - Or, rewrite this operator to work in a completely different way, This relates to policy for handling copy on write, assigning to @sergey.
Member

Added subscriber: @Mets

Added subscriber: @Mets

Added subscriber: @lichtwerk

Added subscriber: @lichtwerk

@Sergey: Would it make sense to have a version of BKE_object_workob_calc_parent that works strictly with the originals [parent] (since that would fix this bug afaict)?
(Or is this even more inconsistent?)

@Sergey: Would it make sense to have a version of `BKE_object_workob_calc_parent` that works strictly with the originals [parent] (since that would fix this bug afaict)? (Or is this even more inconsistent?)

Added subscribers: @GaiaClary, @mont29, @Sabbababba

Added subscribers: @GaiaClary, @mont29, @Sabbababba

Or we could prepare the evaluated object as best as we can like so?

P946: #55494 snippet

possible fix for #55494

note: ignore the (commented out) stuff about applying to object data [not needed afaict]
but object matrix, scale etc. on the evaluated object needs to be up to date...

This would go in line with the fixes for blender/blender#62601/ blender/blender#60623 where we prepare the evaluated object as best as we can as well.
(in order for immediate calls to 'BKE_object_workob_calc_parent()' to work - before depsgraph did its magic...)


diff --git a/source/blender/editors/object/object_transform.c b/source/blender/editors/object/object_transform.c
index f7a49f3fcb7..c7480e49d2b 100644
--- a/source/blender/editors/object/object_transform.c
+++ b/source/blender/editors/object/object_transform.c
@@ -57,6 +57,7 @@
 #include "BKE_gpencil.h"
 
 #include "DEG_depsgraph.h"
+#include "DEG_depsgraph_query.h"
 
 #include "RNA_define.h"
 #include "RNA_access.h"
@@ -532,6 +533,8 @@ static int apply_objects_internal(
 	CTX_DATA_BEGIN (C, Object *, ob, selected_editable_objects)
 	{
 
+		Object *ob_eval = DEG_get_evaluated_object(depsgraph, ob);
+
 		/* calculate rotation/scale matrix */
 		if (apply_scale && apply_rot)
 			BKE_object_to_mat3(ob, rsmat);
@@ -571,35 +574,45 @@ static int apply_objects_internal(
 		/* apply to object data */
 		if (ob->type == OB_MESH) {
 			Mesh *me = ob->data;
+			//Mesh *me_eval = ob_eval->data;
 
 			if (apply_scale)
 				multiresModifier_scale_disp(depsgraph, scene, ob);
 
 			/* adjust data */
 			BKE_mesh_transform(me, mat, true);
+			//BKE_mesh_transform(me_eval, mat, true);
 
 			/* update normals */
 			BKE_mesh_calc_normals(me);
+			//BKE_mesh_calc_normals(me_eval);
 		}
 		else if (ob->type == OB_ARMATURE) {
 			ED_armature_transform_apply(bmain, ob, mat, do_props);
+			//ED_armature_transform_apply(bmain, ob_eval, mat, do_props);
 		}
 		else if (ob->type == OB_LATTICE) {
 			Lattice *lt = ob->data;
-
+			//Lattice *lt_eval = ob_eval->data;
 			BKE_lattice_transform(lt, mat, true);
+			//BKE_lattice_transform(lt_eval, mat, true);
 		}
 		else if (ob->type == OB_MBALL) {
 			MetaBall *mb = ob->data;
+			//MetaBall *mb_eval = ob_eval->data;
 			BKE_mball_transform(mb, mat, do_props);
+			//BKE_mball_transform(mb_eval, mat, do_props);
 		}
 		else if (ELEM(ob->type, OB_CURVE, OB_SURF)) {
 			Curve *cu = ob->data;
+			//Curve *cu_eval = ob_eval->data;
 			scale = mat3_to_scale(rsmat);
 			BKE_curve_transform_ex(cu, mat, true, do_props, scale);
+			//BKE_curve_transform_ex(cu_eval, mat, true, do_props, scale);
 		}
 		else if (ob->type == OB_FONT) {
 			Curve *cu = ob->data;
+			//Curve *cu_eval = ob_eval->data;
 			int i;
 
 			scale = mat3_to_scale(rsmat);
@@ -610,15 +623,24 @@ static int apply_objects_internal(
 				tb->y *= scale;
 				tb->w *= scale;
 				tb->h *= scale;
+
+				//TextBox *tb_eval = &cu_eval->tb[i];
+				//tb_eval->x *= scale;
+				//tb_eval->y *= scale;
+				//tb_eval->w *= scale;
+				//tb_eval->h *= scale;
 			}
 
 			if (do_props) {
 				cu->fsize *= scale;
+				//cu_eval->fsize *= scale;
 			}
 		}
 		else if (ob->type == OB_GPENCIL) {
 			bGPdata *gpd = ob->data;
+			//bGPdata *gpd_eval = ob_eval->data;
 			BKE_gpencil_transform(gpd, mat);
+			//BKE_gpencil_transform(gpd_eval, mat);
 		}
 		else if (ob->type == OB_CAMERA) {
 			MovieClip *clip = BKE_object_movieclip_get(scene, ob, false);
@@ -651,10 +673,13 @@ static int apply_objects_internal(
 			{
 				float max_scale = max_fff(fabsf(ob->scale- [x]), fabsf(ob->scale- [x]), fabsf(ob->scale[2]));
 				ob->empty_drawsize *= max_scale;
+				//float max_scale_eval = max_fff(fabsf(ob_eval->scale- [x]), fabsf(ob_eval->scale- [x]), fabsf(ob_eval->scale[2]));
+				//ob_eval->empty_drawsize *= max_scale_eval;
 			}
 		}
 		else if (ob->type == OB_LAMP) {
 			Light *la = ob->data;
+			//Light *la_eval = ob_eval->data;
 			if (la->type != LA_AREA) {
 				continue;
 			}
@@ -663,36 +688,54 @@ static int apply_objects_internal(
 			if ((la->area_shape == LA_AREA_SQUARE) && !keeps_aspect_ratio) {
 				la->area_shape = LA_AREA_RECT;
 				la->area_sizey = la->area_size;
+				//la_eval->area_shape = LA_AREA_RECT;
+				//la_eval->area_sizey = la->area_size;
 			}
 			else if ((la->area_shape == LA_AREA_DISK) && !keeps_aspect_ratio) {
 				la->area_shape = LA_AREA_ELLIPSE;
 				la->area_sizey = la->area_size;
+				//la_eval->area_shape = LA_AREA_ELLIPSE;
+				//la_eval->area_sizey = la->area_size;
 			}
 
 			la->area_size *= rsmat- [x][0];
 			la->area_sizey *= rsmat- [x][1];
 			la->area_sizez *= rsmat- [x][2];
+			//la_eval->area_size *= rsmat- [x][0];
+			//la_eval->area_sizey *= rsmat- [x][1];
+			//la_eval->area_sizez *= rsmat- [x][2];
 		}
 		else {
 			continue;
 		}
 
-		if (apply_loc)
+		if (apply_loc) {
 			zero_v3(ob->loc);
-		if (apply_scale)
+			zero_v3(ob_eval->loc);
+		}
+		if (apply_scale) {
 			ob->scale- [x] = ob->scale- [x] = ob->scale- [x] = 1.0f;
+			ob_eval->scale- [x] = ob_eval->scale- [x] = ob_eval->scale- [x] = 1.0f;
+		}
 		if (apply_rot) {
 			zero_v3(ob->rot);
 			unit_qt(ob->quat);
 			unit_axis_angle(ob->rotAxis, &ob->rotAngle);
+			zero_v3(ob_eval->rot);
+			unit_qt(ob_eval->quat);
+			unit_axis_angle(ob_eval->rotAxis, &ob_eval->rotAngle);
 		}
 
 		BKE_object_where_is_calc(depsgraph, scene, ob);
+		BKE_object_where_is_calc(depsgraph, scene, ob_eval);
+
 		if (ob->type == OB_ARMATURE) {
 			BKE_pose_where_is(depsgraph, scene, ob); /* needed for bone parents */
+			BKE_pose_where_is(depsgraph, scene, ob_eval); /* needed for bone parents */
 		}
 
 		ignore_parent_tx(C, bmain, scene, ob);
+		ignore_parent_tx(C, bmain, scene, ob_eval);
 
 		DEG_id_tag_update(&ob->id, ID_RECALC_TRANSFORM | ID_RECALC_GEOMETRY);
 
Or we could prepare the evaluated object as best as we can like so? [P946: #55494 snippet](https://archive.blender.org/developer/P946.txt) ``` possible fix for #55494 note: ignore the (commented out) stuff about applying to object data [not needed afaict] but object matrix, scale etc. on the evaluated object needs to be up to date... This would go in line with the fixes for blender/blender#62601/ blender/blender#60623 where we prepare the evaluated object as best as we can as well. (in order for immediate calls to 'BKE_object_workob_calc_parent()' to work - before depsgraph did its magic...) diff --git a/source/blender/editors/object/object_transform.c b/source/blender/editors/object/object_transform.c index f7a49f3fcb7..c7480e49d2b 100644 --- a/source/blender/editors/object/object_transform.c +++ b/source/blender/editors/object/object_transform.c @@ -57,6 +57,7 @@ #include "BKE_gpencil.h" #include "DEG_depsgraph.h" +#include "DEG_depsgraph_query.h" #include "RNA_define.h" #include "RNA_access.h" @@ -532,6 +533,8 @@ static int apply_objects_internal( CTX_DATA_BEGIN (C, Object *, ob, selected_editable_objects) { + Object *ob_eval = DEG_get_evaluated_object(depsgraph, ob); + /* calculate rotation/scale matrix */ if (apply_scale && apply_rot) BKE_object_to_mat3(ob, rsmat); @@ -571,35 +574,45 @@ static int apply_objects_internal( /* apply to object data */ if (ob->type == OB_MESH) { Mesh *me = ob->data; + //Mesh *me_eval = ob_eval->data; if (apply_scale) multiresModifier_scale_disp(depsgraph, scene, ob); /* adjust data */ BKE_mesh_transform(me, mat, true); + //BKE_mesh_transform(me_eval, mat, true); /* update normals */ BKE_mesh_calc_normals(me); + //BKE_mesh_calc_normals(me_eval); } else if (ob->type == OB_ARMATURE) { ED_armature_transform_apply(bmain, ob, mat, do_props); + //ED_armature_transform_apply(bmain, ob_eval, mat, do_props); } else if (ob->type == OB_LATTICE) { Lattice *lt = ob->data; - + //Lattice *lt_eval = ob_eval->data; BKE_lattice_transform(lt, mat, true); + //BKE_lattice_transform(lt_eval, mat, true); } else if (ob->type == OB_MBALL) { MetaBall *mb = ob->data; + //MetaBall *mb_eval = ob_eval->data; BKE_mball_transform(mb, mat, do_props); + //BKE_mball_transform(mb_eval, mat, do_props); } else if (ELEM(ob->type, OB_CURVE, OB_SURF)) { Curve *cu = ob->data; + //Curve *cu_eval = ob_eval->data; scale = mat3_to_scale(rsmat); BKE_curve_transform_ex(cu, mat, true, do_props, scale); + //BKE_curve_transform_ex(cu_eval, mat, true, do_props, scale); } else if (ob->type == OB_FONT) { Curve *cu = ob->data; + //Curve *cu_eval = ob_eval->data; int i; scale = mat3_to_scale(rsmat); @@ -610,15 +623,24 @@ static int apply_objects_internal( tb->y *= scale; tb->w *= scale; tb->h *= scale; + + //TextBox *tb_eval = &cu_eval->tb[i]; + //tb_eval->x *= scale; + //tb_eval->y *= scale; + //tb_eval->w *= scale; + //tb_eval->h *= scale; } if (do_props) { cu->fsize *= scale; + //cu_eval->fsize *= scale; } } else if (ob->type == OB_GPENCIL) { bGPdata *gpd = ob->data; + //bGPdata *gpd_eval = ob_eval->data; BKE_gpencil_transform(gpd, mat); + //BKE_gpencil_transform(gpd_eval, mat); } else if (ob->type == OB_CAMERA) { MovieClip *clip = BKE_object_movieclip_get(scene, ob, false); @@ -651,10 +673,13 @@ static int apply_objects_internal( { float max_scale = max_fff(fabsf(ob->scale- [x]), fabsf(ob->scale- [x]), fabsf(ob->scale[2])); ob->empty_drawsize *= max_scale; + //float max_scale_eval = max_fff(fabsf(ob_eval->scale- [x]), fabsf(ob_eval->scale- [x]), fabsf(ob_eval->scale[2])); + //ob_eval->empty_drawsize *= max_scale_eval; } } else if (ob->type == OB_LAMP) { Light *la = ob->data; + //Light *la_eval = ob_eval->data; if (la->type != LA_AREA) { continue; } @@ -663,36 +688,54 @@ static int apply_objects_internal( if ((la->area_shape == LA_AREA_SQUARE) && !keeps_aspect_ratio) { la->area_shape = LA_AREA_RECT; la->area_sizey = la->area_size; + //la_eval->area_shape = LA_AREA_RECT; + //la_eval->area_sizey = la->area_size; } else if ((la->area_shape == LA_AREA_DISK) && !keeps_aspect_ratio) { la->area_shape = LA_AREA_ELLIPSE; la->area_sizey = la->area_size; + //la_eval->area_shape = LA_AREA_ELLIPSE; + //la_eval->area_sizey = la->area_size; } la->area_size *= rsmat- [x][0]; la->area_sizey *= rsmat- [x][1]; la->area_sizez *= rsmat- [x][2]; + //la_eval->area_size *= rsmat- [x][0]; + //la_eval->area_sizey *= rsmat- [x][1]; + //la_eval->area_sizez *= rsmat- [x][2]; } else { continue; } - if (apply_loc) + if (apply_loc) { zero_v3(ob->loc); - if (apply_scale) + zero_v3(ob_eval->loc); + } + if (apply_scale) { ob->scale- [x] = ob->scale- [x] = ob->scale- [x] = 1.0f; + ob_eval->scale- [x] = ob_eval->scale- [x] = ob_eval->scale- [x] = 1.0f; + } if (apply_rot) { zero_v3(ob->rot); unit_qt(ob->quat); unit_axis_angle(ob->rotAxis, &ob->rotAngle); + zero_v3(ob_eval->rot); + unit_qt(ob_eval->quat); + unit_axis_angle(ob_eval->rotAxis, &ob_eval->rotAngle); } BKE_object_where_is_calc(depsgraph, scene, ob); + BKE_object_where_is_calc(depsgraph, scene, ob_eval); + if (ob->type == OB_ARMATURE) { BKE_pose_where_is(depsgraph, scene, ob); /* needed for bone parents */ + BKE_pose_where_is(depsgraph, scene, ob_eval); /* needed for bone parents */ } ignore_parent_tx(C, bmain, scene, ob); + ignore_parent_tx(C, bmain, scene, ob_eval); DEG_id_tag_update(&ob->id, ID_RECALC_TRANSFORM | ID_RECALC_GEOMETRY); ```

Added subscriber: @brecht

Added subscriber: @brecht

@Sergey, can you check this?

@Sergey, can you check this?

@brecht, i've been looking into the change. Not really sure yet why it is required to do some calculations in original object, and some of them are on both. To me it seems that where_is will return same matrix for both ob and ob_eval?

Also, there is BKE_object_transform_copy(), which is probably easier to use right before where_is, and ignore the rest of the change?

@brecht, i've been looking into the change. Not really sure yet why it is required to do some calculations in original object, and some of them are on both. To me it seems that `where_is` will return same matrix for both `ob` and `ob_eval`? Also, there is `BKE_object_transform_copy()`, which is probably easier to use right before `where_is`, and ignore the rest of the change?

Hm, without having looked at this again (will do on monday), just want to note that the following are all very tightly related:

  • blender/blender@bc54823376
    (This commit is where it "started", in BKE_object_workob_calc_parent calculation of matrix for workobject is now based on the evaluated parent)
    Above commit left a couple of places "broken" where code prior to BKE_object_workob_calc_parent was changing original (flags/matrix, etc), but BKE_object_workob_calc_parent was using evaluated version [which didnt have these changes available yet]

  • blender/blender@2894e75121 / blender/blender#60623 [this compensated by setting BONE_RELATIVE_PARENTING flag on evaluated version as well, as well as using partype, par1, par2, par3 from the original again]

  • blender/blender@9ad9d38786 / blender/blender#62601 [this compensated by setting CU_FOLLOW flag on evaluated version as well]

So right now this is really a bit mixed up... [as @ideasman42 also mentioned above]

So on Monday will also look at why blender/blender@bc54823376 was necessary to do that way...
If it needs to be like that, then it kind of makes sense to make sure the evaluated version is getting any updates as well [because evaluated will be used later on]

Hm, without having looked at this again (will do on monday), just want to note that the following are all very tightly related: - blender/blender@bc54823376 (This commit is where it "started", in `BKE_object_workob_calc_parent` calculation of matrix for workobject is now based on the **evaluated** parent) Above commit left a couple of places "broken" where code prior to `BKE_object_workob_calc_parent` was changing **original** (flags/matrix, etc), but `BKE_object_workob_calc_parent` was using **evaluated** version [which didnt have these changes available yet] - blender/blender@2894e75121 / blender/blender#60623 [this compensated by setting `BONE_RELATIVE_PARENTING` flag on **evaluated** version as well, as well as using `partype`, `par1`, `par2`, `par3` from the **original** again] - blender/blender@9ad9d38786 / blender/blender#62601 [this compensated by setting `CU_FOLLOW` flag on **evaluated** version as well] So right now this is really a bit mixed up... [as @ideasman42 also mentioned above] So on Monday will also look at why blender/blender@bc54823376 was necessary to do that way... If it needs to be like that, then it kind of makes sense to make sure the **evaluated** version is getting any updates as well [because **evaluated** will be used later on]

Added subscriber: @KihakuGisui

Added subscriber: @KihakuGisui

Added subscriber: @dfelinto

Added subscriber: @dfelinto

Hrmf, after a bit more digging, I still lack a "proper" solution [at least it feels like that...]

Here is the "cleaned up" ex- P946 solution from above (with the unneeded stuff removed and suggestions from @Sergey):
P949: #55494 snippet again



diff --git a/source/blender/editors/object/object_transform.c b/source/blender/editors/object/object_transform.c
index f7a49f3fcb7..1912f3d0f53 100644
--- a/source/blender/editors/object/object_transform.c
+++ b/source/blender/editors/object/object_transform.c
@@ -57,6 +57,7 @@
 #include "BKE_gpencil.h"
 
 #include "DEG_depsgraph.h"
+#include "DEG_depsgraph_query.h"
 
 #include "RNA_define.h"
 #include "RNA_access.h"
@@ -531,6 +532,7 @@ static int apply_objects_internal(
 	/* now execute */
 	CTX_DATA_BEGIN (C, Object *, ob, selected_editable_objects)
 	{
+		Object *ob_eval = DEG_get_evaluated_object(depsgraph, ob);
 
 		/* calculate rotation/scale matrix */
 		if (apply_scale && apply_rot)
@@ -687,9 +689,14 @@ static int apply_objects_internal(
 			unit_axis_angle(ob->rotAxis, &ob->rotAngle);
 		}
 
+		BKE_object_transform_copy(ob_eval, ob);
+
 		BKE_object_where_is_calc(depsgraph, scene, ob);
+		BKE_object_where_is_calc(depsgraph, scene, ob_eval);
 		if (ob->type == OB_ARMATURE) {
-			BKE_pose_where_is(depsgraph, scene, ob); /* needed for bone parents */
+			/* needed for bone parents */
+			BKE_pose_where_is(depsgraph, scene, ob);
+			BKE_pose_where_is(depsgraph, scene, ob_eval);
 		}
 
 		ignore_parent_tx(C, bmain, scene, ob);

other stuff I tried to look into:

  • blender/blender@bc54823376: in the case of this report, working with the original in BKE_object_workob_calc_parent will actually work fine, but will run into problems elsewhere... [wrong evaluation of curve parents etc...]
  • instead of "manually" copying transform etc to the evaluated version: tag with ID_RECALC_COPY_ON_WRITE and update depsgraph [but that will update dependencies as well, causing problems with nested parents etc...]
  • I will also decouple/reopen blender/blender#63387 again [because solution from here wont actually solve that one...]

Long story short: Some other eyes will probably need to look at this in depth...

Maybe @dfelinto also wants to join?

Hrmf, after a bit more digging, I still lack a "proper" solution [at least it feels like that...] Here is the "cleaned up" ex- [P946](https://archive.blender.org/developer/P946.txt) solution from above (with the unneeded stuff removed and suggestions from @Sergey): [P949: #55494 snippet again](https://archive.blender.org/developer/P949.txt) ``` diff --git a/source/blender/editors/object/object_transform.c b/source/blender/editors/object/object_transform.c index f7a49f3fcb7..1912f3d0f53 100644 --- a/source/blender/editors/object/object_transform.c +++ b/source/blender/editors/object/object_transform.c @@ -57,6 +57,7 @@ #include "BKE_gpencil.h" #include "DEG_depsgraph.h" +#include "DEG_depsgraph_query.h" #include "RNA_define.h" #include "RNA_access.h" @@ -531,6 +532,7 @@ static int apply_objects_internal( /* now execute */ CTX_DATA_BEGIN (C, Object *, ob, selected_editable_objects) { + Object *ob_eval = DEG_get_evaluated_object(depsgraph, ob); /* calculate rotation/scale matrix */ if (apply_scale && apply_rot) @@ -687,9 +689,14 @@ static int apply_objects_internal( unit_axis_angle(ob->rotAxis, &ob->rotAngle); } + BKE_object_transform_copy(ob_eval, ob); + BKE_object_where_is_calc(depsgraph, scene, ob); + BKE_object_where_is_calc(depsgraph, scene, ob_eval); if (ob->type == OB_ARMATURE) { - BKE_pose_where_is(depsgraph, scene, ob); /* needed for bone parents */ + /* needed for bone parents */ + BKE_pose_where_is(depsgraph, scene, ob); + BKE_pose_where_is(depsgraph, scene, ob_eval); } ignore_parent_tx(C, bmain, scene, ob); ``` other stuff I tried to look into: - blender/blender@bc54823376: in the case of this report, working with the **original** in `BKE_object_workob_calc_parent` will actually work fine, but will run into problems elsewhere... [wrong evaluation of curve parents etc...] - instead of "manually" copying transform etc to the evaluated version: tag with `ID_RECALC_COPY_ON_WRITE` and update depsgraph [but that will update dependencies as well, causing problems with nested parents etc...] - I will also decouple/reopen blender/blender#63387 again [because solution from here wont actually solve that one...] Long story short: Some other eyes will probably need to look at this in depth... Maybe @dfelinto also wants to join?

Added subscriber: @capnm

Added subscriber: @capnm

Added subscriber: @brothermechanic

Added subscriber: @brothermechanic

Added subscriber: @hunterz263

Added subscriber: @hunterz263

Added subscriber: @HyLian

Added subscriber: @HyLian

Added subscriber: @LucasVeber

Added subscriber: @LucasVeber

This issue was referenced by blender/blender@26d4a2a516

This issue was referenced by blender/blender@26d4a2a5169472369829905a960786390bc09c0e

Changed status from 'Open' to: 'Resolved'

Changed status from 'Open' to: 'Resolved'
Sign in to join this conversation.
No Milestone
No project
No Assignees
12 Participants
Notifications
Due Date
The due date is invalid or out of range. Please use the format 'yyyy-mm-dd'.

No due date set.

Dependencies

No dependencies set.

Reference: studio/blender-studio#55494
No description provided.