UNPKG

@polygonjs/polygonjs

Version:

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

40 lines (39 loc) 1.94 kB
"use strict"; 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}`); } }