src/volume/csg/Operation.js
- import { Box3 } from "three";
-
- /**
- * A CSG operation.
- */
-
- export class Operation {
-
- /**
- * Constructs a new operation.
- *
- * @param {OperationType} type - The type of this operation.
- * @param {Operation} ...children - Child operations.
- */
-
- constructor(type, ...children) {
-
- /**
- * The type of this operation.
- *
- * @type {OperationType}
- */
-
- this.type = type;
-
- /**
- * A list of operations.
- *
- * Right-hand side operands have precedence, meaning that the result of the
- * first item in the list will be dominated by the result of the second one,
- * etc.
- *
- * @type {Operation[]}
- * @private
- */
-
- this.children = children;
-
- /**
- * The bounding box of this operation.
- *
- * @type {Box3}
- * @private
- */
-
- this.boundingBox = null;
-
- }
-
- /**
- * Calculates the complete bounding box of this CSG operation if it doesn't
- * exist yet and returns it.
- *
- * @return {Box3} The bounding box.
- */
-
- getBoundingBox() {
-
- if(this.boundingBox === null) {
-
- this.boundingBox = this.computeBoundingBox();
-
- }
-
- return this.boundingBox;
-
- }
-
- /**
- * Calculates the bounding box of this CSG operation while taking all child
- * operations into account.
- *
- * @return {Box3} The bounding box.
- */
-
- computeBoundingBox() {
-
- const children = this.children;
- const boundingBox = new Box3();
-
- let i, l;
-
- for(i = 0, l = children.length; i < l; ++i) {
-
- boundingBox.union(children[i].getBoundingBox());
-
- }
-
- return boundingBox;
-
- }
-
- }