UNPKG

@polygonjs/polygonjs

Version:

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

57 lines (51 loc) 1.76 kB
import {BaseSopOperation} from './_Base'; import {CoreGroup} from '../../../core/geometry/Group'; import {InputCloneMode} from '../../../engine/poly/InputCloneMode'; import {BufferAttribute} from 'three'; import {BufferGeometry} from 'three'; import {DefaultOperationParams} from '../../../core/operations/_Base'; interface AttribAddMultSopParams extends DefaultOperationParams { name: string; preAdd: number; mult: number; postAdd: number; } export class AttribAddMultSopOperation extends BaseSopOperation { static override readonly DEFAULT_PARAMS: AttribAddMultSopParams = { name: '', preAdd: 0, mult: 1, postAdd: 0, }; static override readonly INPUT_CLONED_STATE = InputCloneMode.FROM_NODE; static override type(): Readonly<'attribAddMult'> { return 'attribAddMult'; } override cook(inputCoreGroups: CoreGroup[], params: AttribAddMultSopParams) { const coreGroup = inputCoreGroups[0]; const attribNames = coreGroup.pointAttribNamesMatchingMask(params.name); for (let attribName of attribNames) { const geometries = coreGroup.geometries(); for (let geometry of geometries) { this._updateAttrib(attribName, geometry, params); } } return coreGroup; } private _updateAttrib(attribName: string, geometry: BufferGeometry, params: AttribAddMultSopParams) { const attribute = geometry.getAttribute(attribName) as BufferAttribute; if (attribute) { const values = attribute.array ; const preAdd = params.preAdd; const mult = params.mult; const postAdd = params.postAdd; for (let i = 0; i < values.length; i++) { const value = values[i]; values[i] = (value + preAdd) * mult + postAdd; } // if (!this.io.inputs.clone_required(0)) { attribute.needsUpdate = true; // } } } }