[Bf-extensions-cvs] SVN commit: /data/svn/bf-extensions [3544] trunk/py/scripts/addons/ object_fracture_voroni/cell_fracture.py: remove unused code, some minor cleanup
Campbell Barton
ideasman42 at gmail.com
Wed Jun 27 12:28:15 CEST 2012
Revision: 3544
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-extensions&revision=3544
Author: campbellbarton
Date: 2012-06-27 10:28:07 +0000 (Wed, 27 Jun 2012)
Log Message:
-----------
remove unused code, some minor cleanup
Modified Paths:
--------------
trunk/py/scripts/addons/object_fracture_voroni/cell_fracture.py
Modified: trunk/py/scripts/addons/object_fracture_voroni/cell_fracture.py
===================================================================
--- trunk/py/scripts/addons/object_fracture_voroni/cell_fracture.py 2012-06-27 10:15:58 UTC (rev 3543)
+++ trunk/py/scripts/addons/object_fracture_voroni/cell_fracture.py 2012-06-27 10:28:07 UTC (rev 3544)
@@ -21,169 +21,26 @@
# Script copyright (C) Blender Foundation 2012
-# -----------------------------------------------------------------------------
-# copied from bullet 2.8
-def areVerticesBehindPlane(planeNormal, vertices, margin):
- planeNormal_xyz_dot = planeNormal.xyz.dot # speedup
- for i, N1 in enumerate(vertices):
- dist = planeNormal_xyz_dot(N1) + planeNormal[3] - margin
- if dist > 0.0:
- return False
- return True
-
-
-def notExist(planeEquation, planeEquations):
- for N1 in planeEquations:
- if planeEquation.dot(N1) > 0.999:
- return False
- return True
-
-
-def getPlaneEquationsFromVertices(vertices):
- planeEquationsOut = []
- for i, N1 in enumerate(vertices):
- for j in range(i + 1, len(vertices)):
- N2 = vertices[j]
- for k in range(j + 1, len(vertices)):
- N3 = vertices[k]
- # btVector3 planeEquation,edge0,edge1;
- edge0 = N2 - N1
- edge1 = N3 - N1
- normalSign = 1.0
- for normalSign in (1.0, -1.0):
- planeEquation = normalSign * edge0.cross(edge1)
- if planeEquation.length_squared > 0.0001:
- planeEquation.normalize()
- if notExist(planeEquation, planeEquationsOut):
- planeEquation.resize_4d()
- planeEquation[3] = -planeEquation.xyz.dot(N1)
-
- # check if inside, and replace supportingVertexOut if needed
- if areVerticesBehindPlane(planeEquation, vertices, 0.01):
- planeEquationsOut.append(planeEquation)
- return planeEquationsOut
-
-# end bullet copy
-# ---------------
-
-T = [0.0]
-# phymecutils.c
-def getVerticesInsidePlanes(planes, verticesOut, planeIndicesOut):
- if 1:
- import mathutils
- r = mathutils.geometry.points_in_planes(planes)
- verticesOut[:] = r[0]
- #planeIndicesOut[:] = r[1]
- planeIndicesOut.clear()
- planeIndicesOut.update(set(r[1]))
- # print(verticesOut)
- return
-
- # populates verticesOut
- # std::set<int>& planeIndicesOut
- # Based on btGeometryUtil.cpp (Gino van den Bergen / Erwin Coumans)
- tt = time.time()
- verticesOut[:] = []
- planeIndicesOut.clear()
-
- for i in range(len(planes)):
- N1 = planes[i]
- for j in range(i + 1, len(planes)):
- N2 = planes[j]
- n1n2 = N1.xyz.cross(N2.xyz)
- if n1n2.length_squared > 0.0001:
- for k in range(j + 1, len(planes)):
- N3 = planes[k]
- n2n3 = N2.xyz.cross(N3.xyz)
- n3n1 = N3.xyz.cross(N1.xyz)
- if (n2n3.length_squared > 0.0001) and (n3n1.length_squared > 0.0001):
- quotient = N1.xyz.dot(n2n3)
- if abs(quotient) > 0.0001:
- potentialVertex = (n2n3 * N1[3] + n3n1 * N2[3] + n1n2 * N3[3]) * (-1.0 / quotient)
-
- ok = True
- for l in range(len(planes)):
- NP = planes[l]
- if NP.xyz.dot(potentialVertex) + NP[3] > 0.000001:
- ok = False
- break
-
- if ok == True:
- # vertex (three plane intersection) inside all planes
- verticesOut.append(potentialVertex)
- planeIndicesOut |= {i, j, k}
- T[0] += time.time() - tt
-
-
def points_as_bmesh_cells(verts, points):
- """Generator for bmesh hull"""
+ import mathutils
+ from mathutils import Vector
cells = []
sortedVoronoiPoints = [p for p in points]
-
- planeIndices = set()
-
+ plane_indices = []
vertices = []
- # each convex hull is one bmesh
- if 0:
- convexPlanes = getPlaneEquationsFromVertices(verts)
- elif 0:
- # Faster for large meshes...
- convexPlanes = []
-
- # get the convex hull
- import bmesh
- bm = bmesh.new()
- for v in verts:
- bm_vert = bm.verts.new(v)
- bm_vert.tag = True
- bmesh.ops.convex_hull(bm, {'TAG'})
-
- # offset a tiny bit
- bm.normal_update()
- for v in bm.verts:
- v.co += v.normal * 0.01
-
- # collect the planes
- for f in bm.faces:
- v0, v1, v2 = [v.co for v in f.verts[0:3]]
- plane = (v1 - v0).cross(v2 - v0).normalized()
- plane.resize_4d()
- plane[3] = -plane.xyz.dot(v0)
- convexPlanes.append(plane)
- bm.free()
- elif 0:
- # get 4 planes
+ # there are many ways we could get planes - convex hull for eg
+ # but it ends up fastest if we just use bounding box
+ if 1:
xa = [v[0] for v in verts]
ya = [v[1] for v in verts]
za = [v[2] for v in verts]
-
- xr = min(xa), max(xa)
- yr = min(ya), max(ya)
- zr = min(za), max(za)
-
- verts_tmp = []
- from mathutils import Vector
- for xi in (0, 1):
- for yi in (0, 1):
- for zi in (0, 1):
- verts_tmp.append(Vector((xr[xi], yr[yi], zr[zi])))
-
- convexPlanes = getPlaneEquationsFromVertices(verts_tmp)
- aaa = "\n".join(sorted([repr(v.to_tuple(5)).replace("-0.0", "0.0") for v in convexPlanes]))
- print(aaa)
- else:
- xa = [v[0] for v in verts]
- ya = [v[1] for v in verts]
- za = [v[2] for v in verts]
-
xmin, xmax = min(xa), max(xa)
ymin, ymax = min(ya), max(ya)
zmin, zmax = min(za), max(za)
- from mathutils import Vector
convexPlanes = [
Vector((+1.0, 0.0, 0.0, -abs(xmax))),
Vector((-1.0, 0.0, 0.0, -abs(xmin))),
@@ -192,9 +49,6 @@
Vector((0.0, 0.0, +1.0, -abs(zmax))),
Vector((0.0, 0.0, -1.0, -abs(zmin))),
]
-
- aaa = "\n".join(sorted([repr(v.to_tuple(5)) for v in convexPlanes]))
- print(aaa)
for i, curVoronoiPoint in enumerate(points):
planes = [None] * len(convexPlanes)
@@ -204,8 +58,6 @@
maxDistance = 10000000000.0 # a big value!
sortedVoronoiPoints.sort(key=lambda p: (p - curVoronoiPoint).length_squared)
- # sortedVoronoiPoints.reverse()
- # XXX need to reverse?
for j in range(1, len(points)):
normal = sortedVoronoiPoints[j] - curVoronoiPoint
@@ -216,21 +68,15 @@
plane = normal.normalized()
plane.resize_4d()
plane[3] = -nlength / 2.0
- planes.append(plane.copy())
- getVerticesInsidePlanes(planes, vertices, planeIndices)
+ planes.append(plane)
+
+ vertices[:], plane_indices[:] = mathutils.geometry.points_in_planes(planes)
if len(vertices) == 0:
break
- numPlaneIndices = len(planeIndices)
- if numPlaneIndices != len(planes):
- #'''
- planeIndicesIter = list(sorted(planeIndices))
- for k in range(numPlaneIndices):
- if k != planeIndicesIter[k]:
- planes[k] = planes[planeIndicesIter[k]].copy()
- planes[numPlaneIndices:] = []
- #'''
- #planes[:] = [planes[k] for k in planeIndices]
+ if len(plane_indices) != len(planes):
+ planes[:] = [planes[k] for k in plane_indices]
+
maxDistance = vertices[0].length
for k in range(1, len(vertices)):
distance = vertices[k].length
@@ -294,10 +140,9 @@
print(len(cells))
-if __name__ == "__main__"
+if __name__ == "__main__":
import time
t = time.time()
main()
print("%.5f sec" % (time.time() - t))
- print("%.5f aa" % T[0])
More information about the Bf-extensions-cvs
mailing list