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
+ "}";
}
}