MeshVoxelizer class
Пакет: com.hypixel.hytale.builtin.buildertools.objimport
Файл: com/hypixel/hytale/builtin/buildertools/objimport/MeshVoxelizer.java
Поля (223)
| Модификаторы | Тип | Имя |
|---|---|---|
|
|
continue |
|
int |
var1 |
|
float |
var10 |
|
float |
var10 |
|
float |
var10 |
|
float |
var10 |
|
int[] |
var10 |
|
int |
var10 |
|
|
var10 |
|
int |
var10 |
|
float |
var11 |
|
List |
var11 |
|
float |
var11 |
|
float |
var11 |
|
float |
var11 |
|
int |
var11 |
|
float |
var12 |
|
List |
var12 |
|
float |
var12 |
|
float |
var12 |
|
float |
var12 |
|
float |
var12 |
|
int |
var12 |
|
int |
var12 |
|
int |
var12 |
|
float[][] |
var13 |
|
List |
var13 |
|
float |
var13 |
|
float |
var13 |
|
float |
var13 |
|
float |
var13 |
|
int |
var13 |
|
int |
var13 |
|
int |
var13 |
|
int |
var14 |
|
|
var14 |
|
|
var14 |
|
List |
var14 |
|
float |
var14 |
|
float |
var14 |
|
float |
var14 |
|
|
var14 |
|
|
var14 |
|
|
var14 |
|
float |
var14 |
|
float |
var14 |
|
int |
var14 |
|
int |
var14 |
|
boolean[][][] |
var14 |
|
int |
var14 |
|
int |
var15 |
|
|
var15 |
|
|
var15 |
|
boolean |
var15 |
|
float |
var15 |
|
float |
var15 |
|
float |
var15 |
|
|
var15 |
|
|
var15 |
|
|
var15 |
|
float |
var15 |
|
float |
var15 |
|
int |
var15 |
|
int |
var15 |
|
int[][][] |
var15 |
|
int |
var16 |
|
|
var16 |
|
|
var16 |
|
int |
var16 |
|
float |
var16 |
|
float |
var16 |
|
|
var16 |
|
|
var16 |
|
|
var16 |
|
float |
var16 |
|
float |
var16 |
|
int |
var16 |
|
float |
var17 |
|
int[] |
var17 |
|
float |
var17 |
|
float |
var17 |
|
|
var17 |
|
|
var17 |
|
|
var17 |
|
float |
var17 |
|
float |
var17 |
|
int |
var17 |
|
float |
var18 |
|
int |
var18 |
|
float |
var18 |
|
float |
var18 |
|
float |
var18 |
|
|
var18 |
|
|
var18 |
|
|
var18 |
|
float |
var18 |
|
float |
var18 |
|
int |
var18 |
|
int |
var18 |
|
float |
var19 |
|
int |
var19 |
|
float |
var19 |
|
float |
var19 |
|
float |
var19 |
|
|
var19 |
|
|
var19 |
|
|
var19 |
|
float |
var19 |
|
float |
var19 |
|
int |
var19 |
|
int |
var19 |
|
float |
var20 |
|
int |
var20 |
|
float |
var20 |
|
int |
var20 |
|
float |
var20 |
|
|
var20 |
|
|
var20 |
|
|
var20 |
|
float |
var20 |
|
float |
var20 |
|
int |
var20 |
|
int |
var20 |
|
float |
var21 |
|
float[] |
var21 |
|
float |
var21 |
|
int |
var21 |
|
float |
var21 |
|
|
var21 |
|
|
var21 |
|
|
var21 |
|
float |
var21 |
|
float |
var21 |
|
float |
var22 |
|
float[] |
var22 |
|
float[] |
var22 |
|
int |
var22 |
|
float |
var22 |
|
float |
var22 |
|
float |
var22 |
|
boolean[][][] |
var22 |
|
float |
var23 |
|
float[] |
var23 |
|
int |
var23 |
|
int |
var23 |
|
float |
var23 |
|
float |
var23 |
|
float |
var23 |
|
float |
var24 |
|
String |
var24 |
|
int |
var24 |
|
int |
var24 |
|
float |
var24 |
|
float |
var24 |
|
float |
var25 |
|
BufferedImage |
var25 |
|
|
var25 |
|
int |
var25 |
|
float |
var25 |
|
float |
var25 |
|
int |
var26 |
|
|
var26 |
|
boolean |
var26 |
|
float |
var26 |
|
float[] |
var27 |
|
float[] |
var27 |
|
|
var27 |
|
float[] |
var28 |
|
|
var28 |
|
boolean[][][] |
var29 |
|
float[] |
var29 |
|
|
var29 |
|
float[] |
var30 |
|
int[] |
var30 |
|
float |
var30 |
|
boolean |
var31 |
|
int |
var31 |
|
float |
var31 |
|
int[][][] |
var32 |
|
int |
var32 |
|
float |
var32 |
|
boolean[][][] |
var33 |
|
int |
var33 |
|
int |
var33 |
|
|
var33 |
|
int |
var34 |
|
float[] |
var34 |
|
float |
var35 |
|
float |
var36 |
|
int |
var37 |
|
int[] |
var38 |
|
int |
var39 |
|
int |
var4 |
|
int |
var4 |
|
int[] |
var5 |
|
int |
var5 |
|
int |
var5 |
|
|
var5 |
|
int |
var6 |
|
float[] |
var6 |
|
int |
var6 |
|
int |
var6 |
|
|
var6 |
|
float[] |
var7 |
|
float |
var7 |
|
float |
var7 |
|
int |
var7 |
|
int |
var7 |
|
|
var7 |
|
float[] |
var8 |
|
float |
var8 |
|
float |
var8 |
|
float |
var8 |
|
int |
var8 |
|
int |
var8 |
|
|
var8 |
|
float |
var9 |
|
float |
var9 |
|
float |
var9 |
|
float |
var9 |
|
boolean[] |
var9 |
|
int |
var9 |
|
|
var9 |
Методы (92)
| Модификаторы | Возврат | Сигнатура |
|---|---|---|
public |
record |
VoxelResultrecord VoxelResult(boolean[][][] voxels, @Nullable int[][][] blockIds, int sizeX, int sizeY, int sizeZ) |
|
public int |
countSolidpublic int countSolid() |
static |
MeshVoxelizer.VoxelResult |
cropToSolidBoundsMeshVoxelizer.VoxelResult cropToSolidBounds(boolean[][][] var0, @Nullable int[][][] var1, int var2, int var3, int var4) |
abstract |
return |
cropToSolidBoundsreturn cropToSolidBounds(var33, var32, var14, var15, var16) |
abstract |
return |
cropToSolidBoundsreturn cropToSolidBounds(var29, var32, var14, var15, var16) |
static |
void |
fillInteriorBlockIdsvoid fillInteriorBlockIds(boolean[][][] var0, boolean[][][] var1, int[][][] var2, int var3, int var4, int var5, int var6) |
abstract |
|
fillInteriorBlockIds fillInteriorBlockIds(var33, var29, var32, var6, var14, var15, var16) |
static |
int |
findNearestSurfaceBlockIdint findNearestSurfaceBlockId(int[][][] var0, boolean[][][] var1, int var2, int var3, int var4, int var5, int var6, int var7) |
static |
boolean[][][] |
floodFillSolidboolean[][][] floodFillSolid(boolean[][][] var0, int var1, int var2, int var3) |
|
|
for for(int var17 = 0; var17 <= var16; var17++) |
|
|
for for(int var27 = var20; var27 <= var21; var27++) |
|
|
for for(int var28 = var22; var28 <= var23; var28++) |
|
|
for for(int var29 = var24; var29 <= var25; var29++) |
|
|
for for(int var23 = 0; var23 < var1; var23++) |
|
|
for for(int var24 = 0; var24 < var2; var24++) |
|
|
for for(int var25 = 0; var25 < var3; var25++) |
|
|
for for(int var11 = 0; var11 < var2; var11++) |
|
|
for for(int var12 = 0; var12 < var3; var12++) |
|
|
for for(int var13 = 0; var13 < var4; var13++) |
|
|
for for(int var16 = 0; var16 < var18; var16++) |
|
|
for for(int var17 = 0; var17 < var19; var17++) |
|
|
for for(int var7 = 0; var7 < var4; var7++) |
|
|
for for(int var8 = 0; var8 < var5; var8++) |
|
|
for for(int var9 = 0; var9 < var6; var9++) |
|
|
for for(int var8 = 1; var8 <= 5; var8++) |
|
|
for for(int var9 = -var8; var9 <= var8; var9++) |
|
|
for for(int var10 = -var8; var10 <= var8; var10++) |
|
|
for for(int var11 = -var8; var11 <= var8; var11++) |
|
|
for for(int var2 = 0; var2 < this.sizeX; var2++) |
|
|
for for(int var3 = 0; var3 < this.sizeY; var3++) |
|
|
for for(int var4 = 0; var4 < this.sizeZ; var4++) |
abstract |
|
for for(int var16 = 0; var16 < var11.size() |
|
public int |
getBlockIdpublic int getBlockId(int var1, int var2, int var3) |
|
|
if if(var9 <= 0.0F) |
|
|
if if(var7) |
|
|
if if(var2) |
|
|
if if(var32 != null) |
|
|
if if(var24 != null) |
|
|
if if(var15) |
|
|
if if(var25 == null && var5 != null) |
|
|
if if(var30 != null && var30.length >= 3) |
|
|
if if(var32 >= 0 && var32 < var31) |
|
|
if if(var33 >= 0 && var33 < var31) |
|
|
if if(var34 >= 0 && var34 < var31) |
|
|
if if(var15 < 0.001F) |
|
|
if if(var0 != null && var1 != null && var2 != null) |
|
|
if if(var4 < 128) |
|
|
if if(var2 >= 0 && var2 < var6 && var3 >= 0 && var3 < var7 && var4 >= 0 && var4 < var8) |
|
|
if if(var1 != null && var5 != 0 && var1[var2][var3][var4] == 0) |
|
|
if if(var26) |
|
|
if if(var34 != null) |
|
|
if if(var37 < 128) |
|
|
if if(var39 > 0) |
|
|
if if(var1 != null && var33 != 0 && var1[var27][var28][var29] == 0) |
|
|
if if(var11 >= var12 && var11 >= var13) |
|
|
if if(var16 < 1.0E-12F) |
|
|
if if(var22 > var6) |
|
|
if if(var4[var12]) |
|
|
if if(var13 >= 0 && var14 >= 0 && var15 >= 0 && var13 < var1 && var14 < var2 && var15 < var3 && var0[var13][var14][var15]) |
|
|
if if(var0[var11][var12][var13]) |
|
|
if if(var11 < var5) |
|
|
if if(var12 < var6) |
|
|
if if(var13 < var7) |
|
|
if if(var11 > var8) |
|
|
if if(var12 > var9) |
|
|
if if(var13 > var10) |
|
|
if if(var8 >= var5 && var9 >= var6 && var10 >= var7) |
|
|
if if(var15 != null && var1 != null) |
|
|
if if(var0[var7][var8][var9] && !var1[var7][var8][var9] && var2[var7][var8][var9] == 0) |
|
|
if if(var12 >= 0
&& var12 < var5
&& var13 >= 0
&& var13 < var6
&& var14 >= 0
&& var14 < var7
&& var1[var12][var13][var14]
&& var0[var12][var13][var14] != 0) |
|
|
if if(this.voxels[var2][var3][var4]) |
|
|
if if(this.blockIds == null) |
static |
boolean |
pointInTriangleWithToleranceboolean pointInTriangleWithTolerance(float var0, float var1, float var2, float[] var3, float[] var4, float[] var5, float var6) |
abstract |
return |
pointInTriangleWithTolerancereturn pointInTriangleWithTolerance(var24, var25, var26, var3, var4, var5, 0.1F) |
static |
boolean |
pointNearTriangleboolean pointNearTriangle(float var0, float var1, float var2, float[] var3, float[] var4, float[] var5, float var6) |
static |
void |
rasterizeLinevoid rasterizeLine(boolean[][][] var0,
@Nullable int[][][] var1,
float[] var2,
float[] var3,
@Nullable float[] var4,
@Nullable float[] var5,
@Nullable BufferedImage var6,
@Nullable BlockColorIndex var7,
int var8,
int var9,
int var10,
int var11) |
abstract |
|
rasterizeLine rasterizeLine(var0, var1, var21, var22, var27, var28, var25, var6, var26, var8, var9, var10) |
abstract |
|
rasterizeLine rasterizeLine(var0, var1, var22, var23, var28, var29, var25, var6, var26, var8, var9, var10) |
abstract |
|
rasterizeLine rasterizeLine(var0, var1, var23, var21, var29, var27, var25, var6, var26, var8, var9, var10) |
static |
void |
rasterizeSurfacevoid rasterizeSurface(boolean[][][] var0,
@Nullable int[][][] var1,
float[][] var2,
ObjParser.ObjMesh var3,
@Nullable Map<String, BufferedImage> var4,
@Nullable Map<String, Integer> var5,
@Nullable BlockColorIndex var6,
int var7,
int var8,
int var9,
int var10) |
abstract |
|
rasterizeSurface rasterizeSurface(var29, var32, var13, var0, var3, var4, var5, var6, var14, var15, var16) |
static |
void |
rasterizeTrianglevoid rasterizeTriangle(boolean[][][] var0,
@Nullable int[][][] var1,
float[] var2,
float[] var3,
float[] var4,
@Nullable float[] var5,
@Nullable float[] var6,
@Nullable float[] var7,
@Nullable BufferedImage var8,
@Nullable BlockColorIndex var9,
int var10,
int var11,
int var12,
int var13) |
abstract |
|
rasterizeTriangle rasterizeTriangle(var0, var1, var21, var22, var23, var27, var28, var29, var25, var6, var26, var8, var9, var10) |
static |
int |
resolveIndexint resolveIndex(int var0, int var1) |
static |
int |
sampleBlockIdint sampleBlockId(@Nullable float[] var0, @Nullable BufferedImage var1, @Nullable BlockColorIndex var2, int var3) |
static |
void |
setVoxelvoid setVoxel(boolean[][][] var0, @Nullable int[][][] var1, int var2, int var3, int var4, int var5, int var6, int var7, int var8) |
static |
boolean |
tryEnqueueboolean tryEnqueue(boolean[][][] var0, int var1, int var2, int var3, boolean[] var4, int[] var5, int var6, int var7, int var8, int var9, int var10, int var11) |
abstract |
return |
voxelizereturn voxelize(var0, var1, var2, null, null, null, 0, false) |
abstract |
return |
voxelizereturn voxelize(var0, var1, var2, null, var3, null, 0, false) |
abstract |
return |
voxelizereturn voxelize(var0, var1, var2, null, var3, null, var4, false) |
abstract |
return |
voxelizereturn voxelize(var0, var1, var2, var3, var4, var5, var6, false) |
|
|
while while(var11 < var12) |
Исходный код
Показать/скрыть
class="kw">package com.hypixel.hytale.builtin.buildertools.objimport;
class="kw">import com.hypixel.hytale.builtin.buildertools.BlockColorIndex;
class="kw">import java.awt.image.BufferedImage;
class="kw">import java.util.List;
class="kw">import java.util.Map;
class="kw">import javax.annotation.Nonnull;
class="kw">import javax.annotation.Nullable;
class="kw">public class="kw">final class MeshVoxelizer {
class="kw">private MeshVoxelizer() {
}
@Nonnull
class="kw">public class="kw">static MeshVoxelizer.VoxelResult voxelize(@Nonnull ObjParser.ObjMesh var0, int var1, boolean var2) {
class="kw">return voxelize(var0, var1, var2, null, null, null, 0, false);
}
@Nonnull
class="kw">public class="kw">static MeshVoxelizer.VoxelResult voxelize(@Nonnull ObjParser.ObjMesh var0, int var1, boolean var2, @Nullable Map<String, Integer> var3) {
class="kw">return voxelize(var0, var1, var2, null, var3, null, 0, false);
}
@Nonnull
class="kw">public class="kw">static MeshVoxelizer.VoxelResult voxelize(@Nonnull ObjParser.ObjMesh var0, int var1, boolean var2, @Nullable Map<String, Integer> var3, int var4) {
class="kw">return voxelize(var0, var1, var2, null, var3, null, var4, false);
}
@Nonnull
class="kw">public class="kw">static MeshVoxelizer.VoxelResult voxelize(
@Nonnull ObjParser.ObjMesh var0,
int var1,
boolean var2,
@Nullable Map<String, BufferedImage> var3,
@Nullable Map<String, Integer> var4,
@Nullable BlockColorIndex var5,
int var6
) {
class="kw">return voxelize(var0, var1, var2, var3, var4, var5, var6, false);
}
@Nonnull
class="kw">public class="kw">static MeshVoxelizer.VoxelResult voxelize(
@Nonnull ObjParser.ObjMesh var0,
int var1,
boolean var2,
@Nullable Map<String, BufferedImage> var3,
@Nullable Map<String, Integer> var4,
@Nullable BlockColorIndex var5,
int var6,
boolean var7
) {
float[] var8 = var0.getBounds();
float var9 = var8[4] - var8[1];
float var10 = var8[3] - var8[0];
float var11 = var8[5] - var8[2];
if (var9 <= 0.0F) {
class="kw">return new MeshVoxelizer.VoxelResult(new boolean[1][1][1], null, 1, 1, 1);
}
float var12 = var1 / var9;
float[][] var13 = new float[var0.vertices().size()][3];
int var14;
int var15;
int var16;
if (var7) {
float var17 = var8[0] * var12;
float var18 = var8[3] * var12;
float var19 = var8[1] * var12;
float var20 = var8[4] * var12;
float var21 = var8[2] * var12;
float var22 = var8[5] * var12;
float var23 = var17 < 0.0F ? -var17 + 1.0F : 1.0F;
float var24 = var19 < 0.0F ? -var19 + 1.0F : 1.0F;
float var25 = var21 < 0.0F ? -var21 + 1.0F : 1.0F;
for (int var26 = 0; var26 < var0.vertices().size(); var26++) {
float[] var27 = var0.vertices().get(var26);
var13[var26][0] = var27[0] * var12 + var23;
var13[var26][1] = var27[1] * var12 + var24;
var13[var26][2] = var27[2] * var12 + var25;
}
var14 = Math.max(1, (int)Math.ceil(var18 + var23)) + 2;
var15 = Math.max(1, (int)Math.ceil(var20 + var24)) + 2;
var16 = Math.max(1, (int)Math.ceil(var22 + var25)) + 2;
} else {
var14 = Math.max(1, (int)Math.ceil(var10 * var12)) + 2;
var15 = Math.max(1, var1) + 2;
var16 = Math.max(1, (int)Math.ceil(var11 * var12)) + 2;
for (int var28 = 0; var28 < var0.vertices().size(); var28++) {
float[] var30 = var0.vertices().get(var28);
var13[var28][0] = (var30[0] - var8[0]) * var12 + 1.0F;
var13[var28][1] = (var30[1] - var8[1]) * var12 + 1.0F;
var13[var28][2] = (var30[2] - var8[2]) * var12 + 1.0F;
}
}
boolean[][][] var29 = new boolean[var14][var15][var16];
boolean var31 = var3 != null && !var3.isEmpty() && var5 != null;
int[][][] var32 = !var31 && var4 == null && var6 == 0 ? null : new int[var14][var15][var16];
rasterizeSurface(var29, var32, var13, var0, var3, var4, var5, var6, var14, var15, var16);
if (var2) {
boolean[][][] var33 = floodFillSolid(var29, var14, var15, var16);
if (var32 != null) {
fillInteriorBlockIds(var33, var29, var32, var6, var14, var15, var16);
}
class="kw">return cropToSolidBounds(var33, var32, var14, var15, var16);
} else {
class="kw">return cropToSolidBounds(var29, var32, var14, var15, var16);
}
}
class="kw">private class="kw">static int resolveIndex(int var0, int var1) {
class="kw">return var0 < 0 ? var1 + var0 : var0;
}
class="kw">private class="kw">static void rasterizeSurface(
boolean[][][] var0,
@Nullable int[][][] var1,
float[][] var2,
ObjParser.ObjMesh var3,
@Nullable Map<String, BufferedImage> var4,
@Nullable Map<String, Integer> var5,
@Nullable BlockColorIndex var6,
int var7,
int var8,
int var9,
int var10
) {
List var11 = var3.faces();
List var12 = var3.faceUvIndices();
List var13 = var3.uvCoordinates();
List var14 = var3.faceMaterials();
boolean var15 = var4 != null && !var4.isEmpty() && var6 != null;
for (int var16 = 0; var16 < var11.size(); var16++) {
int[] var17 = var11.get(var16);
int var18 = resolveIndex(var17[0], var2.length);
int var19 = resolveIndex(var17[1], var2.length);
int var20 = resolveIndex(var17[2], var2.length);
float[] var21 = var2[var18];
float[] var22 = var2[var19];
float[] var23 = var2[var20];
String var24 = var16 < var14.size() ? var14.get(var16) : null;
BufferedImage var25 = null;
int var26 = var7;
if (var24 != null) {
if (var15) {
var25 = var4.get(var24);
}
if (var25 == null && var5 != null) {
var26 = var5.getOrDefault(var24, var7);
}
}
float[] var27 = null;
float[] var28 = null;
float[] var29 = null;
if (var25 != null && var16 < var12.size()) {
int[] var30 = var12.get(var16);
if (var30 != null && var30.length >= 3) {
int var31 = var13.size();
int var32 = resolveIndex(var30[0], var31);
int var33 = resolveIndex(var30[1], var31);
int var34 = resolveIndex(var30[2], var31);
if (var32 >= 0 && var32 < var31) {
var27 = var13.get(var32);
}
if (var33 >= 0 && var33 < var31) {
var28 = var13.get(var33);
}
if (var34 >= 0 && var34 < var31) {
var29 = var13.get(var34);
}
}
}
rasterizeLine(var0, var1, var21, var22, var27, var28, var25, var6, var26, var8, var9, var10);
rasterizeLine(var0, var1, var22, var23, var28, var29, var25, var6, var26, var8, var9, var10);
rasterizeLine(var0, var1, var23, var21, var29, var27, var25, var6, var26, var8, var9, var10);
rasterizeTriangle(var0, var1, var21, var22, var23, var27, var28, var29, var25, var6, var26, var8, var9, var10);
}
}
class="kw">private class="kw">static void rasterizeLine(
boolean[][][] var0,
@Nullable int[][][] var1,
float[] var2,
float[] var3,
@Nullable float[] var4,
@Nullable float[] var5,
@Nullable BufferedImage var6,
@Nullable BlockColorIndex var7,
int var8,
int var9,
int var10,
int var11
) {
float var12 = var3[0] - var2[0];
float var13 = var3[1] - var2[1];
float var14 = var3[2] - var2[2];
float var15 = (float)Math.sqrt(var12 * var12 + var13 * var13 + var14 * var14);
if (var15 < 0.001F) {
int var24 = sampleBlockId(var4, var6, var7, var8);
setVoxel(var0, var1, (int)var2[0], (int)var2[1], (int)var2[2], var24, var9, var10, var11);
} else {
int var16 = (int)Math.ceil(var15 * 2.0F) + 1;
for (int var17 = 0; var17 <= var16; var17++) {
float var18 = (float)var17 / var16;
float var19 = var2[0] + var12 * var18;
float var20 = var2[1] + var13 * var18;
float var21 = var2[2] + var14 * var18;
float[] var22 = interpolateUv(var4, var5, var18);
int var23 = sampleBlockId(var22, var6, var7, var8);
setVoxel(var0, var1, (int)var19, (int)var20, (int)var21, var23, var9, var10, var11);
}
}
}
@Nullable
class="kw">private class="kw">static float[] interpolateUv(@Nullable float[] var0, @Nullable float[] var1, float var2) {
class="kw">return var0 != null && var1 != null ? new float[]{var0[0] + (var1[0] - var0[0]) * var2, var0[1] + (var1[1] - var0[1]) * var2} : var0;
}
class="kw">private class="kw">static int sampleBlockId(@Nullable float[] var0, @Nullable BufferedImage var1, @Nullable BlockColorIndex var2, int var3) {
if (var0 != null && var1 != null && var2 != null) {
int var4 = TextureSampler.sampleAlphaAt(var1, var0[0], var0[1]);
if (var4 < 128) {
class="kw">return 0;
}
int[] var5 = TextureSampler.sampleAt(var1, var0[0], var0[1]);
int var6 = var2.findClosestBlock(var5[0], var5[1], var5[2]);
class="kw">return var6 > 0 ? var6 : var3;
} else {
class="kw">return var3;
}
}
class="kw">private class="kw">static void setVoxel(boolean[][][] var0, @Nullable int[][][] var1, int var2, int var3, int var4, int var5, int var6, int var7, int var8) {
if (var2 >= 0 && var2 < var6 && var3 >= 0 && var3 < var7 && var4 >= 0 && var4 < var8) {
var0[var2][var3][var4] = true;
if (var1 != null && var5 != 0 && var1[var2][var3][var4] == 0) {
var1[var2][var3][var4] = var5;
}
}
}
class="kw">private class="kw">static void rasterizeTriangle(
boolean[][][] var0,
@Nullable int[][][] var1,
float[] var2,
float[] var3,
float[] var4,
@Nullable float[] var5,
@Nullable float[] var6,
@Nullable float[] var7,
@Nullable BufferedImage var8,
@Nullable BlockColorIndex var9,
int var10,
int var11,
int var12,
int var13
) {
float var14 = Math.min(var2[0], Math.min(var3[0], var4[0]));
float var15 = Math.max(var2[0], Math.max(var3[0], var4[0]));
float var16 = Math.min(var2[1], Math.min(var3[1], var4[1]));
float var17 = Math.max(var2[1], Math.max(var3[1], var4[1]));
float var18 = Math.min(var2[2], Math.min(var3[2], var4[2]));
float var19 = Math.max(var2[2], Math.max(var3[2], var4[2]));
int var20 = Math.max(0, (int)Math.floor(var14) - 1);
int var21 = Math.min(var11 - 1, (int)Math.ceil(var15) + 1);
int var22 = Math.max(0, (int)Math.floor(var16) - 1);
int var23 = Math.min(var12 - 1, (int)Math.ceil(var17) + 1);
int var24 = Math.max(0, (int)Math.floor(var18) - 1);
int var25 = Math.min(var13 - 1, (int)Math.ceil(var19) + 1);
boolean var26 = var5 != null && var6 != null && var7 != null && var8 != null && var9 != null;
for (int var27 = var20; var27 <= var21; var27++) {
for (int var28 = var22; var28 <= var23; var28++) {
for (int var29 = var24; var29 <= var25; var29++) {
float var30 = var27 + 0.5F;
float var31 = var28 + 0.5F;
float var32 = var29 + 0.5F;
if (pointNearTriangle(var30, var31, var32, var2, var3, var4, 0.87F)) {
int var33 = var10;
if (var26) {
float[] var34 = barycentric(var30, var31, var32, var2, var3, var4);
if (var34 != null) {
float var35 = var34[0] * var5[0] + var34[1] * var6[0] + var34[2] * var7[0];
float var36 = var34[0] * var5[1] + var34[1] * var6[1] + var34[2] * var7[1];
int var37 = TextureSampler.sampleAlphaAt(var8, var35, var36);
if (var37 < 128) {
class="kw">continue;
}
int[] var38 = TextureSampler.sampleAt(var8, var35, var36);
int var39 = var9.findClosestBlock(var38[0], var38[1], var38[2]);
if (var39 > 0) {
var33 = var39;
}
}
}
var0[var27][var28][var29] = true;
if (var1 != null && var33 != 0 && var1[var27][var28][var29] == 0) {
var1[var27][var28][var29] = var33;
}
}
}
}
}
}
@Nullable
class="kw">private class="kw">static float[] barycentric(float var0, float var1, float var2, float[] var3, float[] var4, float[] var5) {
float[] var6 = new float[]{var4[0] - var3[0], var4[1] - var3[1], var4[2] - var3[2]};
float[] var7 = new float[]{var5[0] - var3[0], var5[1] - var3[1], var5[2] - var3[2]};
float var8 = var6[1] * var7[2] - var6[2] * var7[1];
float var9 = var6[2] * var7[0] - var6[0] * var7[2];
float var10 = var6[0] * var7[1] - var6[1] * var7[0];
float var11 = Math.abs(var8);
float var12 = Math.abs(var9);
float var13 = Math.abs(var10);
float var14;
float var15;
float var16;
float var17;
float var18;
float var19;
float var20;
float var21;
if (var11 >= var12 && var11 >= var13) {
var14 = var3[1];
var17 = var3[2];
var15 = var4[1];
var18 = var4[2];
var16 = var5[1];
var19 = var5[2];
var20 = var1;
var21 = var2;
} else if (var12 >= var11 && var12 >= var13) {
var14 = var3[0];
var17 = var3[2];
var15 = var4[0];
var18 = var4[2];
var16 = var5[0];
var19 = var5[2];
var20 = var0;
var21 = var2;
} else {
var14 = var3[0];
var17 = var3[1];
var15 = var4[0];
var18 = var4[1];
var16 = var5[0];
var19 = var5[1];
var20 = var0;
var21 = var1;
}
float var22 = (var18 - var19) * (var14 - var16) + (var16 - var15) * (var17 - var19);
if (Math.abs(var22) < 1.0E-10F) {
class="kw">return null;
}
float var23 = ((var18 - var19) * (var20 - var16) + (var16 - var15) * (var21 - var19)) / var22;
float var24 = ((var19 - var17) * (var20 - var16) + (var14 - var16) * (var21 - var19)) / var22;
float var25 = 1.0F - var23 - var24;
class="kw">return new float[]{var23, var24, var25};
}
class="kw">private class="kw">static boolean pointNearTriangle(float var0, float var1, float var2, float[] var3, float[] var4, float[] var5, float var6) {
float var7 = var4[0] - var3[0];
float var8 = var4[1] - var3[1];
float var9 = var4[2] - var3[2];
float var10 = var5[0] - var3[0];
float var11 = var5[1] - var3[1];
float var12 = var5[2] - var3[2];
float var13 = var8 * var12 - var9 * var11;
float var14 = var9 * var10 - var7 * var12;
float var15 = var7 * var11 - var8 * var10;
float var16 = var13 * var13 + var14 * var14 + var15 * var15;
if (var16 < 1.0E-12F) {
class="kw">return false;
}
float var17 = (float)Math.sqrt(var16);
float var18 = var0 - var3[0];
float var19 = var1 - var3[1];
float var20 = var2 - var3[2];
float var21 = var13 * var18 + var14 * var19 + var15 * var20;
float var22 = Math.abs(var21) / var17;
if (var22 > var6) {
class="kw">return false;
}
float var23 = var21 / var16;
float var24 = var0 - var23 * var13;
float var25 = var1 - var23 * var14;
float var26 = var2 - var23 * var15;
class="kw">return pointInTriangleWithTolerance(var24, var25, var26, var3, var4, var5, 0.1F);
}
class="kw">private class="kw">static boolean pointInTriangleWithTolerance(float var0, float var1, float var2, float[] var3, float[] var4, float[] var5, float var6) {
float var7 = var4[0] - var3[0];
float var8 = var4[1] - var3[1];
float var9 = var4[2] - var3[2];
float var10 = var5[0] - var3[0];
float var11 = var5[1] - var3[1];
float var12 = var5[2] - var3[2];
float var13 = var0 - var3[0];
float var14 = var1 - var3[1];
float var15 = var2 - var3[2];
float var16 = var7 * var7 + var8 * var8 + var9 * var9;
float var17 = var7 * var10 + var8 * var11 + var9 * var12;
float var18 = var10 * var10 + var11 * var11 + var12 * var12;
float var19 = var13 * var7 + var14 * var8 + var15 * var9;
float var20 = var13 * var10 + var14 * var11 + var15 * var12;
float var21 = var16 * var18 - var17 * var17;
if (Math.abs(var21) < 1.0E-12F) {
class="kw">return false;
}
float var22 = (var18 * var19 - var17 * var20) / var21;
float var23 = (var16 * var20 - var17 * var19) / var21;
class="kw">return var22 >= -var6 && var23 >= -var6 && var22 + var23 <= 1.0F + var6;
}
class="kw">private class="kw">static boolean[][][] floodFillSolid(boolean[][][] var0, int var1, int var2, int var3) {
int var4 = var1 + 2;
int var5 = var2 + 2;
int var6 = var3 + 2;
int var7 = var4 * var5;
int var8 = var7 * var6;
boolean[] var9 = new boolean[var8];
int[] var10 = new int[var8];
int var11 = 0;
int var12 = 0;
var9[0] = true;
var10[var12++] = 0;
while (var11 < var12) {
int var13 = var10[var11++];
int var14 = var13 % var4;
int var15 = var13 / var4 % var5;
int var16 = var13 / var7;
if (var14 + 1 < var4 && tryEnqueue(var0, var1, var2, var3, var9, var10, var14 + 1, var15, var16, var4, var7, var12)) {
var12++;
}
if (var14 - 1 >= 0 && tryEnqueue(var0, var1, var2, var3, var9, var10, var14 - 1, var15, var16, var4, var7, var12)) {
var12++;
}
if (var15 + 1 < var5 && tryEnqueue(var0, var1, var2, var3, var9, var10, var14, var15 + 1, var16, var4, var7, var12)) {
var12++;
}
if (var15 - 1 >= 0 && tryEnqueue(var0, var1, var2, var3, var9, var10, var14, var15 - 1, var16, var4, var7, var12)) {
var12++;
}
if (var16 + 1 < var6 && tryEnqueue(var0, var1, var2, var3, var9, var10, var14, var15, var16 + 1, var4, var7, var12)) {
var12++;
}
if (var16 - 1 >= 0 && tryEnqueue(var0, var1, var2, var3, var9, var10, var14, var15, var16 - 1, var4, var7, var12)) {
var12++;
}
}
boolean[][][] var22 = new boolean[var1][var2][var3];
for (int var23 = 0; var23 < var1; var23++) {
for (int var24 = 0; var24 < var2; var24++) {
for (int var25 = 0; var25 < var3; var25++) {
int var17 = var23 + 1;
int var18 = var24 + 1;
int var19 = var25 + 1;
int var20 = var17 + var18 * var4 + var19 * var7;
var22[var23][var24][var25] = !var9[var20];
}
}
}
class="kw">return var22;
}
class="kw">private class="kw">static boolean tryEnqueue(
boolean[][][] var0, int var1, int var2, int var3, boolean[] var4, int[] var5, int var6, int var7, int var8, int var9, int var10, int var11
) {
int var12 = var6 + var7 * var9 + var8 * var10;
if (var4[var12]) {
class="kw">return false;
}
int var13 = var6 - 1;
int var14 = var7 - 1;
int var15 = var8 - 1;
if (var13 >= 0 && var14 >= 0 && var15 >= 0 && var13 < var1 && var14 < var2 && var15 < var3 && var0[var13][var14][var15]) {
class="kw">return false;
}
var4[var12] = true;
var5[var11] = var12;
class="kw">return true;
}
class="kw">private class="kw">static MeshVoxelizer.VoxelResult cropToSolidBounds(boolean[][][] var0, @Nullable int[][][] var1, int var2, int var3, int var4) {
int var5 = var2;
int var6 = var3;
int var7 = var4;
int var8 = -1;
int var9 = -1;
int var10 = -1;
for (int var11 = 0; var11 < var2; var11++) {
for (int var12 = 0; var12 < var3; var12++) {
for (int var13 = 0; var13 < var4; var13++) {
if (var0[var11][var12][var13]) {
if (var11 < var5) {
var5 = var11;
}
if (var12 < var6) {
var6 = var12;
}
if (var13 < var7) {
var7 = var13;
}
if (var11 > var8) {
var8 = var11;
}
if (var12 > var9) {
var9 = var12;
}
if (var13 > var10) {
var10 = var13;
}
}
}
}
}
if (var8 >= var5 && var9 >= var6 && var10 >= var7) {
int var18 = var8 - var5 + 1;
int var19 = var9 - var6 + 1;
int var20 = var10 - var7 + 1;
boolean[][][] var14 = new boolean[var18][var19][var20];
int[][][] var15 = var1 != null ? new int[var18][var19][var20] : null;
for (int var16 = 0; var16 < var18; var16++) {
for (int var17 = 0; var17 < var19; var17++) {
System.arraycopy(var0[var5 + var16][var6 + var17], var7, var14[var16][var17], 0, var20);
if (var15 != null && var1 != null) {
System.arraycopy(var1[var5 + var16][var6 + var17], var7, var15[var16][var17], 0, var20);
}
}
}
class="kw">return new MeshVoxelizer.VoxelResult(var14, var15, var18, var19, var20);
} else {
class="kw">return new MeshVoxelizer.VoxelResult(new boolean[1][1][1], null, 1, 1, 1);
}
}
class="kw">private class="kw">static void fillInteriorBlockIds(boolean[][][] var0, boolean[][][] var1, int[][][] var2, int var3, int var4, int var5, int var6) {
for (int var7 = 0; var7 < var4; var7++) {
for (int var8 = 0; var8 < var5; var8++) {
for (int var9 = 0; var9 < var6; var9++) {
if (var0[var7][var8][var9] && !var1[var7][var8][var9] && var2[var7][var8][var9] == 0) {
int var10 = findNearestSurfaceBlockId(var2, var1, var7, var8, var9, var4, var5, var6);
var2[var7][var8][var9] = var10 != 0 ? var10 : var3;
}
}
}
}
}
class="kw">private class="kw">static int findNearestSurfaceBlockId(int[][][] var0, boolean[][][] var1, int var2, int var3, int var4, int var5, int var6, int var7) {
for (int var8 = 1; var8 <= 5; var8++) {
for (int var9 = -var8; var9 <= var8; var9++) {
for (int var10 = -var8; var10 <= var8; var10++) {
for (int var11 = -var8; var11 <= var8; var11++) {
int var12 = var2 + var9;
int var13 = var3 + var10;
int var14 = var4 + var11;
if (var12 >= 0
&& var12 < var5
&& var13 >= 0
&& var13 < var6
&& var14 >= 0
&& var14 < var7
&& var1[var12][var13][var14]
&& var0[var12][var13][var14] != 0) {
class="kw">return var0[var12][var13][var14];
}
}
}
}
}
class="kw">return 0;
}
class="kw">public record VoxelResult(boolean[][][] voxels, @Nullable int[][][] blockIds, int sizeX, int sizeY, int sizeZ) {
class="kw">public VoxelResult {
}
class="kw">public int countSolid() {
int var1 = 0;
for (int var2 = 0; var2 < this.sizeX; var2++) {
for (int var3 = 0; var3 < this.sizeY; var3++) {
for (int var4 = 0; var4 < this.sizeZ; var4++) {
if (this.voxels[var2][var3][var4]) {
var1++;
}
}
}
}
class="kw">return var1;
}
class="kw">public int getBlockId(int var1, int var2, int var3) {
if (this.blockIds == null) {
class="kw">return 0;
} else {
class="kw">return var1 >= 0 && var1 < this.sizeX && var2 >= 0 && var2 < this.sizeY && var3 >= 0 && var3 < this.sizeZ ? this.blockIds[var1][var2][var3] : 0;
}
}
}
}