Skip to content
Snippets Groups Projects
Commit 8af9ef7f authored by Paul McCarthy's avatar Paul McCarthy :mountain_bicyclist:
Browse files

RF: Mesh class potentially stores teo copies of triangles with opposite

winding order, to account for the possibility that different vertex sets
require different orders.
parent 51e03682
No related branches found
No related tags found
No related merge requests found
......@@ -98,6 +98,12 @@ class Mesh(notifier.Notifier, meta.Meta):
selectedVertices
vertexSets
.. note:: Internally the ``Mesh`` class may store two versions of the
triangles, with opposite unwinding orders. It keeps track of the
required triangle unwinding order for each vertex set, so that
the :meth:`indices` method will return the appropriate copy for
the currently selected vertex set.
**Vertex data**
......@@ -183,19 +189,17 @@ class Mesh(notifier.Notifier, meta.Meta):
self.__name = name
self.__dataSource = dataSource
self.__indices = np.asarray(indices).reshape((-1, 3))
self.__nvertices = self.__indices.max() + 1
# This attribute is used to store
# the currently selected vertex set,
# used as a kety into all of the
# dictionaries below.
self.__selected = None
# Flag used to keep track of whether
# the triangle winding order has been
# "fixed" - see the addVertices method.
self.__fixed = False
self.__nvertices = indices.max() + 1
self.__selected = None
# We potentially store two copies of
# the indices, with opposite unwinding
# orders. The vindices dict stores refs
# to one or the other for each vertex
# set.
self.__indices = np.asarray(indices).reshape((-1, 3))
self.__fixedIndices = None
self.__vindices = collections.OrderedDict()
# All of these are populated
# in the addVertices method
......@@ -287,7 +291,7 @@ class Mesh(notifier.Notifier, meta.Meta):
@property
def indices(self):
"""The ``(M, 3)`` triangles of this mesh. """
return self.__indices
return self.__vindices[self.__selected]
@property
......@@ -297,7 +301,7 @@ class Mesh(notifier.Notifier, meta.Meta):
"""
selected = self.__selected
indices = self.__indices
indices = self.__vindices[selected]
vertices = self.__vertices[selected]
fnormals = self.__faceNormals.get(selected, None)
......@@ -315,7 +319,7 @@ class Mesh(notifier.Notifier, meta.Meta):
"""
selected = self.__selected
indices = self.__indices
indices = self.__vindices[selected]
vertices = self.__vertices[selected]
vnormals = self.__vertNormals.get(selected, None)
......@@ -334,10 +338,8 @@ class Mesh(notifier.Notifier, meta.Meta):
``((xlow, ylow, zlow), (xhigh, yhigh, zhigh))``
"""
lo = self.__loBounds[self.__selected]
hi = self.__hiBounds[self.__selected]
return lo, hi
......@@ -411,26 +413,26 @@ class Mesh(notifier.Notifier, meta.Meta):
self.nvertices))
self.__vertices[key] = vertices
self.__vindices[key] = self.__indices
self.__loBounds[key] = lo
self.__hiBounds[key] = hi
if select:
self.vertices = key
# indices already fixed?
if fixWinding and (not self.__fixed):
indices = self.indices
normals = self.normals
needsFix = needsFixing(vertices, indices, normals, lo, hi)
self.__fixed = True
if fixWinding:
indices = self.__indices
normals = self.normals
needsFix = needsFixing(vertices, indices, normals, lo, hi)
# See needsFixing documentation
if needsFix:
indices[:, [1, 2]] = indices[:, [2, 1]]
if self.__fixedIndices is None:
self.__fixedIndices = indices[:, [0, 2, 1]]
for k, fn in self.__faceNormals.items():
self.__faceNormals[k] = fn * -1
self.__vindices[ key] = self.__fixedIndices
self.__faceNormals[key] = normals * -1
return vertices
......
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