HyCodeYourTale
classpublicPriority 3

DistortedEllipsoidShape

com.hypixel.hytale.server.worldgen.cave.shape.distorted.DistortedEllipsoidShape

extends AbstractDistortedBody

7

Methods

7

Public Methods

9

Fields

1

Constructors

Constructors

public
DistortedEllipsoidShape(Vector3d o, Vector3d d, double yaw, double pitch, double radiusX, double radiusY, double radiusZ, GeneralNoise.InterpolationFunction interpolation)

Methods

Public Methods (7)

public
Vector3d getAnchor(Vector3d vector, double tx, double ty, double tz)
@Nonnull@Override
public
double getHeightAt(double t)
@Override
public
double getProjection(double x, double z)
@Override
public
double getWidthAt(double t)
@Override
public
double getYAt(double t)
@Override
public
boolean isValidProjection(double t)
@Override
public
String toString()
@Nonnull@Override

Fields

Private/Package Fields (9)

privateGeneralNoise.InterpolationFunction interpolation
privatedouble invRadiusX2
privatedouble invRadiusZ2
privatedouble radiusX
privatedouble radiusX2
privatedouble radiusY
privatedouble radiusY2
privatedouble radiusZ
privatedouble radiusZ2

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.server.worldgen.cave.shape.distorted;

import com.hypixel.hytale.math.vector.Vector3d;
import com.hypixel.hytale.procedurallib.logic.GeneralNoise;
import com.hypixel.hytale.server.worldgen.cave.CaveType;
import com.hypixel.hytale.server.worldgen.cave.shape.CaveNodeShapeUtils;
import javax.annotation.Nonnull;

public class DistortedEllipsoidShape extends AbstractDistortedBody {
   private final double radiusX;
   private final double radiusY;
   private final double radiusZ;
   private final double radiusX2;
   private final double radiusY2;
   private final double radiusZ2;
   private final double invRadiusX2;
   private final double invRadiusZ2;
   private final GeneralNoise.InterpolationFunction interpolation;

   public DistortedEllipsoidShape(
      @Nonnull Vector3d o,
      Vector3d d,
      double yaw,
      double pitch,
      double radiusX,
      double radiusY,
      double radiusZ,
      GeneralNoise.InterpolationFunction interpolation
   ) {
      super(o, d, yaw, pitch, radiusX, radiusY, radiusZ);
      this.radiusX = radiusX;
      this.radiusY = radiusY;
      this.radiusZ = radiusZ;
      this.radiusX2 = radiusX * radiusX;
      this.radiusY2 = radiusY * radiusY;
      this.radiusZ2 = radiusZ * radiusZ;
      this.invRadiusX2 = 1.0 / this.radiusX2;
      this.invRadiusZ2 = 1.0 / this.radiusZ2;
      this.interpolation = interpolation;
   }

   @Nonnull
   @Override
   public Vector3d getAnchor(@Nonnull Vector3d vector, double tx, double ty, double tz) {
      return CaveNodeShapeUtils.getSphereAnchor(vector, this.o, this.radiusX, this.radiusY, this.radiusZ, tx, ty, tz);
   }

   @Override
   public double getProjection(double x, double z) {
      return 0.0;
   }

   @Override
   public boolean isValidProjection(double t) {
      return true;
   }

   @Override
   public double getYAt(double t) {
      return this.o.y;
   }

   @Override
   public double getWidthAt(double t) {
      return Math.min(this.radiusX, this.radiusZ);
   }

   @Override
   public double getHeightAt(double t) {
      return this.radiusY;
   }

   @Override
   protected double getHeight(int seed, double x, double z, double t, double centerY, CaveType caveType, @Nonnull ShapeDistortion distortion) {
      double dx = x - this.o.x;
      double dz = z - this.o.z;
      double dx2 = dx * dx;
      if (dx2 > this.radiusX2) {
         return 0.0;
      } else {
         double dz2 = dz * dz;
         if (dz2 > this.radiusZ2) {
            return 0.0;
         } else {
            double qx = this.interpolation.interpolate(dx2 * this.invRadiusX2);
            double qz = this.interpolation.interpolate(dz2 * this.invRadiusZ2);
            double qh = qx + qz;
            double noise = distortion.getWidthFactor(seed, x, z);
            if (noise > 0.0) {
               qh /= noise;
            }

            double y2 = (1.0 - qh) * this.radiusY2;
            return y2 <= 0.0 ? 0.0 : Math.sqrt(y2);
         }
      }
   }

   @Nonnull
   @Override
   public String toString() {
      return "DistortedEllipsoidShape{origin="
         + this.o
         + ", direction="
         + this.v
         + ", radiusX="
         + this.radiusX
         + ", radiusY="
         + this.radiusY
         + ", radiusZ="
         + this.radiusZ
         + "}";
   }

   private static double wrapPitch(double pitch, double radiusY, double radiusZ) {
      double min = Math.min(radiusY, radiusZ);
      double max = Math.max(radiusY, radiusZ);
      double aspect = 1.0 - min / max;
      if (pitch < -0.7853981852531433) {
         double alpha = 1.0 - Math.abs((pitch + 0.7853981852531433) / 0.7853981852531433);
         return -1.5707963705062866 * aspect * alpha;
      } else if (pitch > 0.7853981852531433) {
         double alpha = 1.0 - Math.abs((pitch - 0.7853981852531433) / 0.7853981852531433);
         return 1.5707963705062866 * aspect * alpha;
      } else {
         return pitch;
      }
   }

   public static class Factory extends AbstractDistortedBody.Factory {
      public Factory() {
      }

      @Nonnull
      @Override
      protected DistortedShape createShape(
         @Nonnull Vector3d origin,
         Vector3d direction,
         double yaw,
         double pitch,
         double radiusX,
         double radiusY,
         double radiusZ,
         GeneralNoise.InterpolationFunction interpolation
      ) {
         if (pitch < -0.7853981852531433) {
            radiusY = radiusZ;
            radiusZ = radiusY;
            pitch = DistortedEllipsoidShape.wrapPitch(pitch, radiusZ, radiusY);
         } else if (pitch > 0.7853981852531433) {
            radiusY = radiusZ;
            radiusZ = radiusY;
            pitch = DistortedEllipsoidShape.wrapPitch(pitch, radiusZ, radiusY);
         } else {
            double alpha = 1.0 - Math.abs(pitch / 1.5707963705062866);
            radiusY /= alpha;
            radiusZ *= alpha;
         }

         return new DistortedEllipsoidShape(origin, direction, yaw, pitch, radiusX, radiusY, radiusZ, interpolation);
      }
   }
}