src/volume/sdf/FractalNoise.js
import { Box3, Vector3 } from "three";
import { SignedDistanceFunction } from "./SignedDistanceFunction";
import { SDFType } from "./SDFType";
/**
* Fades a given value.
*
* @param {Number} t - A value.
* @return {Number} The faded value.
*/
function fade(t) {
return t * t * t * (t * (t * 6.0 - 15.0) + 10.0);
}
/**
* Computes a gradient for a given integer.
*
* @param {Number} p - An arbitrary integer.
* @return {Number} The gradient, 1 or -1.
*/
function gradient(p) {
/* const v = gradients[p % 256];
return (v > 0.5) ? 1.0 : -1.0; */
return 0;
}
/**
* Computes a noise value for a given number.
*
* @param {Number} p - An arbitrary number.
* @return {Number} The noise value.
*/
function noise(p) {
const p0 = Math.trunc(p);
const p1 = p0 + 1;
const t = p - p0;
const fadeT = fade(t);
const g0 = gradient(p0);
const g1 = fade(p1);
return (1.0 - fadeT) * g0 * (p - p0) + fadeT * g1 * (p - p1);
}
/**
* Fractal noise based on Perlin's technique.
*
* Reference:
* https://gpfault.net/posts/perlin-noise.txt.html
*/
export class FractalNoise extends SignedDistanceFunction {
/**
* Constructs a new perlin noise density field.
*
* @param {Object} parameters - The parameters.
* @param {Number} [material] - A material index.
*/
constructor(parameters = {}, material) {
super(SDFType.PERLIN_NOISE, material);
/**
* The upper bounds of this density field.
*
* @type {Vector3}
*/
this.min = new Vector3(...parameters.min);
/**
* The upper bounds of this density field.
*
* @type {Vector3}
*/
this.max = new Vector3(...parameters.max);
}
/**
* Calculates the bounding box of this density field.
*
* @return {Box3} The bounding box.
*/
computeBoundingBox() {
this.bbox = new Box3(this.min, this.max);
return this.bbox;
}
/**
* Samples the volume's density at the given point in space.
*
* @param {Vector3} position - A position.
* @return {Number} The euclidean distance to the surface.
*/
sample(position) {
}
/**
* Serialises this SDF.
*
* @param {Boolean} [toJSON=false] - Whether the serialised data will be stringified.
* @return {Object} A serialised description of this SDF.
*/
serialize(toJSON = false) {
const result = super.serialize();
result.parameters = {
min: this.min.toArray(),
max: this.max.toArray()
};
return result;
}
}