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. @@ _______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org http://lists.blender.org/mailman/listinfo/bf-blender-cvs