[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