Browse Source

fix a few bugs

David Rose 17 years ago
parent
commit
07aa73df98
1 changed files with 25 additions and 30 deletions
  1. 25 30
      direct/src/showutil/TexMemWatcher.py

+ 25 - 30
direct/src/showutil/TexMemWatcher.py

@@ -164,7 +164,6 @@ class TexMemWatcher(DirectObject):
         # Now start handling up the actual stuff in the scene.
         
         self.background = None
-        self.overflowing = False
         self.nextTexRecordKey = 0
         self.rollover = None
         self.isolate = None
@@ -632,7 +631,6 @@ class TexMemWatcher(DirectObject):
                 # packing effectiveness.
                 texRecords.sort(key = lambda tr: (tr.tw, tr.th), reverse = True)
 
-                self.overflowing = False
                 for tr in texRecords:
                     self.placeTexture(tr)
                     self.texRecordsByTex[tr.tex] = tr
@@ -726,7 +724,6 @@ class TexMemWatcher(DirectObject):
         texRecords = self.texRecordsByTex.values()
         texRecords.sort(key = lambda tr: (tr.tw, tr.th), reverse = True)
         
-        self.overflowing = False
         for tr in texRecords:
             self.placeTexture(tr)
 
@@ -745,21 +742,26 @@ class TexMemWatcher(DirectObject):
 
     def unplaceTexture(self, tr):
         """ Removes the texture from its place on the canvas. """
-        for tp in tr.placements:
-            tp.clearBitmasks(self.bitmasks)
-            if not tp.overflowed:
-                self.placedQSize -= tp.area
-            del self.texPlacements[tp]
-        tr.placements = []
-        tr.clearCard(self)
-        if not tp.overflowed:
-            self.placedSize -= tr.size
+        if tr.placements:
+            for tp in tr.placements:
+                tp.clearBitmasks(self.bitmasks)
+                if not tp.overflowed:
+                    self.placedQSize -= tp.area
+                    assert self.placedQSize >= 0
+                del self.texPlacements[tp]
+            tr.placements = []
+            tr.clearCard(self)
+            if not tr.overflowed:
+                self.placedSize -= tr.size
+                assert self.placedSize >= 0
+        tr.overflowed = 0
 
     def placeTexture(self, tr):
         """ Places the texture somewhere on the canvas where it will
         fit. """
 
         tr.computePlacementSize(self)
+        tr.overflowed = 0
 
         shouldFit = False
         availableSize = self.limit - self.placedSize
@@ -807,25 +809,17 @@ class TexMemWatcher(DirectObject):
                 return
 
         # Just let it overflow.
-        self.overflowing = True
+        tr.overflowed = 1
         tp = self.findOverflowHole(tr.area, tr.w, tr.h)
-        if tp:
-            if tp.p[1] > self.w or tp.p[3] > self.h:
-                tp.overflowed = 1
-                while len(self.bitmasks) <= tp.p[3]:
-                    self.bitmasks.append(BitArray())
-                    
-            tr.placements = [tp]
-            tr.makeCard(self)
-            tp.setBitmasks(self.bitmasks)
-            if not tp.overflowed:
-                self.placedQSize += tp.area
-                self.placedSize += tr.size
-            self.texPlacements[tp] = tr
-            return
+        tp.overflowed = 1
+        while len(self.bitmasks) <= tp.p[3]:
+            self.bitmasks.append(BitArray())
+
+        tr.placements = [tp]
+        tr.makeCard(self)
+        tp.setBitmasks(self.bitmasks)
+        self.texPlacements[tp] = tr
 
-        # Something went wrong.
-        assert False
 
     def findHole(self, area, w, h):
         """ Searches for a rectangular hole that is at least area
@@ -1044,7 +1038,7 @@ class TexMemWatcher(DirectObject):
 
                 t = b + 1
                 while t < b + h and \
-                      (t > len(self.bitmasks) or (self.bitmasks[t] & mask).isZero()):
+                      (t >= len(self.bitmasks) or (self.bitmasks[t] & mask).isZero()):
                     t += 1
 
                 if t < b + h:
@@ -1089,6 +1083,7 @@ class TexRecord:
         self.root = None
         self.regions = []
         self.placements = []
+        self.overflowed = 0
 
         self.setSize(size)