@polygonjs/polygonjs
Version:
node-based WebGL 3D engine https://polygonjs.com
83 lines (82 loc) • 2.92 kB
JavaScript
"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("");
}
}