diff --git a/object_fracture_cell/__init__.py b/object_fracture_cell/__init__.py index 15bc18862331dab46d5cead3a1b7ea8a0c7132d9..f6c73c71a6eda8e58aa3cf8329179b37da1c6f24 100644 --- a/object_fracture_cell/__init__.py +++ b/object_fracture_cell/__init__.py @@ -52,6 +52,7 @@ def main_object(scene, obj, level, **kw): use_remove_original = kw_copy.pop("use_remove_original") recursion = kw_copy.pop("recursion") recursion_source_limit = kw_copy.pop("recursion_source_limit") + recursion_clamp = kw_copy.pop("recursion_clamp") recursion_chance = kw_copy.pop("recursion_chance") recursion_chance_select = kw_copy.pop("recursion_chance_select") use_layer_next = kw_copy.pop("use_layer_next") @@ -89,41 +90,47 @@ def main_object(scene, obj, level, **kw): bpy.ops.object.origin_set({"selected_editable_objects": objects}, type='ORIGIN_GEOMETRY', center='MEDIAN') - if level < recursion: - - objects_recurse_input = [(i, o) for i, o in enumerate(objects)] - - if recursion_chance != 1.0: - from mathutils import Vector - if recursion_chance_select == 'RANDOM': - random.shuffle(objects_recurse_input) - elif recursion_chance_select in {'SIZE_MIN', 'SIZE_MAX'}: - objects_recurse_input.sort(key=lambda ob_pair: - (Vector(ob_pair[1].bound_box[0]) - - Vector(ob_pair[1].bound_box[6])).length_squared) - if recursion_chance_select == 'SIZE_MAX': - objects_recurse_input.reverse() - elif recursion_chance_select in {'CURSOR_MIN', 'CURSOR_MAX'}: - c = scene.cursor_location.copy() - objects_recurse_input.sort(key=lambda ob_pair: - (ob_pair[1].location - c).length_squared) - if recursion_chance_select == 'CURSOR_MAX': - objects_recurse_input.reverse() - - objects_recurse_input[int(recursion_chance * len(objects_recurse_input)):] = [] - objects_recurse_input.sort() - - # reverse index values so we can remove from original list. - objects_recurse_input.reverse() - - objects_recursive = [] - for i, obj_cell in objects_recurse_input: - assert(objects[i] is obj_cell) - objects_recursive += main_object(scene, obj_cell, level + 1, **kw) - if use_remove_original: - scene.objects.unlink(obj_cell) - del objects[i] - objects.extend(objects_recursive) + if level == 0: + for level_sub in range(1, recursion + 1): + + objects_recurse_input = [(i, o) for i, o in enumerate(objects)] + + if recursion_chance != 1.0: + from mathutils import Vector + if recursion_chance_select == 'RANDOM': + random.shuffle(objects_recurse_input) + elif recursion_chance_select in {'SIZE_MIN', 'SIZE_MAX'}: + objects_recurse_input.sort(key=lambda ob_pair: + (Vector(ob_pair[1].bound_box[0]) - + Vector(ob_pair[1].bound_box[6])).length_squared) + if recursion_chance_select == 'SIZE_MAX': + objects_recurse_input.reverse() + elif recursion_chance_select in {'CURSOR_MIN', 'CURSOR_MAX'}: + c = scene.cursor_location.copy() + objects_recurse_input.sort(key=lambda ob_pair: + (ob_pair[1].location - c).length_squared) + if recursion_chance_select == 'CURSOR_MAX': + objects_recurse_input.reverse() + + objects_recurse_input[int(recursion_chance * len(objects_recurse_input)):] = [] + objects_recurse_input.sort() + + # reverse index values so we can remove from original list. + objects_recurse_input.reverse() + + objects_recursive = [] + for i, obj_cell in objects_recurse_input: + assert(objects[i] is obj_cell) + objects_recursive += main_object(scene, obj_cell, level_sub, **kw) + if use_remove_original: + scene.objects.unlink(obj_cell) + del objects[i] + if recursion_clamp and len(objects) + len(objects_recursive) >= recursion_clamp: + break + objects.extend(objects_recursive) + + if recursion_clamp and len(objects) > recursion_clamp: + break #-------------- # Level Options @@ -293,11 +300,18 @@ class FractureCell(Operator): default=8, ) + recursion_clamp = IntProperty( + name="Clamp Recursion", + description="Finish recursion when this number of objects is reached (prevents recursing for extended periods of time), zero disables", + min=0, max=10000, + default=250, + ) + recursion_chance = FloatProperty( name="Random Factor", description="Likelyhood of recursion", min=0.0, max=1.0, - default=0.5, + default=0.25, ) recursion_chance_select = EnumProperty( @@ -473,6 +487,7 @@ class FractureCell(Operator): rowsub = col.row(align=True) rowsub.prop(self, "recursion") rowsub.prop(self, "recursion_source_limit") + rowsub.prop(self, "recursion_clamp") rowsub = col.row() rowsub.prop(self, "recursion_chance") rowsub.prop(self, "recursion_chance_select", expand=True)