PositionsHorizontalPinchDensity class
Пакет: com.hypixel.hytale.builtin.hytalegenerator.density
Файл: com/hypixel/hytale/builtin/hytalegenerator/density/PositionsHorizontalPinchDensity.java
extends: Density
Поля (17)
| Модификаторы | Тип | Имя |
|---|---|---|
|
boolean |
hasValue |
|
double |
var12 |
|
Vector3d |
var13 |
|
double |
var2 |
|
double |
var3 |
|
int |
var3 |
|
double |
var4 |
|
double |
var5 |
|
|
var7 |
|
double |
var7 |
|
double |
var9 |
|
|
var9 |
|
|
var9 |
|
double |
var9 |
|
Vector3d |
warpVector |
|
double |
x |
|
double |
z |
Методы (11)
| Модификаторы | Возврат | Сигнатура |
|---|---|---|
|
private |
Cacheprivate Cache() |
public |
void |
calculateWarpVectorvoid calculateWarpVector(@Nonnull Density.Context var1, @Nonnull Vector3d var2) |
private |
void |
consumervoid consumer(@Nonnull Vector3d var1, @Nonnull Control var2) |
|
|
for for(int var6 = 0; var6 < var3; var6++) |
|
|
for for(int var11 = 0; var11 < var3; var11++) |
|
|
if if(var7 > var9) |
|
|
if if(this.input == null) |
|
|
if if(this.positions == null) |
|
|
if if(this.cache.x == var1.position.x && this.cache.z == var1.position.z && this.cache.hasValue) |
|
|
if if(var1.length == 0) |
|
|
if if(this.distanceNormalized) |
Исходный код
Показать/скрыть
class="kw">package com.hypixel.hytale.builtin.hytalegenerator.density;
class="kw">import com.hypixel.hytale.builtin.hytalegenerator.ReusableList;
class="kw">import com.hypixel.hytale.builtin.hytalegenerator.math.Calculator;
class="kw">import com.hypixel.hytale.builtin.hytalegenerator.pipe.Control;
class="kw">import com.hypixel.hytale.builtin.hytalegenerator.positionproviders.PositionProvider;
class="kw">import it.unimi.dsi.fastutil.doubles.Double2DoubleFunction;
class="kw">import javax.annotation.Nonnull;
class="kw">import org.joml.Vector3d;
class="kw">import org.joml.Vector3dc;
class="kw">public class PositionsHorizontalPinchDensity class="kw">extends Density {
@Nonnull
class="kw">private Density input;
@Nonnull
class="kw">private class="kw">final PositionProvider positions;
@Nonnull
class="kw">private class="kw">final Double2DoubleFunction pinchCurve;
@Nonnull
class="kw">private class="kw">final PositionsHorizontalPinchDensity.Cache cache;
class="kw">private class="kw">final double maxDistance;
class="kw">private class="kw">final boolean distanceNormalized;
class="kw">private class="kw">final double positionsMinY;
class="kw">private class="kw">final double positionsMaxY;
@Nonnull
class="kw">private class="kw">final Vector3d rWarpVector;
@Nonnull
class="kw">private class="kw">final Vector3d rSamplePoint;
@Nonnull
class="kw">private class="kw">final Vector3d rMin;
@Nonnull
class="kw">private class="kw">final Vector3d rMax;
@Nonnull
class="kw">private class="kw">final Vector3d rPosition;
@Nonnull
class="kw">private class="kw">final Vector3d rConsumerResult;
@Nonnull
class="kw">private class="kw">final ReusableList<Vector3d> rWarpVectors;
@Nonnull
class="kw">private class="kw">final ReusableList<Double> rNormalizedDistances;
@Nonnull
class="kw">private class="kw">final ReusableList<Double> rWeights;
@Nonnull
class="kw">private class="kw">final PositionProvider.Context rPositionsContext;
@Nonnull
class="kw">private class="kw">final Density.Context rChildContext;
class="kw">public PositionsHorizontalPinchDensity(
@Nonnull Density var1, @Nonnull PositionProvider var2, @Nonnull Double2DoubleFunction var3, double var4, boolean var6, double var7, double var9
) {
assert var4 >= 0.0;
if (var7 > var9) {
var7 = var9;
}
this.input = var1;
this.positions = var2;
this.pinchCurve = var3;
this.maxDistance = var4;
this.distanceNormalized = var6;
this.positionsMinY = var7;
this.positionsMaxY = var9;
this.cache = new PositionsHorizontalPinchDensity.Cache();
this.rWarpVector = new Vector3d();
this.rSamplePoint = new Vector3d();
this.rMin = new Vector3d();
this.rMax = new Vector3d();
this.rPosition = new Vector3d();
this.rConsumerResult = new Vector3d();
this.rWarpVectors = new ReusableList<>();
this.rNormalizedDistances = new ReusableList<>();
this.rWeights = new ReusableList<>();
this.rPositionsContext = new PositionProvider.Context();
this.rChildContext = new Density.Context();
}
@Override
class="kw">public double process(@Nonnull Density.Context var1) {
if (this.input == null) {
class="kw">return 0.0;
}
if (this.positions == null) {
class="kw">return this.input.process(var1);
}
if (this.cache.x == var1.position.x && this.cache.z == var1.position.z && this.cache.hasValue) {
this.rWarpVector.set(this.cache.warpVector);
} else {
this.calculateWarpVector(var1, this.rWarpVector);
this.cache.warpVector = this.rWarpVector;
this.cache.x = var1.position.x;
this.cache.z = var1.position.z;
this.cache.hasValue = true;
}
this.rPosition.set(this.rWarpVector.x + var1.position.x, this.rWarpVector.y + var1.position.y, this.rWarpVector.z + var1.position.z);
this.rChildContext.assign(var1);
this.rChildContext.position = this.rPosition;
double var2 = this.input.process(this.rChildContext);
this.rChildContext.clearReferences();
class="kw">return var2;
}
@Override
class="kw">public void setInputs(@Nonnull Density[] var1) {
if (var1.length == 0) {
this.input = new ConstantValueDensity(0.0);
}
this.input = var1[0];
}
class="kw">private void consumer(@Nonnull Vector3d var1, @Nonnull Control var2) {
double var3 = Calculator.distance(var1.x, var1.z, this.rSamplePoint.x, this.rSamplePoint.z);
if (!(var3 > this.maxDistance)) {
double var5 = var3 / this.maxDistance;
this.rConsumerResult.set(var1).sub(this.rSamplePoint);
this.rConsumerResult.y = 0.0;
double var9;
if (this.distanceNormalized) {
var9 = this.pinchCurve.applyAsDouble(var5);
var9 *= this.maxDistance;
} else {
var9 = this.pinchCurve.applyAsDouble(var3);
}
if (!(Math.abs(this.rConsumerResult.length()) < 1.0E-9)) {
this.rConsumerResult.normalize(var9);
}
if (this.rWarpVectors.isAtHardCapacity()) {
this.rWarpVectors.expandAndSet(new Vector3d(this.rConsumerResult));
} else {
this.rWarpVectors.expandAndGet().set(this.rConsumerResult);
}
this.rNormalizedDistances.expandAndSet(var5);
}
}
class="kw">public void calculateWarpVector(@Nonnull Density.Context var1, @Nonnull Vector3d var2) {
this.rMin.set(var1.position.x - this.maxDistance, this.positionsMinY, var1.position.z - this.maxDistance);
this.rMax.set(var1.position.x + this.maxDistance, this.positionsMaxY, var1.position.z + this.maxDistance);
this.rSamplePoint.set(var1.position);
this.rWarpVectors.clear();
this.rNormalizedDistances.clear();
this.rPositionsContext.bounds.min.set(this.rMin);
this.rPositionsContext.bounds.max.set(this.rMax);
this.rPositionsContext.pipe = this::consumer;
this.positions.generate(this.rPositionsContext);
var2.set(0.0, 0.0, 0.0);
if (this.rWarpVectors.getSoftSize() != 0) {
if (this.rWarpVectors.getSoftSize() == 1) {
var2.set((Vector3dc)this.rWarpVectors.get(0));
} else {
int var3 = this.rWarpVectors.getSoftSize();
this.rWeights.clear();
double var4 = 0.0;
for (int var6 = 0; var6 < var3; var6++) {
double var7 = this.rNormalizedDistances.get(var6);
double var9 = 1.0 - var7;
this.rWeights.expandAndSet(var9);
var4 += var9;
}
for (int var11 = 0; var11 < var3; var11++) {
double var12 = this.rWeights.get(var11) / var4;
Vector3d var13 = this.rWarpVectors.get(var11);
var13.mul(var12);
var2.add(var13);
}
}
}
}
class="kw">private class="kw">static class Cache {
double x;
double z;
Vector3d warpVector;
boolean hasValue;
class="kw">private Cache() {
}
}
}