public static void merge(
     final LayerVisibility v1,
     final LayerVisibility v2,
     final TShortObjectHashMap<short[]> layerByGroups) {
   for (int i = 0; i < v1.size(); ++i) {
     final short[] layers = v1.getQuickValue(i);
     if (Arrays.binarySearch(layers, (short) 0) >= 0) {
       final short layer = v1.getQuickKey(i);
       final TShortHashSet set = new TShortHashSet(layerByGroups.get(layer));
       set.addAll(v2.getVisibleFromOutdoor());
       final short[] added = set.toArray();
       Arrays.sort(added);
       layerByGroups.put(layer, added);
     }
   }
 }
 private void mergeVisibility(
     final THashMap<AbstractBuildingStruct, LayerVisibility> transformed,
     final TShortObjectHashMap<short[]> layerByGroups) {
   final ArrayList<AbstractBuildingStruct> buildings = new ArrayList<AbstractBuildingStruct>();
   this.m_havenWorld.foreachBuildings(
       new TObjectProcedure<AbstractBuildingStruct>() {
         @Override
         public boolean execute(final AbstractBuildingStruct building) {
           buildings.add(building);
           return true;
         }
       });
   for (final AbstractBuildingStruct b1 : buildings) {
     for (final AbstractBuildingStruct b2 : buildings) {
       if (b1 == b2) {
         continue;
       }
       final LayerVisibility visibility1 = transformed.get(b1);
       final LayerVisibility visibility2 = transformed.get(b2);
       LayerVisibility.merge(visibility1, visibility2, layerByGroups);
     }
   }
 }