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

added margin option

parent 65bddd7c
No related branches found
No related tags found
No related merge requests found
......@@ -54,9 +54,7 @@ def main_object(scene, obj, level, **kw):
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
objects = fracture_cell_setup.cell_fracture_objects(scene, obj, **kw_copy)
......@@ -92,7 +90,7 @@ def main_object(scene, obj, level, **kw):
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':
if recursion_chance_select == 'CURSOR_MAX':
objects_recurse_input.reverse()
objects_recurse_input[int(recursion_chance * len(objects_recurse_input)):] = []
......@@ -193,6 +191,13 @@ class FractureCell(Operator):
default=True,
)
margin = FloatProperty(
name="Margin",
description="Gaps for the fracture (gives more stable physics)",
min=0.0, max=1.0,
default=0.001,
)
# -------------------------------------------------------------------------
# Object Options
......@@ -230,8 +235,8 @@ class FractureCell(Operator):
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"),
('CURSOR_MIN', "Cursor Close", "Recursively subdivide objects closer to the cursor"),
('CURSOR_MAX', "Cursor Far", "Recursively subdivide objects closer to the cursor"),
),
default='SIZE_MIN',
)
......@@ -247,7 +252,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)
return wm.invoke_props_dialog(self, width=1000)
def draw(self, context):
layout = self.layout
......@@ -268,6 +273,7 @@ class FractureCell(Operator):
rowsub.prop(self, "use_smooth_faces")
rowsub.prop(self, "use_smooth_edges")
rowsub.prop(self, "use_data_match")
rowsub.prop(self, "margin")
# rowsub.prop(self, "use_island_split") # TODO
box = layout.box()
......
......@@ -21,7 +21,9 @@
# Script copyright (C) Blender Foundation 2012
def points_as_bmesh_cells(verts, points, margin=0.01):
def points_as_bmesh_cells(verts, points,
margin_bounds=0.01,
margin_cell=0.0):
import mathutils
from mathutils import Vector
......@@ -38,9 +40,9 @@ def points_as_bmesh_cells(verts, points, margin=0.01):
ya = [v[1] for v in verts]
za = [v[2] for v in verts]
xmin, xmax = min(xa) - margin, max(xa) + margin
ymin, ymax = min(ya) - margin, max(ya) + margin
zmin, zmax = min(za) - margin, max(za) + margin
xmin, xmax = min(xa) - margin_bounds, max(xa) + margin_bounds
ymin, ymax = min(ya) - margin_bounds, max(ya) + margin_bounds
zmin, zmax = min(za) - margin_bounds, max(za) + margin_bounds
convexPlanes = [
Vector((+1.0, 0.0, 0.0, -abs(xmax))),
Vector((-1.0, 0.0, 0.0, -abs(xmin))),
......@@ -67,7 +69,7 @@ def points_as_bmesh_cells(verts, points, margin=0.01):
plane = normal.normalized()
plane.resize_4d()
plane[3] = -nlength / 2.0
plane[3] = (-nlength / 2.0) + margin_cell
planes.append(plane)
vertices[:], plane_indices[:] = mathutils.geometry.points_in_planes(planes)
......
......@@ -123,6 +123,7 @@ def cell_fracture_objects(scene, obj,
use_smooth_edges=True,
use_data_match=False,
use_island_split=False,
margin=0.0,
):
from . import fracture_cell_calc
......@@ -173,7 +174,8 @@ def cell_fracture_objects(scene, obj,
matrix = obj.matrix_world.copy()
verts = [matrix * v.co for v in mesh.vertices]
cells = fracture_cell_calc.points_as_bmesh_cells(verts, points)
cells = fracture_cell_calc.points_as_bmesh_cells(verts, points,
margin_cell=margin)
# some hacks here :S
cell_name = obj.name + "_cell"
......@@ -259,7 +261,7 @@ def cell_fracture_objects(scene, obj,
game = obj_cell.game
game.physics_type = 'RIGID_BODY'
game.use_collision_bounds = True
game.collision_bounds_type = 'TRIANGLE_MESH'
game.collision_bounds_type = 'CONVEX_HULL'
return objects
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment