Code/net/minecraft/world/phys/shapes/IndirectMerger.java

87 lines
2.6 KiB
Java
Raw Normal View History

2025-07-01 06:20:03 +00:00
package net.minecraft.world.phys.shapes;
import it.unimi.dsi.fastutil.doubles.DoubleArrayList;
import it.unimi.dsi.fastutil.doubles.DoubleList;
import it.unimi.dsi.fastutil.doubles.DoubleLists;
public class IndirectMerger implements IndexMerger {
private static final DoubleList EMPTY = DoubleLists.unmodifiable(DoubleArrayList.wrap(new double[]{0.0}));
private final double[] result;
private final int[] firstIndices;
private final int[] secondIndices;
private final int resultLength;
public IndirectMerger(DoubleList p_83001_, DoubleList p_83002_, boolean p_83003_, boolean p_83004_) {
double d0 = Double.NaN;
int i = p_83001_.size();
int j = p_83002_.size();
int k = i + j;
this.result = new double[k];
this.firstIndices = new int[k];
this.secondIndices = new int[k];
boolean flag = !p_83003_;
boolean flag1 = !p_83004_;
int l = 0;
int i1 = 0;
int j1 = 0;
while (true) {
boolean flag2 = i1 >= i;
boolean flag3 = j1 >= j;
if (flag2 && flag3) {
this.resultLength = Math.max(1, l);
return;
}
boolean flag4 = !flag2 && (flag3 || p_83001_.getDouble(i1) < p_83002_.getDouble(j1) + 1.0E-7);
if (flag4) {
i1++;
if (flag && (j1 == 0 || flag3)) {
continue;
}
} else {
j1++;
if (flag1 && (i1 == 0 || flag2)) {
continue;
}
}
int k1 = i1 - 1;
int l1 = j1 - 1;
double d1 = flag4 ? p_83001_.getDouble(k1) : p_83002_.getDouble(l1);
if (!(d0 >= d1 - 1.0E-7)) {
this.firstIndices[l] = k1;
this.secondIndices[l] = l1;
this.result[l] = d1;
l++;
d0 = d1;
} else {
this.firstIndices[l - 1] = k1;
this.secondIndices[l - 1] = l1;
}
}
}
@Override
public boolean forMergedIndexes(IndexMerger.IndexConsumer p_83007_) {
int i = this.resultLength - 1;
for (int j = 0; j < i; j++) {
if (!p_83007_.merge(this.firstIndices[j], this.secondIndices[j], j)) {
return false;
}
}
return true;
}
@Override
public int size() {
return this.resultLength;
}
@Override
public DoubleList getList() {
return (DoubleList)(this.resultLength <= 1 ? EMPTY : DoubleArrayList.wrap(this.result, this.resultLength));
}
}