UNPKG

@polygonjs/polygonjs

Version:

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

117 lines (106 loc) 4.08 kB
/** * executes the nodes inside it based on an input condition * * * */ import {TypedSubnetGlNode, TypedSubnetGlParamsConfigMixin} from './Subnet'; import {GlConnectionPointType} from '../utils/io/connections/Gl'; import {NodeParamsConfig} from '../utils/params/ParamsConfig'; import {ShadersCollectionController} from './code/utils/ShadersCollectionController'; import {ThreeToGl} from '../../../core/ThreeToGl'; // import {SubnetInputGlNode} from './SubnetInput'; // import {ArrayUtils} from '../../../core/ArrayUtils'; import {SubnetInputGlNode} from './SubnetInput'; import {GlType} from '../../poly/registers/nodes/types/Gl'; const CONDITION_INPUT_NAME = 'condition'; class IfThenGlParamsConfig extends TypedSubnetGlParamsConfigMixin(NodeParamsConfig) {} const ParamsConfig = new IfThenGlParamsConfig(); export class IfThenGlNode extends TypedSubnetGlNode<IfThenGlParamsConfig> { override paramsConfig = ParamsConfig; static override type(): Readonly<GlType.IF_THEN> { return GlType.IF_THEN; } // protected override _expectedInputsCount() { // const current_connections = this.io.connections.inputConnections(); // return current_connections ? Math.max(ArrayUtils.compact(current_connections).length + 1, 2) : 2; // } protected override _expectedInputTypes(): GlConnectionPointType[] { return [GlConnectionPointType.BOOL, ...super._expectedInputTypes()]; } protected override _expectedInputName(index: number) { if (index == 0) { return CONDITION_INPUT_NAME; } else { return super._expectedInputName(index - 1); } } override childExpectedInputConnectionPointTypes() { const subnetInputTypes = super.childExpectedInputConnectionPointTypes(); const types: GlConnectionPointType[] = []; for (let i = 1; i < subnetInputTypes.length; i++) { types.push(subnetInputTypes[i]); } return types; } override childExpectedInputConnectionPointName(index: number) { return super.childExpectedInputConnectionPointName(index + 1); } // // // set_lines // // protected override _setLinesPreBlock(shadersCollectionController: ShadersCollectionController) { const body_lines: string[] = []; const connectionPoints = this.io.inputs.namedInputConnectionPoints(); if (!connectionPoints) { return; } for (let i = 0; i < connectionPoints.length; i++) { const connectionPoint = connectionPoints[i]; const connectionPointName = connectionPoint.name(); if (connectionPointName != CONDITION_INPUT_NAME) { const gl_type = connectionPoint.type(); const out = this.glVarName(connectionPointName); const in_value = ThreeToGl.any(this.variableForInput(connectionPointName)); const body_line = `${gl_type} ${out} = ${in_value}`; body_lines.push(body_line); } } shadersCollectionController.addBodyLines(this, body_lines); } override setSubnetInputLines( shadersCollectionController: ShadersCollectionController, childNode: SubnetInputGlNode ) { const connections = this.io.connections.inputConnections(); if (!connections) { return; } const body_lines: string[] = []; for (let connection of connections) { if (connection) { const connectionPoint = connection.destConnectionPoint(); if (connectionPoint) { const connectionPointName = connectionPoint.name(); if (connectionPointName != CONDITION_INPUT_NAME) { const in_value = ThreeToGl.any(this.variableForInput(connectionPointName)); const gl_type = connectionPoint.type(); const out = childNode.glVarName(connectionPointName); const body_line = ` ${gl_type} ${out} = ${in_value}`; body_lines.push(body_line); } } } } shadersCollectionController.addBodyLines(childNode, body_lines); } protected override setLinesBlockStart(shaders_collection_controller: ShadersCollectionController) { const body_lines: string[] = []; const condition_value = ThreeToGl.any(this.variableForInput(CONDITION_INPUT_NAME)); const open_if_line = `if(${condition_value}){`; body_lines.push(open_if_line); shaders_collection_controller.addBodyLines(this, body_lines); } }