[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [23950] trunk/blender/source/blender: Fix #19638: crash when assiging self in boolean modifier.

Brecht Van Lommel brecht at blender.org
Mon Oct 19 14:13:33 CEST 2009


Revision: 23950
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=23950
Author:   blendix
Date:     2009-10-19 14:13:32 +0200 (Mon, 19 Oct 2009)

Log Message:
-----------
Fix #19638: crash when assiging self in boolean modifier.

Also:
* UI now takes ID self check flag into account so that e.g. it
  doesn't offer to the make object it's own parent.
* Mesh loop cuts number of cuts had wrong limits.
* Don't use mesh_get_derived_final in modifier stack, but
  ob->derivedFinal instead. Avoids crashes on dependency loops,
  and in case there is no loop it should have been created.

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/intern/modifier.c
    trunk/blender/source/blender/editors/interface/interface_layout.c
    trunk/blender/source/blender/editors/mesh/loopcut.c
    trunk/blender/source/blender/makesrna/RNA_types.h
    trunk/blender/source/blender/makesrna/intern/rna_modifier.c
    trunk/blender/source/blender/makesrna/intern/rna_object.c

Modified: trunk/blender/source/blender/blenkernel/intern/modifier.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/modifier.c	2009-10-19 11:50:01 UTC (rev 23949)
+++ trunk/blender/source/blender/blenkernel/intern/modifier.c	2009-10-19 12:13:32 UTC (rev 23950)
@@ -1187,9 +1187,9 @@
 
 	/* need to avoid infinite recursion here */
 	if(amd->start_cap && amd->start_cap != ob)
-		start_cap = mesh_get_derived_final(scene, amd->start_cap, CD_MASK_MESH);
+		start_cap = amd->start_cap->derivedFinal;
 	if(amd->end_cap && amd->end_cap != ob)
-		end_cap = mesh_get_derived_final(scene, amd->end_cap, CD_MASK_MESH);
+		end_cap = amd->end_cap->derivedFinal;
 
 	Mat4One(offset);
 
@@ -6356,7 +6356,7 @@
 {
 	// XXX doesn't handle derived data
 	BooleanModifierData *bmd = (BooleanModifierData*) md;
-	DerivedMesh *dm = mesh_get_derived_final(md->scene, bmd->object, CD_MASK_BAREMESH);
+	DerivedMesh *dm = bmd->object->derivedFinal;
 
 	/* we do a quick sanity check */
 	if(dm && (derivedData->getNumFaces(derivedData) > 3)

Modified: trunk/blender/source/blender/editors/interface/interface_layout.c
===================================================================
--- trunk/blender/source/blender/editors/interface/interface_layout.c	2009-10-19 11:50:01 UTC (rev 23949)
+++ trunk/blender/source/blender/editors/interface/interface_layout.c	2009-10-19 12:13:32 UTC (rev 23950)
@@ -1054,10 +1054,14 @@
 {
 	uiBut *but= arg_but;
 	char *name;
-	int i, iconid;
+	int i, iconid, flag= RNA_property_flag(but->rnaprop);
 
 	i = 0;
 	RNA_PROP_BEGIN(&but->rnasearchpoin, itemptr, but->rnasearchprop) {
+		if(flag & PROP_ID_SELF_CHECK)
+			if(itemptr.data == but->rnapoin.id.data)
+				continue;
+
 		iconid= 0;
 		if(RNA_struct_is_ID(itemptr.type))
 			iconid= ui_id_icon_get((bContext*)C, itemptr.data);

Modified: trunk/blender/source/blender/editors/mesh/loopcut.c
===================================================================
--- trunk/blender/source/blender/editors/mesh/loopcut.c	2009-10-19 11:50:01 UTC (rev 23949)
+++ trunk/blender/source/blender/editors/mesh/loopcut.c	2009-10-19 12:13:32 UTC (rev 23950)
@@ -480,5 +480,5 @@
 	ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO|OPTYPE_BLOCKING;
 
 	/* properties */
-	RNA_def_int(ot->srna, "number_cuts", 1, 1, 10, "Number of Cuts", "", 1, INT_MAX);
+	RNA_def_int(ot->srna, "number_cuts", 1, 1, INT_MAX, "Number of Cuts", "", 1, 10);
 }

Modified: trunk/blender/source/blender/makesrna/RNA_types.h
===================================================================
--- trunk/blender/source/blender/makesrna/RNA_types.h	2009-10-19 11:50:01 UTC (rev 23949)
+++ trunk/blender/source/blender/makesrna/RNA_types.h	2009-10-19 12:13:32 UTC (rev 23950)
@@ -159,7 +159,6 @@
 	/* disallow assigning a variable to its self, eg an object tracking its self
 	 * only apply this to types that are derived from an ID ()*/
 	PROP_ID_SELF_CHECK = 1<<20,
-
 	PROP_NEVER_NULL = 1<<18,
 
 	/* internal flags */

Modified: trunk/blender/source/blender/makesrna/intern/rna_modifier.c
===================================================================
--- trunk/blender/source/blender/makesrna/intern/rna_modifier.c	2009-10-19 11:50:01 UTC (rev 23949)
+++ trunk/blender/source/blender/makesrna/intern/rna_modifier.c	2009-10-19 12:13:32 UTC (rev 23950)
@@ -331,72 +331,73 @@
 	*max = mmd->totlvl;
 }
 
-static void modifier_object_set(Object **ob_p, int type, PointerRNA value)
+static void modifier_object_set(Object *self, Object **ob_p, int type, PointerRNA value)
 {
 	Object *ob= value.data;
 
-	if(!ob || ob->type == type)
-		*ob_p= ob;
+	if(!self || ob != self)
+		if(!ob || ob->type == type)
+			*ob_p= ob;
 }
 
 static void rna_LatticeModifier_object_set(PointerRNA *ptr, PointerRNA value)
 {
-	modifier_object_set(&((LatticeModifierData*)ptr->data)->object, OB_LATTICE, value);
+	modifier_object_set(ptr->id.data, &((LatticeModifierData*)ptr->data)->object, OB_LATTICE, value);
 }
 
 static void rna_BooleanModifier_object_set(PointerRNA *ptr, PointerRNA value)
 {
-	modifier_object_set(&((BooleanModifierData*)ptr->data)->object, OB_MESH, value);
+	modifier_object_set(ptr->id.data, &((BooleanModifierData*)ptr->data)->object, OB_MESH, value);
 }
 
 static void rna_CurveModifier_object_set(PointerRNA *ptr, PointerRNA value)
 {
-	modifier_object_set(&((CurveModifierData*)ptr->data)->object, OB_CURVE, value);
+	modifier_object_set(ptr->id.data, &((CurveModifierData*)ptr->data)->object, OB_CURVE, value);
 }
 
 static void rna_CastModifier_object_set(PointerRNA *ptr, PointerRNA value)
 {
-	modifier_object_set(&((CastModifierData*)ptr->data)->object, OB_MESH, value);
+	modifier_object_set(ptr->id.data, &((CastModifierData*)ptr->data)->object, OB_MESH, value);
 }
 
 static void rna_ArmatureModifier_object_set(PointerRNA *ptr, PointerRNA value)
 {
-	modifier_object_set(&((ArmatureModifierData*)ptr->data)->object, OB_ARMATURE, value);
+	modifier_object_set(ptr->id.data, &((ArmatureModifierData*)ptr->data)->object, OB_ARMATURE, value);
 }
 
 static void rna_MaskModifier_armature_set(PointerRNA *ptr, PointerRNA value)
 {
-	modifier_object_set(&((MaskModifierData*)ptr->data)->ob_arm, OB_ARMATURE, value);
+	modifier_object_set(ptr->id.data, &((MaskModifierData*)ptr->data)->ob_arm, OB_ARMATURE, value);
 }
 
 static void rna_ShrinkwrapModifier_auxiliary_target_set(PointerRNA *ptr, PointerRNA value)
 {
-	modifier_object_set(&((ShrinkwrapModifierData*)ptr->data)->auxTarget, OB_MESH, value);
+	modifier_object_set(ptr->id.data, &((ShrinkwrapModifierData*)ptr->data)->auxTarget, OB_MESH, value);
 }
 
 static void rna_ShrinkwrapModifier_target_set(PointerRNA *ptr, PointerRNA value)
 {
-	modifier_object_set(&((ShrinkwrapModifierData*)ptr->data)->target, OB_MESH, value);
+	modifier_object_set(ptr->id.data, &((ShrinkwrapModifierData*)ptr->data)->target, OB_MESH, value);
 }
 
 static void rna_MeshDeformModifier_object_set(PointerRNA *ptr, PointerRNA value)
 {
-	modifier_object_set(&((MeshDeformModifierData*)ptr->data)->object, OB_MESH, value);
+	modifier_object_set(ptr->id.data, &((MeshDeformModifierData*)ptr->data)->object, OB_MESH, value);
 }
 
 static void rna_ArrayModifier_end_cap_set(PointerRNA *ptr, PointerRNA value)
 {
-	modifier_object_set(&((ArrayModifierData*)ptr->data)->end_cap, OB_MESH, value);
+	modifier_object_set(ptr->id.data, &((ArrayModifierData*)ptr->data)->end_cap, OB_MESH, value);
 }
 
 static void rna_ArrayModifier_start_cap_set(PointerRNA *ptr, PointerRNA value)
 {
-	modifier_object_set(&((ArrayModifierData*)ptr->data)->start_cap, OB_MESH, value);
+	modifier_object_set(ptr->id.data, &((ArrayModifierData*)ptr->data)->start_cap, OB_MESH, value);
 }
 
 static void rna_ArrayModifier_curve_set(PointerRNA *ptr, PointerRNA value)
 {
-	modifier_object_set(&((ArrayModifierData*)ptr->data)->curve_ob, OB_CURVE, value);
+	modifier_object_set(ptr->id.data, &((ArrayModifierData*)ptr->data)->curve_ob, OB_CURVE, value);
 }
 
 static int rna_MeshDeformModifier_is_bound_get(PointerRNA *ptr)
@@ -534,7 +535,7 @@
 	prop= RNA_def_property(srna, "object", PROP_POINTER, PROP_NONE);
 	RNA_def_property_ui_text(prop, "Object", "Lattice object to deform with.");
 	RNA_def_property_pointer_funcs(prop, NULL, "rna_LatticeModifier_object_set", NULL);
-	RNA_def_property_flag(prop, PROP_EDITABLE);
+	RNA_def_property_flag(prop, PROP_EDITABLE|PROP_ID_SELF_CHECK);
 	RNA_def_property_update(prop, 0, "rna_Modifier_dependency_update");
 
 	prop= RNA_def_property(srna, "vertex_group", PROP_STRING, PROP_NONE);
@@ -566,7 +567,7 @@
 	prop= RNA_def_property(srna, "object", PROP_POINTER, PROP_NONE);
 	RNA_def_property_ui_text(prop, "Object", "Curve object to deform with.");
 	RNA_def_property_pointer_funcs(prop, NULL, "rna_CurveModifier_object_set", NULL);
-	RNA_def_property_flag(prop, PROP_EDITABLE);
+	RNA_def_property_flag(prop, PROP_EDITABLE|PROP_ID_SELF_CHECK);
 	RNA_def_property_update(prop, 0, "rna_Modifier_dependency_update");
 
 	prop= RNA_def_property(srna, "vertex_group", PROP_STRING, PROP_NONE);
@@ -667,7 +668,7 @@
 	prop= RNA_def_property(srna, "mirror_object", PROP_POINTER, PROP_NONE);
 	RNA_def_property_pointer_sdna(prop, NULL, "mirror_ob");
 	RNA_def_property_ui_text(prop, "Mirror Object", "Object to use as mirror.");
-	RNA_def_property_flag(prop, PROP_EDITABLE);
+	RNA_def_property_flag(prop, PROP_EDITABLE|PROP_ID_SELF_CHECK);
 	RNA_def_property_update(prop, 0, "rna_Modifier_dependency_update");
 }
 
@@ -857,7 +858,7 @@
 	prop= RNA_def_property(srna, "object", PROP_POINTER, PROP_NONE);
 	RNA_def_property_ui_text(prop, "Object", "Armature object to deform with.");
 	RNA_def_property_pointer_funcs(prop, NULL, "rna_ArmatureModifier_object_set", NULL);
-	RNA_def_property_flag(prop, PROP_EDITABLE);
+	RNA_def_property_flag(prop, PROP_EDITABLE|PROP_ID_SELF_CHECK);
 	RNA_def_property_update(prop, 0, "rna_Modifier_dependency_update");
 
 	prop= RNA_def_property(srna, "vertex_group", PROP_STRING, PROP_NONE);
@@ -920,7 +921,7 @@
 
 	prop= RNA_def_property(srna, "object", PROP_POINTER, PROP_NONE);
 	RNA_def_property_ui_text(prop, "Object", "Parent Object for hook, also recalculates and clears offset");
-	RNA_def_property_flag(prop, PROP_EDITABLE);
+	RNA_def_property_flag(prop, PROP_EDITABLE|PROP_ID_SELF_CHECK);
 	RNA_def_property_update(prop, 0, "rna_Modifier_dependency_update");
 	
 	prop= RNA_def_property(srna, "subtarget", PROP_STRING, PROP_NONE);
@@ -977,7 +978,7 @@
 	prop= RNA_def_property(srna, "object", PROP_POINTER, PROP_NONE);
 	RNA_def_property_ui_text(prop, "Object", "Mesh object to use for boolean operation.");
 	RNA_def_property_pointer_funcs(prop, NULL, "rna_BooleanModifier_object_set", NULL);
-	RNA_def_property_flag(prop, PROP_EDITABLE);
+	RNA_def_property_flag(prop, PROP_EDITABLE|PROP_ID_SELF_CHECK);
 	RNA_def_property_update(prop, 0, "rna_Modifier_dependency_update");
 
 	prop= RNA_def_property(srna, "operation", PROP_ENUM, PROP_NONE);
@@ -1024,7 +1025,7 @@
 	RNA_def_property_pointer_sdna(prop, NULL, "curve_ob");
 	RNA_def_property_ui_text(prop, "Curve", "Curve object to fit array length to.");
 	RNA_def_property_pointer_funcs(prop, NULL, "rna_ArrayModifier_curve_set", NULL);
-	RNA_def_property_flag(prop, PROP_EDITABLE);
+	RNA_def_property_flag(prop, PROP_EDITABLE|PROP_ID_SELF_CHECK);
 	RNA_def_property_update(prop, 0, "rna_Modifier_dependency_update");
 
 	/* Offset parameters */
@@ -1075,20 +1076,20 @@

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list