UNPKG

@xeokit/xeokit-sdk

Version:

3D BIM IFC Viewer SDK for AEC engineering applications. Open Source JavaScript Toolkit based on pure WebGL for top performance, real-world coordinates and full double precision

35 lines (32 loc) 1.98 kB
import {createLightSetup} from "../../webgl/WebGLRenderer.js"; export const EmphasisShaderSource = function(meshHash, programVariables, geometry, scene, isFill) { const lightSetup = isFill && createLightSetup(programVariables, scene._lightsState); const uColor = programVariables.createUniform("vec3", "uColor", (set, state) => set(isFill ? state.material.fillColor : state.material.edgeColor)); const uAlpha = programVariables.createUniform("float", "uAlpha", (set, state) => set(isFill ? state.material.fillAlpha : state.material.edgeAlpha)); const vColor = programVariables.createVarying("vec4", "vColor", () => { const attributes = geometry.attributes; const lightComponents = isFill && [ lightSetup.getAmbientColor() ].concat(attributes.normal ? lightSetup.directionalLights.map( light => `(max(dot(${attributes.normal.view}, ${light.getDirection(geometry.viewMatrix, attributes.position.view)}), 0.0) * ${light.getColor()})`) : [ ]); // TODO: A blending mode for emphasis materials, to select add/multiply/mix // `vec4((mix(reflectedColor, ${uColor}, 0.7)), ${uAlpha})` return `vec4(${uColor}${lightComponents ? ` * (${lightComponents.join(" + ")})` : ""}, ${uAlpha})`; // `${vColor} = vec4(reflectedColor + ${uColor}, ${uAlpha})` }); const outColor = programVariables.createOutput("vec4", "outColor"); return { getHash: () => [ meshHash, scene.gammaOutput ? "go" : "", // Gamma input not needed lightSetup && lightSetup.getHash() ], programName: isFill ? "EmphasisFill" : "EmphasisEdges", dontSetFrontFace: true, discardPoints: isFill, drawEdges: ! isFill, appendFragmentOutputs: (src, getGammaOutputExpression) => src.push(`${outColor} = ${getGammaOutputExpression ? getGammaOutputExpression(vColor) : vColor};`) }; };