UNPKG

@luma.gl/shadertools

Version:

Shader module system for luma.gl

49 lines (41 loc) 3.53 kB
const DEFAULT_HIGHLIGHT_COLOR = new Uint8Array([0, 255, 255, 255]); const DEFAULT_MODULE_OPTIONS = { pickingSelectedColor: null, pickingHighlightColor: DEFAULT_HIGHLIGHT_COLOR, pickingActive: false, pickingAttribute: false }; function getUniforms() { let opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : DEFAULT_MODULE_OPTIONS; const uniforms = {}; if (opts.pickingSelectedColor !== undefined) { if (!opts.pickingSelectedColor) { uniforms.picking_uSelectedColorValid = 0; } else { const selectedColor = opts.pickingSelectedColor.slice(0, 3); uniforms.picking_uSelectedColorValid = 1; uniforms.picking_uSelectedColor = selectedColor; } } if (opts.pickingHighlightColor) { const color = Array.from(opts.pickingHighlightColor, x => x / 255); if (!Number.isFinite(color[3])) { color[3] = 1; } uniforms.picking_uHighlightColor = color; } if (opts.pickingActive !== undefined) { uniforms.picking_uActive = Boolean(opts.pickingActive); uniforms.picking_uAttribute = Boolean(opts.pickingAttribute); } return uniforms; } const vs = "uniform bool picking_uActive;\nuniform bool picking_uAttribute;\nuniform vec3 picking_uSelectedColor;\nuniform bool picking_uSelectedColorValid;\n\nout vec4 picking_vRGBcolor_Avalid;\n\nconst float COLOR_SCALE = 1. / 255.;\n\nbool picking_isColorValid(vec3 color) {\n return dot(color, vec3(1.0)) > 0.001;\n}\n\nbool isVertexPicked(vec3 vertexColor) {\n return\n picking_uSelectedColorValid &&\n !picking_isColorValid(abs(vertexColor - picking_uSelectedColor));\n}\n\nvoid picking_setPickingColor(vec3 pickingColor) {\n if (picking_uActive) {\n picking_vRGBcolor_Avalid.a = float(picking_isColorValid(pickingColor));\n\n if (!picking_uAttribute) {\n picking_vRGBcolor_Avalid.rgb = pickingColor * COLOR_SCALE;\n }\n } else {\n picking_vRGBcolor_Avalid.a = float(isVertexPicked(pickingColor));\n }\n}\n\nvoid picking_setPickingAttribute(float value) {\n if (picking_uAttribute) {\n picking_vRGBcolor_Avalid.r = value;\n }\n}\nvoid picking_setPickingAttribute(vec2 value) {\n if (picking_uAttribute) {\n picking_vRGBcolor_Avalid.rg = value;\n }\n}\nvoid picking_setPickingAttribute(vec3 value) {\n if (picking_uAttribute) {\n picking_vRGBcolor_Avalid.rgb = value;\n }\n}\n"; const fs = "uniform bool picking_uActive;\nuniform vec3 picking_uSelectedColor;\nuniform vec4 picking_uHighlightColor;\n\nin vec4 picking_vRGBcolor_Avalid;\nvec4 picking_filterHighlightColor(vec4 color) {\n if (picking_uActive) {\n return color;\n }\n bool selected = bool(picking_vRGBcolor_Avalid.a);\n\n if (selected) {\n float highLightAlpha = picking_uHighlightColor.a;\n float blendedAlpha = highLightAlpha + color.a * (1.0 - highLightAlpha);\n float highLightRatio = highLightAlpha / blendedAlpha;\n\n vec3 blendedRGB = mix(color.rgb, picking_uHighlightColor.rgb, highLightRatio);\n return vec4(blendedRGB, blendedAlpha);\n } else {\n return color;\n }\n}\nvec4 picking_filterPickingColor(vec4 color) {\n if (picking_uActive) {\n if (picking_vRGBcolor_Avalid.a == 0.0) {\n discard;\n }\n return picking_vRGBcolor_Avalid;\n }\n return color;\n}\nvec4 picking_filterColor(vec4 color) {\n vec4 highightColor = picking_filterHighlightColor(color);\n return picking_filterPickingColor(highightColor);\n}\n\n"; export const picking = { name: 'picking', vs, fs, getUniforms }; //# sourceMappingURL=picking.js.map