[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [56447] trunk/blender/source/blender: Fix #35149: solidify modifier + vertex parent not working after going in and out

Brecht Van Lommel brechtvanlommel at pandora.be
Wed May 1 16:34:12 CEST 2013


Revision: 56447
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=56447
Author:   blendix
Date:     2013-05-01 14:34:12 +0000 (Wed, 01 May 2013)
Log Message:
-----------
Fix #35149: solidify modifier + vertex parent not working after going in and out
of editmode on the child object.

Problem was that the object custom data mask was not taken into account when
rebuilding the derivedmesh in some cases, which is needed for the derivedmesh
to contain the mapping back to the original vertices. Now this data mask is
used for any derivedmesh build that will be cached.

Also problematic was that the datamask for the active object was applied to
all objects in the scene, which caused the parent object to be recalculated
when it didn't need to be. Now this datamask is only used for the active object.

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/intern/DerivedMesh.c
    trunk/blender/source/blender/blenkernel/intern/object.c
    trunk/blender/source/blender/editors/include/ED_view3d.h
    trunk/blender/source/blender/editors/object/object_relations.c
    trunk/blender/source/blender/editors/render/render_opengl.c
    trunk/blender/source/blender/editors/space_view3d/view3d_draw.c

Modified: trunk/blender/source/blender/blenkernel/intern/DerivedMesh.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/DerivedMesh.c	2013-05-01 13:34:56 UTC (rev 56446)
+++ trunk/blender/source/blender/blenkernel/intern/DerivedMesh.c	2013-05-01 14:34:12 UTC (rev 56447)
@@ -2258,9 +2258,38 @@
 	em->derivedCage->needsFree = 0;
 }
 
