UNPKG

@polygonjs/polygonjs

Version:

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

83 lines (82 loc) 2.92 kB
"use strict"; import { BaseSDFGlNode } from "./_BaseSDF"; import { ThreeToGl } from "../../../../src/core/ThreeToGl"; import SDFMirrorMethods from "./gl/raymarching/sdfMirror.glsl"; import { NodeParamsConfig, ParamConfig } from "../utils/params/ParamsConfig"; import { GlConnectionPointType, GlConnectionPoint } from "../utils/io/connections/Gl"; import { FunctionGLDefinition } from "./utils/GLDefinition"; import { isBooleanTrue } from "../../../core/Type"; const OUTPUT_NAME = "p"; class SDFMirrorGlParamsConfig extends NodeParamsConfig { constructor() { super(...arguments); this.position = ParamConfig.VECTOR3([0, 0, 0], { hidden: true }); this.center = ParamConfig.VECTOR3([0, 0, 0]); this.smooth = ParamConfig.BOOLEAN(0); this.smoothFactor = ParamConfig.FLOAT(0, { visibleIf: { smooth: 1 }, step: 1e-4 }); this.mirrorX = ParamConfig.BOOLEAN(1); this.mirrorY = ParamConfig.BOOLEAN(1); this.mirrorZ = ParamConfig.BOOLEAN(1); } } const ParamsConfig = new SDFMirrorGlParamsConfig(); export class SDFMirrorGlNode extends BaseSDFGlNode { constructor() { super(...arguments); this.paramsConfig = ParamsConfig; } static type() { return "SDFMirror"; } initializeNode() { super.initializeNode(); this.io.connection_points.spare_params.setInputlessParamNames(["mirrorX", "mirrorY", "mirrorZ"]); this.io.outputs.setNamedOutputConnectionPoints([ new GlConnectionPoint(OUTPUT_NAME, GlConnectionPointType.VEC3) ]); } setLines(shadersCollectionController) { const position = this.position(); const center = ThreeToGl.vector3(this.variableForInputParam(this.p.center)); const output = this.glVarName(OUTPUT_NAME); const suffix = this._functionSuffix(); const bodyLines = []; if (suffix) { const functionName = `SDFMirror${suffix}`; const args = [`${position} - ${center}`]; if (isBooleanTrue(this.pv.smooth)) { const smoothFactor = ThreeToGl.float(this.variableForInputParam(this.p.smoothFactor)); args.push(smoothFactor); } const bodyLine = `vec3 ${output} = ${functionName}(${args.join(",")})`; bodyLines.push(bodyLine); } else { const bodyLine = `vec3 ${output} = ${position} - ${center}`; bodyLines.push(bodyLine); } shadersCollectionController.addBodyLines(this, bodyLines); shadersCollectionController.addDefinitions(this, [new FunctionGLDefinition(this, SDFMirrorMethods)]); } _functionSuffix() { const x = isBooleanTrue(this.pv.mirrorX); const y = isBooleanTrue(this.pv.mirrorY); const z = isBooleanTrue(this.pv.mirrorZ); if (!(x || y || z)) { return null; } const args = []; if (x) args.push("X"); if (y) args.push("Y"); if (z) args.push("Z"); if (isBooleanTrue(this.pv.smooth)) { args.push("Smooth"); } return args.join(""); } }