UNPKG

@polygonjs/polygonjs

Version:

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

52 lines (48 loc) 1.67 kB
import {BaseSopOperation} from './_Base'; import {CoreGroup, Object3DWithGeometry} from '../../../core/geometry/Group'; import {isBooleanTrue} from '../../../core/BooleanValue'; import {DefaultOperationParams} from '../../../core/operations/_Base'; import {BufferAttribute} from 'three'; interface RestAttributesSopParams extends DefaultOperationParams { tposition: boolean; position: string; restP: string; tnormal: boolean; normal: string; restN: string; } export class RestAttributesSopOperation extends BaseSopOperation { static override readonly DEFAULT_PARAMS: RestAttributesSopParams = { tposition: true, position: 'position', restP: 'restP', tnormal: true, normal: 'normal', restN: 'restN', }; static override type(): Readonly<'restAttributes'> { return 'restAttributes'; } override cook(input_contents: CoreGroup[], params: RestAttributesSopParams) { const core_group = input_contents[0]; const objects = core_group.threejsObjectsWithGeo(); if (isBooleanTrue(params.tposition)) { this._create_rest_attribute(objects, params.position, params.restP); } if (isBooleanTrue(params.tnormal)) { this._create_rest_attribute(objects, params.normal, params.restN); } return this.createCoreGroupFromObjects(objects); } private _create_rest_attribute(objects: Object3DWithGeometry[], attrib_name: string, rest_attrib_name: string) { for (let object of objects) { const geometry = object.geometry; if (geometry) { const src_attrib = geometry.getAttribute(attrib_name) as BufferAttribute | undefined; if (src_attrib) { geometry.setAttribute(rest_attrib_name, src_attrib.clone()); } } } } }