+static CustomDataMask object_get_datamask(Scene *scene, Object *ob)
+{
+	Object *actob = scene->basact ? scene->basact->object : NULL;
+	CustomDataMask mask = ob->customdata_mask;
+
+	if (ob == actob) {
+		/* check if we need tfaces & mcols due to face select or texture paint */
+		if (paint_facesel_test(ob) || (ob->mode & OB_MODE_TEXTURE_PAINT)) {
+			mask |= CD_MASK_MTFACE | CD_MASK_MCOL;
+		}
+
+		/* check if we need mcols due to vertex paint or weightpaint */
+		if (ob->mode & OB_MODE_VERTEX_PAINT) {
+			mask |= CD_MASK_MCOL;
+		}
+
+		if (ob->mode & OB_MODE_WEIGHT_PAINT) {
+			mask |= CD_MASK_PREVIEW_MCOL;
+		}
+
+		if (ob->mode & OB_MODE_EDIT)
+			mask |= CD_MASK_MVERT_SKIN;
+	}
+
+	return mask;
+}
+
 void makeDerivedMesh(Scene *scene, Object *ob, BMEditMesh *em,
                      CustomDataMask dataMask, int build_shapekey_layers)
 {
+	dataMask |= object_get_datamask(scene, ob);
+
 	if (em) {
 		editbmesh_build_data(scene, ob, em, dataMask);
 	}
@@ -2276,6 +2305,8 @@
 	/* if there's no derived mesh or the last data mask used doesn't include
 	 * the data we need, rebuild the derived mesh
 	 */
+	dataMask |= object_get_datamask(scene, ob);
+
 	if (!ob->derivedFinal || (dataMask & ob->lastDataMask) != dataMask)
 		mesh_build_data(scene, ob, dataMask, 0);
 
@@ -2287,6 +2318,8 @@
 	/* if there's no derived mesh or the last data mask used doesn't include
 	 * the data we need, rebuild the derived mesh
 	 */
+	dataMask |= object_get_datamask(scene, ob);
+
 	if (!ob->derivedDeform || (dataMask & ob->lastDataMask) != dataMask)
 		mesh_build_data(scene, ob, dataMask, 0);
 
@@ -2377,6 +2410,8 @@
 	/* if there's no derived mesh or the last data mask used doesn't include
 	 * the data we need, rebuild the derived mesh
 	 */
+	dataMask |= object_get_datamask(scene, obedit);
+
 	if (!em->derivedCage ||
 	    (em->lastDataMask & dataMask) != dataMask)
 	{
@@ -2392,6 +2427,8 @@
 	/* if there's no derived mesh or the last data mask used doesn't include
 	 * the data we need, rebuild the derived mesh
 	 */
+	dataMask |= object_get_datamask(scene, obedit);
+
 	if (!em->derivedCage ||
 	    (em->lastDataMask & dataMask) != dataMask)
 	{

Modified: trunk/blender/source/blender/blenkernel/intern/object.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/object.c	2013-05-01 13:34:56 UTC (rev 56446)
+++ trunk/blender/source/blender/blenkernel/intern/object.c	2013-05-01 14:34:12 UTC (rev 56447)
@@ -2727,7 +2727,7 @@
 
 #else               /* ensure CD_MASK_BAREMESH for now */
 					BMEditMesh *em = (ob == scene->obedit) ? BKE_editmesh_from_object(ob) : NULL;
-					uint64_t data_mask = scene->customdata_mask | ob->customdata_mask | CD_MASK_BAREMESH;
+					uint64_t data_mask = scene->customdata_mask | CD_MASK_BAREMESH;
 					if (em) {
 						makeDerivedMesh(scene, ob, em,  data_mask, 0); /* was CD_MASK_BAREMESH */
 					}

Modified: trunk/blender/source/blender/editors/include/ED_view3d.h
===================================================================
--- trunk/blender/source/blender/editors/include/ED_view3d.h	2013-05-01 13:34:56 UTC (rev 56446)
+++ trunk/blender/source/blender/editors/include/ED_view3d.h	2013-05-01 14:34:12 UTC (rev 56447)
@@ -297,7 +297,6 @@
 
 uint64_t ED_view3d_datamask(struct Scene *scene, struct View3D *v3d);
 uint64_t ED_view3d_screen_datamask(struct bScreen *screen);
-uint64_t ED_view3d_object_datamask(struct Scene *scene);
 
 /* camera lock functions */
 bool ED_view3d_camera_lock_check(struct View3D *v3d, struct RegionView3D *rv3d);

Modified: trunk/blender/source/blender/editors/object/object_relations.c
===================================================================
--- trunk/blender/source/blender/editors/object/object_relations.c	2013-05-01 13:34:56 UTC (rev 56446)
+++ trunk/blender/source/blender/editors/object/object_relations.c	2013-05-01 14:34:12 UTC (rev 56447)
@@ -145,7 +145,7 @@
 
 		/* derivedMesh might be needed for solving parenting,
 		 * so re-create it here */
-		makeDerivedMesh(scene, obedit, em, CD_MASK_BAREMESH, 0);
+		makeDerivedMesh(scene, obedit, em, CD_MASK_BAREMESH|CD_MASK_ORIGINDEX, 0);
 
 		BM_ITER_MESH (eve, &iter, em->bm, BM_VERTS_OF_MESH) {
 			if (BM_elem_flag_test(eve, BM_ELEM_SELECT)) {

Modified: trunk/blender/source/blender/editors/render/render_opengl.c
===================================================================
--- trunk/blender/source/blender/editors/render/render_opengl.c	2013-05-01 13:34:56 UTC (rev 56446)
+++ trunk/blender/source/blender/editors/render/render_opengl.c	2013-05-01 14:34:12 UTC (rev 56447)
@@ -407,8 +407,7 @@
 		oglrender->rv3d = oglrender->ar->regiondata;
 
 		/* MUST be cleared on exit */
-		oglrender->scene->customdata_mask_modal = (ED_view3d_datamask(oglrender->scene, oglrender->v3d) |
-		                                           ED_view3d_object_datamask(oglrender->scene));
+		oglrender->scene->customdata_mask_modal = ED_view3d_datamask(oglrender->scene, oglrender->v3d);
 
 		/* apply immediately in case we're rendering from a script,
 		 * running notifiers again will overwrite */

Modified: trunk/blender/source/blender/editors/space_view3d/view3d_draw.c
===================================================================
--- trunk/blender/source/blender/editors/space_view3d/view3d_draw.c	2013-05-01 13:34:56 UTC (rev 56446)
+++ trunk/blender/source/blender/editors/space_view3d/view3d_draw.c	2013-05-01 14:34:12 UTC (rev 56447)
@@ -2498,33 +2498,6 @@
 	return mask;
 }
 
-CustomDataMask ED_view3d_object_datamask(Scene *scene)
-{
-	Object *ob = scene->basact ? scene->basact->object : NULL;
-	CustomDataMask mask = 0;
-
-	if (ob) {
-		/* check if we need tfaces & mcols due to face select or texture paint */
-		if (paint_facesel_test(ob) || (ob->mode & OB_MODE_TEXTURE_PAINT)) {
-			mask |= CD_MASK_MTFACE | CD_MASK_MCOL;
-		}
-
-		/* check if we need mcols due to vertex paint or weightpaint */
-		if (ob->mode & OB_MODE_VERTEX_PAINT) {
-			mask |= CD_MASK_MCOL;
-		}
-
-		if (ob->mode & OB_MODE_WEIGHT_PAINT) {
-			mask |= CD_MASK_PREVIEW_MCOL;
-		}
-
-		if (ob->mode & OB_MODE_EDIT)
-			mask |= CD_MASK_MVERT_SKIN;
-	}
-
-	return mask;
-}
-
 /* goes over all modes and view3d settings */
 CustomDataMask ED_view3d_screen_datamask(bScreen *screen)
 {
@@ -2539,8 +2512,6 @@
 		}
 	}
 
-	mask |= ED_view3d_object_datamask(scene);
-
 	return mask;
 }
 




More information about the Bf-blender-cvs mailing list