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 {
      }
   }
}