protected void updateBounds() {
    final Descent update = new Descent() {
      public boolean descendTo(Section s) {
        //
        //  If the section has already been updated, or isn't a leaf node,
        //  return.
        if (! s.updateBounds) return false ;
        if (s.depth > 0) return true ;
        //
        //  Bounds have to be initialised with a starting interval, so we pick
        //  the first tile in the area-
        final Tile first = world.tileAt(s.area.xpos(), s.area.ypos()) ;
        s.bounds.set(first.x, first.y, first.elevation(), 0, 0, 0) ;
        final Box3D tempBounds = new Box3D() ;
        for (Tile t : world.tilesIn(s.area, false)) {
          s.bounds.include(t.x, t.y, t.elevation(), 1) ;
        }
        for (Element e : world.fixturesFrom(s.area)) {
          s.bounds.include(boundsFrom(e, tempBounds)) ;
        }
        //I.say("Area "+s.area+"\nBounds: "+s.bounds+"\n___DEPTH: "+s.depth) ;
        return true ;
      }
      //
      //  All non-leaf nodes base their bounds on the limits of their children.
      public void afterChildren(Section s) {
        s.updateBounds = false ;
        if (s.depth == 0) return ;
        s.bounds.setTo(s.kids[0].bounds) ;
        for (Section k : s.kids) s.bounds.include(k.bounds) ;
        //I.say("UPDATED BOUNDS: "+s.bounds) ;
        //I.say("Area "+s.area+"\nBounds: "+s.bounds+"\n___DEPTH: "+s.depth) ;
      }
    } ;
    this.applyDescent(update) ;
  }