[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [33801] trunk/blender/source/blender: bugfix [#25310] Twice applied modifier with Convert to mesh with several multi-user objects

Campbell Barton ideasman42 at gmail.com
Mon Dec 20 08:21:09 CET 2010


Revision: 33801
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=33801
Author:   campbellbarton
Date:     2010-12-20 08:21:08 +0100 (Mon, 20 Dec 2010)

Log Message:
-----------
bugfix [#25310] Twice applied modifier with Convert to mesh with several multi-user objects

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/BKE_library.h
    trunk/blender/source/blender/editors/object/object_add.c

Modified: trunk/blender/source/blender/blenkernel/BKE_library.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_library.h	2010-12-20 05:26:25 UTC (rev 33800)
+++ trunk/blender/source/blender/blenkernel/BKE_library.h	2010-12-20 07:21:08 UTC (rev 33801)
@@ -88,6 +88,8 @@
 /* use when "" is given to new_id() */
 #define ID_FALLBACK_NAME "Untitled"
 
+#define IS_TAGGED(_id) ((_id) && (((ID *)_id)->flag & LIB_DOIT))
+
 #ifdef __cplusplus
 }
 #endif

Modified: trunk/blender/source/blender/editors/object/object_add.c
===================================================================
--- trunk/blender/source/blender/editors/object/object_add.c	2010-12-20 05:26:25 UTC (rev 33800)
+++ trunk/blender/source/blender/editors/object/object_add.c	2010-12-20 07:21:08 UTC (rev 33801)
@@ -1091,8 +1091,8 @@
 	Nurb *nu;
 	MetaBall *mb;
 	Mesh *me;
-	int target= RNA_enum_get(op->ptr, "target");
-	int keep_original= RNA_boolean_get(op->ptr, "keep_original");
+	const short target= RNA_enum_get(op->ptr, "target");
+	const short keep_original= RNA_boolean_get(op->ptr, "keep_original");
 	int a, mballConverted= 0;
 
 	/* don't forget multiple users! */
@@ -1101,13 +1101,18 @@
 	CTX_DATA_BEGIN(C, Base*, base, selected_editable_bases) {
 		ob= base->object;
 		ob->flag &= ~OB_DONE;
+
+		/* flag data thats not been edited (only needed for !keep_original) */
+		if(ob->data) {
+			((ID *)ob->data)->flag |= LIB_DOIT;
+		}
 	}
 	CTX_DATA_END;
 
 	CTX_DATA_BEGIN(C, Base*, base, selected_editable_bases) {
 		ob= base->object;
 
-		if(ob->flag & OB_DONE) {
+		if(ob->flag & OB_DONE || !IS_TAGGED(ob->data)) {
 			if (ob->type != target) {
 				base->flag &= ~SELECT;
 				ob->flag &= ~SELECT;
@@ -1243,14 +1248,9 @@
 				curvetomesh(scene, newob);
 			}
 		}
-		else if(ob->type==OB_MBALL) {
+		else if(ob->type==OB_MBALL && target == OB_MESH) {
 			Object *baseob;
 
-			if (target != OB_MESH) {
-				ob->flag |= OB_DONE;
-				continue;
-			}
-
 			base->flag &= ~SELECT;
 			ob->flag &= ~SELECT;
 
@@ -1292,12 +1292,13 @@
 
 				mballConverted= 1;
 			}
-			else
-				continue;
 		}
-		else
+		else {
 			continue;
+		}
 
+		/* tag obdata if it was been changed */
+
 		/* If the original object is active then make this object active */
 		if(basen) {
 			if(ob == obact) {
@@ -1308,8 +1309,9 @@
 			basen= NULL;
 		}
 
-		if (!keep_original) {
+		if (!keep_original && (ob->flag & OB_DONE)) {
 			DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
+			((ID *)ob->data)->flag &= ~LIB_DOIT; /* flag not to convert this datablock again */
 		}
 
 		/* delete original if needed */





More information about the Bf-blender-cvs mailing list