@polygonjs/polygonjs
Version:
node-based WebGL 3D engine https://polygonjs.com
40 lines (39 loc) • 1.94 kB
JavaScript
;
export function sdfSmoothLines(options) {
const { node, vars, bodyLines, functionNames } = options;
const { sdfContext, sdf0, sdf1, smooth, matBlendDist, smoothFactor } = vars;
const functionNameSmooth = functionNames.smooth;
const functionNameNonSmooth = functionNames.default;
const side = node.glVarName("side");
const matId = node.glVarName("matId");
const matId2 = node.glVarName("matId2");
const d = node.glVarName("d");
const setSide = `bool ${side} = ${sdf0}.d < ${sdf1}.d`;
const setMatId = `int ${matId} = ${side} ? ${sdf0}.matId : ${sdf1}.matId`;
const setMatId2 = `int ${matId2} = ${side} ? ${sdf1}.matId : ${sdf0}.matId`;
bodyLines.push(setSide);
bodyLines.push(setMatId);
bodyLines.push(setMatId2);
if (smooth) {
const matBlend = node.glVarName("matBlend");
const dist = node.glVarName("dist");
const halfBlendDist = node.glVarName("halfBlendDist");
const setHalfBlendDist = `float ${halfBlendDist} = ${matBlendDist} * 0.5`;
const setDist = `float ${dist} = ${sdf0}.d - ${sdf1}.d`;
const setMatBlend = `float ${matBlend} = smoothstep(-${halfBlendDist},${halfBlendDist}, ${dist})`;
const setMatBlend2 = `${matBlend} = ${dist} > 0. ? 1.0-${matBlend} : ${matBlend}`;
const setDistance = `float ${d} = ${functionNameSmooth}(${sdf0}.d, ${sdf1}.d, ${smoothFactor})`;
const withSmooth = `SDFContext(${d}, 0, ${matId}, ${matId2}, ${matBlend})`;
bodyLines.push(setDist);
bodyLines.push(setHalfBlendDist);
bodyLines.push(setMatBlend);
bodyLines.push(setMatBlend2);
bodyLines.push(setDistance);
bodyLines.push(`SDFContext ${sdfContext} = ${withSmooth}`);
} else {
const setDistance = `float ${d} = ${functionNameNonSmooth}(${sdf0}.d, ${sdf1}.d)`;
const withoutSmooth = `SDFContext(${d}, 0, ${matId}, ${matId}, 0.)`;
bodyLines.push(setDistance);
bodyLines.push(`SDFContext ${sdfContext} = ${withoutSmooth}`);
}
}