protected List<HeightInfo> availableSpace(ModelInfo info) {
   List<HeightInfo> list = new LinkedList<>();
   BufferedImage mask = info.getMask();
   if (mask == null) {
     info.parseMask();
     if (mask == null) {
       return list;
     }
   }
   int width = mask.getWidth();
   int height = mask.getHeight();
   double xr = Mediator.getMapWidth() / width;
   double zr = Mediator.getMapHeight() / height;
   for (int i = 0; i < width; i++) {
     for (int j = 0; j < height; j++) {
       double y = PreviewPanel.getColor(mask, i, j);
       if (y >= 128) {
         double x = (width / 2 - i) * xr;
         double z = (height / 2 - j) * zr;
         list.add(new HeightInfo(x, y, z));
       }
     }
   }
   return list;
 }
 protected int getCount(ModelInfo obj) {
   int count = 0;
   int max = obj.getMaxCount();
   int min = obj.getMinCount();
   if (max > 0) {
     if (max == min) {
       count = max;
     } else {
       count = rnd.nextInt(max - min) + min + 1;
     }
   }
   return count;
 }
 protected void setRotation(ModelInfo objInfo, BasicModelData obj) {
   obj.setRotation(
       randomizeDouble(
           objInfo.getRotationSettings().getMinX(), objInfo.getRotationSettings().getMaxX()),
       randomizeDouble(
           objInfo.getRotationSettings().getMinY(), objInfo.getRotationSettings().getMaxY()),
       randomizeDouble(
           objInfo.getRotationSettings().getMinZ(), objInfo.getRotationSettings().getMaxZ()));
 }
 protected void setScale(ModelInfo objInfo, BasicModelData obj) {
   double scaleX =
       randomizeDouble(objInfo.getScaleSettings().getMinX(), objInfo.getScaleSettings().getMaxX());
   if (objInfo.getScaleSettings().isEqual()) {
     obj.setScale(scaleX, scaleX, scaleX);
   } else {
     obj.setScale(
         scaleX,
         randomizeDouble(
             objInfo.getScaleSettings().getMinY(), objInfo.getScaleSettings().getMaxY()),
         randomizeDouble(
             objInfo.getScaleSettings().getMinZ(), objInfo.getScaleSettings().getMaxZ()));
   }
 }