Fixed a bug in boxpack that archimap not to clear data between uses, and become progressivly slower.

Updated Archimap to set UV's aslists (dont need to convert to tuples anymore)
This commit is contained in:
Campbell Barton 2006-01-12 03:34:37 +00:00
parent a9e64286a9
commit d498ae5104
2 changed files with 26 additions and 23 deletions

@ -443,7 +443,7 @@ def optiRotateUvIsland(faces):
# Now write the vectors back to the face UV's # Now write the vectors back to the face UV's
i = 0 # count the serialized uv/vectors i = 0 # count the serialized uv/vectors
for f in faces: for f in faces:
f.uv = tuple([uv for uv in uvVecs[i:len(f.v)+i] ]) f.uv = [uv for uv in uvVecs[i:len(f.v)+i] ]
i += len(f.v) i += len(f.v)
@ -472,7 +472,7 @@ def mergeUvIslands(islandList, islandListArea):
while fIdx: while fIdx:
fIdx-=1 fIdx-=1
f = islandList[islandIdx][fIdx] f = islandList[islandIdx][fIdx]
f.uv = tuple([Vector(uv[0]-minx, uv[1]-miny) for uv in f.uv]) f.uv = [Vector(uv[0]-minx, uv[1]-miny) for uv in f.uv]
totFaceArea += islandListArea[islandIdx][fIdx] # Use Cached area. dont recalculate. totFaceArea += islandListArea[islandIdx][fIdx] # Use Cached area. dont recalculate.
islandBoundsArea = w*h islandBoundsArea = w*h
efficiency = abs(islandBoundsArea - totFaceArea) efficiency = abs(islandBoundsArea - totFaceArea)
@ -600,7 +600,7 @@ def mergeUvIslands(islandList, islandListArea):
targetIsland[0].extend(sourceIsland[0]) targetIsland[0].extend(sourceIsland[0])
while sourceIsland[0]: while sourceIsland[0]:
f = sourceIsland[0].pop() f = sourceIsland[0].pop()
f.uv = tuple([Vector(uv[0]+boxLeft, uv[1]+boxBottom) for uv in f.uv]) f.uv = [Vector(uv[0]+boxLeft, uv[1]+boxBottom) for uv in f.uv]
# Move edge loop into new and offset. # Move edge loop into new and offset.
# targetIsland[6].extend(sourceIsland[6]) # targetIsland[6].extend(sourceIsland[6])
@ -832,10 +832,10 @@ def packLinkedUvs(faceGroups, faceGroupsArea, me):
if USER_MARGIN: if USER_MARGIN:
USER_MARGIN_SCALE = 1-(USER_MARGIN*2) USER_MARGIN_SCALE = 1-(USER_MARGIN*2)
for f in islandList[islandIdx]: # Offsetting the UV's so they fit in there packed box, margin for f in islandList[islandIdx]: # Offsetting the UV's so they fit in there packed box, margin
f.uv = tuple([Vector((((uv[0]+xoffset)*xfactor)*USER_MARGIN_SCALE)+USER_MARGIN, (((uv[1]+yoffset)*yfactor)*USER_MARGIN_SCALE)+USER_MARGIN) for uv in f.uv]) f.uv = [Vector((((uv[0]+xoffset)*xfactor)*USER_MARGIN_SCALE)+USER_MARGIN, (((uv[1]+yoffset)*yfactor)*USER_MARGIN_SCALE)+USER_MARGIN) for uv in f.uv]
else: else:
for f in islandList[islandIdx]: # Offsetting the UV's so they fit in there packed box for f in islandList[islandIdx]: # Offsetting the UV's so they fit in there packed box
f.uv = tuple([Vector(((uv[0]+xoffset)*xfactor), ((uv[1]+yoffset)*yfactor)) for uv in f.uv]) f.uv = [Vector(((uv[0]+xoffset)*xfactor), ((uv[1]+yoffset)*yfactor)) for uv in f.uv]
@ -908,6 +908,12 @@ def main():
else: else:
ob = "Unwrap %i Selected Meshes" ob = "Unwrap %i Selected Meshes"
# HACK, loop until mouse is lifted.
'''
while Window.GetMouseButtons() != 0:
sys.sleep(10)
'''
if not Draw.PupBlock(ob % len(obList), pup_block): if not Draw.PupBlock(ob % len(obList), pup_block):
return return
del ob del ob
@ -970,7 +976,7 @@ def main():
for f in meshFaces: for f in meshFaces:
area = faceArea(f) area = faceArea(f)
if area <= SMALL_NUM: if area <= SMALL_NUM:
f.uv = tuple([Vector(0.0, 0.0)] * len(f.v)) # Assign dummy UV f.uv = [Vector(0.0, 0.0)] * len(f.v) # Assign dummy UV
print 'found zero area face, removing.' print 'found zero area face, removing.'
else: else:
@ -1107,7 +1113,7 @@ def main():
# Get the faces UV's from the projected vertex. # Get the faces UV's from the projected vertex.
for f in faceProjectionGroupList[i]: for f in faceProjectionGroupList[i]:
f.uv = tuple([MatProj * v.co for v in f.v]) f.uv = [MatProj * v.co for v in f.v]
packLinkedUvs(faceProjectionGroupList, faceProjectionGroupListArea, me) packLinkedUvs(faceProjectionGroupList, faceProjectionGroupListArea, me)

