UNPKG

@polygonjs/polygonjs

Version:

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

419 lines (378 loc) 13.4 kB
import {BaseJsNodeType, wrapIfComputed} from './_Base'; import {JsLinesCollectionController} from './code/utils/JsLinesCollectionController'; import {JsConnectionPointType} from '../utils/io/connections/Js'; import {Poly} from '../../Poly'; import {DecomposedPath} from '../../../core/DecomposedPath'; import {BooleanParam} from '../../params/Boolean'; import {FloatParam} from '../../params/Float'; import {IntegerParam} from '../../params/Integer'; import {StringParam} from '../../params/String'; import {Vector2Param} from '../../params/Vector2'; import {Vector3Param} from '../../params/Vector3'; import {Vector4Param} from '../../params/Vector4'; import {Attribute} from '../../../core/geometry/Attribute'; import {ParamPathParam} from '../../params/ParamPath'; import {NodePathParam} from '../../params/NodePath'; export function defaultObject(linesController: JsLinesCollectionController): string { return linesController.assembler().defaultObjectVariable(); } function _defaultObject3DMaterial(linesController: JsLinesCollectionController): string { return linesController.assembler().defaultObject3DMaterialVariable(); } export function defaultPrimitiveGraph(linesController: JsLinesCollectionController): string { return linesController.assembler().defaultPrimitiveGraph(); } function _defaultPointIndex(node: BaseJsNodeType, linesController: JsLinesCollectionController): string { // return linesController.assembler().defaultPointIndexVariable(); const func = Poly.namedFunctionsRegister.getFunction('getPointIndex', node, linesController); return func.asString(inputObject3D(node, linesController)); } export function inputObject3D(node: BaseJsNodeType, linesController: JsLinesCollectionController) { const inputObject3D = node.io.inputs.named_input(JsConnectionPointType.OBJECT_3D); const object3D = inputObject3D ? node.variableForInput(linesController, JsConnectionPointType.OBJECT_3D) : defaultObject(linesController); return object3D; } export function inputObject3DMaterial(node: BaseJsNodeType, linesController: JsLinesCollectionController) { const inputMaterial = node.io.inputs.named_input(JsConnectionPointType.MATERIAL); const material = inputMaterial ? node.variableForInput(linesController, JsConnectionPointType.MATERIAL) : _defaultObject3DMaterial(linesController); return material; } export function inputPointIndex(node: BaseJsNodeType, linesController: JsLinesCollectionController) { const inputPoint = node.io.inputs.named_input(Attribute.POINT_INDEX); const object3D = inputPoint ? node.variableForInput(linesController, Attribute.POINT_INDEX) : _defaultPointIndex(node, linesController); return object3D; } export function setObject3DMaterialOutputLine(node: BaseJsNodeType, linesController: JsLinesCollectionController) { const usedOutputNames = node.io.outputs.used_output_names(); if (!usedOutputNames.includes(JsConnectionPointType.MATERIAL)) { return; } const material = inputObject3DMaterial(node, linesController); const out = node.jsVarName(JsConnectionPointType.MATERIAL); linesController.addBodyOrComputed(node, [ {dataType: JsConnectionPointType.OBJECT_3D, varName: out, value: material}, ]); } export function setObject3DOutputLine(node: BaseJsNodeType, linesController: JsLinesCollectionController) { const usedOutputNames = node.io.outputs.used_output_names(); if (!usedOutputNames.includes(JsConnectionPointType.OBJECT_3D)) { return; } const object3D = inputObject3D(node, linesController); const out = node.jsVarName(JsConnectionPointType.OBJECT_3D); linesController.addBodyOrComputed(node, [ {dataType: JsConnectionPointType.OBJECT_3D, varName: out, value: object3D}, ]); } export function inputParam(node: BaseJsNodeType, linesController: JsLinesCollectionController) { const inputParam = node.io.inputs.named_input(JsConnectionPointType.PARAM); const _getParam = (linesController: JsLinesCollectionController) => { const paramPathParam = node.params.get(JsConnectionPointType.PARAM) as ParamPathParam; // instead of using the path of the found param, // or the value of the param, // we use the resolved absolute path, // so that it works when the js node is not created from the player const decomposedPath = new DecomposedPath(); paramPathParam.value.resolve(node, decomposedPath); const absolutePath = decomposedPath.toAbsolutePath(); const out = node.jsVarName('getParamSinceNoInput'); // if (foundParam) { // do not create the variable only if param has been found, // as we also need to handle cases where it will be found later const func = Poly.namedFunctionsRegister.getFunction('getParam', node, linesController); const bodyLine = func.asString(`'${absolutePath}'`); linesController.addBodyOrComputed(node, [ {dataType: JsConnectionPointType.PARAM, varName: out, value: bodyLine}, ]); return wrapIfComputed(out, linesController); }; const param = inputParam ? node.variableForInput(linesController, JsConnectionPointType.PARAM) : _getParam(linesController); return param; } export function inputNode(jsNode: BaseJsNodeType, linesController: JsLinesCollectionController) { const inputNode = jsNode.io.inputs.named_input(JsConnectionPointType.NODE); const _getNode = (linesController: JsLinesCollectionController) => { const nodePathParam = jsNode.params.get(JsConnectionPointType.NODE) as NodePathParam; // instead of using the path of the found param, // or the value of the param, // we use the resolved absolute path, // so that it works when the js node is not created from the player const decomposedPath = new DecomposedPath(); nodePathParam.value.resolve(jsNode, decomposedPath); const absolutePath = decomposedPath.toAbsolutePath(); const out = jsNode.jsVarName('getNodeSinceNoInput'); // if (foundParam) { // do not create the variable only if param has been found, // as we also need to handle cases where it will be found later const func = Poly.namedFunctionsRegister.getFunction('getNode', jsNode, linesController); const bodyLine = func.asString(`'${absolutePath}'`); linesController.addBodyOrComputed(jsNode, [ {dataType: JsConnectionPointType.NODE, varName: out, value: bodyLine}, ]); return wrapIfComputed(out, linesController); }; const foundNode = inputNode ? jsNode.variableForInput(linesController, JsConnectionPointType.NODE) : _getNode(linesController); return foundNode; } export function vector2OutputFromParam( node: BaseJsNodeType, param: Vector2Param, linesController: JsLinesCollectionController ) { const usedOutputNames = node.io.outputs.used_output_names(); const propertyName = param.name(); if (!usedOutputNames.includes(propertyName)) { return; } linesController.addBodyOrComputed(node, [ { dataType: JsConnectionPointType.VECTOR2, varName: node.jsVarName(propertyName), value: node.variableForInputParam(linesController, param), }, ]); } export function vector2OutputFromInput( node: BaseJsNodeType, inputName: string, linesController: JsLinesCollectionController ) { const usedOutputNames = node.io.outputs.used_output_names(); const propertyName = inputName; if (!usedOutputNames.includes(propertyName)) { return; } linesController.addBodyOrComputed(node, [ { dataType: JsConnectionPointType.VECTOR2, varName: node.jsVarName(propertyName), value: node.variableForInput(linesController, inputName), }, ]); } export function vector3OutputFromParam( node: BaseJsNodeType, param: Vector3Param, linesController: JsLinesCollectionController ) { const usedOutputNames = node.io.outputs.used_output_names(); const propertyName = param.name(); if (!usedOutputNames.includes(propertyName)) { return; } linesController.addBodyOrComputed(node, [ { dataType: JsConnectionPointType.VECTOR3, varName: node.jsVarName(propertyName), value: node.variableForInputParam(linesController, param), }, ]); } export function vector3OutputFromInput( node: BaseJsNodeType, inputName: string, linesController: JsLinesCollectionController ) { const usedOutputNames = node.io.outputs.used_output_names(); const propertyName = inputName; if (!usedOutputNames.includes(propertyName)) { return; } linesController.addBodyOrComputed(node, [ { dataType: JsConnectionPointType.VECTOR3, varName: node.jsVarName(propertyName), value: node.variableForInput(linesController, inputName), }, ]); } export function vector4OutputFromParam( node: BaseJsNodeType, param: Vector4Param, linesController: JsLinesCollectionController ) { const usedOutputNames = node.io.outputs.used_output_names(); const propertyName = param.name(); if (!usedOutputNames.includes(propertyName)) { return; } linesController.addBodyOrComputed(node, [ { dataType: JsConnectionPointType.VECTOR4, varName: node.jsVarName(propertyName), value: node.variableForInputParam(linesController, param), }, ]); } export function vector4OutputFromInput( node: BaseJsNodeType, inputName: string, linesController: JsLinesCollectionController ) { const usedOutputNames = node.io.outputs.used_output_names(); const propertyName = inputName; if (!usedOutputNames.includes(propertyName)) { return; } linesController.addBodyOrComputed(node, [ { dataType: JsConnectionPointType.VECTOR4, varName: node.jsVarName(propertyName), value: node.variableForInput(linesController, inputName), }, ]); } export function floatOutputFromParam( node: BaseJsNodeType, param: FloatParam, linesController: JsLinesCollectionController ) { const usedOutputNames = node.io.outputs.used_output_names(); const propertyName = param.name(); if (!usedOutputNames.includes(propertyName)) { return; } linesController.addBodyOrComputed(node, [ { dataType: JsConnectionPointType.FLOAT, varName: node.jsVarName(propertyName), value: node.variableForInputParam(linesController, param), }, ]); } export function floatOutputFromInput( node: BaseJsNodeType, inputName: string, linesController: JsLinesCollectionController ) { const usedOutputNames = node.io.outputs.used_output_names(); const propertyName = inputName; if (!usedOutputNames.includes(propertyName)) { return; } linesController.addBodyOrComputed(node, [ { dataType: JsConnectionPointType.FLOAT, varName: node.jsVarName(propertyName), value: node.variableForInput(linesController, inputName), }, ]); } export function integerOutputFromParam( node: BaseJsNodeType, param: IntegerParam, linesController: JsLinesCollectionController ) { const usedOutputNames = node.io.outputs.used_output_names(); const propertyName = param.name(); if (!usedOutputNames.includes(propertyName)) { return; } linesController.addBodyOrComputed(node, [ { dataType: JsConnectionPointType.INT, varName: node.jsVarName(propertyName), value: node.variableForInputParam(linesController, param), }, ]); } export function integerOutputFromInput( node: BaseJsNodeType, inputName: string, linesController: JsLinesCollectionController ) { const usedOutputNames = node.io.outputs.used_output_names(); const propertyName = inputName; if (!usedOutputNames.includes(propertyName)) { return; } linesController.addBodyOrComputed(node, [ { dataType: JsConnectionPointType.INT, varName: node.jsVarName(propertyName), value: node.variableForInput(linesController, inputName), }, ]); } export function stringOutputFromParam( node: BaseJsNodeType, param: StringParam, linesController: JsLinesCollectionController ) { const usedOutputNames = node.io.outputs.used_output_names(); const propertyName = param.name(); if (!usedOutputNames.includes(propertyName)) { return; } linesController.addBodyOrComputed(node, [ { dataType: JsConnectionPointType.STRING, varName: node.jsVarName(propertyName), value: node.variableForInputParam(linesController, param), }, ]); } export function stringOutputFromInput( node: BaseJsNodeType, inputName: string, linesController: JsLinesCollectionController ) { const usedOutputNames = node.io.outputs.used_output_names(); const propertyName = inputName; if (!usedOutputNames.includes(propertyName)) { return; } linesController.addBodyOrComputed(node, [ { dataType: JsConnectionPointType.STRING, varName: node.jsVarName(propertyName), value: node.variableForInput(linesController, inputName), }, ]); } export function booleanOutputFromParam( node: BaseJsNodeType, param: BooleanParam, linesController: JsLinesCollectionController ) { const usedOutputNames = node.io.outputs.used_output_names(); const propertyName = param.name(); if (!usedOutputNames.includes(propertyName)) { return; } linesController.addBodyOrComputed(node, [ { dataType: JsConnectionPointType.BOOLEAN, varName: node.jsVarName(propertyName), value: node.variableForInputParam(linesController, param), }, ]); } export function anyTypeOutputFromInput( node: BaseJsNodeType, inputName: string, linesController: JsLinesCollectionController ) { const usedOutputNames = node.io.outputs.used_output_names(); const propertyName = inputName; if (!usedOutputNames.includes(propertyName)) { return; } linesController.addBodyOrComputed(node, [ { dataType: JsConnectionPointType.FLOAT, varName: node.jsVarName(propertyName), value: node.variableForInput(linesController, inputName), }, ]); }