@itwin/core-frontend 3.2.0-dev.22 → 3.2.0-dev.23
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/lib/cjs/render/primitives/VertexTable.js +30 -2
- 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 +7 -2
- 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 +4 -0
- 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/glsl/Color.js +1 -1
- package/lib/cjs/render/webgl/glsl/Color.js.map +1 -1
- package/lib/cjs/render/webgl/glsl/Decode.d.ts +2 -1
- package/lib/cjs/render/webgl/glsl/Decode.d.ts.map +1 -1
- package/lib/cjs/render/webgl/glsl/Decode.js +16 -2
- package/lib/cjs/render/webgl/glsl/Decode.js.map +1 -1
- package/lib/cjs/render/webgl/glsl/Edge.d.ts.map +1 -1
- package/lib/cjs/render/webgl/glsl/Edge.js +5 -14
- package/lib/cjs/render/webgl/glsl/Edge.js.map +1 -1
- package/lib/cjs/render/webgl/glsl/FeatureSymbology.d.ts.map +1 -1
- package/lib/cjs/render/webgl/glsl/FeatureSymbology.js +0 -2
- package/lib/cjs/render/webgl/glsl/FeatureSymbology.js.map +1 -1
- package/lib/cjs/render/webgl/glsl/Polyline.d.ts.map +1 -1
- package/lib/cjs/render/webgl/glsl/Polyline.js +5 -16
- package/lib/cjs/render/webgl/glsl/Polyline.js.map +1 -1
- package/lib/cjs/render/webgl/glsl/Surface.d.ts.map +1 -1
- package/lib/cjs/render/webgl/glsl/Surface.js +20 -21
- package/lib/cjs/render/webgl/glsl/Surface.js.map +1 -1
- package/lib/cjs/render/webgl/glsl/Vertex.d.ts +0 -2
- package/lib/cjs/render/webgl/glsl/Vertex.d.ts.map +1 -1
- package/lib/cjs/render/webgl/glsl/Vertex.js +17 -33
- package/lib/cjs/render/webgl/glsl/Vertex.js.map +1 -1
- package/lib/esm/render/primitives/VertexTable.js +30 -2
- 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 +7 -2
- 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 +4 -0
- 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/glsl/Color.js +1 -1
- package/lib/esm/render/webgl/glsl/Color.js.map +1 -1
- package/lib/esm/render/webgl/glsl/Decode.d.ts +2 -1
- package/lib/esm/render/webgl/glsl/Decode.d.ts.map +1 -1
- package/lib/esm/render/webgl/glsl/Decode.js +15 -1
- package/lib/esm/render/webgl/glsl/Decode.js.map +1 -1
- package/lib/esm/render/webgl/glsl/Edge.d.ts.map +1 -1
- package/lib/esm/render/webgl/glsl/Edge.js +5 -14
- package/lib/esm/render/webgl/glsl/Edge.js.map +1 -1
- package/lib/esm/render/webgl/glsl/FeatureSymbology.d.ts.map +1 -1
- package/lib/esm/render/webgl/glsl/FeatureSymbology.js +1 -3
- package/lib/esm/render/webgl/glsl/FeatureSymbology.js.map +1 -1
- package/lib/esm/render/webgl/glsl/Polyline.d.ts.map +1 -1
- package/lib/esm/render/webgl/glsl/Polyline.js +5 -16
- package/lib/esm/render/webgl/glsl/Polyline.js.map +1 -1
- package/lib/esm/render/webgl/glsl/Surface.d.ts.map +1 -1
- package/lib/esm/render/webgl/glsl/Surface.js +21 -22
- package/lib/esm/render/webgl/glsl/Surface.js.map +1 -1
- package/lib/esm/render/webgl/glsl/Vertex.d.ts +0 -2
- package/lib/esm/render/webgl/glsl/Vertex.d.ts.map +1 -1
- package/lib/esm/render/webgl/glsl/Vertex.js +17 -32
- package/lib/esm/render/webgl/glsl/Vertex.js.map +1 -1
- package/package.json +20 -20
|
@@ -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 if (g_usesQuantizedPosition) {\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 vec4 position;\r\n for (int i = 0; i < 3; i++) {\r\n position[i] = decodeFloat32(floor(TEXTURE(u_vertLUT, tc) * 255.0 + 0.5));\r\n tc.x += g_vert_stepX;\r\n }\r\n\r\n position.w = 1.0;\r\n return position;\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 } 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 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Surface.d.ts","sourceRoot":"","sources":["../../../../../src/render/webgl/glsl/Surface.ts"],"names":[],"mappings":"AAIA;;GAEG;AAMH,OAAO,EAC2C,cAAc,EAC/D,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EAAe,UAAU,EAAE,YAAY,EAAE,WAAW,EAAgB,UAAU,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"Surface.d.ts","sourceRoot":"","sources":["../../../../../src/render/webgl/glsl/Surface.ts"],"names":[],"mappings":"AAIA;;GAEG;AAMH,OAAO,EAC2C,cAAc,EAC/D,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EAAe,UAAU,EAAE,YAAY,EAAE,WAAW,EAAgB,UAAU,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AA2OjI,gBAAgB;AAChB,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,WAAW,EAAE,UAAU,EAAE,YAAY,GAAG,cAAc,CAcrG;AAgFD,gBAAgB;AAChB,eAAO,MAAM,eAAe,+SAW3B,CAAC;AAuDF,gBAAgB;AAChB,wBAAgB,eAAe,CAAC,OAAO,EAAE,cAAc,EAAE,oBAAoB,EAAE,OAAO,EAAE,gBAAgB,EAAE,OAAO,QAuBhH;AAmBD,gBAAgB;AAChB,wBAAgB,UAAU,CAAC,OAAO,EAAE,cAAc,EAAE,QAAQ,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,YAAY,UAAQ,QAmCrH;AAED,eAAO,MAAM,wBAAwB,mWAQpC,CAAC;AA+BF,gBAAgB;AAChB,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,cAAc,GAAG,cAAc,CA+E1E;AAED,wBAAgB,oCAAoC,CAAC,OAAO,EAAE,cAAc,QAgB3E"}
|
|
@@ -25,7 +25,7 @@ import { addRenderPass } from "./RenderPass";
|
|
|
25
25
|
import { addSolarShadowMap } from "./SolarShadowMapping";
|
|
26
26
|
import { addThematicDisplay, getComputeThematicIndex } from "./Thematic";
|
|
27
27
|
import { addTranslucency } from "./Translucency";
|
|
28
|
-
import {
|
|
28
|
+
import { addModelViewMatrix, addNormalMatrix, addProjectionMatrix } from "./Vertex";
|
|
29
29
|
import { wantMaterials } from "../SurfaceGeometry";
|
|
30
30
|
import { addWiremesh } from "./Wiremesh";
|
|
31
31
|
// NB: Textures do not contain pre-multiplied alpha.
|
|
@@ -114,7 +114,11 @@ const computeMaterial = `
|
|
|
114
114
|
g_materialParams = u_materialParams;
|
|
115
115
|
}
|
|
116
116
|
`;
|
|
117
|
-
|
|
117
|
+
const computeMaterialInstanced = `
|
|
118
|
+
decodeMaterialColor(u_materialColor);
|
|
119
|
+
g_materialParams = u_materialParams;
|
|
120
|
+
`;
|
|
121
|
+
function addMaterial(builder, instanced) {
|
|
118
122
|
const frag = builder.frag;
|
|
119
123
|
assert(undefined !== frag.find("v_surfaceFlags"));
|
|
120
124
|
frag.addGlobal("mat_texture_weight", 2 /* Float */);
|
|
@@ -149,19 +153,20 @@ function addMaterial(builder) {
|
|
|
149
153
|
uniform.setUniform4fv(mat.fragUniforms);
|
|
150
154
|
});
|
|
151
155
|
});
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
156
|
+
if (!instanced) {
|
|
157
|
+
// Material atlas
|
|
158
|
+
vert.addFunction(unpackFloat);
|
|
159
|
+
vert.addFunction(readMaterialAtlas);
|
|
160
|
+
vert.addUniform("u_numColors", 2 /* Float */, (prog) => {
|
|
161
|
+
prog.addGraphicUniform("u_numColors", (uniform, params) => {
|
|
162
|
+
const info = params.geometry.materialInfo;
|
|
163
|
+
const numColors = undefined !== info && info.isAtlas ? info.vertexTableOffset : 0;
|
|
164
|
+
uniform.setUniform1f(numColors);
|
|
165
|
+
});
|
|
161
166
|
});
|
|
162
|
-
}
|
|
167
|
+
}
|
|
163
168
|
vert.addGlobal("g_materialParams", 5 /* Vec4 */);
|
|
164
|
-
vert.set(4 /* ComputeMaterial */, computeMaterial);
|
|
169
|
+
vert.set(4 /* ComputeMaterial */, instanced ? computeMaterialInstanced : computeMaterial);
|
|
165
170
|
vert.set(6 /* ApplyMaterialColor */, applyMaterialColor);
|
|
166
171
|
builder.addFunctionComputedVarying("v_materialParams", 5 /* Vec4 */, "computeMaterialParams", computeMaterialParams);
|
|
167
172
|
}
|
|
@@ -307,13 +312,7 @@ vec3 octDecodeNormal(vec2 e) {
|
|
|
307
312
|
const computeNormal = `
|
|
308
313
|
if (!u_surfaceFlags[kSurfaceBitIndex_HasNormals])
|
|
309
314
|
return vec3(0.0);
|
|
310
|
-
|
|
311
|
-
vec2 normal;
|
|
312
|
-
if (u_surfaceFlags[kSurfaceBitIndex_HasColorAndNormal])
|
|
313
|
-
normal = g_usesQuantizedPosition ? g_vertLutData[3].xy : g_vertLutData[4].zw;
|
|
314
|
-
else
|
|
315
|
-
normal = g_usesQuantizedPosition ? g_vertLutData[1].zw : g_vertLutData[5].xy;
|
|
316
|
-
|
|
315
|
+
vec2 normal = (u_surfaceFlags[kSurfaceBitIndex_HasColorAndNormal]) ? g_vertLutData3.xy : g_vertLutData1.zw;
|
|
317
316
|
return normalize(MAT_NORM * octDecodeNormal(normal));
|
|
318
317
|
`;
|
|
319
318
|
const computeAnimatedNormal = `
|
|
@@ -324,7 +323,7 @@ const applyBackgroundColor = `
|
|
|
324
323
|
return u_surfaceFlags[kSurfaceBitIndex_BackgroundFill] ? vec4(u_bgColor.rgb, baseColor.a) : baseColor;
|
|
325
324
|
`;
|
|
326
325
|
const computeTexCoord = `
|
|
327
|
-
vec4 rgba =
|
|
326
|
+
vec4 rgba = g_vertLutData3;
|
|
328
327
|
vec2 qcoords = vec2(decodeUInt16(rgba.xy), decodeUInt16(rgba.zw));
|
|
329
328
|
return chooseVec2WithBitFlag(vec2(0.0), unquantize2d(qcoords, u_qTexCoordParams), surfaceFlags, kSurfaceBit_HasTexture);
|
|
330
329
|
`;
|
|
@@ -530,7 +529,7 @@ export function createSurfaceBuilder(flags) {
|
|
|
530
529
|
else
|
|
531
530
|
addTransparencyDiscard(builder.frag);
|
|
532
531
|
addSurfaceMonochrome(builder.frag);
|
|
533
|
-
addMaterial(builder);
|
|
532
|
+
addMaterial(builder, flags.isInstanced === 1 /* Yes */);
|
|
534
533
|
if (flags.isWiremesh)
|
|
535
534
|
addWiremesh(builder);
|
|
536
535
|
return builder;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Surface.js","sourceRoot":"","sources":["../../../../../src/render/webgl/glsl/Surface.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 { Material } from \"../Material\";\r\nimport { Pass, SurfaceBitIndex, SurfaceFlags, TextureUnit } from \"../RenderFlags\";\r\nimport {\r\n FragmentShaderBuilder, FragmentShaderComponent, ProgramBuilder, ShaderBuilder, VariableType, VertexShaderComponent,\r\n} from \"../ShaderBuilder\";\r\nimport { System } from \"../System\";\r\nimport { FeatureMode, IsAnimated, IsClassified, IsInstanced, IsShadowable, IsThematic, TechniqueFlags } from \"../TechniqueFlags\";\r\nimport { TechniqueId } from \"../TechniqueId\";\r\nimport { Texture } from \"../Texture\";\r\nimport { addAnimation } from \"./Animation\";\r\nimport { unpackFloat } from \"./Clipping\";\r\nimport { addColor } from \"./Color\";\r\nimport { addChooseWithBitFlagFunctions, addExtractNthBit, addFrustum, addShaderFlags } from \"./Common\";\r\nimport { addUnpackAndNormalize2Bytes, decodeDepthRgb, unquantize2d } from \"./Decode\";\r\nimport {\r\n addFeatureSymbology, addMaxAlpha, addRenderOrder, addRenderOrderConstants, addSurfaceDiscard, addSurfaceHiliter, FeatureSymbologyOptions,\r\n} from \"./FeatureSymbology\";\r\nimport {\r\n addAltPickBufferOutputs, addFragColorWithPreMultipliedAlpha, addPickBufferOutputs, addWhiteOnWhiteReversal, assignFragColor,\r\n} from \"./Fragment\";\r\nimport { addLighting } from \"./Lighting\";\r\nimport { addSurfaceMonochrome } from \"./Monochrome\";\r\nimport { addColorPlanarClassifier, addFeaturePlanarClassifier, addHilitePlanarClassifier, addOverrideClassifierColor } from \"./PlanarClassification\";\r\nimport { addRenderPass } from \"./RenderPass\";\r\nimport { addSolarShadowMap } from \"./SolarShadowMapping\";\r\nimport { addThematicDisplay, getComputeThematicIndex } from \"./Thematic\";\r\nimport { addTranslucency } from \"./Translucency\";\r\nimport { addFeatureAndMaterialLookup, addModelViewMatrix, addNormalMatrix, addProjectionMatrix } from \"./Vertex\";\r\nimport { wantMaterials } from \"../SurfaceGeometry\";\r\nimport { addWiremesh } from \"./Wiremesh\";\r\n\r\n// NB: Textures do not contain pre-multiplied alpha.\r\nconst sampleSurfaceTexture = `\r\nvec4 sampleSurfaceTexture() {\r\n return TEXTURE(s_texture, v_texCoord);\r\n}\r\n`;\r\n\r\nconst applyMaterialColor = `\r\n float useMatColor = float(use_material);\r\n vec3 rgb = mix(baseColor.rgb, mat_rgb.rgb, useMatColor * mat_rgb.a);\r\n float a = mix(baseColor.a, mat_alpha.x, useMatColor * mat_alpha.y);\r\n return vec4(rgb, a);\r\n`;\r\n\r\n// if this is a raster glyph, the sampled color has already been modified - do not modify further.\r\n// Mix diffuse color with texel based on texture weight.\r\n// Replace with diffuse RGB if RGB overridden.\r\n// Replace with diffuse alpha if alpha overridden.\r\n// Multiply texel alpha with diffuse alpha if specified.\r\nconst applyTextureWeight = `\r\n bool applyTexture = !u_applyGlyphTex && isSurfaceBitSet(kSurfaceBit_HasTexture);\r\n float textureWeight = applyTexture ? mat_texture_weight : 0.0;\r\n vec3 rgb = mix(baseColor.rgb, g_surfaceTexel.rgb, textureWeight);\r\n rgb = chooseVec3WithBitFlag(rgb, baseColor.rgb, surfaceFlags, kSurfaceBit_OverrideRgb);\r\n\r\n float a = applyTexture ? baseColor.a * g_surfaceTexel.a : baseColor.a;\r\n\r\n return vec4(rgb, a);\r\n`;\r\n\r\nconst decodeFragMaterialParams = `\r\nvoid decodeMaterialParams(vec4 params) {\r\n mat_weights = unpackAndNormalize2Bytes(params.x);\r\n\r\n vec2 texAndSpecR = unpackAndNormalize2Bytes(params.y);\r\n mat_texture_weight = texAndSpecR.x;\r\n\r\n vec2 specGB = unpackAndNormalize2Bytes(params.z);\r\n mat_specular = vec4(texAndSpecR.y, specGB, params.w);\r\n}\r\n`;\r\n\r\nconst decodeMaterialColor = `\r\nvoid decodeMaterialColor(vec4 rgba) {\r\n mat_rgb = vec4(rgba.rgb, float(rgba.r >= 0.0));\r\n mat_alpha = vec2(rgba.a, float(rgba.a >= 0.0));\r\n}\r\n`;\r\n\r\n// defaults: (0x6699, 0xffff, 0xffff, 13.5)\r\nconst computeMaterialParams = `\r\n const vec4 defaults = vec4(26265.0, 65535.0, 65535.0, 13.5);\r\n return use_material ? g_materialParams : defaults;\r\n`;\r\n\r\n// The 8-bit material index is stored with the 24-bit feature index, in the high byte.\r\nconst readMaterialAtlas = `\r\nvoid readMaterialAtlas() {\r\n float materialAtlasStart = u_vertParams.z * u_vertParams.w + u_numColors;\r\n float materialIndex = g_featureAndMaterialIndex.w * 4.0 + materialAtlasStart;\r\n\r\n vec2 tc = computeLUTCoords(materialIndex, u_vertParams.xy, g_vert_center, 1.0);\r\n vec4 rgba = TEXTURE(u_vertLUT, tc);\r\n\r\n tc = computeLUTCoords(materialIndex + 1.0, u_vertParams.xy, g_vert_center, 1.0);\r\n vec4 weightsAndFlags = floor(TEXTURE(u_vertLUT, tc) * 255.0 + 0.5);\r\n\r\n tc = computeLUTCoords(materialIndex + 2.0, u_vertParams.xy, g_vert_center, 1.0);\r\n vec3 specularRgb = floor(TEXTURE(u_vertLUT, tc) * 255.0 + 0.5).rgb;\r\n\r\n tc = computeLUTCoords(materialIndex + 3.0, u_vertParams.xy, g_vert_center, 1.0);\r\n vec4 packedSpecularExponent = TEXTURE(u_vertLUT, tc);\r\n\r\n float flags = weightsAndFlags.w;\r\n mat_rgb = vec4(rgba.rgb, float(flags == 1.0 || flags == 3.0));\r\n mat_alpha = vec2(rgba.a, float(flags == 2.0 || flags == 3.0));\r\n\r\n float specularExponent = unpackFloat(packedSpecularExponent);\r\n g_materialParams.x = weightsAndFlags.y + weightsAndFlags.z * 256.0;\r\n g_materialParams.y = 255.0 + specularRgb.r * 256.0;\r\n g_materialParams.z = specularRgb.g + specularRgb.b * 256.0;\r\n g_materialParams.w = specularExponent;\r\n}\r\n`;\r\n\r\nconst computeMaterial = `\r\n if (u_surfaceFlags[kSurfaceBitIndex_HasMaterialAtlas]) {\r\n readMaterialAtlas();\r\n } else {\r\n decodeMaterialColor(u_materialColor);\r\n g_materialParams = u_materialParams;\r\n }\r\n`;\r\n\r\nfunction addMaterial(builder: ProgramBuilder): void {\r\n const frag = builder.frag;\r\n assert(undefined !== frag.find(\"v_surfaceFlags\"));\r\n\r\n frag.addGlobal(\"mat_texture_weight\", VariableType.Float);\r\n frag.addGlobal(\"mat_weights\", VariableType.Vec2); // diffuse, specular\r\n frag.addGlobal(\"mat_specular\", VariableType.Vec4); // rgb, exponent\r\n\r\n addUnpackAndNormalize2Bytes(frag);\r\n frag.addFunction(decodeFragMaterialParams);\r\n frag.addInitializer(\"decodeMaterialParams(v_materialParams);\");\r\n\r\n addChooseWithBitFlagFunctions(frag);\r\n frag.set(FragmentShaderComponent.ApplyMaterialOverrides, applyTextureWeight);\r\n\r\n const vert = builder.vert;\r\n vert.addGlobal(\"mat_rgb\", VariableType.Vec4); // a = 0 if not overridden, else 1\r\n vert.addGlobal(\"mat_alpha\", VariableType.Vec2); // a = 0 if not overridden, else 1\r\n vert.addGlobal(\"use_material\", VariableType.Boolean);\r\n if (System.instance.capabilities.isWebGL2)\r\n vert.addInitializer(\"use_material = (0u == (surfaceFlags & kSurfaceBit_IgnoreMaterial));\");\r\n else\r\n vert.addInitializer(\"use_material = !nthBitSet(surfaceFlags, kSurfaceBit_IgnoreMaterial);\");\r\n\r\n // Uniform material\r\n vert.addFunction(decodeMaterialColor);\r\n vert.addUniform(\"u_materialColor\", VariableType.Vec4, (prog) => {\r\n prog.addGraphicUniform(\"u_materialColor\", (uniform, params) => {\r\n const info = wantMaterials(params.target.currentViewFlags) ? params.geometry.materialInfo : undefined;\r\n const mat = undefined !== info && !info.isAtlas ? info : Material.default;\r\n uniform.setUniform4fv(mat.rgba);\r\n });\r\n });\r\n\r\n vert.addUniform(\"u_materialParams\", VariableType.Vec4, (prog) => {\r\n prog.addGraphicUniform(\"u_materialParams\", (uniform, params) => {\r\n const info = wantMaterials(params.target.currentViewFlags) ? params.geometry.materialInfo : undefined;\r\n const mat = undefined !== info && !info.isAtlas ? info : Material.default;\r\n uniform.setUniform4fv(mat.fragUniforms);\r\n });\r\n });\r\n\r\n // Material atlas\r\n addFeatureAndMaterialLookup(vert);\r\n vert.addFunction(unpackFloat);\r\n vert.addFunction(readMaterialAtlas);\r\n vert.addUniform(\"u_numColors\", VariableType.Float, (prog) => {\r\n prog.addGraphicUniform(\"u_numColors\", (uniform, params) => {\r\n const info = params.geometry.materialInfo;\r\n const numColors = undefined !== info && info.isAtlas ? info.vertexTableOffset : 0;\r\n uniform.setUniform1f(numColors);\r\n });\r\n });\r\n\r\n vert.addGlobal(\"g_materialParams\", VariableType.Vec4);\r\n vert.set(VertexShaderComponent.ComputeMaterial, computeMaterial);\r\n vert.set(VertexShaderComponent.ApplyMaterialColor, applyMaterialColor);\r\n builder.addFunctionComputedVarying(\"v_materialParams\", VariableType.Vec4, \"computeMaterialParams\", computeMaterialParams);\r\n}\r\n\r\nconst computePositionPrelude = `\r\n vec4 pos = MAT_MV * rawPos;\r\n`;\r\n\r\n// We used to use gl.polygonOffset() for blanking regions, but that doesn't work with logarithmic depth buffer which overwrites the\r\n// computed Z. Instead we must manually offset in vertex shader. We do this even if log depth is not enabled/supported.\r\n// NOTE: If log depth is *not* supported, then the hilite surface vertex shaders previously would still include this logic, but the\r\n// fragment shaders would not use v_eyeSpace. Some Ubuntu 20.04 graphics drivers cleverly and correctly optimized out the varying and the uniform,\r\n// causing an exception when gl.getProgramLocation() failed. So, omit this bit in that case.\r\nconst adjustEyeSpace = `\r\n v_eyeSpace = pos.xyz;\r\n const float blankingRegionOffset = 2.0 / 65536.0;\r\n if (kRenderOrder_BlankingRegion == u_renderOrder)\r\n v_eyeSpace.z -= blankingRegionOffset * (u_frustum.y - u_frustum.x);\r\n`;\r\n\r\nconst computePositionPostlude = `\r\n return u_proj * pos;\r\n`;\r\n\r\nfunction createCommon(isInstanced: IsInstanced, animated: IsAnimated, shadowable: IsShadowable, isThematic: IsThematic, isHiliter: boolean): ProgramBuilder {\r\n const instanced = IsInstanced.Yes === isInstanced;\r\n const attrMap = AttributeMap.findAttributeMap(TechniqueId.Surface, instanced);\r\n const builder = new ProgramBuilder(attrMap, { maxRgbaPerVertex: 6, instanced });\r\n const vert = builder.vert;\r\n\r\n if (animated)\r\n addAnimation(vert, true, isThematic);\r\n\r\n if (shadowable)\r\n addSolarShadowMap(builder);\r\n\r\n addProjectionMatrix(vert);\r\n addModelViewMatrix(vert);\r\n\r\n let computePosition;\r\n if (isHiliter && !System.instance.supportsLogZBuffer) {\r\n computePosition = computePositionPrelude + computePositionPostlude;\r\n } else {\r\n addFrustum(builder);\r\n addRenderOrder(builder.vert);\r\n addRenderOrderConstants(builder.vert);\r\n builder.addVarying(\"v_eyeSpace\", VariableType.Vec3);\r\n computePosition = computePositionPrelude + adjustEyeSpace + computePositionPostlude;\r\n }\r\n\r\n vert.set(VertexShaderComponent.ComputePosition, computePosition);\r\n\r\n return builder;\r\n}\r\n\r\n/** @internal */\r\nexport function createSurfaceHiliter(instanced: IsInstanced, classified: IsClassified): ProgramBuilder {\r\n const builder = createCommon(instanced, IsAnimated.No, IsShadowable.No, IsThematic.No, true);\r\n\r\n addSurfaceFlags(builder, true, false);\r\n addTexture(builder, IsAnimated.No, IsThematic.No);\r\n if (classified) {\r\n addHilitePlanarClassifier(builder);\r\n builder.vert.addGlobal(\"feature_ignore_material\", VariableType.Boolean, \"false\");\r\n builder.frag.set(FragmentShaderComponent.AssignFragData, assignFragColor);\r\n } else {\r\n addSurfaceHiliter(builder);\r\n }\r\n\r\n return builder;\r\n}\r\n\r\nconst isSurfaceBitSet = `\r\nbool isSurfaceBitSet(float flag) { return nthBitSet(surfaceFlags, flag); }\r\n`;\r\nconst isSurfaceBitSet2 = `\r\nbool isSurfaceBitSet(uint flag) { return 0u != (surfaceFlags & flag); }\r\n`;\r\n\r\n/** @internal */\r\nfunction addSurfaceFlagsLookup(builder: ShaderBuilder) {\r\n builder.addConstant(\"kSurfaceBitIndex_HasTexture\", VariableType.Int, SurfaceBitIndex.HasTexture.toString());\r\n builder.addConstant(\"kSurfaceBitIndex_ApplyLighting\", VariableType.Int, SurfaceBitIndex.ApplyLighting.toString());\r\n builder.addConstant(\"kSurfaceBitIndex_HasNormals\", VariableType.Int, SurfaceBitIndex.HasNormals.toString());\r\n builder.addConstant(\"kSurfaceBitIndex_IgnoreMaterial\", VariableType.Int, SurfaceBitIndex.IgnoreMaterial.toString());\r\n builder.addConstant(\"kSurfaceBitIndex_TransparencyThreshold\", VariableType.Int, SurfaceBitIndex.TransparencyThreshold.toString());\r\n builder.addConstant(\"kSurfaceBitIndex_BackgroundFill\", VariableType.Int, SurfaceBitIndex.BackgroundFill.toString());\r\n builder.addConstant(\"kSurfaceBitIndex_HasColorAndNormal\", VariableType.Int, SurfaceBitIndex.HasColorAndNormal.toString());\r\n builder.addConstant(\"kSurfaceBitIndex_OverrideRgb\", VariableType.Int, SurfaceBitIndex.OverrideRgb.toString());\r\n builder.addConstant(\"kSurfaceBitIndex_NoFaceFront\", VariableType.Int, SurfaceBitIndex.NoFaceFront.toString());\r\n builder.addConstant(\"kSurfaceBitIndex_HasMaterialAtlas\", VariableType.Int, SurfaceBitIndex.HasMaterialAtlas.toString());\r\n\r\n // Surface flags which get modified in vertex shader are still passed to fragment shader as a single float & are thus\r\n // used differently there & so require different constants. Unused constants are commented out.\r\n builder.addBitFlagConstant(\"kSurfaceBit_HasTexture\", SurfaceBitIndex.HasTexture);\r\n builder.addBitFlagConstant(\"kSurfaceBit_IgnoreMaterial\", SurfaceBitIndex.IgnoreMaterial);\r\n builder.addBitFlagConstant(\"kSurfaceBit_OverrideRgb\", SurfaceBitIndex.OverrideRgb);\r\n\r\n // Only need masks for flags modified in vertex shader\r\n const suffix = System.instance.capabilities.isWebGL2 ? \"u\" : \".0\";\r\n const type = System.instance.capabilities.isWebGL2 ? VariableType.Uint : VariableType.Float;\r\n builder.addConstant(\"kSurfaceMask_HasTexture\", type, SurfaceFlags.HasTexture.toString() + suffix);\r\n builder.addConstant(\"kSurfaceMask_IgnoreMaterial\", type, SurfaceFlags.IgnoreMaterial.toString() + suffix);\r\n builder.addConstant(\"kSurfaceMask_OverrideRgb\", type, SurfaceFlags.OverrideRgb.toString() + suffix);\r\n\r\n addExtractNthBit(builder);\r\n if (System.instance.capabilities.isWebGL2) {\r\n builder.addFunction(isSurfaceBitSet2);\r\n builder.addGlobal(\"surfaceFlags\", VariableType.Uint);\r\n } else {\r\n builder.addFunction(isSurfaceBitSet);\r\n builder.addGlobal(\"surfaceFlags\", VariableType.Float);\r\n }\r\n}\r\n\r\nconst initSurfaceFlags = `\r\n surfaceFlags = u_surfaceFlags[kSurfaceBitIndex_HasTexture] ? kSurfaceMask_HasTexture : 0.0;\r\n surfaceFlags += u_surfaceFlags[kSurfaceBitIndex_IgnoreMaterial] ? kSurfaceMask_IgnoreMaterial : 0.0;\r\n surfaceFlags += u_surfaceFlags[kSurfaceBitIndex_OverrideRgb] ? kSurfaceMask_OverrideRgb : 0.0;\r\n`;\r\nconst initSurfaceFlags2 = `\r\n surfaceFlags = u_surfaceFlags[kSurfaceBitIndex_HasTexture] ? kSurfaceMask_HasTexture : 0u;\r\n surfaceFlags += u_surfaceFlags[kSurfaceBitIndex_IgnoreMaterial] ? kSurfaceMask_IgnoreMaterial : 0u;\r\n surfaceFlags += u_surfaceFlags[kSurfaceBitIndex_OverrideRgb] ? kSurfaceMask_OverrideRgb : 0u;\r\n`;\r\n\r\nconst computeBaseSurfaceFlags = `\r\n bool hasTexture = u_surfaceFlags[kSurfaceBitIndex_HasTexture];\r\n if (feature_ignore_material) {\r\n if (hasTexture) {\r\n hasTexture = false;\r\n surfaceFlags -= kSurfaceMask_HasTexture;\r\n }\r\n\r\n surfaceFlags += kSurfaceMask_IgnoreMaterial;\r\n }\r\n`;\r\n\r\n// Textured surfaces (including raster glyphs) always *multiply* the sampled alpha by the alpha override.\r\nconst computeColorSurfaceFlags = `\r\n if (feature_rgb.r >= 0.0)\r\n surfaceFlags += kSurfaceMask_OverrideRgb;\r\n`;\r\n\r\nconst returnSurfaceFlags = \" return surfaceFlags;\\n\";\r\nconst returnSurfaceFlags2 = \" return float(surfaceFlags);\\n\";\r\n\r\nconst computeSurfaceFlags = computeBaseSurfaceFlags;\r\nconst computeSurfaceFlagsWithColor = computeBaseSurfaceFlags + computeColorSurfaceFlags;\r\n\r\n/** @internal */\r\nexport const octDecodeNormal = `\r\nvec3 octDecodeNormal(vec2 e) {\r\n e = e / 255.0 * 2.0 - 1.0;\r\n vec3 n = vec3(e.x, e.y, 1.0 - abs(e.x) - abs(e.y));\r\n if (n.z < 0.0) {\r\n vec2 signNotZero = vec2(n.x >= 0.0 ? 1.0 : -1.0, n.y >= 0.0 ? 1.0 : -1.0);\r\n n.xy = (1.0 - abs(n.yx)) * signNotZero;\r\n }\r\n\r\n return normalize(n);\r\n}\r\n`;\r\n\r\nconst computeNormal = `\r\n if (!u_surfaceFlags[kSurfaceBitIndex_HasNormals])\r\n return vec3(0.0);\r\n\r\n vec2 normal;\r\n if (u_surfaceFlags[kSurfaceBitIndex_HasColorAndNormal])\r\n normal = g_usesQuantizedPosition ? g_vertLutData[3].xy : g_vertLutData[4].zw;\r\n else\r\n normal = g_usesQuantizedPosition ? g_vertLutData[1].zw : g_vertLutData[5].xy;\r\n\r\n return normalize(MAT_NORM * octDecodeNormal(normal));\r\n`;\r\n\r\nconst computeAnimatedNormal = `\r\n if (u_animNormalParams.x >= 0.0)\r\n return normalize(MAT_NORM * computeAnimationNormal(u_animNormalParams.x, u_animNormalParams.y, u_animNormalParams.z));\r\n${computeNormal}`;\r\n\r\nconst applyBackgroundColor = `\r\n return u_surfaceFlags[kSurfaceBitIndex_BackgroundFill] ? vec4(u_bgColor.rgb, baseColor.a) : baseColor;\r\n`;\r\n\r\nconst computeTexCoord = `\r\n vec4 rgba = g_usesQuantizedPosition ? g_vertLutData[3] : g_vertLutData[4];\r\n vec2 qcoords = vec2(decodeUInt16(rgba.xy), decodeUInt16(rgba.zw));\r\n return chooseVec2WithBitFlag(vec2(0.0), unquantize2d(qcoords, u_qTexCoordParams), surfaceFlags, kSurfaceBit_HasTexture);\r\n`;\r\nconst computeAnimatedTexCoord = `\r\n if (u_animScalarQParams.x >= 0.0)\r\n return computeAnimationParam(u_animScalarParams.x, u_animScalarParams.y, u_animScalarParams.z, u_animScalarQParams.x, u_animScalarQParams.y);\r\n${computeTexCoord}`;\r\nconst getSurfaceColor = `\r\nvec4 getSurfaceColor() { return v_color; }\r\n`;\r\n\r\n// If we have texture weight < 1.0 we must compute the element/material color first then mix with texture color\r\n// in ApplyMaterialOverrides(). Do the sample once, here, and store in a global variable for possible later use.\r\n// If a glyph texture, must mix getSurfaceColor() with texture color so texture color alpha is applied 100% and\r\n// surface color rgb is scaled by texture color rgb (latter is full white originally but stretched via mipmapping).\r\nconst computeBaseColor = `\r\n g_surfaceTexel = sampleSurfaceTexture();\r\n vec4 surfaceColor = getSurfaceColor();\r\n\r\n if (!u_applyGlyphTex)\r\n return surfaceColor;\r\n\r\n // Compute color for raster glyph.\r\n const vec3 white = vec3(1.0);\r\n const vec3 epsilon = vec3(0.0001);\r\n const vec3 almostWhite = white - epsilon;\r\n\r\n // set to black if almost white and reverse white-on-white is on\r\n bvec3 isAlmostWhite = greaterThan(surfaceColor.rgb, almostWhite);\r\n surfaceColor.rgb = (u_reverseWhiteOnWhite && isAlmostWhite.r && isAlmostWhite.g && isAlmostWhite.b ? vec3(0.0, 0.0, 0.0) : surfaceColor.rgb);\r\n return vec4(surfaceColor.rgb * g_surfaceTexel.rgb, g_surfaceTexel.a);\r\n`;\r\n\r\nconst surfaceFlagArray = new Int32Array(SurfaceBitIndex.Count);\r\n\r\n/** @internal */\r\nexport function addSurfaceFlags(builder: ProgramBuilder, withFeatureOverrides: boolean, withFeatureColor: boolean) {\r\n addSurfaceFlagsLookup(builder.vert);\r\n addSurfaceFlagsLookup(builder.frag);\r\n\r\n let compute = (System.instance.capabilities.isWebGL2 ? initSurfaceFlags2 : initSurfaceFlags);\r\n if (withFeatureOverrides)\r\n compute += `${withFeatureColor ? computeSurfaceFlagsWithColor : computeSurfaceFlags}\\n`;\r\n compute += (System.instance.capabilities.isWebGL2 ? returnSurfaceFlags2 : returnSurfaceFlags);\r\n builder.addFunctionComputedVarying(\"v_surfaceFlags\", VariableType.Float, \"computeSurfaceFlags\", compute);\r\n\r\n if (System.instance.capabilities.isWebGL2)\r\n builder.frag.addInitializer(\"surfaceFlags = uint(floor(v_surfaceFlags + 0.5));\");\r\n else\r\n builder.frag.addInitializer(\"surfaceFlags = floor(v_surfaceFlags + 0.5);\");\r\n\r\n builder.addUniformArray(\"u_surfaceFlags\", VariableType.Boolean, SurfaceBitIndex.Count, (prog) => {\r\n prog.addGraphicUniform(\"u_surfaceFlags\", (uniform, params) => {\r\n assert(undefined !== params.geometry.asSurface);\r\n const mesh = params.geometry.asSurface;\r\n mesh.computeSurfaceFlags(params.programParams, surfaceFlagArray);\r\n uniform.setUniform1iv(surfaceFlagArray);\r\n });\r\n });\r\n}\r\n\r\nfunction addNormal(builder: ProgramBuilder, instanced: IsInstanced, animated: IsAnimated) {\r\n addNormalMatrix(builder.vert, instanced);\r\n\r\n builder.vert.addFunction(octDecodeNormal);\r\n addChooseWithBitFlagFunctions(builder.vert);\r\n builder.vert.addFunction(\"vec3 computeSurfaceNormal()\", computeNormal);\r\n builder.addFunctionComputedVarying(\"v_n\", VariableType.Vec3, \"computeLightingNormal\", animated ? computeAnimatedNormal : \"return computeSurfaceNormal();\");\r\n\r\n // Set to true to colorize surfaces based on normals (in world space).\r\n // You must also set checkMaxVarying to false in ProgramBuilder.buildProgram to avoid assertions, if using a non-optimized build.\r\n const debugNormals = false;\r\n if (debugNormals) {\r\n builder.frag.set(FragmentShaderComponent.ApplyDebugColor, \"return vec4(vec3(v_normal / 2.0 + 0.5), baseColor.a);\");\r\n builder.addInlineComputedVarying(\"v_normal\", VariableType.Vec3, \"v_normal = computeSurfaceNormal();\");\r\n }\r\n}\r\n\r\n/** @internal */\r\nexport function addTexture(builder: ProgramBuilder, animated: IsAnimated, isThematic: IsThematic, isPointCloud = false) {\r\n if (isThematic) {\r\n builder.addInlineComputedVarying(\"v_thematicIndex\", VariableType.Float, getComputeThematicIndex(builder.vert.usesInstancedGeometry, isPointCloud, true));\r\n } else {\r\n builder.vert.addFunction(unquantize2d);\r\n addChooseWithBitFlagFunctions(builder.vert);\r\n builder.addFunctionComputedVarying(\"v_texCoord\", VariableType.Vec2, \"computeTexCoord\", animated ? computeAnimatedTexCoord : computeTexCoord);\r\n builder.vert.addUniform(\"u_qTexCoordParams\", VariableType.Vec4, (prog) => {\r\n prog.addGraphicUniform(\"u_qTexCoordParams\", (uniform, params) => {\r\n const surfGeom = params.geometry.asSurface!;\r\n if (surfGeom.useTexture(params.programParams)) {\r\n const uvQParams = surfGeom.lut.uvQParams;\r\n if (undefined !== uvQParams) {\r\n uniform.setUniform4fv(uvQParams);\r\n }\r\n }\r\n });\r\n });\r\n builder.frag.addFunction(sampleSurfaceTexture);\r\n }\r\n\r\n builder.frag.addUniform(\"s_texture\", VariableType.Sampler2D, (prog) => {\r\n prog.addGraphicUniform(\"s_texture\", (uniform, params) => {\r\n const surfGeom = params.geometry.asSurface!;\r\n if (params.geometry.supportsThematicDisplay && params.target.wantThematicDisplay) { // NB: if thematic display is enabled, bind the thematic texture and ignore any applied surface textures\r\n params.target.uniforms.thematic.bindTexture(uniform, TextureUnit.SurfaceTexture);\r\n } else if (surfGeom.useTexture(params.programParams)) {\r\n const texture = (params.geometry.hasAnimation && params.target.analysisTexture) ? (params.target.analysisTexture as Texture) : surfGeom.texture;\r\n assert(undefined !== texture);\r\n texture.texture.bindSampler(uniform, TextureUnit.SurfaceTexture);\r\n } else {\r\n System.instance.ensureSamplerBound(uniform, TextureUnit.SurfaceTexture);\r\n }\r\n });\r\n });\r\n}\r\n\r\nexport const discardClassifiedByAlpha = `\r\n if (u_no_classifier_discard)\r\n return false;\r\n\r\n bool hasAlpha = alpha <= s_maxAlpha;\r\n bool isOpaquePass = (kRenderPass_OpaqueLinear <= u_renderPass && kRenderPass_OpaqueGeneral >= u_renderPass);\r\n bool isTranslucentPass = kRenderPass_Translucent == u_renderPass;\r\n return (isOpaquePass && hasAlpha) || (isTranslucentPass && !hasAlpha);\r\n`;\r\n\r\nconst discardByTextureAlpha = `\r\n if (isSurfaceBitSet(kSurfaceBit_HasTexture)) {\r\n float cutoff = abs(u_alphaCutoff);\r\n if (kRenderPass_Translucent == u_renderPass)\r\n return u_alphaCutoff > 0.0 && alpha >= cutoff;\r\n else\r\n return alpha < cutoff;\r\n }\r\n\r\n return false;\r\n`;\r\n\r\nfunction addTransparencyDiscard(frag: FragmentShaderBuilder): void {\r\n addRenderPass(frag);\r\n frag.addUniform(\"u_alphaCutoff\", VariableType.Float, (prog) => {\r\n prog.addGraphicUniform(\"u_alphaCutoff\", (uniform, params) => {\r\n // This cutoff is used to discard pixels based on the alpha value sampled from the surface texture.\r\n // During readPixels, or when transparency is disabled, only discard 100% opaque pixels.\r\n // Otherwise, if the geometry draws in both opaque and translucent passes, use DisplayParams.minTransparency to filter pixels into appropriate pass to produce appropriate blending.\r\n // Negative cutoff applies only during opaque pass; positive cutoff applies during opaque and translucent passes.\r\n const pass = params.geometry.getPass(params.target);\r\n const cutoff = (!Pass.rendersOpaqueAndTranslucent(pass) || params.target.isReadPixelsInProgress || !params.target.currentViewFlags.transparency) ? -1 / 255 : 241 / 255;\r\n uniform.setUniform1f(cutoff);\r\n });\r\n });\r\n\r\n frag.set(FragmentShaderComponent.DiscardByAlpha, discardByTextureAlpha);\r\n}\r\n\r\n/** @internal */\r\nexport function createSurfaceBuilder(flags: TechniqueFlags): ProgramBuilder {\r\n const builder = createCommon(flags.isInstanced, flags.isAnimated, flags.isShadowable, flags.isThematic, false);\r\n addShaderFlags(builder);\r\n\r\n const feat = flags.featureMode;\r\n let opts = FeatureMode.Overrides === feat ? FeatureSymbologyOptions.Surface : FeatureSymbologyOptions.None;\r\n if (flags.isClassified) {\r\n opts &= ~FeatureSymbologyOptions.Alpha;\r\n addColorPlanarClassifier(builder, flags.isTranslucent, flags.isThematic);\r\n }\r\n\r\n if (flags.isThematic)\r\n addThematicDisplay(builder);\r\n\r\n addFeatureSymbology(builder, feat, opts);\r\n addSurfaceFlags(builder, FeatureMode.Overrides === feat, true);\r\n addSurfaceDiscard(builder, flags);\r\n addNormal(builder, flags.isInstanced, flags.isAnimated);\r\n\r\n // In HiddenLine mode, we must compute the base color (plus feature overrides etc) in order to get the alpha, then replace with background color (preserving alpha for the transparency threshold test).\r\n addChooseWithBitFlagFunctions(builder.frag);\r\n builder.frag.set(FragmentShaderComponent.FinalizeBaseColor, applyBackgroundColor);\r\n builder.frag.addUniform(\"u_bgColor\", VariableType.Vec3, (prog) => {\r\n prog.addProgramUniform(\"u_bgColor\", (uniform, params) => {\r\n params.target.uniforms.style.bindBackgroundRgb(uniform);\r\n });\r\n });\r\n\r\n addTexture(builder, flags.isAnimated, flags.isThematic);\r\n\r\n builder.frag.addUniform(\"u_applyGlyphTex\", VariableType.Boolean, (prog) => {\r\n prog.addGraphicUniform(\"u_applyGlyphTex\", (uniform, params) => {\r\n const surfGeom = params.geometry.asSurface!;\r\n uniform.setUniform1i(surfGeom.useTexture(params.programParams) && surfGeom.isGlyph ? 1 : 0);\r\n });\r\n });\r\n\r\n // Fragment and Vertex\r\n addColor(builder);\r\n\r\n // Fragment\r\n builder.frag.addFunction(getSurfaceColor);\r\n addLighting(builder);\r\n addWhiteOnWhiteReversal(builder.frag);\r\n\r\n if (flags.isTranslucent) {\r\n addTranslucency(builder);\r\n } else {\r\n if (FeatureMode.None === feat) {\r\n addFragColorWithPreMultipliedAlpha(builder.frag);\r\n } else {\r\n if (!flags.isClassified)\r\n addOverrideClassifierColor(builder, flags.isThematic);\r\n else\r\n addFeaturePlanarClassifier(builder);\r\n\r\n builder.frag.addFunction(decodeDepthRgb);\r\n if (flags.isEdgeTestNeeded || flags.isClassified)\r\n addPickBufferOutputs(builder.frag);\r\n else\r\n addAltPickBufferOutputs(builder.frag);\r\n }\r\n }\r\n\r\n builder.frag.addGlobal(\"g_surfaceTexel\", VariableType.Vec4);\r\n builder.frag.set(FragmentShaderComponent.ComputeBaseColor, (flags.isThematic === IsThematic.No) ? computeBaseColor : \"return getSurfaceColor();\");\r\n\r\n if (flags.isClassified)\r\n addClassificationTranslucencyDiscard(builder);\r\n else\r\n addTransparencyDiscard(builder.frag);\r\n\r\n addSurfaceMonochrome(builder.frag);\r\n addMaterial(builder);\r\n\r\n if (flags.isWiremesh)\r\n addWiremesh(builder);\r\n\r\n return builder;\r\n}\r\n\r\nexport function addClassificationTranslucencyDiscard(builder: ProgramBuilder) {\r\n // For unclassified geometry, we need to render in both the translucent and opaque passes if any feature transparency overrides are applied that would change the default render pass used.\r\n // Those shaders compute the transparency in the vertex shader and discard the vertex in one pass or the other.\r\n // For classified geometry, the transparency comes from the classifier geometry (when using Display.ElementColor), so even if there are no feature overrides, we may need to draw in both passes.\r\n // Since the transparency is not known until the fragment shader, we must perform the discard there instead.\r\n addMaxAlpha(builder.frag);\r\n addRenderPass(builder.frag);\r\n\r\n // Do not discard transparent classified geometry if we're trying to do a pick...\r\n builder.frag.addUniform(\"u_no_classifier_discard\", VariableType.Boolean, (prog) => {\r\n prog.addProgramUniform(\"u_no_classifier_discard\", (uniform, params) => {\r\n uniform.setUniform1i(params.target.isReadPixelsInProgress ? 1 : 0);\r\n });\r\n });\r\n\r\n builder.frag.set(FragmentShaderComponent.DiscardByAlpha, discardClassifiedByAlpha);\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"Surface.js","sourceRoot":"","sources":["../../../../../src/render/webgl/glsl/Surface.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 { Material } from \"../Material\";\r\nimport { Pass, SurfaceBitIndex, SurfaceFlags, TextureUnit } from \"../RenderFlags\";\r\nimport {\r\n FragmentShaderBuilder, FragmentShaderComponent, ProgramBuilder, ShaderBuilder, VariableType, VertexShaderComponent,\r\n} from \"../ShaderBuilder\";\r\nimport { System } from \"../System\";\r\nimport { FeatureMode, IsAnimated, IsClassified, IsInstanced, IsShadowable, IsThematic, TechniqueFlags } from \"../TechniqueFlags\";\r\nimport { TechniqueId } from \"../TechniqueId\";\r\nimport { Texture } from \"../Texture\";\r\nimport { addAnimation } from \"./Animation\";\r\nimport { unpackFloat } from \"./Clipping\";\r\nimport { addColor } from \"./Color\";\r\nimport { addChooseWithBitFlagFunctions, addExtractNthBit, addFrustum, addShaderFlags } from \"./Common\";\r\nimport { addUnpackAndNormalize2Bytes, decodeDepthRgb, unquantize2d } from \"./Decode\";\r\nimport {\r\n addFeatureSymbology, addMaxAlpha, addRenderOrder, addRenderOrderConstants, addSurfaceDiscard, addSurfaceHiliter, FeatureSymbologyOptions,\r\n} from \"./FeatureSymbology\";\r\nimport {\r\n addAltPickBufferOutputs, addFragColorWithPreMultipliedAlpha, addPickBufferOutputs, addWhiteOnWhiteReversal, assignFragColor,\r\n} from \"./Fragment\";\r\nimport { addLighting } from \"./Lighting\";\r\nimport { addSurfaceMonochrome } from \"./Monochrome\";\r\nimport { addColorPlanarClassifier, addFeaturePlanarClassifier, addHilitePlanarClassifier, addOverrideClassifierColor } from \"./PlanarClassification\";\r\nimport { addRenderPass } from \"./RenderPass\";\r\nimport { addSolarShadowMap } from \"./SolarShadowMapping\";\r\nimport { addThematicDisplay, getComputeThematicIndex } from \"./Thematic\";\r\nimport { addTranslucency } from \"./Translucency\";\r\nimport { addModelViewMatrix, addNormalMatrix, addProjectionMatrix } from \"./Vertex\";\r\nimport { wantMaterials } from \"../SurfaceGeometry\";\r\nimport { addWiremesh } from \"./Wiremesh\";\r\n\r\n// NB: Textures do not contain pre-multiplied alpha.\r\nconst sampleSurfaceTexture = `\r\nvec4 sampleSurfaceTexture() {\r\n return TEXTURE(s_texture, v_texCoord);\r\n}\r\n`;\r\n\r\nconst applyMaterialColor = `\r\n float useMatColor = float(use_material);\r\n vec3 rgb = mix(baseColor.rgb, mat_rgb.rgb, useMatColor * mat_rgb.a);\r\n float a = mix(baseColor.a, mat_alpha.x, useMatColor * mat_alpha.y);\r\n return vec4(rgb, a);\r\n`;\r\n\r\n// if this is a raster glyph, the sampled color has already been modified - do not modify further.\r\n// Mix diffuse color with texel based on texture weight.\r\n// Replace with diffuse RGB if RGB overridden.\r\n// Replace with diffuse alpha if alpha overridden.\r\n// Multiply texel alpha with diffuse alpha if specified.\r\nconst applyTextureWeight = `\r\n bool applyTexture = !u_applyGlyphTex && isSurfaceBitSet(kSurfaceBit_HasTexture);\r\n float textureWeight = applyTexture ? mat_texture_weight : 0.0;\r\n vec3 rgb = mix(baseColor.rgb, g_surfaceTexel.rgb, textureWeight);\r\n rgb = chooseVec3WithBitFlag(rgb, baseColor.rgb, surfaceFlags, kSurfaceBit_OverrideRgb);\r\n\r\n float a = applyTexture ? baseColor.a * g_surfaceTexel.a : baseColor.a;\r\n\r\n return vec4(rgb, a);\r\n`;\r\n\r\nconst decodeFragMaterialParams = `\r\nvoid decodeMaterialParams(vec4 params) {\r\n mat_weights = unpackAndNormalize2Bytes(params.x);\r\n\r\n vec2 texAndSpecR = unpackAndNormalize2Bytes(params.y);\r\n mat_texture_weight = texAndSpecR.x;\r\n\r\n vec2 specGB = unpackAndNormalize2Bytes(params.z);\r\n mat_specular = vec4(texAndSpecR.y, specGB, params.w);\r\n}\r\n`;\r\n\r\nconst decodeMaterialColor = `\r\nvoid decodeMaterialColor(vec4 rgba) {\r\n mat_rgb = vec4(rgba.rgb, float(rgba.r >= 0.0));\r\n mat_alpha = vec2(rgba.a, float(rgba.a >= 0.0));\r\n}\r\n`;\r\n\r\n// defaults: (0x6699, 0xffff, 0xffff, 13.5)\r\nconst computeMaterialParams = `\r\n const vec4 defaults = vec4(26265.0, 65535.0, 65535.0, 13.5);\r\n return use_material ? g_materialParams : defaults;\r\n`;\r\n\r\n// The 8-bit material index is stored with the 24-bit feature index, in the high byte.\r\nconst readMaterialAtlas = `\r\nvoid readMaterialAtlas() {\r\n float materialAtlasStart = u_vertParams.z * u_vertParams.w + u_numColors;\r\n float materialIndex = g_featureAndMaterialIndex.w * 4.0 + materialAtlasStart;\r\n\r\n vec2 tc = computeLUTCoords(materialIndex, u_vertParams.xy, g_vert_center, 1.0);\r\n vec4 rgba = TEXTURE(u_vertLUT, tc);\r\n\r\n tc = computeLUTCoords(materialIndex + 1.0, u_vertParams.xy, g_vert_center, 1.0);\r\n vec4 weightsAndFlags = floor(TEXTURE(u_vertLUT, tc) * 255.0 + 0.5);\r\n\r\n tc = computeLUTCoords(materialIndex + 2.0, u_vertParams.xy, g_vert_center, 1.0);\r\n vec3 specularRgb = floor(TEXTURE(u_vertLUT, tc) * 255.0 + 0.5).rgb;\r\n\r\n tc = computeLUTCoords(materialIndex + 3.0, u_vertParams.xy, g_vert_center, 1.0);\r\n vec4 packedSpecularExponent = TEXTURE(u_vertLUT, tc);\r\n\r\n float flags = weightsAndFlags.w;\r\n mat_rgb = vec4(rgba.rgb, float(flags == 1.0 || flags == 3.0));\r\n mat_alpha = vec2(rgba.a, float(flags == 2.0 || flags == 3.0));\r\n\r\n float specularExponent = unpackFloat(packedSpecularExponent);\r\n g_materialParams.x = weightsAndFlags.y + weightsAndFlags.z * 256.0;\r\n g_materialParams.y = 255.0 + specularRgb.r * 256.0;\r\n g_materialParams.z = specularRgb.g + specularRgb.b * 256.0;\r\n g_materialParams.w = specularExponent;\r\n}\r\n`;\r\n\r\nconst computeMaterial = `\r\n if (u_surfaceFlags[kSurfaceBitIndex_HasMaterialAtlas]) {\r\n readMaterialAtlas();\r\n } else {\r\n decodeMaterialColor(u_materialColor);\r\n g_materialParams = u_materialParams;\r\n }\r\n`;\r\n\r\nconst computeMaterialInstanced = `\r\n decodeMaterialColor(u_materialColor);\r\n g_materialParams = u_materialParams;\r\n`;\r\n\r\nfunction addMaterial(builder: ProgramBuilder, instanced: boolean): void {\r\n const frag = builder.frag;\r\n assert(undefined !== frag.find(\"v_surfaceFlags\"));\r\n\r\n frag.addGlobal(\"mat_texture_weight\", VariableType.Float);\r\n frag.addGlobal(\"mat_weights\", VariableType.Vec2); // diffuse, specular\r\n frag.addGlobal(\"mat_specular\", VariableType.Vec4); // rgb, exponent\r\n\r\n addUnpackAndNormalize2Bytes(frag);\r\n frag.addFunction(decodeFragMaterialParams);\r\n frag.addInitializer(\"decodeMaterialParams(v_materialParams);\");\r\n\r\n addChooseWithBitFlagFunctions(frag);\r\n frag.set(FragmentShaderComponent.ApplyMaterialOverrides, applyTextureWeight);\r\n\r\n const vert = builder.vert;\r\n vert.addGlobal(\"mat_rgb\", VariableType.Vec4); // a = 0 if not overridden, else 1\r\n vert.addGlobal(\"mat_alpha\", VariableType.Vec2); // a = 0 if not overridden, else 1\r\n vert.addGlobal(\"use_material\", VariableType.Boolean);\r\n if (System.instance.capabilities.isWebGL2)\r\n vert.addInitializer(\"use_material = (0u == (surfaceFlags & kSurfaceBit_IgnoreMaterial));\");\r\n else\r\n vert.addInitializer(\"use_material = !nthBitSet(surfaceFlags, kSurfaceBit_IgnoreMaterial);\");\r\n\r\n // Uniform material\r\n vert.addFunction(decodeMaterialColor);\r\n vert.addUniform(\"u_materialColor\", VariableType.Vec4, (prog) => {\r\n prog.addGraphicUniform(\"u_materialColor\", (uniform, params) => {\r\n const info = wantMaterials(params.target.currentViewFlags) ? params.geometry.materialInfo : undefined;\r\n const mat = undefined !== info && !info.isAtlas ? info : Material.default;\r\n uniform.setUniform4fv(mat.rgba);\r\n });\r\n });\r\n\r\n vert.addUniform(\"u_materialParams\", VariableType.Vec4, (prog) => {\r\n prog.addGraphicUniform(\"u_materialParams\", (uniform, params) => {\r\n const info = wantMaterials(params.target.currentViewFlags) ? params.geometry.materialInfo : undefined;\r\n const mat = undefined !== info && !info.isAtlas ? info : Material.default;\r\n uniform.setUniform4fv(mat.fragUniforms);\r\n });\r\n });\r\n\r\n if (!instanced) {\r\n // Material atlas\r\n vert.addFunction(unpackFloat);\r\n vert.addFunction(readMaterialAtlas);\r\n vert.addUniform(\"u_numColors\", VariableType.Float, (prog) => {\r\n prog.addGraphicUniform(\"u_numColors\", (uniform, params) => {\r\n const info = params.geometry.materialInfo;\r\n const numColors = undefined !== info && info.isAtlas ? info.vertexTableOffset : 0;\r\n uniform.setUniform1f(numColors);\r\n });\r\n });\r\n }\r\n vert.addGlobal(\"g_materialParams\", VariableType.Vec4);\r\n vert.set(VertexShaderComponent.ComputeMaterial, instanced ? computeMaterialInstanced : computeMaterial);\r\n vert.set(VertexShaderComponent.ApplyMaterialColor, applyMaterialColor);\r\n builder.addFunctionComputedVarying(\"v_materialParams\", VariableType.Vec4, \"computeMaterialParams\", computeMaterialParams);\r\n}\r\n\r\nconst computePositionPrelude = `\r\n vec4 pos = MAT_MV * rawPos;\r\n`;\r\n\r\n// We used to use gl.polygonOffset() for blanking regions, but that doesn't work with logarithmic depth buffer which overwrites the\r\n// computed Z. Instead we must manually offset in vertex shader. We do this even if log depth is not enabled/supported.\r\n// NOTE: If log depth is *not* supported, then the hilite surface vertex shaders previously would still include this logic, but the\r\n// fragment shaders would not use v_eyeSpace. Some Ubuntu 20.04 graphics drivers cleverly and correctly optimized out the varying and the uniform,\r\n// causing an exception when gl.getProgramLocation() failed. So, omit this bit in that case.\r\nconst adjustEyeSpace = `\r\n v_eyeSpace = pos.xyz;\r\n const float blankingRegionOffset = 2.0 / 65536.0;\r\n if (kRenderOrder_BlankingRegion == u_renderOrder)\r\n v_eyeSpace.z -= blankingRegionOffset * (u_frustum.y - u_frustum.x);\r\n`;\r\n\r\nconst computePositionPostlude = `\r\n return u_proj * pos;\r\n`;\r\n\r\nfunction createCommon(isInstanced: IsInstanced, animated: IsAnimated, shadowable: IsShadowable, isThematic: IsThematic, isHiliter: boolean): ProgramBuilder {\r\n const instanced = IsInstanced.Yes === isInstanced;\r\n const attrMap = AttributeMap.findAttributeMap(TechniqueId.Surface, instanced);\r\n const builder = new ProgramBuilder(attrMap, { maxRgbaPerVertex: 6, instanced });\r\n const vert = builder.vert;\r\n\r\n if (animated)\r\n addAnimation(vert, true, isThematic);\r\n\r\n if (shadowable)\r\n addSolarShadowMap(builder);\r\n\r\n addProjectionMatrix(vert);\r\n addModelViewMatrix(vert);\r\n\r\n let computePosition;\r\n if (isHiliter && !System.instance.supportsLogZBuffer) {\r\n computePosition = computePositionPrelude + computePositionPostlude;\r\n } else {\r\n addFrustum(builder);\r\n addRenderOrder(builder.vert);\r\n addRenderOrderConstants(builder.vert);\r\n builder.addVarying(\"v_eyeSpace\", VariableType.Vec3);\r\n computePosition = computePositionPrelude + adjustEyeSpace + computePositionPostlude;\r\n }\r\n\r\n vert.set(VertexShaderComponent.ComputePosition, computePosition);\r\n\r\n return builder;\r\n}\r\n\r\n/** @internal */\r\nexport function createSurfaceHiliter(instanced: IsInstanced, classified: IsClassified): ProgramBuilder {\r\n const builder = createCommon(instanced, IsAnimated.No, IsShadowable.No, IsThematic.No, true);\r\n\r\n addSurfaceFlags(builder, true, false);\r\n addTexture(builder, IsAnimated.No, IsThematic.No);\r\n if (classified) {\r\n addHilitePlanarClassifier(builder);\r\n builder.vert.addGlobal(\"feature_ignore_material\", VariableType.Boolean, \"false\");\r\n builder.frag.set(FragmentShaderComponent.AssignFragData, assignFragColor);\r\n } else {\r\n addSurfaceHiliter(builder);\r\n }\r\n\r\n return builder;\r\n}\r\n\r\nconst isSurfaceBitSet = `\r\nbool isSurfaceBitSet(float flag) { return nthBitSet(surfaceFlags, flag); }\r\n`;\r\nconst isSurfaceBitSet2 = `\r\nbool isSurfaceBitSet(uint flag) { return 0u != (surfaceFlags & flag); }\r\n`;\r\n\r\n/** @internal */\r\nfunction addSurfaceFlagsLookup(builder: ShaderBuilder) {\r\n builder.addConstant(\"kSurfaceBitIndex_HasTexture\", VariableType.Int, SurfaceBitIndex.HasTexture.toString());\r\n builder.addConstant(\"kSurfaceBitIndex_ApplyLighting\", VariableType.Int, SurfaceBitIndex.ApplyLighting.toString());\r\n builder.addConstant(\"kSurfaceBitIndex_HasNormals\", VariableType.Int, SurfaceBitIndex.HasNormals.toString());\r\n builder.addConstant(\"kSurfaceBitIndex_IgnoreMaterial\", VariableType.Int, SurfaceBitIndex.IgnoreMaterial.toString());\r\n builder.addConstant(\"kSurfaceBitIndex_TransparencyThreshold\", VariableType.Int, SurfaceBitIndex.TransparencyThreshold.toString());\r\n builder.addConstant(\"kSurfaceBitIndex_BackgroundFill\", VariableType.Int, SurfaceBitIndex.BackgroundFill.toString());\r\n builder.addConstant(\"kSurfaceBitIndex_HasColorAndNormal\", VariableType.Int, SurfaceBitIndex.HasColorAndNormal.toString());\r\n builder.addConstant(\"kSurfaceBitIndex_OverrideRgb\", VariableType.Int, SurfaceBitIndex.OverrideRgb.toString());\r\n builder.addConstant(\"kSurfaceBitIndex_NoFaceFront\", VariableType.Int, SurfaceBitIndex.NoFaceFront.toString());\r\n builder.addConstant(\"kSurfaceBitIndex_HasMaterialAtlas\", VariableType.Int, SurfaceBitIndex.HasMaterialAtlas.toString());\r\n\r\n // Surface flags which get modified in vertex shader are still passed to fragment shader as a single float & are thus\r\n // used differently there & so require different constants. Unused constants are commented out.\r\n builder.addBitFlagConstant(\"kSurfaceBit_HasTexture\", SurfaceBitIndex.HasTexture);\r\n builder.addBitFlagConstant(\"kSurfaceBit_IgnoreMaterial\", SurfaceBitIndex.IgnoreMaterial);\r\n builder.addBitFlagConstant(\"kSurfaceBit_OverrideRgb\", SurfaceBitIndex.OverrideRgb);\r\n\r\n // Only need masks for flags modified in vertex shader\r\n const suffix = System.instance.capabilities.isWebGL2 ? \"u\" : \".0\";\r\n const type = System.instance.capabilities.isWebGL2 ? VariableType.Uint : VariableType.Float;\r\n builder.addConstant(\"kSurfaceMask_HasTexture\", type, SurfaceFlags.HasTexture.toString() + suffix);\r\n builder.addConstant(\"kSurfaceMask_IgnoreMaterial\", type, SurfaceFlags.IgnoreMaterial.toString() + suffix);\r\n builder.addConstant(\"kSurfaceMask_OverrideRgb\", type, SurfaceFlags.OverrideRgb.toString() + suffix);\r\n\r\n addExtractNthBit(builder);\r\n if (System.instance.capabilities.isWebGL2) {\r\n builder.addFunction(isSurfaceBitSet2);\r\n builder.addGlobal(\"surfaceFlags\", VariableType.Uint);\r\n } else {\r\n builder.addFunction(isSurfaceBitSet);\r\n builder.addGlobal(\"surfaceFlags\", VariableType.Float);\r\n }\r\n}\r\n\r\nconst initSurfaceFlags = `\r\n surfaceFlags = u_surfaceFlags[kSurfaceBitIndex_HasTexture] ? kSurfaceMask_HasTexture : 0.0;\r\n surfaceFlags += u_surfaceFlags[kSurfaceBitIndex_IgnoreMaterial] ? kSurfaceMask_IgnoreMaterial : 0.0;\r\n surfaceFlags += u_surfaceFlags[kSurfaceBitIndex_OverrideRgb] ? kSurfaceMask_OverrideRgb : 0.0;\r\n`;\r\nconst initSurfaceFlags2 = `\r\n surfaceFlags = u_surfaceFlags[kSurfaceBitIndex_HasTexture] ? kSurfaceMask_HasTexture : 0u;\r\n surfaceFlags += u_surfaceFlags[kSurfaceBitIndex_IgnoreMaterial] ? kSurfaceMask_IgnoreMaterial : 0u;\r\n surfaceFlags += u_surfaceFlags[kSurfaceBitIndex_OverrideRgb] ? kSurfaceMask_OverrideRgb : 0u;\r\n`;\r\n\r\nconst computeBaseSurfaceFlags = `\r\n bool hasTexture = u_surfaceFlags[kSurfaceBitIndex_HasTexture];\r\n if (feature_ignore_material) {\r\n if (hasTexture) {\r\n hasTexture = false;\r\n surfaceFlags -= kSurfaceMask_HasTexture;\r\n }\r\n\r\n surfaceFlags += kSurfaceMask_IgnoreMaterial;\r\n }\r\n`;\r\n\r\n// Textured surfaces (including raster glyphs) always *multiply* the sampled alpha by the alpha override.\r\nconst computeColorSurfaceFlags = `\r\n if (feature_rgb.r >= 0.0)\r\n surfaceFlags += kSurfaceMask_OverrideRgb;\r\n`;\r\n\r\nconst returnSurfaceFlags = \" return surfaceFlags;\\n\";\r\nconst returnSurfaceFlags2 = \" return float(surfaceFlags);\\n\";\r\n\r\nconst computeSurfaceFlags = computeBaseSurfaceFlags;\r\nconst computeSurfaceFlagsWithColor = computeBaseSurfaceFlags + computeColorSurfaceFlags;\r\n\r\n/** @internal */\r\nexport const octDecodeNormal = `\r\nvec3 octDecodeNormal(vec2 e) {\r\n e = e / 255.0 * 2.0 - 1.0;\r\n vec3 n = vec3(e.x, e.y, 1.0 - abs(e.x) - abs(e.y));\r\n if (n.z < 0.0) {\r\n vec2 signNotZero = vec2(n.x >= 0.0 ? 1.0 : -1.0, n.y >= 0.0 ? 1.0 : -1.0);\r\n n.xy = (1.0 - abs(n.yx)) * signNotZero;\r\n }\r\n\r\n return normalize(n);\r\n}\r\n`;\r\n\r\nconst computeNormal = `\r\n if (!u_surfaceFlags[kSurfaceBitIndex_HasNormals])\r\n return vec3(0.0);\r\n vec2 normal = (u_surfaceFlags[kSurfaceBitIndex_HasColorAndNormal]) ? g_vertLutData3.xy : g_vertLutData1.zw;\r\n return normalize(MAT_NORM * octDecodeNormal(normal));\r\n`;\r\n\r\nconst computeAnimatedNormal = `\r\n if (u_animNormalParams.x >= 0.0)\r\n return normalize(MAT_NORM * computeAnimationNormal(u_animNormalParams.x, u_animNormalParams.y, u_animNormalParams.z));\r\n${computeNormal}`;\r\n\r\nconst applyBackgroundColor = `\r\n return u_surfaceFlags[kSurfaceBitIndex_BackgroundFill] ? vec4(u_bgColor.rgb, baseColor.a) : baseColor;\r\n`;\r\n\r\nconst computeTexCoord = `\r\n vec4 rgba = g_vertLutData3;\r\n vec2 qcoords = vec2(decodeUInt16(rgba.xy), decodeUInt16(rgba.zw));\r\n return chooseVec2WithBitFlag(vec2(0.0), unquantize2d(qcoords, u_qTexCoordParams), surfaceFlags, kSurfaceBit_HasTexture);\r\n`;\r\nconst computeAnimatedTexCoord = `\r\n if (u_animScalarQParams.x >= 0.0)\r\n return computeAnimationParam(u_animScalarParams.x, u_animScalarParams.y, u_animScalarParams.z, u_animScalarQParams.x, u_animScalarQParams.y);\r\n${computeTexCoord}`;\r\nconst getSurfaceColor = `\r\nvec4 getSurfaceColor() { return v_color; }\r\n`;\r\n\r\n// If we have texture weight < 1.0 we must compute the element/material color first then mix with texture color\r\n// in ApplyMaterialOverrides(). Do the sample once, here, and store in a global variable for possible later use.\r\n// If a glyph texture, must mix getSurfaceColor() with texture color so texture color alpha is applied 100% and\r\n// surface color rgb is scaled by texture color rgb (latter is full white originally but stretched via mipmapping).\r\nconst computeBaseColor = `\r\n g_surfaceTexel = sampleSurfaceTexture();\r\n vec4 surfaceColor = getSurfaceColor();\r\n\r\n if (!u_applyGlyphTex)\r\n return surfaceColor;\r\n\r\n // Compute color for raster glyph.\r\n const vec3 white = vec3(1.0);\r\n const vec3 epsilon = vec3(0.0001);\r\n const vec3 almostWhite = white - epsilon;\r\n\r\n // set to black if almost white and reverse white-on-white is on\r\n bvec3 isAlmostWhite = greaterThan(surfaceColor.rgb, almostWhite);\r\n surfaceColor.rgb = (u_reverseWhiteOnWhite && isAlmostWhite.r && isAlmostWhite.g && isAlmostWhite.b ? vec3(0.0, 0.0, 0.0) : surfaceColor.rgb);\r\n return vec4(surfaceColor.rgb * g_surfaceTexel.rgb, g_surfaceTexel.a);\r\n`;\r\n\r\nconst surfaceFlagArray = new Int32Array(SurfaceBitIndex.Count);\r\n\r\n/** @internal */\r\nexport function addSurfaceFlags(builder: ProgramBuilder, withFeatureOverrides: boolean, withFeatureColor: boolean) {\r\n addSurfaceFlagsLookup(builder.vert);\r\n addSurfaceFlagsLookup(builder.frag);\r\n\r\n let compute = (System.instance.capabilities.isWebGL2 ? initSurfaceFlags2 : initSurfaceFlags);\r\n if (withFeatureOverrides)\r\n compute += `${withFeatureColor ? computeSurfaceFlagsWithColor : computeSurfaceFlags}\\n`;\r\n compute += (System.instance.capabilities.isWebGL2 ? returnSurfaceFlags2 : returnSurfaceFlags);\r\n builder.addFunctionComputedVarying(\"v_surfaceFlags\", VariableType.Float, \"computeSurfaceFlags\", compute);\r\n\r\n if (System.instance.capabilities.isWebGL2)\r\n builder.frag.addInitializer(\"surfaceFlags = uint(floor(v_surfaceFlags + 0.5));\");\r\n else\r\n builder.frag.addInitializer(\"surfaceFlags = floor(v_surfaceFlags + 0.5);\");\r\n\r\n builder.addUniformArray(\"u_surfaceFlags\", VariableType.Boolean, SurfaceBitIndex.Count, (prog) => {\r\n prog.addGraphicUniform(\"u_surfaceFlags\", (uniform, params) => {\r\n assert(undefined !== params.geometry.asSurface);\r\n const mesh = params.geometry.asSurface;\r\n mesh.computeSurfaceFlags(params.programParams, surfaceFlagArray);\r\n uniform.setUniform1iv(surfaceFlagArray);\r\n });\r\n });\r\n}\r\n\r\nfunction addNormal(builder: ProgramBuilder, instanced: IsInstanced, animated: IsAnimated) {\r\n addNormalMatrix(builder.vert, instanced);\r\n\r\n builder.vert.addFunction(octDecodeNormal);\r\n addChooseWithBitFlagFunctions(builder.vert);\r\n builder.vert.addFunction(\"vec3 computeSurfaceNormal()\", computeNormal);\r\n builder.addFunctionComputedVarying(\"v_n\", VariableType.Vec3, \"computeLightingNormal\", animated ? computeAnimatedNormal : \"return computeSurfaceNormal();\");\r\n\r\n // Set to true to colorize surfaces based on normals (in world space).\r\n // You must also set checkMaxVarying to false in ProgramBuilder.buildProgram to avoid assertions, if using a non-optimized build.\r\n const debugNormals = false;\r\n if (debugNormals) {\r\n builder.frag.set(FragmentShaderComponent.ApplyDebugColor, \"return vec4(vec3(v_normal / 2.0 + 0.5), baseColor.a);\");\r\n builder.addInlineComputedVarying(\"v_normal\", VariableType.Vec3, \"v_normal = computeSurfaceNormal();\");\r\n }\r\n}\r\n\r\n/** @internal */\r\nexport function addTexture(builder: ProgramBuilder, animated: IsAnimated, isThematic: IsThematic, isPointCloud = false) {\r\n if (isThematic) {\r\n builder.addInlineComputedVarying(\"v_thematicIndex\", VariableType.Float, getComputeThematicIndex(builder.vert.usesInstancedGeometry, isPointCloud, true));\r\n } else {\r\n builder.vert.addFunction(unquantize2d);\r\n addChooseWithBitFlagFunctions(builder.vert);\r\n builder.addFunctionComputedVarying(\"v_texCoord\", VariableType.Vec2, \"computeTexCoord\", animated ? computeAnimatedTexCoord : computeTexCoord);\r\n builder.vert.addUniform(\"u_qTexCoordParams\", VariableType.Vec4, (prog) => {\r\n prog.addGraphicUniform(\"u_qTexCoordParams\", (uniform, params) => {\r\n const surfGeom = params.geometry.asSurface!;\r\n if (surfGeom.useTexture(params.programParams)) {\r\n const uvQParams = surfGeom.lut.uvQParams;\r\n if (undefined !== uvQParams) {\r\n uniform.setUniform4fv(uvQParams);\r\n }\r\n }\r\n });\r\n });\r\n builder.frag.addFunction(sampleSurfaceTexture);\r\n }\r\n\r\n builder.frag.addUniform(\"s_texture\", VariableType.Sampler2D, (prog) => {\r\n prog.addGraphicUniform(\"s_texture\", (uniform, params) => {\r\n const surfGeom = params.geometry.asSurface!;\r\n if (params.geometry.supportsThematicDisplay && params.target.wantThematicDisplay) { // NB: if thematic display is enabled, bind the thematic texture and ignore any applied surface textures\r\n params.target.uniforms.thematic.bindTexture(uniform, TextureUnit.SurfaceTexture);\r\n } else if (surfGeom.useTexture(params.programParams)) {\r\n const texture = (params.geometry.hasAnimation && params.target.analysisTexture) ? (params.target.analysisTexture as Texture) : surfGeom.texture;\r\n assert(undefined !== texture);\r\n texture.texture.bindSampler(uniform, TextureUnit.SurfaceTexture);\r\n } else {\r\n System.instance.ensureSamplerBound(uniform, TextureUnit.SurfaceTexture);\r\n }\r\n });\r\n });\r\n}\r\n\r\nexport const discardClassifiedByAlpha = `\r\n if (u_no_classifier_discard)\r\n return false;\r\n\r\n bool hasAlpha = alpha <= s_maxAlpha;\r\n bool isOpaquePass = (kRenderPass_OpaqueLinear <= u_renderPass && kRenderPass_OpaqueGeneral >= u_renderPass);\r\n bool isTranslucentPass = kRenderPass_Translucent == u_renderPass;\r\n return (isOpaquePass && hasAlpha) || (isTranslucentPass && !hasAlpha);\r\n`;\r\n\r\nconst discardByTextureAlpha = `\r\n if (isSurfaceBitSet(kSurfaceBit_HasTexture)) {\r\n float cutoff = abs(u_alphaCutoff);\r\n if (kRenderPass_Translucent == u_renderPass)\r\n return u_alphaCutoff > 0.0 && alpha >= cutoff;\r\n else\r\n return alpha < cutoff;\r\n }\r\n\r\n return false;\r\n`;\r\n\r\nfunction addTransparencyDiscard(frag: FragmentShaderBuilder): void {\r\n addRenderPass(frag);\r\n frag.addUniform(\"u_alphaCutoff\", VariableType.Float, (prog) => {\r\n prog.addGraphicUniform(\"u_alphaCutoff\", (uniform, params) => {\r\n // This cutoff is used to discard pixels based on the alpha value sampled from the surface texture.\r\n // During readPixels, or when transparency is disabled, only discard 100% opaque pixels.\r\n // Otherwise, if the geometry draws in both opaque and translucent passes, use DisplayParams.minTransparency to filter pixels into appropriate pass to produce appropriate blending.\r\n // Negative cutoff applies only during opaque pass; positive cutoff applies during opaque and translucent passes.\r\n const pass = params.geometry.getPass(params.target);\r\n const cutoff = (!Pass.rendersOpaqueAndTranslucent(pass) || params.target.isReadPixelsInProgress || !params.target.currentViewFlags.transparency) ? -1 / 255 : 241 / 255;\r\n uniform.setUniform1f(cutoff);\r\n });\r\n });\r\n\r\n frag.set(FragmentShaderComponent.DiscardByAlpha, discardByTextureAlpha);\r\n}\r\n\r\n/** @internal */\r\nexport function createSurfaceBuilder(flags: TechniqueFlags): ProgramBuilder {\r\n const builder = createCommon(flags.isInstanced, flags.isAnimated, flags.isShadowable, flags.isThematic, false);\r\n addShaderFlags(builder);\r\n\r\n const feat = flags.featureMode;\r\n let opts = FeatureMode.Overrides === feat ? FeatureSymbologyOptions.Surface : FeatureSymbologyOptions.None;\r\n if (flags.isClassified) {\r\n opts &= ~FeatureSymbologyOptions.Alpha;\r\n addColorPlanarClassifier(builder, flags.isTranslucent, flags.isThematic);\r\n }\r\n\r\n if (flags.isThematic)\r\n addThematicDisplay(builder);\r\n\r\n addFeatureSymbology(builder, feat, opts);\r\n addSurfaceFlags(builder, FeatureMode.Overrides === feat, true);\r\n addSurfaceDiscard(builder, flags);\r\n addNormal(builder, flags.isInstanced, flags.isAnimated);\r\n\r\n // In HiddenLine mode, we must compute the base color (plus feature overrides etc) in order to get the alpha, then replace with background color (preserving alpha for the transparency threshold test).\r\n addChooseWithBitFlagFunctions(builder.frag);\r\n builder.frag.set(FragmentShaderComponent.FinalizeBaseColor, applyBackgroundColor);\r\n builder.frag.addUniform(\"u_bgColor\", VariableType.Vec3, (prog) => {\r\n prog.addProgramUniform(\"u_bgColor\", (uniform, params) => {\r\n params.target.uniforms.style.bindBackgroundRgb(uniform);\r\n });\r\n });\r\n\r\n addTexture(builder, flags.isAnimated, flags.isThematic);\r\n\r\n builder.frag.addUniform(\"u_applyGlyphTex\", VariableType.Boolean, (prog) => {\r\n prog.addGraphicUniform(\"u_applyGlyphTex\", (uniform, params) => {\r\n const surfGeom = params.geometry.asSurface!;\r\n uniform.setUniform1i(surfGeom.useTexture(params.programParams) && surfGeom.isGlyph ? 1 : 0);\r\n });\r\n });\r\n\r\n // Fragment and Vertex\r\n addColor(builder);\r\n\r\n // Fragment\r\n builder.frag.addFunction(getSurfaceColor);\r\n addLighting(builder);\r\n addWhiteOnWhiteReversal(builder.frag);\r\n\r\n if (flags.isTranslucent) {\r\n addTranslucency(builder);\r\n } else {\r\n if (FeatureMode.None === feat) {\r\n addFragColorWithPreMultipliedAlpha(builder.frag);\r\n } else {\r\n if (!flags.isClassified)\r\n addOverrideClassifierColor(builder, flags.isThematic);\r\n else\r\n addFeaturePlanarClassifier(builder);\r\n\r\n builder.frag.addFunction(decodeDepthRgb);\r\n if (flags.isEdgeTestNeeded || flags.isClassified)\r\n addPickBufferOutputs(builder.frag);\r\n else\r\n addAltPickBufferOutputs(builder.frag);\r\n }\r\n }\r\n\r\n builder.frag.addGlobal(\"g_surfaceTexel\", VariableType.Vec4);\r\n builder.frag.set(FragmentShaderComponent.ComputeBaseColor, (flags.isThematic === IsThematic.No) ? computeBaseColor : \"return getSurfaceColor();\");\r\n\r\n if (flags.isClassified)\r\n addClassificationTranslucencyDiscard(builder);\r\n else\r\n addTransparencyDiscard(builder.frag);\r\n\r\n addSurfaceMonochrome(builder.frag);\r\n addMaterial(builder, flags.isInstanced === IsInstanced.Yes);\r\n\r\n if (flags.isWiremesh)\r\n addWiremesh(builder);\r\n\r\n return builder;\r\n}\r\n\r\nexport function addClassificationTranslucencyDiscard(builder: ProgramBuilder) {\r\n // For unclassified geometry, we need to render in both the translucent and opaque passes if any feature transparency overrides are applied that would change the default render pass used.\r\n // Those shaders compute the transparency in the vertex shader and discard the vertex in one pass or the other.\r\n // For classified geometry, the transparency comes from the classifier geometry (when using Display.ElementColor), so even if there are no feature overrides, we may need to draw in both passes.\r\n // Since the transparency is not known until the fragment shader, we must perform the discard there instead.\r\n addMaxAlpha(builder.frag);\r\n addRenderPass(builder.frag);\r\n\r\n // Do not discard transparent classified geometry if we're trying to do a pick...\r\n builder.frag.addUniform(\"u_no_classifier_discard\", VariableType.Boolean, (prog) => {\r\n prog.addProgramUniform(\"u_no_classifier_discard\", (uniform, params) => {\r\n uniform.setUniform1i(params.target.isReadPixelsInProgress ? 1 : 0);\r\n });\r\n });\r\n\r\n builder.frag.set(FragmentShaderComponent.DiscardByAlpha, discardClassifiedByAlpha);\r\n}\r\n"]}
|
|
@@ -27,8 +27,6 @@ export declare function addLineCode(vert: VertexShaderBuilder): void;
|
|
|
27
27
|
/** @internal */
|
|
28
28
|
export declare function replaceLineCode(vert: VertexShaderBuilder, func: string): void;
|
|
29
29
|
/** @internal */
|
|
30
|
-
export declare function addFeatureAndMaterialLookup(vert: VertexShaderBuilder): void;
|
|
31
|
-
/** @internal */
|
|
32
30
|
export declare const earlyVertexDiscard: string;
|
|
33
31
|
/** @internal */
|
|
34
32
|
export declare const vertexDiscard: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Vertex.d.ts","sourceRoot":"","sources":["../../../../../src/render/webgl/glsl/Vertex.ts"],"names":[],"mappings":"AAIA;;GAEG;AAOH,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAgB,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAerE,eAAO,MAAM,wBAAwB,4HAEpC,CAAC;
|
|
1
|
+
{"version":3,"file":"Vertex.d.ts","sourceRoot":"","sources":["../../../../../src/render/webgl/glsl/Vertex.ts"],"names":[],"mappings":"AAIA;;GAEG;AAOH,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAgB,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAerE,eAAO,MAAM,wBAAwB,4HAEpC,CAAC;AAcF,gBAAgB;AAChB,wBAAgB,4BAA4B,CAAC,IAAI,EAAE,mBAAmB,GAAG,IAAI,CAa5E;AAED,gBAAgB;AAChB,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,mBAAmB,GAAG,IAAI,CAMnE;AAMD,gBAAgB;AAChB,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,mBAAmB,GAAG,IAAI,CAcrE;AAED,gBAAgB;AAChB,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,mBAAmB,GAAG,IAAI,CAkBlE;AAoBD,gBAAgB;AAChB,wBAAgB,eAAe,CAAC,IAAI,EAAE,mBAAmB,EAAE,SAAS,EAAE,WAAW,QAqBhF;AAyDD,gBAAgB;AAChB,wBAAgB,WAAW,CAAC,IAAI,EAAE,mBAAmB,EAAE,OAAO,EAAE,OAAO,QAqBtE;AAED,gBAAgB;AAChB,wBAAgB,QAAQ,CAAC,IAAI,EAAE,mBAAmB,GAAG,IAAI,CAMxD;AAED,gBAAgB;AAChB,wBAAgB,aAAa,CAAC,IAAI,EAAE,mBAAmB,GAAG,IAAI,CAgB7D;AAED,gBAAgB;AAChB,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,mBAAmB,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAE/E;AAED,gBAAgB;AAChB,wBAAgB,WAAW,CAAC,IAAI,EAAE,mBAAmB,GAAG,IAAI,CAgB3D;AAED,gBAAgB;AAChB,wBAAgB,eAAe,CAAC,IAAI,EAAE,mBAAmB,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAE7E;AAUD,gBAAgB;AAChB,eAAO,MAAM,kBAAkB,QAA6D,CAAC;AAC7F,gBAAgB;AAChB,eAAO,MAAM,aAAa,QAA6C,CAAC;AACxE,gBAAgB;AAChB,eAAO,MAAM,iBAAiB,QAAiD,CAAC"}
|
|
@@ -9,7 +9,7 @@ import { assert } from "@itwin/core-bentley";
|
|
|
9
9
|
import { Matrix4 } from "../Matrix";
|
|
10
10
|
import { Pass, TextureUnit } from "../RenderFlags";
|
|
11
11
|
import { System } from "../System";
|
|
12
|
-
import {
|
|
12
|
+
import { decodeUint16, decodeUint24 } from "./Decode";
|
|
13
13
|
import { addInstanceOverrides } from "./Instancing";
|
|
14
14
|
import { addLookupTable } from "./LookupTable";
|
|
15
15
|
const initializeVertLUTCoords = `
|
|
@@ -25,14 +25,9 @@ vec4 unquantizeVertexPosition(vec3 pos, vec3 origin, vec3 scale) { return unquan
|
|
|
25
25
|
// Need to read 2 rgba values to obtain 6 16-bit integers for position
|
|
26
26
|
const unquantizeVertexPositionFromLUT = `
|
|
27
27
|
vec4 unquantizeVertexPosition(vec3 encodedIndex, vec3 origin, vec3 scale) {
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
vec3 qpos = vec3(decodeUInt16(enc1.xy), decodeUInt16(enc1.zw), decodeUInt16(enc2.xy));
|
|
32
|
-
return unquantizePosition(qpos, origin, scale);
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
return vec4(decodeFloat32(g_vertLutData[0]), decodeFloat32(g_vertLutData[1]), decodeFloat32(g_vertLutData[2]), 1.0);
|
|
28
|
+
vec3 qpos = vec3(decodeUInt16(g_vertLutData0.xy), decodeUInt16(g_vertLutData0.zw), decodeUInt16(g_vertLutData1.xy));
|
|
29
|
+
g_featureAndMaterialIndex = g_vertLutData2;
|
|
30
|
+
return unquantizePosition(qpos, origin, scale);
|
|
36
31
|
}
|
|
37
32
|
`;
|
|
38
33
|
const computeLineWeight = "\nfloat computeLineWeight() { return g_lineWeight; }\n";
|
|
@@ -142,7 +137,6 @@ function addPositionFromLUT(vert) {
|
|
|
142
137
|
vert.addGlobal("g_vertexBaseCoords", 3 /* Vec2 */);
|
|
143
138
|
vert.addFunction(decodeUint24);
|
|
144
139
|
vert.addFunction(decodeUint16);
|
|
145
|
-
vert.addFunction(decodeFloat32);
|
|
146
140
|
vert.addFunction(unquantizeVertexPositionFromLUT);
|
|
147
141
|
vert.addUniform("u_vertLUT", 8 /* Sampler2D */, (prog) => {
|
|
148
142
|
prog.addGraphicUniform("u_vertLUT", (uniform, params) => {
|
|
@@ -163,18 +157,22 @@ function addPositionFromLUT(vert) {
|
|
|
163
157
|
});
|
|
164
158
|
addLookupTable(vert, "vert", "u_vertParams.z");
|
|
165
159
|
vert.addInitializer(initializeVertLUTCoords);
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
vert.addGlobal(`
|
|
169
|
-
vert.addGlobal(
|
|
170
|
-
|
|
171
|
-
|
|
160
|
+
vert.addGlobal(`g_vertLutData0`, 5 /* Vec4 */);
|
|
161
|
+
vert.addGlobal(`g_vertLutData1`, 5 /* Vec4 */);
|
|
162
|
+
vert.addGlobal(`g_vertLutData2`, 5 /* Vec4 */);
|
|
163
|
+
vert.addGlobal(`g_vertLutData3`, 5 /* Vec4 */);
|
|
164
|
+
vert.addGlobal("g_featureAndMaterialIndex", 5 /* Vec4 */);
|
|
165
|
+
// Read the vertex data from the vertex table up front. Yields a consistent (if unexplainable) small performance boost.
|
|
172
166
|
vert.addInitializer(`
|
|
173
|
-
g_usesQuantizedPosition = u_qScale.x >= 0.0;
|
|
174
167
|
vec2 tc = g_vertexBaseCoords;
|
|
175
|
-
|
|
176
|
-
|
|
168
|
+
g_vertLutData0 = floor(TEXTURE(u_vertLUT, tc) * 255.0 + 0.5);
|
|
169
|
+
tc.x += g_vert_stepX;
|
|
170
|
+
g_vertLutData1 = floor(TEXTURE(u_vertLUT, tc) * 255.0 + 0.5);
|
|
171
|
+
tc.x += g_vert_stepX;
|
|
172
|
+
g_vertLutData2 = floor(TEXTURE(u_vertLUT, tc) * 255.0 + 0.5);
|
|
173
|
+
if (3.0 < u_vertParams.z) {
|
|
177
174
|
tc.x += g_vert_stepX;
|
|
175
|
+
g_vertLutData3 = floor(TEXTURE(u_vertLUT, tc) * 255.0 + 0.5);
|
|
178
176
|
}
|
|
179
177
|
`);
|
|
180
178
|
}
|
|
@@ -252,19 +250,6 @@ export function addLineCode(vert) {
|
|
|
252
250
|
export function replaceLineCode(vert, func) {
|
|
253
251
|
vert.replaceFunction(computeLineCode, func);
|
|
254
252
|
}
|
|
255
|
-
/** @internal */
|
|
256
|
-
export function addFeatureAndMaterialLookup(vert) {
|
|
257
|
-
if (undefined !== vert.find("g_featureAndMaterialIndex"))
|
|
258
|
-
return;
|
|
259
|
-
const computeFeatureAndMaterialIndex = `
|
|
260
|
-
g_featureAndMaterialIndex = g_usesQuantizedPosition ? g_vertLutData[2] : g_vertLutData[3];
|
|
261
|
-
`;
|
|
262
|
-
vert.addGlobal("g_featureAndMaterialIndex", 5 /* Vec4 */);
|
|
263
|
-
if (!vert.usesInstancedGeometry) {
|
|
264
|
-
// Only needed for material atlas, and instanced geometry never uses material atlas.
|
|
265
|
-
vert.addInitializer(computeFeatureAndMaterialIndex);
|
|
266
|
-
}
|
|
267
|
-
}
|
|
268
253
|
// This vertex belongs to a triangle which should not be rendered. Produce a degenerate triangle.
|
|
269
254
|
// Also place it outside NDC range (for GL_POINTS)
|
|
270
255
|
const discardVertex = ` {
|