Simplify code flow a bit

Use if branches for the unhappy flow, so that it's clear that this behaves as an early-out. This also prevents the need for declaring variables out of scope, which is not an issue with Python anyway.
This commit is contained in:
Ghostkeeper 2018-01-04 17:23:43 +01:00
parent 564a97d5a8
commit 2c45efb70d
No known key found for this signature in database
GPG key ID: 5252B696FB5E7C7A

View file

@ -160,48 +160,47 @@ class ConvexHullDecorator(SceneNodeDecorator):
return offset_hull return offset_hull
else: else:
if not self._node.getMeshData(): #Node has no mesh data, so just return an empty Polygon.
return Polygon([])
offset_hull = None offset_hull = None
mesh = None mesh = self._node.getMeshData()
world_transform = None world_transform = self._node.getWorldTransformation()
if self._node.getMeshData():
mesh = self._node.getMeshData()
world_transform = self._node.getWorldTransformation()
# Check the cache # Check the cache
if mesh is self._2d_convex_hull_mesh and world_transform == self._2d_convex_hull_mesh_world_transform: if mesh is self._2d_convex_hull_mesh and world_transform == self._2d_convex_hull_mesh_world_transform:
return self._2d_convex_hull_mesh_result return self._2d_convex_hull_mesh_result
vertex_data = mesh.getConvexHullTransformedVertices(world_transform) vertex_data = mesh.getConvexHullTransformedVertices(world_transform)
# Don't use data below 0. # Don't use data below 0.
# TODO; We need a better check for this as this gives poor results for meshes with long edges. # TODO; We need a better check for this as this gives poor results for meshes with long edges.
# Do not throw away vertices: the convex hull may be too small and objects can collide. # Do not throw away vertices: the convex hull may be too small and objects can collide.
# vertex_data = vertex_data[vertex_data[:,1] >= -0.01] # vertex_data = vertex_data[vertex_data[:,1] >= -0.01]
if vertex_data and len(vertex_data) >= 4: if not vertex_data or len(vertex_data) < 4:
# Round the vertex data to 1/10th of a mm, then remove all duplicate vertices return Polygon([])
# This is done to greatly speed up further convex hull calculations as the convex hull # Round the vertex data to 1/10th of a mm, then remove all duplicate vertices
# becomes much less complex when dealing with highly detailed models. # This is done to greatly speed up further convex hull calculations as the convex hull
vertex_data = numpy.round(vertex_data, 1) # becomes much less complex when dealing with highly detailed models.
vertex_data = numpy.round(vertex_data, 1)
vertex_data = vertex_data[:, [0, 2]] # Drop the Y components to project to 2D. vertex_data = vertex_data[:, [0, 2]] # Drop the Y components to project to 2D.
# Grab the set of unique points. # Grab the set of unique points.
# #
# This basically finds the unique rows in the array by treating them as opaque groups of bytes # This basically finds the unique rows in the array by treating them as opaque groups of bytes
# which are as long as the 2 float64s in each row, and giving this view to numpy.unique() to munch. # which are as long as the 2 float64s in each row, and giving this view to numpy.unique() to munch.
# See http://stackoverflow.com/questions/16970982/find-unique-rows-in-numpy-array # See http://stackoverflow.com/questions/16970982/find-unique-rows-in-numpy-array
vertex_byte_view = numpy.ascontiguousarray(vertex_data).view( vertex_byte_view = numpy.ascontiguousarray(vertex_data).view(
numpy.dtype((numpy.void, vertex_data.dtype.itemsize * vertex_data.shape[1]))) numpy.dtype((numpy.void, vertex_data.dtype.itemsize * vertex_data.shape[1])))
_, idx = numpy.unique(vertex_byte_view, return_index=True) _, idx = numpy.unique(vertex_byte_view, return_index=True)
vertex_data = vertex_data[idx] # Select the unique rows by index. vertex_data = vertex_data[idx] # Select the unique rows by index.
hull = Polygon(vertex_data) hull = Polygon(vertex_data)
if len(vertex_data) >= 3: if len(vertex_data) >= 3:
convex_hull = hull.getConvexHull() convex_hull = hull.getConvexHull()
offset_hull = self._offsetHull(convex_hull) offset_hull = self._offsetHull(convex_hull)
else:
return Polygon([]) # Node has no mesh data, so just return an empty Polygon.
# Store the result in the cache # Store the result in the cache
self._2d_convex_hull_mesh = mesh self._2d_convex_hull_mesh = mesh