removeDict = {}
tree = util3d.AABBTree()
off = numpy.array([0.0001,0.0001,0.0001])
- newVertexList = []
for idx in xrange(0, self.vertexCount):
v = self.vertexes[idx]
e = util3d.AABB(v-off, v+off)
if len(q) < 1:
e.idx = idx
tree.insert(e)
- newVertexList.append(v)
else:
removeDict[idx] = q[0].idx
print "%f: " % (time.time() - t0), "Marked %d duplicate vertexes for removal." % (len(removeDict))
+
+ faceList = []
+ for idx in xrange(0, self.vertexCount, 3):
+ f = [idx, idx + 1, idx + 2]
+ if removeDict.has_key(f[0]):
+ f[0] = removeDict[f[0]]
+ if removeDict.has_key(f[1]):
+ f[1] = removeDict[f[1]]
+ if removeDict.has_key(f[2]):
+ f[2] = removeDict[f[2]]
+ faceList.append(f)
- #Make facelists so we can quickly remove all the vertexes.
+ print "%f: " % (time.time() - t0), "Building face lists after vertex removal."
vertexFaceList = []
for idx in xrange(0, self.vertexCount):
vertexFaceList.append([])
- for f in self.faces:
- f.v[0].faceList.append(f)
- f.v[1].faceList.append(f)
- f.v[2].faceList.append(f)
-
- self.vertexes = newVertexList
- for v1 in removeDict.iterkeys():
- v0 = removeDict[v1]
- for f in v1.faceList:
- if f.v[0] == v1:
- f.v[0] = v0
- if f.v[1] == v1:
- f.v[1] = v0
- if f.v[2] == v1:
- f.v[2] = v0
- print "%f: " % (time.time() - t0), "Building face lists after vertex removal."
- for v in self.vertexes:
- v.faceList = []
- for f in self.faces:
- f.v[0].faceList.append(f)
- f.v[1].faceList.append(f)
- f.v[2].faceList.append(f)
+ for idx in xrange(0, len(faceList)):
+ f = faceList[idx]
+ vertexFaceList[f[0]].append(idx)
+ vertexFaceList[f[1]].append(idx)
+ vertexFaceList[f[2]].append(idx)
print "%f: " % (time.time() - t0), "Building parts."
+ self._vertexFaceList = vertexFaceList
+ self._faceList = faceList
partList = []
doneSet = set()
- for f in self.faces:
- if not f in doneSet:
- partList.append(self._createPartFromFacewalk(f, doneSet))
+ for idx in xrange(0, len(faceList)):
+ if not idx in doneSet:
+ partList.append(self._createPartFromFacewalk(idx, doneSet))
print "%f: " % (time.time() - t0), "Split into %d parts" % (len(partList))
+ self._vertexFaceList = None
+ self._faceList = None
return partList
- def _createPartFromFacewalk(self, startFace, doneSet):
+ def _createPartFromFacewalk(self, startFaceIdx, doneSet):
m = mesh()
- todoList = [startFace]
- doneSet.add(startFace)
+ m._prepareVertexCount(self.vertexCount)
+ todoList = [startFaceIdx]
+ doneSet.add(startFaceIdx)
while len(todoList) > 0:
- f = todoList.pop()
- m._partAddFacewalk(f, doneSet, todoList)
+ faceIdx = todoList.pop()
+ self._partAddFacewalk(m, faceIdx, doneSet, todoList)
return m
- def _partAddFacewalk(self, f, doneSet, todoList):
- self.addFace(f.v[0], f.v[1], f.v[2])
- for f1 in f.v[0].faceList:
+ def _partAddFacewalk(self, part, faceIdx, doneSet, todoList):
+ f = self._faceList[faceIdx]
+ v0 = self.vertexes[f[0]]
+ v1 = self.vertexes[f[0]]
+ v2 = self.vertexes[f[0]]
+ part.addVertex(v0[0], v0[1], v0[2])
+ part.addVertex(v1[0], v1[1], v1[2])
+ part.addVertex(v2[0], v2[1], v2[2])
+ for f1 in self._vertexFaceList[f[0]]:
if f1 not in doneSet:
todoList.append(f1)
doneSet.add(f1)
- for f1 in f.v[1].faceList:
+ for f1 in self._vertexFaceList[f[1]]:
if f1 not in doneSet:
todoList.append(f1)
doneSet.add(f1)
- for f1 in f.v[2].faceList:
+ for f1 in self._vertexFaceList[f[2]]:
if f1 not in doneSet:
todoList.append(f1)
doneSet.add(f1)
def __init__(self, vMin, vMax):
self.vMin = vMin
self.vMax = vMax
-
- def getPerimeter(self):
- return (self.vMax[0] - self.vMax[0]) + (self.vMax[1] - self.vMax[1]) + (self.vMax[2] - self.vMax[2])
+ self.perimeter = numpy.sum(self.vMax - self.vMin)
def combine(self, aabb):
return AABB(numpy.minimum(self.vMin, aabb.vMin), numpy.maximum(self.vMax, aabb.vMax))
child1 = node.child1
child2 = node.child2
- area = node.aabb.getPerimeter()
+ area = node.aabb.perimeter
combinedAABB = node.aabb.combine(aabb)
- combinedArea = combinedAABB.getPerimeter()
+ combinedArea = combinedAABB.perimeter
cost = 2.0 * combinedArea
inheritanceCost = 2.0 * (combinedArea - area)
if child1.isLeaf():
- cost1 = aabb.combine(child1.aabb).getPerimeter() + inheritanceCost
+ cost1 = aabb.combine(child1.aabb).perimeter + inheritanceCost
else:
- oldArea = child1.aabb.getPerimeter()
- newArea = aabb.combine(child1.aabb).getPerimeter()
+ oldArea = child1.aabb.perimeter
+ newArea = aabb.combine(child1.aabb).perimeter
cost1 = (newArea - oldArea) + inheritanceCost
if child2.isLeaf():
- cost2 = aabb.combine(child1.aabb).getPerimeter() + inheritanceCost
+ cost2 = aabb.combine(child1.aabb).perimeter + inheritanceCost
else:
- oldArea = child2.aabb.getPerimeter()
- newArea = aabb.combine(child2.aabb).getPerimeter()
+ oldArea = child2.aabb.perimeter
+ newArea = aabb.combine(child2.aabb).perimeter
cost2 = (newArea - oldArea) + inheritanceCost
if cost < cost1 and cost < cost2:
A.aabb = B.aabb.combine(G.aabb)
C.aabb = A.aabb.combine(F.aabb)
- A.height = 1 + Math.max(B.height, G.height)
- C.height = 1 + Math.max(A.height, F.height)
+ A.height = 1 + max(B.height, G.height)
+ C.height = 1 + max(A.height, F.height)
else:
C.child2 = G
A.child2 = F
if __name__ == '__main__':
tree = AABBTree()
- tree.insert(AABB(numpy.array([0,0,0]), numpy.array([0,0,0])))
- tree.insert(AABB(numpy.array([1,1,1]), numpy.array([1,1,1])))
- tree.insert(AABB(numpy.array([0.5,0.5,0.5]), numpy.array([0.5,0.5,0.5])))
+ tree.insert(AABB(Vector3(0,0,0), Vector3(0,0,0)))
+ tree.insert(AABB(Vector3(1,1,1), Vector3(1,1,1)))
+ tree.insert(AABB(Vector3(0.5,0.5,0.5), Vector3(0.5,0.5,0.5)))
print(tree)
- print(tree.query(AABB(numpy.array([0,0,0]), numpy.array([0,0,0]))))
+ print(tree.query(AABB(Vector3(0,0,0), Vector3(0,0,0))))