87 lines
2 KiB
Java
87 lines
2 KiB
Java
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 lower, DoubleList upper, boolean excludeUpper, boolean excludeLower) {
|
|
double d = Double.NaN;
|
|
int i = lower.size();
|
|
int j = upper.size();
|
|
int k = i + j;
|
|
this.result = new double[k];
|
|
this.firstIndices = new int[k];
|
|
this.secondIndices = new int[k];
|
|
boolean bl = !excludeUpper;
|
|
boolean bl2 = !excludeLower;
|
|
int l = 0;
|
|
int m = 0;
|
|
int n = 0;
|
|
|
|
while (true) {
|
|
boolean bl3 = m >= i;
|
|
boolean bl4 = n >= j;
|
|
if (bl3 && bl4) {
|
|
this.resultLength = Math.max(1, l);
|
|
return;
|
|
}
|
|
|
|
boolean bl5 = !bl3 && (bl4 || lower.getDouble(m) < upper.getDouble(n) + 1.0E-7);
|
|
if (bl5) {
|
|
m++;
|
|
if (bl && (n == 0 || bl4)) {
|
|
continue;
|
|
}
|
|
} else {
|
|
n++;
|
|
if (bl2 && (m == 0 || bl3)) {
|
|
continue;
|
|
}
|
|
}
|
|
|
|
int o = m - 1;
|
|
int p = n - 1;
|
|
double e = bl5 ? lower.getDouble(o) : upper.getDouble(p);
|
|
if (!(d >= e - 1.0E-7)) {
|
|
this.firstIndices[l] = o;
|
|
this.secondIndices[l] = p;
|
|
this.result[l] = e;
|
|
l++;
|
|
d = e;
|
|
} else {
|
|
this.firstIndices[l - 1] = o;
|
|
this.secondIndices[l - 1] = p;
|
|
}
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public boolean forMergedIndexes(IndexMerger.IndexConsumer consumer) {
|
|
int i = this.resultLength - 1;
|
|
|
|
for (int j = 0; j < i; j++) {
|
|
if (!consumer.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));
|
|
}
|
|
}
|