UNPKG

@polygonjs/polygonjs

Version:

node-based WebGL 3D engine https://polygonjs.com

111 lines (101 loc) 3.85 kB
import {BaseSopOperation} from './_Base'; import {CoreGroup} from '../../../core/geometry/Group'; import {BufferGeometry, Vector3, RingGeometry} from 'three'; // import {InputCloneMode} from '../../../engine/poly/InputCloneMode'; import {DefaultOperationParams} from '../../../core/operations/_Base'; import {ObjectType} from '../../../core/geometry/Constant'; import {rotateGeometry} from '../../../core/Transform'; const DEFAULT_UP = new Vector3(0, 0, 1); // const q = new Quaternion(); // const size = new Vector3(); // const center = new Vector3(); interface RingSopParams extends DefaultOperationParams { innerRadius: number; outerRadius: number; thetaSegments: number; phiSegments: number; open: boolean; angleStart: number; angleLength: number; direction: Vector3; center: Vector3; } export class RingSopOperation extends BaseSopOperation { static override readonly DEFAULT_PARAMS: RingSopParams = { innerRadius: 0.5, outerRadius: 1, thetaSegments: 32, phiSegments: 2, open: false, angleStart: 0, angleLength: 2 * Math.PI, direction: new Vector3(0, 1, 0), center: new Vector3(0, 0, 0), }; // static override readonly INPUT_CLONED_STATE = InputCloneMode.NEVER; static override type(): Readonly<'ring'> { return 'ring'; } override cook(inputCoreGroups: CoreGroup[], params: RingSopParams) { // const coreGroup = inputCoreGroups[0]; // const object = coreGroup ? this._cookWithInput(coreGroup, params) : this._cookWithoutInput(params); const object = this._cookWithoutInput(params); if (this._node) { object.name = this._node.name(); } return this.createCoreGroupFromObjects([object]); } private _cookWithoutInput(params: RingSopParams) { const geometry = this._createRequiredGeometry(params); rotateGeometry(geometry, DEFAULT_UP, params.direction); geometry.translate(params.center.x, params.center.y, params.center.z); const object = this._createRingObject(geometry, params); return object; } // private _cookWithInput(coreGroup: CoreGroup, params: RingSopParams) { // const bboxPreRotation = coreGroup.boundingBox(); // bboxPreRotation.getCenter(center); // // create box // const bbox = coreGroup.boundingBox(); // size.copy(bbox.max).sub(bbox.min); // center.copy(bbox.max).add(bbox.min).multiplyScalar(0.5); // const boxGeometry = new BoxGeometry(size.x, size.y, size.z, 1, 1, 1); // // rotate box // function _applyInputQuaternion(_q: Quaternion) { // boxGeometry.applyQuaternion(_q); // boxGeometry.computeBoundingBox(); // } // function _setInputRotation() { // q.setFromUnitVectors(DEFAULT_UP, params.direction); // _applyInputQuaternion(q); // } // // function _resetInputRotation() { // // q.invert(); // // _applyInputQuaternion(q); // // } // _setInputRotation(); // const bboxPostRotation = boxGeometry.boundingBox!; //coreGroup.boundingBox(true); // bboxPostRotation.getSize(size); // // bboxPreRotation.getCenter(center); // debug // // _resetInputRotation(); // const size2d = new Vector2(size.x, size.y); // const geometry = this._createRequiredGeometry(size2d, params); // this._coreTransform.rotateGeometry(geometry, DEFAULT_UP, params.direction); // geometry.translate(center.x, center.y, center.z); // const object = this._createRingObject(geometry, params); // return object; // } private _createRingObject(geometry: BufferGeometry, params: RingSopParams) { return BaseSopOperation.createObject(geometry, params.asLines ? ObjectType.LINE_SEGMENTS : ObjectType.MESH); } private _createRequiredGeometry(params: RingSopParams) { return new RingGeometry( params.innerRadius, params.outerRadius, params.thetaSegments, params.phiSegments, params.open ? params.angleStart : 0, params.open ? params.angleLength : RingSopOperation.DEFAULT_PARAMS.angleLength ); } }