@ -46,7 +46,7 @@ class vt:
# A hack to remember the box() that last intersectec this vert # A hack to remember the box() that last intersectec this vert
self.intersectCache = ([], [], [], []) self.intersectCache = ([], [], [], [])
class vertList: class vertList:
def __init__(self, verts=[]): def __init__(self, verts=[]):
self.verts = verts self.verts = verts
@ -59,9 +59,7 @@ class vertList:
class box: class box:
global packedVerts
def __init__(self, width, height, id=None): def __init__(self, width, height, id=None):
global packedVerts
self.id= id self.id= id
@ -202,7 +200,7 @@ class box:
for vIdx in range(4): # (BL,TR,TL,BR): # (BL,TR,TL,BR) / 0,1,2,3 for vIdx in range(4): # (BL,TR,TL,BR): # (BL,TR,TL,BR) / 0,1,2,3
self_v = self.v[vIdx] # shortcut self_v = self.v[vIdx] # shortcut
if not (self_v.x == baseVert.x and self_v.y == baseVert.y): if not (self_v.x == baseVert.x and self_v.y == baseVert.y):
packedVerts.verts.append(self_v) boxList.packedVerts.verts.append(self_v)
else: else:
baseVert.free &= self.v[vIdx].free # make sure the baseVert.free &= self.v[vIdx].free # make sure the
@ -264,7 +262,9 @@ class box:
class boxList: class boxList:
global packedVerts # Global vert pool, stores used lists
packedVerts = vertList() # will be vertList()
def __init__(self, boxes): def __init__(self, boxes):
self.boxes = boxes self.boxes = boxes
@ -386,9 +386,6 @@ class boxList:
Window.Redraw(1) Window.Redraw(1)
def pack(self): def pack(self):
global packedVerts
packedVerts = vertList()
self.sortArea() self.sortArea()
if len(self.boxes) == 0: if len(self.boxes) == 0:
@ -401,7 +398,7 @@ class boxList:
unpackedboxes = boxList(self.boxes[1:]) unpackedboxes = boxList(self.boxes[1:])
# STart with this box # STart with this box
packedVerts.verts.extend(packedboxes.boxes[0].v) boxList.packedVerts.verts.extend(packedboxes.boxes[0].v)
while unpackedboxes.boxes != []: while unpackedboxes.boxes != []:
@ -409,12 +406,12 @@ class boxList:
while freeBoxIdx < len(unpackedboxes.boxes): while freeBoxIdx < len(unpackedboxes.boxes):
# Sort the verts with this boxes dimensions as a bias, so less poky out bits are made. # Sort the verts with this boxes dimensions as a bias, so less poky out bits are made.
packedVerts.sortCorner(unpackedboxes.boxes[freeBoxIdx].width, unpackedboxes.boxes[freeBoxIdx].height) boxList.packedVerts.sortCorner(unpackedboxes.boxes[freeBoxIdx].width, unpackedboxes.boxes[freeBoxIdx].height)
vertIdx = 0 vertIdx = 0
while vertIdx < len(packedVerts.verts): while vertIdx < len(boxList.packedVerts.verts):
baseVert = packedVerts.verts[vertIdx] baseVert = boxList.packedVerts.verts[vertIdx]
if baseVert.free != 0: if baseVert.free != 0:
# This will lock the box if its possibel # This will lock the box if its possibel
@ -426,6 +423,9 @@ class boxList:
vertIdx +=1 vertIdx +=1
freeBoxIdx +=1 freeBoxIdx +=1
boxList.packedVerts.verts = [] # Free the list, so it dosent use ram between runs.
self.width = packedboxes.width self.width = packedboxes.width
self.height = packedboxes.height self.height = packedboxes.height
# All boxes as a list - X/Y/WIDTH/HEIGHT # All boxes as a list - X/Y/WIDTH/HEIGHT
@ -443,10 +443,6 @@ BLF = 1; TRF = 2; TLF = 4; BRF = 8
quadFlagLs = (BLF,BRF,TLF,TRF) quadFlagLs = (BLF,BRF,TLF,TRF)
# Global vert pool, stores used lists
packedVerts = vertList()
# Packs a list w/h's into box types and places then #Iter times # Packs a list w/h's into box types and places then #Iter times
def boxPackIter(boxLs, iter=1, draw=0): def boxPackIter(boxLs, iter=1, draw=0):
iterIdx = 0 iterIdx = 0
@ -478,4 +474,5 @@ def boxPackIter(boxLs, iter=1, draw=0):
bestBoxLs.draw() bestBoxLs.draw()
#print 'best area: %.4f, %.2f%% efficient' % (bestArea, (float(bestBoxLs.boxArea) / (bestArea+0.000001))*100) #print 'best area: %.4f, %.2f%% efficient' % (bestArea, (float(bestBoxLs.boxArea) / (bestArea+0.000001))*100)
return bestBoxLs.width, bestBoxLs.height, bestBoxLs.list() return bestBoxLs.width, bestBoxLs.height, bestBoxLs.list()