BlockColorIndex class
Пакет: com.hypixel.hytale.builtin.buildertools
Файл: com/hypixel/hytale/builtin/buildertools/BlockColorIndex.java
Поля (145)
| Модификаторы | Тип | Имя |
|---|---|---|
final |
HytaleLogger |
LOGGER |
|
|
continue |
|
BlockTypeAssetMap |
var1 |
|
Color[] |
var1 |
|
Color[] |
var1 |
|
boolean |
var1 |
|
int |
var10 |
|
|
var10 |
|
|
var10 |
|
|
var10 |
|
|
var10 |
|
double |
var10 |
|
|
var10 |
|
double |
var10 |
|
|
var10 |
|
double |
var10 |
|
double |
var10 |
|
|
var10 |
|
int |
var11 |
|
|
var11 |
|
|
var11 |
|
|
var11 |
|
|
var11 |
|
double |
var11 |
|
|
var11 |
|
double |
var11 |
|
double |
var11 |
|
|
var11 |
|
boolean |
var12 |
|
int |
var12 |
|
|
var12 |
|
int |
var12 |
|
|
var12 |
|
double |
var12 |
|
double |
var12 |
|
double |
var12 |
|
boolean |
var13 |
|
int |
var13 |
|
|
var13 |
|
String |
var13 |
|
double |
var13 |
|
|
var13 |
|
byte[] |
var14 |
|
double |
var14 |
|
|
var14 |
|
double |
var14 |
|
double |
var14 |
|
double |
var14 |
|
Color |
var15 |
|
double |
var15 |
|
double |
var15 |
|
double |
var15 |
|
Color |
var16 |
|
double |
var16 |
|
int |
var16 |
|
|
var16 |
|
int[] |
var16 |
|
double |
var16 |
|
double |
var16 |
|
double[] |
var17 |
|
double |
var17 |
|
double |
var18 |
|
|
var18 |
|
BlockType |
var19 |
|
double |
var19 |
|
Set |
var2 |
|
BlockType |
var2 |
|
int |
var2 |
|
Color |
var2 |
|
DrawType |
var2 |
|
boolean |
var2 |
|
BlockColorIndex.BlockColorEntry |
var2 |
|
BlockType |
var20 |
|
Item |
var20 |
|
double |
var20 |
|
|
var20 |
|
int |
var21 |
|
double[] |
var22 |
|
double |
var22 |
|
|
var22 |
|
double |
var23 |
|
int |
var24 |
|
int |
var25 |
|
int |
var26 |
|
IndexedLookupTableAssetMap |
var3 |
|
Item |
var3 |
|
Opacity |
var3 |
|
byte[] |
var3 |
|
BlockTypeAssetMap |
var3 |
|
BlockColorIndex.BlockColorEntry |
var3 |
|
BlockColorIndex.BlockColorEntry |
var3 |
|
double |
var3 |
|
|
var3 |
|
double[] |
var4 |
|
Color |
var4 |
|
BlockType |
var4 |
|
double |
var4 |
|
double |
var4 |
|
double |
var5 |
|
Color |
var5 |
|
int |
var5 |
|
double |
var5 |
|
|
var5 |
|
int |
var6 |
|
int |
var6 |
|
|
var6 |
|
|
var6 |
|
|
var6 |
|
|
var6 |
|
double[] |
var6 |
|
double |
var6 |
|
double |
var6 |
|
double |
var6 |
|
|
var6 |
|
Item |
var7 |
|
double |
var7 |
|
int |
var7 |
|
|
var7 |
|
|
var7 |
|
|
var7 |
|
|
var7 |
|
double |
var7 |
|
double |
var7 |
|
|
var7 |
|
int |
var8 |
|
int |
var8 |
|
|
var8 |
|
|
var8 |
|
|
var8 |
|
|
var8 |
|
double |
var8 |
|
double |
var8 |
|
double[] |
var8 |
|
double |
var8 |
|
|
var8 |
|
int |
var9 |
|
|
var9 |
|
|
var9 |
|
|
var9 |
|
|
var9 |
|
double |
var9 |
|
double |
var9 |
|
double[] |
var9 |
|
double |
var9 |
|
|
var9 |
Методы (42)
| Модификаторы | Возврат | Сигнатура |
|---|---|---|
private |
record |
BlockColorEntryrecord BlockColorEntry(int blockId, String key, int r, int g, int b, double labL, double labA, double labB) |
static |
double |
colorDistanceLabdouble colorDistanceLab(double var0, double var2, double var4, double var6, double var8, double var10) |
static |
int |
computeBlockColorRgbint computeBlockColorRgb(@Nonnull BlockType var0) |
private |
void |
ensureInitializedvoid ensureInitialized() |
public |
int |
findBlockForLerpedColorint findBlockForLerpedColor(int var1, int var2, int var3, int var4, int var5, int var6, float var7) |
public |
int |
findClosestBlockint findClosestBlock(int var1, int var2, int var3) |
public |
int |
findClosestVariantint findClosestVariant(int var1, @Nonnull String var2) |
public |
int |
findDarkerVariantint findDarkerVariant(int var1, float var2) |
public |
int |
findLighterVariantint findLighterVariant(int var1, float var2) |
|
|
for for(String var5 : EXCLUDED_QUALITIES) |
|
|
for for(String var19 : var2) |
|
|
for for(BlockColorIndex.BlockColorEntry var15 : this.entries) |
|
|
for for(BlockColorIndex.BlockColorEntry var14 : this.entries) |
|
|
for for(BlockColorIndex.BlockColorEntry var14 : this.entries) |
|
|
for for(BlockColorIndex.BlockColorEntry var3 : this.entries) |
public |
int |
getBlockColorint getBlockColor(int var1) |
static |
byte[] |
getTintColorbyte[] getTintColor(@Nonnull BlockType var0) |
static |
boolean |
hasTintColorboolean hasTintColor(@Nonnull BlockType var0) |
|
|
if if(!this.initialized) |
|
|
if if(var6 >= 0) |
|
|
if if(var12 && var13) |
|
|
if if(var2 == null) |
|
|
if if(var1 != null && var1.length != 0) |
|
|
if if(var1 != null && var1.length != 0) |
|
|
if if(var16 < var11) |
|
|
if if(var1 && var2) |
|
|
if if(var5 == null) |
|
|
if if(var4 == null) |
|
|
if if(var5 < 0) |
|
|
if if(var19 != null) |
|
|
if if(var21 >= 0) |
|
|
if if(var23 < var14) |
|
|
if if(var3 == null) |
|
|
if if(var15 < var10) |
|
|
if if(var3 == null) |
|
|
if if(var15 < var10) |
|
|
if if(var3.blockId == var1) |
public |
boolean |
isEmptyboolean isEmpty() |
public |
boolean |
isExcludedQualityboolean isExcludedQuality(int var1) |
private |
boolean |
isSolidCubeboolean isSolidCube(@Nonnull BlockType var1) |
static |
int[] |
labToRgbint[] labToRgb(double var0, double var2, double var4) |
static |
double[] |
rgbToLabdouble[] rgbToLab(int var0, int var1, int var2) |
Исходный код
Показать/скрыть
class="kw">package com.hypixel.hytale.builtin.buildertools;
class="kw">import com.hypixel.hytale.assetstore.map.BlockTypeAssetMap;
class="kw">import com.hypixel.hytale.assetstore.map.IndexedLookupTableAssetMap;
class="kw">import com.hypixel.hytale.logger.HytaleLogger;
class="kw">import com.hypixel.hytale.protocol.Color;
class="kw">import com.hypixel.hytale.protocol.DrawType;
class="kw">import com.hypixel.hytale.protocol.Opacity;
class="kw">import com.hypixel.hytale.server.core.asset.type.blocktype.config.BlockType;
class="kw">import com.hypixel.hytale.server.core.asset.type.item.config.Item;
class="kw">import com.hypixel.hytale.server.core.asset.type.item.config.ItemQuality;
class="kw">import com.hypixel.hytale.server.core.asset.util.ColorParseUtil;
class="kw">import it.unimi.dsi.fastutil.ints.IntOpenHashSet;
class="kw">import it.unimi.dsi.fastutil.ints.IntSet;
class="kw">import java.util.ArrayList;
class="kw">import java.util.Comparator;
class="kw">import java.util.List;
class="kw">import java.util.Set;
class="kw">import java.util.logging.Level;
class="kw">import javax.annotation.Nonnull;
class="kw">import javax.annotation.Nullable;
class="kw">public class="kw">final class BlockColorIndex {
class="kw">private class="kw">static class="kw">final HytaleLogger LOGGER = HytaleLogger.forEnclosingClass();
class="kw">private class="kw">static class="kw">final Set<String> EXCLUDED_QUALITIES = Set.of("Developer", "Technical", "Debug", "Template");
class="kw">private IntSet hiddenQualityIndexes = new IntOpenHashSet();
class="kw">private class="kw">final List<BlockColorIndex.BlockColorEntry> entries = new ArrayList<>();
class="kw">private boolean initialized = false;
class="kw">public BlockColorIndex() {
}
class="kw">private void ensureInitialized() {
if (!this.initialized) {
BlockTypeAssetMap var1 = BlockType.getAssetMap();
Set var2 = var1.getAssetMap().keySet();
IndexedLookupTableAssetMap var3 = ItemQuality.getAssetMap();
for (String var5 : EXCLUDED_QUALITIES) {
int var6 = var3.getIndexOrDefault(var5, -1);
if (var6 >= 0) {
this.hiddenQualityIndexes.add(var6);
}
}
for (String var19 : var2) {
BlockType var20 = var1.getAsset(var19);
if (var20 != null && this.isSolidCube(var20) && !var20.isState()) {
Item var7 = var20.getItem();
if (var7 != null && !this.hiddenQualityIndexes.contains(var7.getQualityIndex())) {
int var8 = var1.getIndex(var19);
boolean var12 = hasTintColor(var20);
boolean var13 = var20.getTextureComputedColor() != null;
byte[] var14 = getTintColor(var20);
Color var15 = var20.getTextureComputedColor();
Color var16 = var20.getParticleColor();
int var9;
int var10;
int var11;
if (var12 && var13) {
var9 = (var15.red & 255) * (var14[0] & 255) / 255;
var10 = (var15.green & 255) * (var14[1] & 255) / 255;
var11 = (var15.blue & 255) * (var14[2] & 255) / 255;
} else if (var12) {
var9 = var14[0] & 255;
var10 = var14[1] & 255;
var11 = var14[2] & 255;
} else if (var13) {
var9 = var15.red & 255;
var10 = var15.green & 255;
var11 = var15.blue & 255;
} else {
if (var20.getParticleColor() == null) {
class="kw">continue;
}
var9 = var16.red & 255;
var10 = var16.green & 255;
var11 = var16.blue & 255;
}
double[] var17 = rgbToLab(var9, var10, var11);
this.entries.add(new BlockColorIndex.BlockColorEntry(var8, var19, var9, var10, var11, var17[0], var17[1], var17[2]));
}
}
}
this.entries.sort(Comparator.comparingDouble(var0 -> var0.labL));
this.initialized = true;
LOGGER.at(Level.INFO).log("BlockColorIndex initialized with %d blocks", this.entries.size());
}
}
class="kw">public boolean isExcludedQuality(int var1) {
this.ensureInitialized();
BlockType var2 = BlockType.getAssetMap().getAsset(var1);
if (var2 == null) {
class="kw">return true;
}
Item var3 = var2.getItem();
class="kw">return var3 != null && this.hiddenQualityIndexes.contains(var3.getQualityIndex());
}
class="kw">private class="kw">static boolean hasTintColor(@Nonnull BlockType var0) {
Color[] var1 = var0.getTintUp();
if (var1 != null && var1.length != 0) {
int var2 = ColorParseUtil.colorToARGBInt(var1[0]) & 16777215;
class="kw">return var2 != 0 && var2 != 16777215;
} else {
class="kw">return false;
}
}
class="kw">private class="kw">static byte[] getTintColor(@Nonnull BlockType var0) {
Color[] var1 = var0.getTintUp();
if (var1 != null && var1.length != 0) {
Color var2 = var1[0];
class="kw">return new byte[]{var2.red, var2.green, var2.blue};
} else {
class="kw">return null;
}
}
class="kw">private boolean isSolidCube(@Nonnull BlockType var1) {
DrawType var2 = var1.getDrawType();
Opacity var3 = var1.getOpacity();
class="kw">return var2 == DrawType.Cube && var3 == Opacity.Solid;
}
class="kw">public int findClosestBlock(int var1, int var2, int var3) {
this.ensureInitialized();
if (this.entries.isEmpty()) {
class="kw">return -1;
}
double[] var4 = rgbToLab(var1, var2, var3);
double var5 = var4[0];
double var7 = var4[1];
double var9 = var4[2];
double var11 = Double.MAX_VALUE;
int var13 = -1;
for (BlockColorIndex.BlockColorEntry var15 : this.entries) {
double var16 = colorDistanceLab(var5, var7, var9, var15.labL, var15.labA, var15.labB);
if (var16 < var11) {
var11 = var16;
var13 = var15.blockId;
}
}
class="kw">return var13;
}
class="kw">private class="kw">static int computeBlockColorRgb(@Nonnull BlockType var0) {
boolean var1 = hasTintColor(var0);
boolean var2 = var0.getTextureComputedColor() != null;
byte[] var3 = getTintColor(var0);
Color var4 = var0.getTextureComputedColor();
Color var5 = var0.getParticleColor();
int var6;
int var7;
int var8;
if (var1 && var2) {
var6 = (var4.red & 255) * (var3[0] & 255) / 255;
var7 = (var4.green & 255) * (var3[1] & 255) / 255;
var8 = (var4.blue & 255) * (var3[2] & 255) / 255;
} else if (var1) {
var6 = var3[0] & 255;
var7 = var3[1] & 255;
var8 = var3[2] & 255;
} else if (var2) {
var6 = var4.red & 255;
var7 = var4.green & 255;
var8 = var4.blue & 255;
} else {
if (var5 == null) {
class="kw">return -1;
}
var6 = var5.red & 255;
var7 = var5.green & 255;
var8 = var5.blue & 255;
}
class="kw">return var6 << 16 | var7 << 8 | var8;
}
class="kw">public int findClosestVariant(int var1, @Nonnull String var2) {
this.ensureInitialized();
BlockTypeAssetMap var3 = BlockType.getAssetMap();
BlockType var4 = var3.getAsset(var1);
if (var4 == null) {
class="kw">return -1;
}
int var5 = computeBlockColorRgb(var4);
if (var5 < 0) {
class="kw">return -1;
}
double[] var6 = rgbToLab(var5 >> 16 & 0xFF, var5 >> 8 & 0xFF, var5 & 0xFF);
double var7 = var6[0];
double var9 = var6[1];
double var11 = var6[2];
String var13 = "_" + var2;
double var14 = Double.MAX_VALUE;
int var16 = -1;
for (String var18 : var3.getAssetMap().keySet()) {
if (var18.endsWith(var13)) {
BlockType var19 = var3.getAsset(var18);
if (var19 != null) {
Item var20 = var19.getItem();
if (var20 == null || !this.hiddenQualityIndexes.contains(var20.getQualityIndex())) {
int var21 = computeBlockColorRgb(var19);
if (var21 >= 0) {
double[] var22 = rgbToLab(var21 >> 16 & 0xFF, var21 >> 8 & 0xFF, var21 & 0xFF);
double var23 = colorDistanceLab(var7, var9, var11, var22[0], var22[1], var22[2]);
if (var23 < var14) {
var14 = var23;
var16 = var3.getIndex(var18);
}
}
}
}
}
}
class="kw">return var16;
}
class="kw">public int findDarkerVariant(int var1, float var2) {
this.ensureInitialized();
BlockColorIndex.BlockColorEntry var3 = this.findEntry(var1);
if (var3 == null) {
class="kw">return var1;
}
double var4 = var3.labL * (1.0 - var2);
double var6 = var3.labA;
double var8 = var3.labB;
double var10 = Double.MAX_VALUE;
int var12 = var1;
for (BlockColorIndex.BlockColorEntry var14 : this.entries) {
if (!(var14.labL > var3.labL)) {
double var15 = colorDistanceLab(var4, var6, var8, var14.labL, var14.labA, var14.labB);
if (var15 < var10) {
var10 = var15;
var12 = var14.blockId;
}
}
}
class="kw">return var12;
}
class="kw">public int findLighterVariant(int var1, float var2) {
this.ensureInitialized();
BlockColorIndex.BlockColorEntry var3 = this.findEntry(var1);
if (var3 == null) {
class="kw">return var1;
}
double var4 = var3.labL + (100.0 - var3.labL) * var2;
double var6 = var3.labA;
double var8 = var3.labB;
double var10 = Double.MAX_VALUE;
int var12 = var1;
for (BlockColorIndex.BlockColorEntry var14 : this.entries) {
if (!(var14.labL < var3.labL)) {
double var15 = colorDistanceLab(var4, var6, var8, var14.labL, var14.labA, var14.labB);
if (var15 < var10) {
var10 = var15;
var12 = var14.blockId;
}
}
}
class="kw">return var12;
}
class="kw">public int getBlockColor(int var1) {
this.ensureInitialized();
BlockColorIndex.BlockColorEntry var2 = this.findEntry(var1);
class="kw">return var2 == null ? -1 : var2.r << 16 | var2.g << 8 | var2.b;
}
class="kw">public int findBlockForLerpedColor(int var1, int var2, int var3, int var4, int var5, int var6, float var7) {
this.ensureInitialized();
double[] var8 = rgbToLab(var1, var2, var3);
double[] var9 = rgbToLab(var4, var5, var6);
double var10 = var8[0] + (var9[0] - var8[0]) * var7;
double var12 = var8[1] + (var9[1] - var8[1]) * var7;
double var14 = var8[2] + (var9[2] - var8[2]) * var7;
int[] var16 = labToRgb(var10, var12, var14);
class="kw">return this.findClosestBlock(var16[0], var16[1], var16[2]);
}
class="kw">public boolean isEmpty() {
this.ensureInitialized();
class="kw">return this.entries.isEmpty();
}
@Nullable
class="kw">private BlockColorIndex.BlockColorEntry findEntry(int var1) {
for (BlockColorIndex.BlockColorEntry var3 : this.entries) {
if (var3.blockId == var1) {
class="kw">return var3;
}
}
class="kw">return null;
}
class="kw">private class="kw">static double colorDistanceLab(double var0, double var2, double var4, double var6, double var8, double var10) {
double var12 = var0 - var6;
double var14 = var2 - var8;
double var16 = var4 - var10;
class="kw">return var12 * var12 + var14 * var14 + var16 * var16;
}
class="kw">private class="kw">static double[] rgbToLab(int var0, int var1, int var2) {
double var3 = var0 / 255.0;
double var5 = var1 / 255.0;
double var7 = var2 / 255.0;
var3 = var3 > 0.04045 ? Math.pow((var3 + 0.055) / 1.055, 2.4) : var3 / 12.92;
var5 = var5 > 0.04045 ? Math.pow((var5 + 0.055) / 1.055, 2.4) : var5 / 12.92;
var7 = var7 > 0.04045 ? Math.pow((var7 + 0.055) / 1.055, 2.4) : var7 / 12.92;
double var9 = var3 * 0.4124564 + var5 * 0.3575761 + var7 * 0.1804375;
double var11 = var3 * 0.2126729 + var5 * 0.7151522 + var7 * 0.072175;
double var13 = var3 * 0.0193339 + var5 * 0.119192 + var7 * 0.9503041;
var9 /= 0.95047;
var11 /= 1.0;
var13 /= 1.08883;
var9 = var9 > 0.008856 ? Math.cbrt(var9) : 7.787 * var9 + 0.13793103448275862;
var11 = var11 > 0.008856 ? Math.cbrt(var11) : 7.787 * var11 + 0.13793103448275862;
var13 = var13 > 0.008856 ? Math.cbrt(var13) : 7.787 * var13 + 0.13793103448275862;
double var15 = 116.0 * var11 - 16.0;
double var17 = 500.0 * (var9 - var11);
double var19 = 200.0 * (var11 - var13);
class="kw">return new double[]{var15, var17, var19};
}
class="kw">private class="kw">static int[] labToRgb(double var0, double var2, double var4) {
double var6 = (var0 + 16.0) / 116.0;
double var8 = var2 / 500.0 + var6;
double var10 = var6 - var4 / 200.0;
double var12 = var8 * var8 * var8;
double var14 = var6 * var6 * var6;
double var16 = var10 * var10 * var10;
var8 = var12 > 0.008856 ? var12 : (var8 - 0.13793103448275862) / 7.787;
var6 = var14 > 0.008856 ? var14 : (var6 - 0.13793103448275862) / 7.787;
var10 = var16 > 0.008856 ? var16 : (var10 - 0.13793103448275862) / 7.787;
var8 *= 0.95047;
var6 *= 1.0;
var10 *= 1.08883;
double var18 = var8 * 3.2404542 + var6 * -1.5371385 + var10 * -0.4985314;
double var20 = var8 * -0.969266 + var6 * 1.8760108 + var10 * 0.041556;
double var22 = var8 * 0.0556434 + var6 * -0.2040259 + var10 * 1.0572252;
var18 = var18 > 0.0031308 ? 1.055 * Math.pow(var18, 0.4166666666666667) - 0.055 : 12.92 * var18;
var20 = var20 > 0.0031308 ? 1.055 * Math.pow(var20, 0.4166666666666667) - 0.055 : 12.92 * var20;
var22 = var22 > 0.0031308 ? 1.055 * Math.pow(var22, 0.4166666666666667) - 0.055 : 12.92 * var22;
int var24 = Math.max(0, Math.min(255, (int)Math.round(var18 * 255.0)));
int var25 = Math.max(0, Math.min(255, (int)Math.round(var20 * 255.0)));
int var26 = Math.max(0, Math.min(255, (int)Math.round(var22 * 255.0)));
class="kw">return new int[]{var24, var25, var26};
}
class="kw">private record BlockColorEntry(int blockId, String key, int r, int g, int b, double labL, double labA, double labB) {
class="kw">private BlockColorEntry {
}
}
}