@itwin/core-frontend 3.2.0-dev.29 → 3.2.0-dev.33
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +8 -1
- package/lib/cjs/ViewManager.d.ts.map +1 -1
- package/lib/cjs/ViewManager.js +1 -0
- package/lib/cjs/ViewManager.js.map +1 -1
- package/lib/cjs/render/primitives/VertexTable.d.ts +1 -1
- package/lib/cjs/render/primitives/VertexTable.js.map +1 -1
- package/lib/cjs/render/primitives/geometry/GeometryAccumulator.d.ts.map +1 -1
- package/lib/cjs/render/primitives/geometry/GeometryAccumulator.js +0 -1
- package/lib/cjs/render/primitives/geometry/GeometryAccumulator.js.map +1 -1
- package/lib/cjs/render/primitives/mesh/MeshBuilderMap.js +1 -1
- package/lib/cjs/render/primitives/mesh/MeshBuilderMap.js.map +1 -1
- package/lib/cjs/render/primitives/mesh/MeshPrimitives.d.ts +0 -4
- package/lib/cjs/render/primitives/mesh/MeshPrimitives.d.ts.map +1 -1
- package/lib/cjs/render/primitives/mesh/MeshPrimitives.js.map +1 -1
- package/lib/cjs/render/webgl/DrawCommand.d.ts.map +1 -1
- package/lib/cjs/render/webgl/DrawCommand.js +2 -1
- package/lib/cjs/render/webgl/DrawCommand.js.map +1 -1
- package/lib/cjs/render/webgl/ShaderBuilder.d.ts +5 -4
- package/lib/cjs/render/webgl/ShaderBuilder.d.ts.map +1 -1
- package/lib/cjs/render/webgl/ShaderBuilder.js +7 -6
- package/lib/cjs/render/webgl/ShaderBuilder.js.map +1 -1
- package/lib/cjs/render/webgl/Technique.d.ts +4 -2
- package/lib/cjs/render/webgl/Technique.d.ts.map +1 -1
- package/lib/cjs/render/webgl/Technique.js +148 -120
- package/lib/cjs/render/webgl/Technique.js.map +1 -1
- package/lib/cjs/render/webgl/TechniqueFlags.d.ts +7 -3
- package/lib/cjs/render/webgl/TechniqueFlags.d.ts.map +1 -1
- package/lib/cjs/render/webgl/TechniqueFlags.js +17 -4
- package/lib/cjs/render/webgl/TechniqueFlags.js.map +1 -1
- package/lib/cjs/render/webgl/glsl/Animation.d.ts.map +1 -1
- package/lib/cjs/render/webgl/glsl/Animation.js +2 -0
- package/lib/cjs/render/webgl/glsl/Animation.js.map +1 -1
- package/lib/cjs/render/webgl/glsl/Color.d.ts.map +1 -1
- package/lib/cjs/render/webgl/glsl/Color.js +8 -7
- package/lib/cjs/render/webgl/glsl/Color.js.map +1 -1
- package/lib/cjs/render/webgl/glsl/Edge.d.ts +2 -2
- package/lib/cjs/render/webgl/glsl/Edge.d.ts.map +1 -1
- package/lib/cjs/render/webgl/glsl/Edge.js +6 -10
- package/lib/cjs/render/webgl/glsl/Edge.js.map +1 -1
- package/lib/cjs/render/webgl/glsl/PointString.d.ts +3 -3
- package/lib/cjs/render/webgl/glsl/PointString.d.ts.map +1 -1
- package/lib/cjs/render/webgl/glsl/PointString.js +6 -6
- package/lib/cjs/render/webgl/glsl/PointString.js.map +1 -1
- package/lib/cjs/render/webgl/glsl/Polyline.d.ts +3 -3
- package/lib/cjs/render/webgl/glsl/Polyline.d.ts.map +1 -1
- package/lib/cjs/render/webgl/glsl/Polyline.js +6 -10
- package/lib/cjs/render/webgl/glsl/Polyline.js.map +1 -1
- package/lib/cjs/render/webgl/glsl/Surface.d.ts +2 -2
- package/lib/cjs/render/webgl/glsl/Surface.d.ts.map +1 -1
- package/lib/cjs/render/webgl/glsl/Surface.js +33 -16
- package/lib/cjs/render/webgl/glsl/Surface.js.map +1 -1
- package/lib/cjs/render/webgl/glsl/Vertex.d.ts +3 -1
- package/lib/cjs/render/webgl/glsl/Vertex.d.ts.map +1 -1
- package/lib/cjs/render/webgl/glsl/Vertex.js +139 -37
- package/lib/cjs/render/webgl/glsl/Vertex.js.map +1 -1
- package/lib/cjs/tile/RealityTileLoader.d.ts +1 -1
- package/lib/cjs/tile/RealityTileLoader.d.ts.map +1 -1
- package/lib/cjs/tile/RealityTileLoader.js +29 -6
- package/lib/cjs/tile/RealityTileLoader.js.map +1 -1
- package/lib/cjs/tile/map/ImageryProviders/WmsMapLayerImageryProvider.d.ts +0 -1
- package/lib/cjs/tile/map/ImageryProviders/WmsMapLayerImageryProvider.d.ts.map +1 -1
- package/lib/cjs/tile/map/ImageryProviders/WmsMapLayerImageryProvider.js +12 -10
- package/lib/cjs/tile/map/ImageryProviders/WmsMapLayerImageryProvider.js.map +1 -1
- package/lib/cjs/tile/map/WmsCapabilities.d.ts +3 -2
- package/lib/cjs/tile/map/WmsCapabilities.d.ts.map +1 -1
- package/lib/cjs/tile/map/WmsCapabilities.js +11 -10
- package/lib/cjs/tile/map/WmsCapabilities.js.map +1 -1
- package/lib/esm/ViewManager.d.ts.map +1 -1
- package/lib/esm/ViewManager.js +1 -0
- package/lib/esm/ViewManager.js.map +1 -1
- package/lib/esm/render/primitives/VertexTable.d.ts +1 -1
- package/lib/esm/render/primitives/VertexTable.js.map +1 -1
- package/lib/esm/render/primitives/geometry/GeometryAccumulator.d.ts.map +1 -1
- package/lib/esm/render/primitives/geometry/GeometryAccumulator.js +0 -1
- package/lib/esm/render/primitives/geometry/GeometryAccumulator.js.map +1 -1
- package/lib/esm/render/primitives/mesh/MeshBuilderMap.js +1 -1
- package/lib/esm/render/primitives/mesh/MeshBuilderMap.js.map +1 -1
- package/lib/esm/render/primitives/mesh/MeshPrimitives.d.ts +0 -4
- package/lib/esm/render/primitives/mesh/MeshPrimitives.d.ts.map +1 -1
- package/lib/esm/render/primitives/mesh/MeshPrimitives.js.map +1 -1
- package/lib/esm/render/webgl/DrawCommand.d.ts.map +1 -1
- package/lib/esm/render/webgl/DrawCommand.js +2 -1
- package/lib/esm/render/webgl/DrawCommand.js.map +1 -1
- package/lib/esm/render/webgl/ShaderBuilder.d.ts +5 -4
- package/lib/esm/render/webgl/ShaderBuilder.d.ts.map +1 -1
- package/lib/esm/render/webgl/ShaderBuilder.js +7 -6
- package/lib/esm/render/webgl/ShaderBuilder.js.map +1 -1
- package/lib/esm/render/webgl/Technique.d.ts +4 -2
- package/lib/esm/render/webgl/Technique.d.ts.map +1 -1
- package/lib/esm/render/webgl/Technique.js +148 -120
- package/lib/esm/render/webgl/Technique.js.map +1 -1
- package/lib/esm/render/webgl/TechniqueFlags.d.ts +7 -3
- package/lib/esm/render/webgl/TechniqueFlags.d.ts.map +1 -1
- package/lib/esm/render/webgl/TechniqueFlags.js +17 -4
- package/lib/esm/render/webgl/TechniqueFlags.js.map +1 -1
- package/lib/esm/render/webgl/glsl/Animation.d.ts.map +1 -1
- package/lib/esm/render/webgl/glsl/Animation.js +2 -0
- package/lib/esm/render/webgl/glsl/Animation.js.map +1 -1
- package/lib/esm/render/webgl/glsl/Color.d.ts.map +1 -1
- package/lib/esm/render/webgl/glsl/Color.js +8 -7
- package/lib/esm/render/webgl/glsl/Color.js.map +1 -1
- package/lib/esm/render/webgl/glsl/Edge.d.ts +2 -2
- package/lib/esm/render/webgl/glsl/Edge.d.ts.map +1 -1
- package/lib/esm/render/webgl/glsl/Edge.js +7 -11
- package/lib/esm/render/webgl/glsl/Edge.js.map +1 -1
- package/lib/esm/render/webgl/glsl/PointString.d.ts +3 -3
- package/lib/esm/render/webgl/glsl/PointString.d.ts.map +1 -1
- package/lib/esm/render/webgl/glsl/PointString.js +6 -6
- package/lib/esm/render/webgl/glsl/PointString.js.map +1 -1
- package/lib/esm/render/webgl/glsl/Polyline.d.ts +3 -3
- package/lib/esm/render/webgl/glsl/Polyline.d.ts.map +1 -1
- package/lib/esm/render/webgl/glsl/Polyline.js +7 -11
- package/lib/esm/render/webgl/glsl/Polyline.js.map +1 -1
- package/lib/esm/render/webgl/glsl/Surface.d.ts +2 -2
- package/lib/esm/render/webgl/glsl/Surface.d.ts.map +1 -1
- package/lib/esm/render/webgl/glsl/Surface.js +33 -16
- package/lib/esm/render/webgl/glsl/Surface.js.map +1 -1
- package/lib/esm/render/webgl/glsl/Vertex.d.ts +3 -1
- package/lib/esm/render/webgl/glsl/Vertex.d.ts.map +1 -1
- package/lib/esm/render/webgl/glsl/Vertex.js +138 -37
- package/lib/esm/render/webgl/glsl/Vertex.js.map +1 -1
- package/lib/esm/tile/RealityTileLoader.d.ts +1 -1
- package/lib/esm/tile/RealityTileLoader.d.ts.map +1 -1
- package/lib/esm/tile/RealityTileLoader.js +30 -7
- package/lib/esm/tile/RealityTileLoader.js.map +1 -1
- package/lib/esm/tile/map/ImageryProviders/WmsMapLayerImageryProvider.d.ts +0 -1
- package/lib/esm/tile/map/ImageryProviders/WmsMapLayerImageryProvider.d.ts.map +1 -1
- package/lib/esm/tile/map/ImageryProviders/WmsMapLayerImageryProvider.js +12 -10
- package/lib/esm/tile/map/ImageryProviders/WmsMapLayerImageryProvider.js.map +1 -1
- package/lib/esm/tile/map/WmsCapabilities.d.ts +3 -2
- package/lib/esm/tile/map/WmsCapabilities.d.ts.map +1 -1
- package/lib/esm/tile/map/WmsCapabilities.js +11 -10
- package/lib/esm/tile/map/WmsCapabilities.js.map +1 -1
- package/package.json +20 -20
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Animation.js","sourceRoot":"","sources":["../../../../../src/render/webgl/glsl/Animation.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module WebGL\r\n */\r\n\r\nimport { assert } from \"@itwin/core-bentley\";\r\nimport { AnalysisStyleDisplacement, AnalysisStyleThematic, ThematicGradientSettings } from \"@itwin/core-common\";\r\nimport { AuxChannel, AuxDisplacementChannel, AuxParamChannel } from \"../../primitives/AuxChannelTable\";\r\nimport { DrawParams } from \"../DrawCommand\";\r\nimport { TextureUnit } from \"../RenderFlags\";\r\nimport { VariableType, VertexShaderBuilder, VertexShaderComponent } from \"../ShaderBuilder\";\r\nimport { IsThematic } from \"../TechniqueFlags\";\r\nimport { octDecodeNormal } from \"./Surface\";\r\n\r\nconst initialize = `\r\n g_anim_step = vec2(1.0) / u_animLUTParams.xy;\r\n g_anim_center = g_anim_step * 0.5;\r\n`;\r\n\r\n// The vertex index is an integer in [0..numVertices].\r\n// The frame index is an integer in [0..numBytesPerVertex/2].\r\n// Therefore each frame index points at 2 bytes within the texture.\r\n// The third component of the return value is 0.0 if the input index points to the first 2 bytes of the texel, or 1.0 if pointing to the second 2 bytes\r\nconst computeAnimLUTCoords = `\r\nvec3 computeAnimLUTCoords(float vertIndex, float frameIndex) {\r\n // float baseIndex = (vertIndex * 2.0) + frameIndex;\r\n float baseIndex = (vertIndex * u_animLUTParams.z) + frameIndex;\r\n float halfIndex = baseIndex * 0.5;\r\n float index = floor(halfIndex);\r\n\r\n float epsilon = 0.5 / u_animLUTParams.x;\r\n float yId = floor(index / u_animLUTParams.x + epsilon);\r\n float xId = index - u_animLUTParams.x * yId;\r\n\r\n vec2 texCoord = g_anim_center + vec2(xId / u_animLUTParams.x, yId / u_animLUTParams.y);\r\n return vec3(texCoord, 2.0 * (halfIndex - index));\r\n}\r\n`;\r\n\r\n// Sample 2 bytes at the specified index.\r\nconst sampleAnimVec2 = `\r\nvec2 sampleAnimVec2(float vertIndex, float frameIndex) {\r\n vec3 tc = computeAnimLUTCoords(vertIndex, frameIndex);\r\n vec4 texel = floor(TEXTURE(u_animLUT, tc.xy) * 255.0 + 0.5);\r\n return texel.xy * (1.0 - tc.z) + texel.zw * tc.z;\r\n}\r\n`;\r\n\r\n// Position is quantized to 6 bytes (2 bytes per component). So we always must sample two adjacent texels. We discard two bytes based on whether the index is even or odd.\r\nconst computeAnimationFrameDisplacement = `\r\nvec3 computeAnimationFrameDisplacement(float vertIndex, float frameIndex, vec3 origin, vec3 scale) {\r\n vec3 tc = computeAnimLUTCoords(vertIndex, frameIndex);\r\n vec4 enc1 = floor(TEXTURE(u_animLUT, tc.xy) * 255.0 + 0.5);\r\n tc.x += g_anim_step.x;\r\n vec4 enc2 = floor(TEXTURE(u_animLUT, tc.xy) * 255.0 + 0.5);\r\n\r\n vec2 ex = enc1.xy * (1.0 - tc.z) + enc1.zw * tc.z;\r\n vec2 ey = enc1.zw * (1.0 - tc.z) + enc2.xy * tc.z;\r\n vec2 ez = enc2.xy * (1.0 - tc.z) + enc2.zw * tc.z;\r\n\r\n vec3 qpos = vec3(decodeUInt16(ex), decodeUInt16(ey), decodeUInt16(ez));\r\n return unquantizePosition(qpos, origin, scale).xyz;\r\n}\r\n`;\r\n\r\nconst computeAnimationDisplacement = `\r\nvec3 computeAnimationDisplacement(float vertIndex, float frameIndex0, float frameIndex1, float fraction, vec3 origin, vec3 scale) {\r\n if (frameIndex0 < 0.0)\r\n return vec3(0.0, 0.0, 0.0);\r\n\r\n vec3 displacement = computeAnimationFrameDisplacement(vertIndex, frameIndex0, origin, scale);\r\n if (fraction > 0.0) {\r\n vec3 displacement1 = computeAnimationFrameDisplacement(vertIndex, frameIndex1, origin, scale);\r\n displacement += fraction * (displacement1 - displacement);\r\n }\r\n\r\n return displacement;\r\n}\r\n`;\r\n\r\nconst adjustRawPosition = `\r\n rawPos.xyz += computeAnimationDisplacement(g_vertexLUTIndex, u_animDispParams.x, u_animDispParams.y, u_animDispParams.z, u_qAnimDispOrigin, u_qAnimDispScale);\r\n return rawPos;\r\n`;\r\n\r\nconst computeAnimationFrameNormal = `\r\nvec3 computeAnimationFrameNormal(float frameIndex) {\r\n vec2 enc = sampleAnimVec2(g_vertexLUTIndex, frameIndex);\r\n return octDecodeNormal(enc);\r\n}\r\n`;\r\n\r\nconst computeAnimationNormal = `\r\nvec3 computeAnimationNormal(float frameIndex0, float frameIndex1, float fraction) {\r\n vec3 normal = computeAnimationFrameNormal(frameIndex0);\r\n if (fraction > 0.0) {\r\n vec3 normal1 = computeAnimationFrameNormal(frameIndex1);\r\n normal += fraction * (normal1 - normal);\r\n }\r\n\r\n return normal;\r\n}\r\n`;\r\n\r\nconst computeAnimationFrameParam = `\r\nfloat computeAnimationFrameParam(float frameIndex, float origin, float scale) {\r\n vec2 enc = sampleAnimVec2(g_vertexLUTIndex, frameIndex);\r\n return clamp((origin + scale * decodeUInt16(enc)), 0.0, 1.0);\r\n}\r\n`;\r\n\r\nconst computeAnimationParam = `\r\nvec2 computeAnimationParam(float frameIndex0, float frameIndex1, float fraction, float origin, float scale) {\r\n float param = computeAnimationFrameParam(frameIndex0, origin, scale);\r\n if (fraction > 0.0) {\r\n float param1 = computeAnimationFrameParam(frameIndex1, origin, scale);\r\n param += fraction * (param1 - param);\r\n }\r\n\r\n return vec2(.5, param);\r\n}\r\n`;\r\n\r\nconst scratchAnimParams = [\r\n undefined,\r\n undefined,\r\n new Float32Array(2), // origin, scale\r\n new Float32Array(3), // index0, index1, fraction\r\n];\r\n\r\nfunction getAnimParams(size: 2 | 3, initialValue?: number): Float32Array {\r\n const array = scratchAnimParams[size]!;\r\n if (undefined !== initialValue)\r\n for (let i = 0; i < array.length; i++)\r\n array[i] = initialValue;\r\n\r\n return array;\r\n}\r\n\r\nfunction getDisplacementChannel(params: DrawParams): { channel: AuxDisplacementChannel, displacement: AnalysisStyleDisplacement } | undefined {\r\n const displacement = params.target.analysisStyle?.displacement;\r\n if (!displacement)\r\n return undefined;\r\n\r\n const channel = params.geometry.asLUT?.lut.auxChannels?.displacements?.get(displacement.channelName);\r\n return channel ? { channel, displacement } : undefined;\r\n}\r\n\r\nfunction getNormalChannel(params: DrawParams): AuxChannel | undefined {\r\n const channelName = params.target.analysisStyle?.normalChannelName;\r\n if (undefined === channelName)\r\n return undefined;\r\n\r\n return params.geometry.asLUT?.lut.auxChannels?.normals?.get(channelName);\r\n}\r\n\r\nfunction getScalarChannel(params: DrawParams): { channel: AuxParamChannel, scalar: AnalysisStyleThematic } | undefined {\r\n const scalar = params.target.analysisStyle?.thematic;\r\n if (!scalar)\r\n return undefined;\r\n\r\n const channel = params.geometry.asMesh?.lut.auxChannels?.params?.get(scalar.channelName);\r\n return channel ? { channel, scalar } : undefined;\r\n}\r\n\r\nfunction computeAnimParams(params: Float32Array, channel: AuxChannel, fraction: number): void {\r\n const { inputs, indices } = channel;\r\n const inputValue = fraction * inputs[inputs.length - 1];\r\n for (let i = 0; i < inputs.length - 1; i++) {\r\n if (inputValue >= inputs[i] && inputValue < inputs[i + 1]) {\r\n params[0] = indices[i];\r\n params[1] = indices[i + 1];\r\n params[2] = inputValue - inputs[i] / (inputs[i + 1] - inputs[i]);\r\n return;\r\n }\r\n }\r\n params[0] = params[1] = indices[inputs.length - 1];\r\n params[2] = 0.0;\r\n}\r\n\r\n/** @internal */\r\nexport function addAnimation(vert: VertexShaderBuilder, isSurface: boolean, isThematic: IsThematic): void {\r\n // Lookup table\r\n vert.addGlobal(\"g_anim_step\", VariableType.Vec2);\r\n vert.addGlobal(\"g_anim_center\", VariableType.Vec2);\r\n vert.addInitializer(initialize);\r\n\r\n vert.addUniform(\"u_animLUT\", VariableType.Sampler2D, (prog) => {\r\n prog.addGraphicUniform(\"u_animLUT\", (uniform, params) => {\r\n const channels = (params.geometry.asLUT!).lut.auxChannels!;\r\n assert(undefined !== channels);\r\n channels.texture.bindSampler(uniform, TextureUnit.AuxChannelLUT);\r\n });\r\n });\r\n\r\n vert.addUniform(\"u_animLUTParams\", VariableType.Vec3, (prog) => {\r\n prog.addGraphicUniform(\"u_animLUTParams\", (uniform, params) => {\r\n const geom = params.geometry.asLUT!;\r\n assert(undefined !== geom && undefined !== geom.lut.auxChannels);\r\n const tex = geom.lut.auxChannels.texture;\r\n const array = getAnimParams(3);\r\n array[0] = tex.width;\r\n array[1] = tex.height;\r\n array[2] = geom.lut.auxChannels.numBytesPerVertex / 2;\r\n uniform.setUniform3fv(array);\r\n });\r\n });\r\n\r\n vert.addFunction(computeAnimLUTCoords);\r\n vert.addFunction(sampleAnimVec2);\r\n\r\n // Displacement\r\n vert.addFunction(computeAnimationFrameDisplacement);\r\n vert.addFunction(computeAnimationDisplacement);\r\n vert.set(VertexShaderComponent.AdjustRawPosition, adjustRawPosition);\r\n\r\n vert.addUniform(\"u_animDispParams\", VariableType.Vec3, (prog) => {\r\n prog.addGraphicUniform(\"u_animDispParams\", (uniform, params) => {\r\n const animParams = getAnimParams(3, 0.0);\r\n const disp = getDisplacementChannel(params);\r\n if (undefined !== disp)\r\n computeAnimParams(animParams, disp.channel, params.target.analysisFraction);\r\n\r\n uniform.setUniform3fv(animParams);\r\n });\r\n });\r\n vert.addUniform(\"u_qAnimDispScale\", VariableType.Vec3, (prog) => {\r\n prog.addGraphicUniform(\"u_qAnimDispScale\", (uniform, params) => {\r\n const animParams = getAnimParams(3, 0.0);\r\n const disp = getDisplacementChannel(params);\r\n if (undefined !== disp)\r\n for (let i = 0; i < 3; i++)\r\n animParams[i] = disp.channel.qScale[i] * disp.displacement.scale;\r\n\r\n uniform.setUniform3fv(animParams);\r\n });\r\n });\r\n vert.addUniform(\"u_qAnimDispOrigin\", VariableType.Vec3, (prog) => {\r\n prog.addGraphicUniform(\"u_qAnimDispOrigin\", (uniform, params) => {\r\n const animParams = getAnimParams(3, 0.0);\r\n const disp = getDisplacementChannel(params);\r\n if (undefined !== disp)\r\n for (let i = 0; i < 3; i++)\r\n animParams[i] = disp.channel.qOrigin[i] * disp.displacement.scale;\r\n\r\n uniform.setUniform3fv(animParams);\r\n });\r\n });\r\n\r\n // Normal and param\r\n if (isSurface) {\r\n vert.addFunction(octDecodeNormal);\r\n vert.addFunction(computeAnimationFrameNormal);\r\n vert.addFunction(computeAnimationNormal);\r\n\r\n vert.addFunction(computeAnimationFrameParam);\r\n vert.addFunction(computeAnimationParam);\r\n\r\n vert.addUniform(\"u_animNormalParams\", VariableType.Vec3, (prog) => {\r\n prog.addGraphicUniform(\"u_animNormalParams\", (uniform, params) => {\r\n const animParams = getAnimParams(3, -1.0);\r\n const channel = getNormalChannel(params);\r\n if (undefined !== channel)\r\n computeAnimParams(animParams, channel, params.target.analysisFraction);\r\n\r\n uniform.setUniform3fv(animParams);\r\n });\r\n });\r\n\r\n if (isThematic === IsThematic.No) {\r\n vert.addUniform(\"u_animScalarParams\", VariableType.Vec3, (prog) => {\r\n prog.addGraphicUniform(\"u_animScalarParams\", (uniform, params) => {\r\n const scalars = getScalarChannel(params);\r\n const animParams = getAnimParams(3, -1.0);\r\n if (scalars)\r\n computeAnimParams(animParams, scalars.channel, params.target.analysisFraction);\r\n\r\n uniform.setUniform3fv(animParams);\r\n });\r\n });\r\n\r\n vert.addUniform(\"u_animScalarQParams\", VariableType.Vec2, (prog) => {\r\n prog.addGraphicUniform(\"u_animScalarQParams\", (uniform, params) => {\r\n const scalars = getScalarChannel(params);\r\n const animParams = getAnimParams(2, 1.0);\r\n if (scalars) {\r\n const range = scalars.scalar.range;\r\n let rangeScale = range.high - range.low;\r\n if (rangeScale === 0)\r\n rangeScale = 1;\r\n\r\n animParams[0] = ThematicGradientSettings.margin + (scalars.channel.qOrigin - range.low) / rangeScale;\r\n animParams[1] = ThematicGradientSettings.contentRange * scalars.channel.qScale / rangeScale;\r\n }\r\n\r\n uniform.setUniform2fv(animParams);\r\n });\r\n });\r\n }\r\n }\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"Animation.js","sourceRoot":"","sources":["../../../../../src/render/webgl/glsl/Animation.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module WebGL\r\n */\r\n\r\nimport { assert } from \"@itwin/core-bentley\";\r\nimport { AnalysisStyleDisplacement, AnalysisStyleThematic, ThematicGradientSettings } from \"@itwin/core-common\";\r\nimport { AuxChannel, AuxDisplacementChannel, AuxParamChannel } from \"../../primitives/AuxChannelTable\";\r\nimport { DrawParams } from \"../DrawCommand\";\r\nimport { TextureUnit } from \"../RenderFlags\";\r\nimport { VariableType, VertexShaderBuilder, VertexShaderComponent } from \"../ShaderBuilder\";\r\nimport { IsThematic } from \"../TechniqueFlags\";\r\nimport { octDecodeNormal } from \"./Surface\";\r\nimport { unquantizePosition } from \"./Vertex\";\r\n\r\nconst initialize = `\r\n g_anim_step = vec2(1.0) / u_animLUTParams.xy;\r\n g_anim_center = g_anim_step * 0.5;\r\n`;\r\n\r\n// The vertex index is an integer in [0..numVertices].\r\n// The frame index is an integer in [0..numBytesPerVertex/2].\r\n// Therefore each frame index points at 2 bytes within the texture.\r\n// The third component of the return value is 0.0 if the input index points to the first 2 bytes of the texel, or 1.0 if pointing to the second 2 bytes\r\nconst computeAnimLUTCoords = `\r\nvec3 computeAnimLUTCoords(float vertIndex, float frameIndex) {\r\n // float baseIndex = (vertIndex * 2.0) + frameIndex;\r\n float baseIndex = (vertIndex * u_animLUTParams.z) + frameIndex;\r\n float halfIndex = baseIndex * 0.5;\r\n float index = floor(halfIndex);\r\n\r\n float epsilon = 0.5 / u_animLUTParams.x;\r\n float yId = floor(index / u_animLUTParams.x + epsilon);\r\n float xId = index - u_animLUTParams.x * yId;\r\n\r\n vec2 texCoord = g_anim_center + vec2(xId / u_animLUTParams.x, yId / u_animLUTParams.y);\r\n return vec3(texCoord, 2.0 * (halfIndex - index));\r\n}\r\n`;\r\n\r\n// Sample 2 bytes at the specified index.\r\nconst sampleAnimVec2 = `\r\nvec2 sampleAnimVec2(float vertIndex, float frameIndex) {\r\n vec3 tc = computeAnimLUTCoords(vertIndex, frameIndex);\r\n vec4 texel = floor(TEXTURE(u_animLUT, tc.xy) * 255.0 + 0.5);\r\n return texel.xy * (1.0 - tc.z) + texel.zw * tc.z;\r\n}\r\n`;\r\n\r\n// Position is quantized to 6 bytes (2 bytes per component). So we always must sample two adjacent texels. We discard two bytes based on whether the index is even or odd.\r\nconst computeAnimationFrameDisplacement = `\r\nvec3 computeAnimationFrameDisplacement(float vertIndex, float frameIndex, vec3 origin, vec3 scale) {\r\n vec3 tc = computeAnimLUTCoords(vertIndex, frameIndex);\r\n vec4 enc1 = floor(TEXTURE(u_animLUT, tc.xy) * 255.0 + 0.5);\r\n tc.x += g_anim_step.x;\r\n vec4 enc2 = floor(TEXTURE(u_animLUT, tc.xy) * 255.0 + 0.5);\r\n\r\n vec2 ex = enc1.xy * (1.0 - tc.z) + enc1.zw * tc.z;\r\n vec2 ey = enc1.zw * (1.0 - tc.z) + enc2.xy * tc.z;\r\n vec2 ez = enc2.xy * (1.0 - tc.z) + enc2.zw * tc.z;\r\n\r\n vec3 qpos = vec3(decodeUInt16(ex), decodeUInt16(ey), decodeUInt16(ez));\r\n return unquantizePosition(qpos, origin, scale).xyz;\r\n}\r\n`;\r\n\r\nconst computeAnimationDisplacement = `\r\nvec3 computeAnimationDisplacement(float vertIndex, float frameIndex0, float frameIndex1, float fraction, vec3 origin, vec3 scale) {\r\n if (frameIndex0 < 0.0)\r\n return vec3(0.0, 0.0, 0.0);\r\n\r\n vec3 displacement = computeAnimationFrameDisplacement(vertIndex, frameIndex0, origin, scale);\r\n if (fraction > 0.0) {\r\n vec3 displacement1 = computeAnimationFrameDisplacement(vertIndex, frameIndex1, origin, scale);\r\n displacement += fraction * (displacement1 - displacement);\r\n }\r\n\r\n return displacement;\r\n}\r\n`;\r\n\r\nconst adjustRawPosition = `\r\n rawPos.xyz += computeAnimationDisplacement(g_vertexLUTIndex, u_animDispParams.x, u_animDispParams.y, u_animDispParams.z, u_qAnimDispOrigin, u_qAnimDispScale);\r\n return rawPos;\r\n`;\r\n\r\nconst computeAnimationFrameNormal = `\r\nvec3 computeAnimationFrameNormal(float frameIndex) {\r\n vec2 enc = sampleAnimVec2(g_vertexLUTIndex, frameIndex);\r\n return octDecodeNormal(enc);\r\n}\r\n`;\r\n\r\nconst computeAnimationNormal = `\r\nvec3 computeAnimationNormal(float frameIndex0, float frameIndex1, float fraction) {\r\n vec3 normal = computeAnimationFrameNormal(frameIndex0);\r\n if (fraction > 0.0) {\r\n vec3 normal1 = computeAnimationFrameNormal(frameIndex1);\r\n normal += fraction * (normal1 - normal);\r\n }\r\n\r\n return normal;\r\n}\r\n`;\r\n\r\nconst computeAnimationFrameParam = `\r\nfloat computeAnimationFrameParam(float frameIndex, float origin, float scale) {\r\n vec2 enc = sampleAnimVec2(g_vertexLUTIndex, frameIndex);\r\n return clamp((origin + scale * decodeUInt16(enc)), 0.0, 1.0);\r\n}\r\n`;\r\n\r\nconst computeAnimationParam = `\r\nvec2 computeAnimationParam(float frameIndex0, float frameIndex1, float fraction, float origin, float scale) {\r\n float param = computeAnimationFrameParam(frameIndex0, origin, scale);\r\n if (fraction > 0.0) {\r\n float param1 = computeAnimationFrameParam(frameIndex1, origin, scale);\r\n param += fraction * (param1 - param);\r\n }\r\n\r\n return vec2(.5, param);\r\n}\r\n`;\r\n\r\nconst scratchAnimParams = [\r\n undefined,\r\n undefined,\r\n new Float32Array(2), // origin, scale\r\n new Float32Array(3), // index0, index1, fraction\r\n];\r\n\r\nfunction getAnimParams(size: 2 | 3, initialValue?: number): Float32Array {\r\n const array = scratchAnimParams[size]!;\r\n if (undefined !== initialValue)\r\n for (let i = 0; i < array.length; i++)\r\n array[i] = initialValue;\r\n\r\n return array;\r\n}\r\n\r\nfunction getDisplacementChannel(params: DrawParams): { channel: AuxDisplacementChannel, displacement: AnalysisStyleDisplacement } | undefined {\r\n const displacement = params.target.analysisStyle?.displacement;\r\n if (!displacement)\r\n return undefined;\r\n\r\n const channel = params.geometry.asLUT?.lut.auxChannels?.displacements?.get(displacement.channelName);\r\n return channel ? { channel, displacement } : undefined;\r\n}\r\n\r\nfunction getNormalChannel(params: DrawParams): AuxChannel | undefined {\r\n const channelName = params.target.analysisStyle?.normalChannelName;\r\n if (undefined === channelName)\r\n return undefined;\r\n\r\n return params.geometry.asLUT?.lut.auxChannels?.normals?.get(channelName);\r\n}\r\n\r\nfunction getScalarChannel(params: DrawParams): { channel: AuxParamChannel, scalar: AnalysisStyleThematic } | undefined {\r\n const scalar = params.target.analysisStyle?.thematic;\r\n if (!scalar)\r\n return undefined;\r\n\r\n const channel = params.geometry.asMesh?.lut.auxChannels?.params?.get(scalar.channelName);\r\n return channel ? { channel, scalar } : undefined;\r\n}\r\n\r\nfunction computeAnimParams(params: Float32Array, channel: AuxChannel, fraction: number): void {\r\n const { inputs, indices } = channel;\r\n const inputValue = fraction * inputs[inputs.length - 1];\r\n for (let i = 0; i < inputs.length - 1; i++) {\r\n if (inputValue >= inputs[i] && inputValue < inputs[i + 1]) {\r\n params[0] = indices[i];\r\n params[1] = indices[i + 1];\r\n params[2] = inputValue - inputs[i] / (inputs[i + 1] - inputs[i]);\r\n return;\r\n }\r\n }\r\n params[0] = params[1] = indices[inputs.length - 1];\r\n params[2] = 0.0;\r\n}\r\n\r\n/** @internal */\r\nexport function addAnimation(vert: VertexShaderBuilder, isSurface: boolean, isThematic: IsThematic): void {\r\n // Lookup table\r\n vert.addGlobal(\"g_anim_step\", VariableType.Vec2);\r\n vert.addGlobal(\"g_anim_center\", VariableType.Vec2);\r\n vert.addInitializer(initialize);\r\n vert.addFunction(unquantizePosition);\r\n\r\n vert.addUniform(\"u_animLUT\", VariableType.Sampler2D, (prog) => {\r\n prog.addGraphicUniform(\"u_animLUT\", (uniform, params) => {\r\n const channels = (params.geometry.asLUT!).lut.auxChannels!;\r\n assert(undefined !== channels);\r\n channels.texture.bindSampler(uniform, TextureUnit.AuxChannelLUT);\r\n });\r\n });\r\n\r\n vert.addUniform(\"u_animLUTParams\", VariableType.Vec3, (prog) => {\r\n prog.addGraphicUniform(\"u_animLUTParams\", (uniform, params) => {\r\n const geom = params.geometry.asLUT!;\r\n assert(undefined !== geom && undefined !== geom.lut.auxChannels);\r\n const tex = geom.lut.auxChannels.texture;\r\n const array = getAnimParams(3);\r\n array[0] = tex.width;\r\n array[1] = tex.height;\r\n array[2] = geom.lut.auxChannels.numBytesPerVertex / 2;\r\n uniform.setUniform3fv(array);\r\n });\r\n });\r\n\r\n vert.addFunction(computeAnimLUTCoords);\r\n vert.addFunction(sampleAnimVec2);\r\n\r\n // Displacement\r\n vert.addFunction(computeAnimationFrameDisplacement);\r\n vert.addFunction(computeAnimationDisplacement);\r\n vert.set(VertexShaderComponent.AdjustRawPosition, adjustRawPosition);\r\n\r\n vert.addUniform(\"u_animDispParams\", VariableType.Vec3, (prog) => {\r\n prog.addGraphicUniform(\"u_animDispParams\", (uniform, params) => {\r\n const animParams = getAnimParams(3, 0.0);\r\n const disp = getDisplacementChannel(params);\r\n if (undefined !== disp)\r\n computeAnimParams(animParams, disp.channel, params.target.analysisFraction);\r\n\r\n uniform.setUniform3fv(animParams);\r\n });\r\n });\r\n vert.addUniform(\"u_qAnimDispScale\", VariableType.Vec3, (prog) => {\r\n prog.addGraphicUniform(\"u_qAnimDispScale\", (uniform, params) => {\r\n const animParams = getAnimParams(3, 0.0);\r\n const disp = getDisplacementChannel(params);\r\n if (undefined !== disp)\r\n for (let i = 0; i < 3; i++)\r\n animParams[i] = disp.channel.qScale[i] * disp.displacement.scale;\r\n\r\n uniform.setUniform3fv(animParams);\r\n });\r\n });\r\n vert.addUniform(\"u_qAnimDispOrigin\", VariableType.Vec3, (prog) => {\r\n prog.addGraphicUniform(\"u_qAnimDispOrigin\", (uniform, params) => {\r\n const animParams = getAnimParams(3, 0.0);\r\n const disp = getDisplacementChannel(params);\r\n if (undefined !== disp)\r\n for (let i = 0; i < 3; i++)\r\n animParams[i] = disp.channel.qOrigin[i] * disp.displacement.scale;\r\n\r\n uniform.setUniform3fv(animParams);\r\n });\r\n });\r\n\r\n // Normal and param\r\n if (isSurface) {\r\n vert.addFunction(octDecodeNormal);\r\n vert.addFunction(computeAnimationFrameNormal);\r\n vert.addFunction(computeAnimationNormal);\r\n\r\n vert.addFunction(computeAnimationFrameParam);\r\n vert.addFunction(computeAnimationParam);\r\n\r\n vert.addUniform(\"u_animNormalParams\", VariableType.Vec3, (prog) => {\r\n prog.addGraphicUniform(\"u_animNormalParams\", (uniform, params) => {\r\n const animParams = getAnimParams(3, -1.0);\r\n const channel = getNormalChannel(params);\r\n if (undefined !== channel)\r\n computeAnimParams(animParams, channel, params.target.analysisFraction);\r\n\r\n uniform.setUniform3fv(animParams);\r\n });\r\n });\r\n\r\n if (isThematic === IsThematic.No) {\r\n vert.addUniform(\"u_animScalarParams\", VariableType.Vec3, (prog) => {\r\n prog.addGraphicUniform(\"u_animScalarParams\", (uniform, params) => {\r\n const scalars = getScalarChannel(params);\r\n const animParams = getAnimParams(3, -1.0);\r\n if (scalars)\r\n computeAnimParams(animParams, scalars.channel, params.target.analysisFraction);\r\n\r\n uniform.setUniform3fv(animParams);\r\n });\r\n });\r\n\r\n vert.addUniform(\"u_animScalarQParams\", VariableType.Vec2, (prog) => {\r\n prog.addGraphicUniform(\"u_animScalarQParams\", (uniform, params) => {\r\n const scalars = getScalarChannel(params);\r\n const animParams = getAnimParams(2, 1.0);\r\n if (scalars) {\r\n const range = scalars.scalar.range;\r\n let rangeScale = range.high - range.low;\r\n if (rangeScale === 0)\r\n rangeScale = 1;\r\n\r\n animParams[0] = ThematicGradientSettings.margin + (scalars.channel.qOrigin - range.low) / rangeScale;\r\n animParams[1] = ThematicGradientSettings.contentRange * scalars.channel.qScale / rangeScale;\r\n }\r\n\r\n uniform.setUniform2fv(animParams);\r\n });\r\n });\r\n }\r\n }\r\n}\r\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Color.d.ts","sourceRoot":"","sources":["../../../../../src/render/webgl/glsl/Color.ts"],"names":[],"mappings":"AAIA;;GAEG;AAEH,OAAO,EAA2B,cAAc,EAA4D,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"Color.d.ts","sourceRoot":"","sources":["../../../../../src/render/webgl/glsl/Color.ts"],"names":[],"mappings":"AAIA;;GAEG;AAEH,OAAO,EAA2B,cAAc,EAA4D,MAAM,kBAAkB,CAAC;AAwCrI,gBAAgB;AAChB,wBAAgB,QAAQ,CAAC,OAAO,EAAE,cAAc,QAW/C;AAED,gBAAgB;AAChB,wBAAgB,eAAe,CAAC,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,QAIjF"}
|
|
@@ -9,14 +9,17 @@ import { addInstanceColor } from "./Instancing";
|
|
|
9
9
|
// Vertex
|
|
10
10
|
// Color table is appended to vertex data. Compute the index of the vertex one-past-the-end of the vertex data
|
|
11
11
|
// NB: Color in color table has pre-multiplied alpha - revert it.
|
|
12
|
-
|
|
12
|
+
function getComputeElementColor(quantized) {
|
|
13
|
+
const vertData = quantized ? "g_vertLutData1.zw" : "g_vertLutData4.xy";
|
|
14
|
+
return `
|
|
13
15
|
float colorTableStart = u_vertParams.z * u_vertParams.w; // num rgba per-vertex times num vertices
|
|
14
|
-
float colorIndex = decodeUInt16(
|
|
16
|
+
float colorIndex = decodeUInt16(${vertData});
|
|
15
17
|
vec2 tc = computeLUTCoords(colorTableStart+colorIndex, u_vertParams.xy, g_vert_center, 1.0);
|
|
16
18
|
vec4 lutColor = TEXTURE(u_vertLUT, tc);
|
|
17
19
|
lutColor.rgb /= max(0.0001, lutColor.a);
|
|
18
20
|
vec4 color = (u_shaderFlags[kShaderBit_NonUniformColor] ? lutColor : u_color);
|
|
19
21
|
`;
|
|
22
|
+
}
|
|
20
23
|
const returnColor = `
|
|
21
24
|
return color;
|
|
22
25
|
`;
|
|
@@ -24,16 +27,14 @@ const applyInstanceColor = `
|
|
|
24
27
|
color.rgb = mix(color.rgb, a_instanceRgba.rgb / 255.0, u_applyInstanceColor * extractInstanceBit(kOvrBit_Rgb));
|
|
25
28
|
color.a = mix(color.a, a_instanceRgba.a / 255.0, u_applyInstanceColor * extractInstanceBit(kOvrBit_Alpha));
|
|
26
29
|
`;
|
|
27
|
-
const computeInstancedElementColor = computeElementColor + applyInstanceColor;
|
|
28
|
-
const computeColor = computeElementColor + returnColor;
|
|
29
|
-
const computeInstancedColor = computeInstancedElementColor + returnColor;
|
|
30
30
|
function getComputeColor(vert) {
|
|
31
|
+
const quantized = "quantized" === vert.positionType;
|
|
31
32
|
if (vert.usesInstancedGeometry) {
|
|
32
33
|
addInstanceColor(vert);
|
|
33
|
-
return
|
|
34
|
+
return `${getComputeElementColor(quantized)}${applyInstanceColor}${returnColor}`;
|
|
34
35
|
}
|
|
35
36
|
else {
|
|
36
|
-
return
|
|
37
|
+
return `${getComputeElementColor(quantized)}${returnColor}`;
|
|
37
38
|
}
|
|
38
39
|
}
|
|
39
40
|
// Fragment
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Color.js","sourceRoot":"","sources":["../../../../../src/render/webgl/glsl/Color.ts"],"names":[],"mappings":"AAAA;;;+FAG+F;AAC/F;;GAEG;AAGH,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAEhD,SAAS;AACT,8GAA8G;AAC9G,iEAAiE;AACjE,
|
|
1
|
+
{"version":3,"file":"Color.js","sourceRoot":"","sources":["../../../../../src/render/webgl/glsl/Color.ts"],"names":[],"mappings":"AAAA;;;+FAG+F;AAC/F;;GAEG;AAGH,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAEhD,SAAS;AACT,8GAA8G;AAC9G,iEAAiE;AACjE,SAAS,sBAAsB,CAAC,SAAkB;IAChD,MAAM,QAAQ,GAAG,SAAS,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,mBAAmB,CAAC;IACvE,OAAO;;oCAE2B,QAAQ;;;;;CAK3C,CAAC;AACF,CAAC;AAED,MAAM,WAAW,GAAG;;CAEnB,CAAC;AAEF,MAAM,kBAAkB,GAAG;;;CAG1B,CAAC;AAEF,SAAS,eAAe,CAAC,IAAyB;IAChD,MAAM,SAAS,GAAG,WAAW,KAAK,IAAI,CAAC,YAAY,CAAC;IACpD,IAAI,IAAI,CAAC,qBAAqB,EAAE;QAC9B,gBAAgB,CAAC,IAAI,CAAC,CAAC;QACvB,OAAO,GAAG,sBAAsB,CAAC,SAAS,CAAC,GAAG,kBAAkB,GAAG,WAAW,EAAE,CAAC;KAClF;SAAM;QACL,OAAO,GAAG,sBAAsB,CAAC,SAAS,CAAC,GAAG,WAAW,EAAE,CAAC;KAC7D;AACH,CAAC;AAED,WAAW;AACX,MAAM,gBAAgB,GAAG,iBAAiB,CAAC;AAE3C,gBAAgB;AAChB,MAAM,UAAU,QAAQ,CAAC,OAAuB;IAC9C,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,SAAS,gBAAqB,CAAC,IAAI,EAAE,EAAE;QAC7D,IAAI,CAAC,iBAAiB,CAAC,SAAS,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACpD,MAAM,OAAO,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAM,CAAC;YACvC,MAAM,KAAK,GAAG,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YAC9C,IAAI,KAAK,CAAC,SAAS,EAAE;gBACnB,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;aAC7B;QACH,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IACH,eAAe,CAAC,OAAO,EAAE,eAAe,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;AAC1D,CAAC;AAED,gBAAgB;AAChB,MAAM,UAAU,eAAe,CAAC,OAAuB,EAAE,iBAAyB;IAChF,OAAO,CAAC,UAAU,CAAC,SAAS,eAAoB,CAAC;IACjD,OAAO,CAAC,IAAI,CAAC,GAAG,2BAAyC,iBAAiB,CAAC,CAAC;IAC5E,OAAO,CAAC,IAAI,CAAC,GAAG,2BAA2C,gBAAgB,CAAC,CAAC;AAC/E,CAAC","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module Rendering\r\n */\r\n\r\nimport { FragmentShaderComponent, ProgramBuilder, VariableType, VertexShaderBuilder, VertexShaderComponent } from \"../ShaderBuilder\";\r\nimport { addInstanceColor } from \"./Instancing\";\r\n\r\n// Vertex\r\n// Color table is appended to vertex data. Compute the index of the vertex one-past-the-end of the vertex data\r\n// NB: Color in color table has pre-multiplied alpha - revert it.\r\nfunction getComputeElementColor(quantized: boolean): string {\r\n const vertData = quantized ? \"g_vertLutData1.zw\" : \"g_vertLutData4.xy\";\r\n return `\r\n float colorTableStart = u_vertParams.z * u_vertParams.w; // num rgba per-vertex times num vertices\r\n float colorIndex = decodeUInt16(${vertData});\r\n vec2 tc = computeLUTCoords(colorTableStart+colorIndex, u_vertParams.xy, g_vert_center, 1.0);\r\n vec4 lutColor = TEXTURE(u_vertLUT, tc);\r\n lutColor.rgb /= max(0.0001, lutColor.a);\r\n vec4 color = (u_shaderFlags[kShaderBit_NonUniformColor] ? lutColor : u_color);\r\n`;\r\n}\r\n\r\nconst returnColor = `\r\n return color;\r\n`;\r\n\r\nconst applyInstanceColor = `\r\n color.rgb = mix(color.rgb, a_instanceRgba.rgb / 255.0, u_applyInstanceColor * extractInstanceBit(kOvrBit_Rgb));\r\n color.a = mix(color.a, a_instanceRgba.a / 255.0, u_applyInstanceColor * extractInstanceBit(kOvrBit_Alpha));\r\n`;\r\n\r\nfunction getComputeColor(vert: VertexShaderBuilder): string {\r\n const quantized = \"quantized\" === vert.positionType;\r\n if (vert.usesInstancedGeometry) {\r\n addInstanceColor(vert);\r\n return `${getComputeElementColor(quantized)}${applyInstanceColor}${returnColor}`;\r\n } else {\r\n return `${getComputeElementColor(quantized)}${returnColor}`;\r\n }\r\n}\r\n\r\n// Fragment\r\nconst computeBaseColor = \"return v_color;\";\r\n\r\n/** @internal */\r\nexport function addColor(builder: ProgramBuilder) {\r\n builder.vert.addUniform(\"u_color\", VariableType.Vec4, (prog) => {\r\n prog.addGraphicUniform(\"u_color\", (uniform, params) => {\r\n const lutGeom = params.geometry.asLUT!;\r\n const color = lutGeom.getColor(params.target);\r\n if (color.isUniform) {\r\n color.uniform.bind(uniform);\r\n }\r\n });\r\n });\r\n addVaryingColor(builder, getComputeColor(builder.vert));\r\n}\r\n\r\n/** @internal */\r\nexport function addVaryingColor(builder: ProgramBuilder, computeVertexBase: string) {\r\n builder.addVarying(\"v_color\", VariableType.Vec4);\r\n builder.vert.set(VertexShaderComponent.ComputeBaseColor, computeVertexBase);\r\n builder.frag.set(FragmentShaderComponent.ComputeBaseColor, computeBaseColor);\r\n}\r\n"]}
|
|
@@ -2,10 +2,10 @@
|
|
|
2
2
|
* @module WebGL
|
|
3
3
|
*/
|
|
4
4
|
import { ProgramBuilder, VertexShaderBuilder } from "../ShaderBuilder";
|
|
5
|
-
import { IsAnimated, IsInstanced } from "../TechniqueFlags";
|
|
5
|
+
import { IsAnimated, IsInstanced, PositionType } from "../TechniqueFlags";
|
|
6
6
|
export declare type EdgeBuilderType = "SegmentEdge" | "Silhouette" | "IndexedEdge";
|
|
7
7
|
/** @internal */
|
|
8
8
|
export declare function addEdgeContrast(vert: VertexShaderBuilder): void;
|
|
9
9
|
/** @internal */
|
|
10
|
-
export declare function createEdgeBuilder(type: EdgeBuilderType, instanced: IsInstanced, isAnimated: IsAnimated): ProgramBuilder;
|
|
10
|
+
export declare function createEdgeBuilder(type: EdgeBuilderType, instanced: IsInstanced, isAnimated: IsAnimated, posType: PositionType): ProgramBuilder;
|
|
11
11
|
//# sourceMappingURL=Edge.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Edge.d.ts","sourceRoot":"","sources":["../../../../../src/render/webgl/glsl/Edge.ts"],"names":[],"mappings":"AAIA;;GAEG;AAIH,OAAO,EAA2B,cAAc,EAAgB,mBAAmB,EAAyB,MAAM,kBAAkB,CAAC;AACrI,OAAO,EAAE,UAAU,EAAE,WAAW,EAAc,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"Edge.d.ts","sourceRoot":"","sources":["../../../../../src/render/webgl/glsl/Edge.ts"],"names":[],"mappings":"AAIA;;GAEG;AAIH,OAAO,EAA2B,cAAc,EAAgB,mBAAmB,EAAyB,MAAM,kBAAkB,CAAC;AACrI,OAAO,EAAE,UAAU,EAAE,WAAW,EAAc,YAAY,EAAE,MAAM,mBAAmB,CAAC;AActF,oBAAY,eAAe,GAAG,aAAa,GAAG,YAAY,GAAG,aAAa,CAAC;AA+K3E,gBAAgB;AAChB,wBAAgB,eAAe,CAAC,IAAI,EAAE,mBAAmB,GAAG,IAAI,CAY/D;AA2FD,gBAAgB;AAChB,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,eAAe,EAAE,SAAS,EAAE,WAAW,EAAE,UAAU,EAAE,UAAU,EAAE,OAAO,EAAE,YAAY,GAAG,cAAc,CAO9I"}
|
|
@@ -15,17 +15,12 @@ import { addFrustum, addShaderFlags } from "./Common";
|
|
|
15
15
|
import { addWhiteOnWhiteReversal } from "./Fragment";
|
|
16
16
|
import { addAdjustWidth, addLineCode } from "./Polyline";
|
|
17
17
|
import { octDecodeNormal } from "./Surface";
|
|
18
|
-
import { addLineWeight, addModelViewMatrix, addNormalMatrix, addProjectionMatrix } from "./Vertex";
|
|
18
|
+
import { addLineWeight, addModelViewMatrix, addNormalMatrix, addProjectionMatrix, addSamplePosition } from "./Vertex";
|
|
19
19
|
import { addModelToWindowCoordinates, addViewport } from "./Viewport";
|
|
20
20
|
import { addLookupTable } from "./LookupTable";
|
|
21
21
|
import { addRenderOrder, addRenderOrderConstants } from "./FeatureSymbology";
|
|
22
22
|
const computeOtherPos = `
|
|
23
|
-
|
|
24
|
-
vec4 enc0 = floor(TEXTURE(u_vertLUT, tc) * 255.0 + 0.5);
|
|
25
|
-
tc.x += g_vert_stepX;
|
|
26
|
-
vec4 enc1 = floor(TEXTURE(u_vertLUT, tc) * 255.0 + 0.5);
|
|
27
|
-
vec3 qpos = vec3(decodeUInt16(enc0.xy), decodeUInt16(enc0.zw), decodeUInt16(enc1.xy));
|
|
28
|
-
g_otherPos = unquantizePosition(qpos, u_qOrigin, u_qScale);
|
|
23
|
+
g_otherPos = samplePosition(g_otherIndex);
|
|
29
24
|
`;
|
|
30
25
|
const decodeEndPointAndQuadIndices = `
|
|
31
26
|
g_otherIndex = decodeUInt24(a_endPointAndQuadIndices.xyz);
|
|
@@ -199,19 +194,20 @@ export function addEdgeContrast(vert) {
|
|
|
199
194
|
vert.set(8 /* AdjustContrast */, adjustContrast);
|
|
200
195
|
}
|
|
201
196
|
const edgeLutParams = new Float32Array(4);
|
|
202
|
-
function createBase(type, instanced, isAnimated) {
|
|
197
|
+
function createBase(type, instanced, isAnimated, positionType) {
|
|
203
198
|
const isInstanced = 1 /* Yes */ === instanced;
|
|
204
199
|
const isSilhouette = "Silhouette" === type;
|
|
205
200
|
const isIndexed = "IndexedEdge" === type;
|
|
206
201
|
const techId = isSilhouette ? 5 /* SilhouetteEdge */ : (isIndexed ? 6 /* IndexedEdge */ : 4 /* Edge */);
|
|
207
202
|
const attrMap = AttributeMap.findAttributeMap(techId, isInstanced);
|
|
208
|
-
const builder = new ProgramBuilder(attrMap, {
|
|
203
|
+
const builder = new ProgramBuilder(attrMap, { positionType, instanced: isInstanced });
|
|
209
204
|
const vert = builder.vert;
|
|
210
205
|
vert.addGlobal("g_otherPos", 5 /* Vec4 */);
|
|
211
206
|
vert.addGlobal("g_quadIndex", 2 /* Float */);
|
|
212
207
|
vert.addGlobal("g_windowPos", 5 /* Vec4 */);
|
|
213
208
|
vert.addGlobal("g_windowDir", 3 /* Vec2 */);
|
|
214
209
|
vert.addGlobal("g_otherIndex", 2 /* Float */);
|
|
210
|
+
addSamplePosition(vert);
|
|
215
211
|
if (isIndexed) {
|
|
216
212
|
vert.addGlobal("g_vertexId", 1 /* Int */);
|
|
217
213
|
vert.addGlobal("g_otherIndexIndex", 4 /* Vec3 */);
|
|
@@ -271,8 +267,8 @@ function createBase(type, instanced, isAnimated) {
|
|
|
271
267
|
return builder;
|
|
272
268
|
}
|
|
273
269
|
/** @internal */
|
|
274
|
-
export function createEdgeBuilder(type, instanced, isAnimated) {
|
|
275
|
-
const builder = createBase(type, instanced, isAnimated);
|
|
270
|
+
export function createEdgeBuilder(type, instanced, isAnimated, posType) {
|
|
271
|
+
const builder = createBase(type, instanced, isAnimated, posType);
|
|
276
272
|
addShaderFlags(builder);
|
|
277
273
|
addColor(builder);
|
|
278
274
|
addEdgeContrast(builder.vert);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Edge.js","sourceRoot":"","sources":["../../../../../src/render/webgl/glsl/Edge.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module WebGL\r\n */\r\n\r\nimport { assert } from \"@itwin/core-bentley\";\r\nimport { AttributeMap } from \"../AttributeMap\";\r\nimport { FragmentShaderComponent, ProgramBuilder, VariableType, VertexShaderBuilder, VertexShaderComponent } from \"../ShaderBuilder\";\r\nimport { IsAnimated, IsInstanced, IsThematic } from \"../TechniqueFlags\";\r\nimport { TechniqueId } from \"../TechniqueId\";\r\nimport { TextureUnit } from \"../RenderFlags\";\r\nimport { addAnimation } from \"./Animation\";\r\nimport { addColor } from \"./Color\";\r\nimport { addFrustum, addShaderFlags } from \"./Common\";\r\nimport { addWhiteOnWhiteReversal } from \"./Fragment\";\r\nimport { addAdjustWidth, addLineCode } from \"./Polyline\";\r\nimport { octDecodeNormal } from \"./Surface\";\r\nimport { addLineWeight, addModelViewMatrix, addNormalMatrix, addProjectionMatrix } from \"./Vertex\";\r\nimport { addModelToWindowCoordinates, addViewport } from \"./Viewport\";\r\nimport { addLookupTable } from \"./LookupTable\";\r\nimport { addRenderOrder, addRenderOrderConstants } from \"./FeatureSymbology\";\r\n\r\nexport type EdgeBuilderType = \"SegmentEdge\" | \"Silhouette\" | \"IndexedEdge\";\r\n\r\nconst computeOtherPos = `\r\n vec2 tc = computeLUTCoords(g_otherIndex, u_vertParams.xy, g_vert_center, u_vertParams.z);\r\n vec4 enc0 = floor(TEXTURE(u_vertLUT, tc) * 255.0 + 0.5);\r\n tc.x += g_vert_stepX;\r\n vec4 enc1 = floor(TEXTURE(u_vertLUT, tc) * 255.0 + 0.5);\r\n vec3 qpos = vec3(decodeUInt16(enc0.xy), decodeUInt16(enc0.zw), decodeUInt16(enc1.xy));\r\n g_otherPos = unquantizePosition(qpos, u_qOrigin, u_qScale);\r\n`;\r\n\r\nconst decodeEndPointAndQuadIndices = `\r\n g_otherIndex = decodeUInt24(a_endPointAndQuadIndices.xyz);\r\n${computeOtherPos}\r\n g_quadIndex = a_endPointAndQuadIndices.w;\r\n`;\r\n\r\nconst animateEndPoint = `g_otherPos.xyz += computeAnimationDisplacement(g_otherIndex, u_animDispParams.x, u_animDispParams.y, u_animDispParams.z, u_qAnimDispOrigin, u_qAnimDispScale);`;\r\n\r\n// a_pos is a 24-bit index into edge lookup table.\r\n// First six bytes of lookup table entry are the pair of 24-bit indices identifying the endpoints of the edge in the vertex table.\r\n// Return the 24-bit index of \"this\" vertex in the vertex table encoded in a vec3.\r\nconst computeIndexedQuantizedPosition = `\r\n g_vertexId = gl_VertexID % 6;\r\n if (g_vertexId == 0)\r\n g_quadIndex = 0.0;\r\n else if (g_vertexId == 2 || g_vertexId == 3)\r\n g_quadIndex = 1.0;\r\n else if (g_vertexId == 1 || g_vertexId == 4)\r\n g_quadIndex = 2.0;\r\n else\r\n g_quadIndex = 3.0;\r\n\r\n // The following formula computes the texel index, but suffers from precision issues for large edge indices, so we must compute using integers instead.\r\n // float edgeBaseIndex = u_edgeParams.z * 1.5 + u_edgeParams.w * 0.25 + (edgeIndex - u_edgeParams.z) * 2.5);\r\n\r\n float fEdgeIndex = decodeUInt24(a_pos);\r\n g_isSilhouette = fEdgeIndex >= u_edgeParams.z;\r\n int edgeIndex = int(fEdgeIndex);\r\n bool isEven = 0 == (edgeIndex & 1);\r\n float edgeBaseIndex;\r\n if (!g_isSilhouette) {\r\n edgeBaseIndex = float(edgeIndex + (edgeIndex / 2));\r\n } else {\r\n // If both pad and edgeIndex produce a remainder (0.5 for each - pad is a multiple of 2), we must add one to the index to account for it.\r\n int shift = isEven ? 0 : 1;\r\n int pad = int(u_edgeParams.w);\r\n if (0 != (pad % 4)) {\r\n isEven = !isEven;\r\n shift = shift + 1;\r\n }\r\n\r\n // s = num segments p = num padding bytes i = edge index\r\n // texel index = 1.5s + .25p + 2.5(i - s) = 1.5s + .25p + 2.5i - 2.5s = 2.5i + .25p - s = i + i + i/2 + p/4 - s\r\n edgeBaseIndex = float(edgeIndex + edgeIndex + edgeIndex / 2 + pad / 4 - int(u_edgeParams.z) + shift / 2);\r\n }\r\n\r\n vec2 tc = compute_edge_coords(floor(edgeBaseIndex));\r\n vec4 s0 = floor(TEXTURE(u_edgeLUT, tc) * 255.0 + 0.5);\r\n tc.x += g_edge_stepX;\r\n vec4 s1 = floor(TEXTURE(u_edgeLUT, tc) * 255.0 + 0.5);\r\n tc.x += g_edge_stepX;\r\n vec4 s2 = floor(TEXTURE(u_edgeLUT, tc) * 255.0 + 0.5);\r\n\r\n vec3 i0 = isEven ? s0.xyz : vec3(s0.zw, s1.x);\r\n vec3 i1 = isEven ? vec3(s0.w, s1.xy) : s1.yzw;\r\n g_otherIndexIndex = g_quadIndex < 2.0 ? i1 : i0;\r\n\r\n g_normals = isEven ? vec4(s1.zw, s2.xy) : s2;\r\n\r\n return g_quadIndex < 2.0 ? i0 : i1;\r\n`;\r\n\r\nconst initializeIndexed = `\r\n g_otherIndex = decodeUInt24(g_otherIndexIndex);\r\n${computeOtherPos}\r\n`;\r\n\r\n// IndexedEdgeGeometry.renderOrder returns Edge or PlanarEdge. Adjust if silhouette for output to pick buffers.\r\nconst computeIndexedRenderOrder = `\r\n if (g_isSilhouette)\r\n v_renderOrder = kRenderOrder_Edge == u_renderOrder ? kRenderOrder_Silhouette : kRenderOrder_PlanarSilhouette;\r\n else\r\n v_renderOrder = u_renderOrder;\r\n`;\r\n\r\nconst checkForSilhouetteDiscard = `\r\n if (kFrustumType_Perspective != u_frustum.z) {\r\n float perpTol = 4.75e-6;\r\n return (n0.z * n1.z > perpTol); // orthographic.\r\n } else {\r\n float perpTol = 2.5e-4;\r\n vec4 viewPos = MAT_MV * rawPos; // perspective\r\n vec3 toEye = normalize(viewPos.xyz);\r\n float dot0 = dot(n0, toEye);\r\n float dot1 = dot(n1, toEye);\r\n\r\n if (dot0 * dot1 > perpTol)\r\n return true;\r\n\r\n // Need to discard if either is non-silhouette.\r\n vec4 otherPosition = g_otherPos;\r\n viewPos = MAT_MV * otherPosition;\r\n toEye = normalize(viewPos.xyz);\r\n dot0 = dot(n0, toEye);\r\n dot1 = dot(n1, toEye);\r\n\r\n return dot0 * dot1 > perpTol;\r\n }\r\n`;\r\n\r\nconst checkForSilhouetteDiscardNonIndexed = `\r\n vec3 n0 = MAT_NORM * octDecodeNormal(a_normals.xy);\r\n vec3 n1 = MAT_NORM * octDecodeNormal(a_normals.zw);\r\n${checkForSilhouetteDiscard}\r\n`;\r\n\r\nconst checkForSilhouetteDiscardIndexed = `\r\n if (!g_isSilhouette)\r\n return false;\r\n\r\n vec3 n0 = MAT_NORM * octDecodeNormal(g_normals.xy);\r\n vec3 n1 = MAT_NORM * octDecodeNormal(g_normals.zw);\r\n${checkForSilhouetteDiscard}\r\n`;\r\n\r\nconst computePosition = `\r\n v_lnInfo = vec4(0.0, 0.0, 0.0, 0.0); // init and set flag to false\r\n vec4 other = g_otherPos;\r\n float miterAdjust = 0.0;\r\n float weight = computeLineWeight();\r\n\r\n vec4 pos;\r\n g_windowPos = modelToWindowCoordinates(rawPos, other, pos, v_eyeSpace);\r\n if (g_windowPos.w == 0.0) // Clipped out.\r\n return g_windowPos;\r\n\r\n vec4 otherPos;\r\n vec3 otherMvPos;\r\n vec4 projOther = modelToWindowCoordinates(other, rawPos, otherPos, otherMvPos);\r\n\r\n g_windowDir = projOther.xy - g_windowPos.xy;\r\n\r\n adjustWidth(weight, g_windowDir, g_windowPos.xy);\r\n g_windowDir = normalize(g_windowDir);\r\n\r\n vec2 perp = vec2(-g_windowDir.y, g_windowDir.x);\r\n float perpDist = weight / 2.0;\r\n float alongDist = 0.0;\r\n\r\n perpDist *= sign(0.5 - float(g_quadIndex == 0.0 || g_quadIndex == 3.0)); // negate for index 0 and 3\r\n alongDist += distance(rawPos, other) * float(g_quadIndex >= 2.0); // index 2 and 3 correspond to 'far' endpoint of segment\r\n\r\n pos.x += perp.x * perpDist * 2.0 * pos.w / u_viewport.x;\r\n pos.y += perp.y * perpDist * 2.0 * pos.w / u_viewport.y;\r\n\r\n lineCodeEyePos = .5 * (rawPos + other);\r\n lineCodeDist = alongDist;\r\n\r\n return pos;\r\n`;\r\nconst lineCodeArgs = \"g_windowDir, g_windowPos, 0.0\";\r\n\r\nconst adjustContrast = `\r\n float bgi = u_bgIntensity;\r\n if (bgi < 0.0)\r\n return baseColor;\r\n\r\n float s;\r\n float rgbi = baseColor.r * 0.3 + baseColor.g * 0.59 + baseColor.b * 0.11;\r\n if (rgbi > 0.81)\r\n s = bgi > 0.57 ? 0.0 : 0.699;\r\n else if (rgbi > 0.57)\r\n s = bgi > 0.57 ? 0.0 : 1.0;\r\n else\r\n s = bgi < 0.81 ? 1.0 : 0.699;\r\n\r\n return vec4(vec3(s), baseColor.a);\r\n`;\r\n\r\n/** @internal */\r\nexport function addEdgeContrast(vert: VertexShaderBuilder): void {\r\n vert.addUniform(\"u_bgIntensity\", VariableType.Float, (prog) => {\r\n prog.addGraphicUniform(\"u_bgIntensity\", (uniform, params) => {\r\n let bgi = -1;\r\n if (params.geometry.isEdge && params.target.currentEdgeSettings.wantContrastingColor(params.target.currentViewFlags.renderMode))\r\n bgi = params.target.uniforms.style.backgroundIntensity;\r\n\r\n uniform.setUniform1f(bgi);\r\n });\r\n });\r\n\r\n vert.set(VertexShaderComponent.AdjustContrast, adjustContrast);\r\n}\r\n\r\nconst edgeLutParams = new Float32Array(4);\r\n\r\nfunction createBase(type: EdgeBuilderType, instanced: IsInstanced, isAnimated: IsAnimated): ProgramBuilder {\r\n const isInstanced = IsInstanced.Yes === instanced;\r\n const isSilhouette = \"Silhouette\" === type;\r\n const isIndexed = \"IndexedEdge\" === type;\r\n const techId = isSilhouette ? TechniqueId.SilhouetteEdge : (isIndexed ? TechniqueId.IndexedEdge : TechniqueId.Edge);\r\n const attrMap = AttributeMap.findAttributeMap(techId, isInstanced);\r\n\r\n const builder = new ProgramBuilder(attrMap, { maxRgbaPerVertex: 5, instanced: isInstanced });\r\n const vert = builder.vert;\r\n\r\n vert.addGlobal(\"g_otherPos\", VariableType.Vec4);\r\n vert.addGlobal(\"g_quadIndex\", VariableType.Float);\r\n vert.addGlobal(\"g_windowPos\", VariableType.Vec4);\r\n vert.addGlobal(\"g_windowDir\", VariableType.Vec2);\r\n vert.addGlobal(\"g_otherIndex\", VariableType.Float);\r\n\r\n if (isIndexed) {\r\n vert.addGlobal(\"g_vertexId\", VariableType.Int);\r\n vert.addGlobal(\"g_otherIndexIndex\", VariableType.Vec3);\r\n vert.addGlobal(\"g_isSilhouette\", VariableType.Boolean, \"false\");\r\n vert.addGlobal(\"g_normals\", VariableType.Vec4);\r\n\r\n const initLut = addLookupTable(vert, \"edge\", \"1.0\");\r\n vert.addUniform(\"u_edgeLUT\", VariableType.Sampler2D, (prog) => {\r\n prog.addGraphicUniform(\"u_edgeLUT\", (uniform, params) => {\r\n const edge = params.geometry.asIndexedEdge;\r\n assert(undefined !== edge);\r\n edge.edgeLut.texture.bindSampler(uniform, TextureUnit.EdgeLUT);\r\n });\r\n });\r\n\r\n vert.addUniform(\"u_edgeParams\", VariableType.Vec4, (prog) => {\r\n prog.addGraphicUniform(\"u_edgeParams\", (uniform, params) => {\r\n const edge = params.geometry.asIndexedEdge;\r\n assert(undefined !== edge);\r\n edgeLutParams[0] = edge.edgeLut.texture.width;\r\n edgeLutParams[1] = edge.edgeLut.texture.height;\r\n edgeLutParams[2] = edge.edgeLut.numSegments;\r\n edgeLutParams[3] = edge.edgeLut.silhouettePadding;\r\n uniform.setUniform4fv(edgeLutParams);\r\n });\r\n });\r\n\r\n vert.set(VertexShaderComponent.ComputeQuantizedPosition, `${initLut}\\n\\n${computeIndexedQuantizedPosition}`);\r\n vert.addInitializer(initializeIndexed);\r\n\r\n addRenderOrder(vert);\r\n addRenderOrderConstants(vert);\r\n builder.addInlineComputedVarying(\"v_renderOrder\", VariableType.Float, computeIndexedRenderOrder);\r\n builder.frag.set(FragmentShaderComponent.OverrideRenderOrder, \"return v_renderOrder;\");\r\n } else {\r\n vert.addInitializer(decodeEndPointAndQuadIndices);\r\n }\r\n\r\n if (isAnimated) {\r\n addAnimation(vert, false, IsThematic.No);\r\n vert.addInitializer(animateEndPoint);\r\n }\r\n\r\n vert.addGlobal(\"lineCodeEyePos\", VariableType.Vec4);\r\n vert.addGlobal(\"lineCodeDist\", VariableType.Float, \"0.0\");\r\n\r\n addModelToWindowCoordinates(vert); // adds u_mvp, u_viewportTransformation, and sets g_eyeSpace\r\n addProjectionMatrix(vert);\r\n addLineCode(builder, lineCodeArgs);\r\n builder.addVarying(\"v_eyeSpace\", VariableType.Vec3);\r\n vert.set(VertexShaderComponent.ComputePosition, computePosition);\r\n builder.addVarying(\"v_lnInfo\", VariableType.Vec4);\r\n addAdjustWidth(vert);\r\n\r\n addViewport(vert);\r\n addModelViewMatrix(vert);\r\n\r\n addLineWeight(vert);\r\n\r\n if (isSilhouette || isIndexed) {\r\n addNormalMatrix(vert, instanced);\r\n addFrustum(builder);\r\n vert.addFunction(octDecodeNormal);\r\n vert.set(VertexShaderComponent.CheckForEarlyDiscard, isSilhouette ? checkForSilhouetteDiscardNonIndexed : checkForSilhouetteDiscardIndexed);\r\n }\r\n\r\n return builder;\r\n}\r\n\r\n/** @internal */\r\nexport function createEdgeBuilder(type: EdgeBuilderType, instanced: IsInstanced, isAnimated: IsAnimated): ProgramBuilder {\r\n const builder = createBase(type, instanced, isAnimated);\r\n addShaderFlags(builder);\r\n addColor(builder);\r\n addEdgeContrast(builder.vert);\r\n addWhiteOnWhiteReversal(builder.frag);\r\n return builder;\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"Edge.js","sourceRoot":"","sources":["../../../../../src/render/webgl/glsl/Edge.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module WebGL\r\n */\r\n\r\nimport { assert } from \"@itwin/core-bentley\";\r\nimport { AttributeMap } from \"../AttributeMap\";\r\nimport { FragmentShaderComponent, ProgramBuilder, VariableType, VertexShaderBuilder, VertexShaderComponent } from \"../ShaderBuilder\";\r\nimport { IsAnimated, IsInstanced, IsThematic, PositionType } from \"../TechniqueFlags\";\r\nimport { TechniqueId } from \"../TechniqueId\";\r\nimport { TextureUnit } from \"../RenderFlags\";\r\nimport { addAnimation } from \"./Animation\";\r\nimport { addColor } from \"./Color\";\r\nimport { addFrustum, addShaderFlags } from \"./Common\";\r\nimport { addWhiteOnWhiteReversal } from \"./Fragment\";\r\nimport { addAdjustWidth, addLineCode } from \"./Polyline\";\r\nimport { octDecodeNormal } from \"./Surface\";\r\nimport { addLineWeight, addModelViewMatrix, addNormalMatrix, addProjectionMatrix, addSamplePosition } from \"./Vertex\";\r\nimport { addModelToWindowCoordinates, addViewport } from \"./Viewport\";\r\nimport { addLookupTable } from \"./LookupTable\";\r\nimport { addRenderOrder, addRenderOrderConstants } from \"./FeatureSymbology\";\r\n\r\nexport type EdgeBuilderType = \"SegmentEdge\" | \"Silhouette\" | \"IndexedEdge\";\r\n\r\nconst computeOtherPos = `\r\n g_otherPos = samplePosition(g_otherIndex);\r\n`;\r\n\r\nconst decodeEndPointAndQuadIndices = `\r\n g_otherIndex = decodeUInt24(a_endPointAndQuadIndices.xyz);\r\n${computeOtherPos}\r\n g_quadIndex = a_endPointAndQuadIndices.w;\r\n`;\r\n\r\nconst animateEndPoint = `g_otherPos.xyz += computeAnimationDisplacement(g_otherIndex, u_animDispParams.x, u_animDispParams.y, u_animDispParams.z, u_qAnimDispOrigin, u_qAnimDispScale);`;\r\n\r\n// a_pos is a 24-bit index into edge lookup table.\r\n// First six bytes of lookup table entry are the pair of 24-bit indices identifying the endpoints of the edge in the vertex table.\r\n// Return the 24-bit index of \"this\" vertex in the vertex table encoded in a vec3.\r\nconst computeIndexedQuantizedPosition = `\r\n g_vertexId = gl_VertexID % 6;\r\n if (g_vertexId == 0)\r\n g_quadIndex = 0.0;\r\n else if (g_vertexId == 2 || g_vertexId == 3)\r\n g_quadIndex = 1.0;\r\n else if (g_vertexId == 1 || g_vertexId == 4)\r\n g_quadIndex = 2.0;\r\n else\r\n g_quadIndex = 3.0;\r\n\r\n // The following formula computes the texel index, but suffers from precision issues for large edge indices, so we must compute using integers instead.\r\n // float edgeBaseIndex = u_edgeParams.z * 1.5 + u_edgeParams.w * 0.25 + (edgeIndex - u_edgeParams.z) * 2.5);\r\n\r\n float fEdgeIndex = decodeUInt24(a_pos);\r\n g_isSilhouette = fEdgeIndex >= u_edgeParams.z;\r\n int edgeIndex = int(fEdgeIndex);\r\n bool isEven = 0 == (edgeIndex & 1);\r\n float edgeBaseIndex;\r\n if (!g_isSilhouette) {\r\n edgeBaseIndex = float(edgeIndex + (edgeIndex / 2));\r\n } else {\r\n // If both pad and edgeIndex produce a remainder (0.5 for each - pad is a multiple of 2), we must add one to the index to account for it.\r\n int shift = isEven ? 0 : 1;\r\n int pad = int(u_edgeParams.w);\r\n if (0 != (pad % 4)) {\r\n isEven = !isEven;\r\n shift = shift + 1;\r\n }\r\n\r\n // s = num segments p = num padding bytes i = edge index\r\n // texel index = 1.5s + .25p + 2.5(i - s) = 1.5s + .25p + 2.5i - 2.5s = 2.5i + .25p - s = i + i + i/2 + p/4 - s\r\n edgeBaseIndex = float(edgeIndex + edgeIndex + edgeIndex / 2 + pad / 4 - int(u_edgeParams.z) + shift / 2);\r\n }\r\n\r\n vec2 tc = compute_edge_coords(floor(edgeBaseIndex));\r\n vec4 s0 = floor(TEXTURE(u_edgeLUT, tc) * 255.0 + 0.5);\r\n tc.x += g_edge_stepX;\r\n vec4 s1 = floor(TEXTURE(u_edgeLUT, tc) * 255.0 + 0.5);\r\n tc.x += g_edge_stepX;\r\n vec4 s2 = floor(TEXTURE(u_edgeLUT, tc) * 255.0 + 0.5);\r\n\r\n vec3 i0 = isEven ? s0.xyz : vec3(s0.zw, s1.x);\r\n vec3 i1 = isEven ? vec3(s0.w, s1.xy) : s1.yzw;\r\n g_otherIndexIndex = g_quadIndex < 2.0 ? i1 : i0;\r\n\r\n g_normals = isEven ? vec4(s1.zw, s2.xy) : s2;\r\n\r\n return g_quadIndex < 2.0 ? i0 : i1;\r\n`;\r\n\r\nconst initializeIndexed = `\r\n g_otherIndex = decodeUInt24(g_otherIndexIndex);\r\n${computeOtherPos}\r\n`;\r\n\r\n// IndexedEdgeGeometry.renderOrder returns Edge or PlanarEdge. Adjust if silhouette for output to pick buffers.\r\nconst computeIndexedRenderOrder = `\r\n if (g_isSilhouette)\r\n v_renderOrder = kRenderOrder_Edge == u_renderOrder ? kRenderOrder_Silhouette : kRenderOrder_PlanarSilhouette;\r\n else\r\n v_renderOrder = u_renderOrder;\r\n`;\r\n\r\nconst checkForSilhouetteDiscard = `\r\n if (kFrustumType_Perspective != u_frustum.z) {\r\n float perpTol = 4.75e-6;\r\n return (n0.z * n1.z > perpTol); // orthographic.\r\n } else {\r\n float perpTol = 2.5e-4;\r\n vec4 viewPos = MAT_MV * rawPos; // perspective\r\n vec3 toEye = normalize(viewPos.xyz);\r\n float dot0 = dot(n0, toEye);\r\n float dot1 = dot(n1, toEye);\r\n\r\n if (dot0 * dot1 > perpTol)\r\n return true;\r\n\r\n // Need to discard if either is non-silhouette.\r\n vec4 otherPosition = g_otherPos;\r\n viewPos = MAT_MV * otherPosition;\r\n toEye = normalize(viewPos.xyz);\r\n dot0 = dot(n0, toEye);\r\n dot1 = dot(n1, toEye);\r\n\r\n return dot0 * dot1 > perpTol;\r\n }\r\n`;\r\n\r\nconst checkForSilhouetteDiscardNonIndexed = `\r\n vec3 n0 = MAT_NORM * octDecodeNormal(a_normals.xy);\r\n vec3 n1 = MAT_NORM * octDecodeNormal(a_normals.zw);\r\n${checkForSilhouetteDiscard}\r\n`;\r\n\r\nconst checkForSilhouetteDiscardIndexed = `\r\n if (!g_isSilhouette)\r\n return false;\r\n\r\n vec3 n0 = MAT_NORM * octDecodeNormal(g_normals.xy);\r\n vec3 n1 = MAT_NORM * octDecodeNormal(g_normals.zw);\r\n${checkForSilhouetteDiscard}\r\n`;\r\n\r\nconst computePosition = `\r\n v_lnInfo = vec4(0.0, 0.0, 0.0, 0.0); // init and set flag to false\r\n vec4 other = g_otherPos;\r\n float miterAdjust = 0.0;\r\n float weight = computeLineWeight();\r\n\r\n vec4 pos;\r\n g_windowPos = modelToWindowCoordinates(rawPos, other, pos, v_eyeSpace);\r\n if (g_windowPos.w == 0.0) // Clipped out.\r\n return g_windowPos;\r\n\r\n vec4 otherPos;\r\n vec3 otherMvPos;\r\n vec4 projOther = modelToWindowCoordinates(other, rawPos, otherPos, otherMvPos);\r\n\r\n g_windowDir = projOther.xy - g_windowPos.xy;\r\n\r\n adjustWidth(weight, g_windowDir, g_windowPos.xy);\r\n g_windowDir = normalize(g_windowDir);\r\n\r\n vec2 perp = vec2(-g_windowDir.y, g_windowDir.x);\r\n float perpDist = weight / 2.0;\r\n float alongDist = 0.0;\r\n\r\n perpDist *= sign(0.5 - float(g_quadIndex == 0.0 || g_quadIndex == 3.0)); // negate for index 0 and 3\r\n alongDist += distance(rawPos, other) * float(g_quadIndex >= 2.0); // index 2 and 3 correspond to 'far' endpoint of segment\r\n\r\n pos.x += perp.x * perpDist * 2.0 * pos.w / u_viewport.x;\r\n pos.y += perp.y * perpDist * 2.0 * pos.w / u_viewport.y;\r\n\r\n lineCodeEyePos = .5 * (rawPos + other);\r\n lineCodeDist = alongDist;\r\n\r\n return pos;\r\n`;\r\nconst lineCodeArgs = \"g_windowDir, g_windowPos, 0.0\";\r\n\r\nconst adjustContrast = `\r\n float bgi = u_bgIntensity;\r\n if (bgi < 0.0)\r\n return baseColor;\r\n\r\n float s;\r\n float rgbi = baseColor.r * 0.3 + baseColor.g * 0.59 + baseColor.b * 0.11;\r\n if (rgbi > 0.81)\r\n s = bgi > 0.57 ? 0.0 : 0.699;\r\n else if (rgbi > 0.57)\r\n s = bgi > 0.57 ? 0.0 : 1.0;\r\n else\r\n s = bgi < 0.81 ? 1.0 : 0.699;\r\n\r\n return vec4(vec3(s), baseColor.a);\r\n`;\r\n\r\n/** @internal */\r\nexport function addEdgeContrast(vert: VertexShaderBuilder): void {\r\n vert.addUniform(\"u_bgIntensity\", VariableType.Float, (prog) => {\r\n prog.addGraphicUniform(\"u_bgIntensity\", (uniform, params) => {\r\n let bgi = -1;\r\n if (params.geometry.isEdge && params.target.currentEdgeSettings.wantContrastingColor(params.target.currentViewFlags.renderMode))\r\n bgi = params.target.uniforms.style.backgroundIntensity;\r\n\r\n uniform.setUniform1f(bgi);\r\n });\r\n });\r\n\r\n vert.set(VertexShaderComponent.AdjustContrast, adjustContrast);\r\n}\r\n\r\nconst edgeLutParams = new Float32Array(4);\r\n\r\nfunction createBase(type: EdgeBuilderType, instanced: IsInstanced, isAnimated: IsAnimated, positionType: PositionType): ProgramBuilder {\r\n const isInstanced = IsInstanced.Yes === instanced;\r\n const isSilhouette = \"Silhouette\" === type;\r\n const isIndexed = \"IndexedEdge\" === type;\r\n const techId = isSilhouette ? TechniqueId.SilhouetteEdge : (isIndexed ? TechniqueId.IndexedEdge : TechniqueId.Edge);\r\n const attrMap = AttributeMap.findAttributeMap(techId, isInstanced);\r\n\r\n const builder = new ProgramBuilder(attrMap, { positionType, instanced: isInstanced });\r\n const vert = builder.vert;\r\n\r\n vert.addGlobal(\"g_otherPos\", VariableType.Vec4);\r\n vert.addGlobal(\"g_quadIndex\", VariableType.Float);\r\n vert.addGlobal(\"g_windowPos\", VariableType.Vec4);\r\n vert.addGlobal(\"g_windowDir\", VariableType.Vec2);\r\n vert.addGlobal(\"g_otherIndex\", VariableType.Float);\r\n\r\n addSamplePosition(vert);\r\n\r\n if (isIndexed) {\r\n vert.addGlobal(\"g_vertexId\", VariableType.Int);\r\n vert.addGlobal(\"g_otherIndexIndex\", VariableType.Vec3);\r\n vert.addGlobal(\"g_isSilhouette\", VariableType.Boolean, \"false\");\r\n vert.addGlobal(\"g_normals\", VariableType.Vec4);\r\n\r\n const initLut = addLookupTable(vert, \"edge\", \"1.0\");\r\n vert.addUniform(\"u_edgeLUT\", VariableType.Sampler2D, (prog) => {\r\n prog.addGraphicUniform(\"u_edgeLUT\", (uniform, params) => {\r\n const edge = params.geometry.asIndexedEdge;\r\n assert(undefined !== edge);\r\n edge.edgeLut.texture.bindSampler(uniform, TextureUnit.EdgeLUT);\r\n });\r\n });\r\n\r\n vert.addUniform(\"u_edgeParams\", VariableType.Vec4, (prog) => {\r\n prog.addGraphicUniform(\"u_edgeParams\", (uniform, params) => {\r\n const edge = params.geometry.asIndexedEdge;\r\n assert(undefined !== edge);\r\n edgeLutParams[0] = edge.edgeLut.texture.width;\r\n edgeLutParams[1] = edge.edgeLut.texture.height;\r\n edgeLutParams[2] = edge.edgeLut.numSegments;\r\n edgeLutParams[3] = edge.edgeLut.silhouettePadding;\r\n uniform.setUniform4fv(edgeLutParams);\r\n });\r\n });\r\n\r\n vert.set(VertexShaderComponent.ComputeQuantizedPosition, `${initLut}\\n\\n${computeIndexedQuantizedPosition}`);\r\n vert.addInitializer(initializeIndexed);\r\n\r\n addRenderOrder(vert);\r\n addRenderOrderConstants(vert);\r\n builder.addInlineComputedVarying(\"v_renderOrder\", VariableType.Float, computeIndexedRenderOrder);\r\n builder.frag.set(FragmentShaderComponent.OverrideRenderOrder, \"return v_renderOrder;\");\r\n } else {\r\n vert.addInitializer(decodeEndPointAndQuadIndices);\r\n }\r\n\r\n if (isAnimated) {\r\n addAnimation(vert, false, IsThematic.No);\r\n vert.addInitializer(animateEndPoint);\r\n }\r\n\r\n vert.addGlobal(\"lineCodeEyePos\", VariableType.Vec4);\r\n vert.addGlobal(\"lineCodeDist\", VariableType.Float, \"0.0\");\r\n\r\n addModelToWindowCoordinates(vert); // adds u_mvp, u_viewportTransformation, and sets g_eyeSpace\r\n addProjectionMatrix(vert);\r\n addLineCode(builder, lineCodeArgs);\r\n builder.addVarying(\"v_eyeSpace\", VariableType.Vec3);\r\n vert.set(VertexShaderComponent.ComputePosition, computePosition);\r\n builder.addVarying(\"v_lnInfo\", VariableType.Vec4);\r\n addAdjustWidth(vert);\r\n\r\n addViewport(vert);\r\n addModelViewMatrix(vert);\r\n\r\n addLineWeight(vert);\r\n\r\n if (isSilhouette || isIndexed) {\r\n addNormalMatrix(vert, instanced);\r\n addFrustum(builder);\r\n vert.addFunction(octDecodeNormal);\r\n vert.set(VertexShaderComponent.CheckForEarlyDiscard, isSilhouette ? checkForSilhouetteDiscardNonIndexed : checkForSilhouetteDiscardIndexed);\r\n }\r\n\r\n return builder;\r\n}\r\n\r\n/** @internal */\r\nexport function createEdgeBuilder(type: EdgeBuilderType, instanced: IsInstanced, isAnimated: IsAnimated, posType: PositionType): ProgramBuilder {\r\n const builder = createBase(type, instanced, isAnimated, posType);\r\n addShaderFlags(builder);\r\n addColor(builder);\r\n addEdgeContrast(builder.vert);\r\n addWhiteOnWhiteReversal(builder.frag);\r\n return builder;\r\n}\r\n"]}
|
|
@@ -2,9 +2,9 @@
|
|
|
2
2
|
* @module WebGL
|
|
3
3
|
*/
|
|
4
4
|
import { ProgramBuilder } from "../ShaderBuilder";
|
|
5
|
-
import { IsInstanced } from "../TechniqueFlags";
|
|
5
|
+
import { IsInstanced, PositionType } from "../TechniqueFlags";
|
|
6
6
|
/** @internal */
|
|
7
|
-
export declare function createPointStringHiliter(instanced: IsInstanced): ProgramBuilder;
|
|
7
|
+
export declare function createPointStringHiliter(instanced: IsInstanced, posType: PositionType): ProgramBuilder;
|
|
8
8
|
/** @internal */
|
|
9
|
-
export declare function createPointStringBuilder(instanced: IsInstanced): ProgramBuilder;
|
|
9
|
+
export declare function createPointStringBuilder(instanced: IsInstanced, posType: PositionType): ProgramBuilder;
|
|
10
10
|
//# sourceMappingURL=PointString.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PointString.d.ts","sourceRoot":"","sources":["../../../../../src/render/webgl/glsl/PointString.ts"],"names":[],"mappings":"AAIA;;GAEG;AAGH,OAAO,EAA2B,cAAc,EAAuC,MAAM,kBAAkB,CAAC;AAChH,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"PointString.d.ts","sourceRoot":"","sources":["../../../../../src/render/webgl/glsl/PointString.ts"],"names":[],"mappings":"AAIA;;GAEG;AAGH,OAAO,EAA2B,cAAc,EAAuC,MAAM,kBAAkB,CAAC;AAChH,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AA0C9D,gBAAgB;AAChB,wBAAgB,wBAAwB,CAAC,SAAS,EAAE,WAAW,EAAE,OAAO,EAAE,YAAY,GAAG,cAAc,CAItG;AAED,gBAAgB;AAChB,wBAAgB,wBAAwB,CAAC,SAAS,EAAE,WAAW,EAAE,OAAO,EAAE,YAAY,GAAG,cAAc,CAMtG"}
|
|
@@ -28,9 +28,9 @@ const roundCorners = `
|
|
|
28
28
|
return dot(vt, vt) * v_roundCorners >= 0.25; // meets or exceeds radius of circle
|
|
29
29
|
`;
|
|
30
30
|
const computeRoundCorners = " v_roundCorners = gl_PointSize > 4.0 ? 1.0 : 0.0;";
|
|
31
|
-
function createBase(instanced) {
|
|
31
|
+
function createBase(instanced, positionType) {
|
|
32
32
|
const attrMap = AttributeMap.findAttributeMap(3 /* PointString */, 1 /* Yes */ === instanced);
|
|
33
|
-
const builder = new ProgramBuilder(attrMap, {
|
|
33
|
+
const builder = new ProgramBuilder(attrMap, { positionType, instanced: 1 /* Yes */ === instanced });
|
|
34
34
|
const vert = builder.vert;
|
|
35
35
|
vert.set(10 /* ComputePosition */, computePosition);
|
|
36
36
|
addModelViewProjectionMatrix(vert);
|
|
@@ -40,14 +40,14 @@ function createBase(instanced) {
|
|
|
40
40
|
return builder;
|
|
41
41
|
}
|
|
42
42
|
/** @internal */
|
|
43
|
-
export function createPointStringHiliter(instanced) {
|
|
44
|
-
const builder = createBase(instanced);
|
|
43
|
+
export function createPointStringHiliter(instanced, posType) {
|
|
44
|
+
const builder = createBase(instanced, posType);
|
|
45
45
|
addHiliter(builder, true);
|
|
46
46
|
return builder;
|
|
47
47
|
}
|
|
48
48
|
/** @internal */
|
|
49
|
-
export function createPointStringBuilder(instanced) {
|
|
50
|
-
const builder = createBase(instanced);
|
|
49
|
+
export function createPointStringBuilder(instanced, posType) {
|
|
50
|
+
const builder = createBase(instanced, posType);
|
|
51
51
|
addShaderFlags(builder);
|
|
52
52
|
addColor(builder);
|
|
53
53
|
addWhiteOnWhiteReversal(builder.frag);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PointString.js","sourceRoot":"","sources":["../../../../../src/render/webgl/glsl/PointString.ts"],"names":[],"mappings":"AAAA;;;+FAG+F;AAC/F;;GAEG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAA2B,cAAc,EAAuC,MAAM,kBAAkB,CAAC;AAGhH,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACnC,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,4BAA4B,EAAE,MAAM,UAAU,CAAC;AAEvE,MAAM,eAAe,GAAG;;;;;CAKvB,CAAC;AAEF,uFAAuF;AACvF,4GAA4G;AAC5G,2EAA2E;AAC3E,6BAA6B;AAC7B,MAAM,YAAY,GAAG;;;;CAIpB,CAAC;AAEF,MAAM,mBAAmB,GAAG,oDAAoD,CAAC;AAEjF,SAAS,UAAU,CAAC,SAAsB;
|
|
1
|
+
{"version":3,"file":"PointString.js","sourceRoot":"","sources":["../../../../../src/render/webgl/glsl/PointString.ts"],"names":[],"mappings":"AAAA;;;+FAG+F;AAC/F;;GAEG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAA2B,cAAc,EAAuC,MAAM,kBAAkB,CAAC;AAGhH,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACnC,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,4BAA4B,EAAE,MAAM,UAAU,CAAC;AAEvE,MAAM,eAAe,GAAG;;;;;CAKvB,CAAC;AAEF,uFAAuF;AACvF,4GAA4G;AAC5G,2EAA2E;AAC3E,6BAA6B;AAC7B,MAAM,YAAY,GAAG;;;;CAIpB,CAAC;AAEF,MAAM,mBAAmB,GAAG,oDAAoD,CAAC;AAEjF,SAAS,UAAU,CAAC,SAAsB,EAAE,YAA0B;IACpE,MAAM,OAAO,GAAG,YAAY,CAAC,gBAAgB,sBAA0B,gBAAoB,SAAS,CAAC,CAAC;IAEtG,MAAM,OAAO,GAAG,IAAI,cAAc,CAAC,OAAO,EAAE,EAAE,YAAY,EAAE,SAAS,EAAE,gBAAoB,SAAS,EAAE,CAAC,CAAC;IACxG,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAC1B,IAAI,CAAC,GAAG,2BAAwC,eAAe,CAAC,CAAC;IACjE,4BAA4B,CAAC,IAAI,CAAC,CAAC;IAEnC,aAAa,CAAC,IAAI,CAAC,CAAC;IACpB,OAAO,CAAC,wBAAwB,CAAC,gBAAgB,iBAAsB,mBAAmB,CAAC,CAAC;IAC5F,OAAO,CAAC,IAAI,CAAC,GAAG,+BAA+C,YAAY,CAAC,CAAC;IAE7E,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,gBAAgB;AAChB,MAAM,UAAU,wBAAwB,CAAC,SAAsB,EAAE,OAAqB;IACpF,MAAM,OAAO,GAAG,UAAU,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IAC/C,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IAC1B,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,gBAAgB;AAChB,MAAM,UAAU,wBAAwB,CAAC,SAAsB,EAAE,OAAqB;IACpF,MAAM,OAAO,GAAG,UAAU,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IAC/C,cAAc,CAAC,OAAO,CAAC,CAAC;IACxB,QAAQ,CAAC,OAAO,CAAC,CAAC;IAClB,uBAAuB,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACtC,OAAO,OAAO,CAAC;AACjB,CAAC","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module WebGL\r\n */\r\n\r\nimport { AttributeMap } from \"../AttributeMap\";\r\nimport { FragmentShaderComponent, ProgramBuilder, VariableType, VertexShaderComponent } from \"../ShaderBuilder\";\r\nimport { IsInstanced, PositionType } from \"../TechniqueFlags\";\r\nimport { TechniqueId } from \"../TechniqueId\";\r\nimport { addColor } from \"./Color\";\r\nimport { addShaderFlags } from \"./Common\";\r\nimport { addHiliter } from \"./FeatureSymbology\";\r\nimport { addWhiteOnWhiteReversal } from \"./Fragment\";\r\nimport { addLineWeight, addModelViewProjectionMatrix } from \"./Vertex\";\r\n\r\nconst computePosition = `\r\n float lineWeight = computeLineWeight();\r\n lineWeight += 0.5 * float(lineWeight > 4.0); // fudge factor for rounding fat points...\r\n gl_PointSize = lineWeight;\r\n return MAT_MVP * rawPos;\r\n`;\r\n\r\n// gl_PointSize specifies coordinates of this fragment within the point in range [0,1].\r\n// This should be the most precise of the many approaches we've tried, but it still yields some asymmetry...\r\n// Discarding if it meets radius precisely seems to reduce that slightly...\r\n// ###TODO try point sprites?\r\nconst roundCorners = `\r\n const vec2 center = vec2(0.5, 0.5);\r\n vec2 vt = gl_PointCoord - center;\r\n return dot(vt, vt) * v_roundCorners >= 0.25; // meets or exceeds radius of circle\r\n`;\r\n\r\nconst computeRoundCorners = \" v_roundCorners = gl_PointSize > 4.0 ? 1.0 : 0.0;\";\r\n\r\nfunction createBase(instanced: IsInstanced, positionType: PositionType): ProgramBuilder {\r\n const attrMap = AttributeMap.findAttributeMap(TechniqueId.PointString, IsInstanced.Yes === instanced);\r\n\r\n const builder = new ProgramBuilder(attrMap, { positionType, instanced: IsInstanced.Yes === instanced });\r\n const vert = builder.vert;\r\n vert.set(VertexShaderComponent.ComputePosition, computePosition);\r\n addModelViewProjectionMatrix(vert);\r\n\r\n addLineWeight(vert);\r\n builder.addInlineComputedVarying(\"v_roundCorners\", VariableType.Float, computeRoundCorners);\r\n builder.frag.set(FragmentShaderComponent.CheckForEarlyDiscard, roundCorners);\r\n\r\n return builder;\r\n}\r\n\r\n/** @internal */\r\nexport function createPointStringHiliter(instanced: IsInstanced, posType: PositionType): ProgramBuilder {\r\n const builder = createBase(instanced, posType);\r\n addHiliter(builder, true);\r\n return builder;\r\n}\r\n\r\n/** @internal */\r\nexport function createPointStringBuilder(instanced: IsInstanced, posType: PositionType): ProgramBuilder {\r\n const builder = createBase(instanced, posType);\r\n addShaderFlags(builder);\r\n addColor(builder);\r\n addWhiteOnWhiteReversal(builder.frag);\r\n return builder;\r\n}\r\n"]}
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* @module WebGL
|
|
3
3
|
*/
|
|
4
4
|
import { FragmentShaderBuilder, ProgramBuilder, VertexShaderBuilder } from "../ShaderBuilder";
|
|
5
|
-
import { IsInstanced } from "../TechniqueFlags";
|
|
5
|
+
import { IsInstanced, PositionType } from "../TechniqueFlags";
|
|
6
6
|
/** @internal */
|
|
7
7
|
export declare const adjustWidth = "\nvoid adjustWidth(inout float width, vec2 d2, vec2 org) {\n if (u_aaSamples > 1) {\n if (width < 5.0)\n width += (5.0 - width) * 0.125;\n return;\n }\n\n // calculate slope based width adjustment for non-AA lines, widths 1 to 4\n vec2 d2A = abs(d2);\n const float s_myFltEpsilon = 0.0001; // limit test resolution to 4 digits in case 24 bit (s16e7) is used in hardware\n if (d2A.y > s_myFltEpsilon && width < 4.5) {\n float len = length(d2A);\n float tan = d2A.x / d2A.y;\n\n if (width < 1.5) { // width 1\n if (tan <= 1.0)\n width = d2A.y;\n else\n width = d2A.x;\n // width 1 requires additional adjustment plus trimming in frag shader using v_lnInfo\n width *= 1.01;\n v_lnInfo.xy = org;\n v_lnInfo.w = 1.0; // set flag to do trimming\n // set slope in v_lnInfo.z\n if (d2A.x - d2A.y > s_myFltEpsilon) {\n v_lnInfo.z = d2.y / d2.x;\n v_lnInfo.w += 2.0; // add in x-major flag\n } else\n v_lnInfo.z = d2.x / d2.y;\n\n } else if (width < 2.5) { // width 2\n if (tan <= 0.5)\n width = 2.0 * d2A.y;\n else\n width = (d2A.y + 2.0 * d2A.x);\n\n } else if (width < 3.5) { // width 3\n if (tan <= 1.0)\n width = (3.0 * d2A.y + d2A.x);\n else\n width = (d2A.y + 3.0 * d2A.x);\n\n } else { // if (width < 4.5) // width 4\n if (tan <= 0.5)\n width = (4.0 * d2A.y + d2A.x);\n else if (tan <= 2.0)\n width = (3.0 * d2A.y + 3.0 * d2A.x);\n else\n width = (d2A.y + 4.0 * d2A.x);\n }\n width /= len;\n }\n}\n";
|
|
8
8
|
/** @internal */
|
|
@@ -12,7 +12,7 @@ export declare function addLineCodeTexture(frag: FragmentShaderBuilder): void;
|
|
|
12
12
|
/** @internal */
|
|
13
13
|
export declare function addLineCode(prog: ProgramBuilder, args: string): void;
|
|
14
14
|
/** @internal */
|
|
15
|
-
export declare function createPolylineBuilder(isInstanced: IsInstanced): ProgramBuilder;
|
|
15
|
+
export declare function createPolylineBuilder(isInstanced: IsInstanced, positionType: PositionType): ProgramBuilder;
|
|
16
16
|
/** @internal */
|
|
17
|
-
export declare function createPolylineHiliter(isInstanced: IsInstanced): ProgramBuilder;
|
|
17
|
+
export declare function createPolylineHiliter(isInstanced: IsInstanced, positionType: PositionType): ProgramBuilder;
|
|
18
18
|
//# sourceMappingURL=Polyline.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Polyline.d.ts","sourceRoot":"","sources":["../../../../../src/render/webgl/glsl/Polyline.ts"],"names":[],"mappings":"AAIA;;GAEG;AAKH,OAAO,EACL,qBAAqB,EAA2B,cAAc,EAAgB,mBAAmB,EAClG,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"Polyline.d.ts","sourceRoot":"","sources":["../../../../../src/render/webgl/glsl/Polyline.ts"],"names":[],"mappings":"AAIA;;GAEG;AAKH,OAAO,EACL,qBAAqB,EAA2B,cAAc,EAAgB,mBAAmB,EAClG,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAgE9D,gBAAgB;AAChB,eAAO,MAAM,WAAW,olDAsDvB,CAAC;AAEF,gBAAgB;AAChB,wBAAgB,cAAc,CAAC,IAAI,EAAE,mBAAmB,QAQvD;AAED,gBAAgB;AAChB,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,qBAAqB,QAS7D;AAED,gBAAgB;AAChB,wBAAgB,WAAW,CAAC,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,QAgB7D;AA4JD,gBAAgB;AAChB,wBAAgB,qBAAqB,CAAC,WAAW,EAAE,WAAW,EAAE,YAAY,EAAE,YAAY,GAAG,cAAc,CAgB1G;AAED,gBAAgB;AAChB,wBAAgB,qBAAqB,CAAC,WAAW,EAAE,WAAW,EAAE,YAAY,EAAE,YAAY,GAAG,cAAc,CAS1G"}
|
|
@@ -16,7 +16,7 @@ import { addFrustum, addShaderFlags } from "./Common";
|
|
|
16
16
|
import { unquantize2d } from "./Decode";
|
|
17
17
|
import { addHiliter } from "./FeatureSymbology";
|
|
18
18
|
import { addWhiteOnWhiteReversal } from "./Fragment";
|
|
19
|
-
import { addLineCode as addLineCodeUniform, addLineWeight, addModelViewMatrix, addProjectionMatrix } from "./Vertex";
|
|
19
|
+
import { addLineCode as addLineCodeUniform, addLineWeight, addModelViewMatrix, addProjectionMatrix, addSamplePosition, } from "./Vertex";
|
|
20
20
|
import { addModelToWindowCoordinates, addViewport } from "./Viewport";
|
|
21
21
|
const checkForDiscard = "return discardByLineCode;";
|
|
22
22
|
const applyLineCode = `
|
|
@@ -178,17 +178,13 @@ function addCommon(prog) {
|
|
|
178
178
|
vert.set(10 /* ComputePosition */, computePosition);
|
|
179
179
|
prog.addVarying("v_lnInfo", 5 /* Vec4 */);
|
|
180
180
|
addAdjustWidth(vert);
|
|
181
|
+
addSamplePosition(vert);
|
|
181
182
|
vert.addFunction(decodePosition);
|
|
182
183
|
}
|
|
183
184
|
const decodePosition = `
|
|
184
185
|
vec4 decodePosition(vec3 baseIndex) {
|
|
185
186
|
float index = decodeUInt24(baseIndex);
|
|
186
|
-
|
|
187
|
-
vec4 e0 = floor(TEXTURE(u_vertLUT, tc) * 255.0 + 0.5);
|
|
188
|
-
tc.x += g_vert_stepX;
|
|
189
|
-
vec4 e1 = floor(TEXTURE(u_vertLUT, tc) * 255.0 + 0.5);
|
|
190
|
-
vec3 qpos = vec3(decodeUInt16(e0.xy), decodeUInt16(e0.zw), decodeUInt16(e1.xy));
|
|
191
|
-
return unquantizePosition(qpos, u_qOrigin, u_qScale);
|
|
187
|
+
return samplePosition(index);
|
|
192
188
|
}
|
|
193
189
|
`;
|
|
194
190
|
const decodeAdjacentPositions = `
|
|
@@ -304,10 +300,10 @@ const computePosition = `
|
|
|
304
300
|
`;
|
|
305
301
|
const lineCodeArgs = "g_windowDir, g_windowPos, miterAdjust";
|
|
306
302
|
/** @internal */
|
|
307
|
-
export function createPolylineBuilder(isInstanced) {
|
|
303
|
+
export function createPolylineBuilder(isInstanced, positionType) {
|
|
308
304
|
const instanced = 1 /* Yes */ === isInstanced;
|
|
309
305
|
const attrMap = AttributeMap.findAttributeMap(1 /* Polyline */, instanced);
|
|
310
|
-
const builder = new ProgramBuilder(attrMap, {
|
|
306
|
+
const builder = new ProgramBuilder(attrMap, { positionType, instanced });
|
|
311
307
|
addShaderFlags(builder);
|
|
312
308
|
addCommon(builder);
|
|
313
309
|
polylineAddLineCode(builder);
|
|
@@ -317,10 +313,10 @@ export function createPolylineBuilder(isInstanced) {
|
|
|
317
313
|
return builder;
|
|
318
314
|
}
|
|
319
315
|
/** @internal */
|
|
320
|
-
export function createPolylineHiliter(isInstanced) {
|
|
316
|
+
export function createPolylineHiliter(isInstanced, positionType) {
|
|
321
317
|
const instanced = 1 /* Yes */ === isInstanced;
|
|
322
318
|
const attrMap = AttributeMap.findAttributeMap(1 /* Polyline */, instanced);
|
|
323
|
-
const builder = new ProgramBuilder(attrMap, {
|
|
319
|
+
const builder = new ProgramBuilder(attrMap, { positionType, instanced });
|
|
324
320
|
addCommon(builder);
|
|
325
321
|
addFrustum(builder);
|
|
326
322
|
addHiliter(builder, true);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Polyline.js","sourceRoot":"","sources":["../../../../../src/render/webgl/glsl/Polyline.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module WebGL\r\n */\r\n\r\nimport { assert } from \"@itwin/core-bentley\";\r\nimport { AttributeMap } from \"../AttributeMap\";\r\nimport { TextureUnit } from \"../RenderFlags\";\r\nimport {\r\n FragmentShaderBuilder, FragmentShaderComponent, ProgramBuilder, VariableType, VertexShaderBuilder, VertexShaderComponent,\r\n} from \"../ShaderBuilder\";\r\nimport { System } from \"../System\";\r\nimport { IsInstanced } from \"../TechniqueFlags\";\r\nimport { TechniqueId } from \"../TechniqueId\";\r\nimport { addColor } from \"./Color\";\r\nimport { addEdgeContrast } from \"./Edge\";\r\nimport { addFrustum, addShaderFlags } from \"./Common\";\r\nimport { unquantize2d } from \"./Decode\";\r\nimport { addHiliter } from \"./FeatureSymbology\";\r\nimport { addWhiteOnWhiteReversal } from \"./Fragment\";\r\nimport { addLineCode as addLineCodeUniform, addLineWeight, addModelViewMatrix, addProjectionMatrix } from \"./Vertex\";\r\nimport { addModelToWindowCoordinates, addViewport } from \"./Viewport\";\r\n\r\nconst checkForDiscard = \"return discardByLineCode;\";\r\n\r\nconst applyLineCode = `\r\n if (v_texc.x >= 0.0) { // v_texc = (-1,-1) for solid lines - don't bother with any of this\r\n vec4 texColor = TEXTURE(u_lineCodeTexture, v_texc);\r\n discardByLineCode = (0.0 == texColor.r);\r\n }\r\n\r\n if (v_lnInfo.w > 0.5) { // line needs pixel trimming\r\n // calculate pixel distance from pixel center to expected line center, opposite dir from major\r\n vec2 dxy = gl_FragCoord.xy - v_lnInfo.xy;\r\n if (v_lnInfo.w < 1.5) // not x-major\r\n dxy = dxy.yx;\r\n\r\n float dist = v_lnInfo.z * dxy.x - dxy.y;\r\n float distA = abs(dist);\r\n if (distA > 0.5 || (distA == 0.5 && dist < 0.0))\r\n discardByLineCode = true; // borrow this flag to force discard\r\n }\r\n\r\n return baseColor;\r\n`;\r\n\r\nconst computeTextureCoord = `\r\nvec2 computeLineCodeTextureCoords(vec2 windowDir, vec4 projPos, float adjust) {\r\n vec2 texc;\r\n float lineCode = computeLineCode();\r\n if (0.0 == lineCode) {\r\n // Solid line - tell frag shader not to bother.\r\n texc = vec2(-1.0, -1.0);\r\n } else {\r\n const float imagesPerPixel = 1.0/32.0;\r\n const float textureCoordinateBase = 8192.0; // Temp workardound for clipping problem in perspective views (negative values don't seem to interpolate correctly).\r\n\r\n if (abs(windowDir.x) > abs(windowDir.y))\r\n texc.x = textureCoordinateBase + imagesPerPixel * (projPos.x + adjust * windowDir.x);\r\n else\r\n texc.x = textureCoordinateBase + imagesPerPixel * (projPos.y + adjust * windowDir.y);\r\n\r\n const float numLineCodes = 16.0; // NB: Actually only 10, but texture is 16px tall because it needs to be a power of 2.\r\n const float rowsPerCode = 1.0;\r\n const float numRows = numLineCodes*rowsPerCode;\r\n const float centerY = 0.5/numRows;\r\n const float stepY = rowsPerCode/numRows;\r\n texc.y = stepY * lineCode + centerY;\r\n }\r\n\r\n return texc;\r\n}\r\n`;\r\n\r\n/** @internal */\r\nexport const adjustWidth = `\r\nvoid adjustWidth(inout float width, vec2 d2, vec2 org) {\r\n if (u_aaSamples > 1) {\r\n if (width < 5.0)\r\n width += (5.0 - width) * 0.125;\r\n return;\r\n }\r\n\r\n // calculate slope based width adjustment for non-AA lines, widths 1 to 4\r\n vec2 d2A = abs(d2);\r\n const float s_myFltEpsilon = 0.0001; // limit test resolution to 4 digits in case 24 bit (s16e7) is used in hardware\r\n if (d2A.y > s_myFltEpsilon && width < 4.5) {\r\n float len = length(d2A);\r\n float tan = d2A.x / d2A.y;\r\n\r\n if (width < 1.5) { // width 1\r\n if (tan <= 1.0)\r\n width = d2A.y;\r\n else\r\n width = d2A.x;\r\n // width 1 requires additional adjustment plus trimming in frag shader using v_lnInfo\r\n width *= 1.01;\r\n v_lnInfo.xy = org;\r\n v_lnInfo.w = 1.0; // set flag to do trimming\r\n // set slope in v_lnInfo.z\r\n if (d2A.x - d2A.y > s_myFltEpsilon) {\r\n v_lnInfo.z = d2.y / d2.x;\r\n v_lnInfo.w += 2.0; // add in x-major flag\r\n } else\r\n v_lnInfo.z = d2.x / d2.y;\r\n\r\n } else if (width < 2.5) { // width 2\r\n if (tan <= 0.5)\r\n width = 2.0 * d2A.y;\r\n else\r\n width = (d2A.y + 2.0 * d2A.x);\r\n\r\n } else if (width < 3.5) { // width 3\r\n if (tan <= 1.0)\r\n width = (3.0 * d2A.y + d2A.x);\r\n else\r\n width = (d2A.y + 3.0 * d2A.x);\r\n\r\n } else { // if (width < 4.5) // width 4\r\n if (tan <= 0.5)\r\n width = (4.0 * d2A.y + d2A.x);\r\n else if (tan <= 2.0)\r\n width = (3.0 * d2A.y + 3.0 * d2A.x);\r\n else\r\n width = (d2A.y + 4.0 * d2A.x);\r\n }\r\n width /= len;\r\n }\r\n}\r\n`;\r\n\r\n/** @internal */\r\nexport function addAdjustWidth(vert: VertexShaderBuilder) {\r\n vert.addUniform(\"u_aaSamples\", VariableType.Int, (prog) => {\r\n prog.addGraphicUniform(\"u_aaSamples\", (attr, params) => {\r\n const numSamples = System.instance.frameBufferStack.currentFbMultisampled ? params.target.compositor.antialiasSamples : 1;\r\n attr.setUniform1i(numSamples);\r\n });\r\n });\r\n vert.addFunction(adjustWidth);\r\n}\r\n\r\n/** @internal */\r\nexport function addLineCodeTexture(frag: FragmentShaderBuilder) {\r\n frag.addUniform(\"u_lineCodeTexture\", VariableType.Sampler2D, (prog) => {\r\n prog.addProgramUniform(\"u_lineCodeTexture\", (uniform) => {\r\n const lct = System.instance.lineCodeTexture;\r\n assert(undefined !== lct);\r\n if (undefined !== lct)\r\n lct.bindSampler(uniform, TextureUnit.LineCode);\r\n });\r\n });\r\n}\r\n\r\n/** @internal */\r\nexport function addLineCode(prog: ProgramBuilder, args: string) {\r\n const vert = prog.vert;\r\n const frag = prog.frag;\r\n\r\n addLineCodeUniform(vert);\r\n\r\n const funcCall: string = `computeLineCodeTextureCoords(${args})`;\r\n\r\n prog.addFunctionComputedVaryingWithArgs(\"v_texc\", VariableType.Vec2, funcCall, computeTextureCoord);\r\n\r\n addFrustum(prog);\r\n addLineCodeTexture(prog.frag);\r\n\r\n frag.set(FragmentShaderComponent.FinalizeBaseColor, applyLineCode);\r\n frag.set(FragmentShaderComponent.CheckForDiscard, checkForDiscard);\r\n frag.addGlobal(\"discardByLineCode\", VariableType.Boolean, \"false\");\r\n}\r\n\r\nfunction polylineAddLineCode(prog: ProgramBuilder) {\r\n addLineCode(prog, lineCodeArgs);\r\n addModelViewMatrix(prog.vert);\r\n}\r\n\r\nfunction addCommon(prog: ProgramBuilder) {\r\n const vert = prog.vert;\r\n addModelToWindowCoordinates(vert); // adds u_mvp, u_viewportTransformation\r\n addProjectionMatrix(vert);\r\n addModelViewMatrix(vert);\r\n addViewport(vert);\r\n\r\n vert.addGlobal(\"g_windowPos\", VariableType.Vec4);\r\n vert.addGlobal(\"g_prevPos\", VariableType.Vec4);\r\n vert.addGlobal(\"g_nextPos\", VariableType.Vec4);\r\n vert.addGlobal(\"g_windowDir\", VariableType.Vec2);\r\n vert.addInitializer(decodeAdjacentPositions);\r\n\r\n vert.addFunction(unquantize2d);\r\n\r\n addLineWeight(vert);\r\n\r\n vert.addGlobal(\"miterAdjust\", VariableType.Float, \"0.0\");\r\n prog.addVarying(\"v_eyeSpace\", VariableType.Vec3);\r\n vert.set(VertexShaderComponent.ComputePosition, computePosition);\r\n prog.addVarying(\"v_lnInfo\", VariableType.Vec4);\r\n addAdjustWidth(vert);\r\n vert.addFunction(decodePosition);\r\n}\r\n\r\nconst decodePosition = `\r\nvec4 decodePosition(vec3 baseIndex) {\r\n float index = decodeUInt24(baseIndex);\r\n vec2 tc = compute_vert_coords(index);\r\n vec4 e0 = floor(TEXTURE(u_vertLUT, tc) * 255.0 + 0.5);\r\n tc.x += g_vert_stepX;\r\n vec4 e1 = floor(TEXTURE(u_vertLUT, tc) * 255.0 + 0.5);\r\n vec3 qpos = vec3(decodeUInt16(e0.xy), decodeUInt16(e0.zw), decodeUInt16(e1.xy));\r\n return unquantizePosition(qpos, u_qOrigin, u_qScale);\r\n}\r\n`;\r\n\r\nconst decodeAdjacentPositions = `\r\n g_prevPos = decodePosition(a_prevIndex);\r\n g_nextPos = decodePosition(a_nextIndex);\r\n`;\r\n\r\nconst computePosition = `\r\n const float kNone = 0.0,\r\n kSquare = 1.0*3.0,\r\n kMiter = 2.0*3.0,\r\n kMiterInsideOnly = 3.0*3.0,\r\n kJointBase = 4.0*3.0,\r\n kNegatePerp = 8.0*3.0,\r\n kNegateAlong = 16.0*3.0,\r\n kNoneAdjWt = 32.0*3.0;\r\n\r\n v_lnInfo = vec4(0.0, 0.0, 0.0, 0.0); // init and set flag to false\r\n\r\n vec4 next = g_nextPos;\r\n vec4 pos;\r\n g_windowPos = modelToWindowCoordinates(rawPos, next, pos, v_eyeSpace);\r\n if (g_windowPos.w == 0.0)\r\n return g_windowPos;\r\n\r\n float param = a_param;\r\n float weight = computeLineWeight();\r\n float scale = 1.0, directionScale = 1.0;\r\n\r\n if (param >= kNoneAdjWt)\r\n param -= kNoneAdjWt;\r\n\r\n if (param >= kNegateAlong) {\r\n directionScale = -directionScale;\r\n param -= kNegateAlong;\r\n }\r\n\r\n if (param >= kNegatePerp) {\r\n scale = -1.0;\r\n param -= kNegatePerp;\r\n }\r\n\r\n vec4 otherPos;\r\n vec3 otherMvPos;\r\n vec4 projNext = modelToWindowCoordinates(next, rawPos, otherPos, otherMvPos);\r\n g_windowDir = projNext.xy - g_windowPos.xy;\r\n\r\n if (param < kJointBase) {\r\n vec2 dir = (directionScale > 0.0) ? g_windowDir : -g_windowDir;\r\n vec2 pos = (directionScale > 0.0) ? g_windowPos.xy : projNext.xy;\r\n adjustWidth(weight, dir, pos);\r\n }\r\n\r\n if (kNone != param) {\r\n vec2 delta = vec2(0.0);\r\n vec4 prev = g_prevPos;\r\n vec4 projPrev = modelToWindowCoordinates(prev, rawPos, otherPos, otherMvPos);\r\n vec2 prevDir = g_windowPos.xy - projPrev.xy;\r\n float thisLength = sqrt(g_windowDir.x * g_windowDir.x + g_windowDir.y * g_windowDir.y);\r\n const float s_minNormalizeLength = 1.0E-5; // avoid normalizing zero length vectors.\r\n float dist = weight / 2.0;\r\n\r\n if (thisLength > s_minNormalizeLength) {\r\n g_windowDir /= thisLength;\r\n\r\n float prevLength = sqrt(prevDir.x * prevDir.x + prevDir.y * prevDir.y);\r\n\r\n if (prevLength > s_minNormalizeLength) {\r\n prevDir /= prevLength;\r\n const float s_minParallelDot= -.9999, s_maxParallelDot = .9999;\r\n float prevNextDot = dot(prevDir, g_windowDir);\r\n\r\n if (prevNextDot < s_minParallelDot || prevNextDot > s_maxParallelDot) // No miter if parallel or antiparallel.\r\n param = kSquare;\r\n } else\r\n param = kSquare;\r\n } else {\r\n g_windowDir = -normalize(prevDir);\r\n param = kSquare;\r\n }\r\n\r\n vec2 perp = scale * vec2(-g_windowDir.y, g_windowDir.x);\r\n\r\n if (param == kSquare) {\r\n delta = perp;\r\n } else {\r\n vec2 bisector = normalize(prevDir - g_windowDir);\r\n float dotP = dot (bisector, perp);\r\n\r\n if (dotP != 0.0) { // Should never occur - but avoid divide by zero.\r\n const float maxMiter = 3.0;\r\n float miterDistance = 1.0/dotP;\r\n\r\n if (param == kMiter) { // Straight miter.\r\n delta = (abs(miterDistance) > maxMiter) ? perp : bisector * miterDistance;\r\n\r\n } else if (param == kMiterInsideOnly) { // Miter at inside, square at outside (to make room for joint).\r\n delta = (dotP > 0.0 || abs(miterDistance) > maxMiter) ? perp : bisector * miterDistance;\r\n\r\n } else {\r\n const float jointTriangleCount = 3.0;\r\n float ratio = (param - kJointBase) / jointTriangleCount; // 3 triangles per half-joint as defined in Graphics.cpp\r\n delta = normalize((1.0 - ratio) * bisector + (dotP < 0.0 ? -ratio : ratio) * perp); // Miter/Straight combination.\r\n }\r\n }\r\n }\r\n\r\n miterAdjust = dot(g_windowDir, delta) * dist; // Not actually used for hilite shader but meh.\r\n pos.x += dist * delta.x * 2.0 * pos.w / u_viewport.x;\r\n pos.y += dist * delta.y * 2.0 * pos.w / u_viewport.y;\r\n }\r\n\r\n return pos;\r\n`;\r\n\r\nconst lineCodeArgs = \"g_windowDir, g_windowPos, miterAdjust\";\r\n\r\n/** @internal */\r\nexport function createPolylineBuilder(isInstanced: IsInstanced): ProgramBuilder {\r\n const instanced = IsInstanced.Yes === isInstanced;\r\n const attrMap = AttributeMap.findAttributeMap(TechniqueId.Polyline, instanced);\r\n const builder = new ProgramBuilder(attrMap, { maxRgbaPerVertex: 5, instanced });\r\n\r\n addShaderFlags(builder);\r\n\r\n addCommon(builder);\r\n\r\n polylineAddLineCode(builder);\r\n\r\n addColor(builder);\r\n addEdgeContrast(builder.vert);\r\n addWhiteOnWhiteReversal(builder.frag);\r\n\r\n return builder;\r\n}\r\n\r\n/** @internal */\r\nexport function createPolylineHiliter(isInstanced: IsInstanced): ProgramBuilder {\r\n const instanced = IsInstanced.Yes === isInstanced;\r\n const attrMap = AttributeMap.findAttributeMap(TechniqueId.Polyline, instanced);\r\n const builder = new ProgramBuilder(attrMap, { maxRgbaPerVertex: 5, instanced });\r\n\r\n addCommon(builder);\r\n addFrustum(builder);\r\n addHiliter(builder, true);\r\n return builder;\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"Polyline.js","sourceRoot":"","sources":["../../../../../src/render/webgl/glsl/Polyline.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module WebGL\r\n */\r\n\r\nimport { assert } from \"@itwin/core-bentley\";\r\nimport { AttributeMap } from \"../AttributeMap\";\r\nimport { TextureUnit } from \"../RenderFlags\";\r\nimport {\r\n FragmentShaderBuilder, FragmentShaderComponent, ProgramBuilder, VariableType, VertexShaderBuilder, VertexShaderComponent,\r\n} from \"../ShaderBuilder\";\r\nimport { System } from \"../System\";\r\nimport { IsInstanced, PositionType } from \"../TechniqueFlags\";\r\nimport { TechniqueId } from \"../TechniqueId\";\r\nimport { addColor } from \"./Color\";\r\nimport { addEdgeContrast } from \"./Edge\";\r\nimport { addFrustum, addShaderFlags } from \"./Common\";\r\nimport { unquantize2d } from \"./Decode\";\r\nimport { addHiliter } from \"./FeatureSymbology\";\r\nimport { addWhiteOnWhiteReversal } from \"./Fragment\";\r\nimport {\r\n addLineCode as addLineCodeUniform, addLineWeight, addModelViewMatrix, addProjectionMatrix, addSamplePosition,\r\n} from \"./Vertex\";\r\nimport { addModelToWindowCoordinates, addViewport } from \"./Viewport\";\r\n\r\nconst checkForDiscard = \"return discardByLineCode;\";\r\n\r\nconst applyLineCode = `\r\n if (v_texc.x >= 0.0) { // v_texc = (-1,-1) for solid lines - don't bother with any of this\r\n vec4 texColor = TEXTURE(u_lineCodeTexture, v_texc);\r\n discardByLineCode = (0.0 == texColor.r);\r\n }\r\n\r\n if (v_lnInfo.w > 0.5) { // line needs pixel trimming\r\n // calculate pixel distance from pixel center to expected line center, opposite dir from major\r\n vec2 dxy = gl_FragCoord.xy - v_lnInfo.xy;\r\n if (v_lnInfo.w < 1.5) // not x-major\r\n dxy = dxy.yx;\r\n\r\n float dist = v_lnInfo.z * dxy.x - dxy.y;\r\n float distA = abs(dist);\r\n if (distA > 0.5 || (distA == 0.5 && dist < 0.0))\r\n discardByLineCode = true; // borrow this flag to force discard\r\n }\r\n\r\n return baseColor;\r\n`;\r\n\r\nconst computeTextureCoord = `\r\nvec2 computeLineCodeTextureCoords(vec2 windowDir, vec4 projPos, float adjust) {\r\n vec2 texc;\r\n float lineCode = computeLineCode();\r\n if (0.0 == lineCode) {\r\n // Solid line - tell frag shader not to bother.\r\n texc = vec2(-1.0, -1.0);\r\n } else {\r\n const float imagesPerPixel = 1.0/32.0;\r\n const float textureCoordinateBase = 8192.0; // Temp workardound for clipping problem in perspective views (negative values don't seem to interpolate correctly).\r\n\r\n if (abs(windowDir.x) > abs(windowDir.y))\r\n texc.x = textureCoordinateBase + imagesPerPixel * (projPos.x + adjust * windowDir.x);\r\n else\r\n texc.x = textureCoordinateBase + imagesPerPixel * (projPos.y + adjust * windowDir.y);\r\n\r\n const float numLineCodes = 16.0; // NB: Actually only 10, but texture is 16px tall because it needs to be a power of 2.\r\n const float rowsPerCode = 1.0;\r\n const float numRows = numLineCodes*rowsPerCode;\r\n const float centerY = 0.5/numRows;\r\n const float stepY = rowsPerCode/numRows;\r\n texc.y = stepY * lineCode + centerY;\r\n }\r\n\r\n return texc;\r\n}\r\n`;\r\n\r\n/** @internal */\r\nexport const adjustWidth = `\r\nvoid adjustWidth(inout float width, vec2 d2, vec2 org) {\r\n if (u_aaSamples > 1) {\r\n if (width < 5.0)\r\n width += (5.0 - width) * 0.125;\r\n return;\r\n }\r\n\r\n // calculate slope based width adjustment for non-AA lines, widths 1 to 4\r\n vec2 d2A = abs(d2);\r\n const float s_myFltEpsilon = 0.0001; // limit test resolution to 4 digits in case 24 bit (s16e7) is used in hardware\r\n if (d2A.y > s_myFltEpsilon && width < 4.5) {\r\n float len = length(d2A);\r\n float tan = d2A.x / d2A.y;\r\n\r\n if (width < 1.5) { // width 1\r\n if (tan <= 1.0)\r\n width = d2A.y;\r\n else\r\n width = d2A.x;\r\n // width 1 requires additional adjustment plus trimming in frag shader using v_lnInfo\r\n width *= 1.01;\r\n v_lnInfo.xy = org;\r\n v_lnInfo.w = 1.0; // set flag to do trimming\r\n // set slope in v_lnInfo.z\r\n if (d2A.x - d2A.y > s_myFltEpsilon) {\r\n v_lnInfo.z = d2.y / d2.x;\r\n v_lnInfo.w += 2.0; // add in x-major flag\r\n } else\r\n v_lnInfo.z = d2.x / d2.y;\r\n\r\n } else if (width < 2.5) { // width 2\r\n if (tan <= 0.5)\r\n width = 2.0 * d2A.y;\r\n else\r\n width = (d2A.y + 2.0 * d2A.x);\r\n\r\n } else if (width < 3.5) { // width 3\r\n if (tan <= 1.0)\r\n width = (3.0 * d2A.y + d2A.x);\r\n else\r\n width = (d2A.y + 3.0 * d2A.x);\r\n\r\n } else { // if (width < 4.5) // width 4\r\n if (tan <= 0.5)\r\n width = (4.0 * d2A.y + d2A.x);\r\n else if (tan <= 2.0)\r\n width = (3.0 * d2A.y + 3.0 * d2A.x);\r\n else\r\n width = (d2A.y + 4.0 * d2A.x);\r\n }\r\n width /= len;\r\n }\r\n}\r\n`;\r\n\r\n/** @internal */\r\nexport function addAdjustWidth(vert: VertexShaderBuilder) {\r\n vert.addUniform(\"u_aaSamples\", VariableType.Int, (prog) => {\r\n prog.addGraphicUniform(\"u_aaSamples\", (attr, params) => {\r\n const numSamples = System.instance.frameBufferStack.currentFbMultisampled ? params.target.compositor.antialiasSamples : 1;\r\n attr.setUniform1i(numSamples);\r\n });\r\n });\r\n vert.addFunction(adjustWidth);\r\n}\r\n\r\n/** @internal */\r\nexport function addLineCodeTexture(frag: FragmentShaderBuilder) {\r\n frag.addUniform(\"u_lineCodeTexture\", VariableType.Sampler2D, (prog) => {\r\n prog.addProgramUniform(\"u_lineCodeTexture\", (uniform) => {\r\n const lct = System.instance.lineCodeTexture;\r\n assert(undefined !== lct);\r\n if (undefined !== lct)\r\n lct.bindSampler(uniform, TextureUnit.LineCode);\r\n });\r\n });\r\n}\r\n\r\n/** @internal */\r\nexport function addLineCode(prog: ProgramBuilder, args: string) {\r\n const vert = prog.vert;\r\n const frag = prog.frag;\r\n\r\n addLineCodeUniform(vert);\r\n\r\n const funcCall: string = `computeLineCodeTextureCoords(${args})`;\r\n\r\n prog.addFunctionComputedVaryingWithArgs(\"v_texc\", VariableType.Vec2, funcCall, computeTextureCoord);\r\n\r\n addFrustum(prog);\r\n addLineCodeTexture(prog.frag);\r\n\r\n frag.set(FragmentShaderComponent.FinalizeBaseColor, applyLineCode);\r\n frag.set(FragmentShaderComponent.CheckForDiscard, checkForDiscard);\r\n frag.addGlobal(\"discardByLineCode\", VariableType.Boolean, \"false\");\r\n}\r\n\r\nfunction polylineAddLineCode(prog: ProgramBuilder) {\r\n addLineCode(prog, lineCodeArgs);\r\n addModelViewMatrix(prog.vert);\r\n}\r\n\r\nfunction addCommon(prog: ProgramBuilder) {\r\n const vert = prog.vert;\r\n addModelToWindowCoordinates(vert); // adds u_mvp, u_viewportTransformation\r\n addProjectionMatrix(vert);\r\n addModelViewMatrix(vert);\r\n addViewport(vert);\r\n\r\n vert.addGlobal(\"g_windowPos\", VariableType.Vec4);\r\n vert.addGlobal(\"g_prevPos\", VariableType.Vec4);\r\n vert.addGlobal(\"g_nextPos\", VariableType.Vec4);\r\n vert.addGlobal(\"g_windowDir\", VariableType.Vec2);\r\n vert.addInitializer(decodeAdjacentPositions);\r\n\r\n vert.addFunction(unquantize2d);\r\n\r\n addLineWeight(vert);\r\n\r\n vert.addGlobal(\"miterAdjust\", VariableType.Float, \"0.0\");\r\n prog.addVarying(\"v_eyeSpace\", VariableType.Vec3);\r\n vert.set(VertexShaderComponent.ComputePosition, computePosition);\r\n prog.addVarying(\"v_lnInfo\", VariableType.Vec4);\r\n addAdjustWidth(vert);\r\n\r\n addSamplePosition(vert);\r\n vert.addFunction(decodePosition);\r\n}\r\n\r\nconst decodePosition = `\r\nvec4 decodePosition(vec3 baseIndex) {\r\n float index = decodeUInt24(baseIndex);\r\n return samplePosition(index);\r\n}\r\n`;\r\n\r\nconst decodeAdjacentPositions = `\r\n g_prevPos = decodePosition(a_prevIndex);\r\n g_nextPos = decodePosition(a_nextIndex);\r\n`;\r\n\r\nconst computePosition = `\r\n const float kNone = 0.0,\r\n kSquare = 1.0*3.0,\r\n kMiter = 2.0*3.0,\r\n kMiterInsideOnly = 3.0*3.0,\r\n kJointBase = 4.0*3.0,\r\n kNegatePerp = 8.0*3.0,\r\n kNegateAlong = 16.0*3.0,\r\n kNoneAdjWt = 32.0*3.0;\r\n\r\n v_lnInfo = vec4(0.0, 0.0, 0.0, 0.0); // init and set flag to false\r\n\r\n vec4 next = g_nextPos;\r\n vec4 pos;\r\n g_windowPos = modelToWindowCoordinates(rawPos, next, pos, v_eyeSpace);\r\n if (g_windowPos.w == 0.0)\r\n return g_windowPos;\r\n\r\n float param = a_param;\r\n float weight = computeLineWeight();\r\n float scale = 1.0, directionScale = 1.0;\r\n\r\n if (param >= kNoneAdjWt)\r\n param -= kNoneAdjWt;\r\n\r\n if (param >= kNegateAlong) {\r\n directionScale = -directionScale;\r\n param -= kNegateAlong;\r\n }\r\n\r\n if (param >= kNegatePerp) {\r\n scale = -1.0;\r\n param -= kNegatePerp;\r\n }\r\n\r\n vec4 otherPos;\r\n vec3 otherMvPos;\r\n vec4 projNext = modelToWindowCoordinates(next, rawPos, otherPos, otherMvPos);\r\n g_windowDir = projNext.xy - g_windowPos.xy;\r\n\r\n if (param < kJointBase) {\r\n vec2 dir = (directionScale > 0.0) ? g_windowDir : -g_windowDir;\r\n vec2 pos = (directionScale > 0.0) ? g_windowPos.xy : projNext.xy;\r\n adjustWidth(weight, dir, pos);\r\n }\r\n\r\n if (kNone != param) {\r\n vec2 delta = vec2(0.0);\r\n vec4 prev = g_prevPos;\r\n vec4 projPrev = modelToWindowCoordinates(prev, rawPos, otherPos, otherMvPos);\r\n vec2 prevDir = g_windowPos.xy - projPrev.xy;\r\n float thisLength = sqrt(g_windowDir.x * g_windowDir.x + g_windowDir.y * g_windowDir.y);\r\n const float s_minNormalizeLength = 1.0E-5; // avoid normalizing zero length vectors.\r\n float dist = weight / 2.0;\r\n\r\n if (thisLength > s_minNormalizeLength) {\r\n g_windowDir /= thisLength;\r\n\r\n float prevLength = sqrt(prevDir.x * prevDir.x + prevDir.y * prevDir.y);\r\n\r\n if (prevLength > s_minNormalizeLength) {\r\n prevDir /= prevLength;\r\n const float s_minParallelDot= -.9999, s_maxParallelDot = .9999;\r\n float prevNextDot = dot(prevDir, g_windowDir);\r\n\r\n if (prevNextDot < s_minParallelDot || prevNextDot > s_maxParallelDot) // No miter if parallel or antiparallel.\r\n param = kSquare;\r\n } else\r\n param = kSquare;\r\n } else {\r\n g_windowDir = -normalize(prevDir);\r\n param = kSquare;\r\n }\r\n\r\n vec2 perp = scale * vec2(-g_windowDir.y, g_windowDir.x);\r\n\r\n if (param == kSquare) {\r\n delta = perp;\r\n } else {\r\n vec2 bisector = normalize(prevDir - g_windowDir);\r\n float dotP = dot (bisector, perp);\r\n\r\n if (dotP != 0.0) { // Should never occur - but avoid divide by zero.\r\n const float maxMiter = 3.0;\r\n float miterDistance = 1.0/dotP;\r\n\r\n if (param == kMiter) { // Straight miter.\r\n delta = (abs(miterDistance) > maxMiter) ? perp : bisector * miterDistance;\r\n\r\n } else if (param == kMiterInsideOnly) { // Miter at inside, square at outside (to make room for joint).\r\n delta = (dotP > 0.0 || abs(miterDistance) > maxMiter) ? perp : bisector * miterDistance;\r\n\r\n } else {\r\n const float jointTriangleCount = 3.0;\r\n float ratio = (param - kJointBase) / jointTriangleCount; // 3 triangles per half-joint as defined in Graphics.cpp\r\n delta = normalize((1.0 - ratio) * bisector + (dotP < 0.0 ? -ratio : ratio) * perp); // Miter/Straight combination.\r\n }\r\n }\r\n }\r\n\r\n miterAdjust = dot(g_windowDir, delta) * dist; // Not actually used for hilite shader but meh.\r\n pos.x += dist * delta.x * 2.0 * pos.w / u_viewport.x;\r\n pos.y += dist * delta.y * 2.0 * pos.w / u_viewport.y;\r\n }\r\n\r\n return pos;\r\n`;\r\n\r\nconst lineCodeArgs = \"g_windowDir, g_windowPos, miterAdjust\";\r\n\r\n/** @internal */\r\nexport function createPolylineBuilder(isInstanced: IsInstanced, positionType: PositionType): ProgramBuilder {\r\n const instanced = IsInstanced.Yes === isInstanced;\r\n const attrMap = AttributeMap.findAttributeMap(TechniqueId.Polyline, instanced);\r\n const builder = new ProgramBuilder(attrMap, { positionType, instanced });\r\n\r\n addShaderFlags(builder);\r\n\r\n addCommon(builder);\r\n\r\n polylineAddLineCode(builder);\r\n\r\n addColor(builder);\r\n addEdgeContrast(builder.vert);\r\n addWhiteOnWhiteReversal(builder.frag);\r\n\r\n return builder;\r\n}\r\n\r\n/** @internal */\r\nexport function createPolylineHiliter(isInstanced: IsInstanced, positionType: PositionType): ProgramBuilder {\r\n const instanced = IsInstanced.Yes === isInstanced;\r\n const attrMap = AttributeMap.findAttributeMap(TechniqueId.Polyline, instanced);\r\n const builder = new ProgramBuilder(attrMap, { positionType, instanced });\r\n\r\n addCommon(builder);\r\n addFrustum(builder);\r\n addHiliter(builder, true);\r\n return builder;\r\n}\r\n"]}
|