UNPKG

@polygonjs/polygonjs

Version:

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

78 lines (71 loc) 2.24 kB
/** * Assigns actor nodes to input objects * * */ // import {TypedSopNode} from './_Base'; import {CoreGroup} from '../../../core/geometry/Group'; import {NodeParamsConfig, ParamConfig} from '../utils/params/ParamsConfig'; import {NetworkNodeType} from '../../poly/NodeContext'; import {filterObjectsWithGroup} from '../../../core/geometry/Mask'; import {SopType} from '../../poly/registers/nodes/types/Sop'; import {TypedActorSopNode} from './_BaseActor'; import {isBooleanTrue} from '../../../core/Type'; import {ActorBuilderNode} from '../../scene/utils/ActorsManager'; import {InputCloneMode} from '../../poly/InputCloneMode'; class ActorSopParamsConfig extends NodeParamsConfig { /** @param select which objects this applies the actor behavior to */ group = ParamConfig.STRING('', { objectMask: true, }); /** @param build actor from child nodes */ useThisNode = ParamConfig.BOOLEAN(1, { separatorAfter: true, }); /** @param actor node */ node = ParamConfig.NODE_PATH('', { visibleIf: {useThisNode: 0}, nodeSelection: { types: [NetworkNodeType.ACTOR], }, dependentOnFoundNode: false, separatorAfter: true, }); } const ParamsConfig = new ActorSopParamsConfig(); export class ActorSopNode extends TypedActorSopNode<ActorSopParamsConfig> { override readonly paramsConfig = ParamsConfig; static override type() { return SopType.ACTOR; } protected override initializeNode() { this.io.inputs.setCount(1); this.io.inputs.initInputsClonedState(InputCloneMode.FROM_NODE); } override async cook(inputCoreGroups: CoreGroup[]) { // compile this.compilationController.compileIfRequired(); // const coreGroup = inputCoreGroups[0]; const objects = filterObjectsWithGroup(coreGroup, this.pv); const actorNode = await this._findActorNode(); if (actorNode) { const actorsManager = this.scene().actorsManager; for (const object of objects) { actorsManager.assignActorBuilder(object, actorNode); } } this.setCoreGroup(coreGroup); } private async _findActorNode() { if (isBooleanTrue(this.pv.useThisNode)) { return this; } else { const node = this.pv.node.node() as ActorBuilderNode | undefined; if (node) { await node.compute(); } return node; } } }