UNPKG

@polygonjs/polygonjs

Version:

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

71 lines (64 loc) 2.33 kB
import {BaseSopOperation} from './_Base'; import {CoreGroup} from '../../../core/geometry/Group'; import {Vector3, Box3} from 'three'; import {InputCloneMode} from '../../../engine/poly/InputCloneMode'; import {DefaultOperationParams} from '../../../core/operations/_Base'; import {BoxLineGeometry} from 'three/examples/jsm/geometries/BoxLineGeometry'; import {ObjectType} from '../../../core/geometry/Constant'; const tmpBox = new Box3(); const tmpSize = new Vector3(); const tmpCenter = new Vector3(); interface BoxLinesSopParams extends DefaultOperationParams { size: number; sizes: Vector3; divisions: Vector3; center: Vector3; } // const _sizes = new Vector3(); // const _center = new Vector3(); export class BoxLinesSopOperation extends BaseSopOperation { static override readonly DEFAULT_PARAMS: BoxLinesSopParams = { size: 1, sizes: new Vector3(1, 1, 1), divisions: new Vector3(1, 1, 1), center: new Vector3(0, 0, 0), }; static override readonly INPUT_CLONED_STATE = InputCloneMode.NEVER; static override type(): Readonly<'boxLines'> { return 'boxLines'; } override cook(inputCoreGroups: CoreGroup[], params: BoxLinesSopParams) { const inputCoreGroup = inputCoreGroups[0]; const object = inputCoreGroup ? this._cookWithInput(inputCoreGroup, params) : this._cookWithoutInput(params); if (this._node) { object.name = this._node.name(); } return this.createCoreGroupFromObjects([object]); } private _cookWithoutInput(params: BoxLinesSopParams) { return BoxLinesSopOperation.createLines(params); } private _cookWithInput(coreGroup: CoreGroup, params: BoxLinesSopParams) { coreGroup.boundingBox(tmpBox); tmpBox.getSize(tmpSize); tmpBox.getCenter(tmpCenter); return BoxLinesSopOperation.createLines({ size: 1, sizes: tmpSize, divisions: params.divisions, center: tmpCenter, }); } static createLines(params: BoxLinesSopParams) { const geometry = new BoxLineGeometry( params.sizes.x * params.size, params.sizes.y * params.size, params.sizes.z * params.size, Math.max(1, Math.floor(params.divisions.x)), Math.max(1, Math.floor(params.divisions.y)), Math.max(1, Math.floor(params.divisions.z)) ); geometry.translate(params.center.x, params.center.y, params.center.z); return this.createObject(geometry, ObjectType.LINE_SEGMENTS); } }