polygonjs-engine
Version:
node-based webgl 3D engine https://polygonjs.com
45 lines (41 loc) • 1.56 kB
text/typescript
import {BaseSopOperation} from './_Base';
import {DefaultOperationParams} from '../_Base';
import {CoreGroup} from '../../geometry/Group';
import {TorusBufferGeometry} from 'three/src/geometries/TorusBufferGeometry';
import {Vector3} from 'three/src/math/Vector3';
import {InputCloneMode} from '../../../engine/poly/InputCloneMode';
import {CoreTransform} from '../../Transform';
interface TorusSopParams extends DefaultOperationParams {
radius: number;
radiusTube: number;
segmentsRadial: number;
segmentsTube: number;
direction: Vector3;
center: Vector3;
}
const DEFAULT_UP = new Vector3(0, 0, 1);
export class TorusSopOperation extends BaseSopOperation {
static readonly DEFAULT_PARAMS: TorusSopParams = {
radius: 1,
radiusTube: 1,
segmentsRadial: 20,
segmentsTube: 12,
direction: new Vector3(0, 1, 0),
center: new Vector3(0, 0, 0),
};
static readonly INPUT_CLONED_STATE = InputCloneMode.FROM_NODE;
static type(): Readonly<'torus'> {
return 'torus';
}
private _core_transform = new CoreTransform();
cook(input_contents: CoreGroup[], params: TorusSopParams) {
const radius = params.radius;
const radiusTube = params.radiusTube;
const segmentsRadial = params.segmentsRadial;
const segmentsTube = params.segmentsTube;
const geometry = new TorusBufferGeometry(radius, radiusTube, segmentsRadial, segmentsTube);
geometry.translate(params.center.x, params.center.y, params.center.z);
this._core_transform.rotate_geometry(geometry, DEFAULT_UP, params.direction);
return this.create_core_group_from_geometry(geometry);
}
}