Skip to content
Snippets Groups Projects
Commit acf6e61a authored by Campbell Barton's avatar Campbell Barton
Browse files

change how recursion works, now keep scanning all input to re-shatter

parent 526bfd81
No related branches found
No related tags found
No related merge requests found
...@@ -52,6 +52,7 @@ def main_object(scene, obj, level, **kw): ...@@ -52,6 +52,7 @@ def main_object(scene, obj, level, **kw):
use_remove_original = kw_copy.pop("use_remove_original") use_remove_original = kw_copy.pop("use_remove_original")
recursion = kw_copy.pop("recursion") recursion = kw_copy.pop("recursion")
recursion_source_limit = kw_copy.pop("recursion_source_limit") 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 = kw_copy.pop("recursion_chance")
recursion_chance_select = kw_copy.pop("recursion_chance_select") recursion_chance_select = kw_copy.pop("recursion_chance_select")
use_layer_next = kw_copy.pop("use_layer_next") use_layer_next = kw_copy.pop("use_layer_next")
...@@ -89,41 +90,47 @@ def main_object(scene, obj, level, **kw): ...@@ -89,41 +90,47 @@ def main_object(scene, obj, level, **kw):
bpy.ops.object.origin_set({"selected_editable_objects": objects}, bpy.ops.object.origin_set({"selected_editable_objects": objects},
type='ORIGIN_GEOMETRY', center='MEDIAN') type='ORIGIN_GEOMETRY', center='MEDIAN')
if level < recursion: if level == 0:
for level_sub in range(1, recursion + 1):
objects_recurse_input = [(i, o) for i, o in enumerate(objects)]
objects_recurse_input = [(i, o) for i, o in enumerate(objects)]
if recursion_chance != 1.0:
from mathutils import Vector if recursion_chance != 1.0:
if recursion_chance_select == 'RANDOM': from mathutils import Vector
random.shuffle(objects_recurse_input) if recursion_chance_select == 'RANDOM':
elif recursion_chance_select in {'SIZE_MIN', 'SIZE_MAX'}: random.shuffle(objects_recurse_input)
objects_recurse_input.sort(key=lambda ob_pair: elif recursion_chance_select in {'SIZE_MIN', 'SIZE_MAX'}:
(Vector(ob_pair[1].bound_box[0]) - objects_recurse_input.sort(key=lambda ob_pair:
Vector(ob_pair[1].bound_box[6])).length_squared) (Vector(ob_pair[1].bound_box[0]) -
if recursion_chance_select == 'SIZE_MAX': Vector(ob_pair[1].bound_box[6])).length_squared)
objects_recurse_input.reverse() if recursion_chance_select == 'SIZE_MAX':
elif recursion_chance_select in {'CURSOR_MIN', 'CURSOR_MAX'}: objects_recurse_input.reverse()
c = scene.cursor_location.copy() elif recursion_chance_select in {'CURSOR_MIN', 'CURSOR_MAX'}:
objects_recurse_input.sort(key=lambda ob_pair: c = scene.cursor_location.copy()
(ob_pair[1].location - c).length_squared) objects_recurse_input.sort(key=lambda ob_pair:
if recursion_chance_select == 'CURSOR_MAX': (ob_pair[1].location - c).length_squared)
objects_recurse_input.reverse() if recursion_chance_select == 'CURSOR_MAX':
objects_recurse_input.reverse()
objects_recurse_input[int(recursion_chance * len(objects_recurse_input)):] = []
objects_recurse_input.sort() 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() # reverse index values so we can remove from original list.
objects_recurse_input.reverse()
objects_recursive = []
for i, obj_cell in objects_recurse_input: objects_recursive = []
assert(objects[i] is obj_cell) for i, obj_cell in objects_recurse_input:
objects_recursive += main_object(scene, obj_cell, level + 1, **kw) assert(objects[i] is obj_cell)
if use_remove_original: objects_recursive += main_object(scene, obj_cell, level_sub, **kw)
scene.objects.unlink(obj_cell) if use_remove_original:
del objects[i] scene.objects.unlink(obj_cell)
objects.extend(objects_recursive) 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 # Level Options
...@@ -293,11 +300,18 @@ class FractureCell(Operator): ...@@ -293,11 +300,18 @@ class FractureCell(Operator):
default=8, 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( recursion_chance = FloatProperty(
name="Random Factor", name="Random Factor",
description="Likelyhood of recursion", description="Likelyhood of recursion",
min=0.0, max=1.0, min=0.0, max=1.0,
default=0.5, default=0.25,
) )
recursion_chance_select = EnumProperty( recursion_chance_select = EnumProperty(
...@@ -473,6 +487,7 @@ class FractureCell(Operator): ...@@ -473,6 +487,7 @@ class FractureCell(Operator):
rowsub = col.row(align=True) rowsub = col.row(align=True)
rowsub.prop(self, "recursion") rowsub.prop(self, "recursion")
rowsub.prop(self, "recursion_source_limit") rowsub.prop(self, "recursion_source_limit")
rowsub.prop(self, "recursion_clamp")
rowsub = col.row() rowsub = col.row()
rowsub.prop(self, "recursion_chance") rowsub.prop(self, "recursion_chance")
rowsub.prop(self, "recursion_chance_select", expand=True) rowsub.prop(self, "recursion_chance_select", expand=True)
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment