diff --git a/object_fracture_voroni/__init__.py b/object_fracture_voroni/__init__.py index a63eef41567a6aa80d710defba4bd0936d796553..3b573ced0437488170532fbc6904c751a03ed071 100644 --- a/object_fracture_voroni/__init__.py +++ b/object_fracture_voroni/__init__.py @@ -53,6 +53,9 @@ def main_object(scene, obj, level, **kw): use_remove_original = kw_copy.pop("use_remove_original") recursion = kw_copy.pop("recursion") recursion_chance = kw_copy.pop("recursion_chance") + recursion_chance_select = kw_copy.pop("recursion_chance_select") + + print("AAAA", recursion_chance_select * 10) from . import fracture_cell_setup @@ -67,15 +70,44 @@ def main_object(scene, obj, level, **kw): type='ORIGIN_GEOMETRY', center='MEDIAN') if level < recursion: - objects_recursive = [] - for i in range(len(objects) - 1, -1, -1): # reverse loop + + objects_recurse_input = [(i, o) for i, o in enumerate(objects)] + + if recursion_chance != 1.0: - if recursion_chance == 1.0 or recursion_chance < random.random(): - obj_cell = objects[i] - objects_recursive += main_object(scene, obj_cell, level + 1, **kw) - if use_remove_original: - scene.objects.unlink(obj_cell) - del objects[i] + if 0: + random.shuffle(objects_recurse_input) + else: + from mathutils import Vector + if recursion_chance_select == 'RANDOM': + pass + elif recursion_chance_select == {'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 == {'CURSOR_MIN', 'CURSOR_MAX'}: + print(recursion_chance_select) + c = scene.cursor_location.copy() + objects_recurse_input.sort(key=lambda ob_pair: + (ob_pair[1].matrix_world.translation - c).length_squared) + if recursion_chance_select == 'SIZE_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) @@ -193,6 +225,17 @@ class FractureCell(Operator): default=1.0, ) + recursion_chance_select = EnumProperty( + name="Recurse Over", + items=(('RANDOM', "Random", ""), + ('SIZE_MIN', "Small", "Recursively subdivide smaller objects"), + ('SIZE_MAX', "Big", "Recursively subdivide smaller objects"), + ('CURSOR_MIN', "Cursor Min", "Recursively subdivide objects closer to the cursor"), + ('CURSOR_MAX', "Cursor Max", "Recursively subdivide objects closer to the cursor"), + ), + default='SIZE_MIN', + ) + def execute(self, context): keywords = self.as_keywords() # ignore=("blah",) @@ -202,6 +245,7 @@ class FractureCell(Operator): def invoke(self, context, event): + print(self.recursion_chance_select) wm = context.window_manager return wm.invoke_props_dialog(self, width=600) @@ -237,7 +281,9 @@ class FractureCell(Operator): col.label("Recursive Shatter") rowsub = col.row(align=True) rowsub.prop(self, "recursion") + rowsub = col.row() rowsub.prop(self, "recursion_chance") + rowsub.prop(self, "recursion_chance_select", expand=True) #def menu_func(self, context): # self.layout.menu("INFO_MT_add_fracture_objects", icon="PLUGIN") diff --git a/object_fracture_voroni/fracture_cell_setup.py b/object_fracture_voroni/fracture_cell_setup.py index 631f11e3411bd01b413ee9c7dc3d6065f10f67fc..8bbf7db57613204351a9228695c06226c7c0ab4d 100644 --- a/object_fracture_voroni/fracture_cell_setup.py +++ b/object_fracture_voroni/fracture_cell_setup.py @@ -234,7 +234,7 @@ def cell_fracture_objects(scene, obj, # currently only materials + data layers, could do others... mesh_src = obj.data for mat in mesh_src.materials: - mesh.materials.append(mat) + mesh_dst.materials.append(mat) for lay_attr in ("vertex_colors", "uv_layers"): lay_src = getattr(mesh_src, lay_attr) lay_dst = getattr(mesh_dst, lay_attr)