src/volume/sdf/SDFReviver.js
import { FractalNoise } from "./FractalNoise";
import { Heightfield } from "./Heightfield";
import { SDFType } from "./SDFType";
import { SuperPrimitive } from "./SuperPrimitive";
/**
 * An SDF reviver.
 */
export class SDFReviver {
	/**
	 * Creates an SDF from the given serialised description.
	 *
	 * @param {Object} description - A serialised SDF.
	 * @return {SignedDistanceFunction} A deserialized SDF.
	 */
	revive(description) {
		let sdf, i, l;
		switch(description.type) {
			case SDFType.FRACTAL_NOISE:
				sdf = new FractalNoise(description.parameters, description.material);
				break;
			case SDFType.HEIGHTFIELD:
				sdf = new Heightfield(description.parameters, description.material);
				break;
			case SDFType.SUPER_PRIMITIVE:
				sdf = new SuperPrimitive(description.parameters, description.material);
				break;
		}
		sdf.operation = description.operation;
		sdf.position.fromArray(description.position);
		sdf.quaternion.fromArray(description.quaternion);
		sdf.scale.fromArray(description.scale);
		sdf.updateInverseTransformation();
		for(i = 0, l = description.children.length; i < l; ++i) {
			sdf.children.push(this.revive(description.children[i]));
		}
		return sdf;
	}
}