UNPKG

@polygonjs/polygonjs

Version:

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

60 lines (53 loc) 2.19 kB
/** * union of 2 SDFs * * @remarks * * based on [https://iquilezles.org/articles/distfunctions/](https://iquilezles.org/articles/distfunctions/) */ // import {ThreeToGl} from '../../../../src/core/ThreeToGl'; import {NodeParamsConfig, ParamConfig} from '../utils/params/ParamsConfig'; import {JsConnectionPointType, JsConnectionPoint} from '../utils/io/connections/Js'; import {JsLinesCollectionController} from './code/utils/JsLinesCollectionController'; import {TypedJsNode} from './_Base'; import {isBooleanTrue} from '../../../core/Type'; import {Poly} from '../../Poly'; const OUTPUT_NAME = 'union'; class SDFUnionJsParamsConfig extends NodeParamsConfig { sdf0 = ParamConfig.FLOAT(1); sdf1 = ParamConfig.FLOAT(1); smooth = ParamConfig.BOOLEAN(1); smoothFactor = ParamConfig.FLOAT(1, { visibleIf: {smooth: 1}, }); } const ParamsConfig = new SDFUnionJsParamsConfig(); export class SDFUnionJsNode extends TypedJsNode<SDFUnionJsParamsConfig> { override paramsConfig = ParamsConfig; static override type() { return 'SDFUnion'; } override initializeNode() { super.initializeNode(); this.io.outputs.setNamedOutputConnectionPoints([ new JsConnectionPoint(OUTPUT_NAME, JsConnectionPointType.FLOAT), ]); } override setLines(shadersCollectionController: JsLinesCollectionController) { const sdf0 = this.variableForInputParam(shadersCollectionController, this.p.sdf0); const sdf1 = this.variableForInputParam(shadersCollectionController, this.p.sdf1); // const smooth = this.variableForInputParam(shadersCollectionController, this.p.smooth); const smoothFactor = this.variableForInputParam(shadersCollectionController, this.p.smoothFactor); const functionName = isBooleanTrue(this.pv.smooth) ? 'SDFSmoothUnion' : 'SDFUnion'; const func = Poly.namedFunctionsRegister.getFunction(functionName, this, shadersCollectionController); const out = this.jsVarName(OUTPUT_NAME); // const bodyLine = `const ${out} = ${func.asString(sdf0, sdf1, smoothFactor)}`; shadersCollectionController.addBodyOrComputed(this, [ { dataType: JsConnectionPointType.FLOAT, varName: out, value: func.asString(sdf0, sdf1, smoothFactor), }, ]); } }