UNPKG

@polygonjs/polygonjs

Version:

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

61 lines (53 loc) 1.89 kB
/** * Helps checking the normals of a geometry * * */ import {TypedSopNode} from './_Base'; import {CoreGroup} from '../../../core/geometry/Group'; import {NodeParamsConfig, ParamConfig} from '../utils/params/ParamsConfig'; import {InputCloneMode} from '../../poly/InputCloneMode'; import {VertexNormalsHelper} from 'three/examples/jsm/helpers/VertexNormalsHelper'; import {isBooleanTrue} from '../../../core/Type'; import {Object3D} from 'three'; import {CoreMask} from '../../../core/geometry/Mask'; import {object3DHasGeometry} from '../../../core/geometry/GeometryUtils'; import {SopType} from '../../poly/registers/nodes/types/Sop'; class NormalsHelperSopParamsConfig extends NodeParamsConfig { /** @param group to assign the material to */ group = ParamConfig.STRING('', { objectMask: true, }); /** @param keep input */ keepInput = ParamConfig.BOOLEAN(1); /** @param size of the box */ size = ParamConfig.FLOAT(1, { range: [0, 1], rangeLocked: [false, false], }); } const ParamsConfig = new NormalsHelperSopParamsConfig(); export class NormalsHelperSopNode extends TypedSopNode<NormalsHelperSopParamsConfig> { override paramsConfig = ParamsConfig; static override type() { return SopType.NORMALS_HELPER; } override initializeNode() { this.io.outputs.setHasNoOutput(); this.io.inputs.setCount(1); this.io.inputs.initInputsClonedState(InputCloneMode.NEVER); } override cook(inputCoreGroups: CoreGroup[]) { const inputCoreGroup = inputCoreGroups[0]; const selectedObjects = CoreMask.filterThreejsObjects(inputCoreGroup, this.pv).filter(object3DHasGeometry); const newObjects: Object3D[] = []; for (const object of selectedObjects) { const helper = new VertexNormalsHelper(object, this.pv.size); if (isBooleanTrue(this.pv.keepInput)) { newObjects.push(object); } newObjects.push(helper); } this.setObjects(newObjects); } }