src/volume/csg/DensityFunction.js
import { HermiteData } from "../HermiteData";
import { Material } from "../Material";
import { Operation } from "./Operation";
import { OperationType } from "./OperationType";
/**
 * An operation that describes a density field.
 */
export class DensityFunction extends Operation {
	/**
	 * Constructs a new density function operation.
	 *
	 * @param {SignedDistanceFunction} sdf - An SDF.
	 */
	constructor(sdf) {
		super(OperationType.DENSITY_FUNCTION);
		/**
		 * An SDF.
		 *
		 * @type {SignedDistanceFunction}
		 * @private
		 */
		this.sdf = sdf;
	}
	/**
	 * Calculates the bounding box of this density function.
	 *
	 * @return {Box3} The bounding box.
	 */
	computeBoundingBox() {
		return this.sdf.getBoundingBox(true);
	}
	/**
	 * Calculates the material index for the given world position.
	 *
	 * @param {Vector3} position - The world position of the material index.
	 * @return {Number} The material index.
	 */
	generateMaterialIndex(position) {
		return (this.sdf.sample(position) <= HermiteData.isovalue) ? this.sdf.material : Material.AIR;
	}
	/**
	 * Generates surface intersection data for the specified edge.
	 *
	 * @param {Edge} edge - The edge that should be processed.
	 */
	generateEdge(edge) {
		edge.approximateZeroCrossing(this.sdf);
		edge.computeSurfaceNormal(this.sdf);
	}
}