singlePerlin3 method

double singlePerlin3(
  1. int seed,
  2. double x,
  3. double y,
  4. double z,
)

Implementation

double singlePerlin3(int seed, double x, double y, double z) {
  final x0 = x.floor();
  final y0 = y.floor();
  final z0 = z.floor();
  final x1 = x0 + 1;
  final y1 = y0 + 1;
  final z1 = z0 + 1;
  double xs;
  double ys;
  double zs;

  switch (interp) {
    case Interp.linear:
      xs = x - x0;
      ys = y - y0;
      zs = z - z0;
      break;
    case Interp.hermite:
      xs = (x - x0).interpHermiteFunc;
      ys = (y - y0).interpHermiteFunc;
      zs = (z - z0).interpHermiteFunc;
      break;
    case Interp.quintic:
      xs = (x - x0).interpQuinticFunc;
      ys = (y - y0).interpQuinticFunc;
      zs = (z - z0).interpQuinticFunc;
      break;
  }

  final xd0 = x - x0;
  final yd0 = y - y0;
  final zd0 = z - z0;
  final xd1 = xd0 - 1;
  final yd1 = yd0 - 1;
  final zd1 = zd0 - 1;
  final xf00 = xs.lerp(
    gradCoord3D(seed, x0, y0, z0, xd0, yd0, zd0),
    gradCoord3D(seed, x1, y0, z0, xd1, yd0, zd0),
  );
  final xf10 = xs.lerp(
    gradCoord3D(seed, x0, y1, z0, xd0, yd1, zd0),
    gradCoord3D(seed, x1, y1, z0, xd1, yd1, zd0),
  );
  final xf01 = xs.lerp(
    gradCoord3D(seed, x0, y0, z1, xd0, yd0, zd1),
    gradCoord3D(seed, x1, y0, z1, xd1, yd0, zd1),
  );
  final xf11 = xs.lerp(
    gradCoord3D(seed, x0, y1, z1, xd0, yd1, zd1),
    gradCoord3D(seed, x1, y1, z1, xd1, yd1, zd1),
  );

  return zs.lerp(
    ys.lerp(
      xf00,
      xf10,
    ),
    ys.lerp(
      xf01,
      xf11,
    ),
  );
}