UNPKG

polygonjs-engine

Version:

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

55 lines (46 loc) 1.71 kB
import {BaseSopOperation} from './_Base'; import {DefaultOperationParams} from '../_Base'; import {CoreGroup} from '../../geometry/Group'; import {Vector3} from 'three/src/math/Vector3'; import {CoreGeometryUtilCircle} from '../../geometry/util/Circle'; import {ObjectType} from '../../geometry/Constant'; import {CoreTransform} from '../../Transform'; import {CircleBufferGeometry} from 'three/src/geometries/CircleBufferGeometry'; interface CircleSopParams extends DefaultOperationParams { radius: number; segments: number; open: boolean; arcAngle: number; direction: Vector3; } const DEFAULT_UP = new Vector3(0, 0, 1); export class CircleSopOperation extends BaseSopOperation { static readonly DEFAULT_PARAMS: CircleSopParams = { radius: 1, segments: 12, open: true, arcAngle: 360, direction: new Vector3(0, 1, 0), }; static type(): Readonly<'circle'> { return 'circle'; } private _core_transform = new CoreTransform(); cook(input_contents: CoreGroup[], params: CircleSopParams) { if (params.open) { return this._create_circle(params); } else { return this._create_disk(params); } } private _create_circle(params: CircleSopParams) { const geometry = CoreGeometryUtilCircle.create(params.radius, params.segments, params.arcAngle); this._core_transform.rotate_geometry(geometry, DEFAULT_UP, params.direction); return this.create_core_group_from_geometry(geometry, ObjectType.LINE_SEGMENTS); } private _create_disk(params: CircleSopParams) { const geometry = new CircleBufferGeometry(params.radius, params.segments); this._core_transform.rotate_geometry(geometry, DEFAULT_UP, params.direction); return this.create_core_group_from_geometry(geometry); } }