ExactZoom class

Пакет: com.hypixel.hytale.server.worldgen.zoom

Файл: com/hypixel/hytale/server/worldgen/zoom/ExactZoom.java

Поля (23)

МодификаторыТипИмя
BufferedImage var1
int var11
Vector2i[] var12
int var14
int var15
Zone.UniqueCandidate[] var3
Vector2i[] var3
PixelProvider var4
ArrayList var4
int var4
int var5
int var5
int var6
Zone.UniqueCandidate var6
Zone.UniqueEntry var6
int var6
Vector2i var7
int var7
Vector2i var7
int var8
int var8
Vector2i var8
int var9

Методы (22)

МодификаторыВозвратСигнатура
abstract throw new Errorthrow new Error("No parent matches found for unique zone entry: " + var6)
public double distanceToNextPixeldouble distanceToNextPixel(double var1, double var3)
public BufferedImage exportImageBufferedImage exportImage()
for for(int var5 = 0; var5 < var1.length; var5++)
for for(int var10 = -var8; var10 <= var8; var10++)
for for(int var11 = -var8; var11 <= var8; var11++)
for for(int var5 = 0; var5 < var1.length; var5++)
for for(int var13 = 0; var13 < var11; var13++)
for for(int var5 = var3.length; var5 > 0; var5--)
for for(int var6 = -var4; var6 <= var4; var6++)
for for(int var7 = -var4; var7 <= var4; var7++)
abstract for for(int var2 = 0; var2 < this.source.getWidth()
abstract for for(int var3 = 0; var3 < this.source.getHeight()
public int generateint generate(double var1, double var3)
public Zone.UniqueCandidate[] generateUniqueZoneCandidatesZone.UniqueCandidate[] generateUniqueZoneCandidates(Zone.UniqueEntry[] var1, int var2)
public ExactZoom generateUniqueZonesExactZoom generateUniqueZones(Zone.UniqueCandidate[] var1, FastRandom var2, List<Zone.Unique> var3)
if if(var7 == null)
if if(var11 * var11 + var10 * var10 <= var9)
if if(var14 == 0)
if if(var14 <= var2)
public boolean inBoundsboolean inBounds(double var1, double var3)
static boolean testZoneFitboolean testZoneFit(Zone.UniqueEntry var0, PixelProvider var1, int var2, int var3, int var4)

Исходный код

Показать/скрыть
class="kw">package com.hypixel.hytale.server.worldgen.zoom;

class="kw">import com.hypixel.hytale.math.util.FastRandom;
class="kw">import com.hypixel.hytale.math.util.MathUtil;
class="kw">import com.hypixel.hytale.server.worldgen.util.LogUtil;
class="kw">import com.hypixel.hytale.server.worldgen.zone.Zone;
class="kw">import java.awt.image.BufferedImage;
class="kw">import java.util.ArrayList;
class="kw">import java.util.List;
class="kw">import java.util.concurrent.CompletableFuture;
class="kw">import java.util.logging.Level;
class="kw">import javax.annotation.Nonnull;
class="kw">import javax.annotation.Nullable;
class="kw">import org.joml.Vector2i;

class="kw">public class ExactZoom {
   @Nonnull
   class="kw">private class="kw">final PixelProvider source;
   @Nonnull
   class="kw">private class="kw">final PixelDistanceProvider distanceProvider;
   class="kw">private class="kw">final double zoomX;
   class="kw">private class="kw">final double zoomY;
   class="kw">private class="kw">final int offsetX;
   class="kw">private class="kw">final int offsetY;

   class="kw">public ExactZoom(@Nonnull PixelProvider var1, double var2, double var4, int var6, int var7) {
      this.source = var1;
      this.distanceProvider = new PixelDistanceProvider(var1);
      this.zoomX = var2;
      this.zoomY = var4;
      this.offsetX = var6;
      this.offsetY = var7;
   }

   @Nonnull
   class="kw">public PixelDistanceProvider getDistanceProvider() {
      class="kw">return this.distanceProvider;
   }

   class="kw">public boolean inBounds(double var1, double var3) {
      var1 += this.offsetX;
      var3 += this.offsetY;
      if (!(var1 < 0.0) && !(var3 < 0.0)) {
         var1 /= this.zoomX;
         var3 /= this.zoomY;
         class="kw">return this.source.getWidth() - 1 >= var1 && this.source.getHeight() - 1 >= var3;
      } else {
         class="kw">return false;
      }
   }

   class="kw">public int generate(double var1, double var3) {
      var1 += this.offsetX;
      var3 += this.offsetY;
      var1 /= this.zoomX;
      var3 /= this.zoomY;
      int var5 = Math.max(0, Math.min(MathUtil.floor(var1), this.source.getWidth() - 1));
      int var6 = Math.max(0, Math.min(MathUtil.floor(var3), this.source.getHeight() - 1));
      class="kw">return this.source.getPixel(var5, var6);
   }

   class="kw">public double distanceToNextPixel(double var1, double var3) {
      var1 += this.offsetX;
      var3 += this.offsetY;
      var1 /= this.zoomX;
      var3 /= this.zoomY;
      class="kw">return this.zoomX * Math.sqrt(this.distanceProvider.distanceSqToDifferentPixel(var1, var3, (int)MathUtil.fastFloor(var1), (int)MathUtil.fastFloor(var3)));
   }

   class="kw">public ExactZoom generateUniqueZones(Zone.UniqueCandidate[] var1, FastRandom var2, List<Zone.Unique> var3) {
      PixelProvider var4 = this.source.copy();

      for (int var5 = 0; var5 < var1.length; var5++) {
         Zone.UniqueCandidate var6 = var1[var5];
         Vector2i var7 = selectCandidatePosition(var6, var4, var2);
         if (var7 == null) {
            LogUtil.getLogger().at(Level.WARNING).log("Failed to place unique zone: %s", var6.zone());
         } else {
            int var8 = var6.zone().radius();
            int var9 = var8 * var8;

            for (int var10 = -var8; var10 <= var8; var10++) {
               for (int var11 = -var8; var11 <= var8; var11++) {
                  if (var11 * var11 + var10 * var10 <= var9) {
                     var4.setPixel(var7.x + var11, var7.y + var10, var6.zone().color());
                  }
               }
            }

            var3.add(
               new Zone.Unique(
                  var6.zone().zone(),
                  CompletableFuture.completedFuture(new Vector2i((int)(var7.x * this.zoomX - this.offsetX), (int)(var7.y * this.zoomY - this.offsetY)))
               )
            );
         }
      }

      class="kw">return new ExactZoom(var4, this.zoomX, this.zoomY, this.offsetX, this.offsetY);
   }

   class="kw">public Zone.UniqueCandidate[] generateUniqueZoneCandidates(Zone.UniqueEntry[] var1, int var2) {
      Zone.UniqueCandidate[] var3 = new Zone.UniqueCandidate[var1.length];
      ArrayList var4 = new ArrayList<>();

      for (int var5 = 0; var5 < var1.length; var5++) {
         Zone.UniqueEntry var6 = var1[var5];
         int var7 = var6.radius();
         int var8 = var7 + var6.padding();
         var4.clear();

         for (int var9 = var8; var9 < this.source.getHeight() - 1 - var8; var9++) {
            for (int var10 = var8; var10 < this.source.getWidth() - 1 - var8; var10++) {
               if (testZoneFit(var6, this.source, var10, var9, var8)) {
                  var4.add(new Vector2i(var10, var9));
               }
            }
         }

         int var14 = var4.size();
         if (var14 == 0) {
            throw new Error("No parent matches found for unique zone entry: " + var6);
         }

         if (var14 <= var2) {
            var3[var5] = new Zone.UniqueCandidate(var6, var4.toArray(Vector2i[]::new));
         } else {
            int var15 = Math.max(1, var14 / var2);
            int var11 = var14 / var15;
            Vector2i[] var12 = new Vector2i[var11];

            for (int var13 = 0; var13 < var11; var13++) {
               var12[var13] = var4.get(var13 * var15);
            }

            var3[var5] = new Zone.UniqueCandidate(var6, var12);
         }
      }

      class="kw">return var3;
   }

   @Nullable
   class="kw">private class="kw">static Vector2i selectCandidatePosition(Zone.UniqueCandidate var0, PixelProvider var1, FastRandom var2) {
      Vector2i[] var3 = var0.positions();
      int var4 = var0.zone().radius() + var0.zone().padding();

      for (int var5 = var3.length; var5 > 0; var5--) {
         int var6 = var2.nextInt(var5);
         Vector2i var7 = var3[var6];
         if (testZoneFit(var0.zone(), var1, var7.x, var7.y, var4)) {
            class="kw">return var7;
         }

         Vector2i var8 = var3[var5 - 1];
         var3[var5 - 1] = var7;
         var3[var6] = var8;
      }

      class="kw">return null;
   }

   class="kw">private class="kw">static boolean testZoneFit(Zone.UniqueEntry var0, PixelProvider var1, int var2, int var3, int var4) {
      int var5 = var4 * var4;

      for (int var6 = -var4; var6 <= var4; var6++) {
         for (int var7 = -var4; var7 <= var4; var7++) {
            if (var7 * var7 + var6 * var6 <= var5 && !var0.matchesParent(var1.getPixel(var2 + var7, var3 + var6))) {
               class="kw">return false;
            }
         }
      }

      class="kw">return true;
   }

   class="kw">public BufferedImage exportImage() {
      BufferedImage var1 = new BufferedImage(this.source.getWidth(), this.source.getHeight(), 1);

      for (int var2 = 0; var2 < this.source.getWidth(); var2++) {
         for (int var3 = 0; var3 < this.source.getHeight(); var3++) {
            var1.setRGB(var2, var3, this.source.getPixel(var2, var3));
         }
      }

      class="kw">return var1;
   }

   @Nonnull
   @Override
   class="kw">public String toString() {
      class="kw">return "ExactZoom{source="
         + this.source
         + ", distanceProvider="
         + this.distanceProvider
         + ", zoomX="
         + this.zoomX
         + ", zoomY="
         + this.zoomY
         + ", offsetX="
         + this.offsetX
         + ", offsetY="
         + this.offsetY
         + "}";
   }
}