HyCodeYourTale
classpublicPriority 3

ShellDensity

com.hypixel.hytale.builtin.hytalegenerator.density.nodes.ShellDensity

extends Density

1

Methods

1

Public Methods

4

Fields

1

Constructors

Constants

doubleZERO_DELTA= 1.0E-9

Constructors

public
ShellDensity(Double2DoubleFunction angleCurve, Double2DoubleFunction distanceCurve, Vector3d axis, boolean isMirrored)

Methods

Public Methods (1)

public
double process(Density.Context context)
@Override

Fields

Private/Package Fields (4)

privateDouble2DoubleFunction angleCurve
privateVector3d axis
privateDouble2DoubleFunction distanceCurve
privateboolean isMirrored

Inheritance

Parent
Current
Interface
Child

Use mouse wheel to zoom, drag to pan. Click nodes to navigate.

Related Classes

Source Code

package com.hypixel.hytale.builtin.hytalegenerator.density.nodes;

import com.hypixel.hytale.builtin.hytalegenerator.VectorUtil;
import com.hypixel.hytale.builtin.hytalegenerator.density.Density;
import com.hypixel.hytale.builtin.hytalegenerator.framework.math.Calculator;
import com.hypixel.hytale.math.vector.Vector3d;
import it.unimi.dsi.fastutil.doubles.Double2DoubleFunction;
import javax.annotation.Nonnull;

public class ShellDensity extends Density {
   public static final double ZERO_DELTA = 1.0E-9;
   @Nonnull
   private final Double2DoubleFunction angleCurve;
   @Nonnull
   private final Double2DoubleFunction distanceCurve;
   @Nonnull
   private final Vector3d axis;
   private final boolean isMirrored;

   public ShellDensity(@Nonnull Double2DoubleFunction angleCurve, @Nonnull Double2DoubleFunction distanceCurve, @Nonnull Vector3d axis, boolean isMirrored) {
      this.angleCurve = angleCurve;
      this.distanceCurve = distanceCurve;
      this.axis = axis;
      this.isMirrored = isMirrored;
   }

   @Override
   public double process(@Nonnull Density.Context context) {
      double distance = Calculator.distance(context.position, Vector3d.ZERO);
      if (this.axis.length() == 0.0) {
         return 0.0;
      } else {
         Vector3d radialVector = context.position.clone();
         double amplitude = this.distanceCurve.applyAsDouble(distance);
         if (amplitude == 0.0) {
            return 0.0;
         } else if (radialVector.length() <= 1.0E-9) {
            return amplitude;
         } else {
            double angle = VectorUtil.angle(radialVector, this.axis);
            angle /= 3.141592653589793;
            angle *= 180.0;
            if (this.isMirrored && angle > 90.0) {
               angle = 180.0 - angle;
            }

            return amplitude * this.angleCurve.applyAsDouble(angle);
         }
      }
   }
}