@itwin/core-frontend 4.0.0-dev.55 → 4.0.0-dev.58
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/webgl/BranchUniforms.d.ts +0 -2
- package/lib/cjs/render/webgl/BranchUniforms.d.ts.map +1 -1
- package/lib/cjs/render/webgl/BranchUniforms.js +7 -10
- package/lib/cjs/render/webgl/BranchUniforms.js.map +1 -1
- package/lib/cjs/render/webgl/MeshData.d.ts +4 -0
- package/lib/cjs/render/webgl/MeshData.d.ts.map +1 -1
- package/lib/cjs/render/webgl/MeshData.js +23 -7
- package/lib/cjs/render/webgl/MeshData.js.map +1 -1
- package/lib/cjs/render/webgl/RenderFlags.d.ts +3 -1
- package/lib/cjs/render/webgl/RenderFlags.d.ts.map +1 -1
- package/lib/cjs/render/webgl/RenderFlags.js.map +1 -1
- package/lib/cjs/render/webgl/SurfaceGeometry.d.ts.map +1 -1
- package/lib/cjs/render/webgl/SurfaceGeometry.js +2 -0
- package/lib/cjs/render/webgl/SurfaceGeometry.js.map +1 -1
- package/lib/cjs/render/webgl/glsl/CopyStencil.d.ts.map +1 -1
- package/lib/cjs/render/webgl/glsl/CopyStencil.js +0 -1
- package/lib/cjs/render/webgl/glsl/CopyStencil.js.map +1 -1
- package/lib/cjs/render/webgl/glsl/Surface.d.ts.map +1 -1
- package/lib/cjs/render/webgl/glsl/Surface.js +94 -20
- package/lib/cjs/render/webgl/glsl/Surface.js.map +1 -1
- package/lib/cjs/render/webgl/glsl/Vertex.d.ts.map +1 -1
- package/lib/cjs/render/webgl/glsl/Vertex.js +24 -26
- package/lib/cjs/render/webgl/glsl/Vertex.js.map +1 -1
- package/lib/esm/render/webgl/BranchUniforms.d.ts +0 -2
- package/lib/esm/render/webgl/BranchUniforms.d.ts.map +1 -1
- package/lib/esm/render/webgl/BranchUniforms.js +7 -10
- package/lib/esm/render/webgl/BranchUniforms.js.map +1 -1
- package/lib/esm/render/webgl/MeshData.d.ts +4 -0
- package/lib/esm/render/webgl/MeshData.d.ts.map +1 -1
- package/lib/esm/render/webgl/MeshData.js +23 -7
- package/lib/esm/render/webgl/MeshData.js.map +1 -1
- package/lib/esm/render/webgl/RenderFlags.d.ts +3 -1
- package/lib/esm/render/webgl/RenderFlags.d.ts.map +1 -1
- package/lib/esm/render/webgl/RenderFlags.js.map +1 -1
- package/lib/esm/render/webgl/SurfaceGeometry.d.ts.map +1 -1
- package/lib/esm/render/webgl/SurfaceGeometry.js +2 -0
- package/lib/esm/render/webgl/SurfaceGeometry.js.map +1 -1
- package/lib/esm/render/webgl/glsl/CopyStencil.d.ts.map +1 -1
- package/lib/esm/render/webgl/glsl/CopyStencil.js +0 -1
- package/lib/esm/render/webgl/glsl/CopyStencil.js.map +1 -1
- package/lib/esm/render/webgl/glsl/Surface.d.ts.map +1 -1
- package/lib/esm/render/webgl/glsl/Surface.js +94 -20
- package/lib/esm/render/webgl/glsl/Surface.js.map +1 -1
- package/lib/esm/render/webgl/glsl/Vertex.d.ts.map +1 -1
- package/lib/esm/render/webgl/glsl/Vertex.js +24 -26
- package/lib/esm/render/webgl/glsl/Vertex.js.map +1 -1
- package/package.json +19 -19
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CopyStencil.js","sourceRoot":"","sources":["../../../../../src/render/webgl/glsl/CopyStencil.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 { ColorDef, SpatialClassifierInsideDisplay, SpatialClassifierOutsideDisplay } from \"@itwin/core-common\";\r\nimport { BoundaryType, SingleTexturedViewportQuadGeometry, VolumeClassifierGeometry } from \"../CachedGeometry\";\r\nimport { FloatRgb, FloatRgba } from \"../FloatRGBA\";\r\nimport { TextureUnit } from \"../RenderFlags\";\r\nimport { FragmentShaderComponent, ShaderBuilder, VariableType } from \"../ShaderBuilder\";\r\nimport { ShaderProgram } from \"../ShaderProgram\";\r\nimport { Texture2DHandle } from \"../Texture\";\r\nimport { assignFragColor } from \"./Fragment\";\r\nimport { createViewportQuadBuilder } from \"./ViewportQuad\";\r\n\r\nconst computehiliteColor = \"return vec4(u_hilite_color.rgb, 1.0);\";\r\n\r\nconst computeSetBlendColor = \"return u_blend_color;\";\r\n\r\nconst computeBlendTextureColor = \"return TEXTURE(u_blendTexture, v_texCoord);\";\r\n\r\nconst computeTexCoord = \"v_texCoord = (rawPosition.xy + 1.0) * 0.5;\";\r\n\r\nconst checkDiscardBackgroundByZ = `\r\n if (u_boundaryType == kBoundaryType_Out)\r\n return TEXTURE(u_depthTexture, v_texCoord).r == 1.0;\r\n return false;\r\n`;\r\n\r\nconst depthFromTexture = \"return TEXTURE(u_depthTexture, v_texCoord).r;\";\r\n\r\nconst scratchColor = FloatRgba.fromColorDef(ColorDef.white);\r\n\r\n/** @internal */\r\nfunction addBoundaryTypeConstants(builder: ShaderBuilder): void {\r\n // NB: These are the bit positions of each flag in OvrFlags enum - not the flag values\r\n builder.addConstant(\"kBoundaryType_Out\", VariableType.Int, \"0\");\r\n builder.addConstant(\"kBoundaryType_In\", VariableType.Int, \"1\");\r\n builder.addConstant(\"kBoundaryType_Selected\", VariableType.Int, \"2\");\r\n}\r\n\r\n/** @internal */\r\nfunction setScratchColor(display: number, hilite: FloatRgb, hAlpha: number): void {\r\n switch (display) {\r\n case SpatialClassifierOutsideDisplay.Dimmed:\r\n scratchColor.set(0.0, 0.0, 0.0, 0.3);\r\n break;\r\n case SpatialClassifierOutsideDisplay.Off:\r\n scratchColor.set(0.0, 0.0, 0.0, 0.8);\r\n break;\r\n case SpatialClassifierOutsideDisplay.On:\r\n scratchColor.set(0.0, 0.0, 0.0, 0.0);\r\n break;\r\n default: // Hilite or ByElementColor (though ByElementColor should never use this shader)\r\n scratchColor.set(hilite.red, hilite.green, hilite.blue, hAlpha);\r\n break;\r\n }\r\n}\r\n\r\n/** @internal */\r\nexport function createVolClassColorUsingStencilProgram(context: WebGL2RenderingContext): ShaderProgram {\r\n const builder = createViewportQuadBuilder(false);\r\n const frag = builder.frag;\r\n frag.set(FragmentShaderComponent.ComputeBaseColor, computehiliteColor);\r\n frag.set(FragmentShaderComponent.AssignFragData, assignFragColor);\r\n frag.addUniform(\"u_hilite_color\", VariableType.Vec4, (prog) => {\r\n prog.addGraphicUniform(\"u_hilite_color\", (uniform, params) => {\r\n const useLighting = params.geometry.getFlashMode(params);\r\n if (useLighting) {\r\n const hiliteColor = params.target.uniforms.hilite.hiliteColor;\r\n scratchColor.set(hiliteColor.red, hiliteColor.green, hiliteColor.blue, 1.0);\r\n } else\r\n scratchColor.set(1.0, 1.0, 1.0, 0.0);\r\n scratchColor.bind(uniform);\r\n });\r\n });\r\n\r\n builder.vert.headerComment = \"//!V! VolClassColorUsingStencil\";\r\n builder.frag.headerComment = \"//!F! VolClassColorUsingStencil\";\r\n\r\n return builder.buildProgram(context);\r\n}\r\n\r\n/** @internal */\r\nexport function createVolClassCopyZProgram(context: WebGL2RenderingContext): ShaderProgram {\r\n const builder = createViewportQuadBuilder(true);\r\n\r\n builder.addInlineComputedVarying(\"v_texCoord\", VariableType.Vec2, computeTexCoord); // TODO: I think this is not necessary because it's already added from the create above\r\n\r\n const frag = builder.frag;\r\n frag.set(FragmentShaderComponent.ComputeBaseColor, computeSetBlendColor);\r\n frag.set(FragmentShaderComponent.AssignFragData, assignFragColor);\r\n\r\n frag.addUniform(\"u_blend_color\", VariableType.Vec4, (prog) => {\r\n prog.addGraphicUniform(\"u_blend_color\", (uniform, _params) => {\r\n scratchColor.set(0.0, 0.0, 0.0, 0.0);\r\n scratchColor.bind(uniform);\r\n });\r\n });\r\n\r\n frag.addUniform(\"u_depthTexture\", VariableType.Sampler2D, (prog) => {\r\n prog.addGraphicUniform(\"u_depthTexture\", (uniform, params) => {\r\n const geom = params.geometry as SingleTexturedViewportQuadGeometry;\r\n Texture2DHandle.bindSampler(uniform, geom.texture, TextureUnit.Zero);\r\n });\r\n });\r\n\r\n frag.addExtension(\"GL_EXT_frag_depth\");\r\n frag.set(FragmentShaderComponent.FinalizeDepth, depthFromTexture);\r\n\r\n builder.vert.headerComment = \"//!V! VolClassCopyZ\";\r\n builder.frag.headerComment = \"//!F! VolClassCopyZ\";\r\n\r\n return builder.buildProgram(context);\r\n}\r\n\r\n/** @internal */\r\nexport function createVolClassSetBlendProgram(context: WebGL2RenderingContext): ShaderProgram {\r\n const builder = createViewportQuadBuilder(true);\r\n\r\n builder.addInlineComputedVarying(\"v_texCoord\", VariableType.Vec2, computeTexCoord);\r\n\r\n const frag = builder.frag;\r\n addBoundaryTypeConstants(frag);\r\n frag.set(FragmentShaderComponent.CheckForEarlyDiscard, checkDiscardBackgroundByZ);\r\n frag.set(FragmentShaderComponent.ComputeBaseColor, computeSetBlendColor);\r\n frag.set(FragmentShaderComponent.AssignFragData, assignFragColor);\r\n\r\n frag.addUniform(\"u_boundaryType\", VariableType.Int, (prog) => {\r\n prog.addGraphicUniform(\"u_boundaryType\", (uniform, params) => {\r\n const geom = params.geometry as VolumeClassifierGeometry;\r\n uniform.setUniform1i(geom.boundaryType);\r\n });\r\n });\r\n\r\n frag.addUniform(\"u_blend_color\", VariableType.Vec4, (prog) => {\r\n prog.addGraphicUniform(\"u_blend_color\", (uniform, params) => {\r\n const geom = params.geometry as VolumeClassifierGeometry;\r\n const hiliteColor = params.target.uniforms.hilite.hiliteColor;\r\n const hiliteAlpha = params.target.uniforms.hilite.hiliteSettings.visibleRatio;\r\n switch (geom.boundaryType) {\r\n case BoundaryType.Outside:\r\n setScratchColor(params.target.activeVolumeClassifierProps!.flags.outside, hiliteColor, hiliteAlpha);\r\n break;\r\n case BoundaryType.Inside:\r\n setScratchColor(params.target.activeVolumeClassifierProps!.flags.inside, hiliteColor, hiliteAlpha);\r\n break;\r\n case BoundaryType.Selected:\r\n // setScratchColor(params.target.activeVolumeClassifierProps!.flags.selected, hiliteColor, hiliteAlpha);\r\n setScratchColor(SpatialClassifierInsideDisplay.Hilite, hiliteColor, hiliteAlpha); // option for how to display selected classifiers has been removed, always just hilite\r\n break;\r\n }\r\n scratchColor.bind(uniform);\r\n });\r\n });\r\n\r\n frag.addUniform(\"u_depthTexture\", VariableType.Sampler2D, (prog) => {\r\n prog.addGraphicUniform(\"u_depthTexture\", (uniform, params) => {\r\n const geom = params.geometry as VolumeClassifierGeometry;\r\n Texture2DHandle.bindSampler(uniform, geom.texture, TextureUnit.Zero);\r\n });\r\n });\r\n\r\n builder.vert.headerComment = \"//!V! VolClassSetBlend\";\r\n builder.frag.headerComment = \"//!F! VolClassSetBlend\";\r\n\r\n return builder.buildProgram(context);\r\n}\r\n\r\n/** @internal */\r\nexport function createVolClassBlendProgram(context: WebGL2RenderingContext): ShaderProgram {\r\n const builder = createViewportQuadBuilder(true);\r\n\r\n builder.addInlineComputedVarying(\"v_texCoord\", VariableType.Vec2, computeTexCoord);\r\n\r\n const frag = builder.frag;\r\n frag.set(FragmentShaderComponent.ComputeBaseColor, computeBlendTextureColor);\r\n frag.set(FragmentShaderComponent.AssignFragData, assignFragColor);\r\n\r\n frag.addUniform(\"u_blendTexture\", VariableType.Sampler2D, (prog) => {\r\n prog.addGraphicUniform(\"u_blendTexture\", (uniform, params) => {\r\n const geom = params.geometry as SingleTexturedViewportQuadGeometry;\r\n Texture2DHandle.bindSampler(uniform, geom.texture, TextureUnit.Zero);\r\n });\r\n });\r\n\r\n builder.vert.headerComment = \"//!V! VolClassBlend\";\r\n builder.frag.headerComment = \"//!F! VolClassBlend\";\r\n\r\n return builder.buildProgram(context);\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"CopyStencil.js","sourceRoot":"","sources":["../../../../../src/render/webgl/glsl/CopyStencil.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 { ColorDef, SpatialClassifierInsideDisplay, SpatialClassifierOutsideDisplay } from \"@itwin/core-common\";\r\nimport { BoundaryType, SingleTexturedViewportQuadGeometry, VolumeClassifierGeometry } from \"../CachedGeometry\";\r\nimport { FloatRgb, FloatRgba } from \"../FloatRGBA\";\r\nimport { TextureUnit } from \"../RenderFlags\";\r\nimport { FragmentShaderComponent, ShaderBuilder, VariableType } from \"../ShaderBuilder\";\r\nimport { ShaderProgram } from \"../ShaderProgram\";\r\nimport { Texture2DHandle } from \"../Texture\";\r\nimport { assignFragColor } from \"./Fragment\";\r\nimport { createViewportQuadBuilder } from \"./ViewportQuad\";\r\n\r\nconst computehiliteColor = \"return vec4(u_hilite_color.rgb, 1.0);\";\r\n\r\nconst computeSetBlendColor = \"return u_blend_color;\";\r\n\r\nconst computeBlendTextureColor = \"return TEXTURE(u_blendTexture, v_texCoord);\";\r\n\r\nconst computeTexCoord = \"v_texCoord = (rawPosition.xy + 1.0) * 0.5;\";\r\n\r\nconst checkDiscardBackgroundByZ = `\r\n if (u_boundaryType == kBoundaryType_Out)\r\n return TEXTURE(u_depthTexture, v_texCoord).r == 1.0;\r\n return false;\r\n`;\r\n\r\nconst depthFromTexture = \"return TEXTURE(u_depthTexture, v_texCoord).r;\";\r\n\r\nconst scratchColor = FloatRgba.fromColorDef(ColorDef.white);\r\n\r\n/** @internal */\r\nfunction addBoundaryTypeConstants(builder: ShaderBuilder): void {\r\n // NB: These are the bit positions of each flag in OvrFlags enum - not the flag values\r\n builder.addConstant(\"kBoundaryType_Out\", VariableType.Int, \"0\");\r\n builder.addConstant(\"kBoundaryType_In\", VariableType.Int, \"1\");\r\n builder.addConstant(\"kBoundaryType_Selected\", VariableType.Int, \"2\");\r\n}\r\n\r\n/** @internal */\r\nfunction setScratchColor(display: number, hilite: FloatRgb, hAlpha: number): void {\r\n switch (display) {\r\n case SpatialClassifierOutsideDisplay.Dimmed:\r\n scratchColor.set(0.0, 0.0, 0.0, 0.3);\r\n break;\r\n case SpatialClassifierOutsideDisplay.Off:\r\n scratchColor.set(0.0, 0.0, 0.0, 0.8);\r\n break;\r\n case SpatialClassifierOutsideDisplay.On:\r\n scratchColor.set(0.0, 0.0, 0.0, 0.0);\r\n break;\r\n default: // Hilite or ByElementColor (though ByElementColor should never use this shader)\r\n scratchColor.set(hilite.red, hilite.green, hilite.blue, hAlpha);\r\n break;\r\n }\r\n}\r\n\r\n/** @internal */\r\nexport function createVolClassColorUsingStencilProgram(context: WebGL2RenderingContext): ShaderProgram {\r\n const builder = createViewportQuadBuilder(false);\r\n const frag = builder.frag;\r\n frag.set(FragmentShaderComponent.ComputeBaseColor, computehiliteColor);\r\n frag.set(FragmentShaderComponent.AssignFragData, assignFragColor);\r\n frag.addUniform(\"u_hilite_color\", VariableType.Vec4, (prog) => {\r\n prog.addGraphicUniform(\"u_hilite_color\", (uniform, params) => {\r\n const useLighting = params.geometry.getFlashMode(params);\r\n if (useLighting) {\r\n const hiliteColor = params.target.uniforms.hilite.hiliteColor;\r\n scratchColor.set(hiliteColor.red, hiliteColor.green, hiliteColor.blue, 1.0);\r\n } else\r\n scratchColor.set(1.0, 1.0, 1.0, 0.0);\r\n scratchColor.bind(uniform);\r\n });\r\n });\r\n\r\n builder.vert.headerComment = \"//!V! VolClassColorUsingStencil\";\r\n builder.frag.headerComment = \"//!F! VolClassColorUsingStencil\";\r\n\r\n return builder.buildProgram(context);\r\n}\r\n\r\n/** @internal */\r\nexport function createVolClassCopyZProgram(context: WebGL2RenderingContext): ShaderProgram {\r\n const builder = createViewportQuadBuilder(true);\r\n\r\n builder.addInlineComputedVarying(\"v_texCoord\", VariableType.Vec2, computeTexCoord); // TODO: I think this is not necessary because it's already added from the create above\r\n\r\n const frag = builder.frag;\r\n frag.set(FragmentShaderComponent.ComputeBaseColor, computeSetBlendColor);\r\n frag.set(FragmentShaderComponent.AssignFragData, assignFragColor);\r\n\r\n frag.addUniform(\"u_blend_color\", VariableType.Vec4, (prog) => {\r\n prog.addGraphicUniform(\"u_blend_color\", (uniform, _params) => {\r\n scratchColor.set(0.0, 0.0, 0.0, 0.0);\r\n scratchColor.bind(uniform);\r\n });\r\n });\r\n\r\n frag.addUniform(\"u_depthTexture\", VariableType.Sampler2D, (prog) => {\r\n prog.addGraphicUniform(\"u_depthTexture\", (uniform, params) => {\r\n const geom = params.geometry as SingleTexturedViewportQuadGeometry;\r\n Texture2DHandle.bindSampler(uniform, geom.texture, TextureUnit.Zero);\r\n });\r\n });\r\n\r\n frag.set(FragmentShaderComponent.FinalizeDepth, depthFromTexture);\r\n\r\n builder.vert.headerComment = \"//!V! VolClassCopyZ\";\r\n builder.frag.headerComment = \"//!F! VolClassCopyZ\";\r\n\r\n return builder.buildProgram(context);\r\n}\r\n\r\n/** @internal */\r\nexport function createVolClassSetBlendProgram(context: WebGL2RenderingContext): ShaderProgram {\r\n const builder = createViewportQuadBuilder(true);\r\n\r\n builder.addInlineComputedVarying(\"v_texCoord\", VariableType.Vec2, computeTexCoord);\r\n\r\n const frag = builder.frag;\r\n addBoundaryTypeConstants(frag);\r\n frag.set(FragmentShaderComponent.CheckForEarlyDiscard, checkDiscardBackgroundByZ);\r\n frag.set(FragmentShaderComponent.ComputeBaseColor, computeSetBlendColor);\r\n frag.set(FragmentShaderComponent.AssignFragData, assignFragColor);\r\n\r\n frag.addUniform(\"u_boundaryType\", VariableType.Int, (prog) => {\r\n prog.addGraphicUniform(\"u_boundaryType\", (uniform, params) => {\r\n const geom = params.geometry as VolumeClassifierGeometry;\r\n uniform.setUniform1i(geom.boundaryType);\r\n });\r\n });\r\n\r\n frag.addUniform(\"u_blend_color\", VariableType.Vec4, (prog) => {\r\n prog.addGraphicUniform(\"u_blend_color\", (uniform, params) => {\r\n const geom = params.geometry as VolumeClassifierGeometry;\r\n const hiliteColor = params.target.uniforms.hilite.hiliteColor;\r\n const hiliteAlpha = params.target.uniforms.hilite.hiliteSettings.visibleRatio;\r\n switch (geom.boundaryType) {\r\n case BoundaryType.Outside:\r\n setScratchColor(params.target.activeVolumeClassifierProps!.flags.outside, hiliteColor, hiliteAlpha);\r\n break;\r\n case BoundaryType.Inside:\r\n setScratchColor(params.target.activeVolumeClassifierProps!.flags.inside, hiliteColor, hiliteAlpha);\r\n break;\r\n case BoundaryType.Selected:\r\n // setScratchColor(params.target.activeVolumeClassifierProps!.flags.selected, hiliteColor, hiliteAlpha);\r\n setScratchColor(SpatialClassifierInsideDisplay.Hilite, hiliteColor, hiliteAlpha); // option for how to display selected classifiers has been removed, always just hilite\r\n break;\r\n }\r\n scratchColor.bind(uniform);\r\n });\r\n });\r\n\r\n frag.addUniform(\"u_depthTexture\", VariableType.Sampler2D, (prog) => {\r\n prog.addGraphicUniform(\"u_depthTexture\", (uniform, params) => {\r\n const geom = params.geometry as VolumeClassifierGeometry;\r\n Texture2DHandle.bindSampler(uniform, geom.texture, TextureUnit.Zero);\r\n });\r\n });\r\n\r\n builder.vert.headerComment = \"//!V! VolClassSetBlend\";\r\n builder.frag.headerComment = \"//!F! VolClassSetBlend\";\r\n\r\n return builder.buildProgram(context);\r\n}\r\n\r\n/** @internal */\r\nexport function createVolClassBlendProgram(context: WebGL2RenderingContext): ShaderProgram {\r\n const builder = createViewportQuadBuilder(true);\r\n\r\n builder.addInlineComputedVarying(\"v_texCoord\", VariableType.Vec2, computeTexCoord);\r\n\r\n const frag = builder.frag;\r\n frag.set(FragmentShaderComponent.ComputeBaseColor, computeBlendTextureColor);\r\n frag.set(FragmentShaderComponent.AssignFragData, assignFragColor);\r\n\r\n frag.addUniform(\"u_blendTexture\", VariableType.Sampler2D, (prog) => {\r\n prog.addGraphicUniform(\"u_blendTexture\", (uniform, params) => {\r\n const geom = params.geometry as SingleTexturedViewportQuadGeometry;\r\n Texture2DHandle.bindSampler(uniform, geom.texture, TextureUnit.Zero);\r\n });\r\n });\r\n\r\n builder.vert.headerComment = \"//!V! VolClassBlend\";\r\n builder.frag.headerComment = \"//!F! VolClassBlend\";\r\n\r\n return builder.buildProgram(context);\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,EACQ,UAAU,EAAE,YAAY,EAAE,WAAW,EAAgB,UAAU,EAAE,YAAY,EAAE,cAAc,EAC3G,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,EACQ,UAAU,EAAE,YAAY,EAAE,WAAW,EAAgB,UAAU,EAAE,YAAY,EAAE,cAAc,EAC3G,MAAM,mBAAmB,CAAC;AAkR3B,gBAAgB;AAChB,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,WAAW,EAAE,UAAU,EAAE,YAAY,EAAE,OAAO,EAAE,YAAY,GAAG,cAAc,CAc5H;AAsED,gBAAgB;AAChB,eAAO,MAAM,eAAe,+SAW3B,CAAC;AAgHF,gBAAgB;AAChB,wBAAgB,eAAe,CAAC,OAAO,EAAE,cAAc,EAAE,oBAAoB,EAAE,OAAO,EAAE,gBAAgB,EAAE,OAAO,QAoBhH;AAyCD,gBAAgB;AAChB,wBAAgB,UAAU,CAAC,OAAO,EAAE,cAAc,EAAE,QAAQ,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,YAAY,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,QAsDzI;AAED,eAAO,MAAM,wBAAwB,mWAQpC,CAAC;AA+BF,gBAAgB;AAChB,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,cAAc,GAAG,cAAc,CA4G1E;AAED,wBAAgB,oCAAoC,CAAC,OAAO,EAAE,cAAc,QAgB3E"}
|
|
@@ -31,10 +31,45 @@ const Translucency_1 = require("./Translucency");
|
|
|
31
31
|
const Vertex_1 = require("./Vertex");
|
|
32
32
|
const SurfaceGeometry_1 = require("../SurfaceGeometry");
|
|
33
33
|
const Wiremesh_1 = require("./Wiremesh");
|
|
34
|
+
const core_common_1 = require("@itwin/core-common");
|
|
35
|
+
const constantLodTextureLookup = `
|
|
36
|
+
vec4 constantLodTextureLookup(sampler2D textureSampler) {
|
|
37
|
+
float logDepth = log2(v_uvCustom.z);
|
|
38
|
+
float f = fract(logDepth);
|
|
39
|
+
float p = floor(logDepth);
|
|
40
|
+
// When p changes, both tc1 and tc2 jumped by a power of 2 at that transition (and f goes from ~1 to 0).
|
|
41
|
+
// This caused a line to show up with incorrect tex coords, we believe due to a problem with the derivative
|
|
42
|
+
// that is auto calculated on the tex coords for the mip-map. The below approach attempts to "smooth"
|
|
43
|
+
// the transition of the coord in use at the transition by only changing the coord that is not in use
|
|
44
|
+
// (but by 2 powers of 2) and switching the mix selector to account for it. It does this by using whether
|
|
45
|
+
// p is odd or even to select which way it is going, so it alternates at the boundaries. This fixes the
|
|
46
|
+
// line problem.
|
|
47
|
+
float p1, p2;
|
|
48
|
+
if (0u == (uint(p) & 1u)) { // p is even
|
|
49
|
+
p1 = p;
|
|
50
|
+
p2 = p + 1.0;
|
|
51
|
+
} else { // p is odd
|
|
52
|
+
p1 = p + 1.0;
|
|
53
|
+
p2 = p;
|
|
54
|
+
f = 1.0 - f;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
vec2 tc1 = v_uvCustom.xy / clamp(pow(2.0, p1), float(u_constantLodFParams.x), float(u_constantLodFParams.y)) * u_constantLodFParams.z;
|
|
58
|
+
vec2 tc2 = v_uvCustom.xy / clamp(pow(2.0, p2), float(u_constantLodFParams.x), float(u_constantLodFParams.y)) * u_constantLodFParams.z;
|
|
59
|
+
return mix(TEXTURE(textureSampler, tc1), TEXTURE(textureSampler, tc2), f);
|
|
60
|
+
}
|
|
61
|
+
`;
|
|
34
62
|
// NB: Textures do not contain pre-multiplied alpha.
|
|
35
63
|
const sampleSurfaceTexture = `
|
|
36
64
|
vec4 sampleSurfaceTexture() {
|
|
37
|
-
|
|
65
|
+
vec4 clr;
|
|
66
|
+
if (!isSurfaceBitSet(kSurfaceBit_HasTexture))
|
|
67
|
+
clr = vec4(1.0, 1.0, 1.0, 1.0);
|
|
68
|
+
else if (u_surfaceFlags[kSurfaceBitIndex_UseConstantLodTextureMapping])
|
|
69
|
+
clr = constantLodTextureLookup(s_texture);
|
|
70
|
+
else
|
|
71
|
+
clr = TEXTURE(s_texture, v_texCoord);
|
|
72
|
+
return clr;
|
|
38
73
|
}
|
|
39
74
|
`;
|
|
40
75
|
const applyMaterialColor = `
|
|
@@ -184,6 +219,10 @@ const adjustEyeSpace = `
|
|
|
184
219
|
if (kRenderOrder_BlankingRegion == u_renderOrder)
|
|
185
220
|
v_eyeSpace.z -= blankingRegionOffset * (u_frustum.y - u_frustum.x);
|
|
186
221
|
`;
|
|
222
|
+
const computeConstantLodUvCustom = `
|
|
223
|
+
vec2 worldpos = (u_modelToWorld * vec4(rawPos.xyz, 0.0)).xy;
|
|
224
|
+
v_uvCustom = vec3((u_constantLodVParams.xy + worldpos) * vec2(1.0, -1.0), kFrustumType_Perspective == u_frustum.z ? -v_eyeSpace.z : u_constantLodVParams.z);
|
|
225
|
+
`;
|
|
187
226
|
const computePositionPostlude = `
|
|
188
227
|
return u_proj * pos;
|
|
189
228
|
`;
|
|
@@ -198,17 +237,17 @@ function createCommon(isInstanced, animated, shadowable, isHiliter, positionType
|
|
|
198
237
|
(0, SolarShadowMapping_1.addSolarShadowMap)(builder);
|
|
199
238
|
(0, Vertex_1.addProjectionMatrix)(vert);
|
|
200
239
|
(0, Vertex_1.addModelViewMatrix)(vert);
|
|
201
|
-
let computePosition;
|
|
202
|
-
if (isHiliter
|
|
203
|
-
computePosition = computePositionPrelude + computePositionPostlude;
|
|
204
|
-
}
|
|
205
|
-
else {
|
|
240
|
+
let computePosition = computePositionPrelude;
|
|
241
|
+
if (!isHiliter || System_1.System.instance.supportsLogZBuffer) {
|
|
206
242
|
(0, Common_1.addFrustum)(builder);
|
|
207
243
|
(0, FeatureSymbology_1.addRenderOrder)(builder.vert);
|
|
208
244
|
(0, FeatureSymbology_1.addRenderOrderConstants)(builder.vert);
|
|
209
245
|
builder.addVarying("v_eyeSpace", 4 /* VariableType.Vec3 */);
|
|
210
|
-
computePosition
|
|
246
|
+
computePosition += adjustEyeSpace;
|
|
211
247
|
}
|
|
248
|
+
if (!isHiliter)
|
|
249
|
+
computePosition += computeConstantLodUvCustom;
|
|
250
|
+
computePosition += computePositionPostlude;
|
|
212
251
|
vert.set(10 /* VertexShaderComponent.ComputePosition */, computePosition);
|
|
213
252
|
return builder;
|
|
214
253
|
}
|
|
@@ -243,6 +282,8 @@ function addSurfaceFlagsLookup(builder) {
|
|
|
243
282
|
builder.addConstant("kSurfaceBitIndex_OverrideRgb", 1 /* VariableType.Int */, 7 /* SurfaceBitIndex.OverrideRgb */.toString());
|
|
244
283
|
builder.addConstant("kSurfaceBitIndex_HasNormalMap", 1 /* VariableType.Int */, 8 /* SurfaceBitIndex.HasNormalMap */.toString());
|
|
245
284
|
builder.addConstant("kSurfaceBitIndex_HasMaterialAtlas", 1 /* VariableType.Int */, 9 /* SurfaceBitIndex.HasMaterialAtlas */.toString());
|
|
285
|
+
builder.addConstant("kSurfaceBitIndex_UseConstantLodTextureMapping", 1 /* VariableType.Int */, 10 /* SurfaceBitIndex.UseConstantLodTextureMapping */.toString());
|
|
286
|
+
builder.addConstant("kSurfaceBitIndex_UseConstantLodNormalMapMapping", 1 /* VariableType.Int */, 11 /* SurfaceBitIndex.UseConstantLodNormalMapMapping */.toString());
|
|
246
287
|
// Surface flags which get modified in vertex shader are still passed to fragment shader as a single float & are thus
|
|
247
288
|
// used differently there & so require different constants. Unused constants are commented out.
|
|
248
289
|
builder.addBitFlagConstant("kSurfaceBit_HasTexture", 0 /* SurfaceBitIndex.HasTexture */);
|
|
@@ -327,7 +368,11 @@ const finalizeNormalNormalMap = `
|
|
|
327
368
|
vec3 biTangent = cross (normal, tangent);
|
|
328
369
|
if (flip)
|
|
329
370
|
biTangent = -biTangent;
|
|
330
|
-
vec3 normM
|
|
371
|
+
vec3 normM;
|
|
372
|
+
if (u_surfaceFlags[kSurfaceBitIndex_UseConstantLodNormalMapMapping])
|
|
373
|
+
normM = constantLodTextureLookup(s_normalMap).xyz;
|
|
374
|
+
else
|
|
375
|
+
normM = TEXTURE(s_normalMap, v_texCoord).xyz;
|
|
331
376
|
if (length (normM) > 0.0001) { // check for empty normal texture
|
|
332
377
|
normM = (normM - 0.5) * 2.0;
|
|
333
378
|
normM = normalize (normM);
|
|
@@ -391,7 +436,7 @@ const computeBaseColor = `
|
|
|
391
436
|
surfaceColor.rgb = (u_reverseWhiteOnWhite && isAlmostWhite.r && isAlmostWhite.g && isAlmostWhite.b ? vec3(0.0, 0.0, 0.0) : surfaceColor.rgb);
|
|
392
437
|
return vec4(surfaceColor.rgb * g_surfaceTexel.rgb, g_surfaceTexel.a);
|
|
393
438
|
`;
|
|
394
|
-
const surfaceFlagArray = new Int32Array(
|
|
439
|
+
const surfaceFlagArray = new Int32Array(12 /* SurfaceBitIndex.Count */);
|
|
395
440
|
/** @internal */
|
|
396
441
|
function addSurfaceFlags(builder, withFeatureOverrides, withFeatureColor) {
|
|
397
442
|
addSurfaceFlagsLookup(builder.vert);
|
|
@@ -402,7 +447,7 @@ function addSurfaceFlags(builder, withFeatureOverrides, withFeatureColor) {
|
|
|
402
447
|
compute += returnSurfaceFlags;
|
|
403
448
|
builder.addFunctionComputedVarying("v_surfaceFlags", 2 /* VariableType.Float */, "computeSurfaceFlags", compute);
|
|
404
449
|
builder.frag.addInitializer("surfaceFlags = uint(floor(v_surfaceFlags + 0.5));");
|
|
405
|
-
builder.addUniformArray("u_surfaceFlags", 0 /* VariableType.Boolean */,
|
|
450
|
+
builder.addUniformArray("u_surfaceFlags", 0 /* VariableType.Boolean */, 12 /* SurfaceBitIndex.Count */, (prog) => {
|
|
406
451
|
prog.addGraphicUniform("u_surfaceFlags", (uniform, params) => {
|
|
407
452
|
(0, core_bentley_1.assert)(undefined !== params.geometry.asSurface);
|
|
408
453
|
const mesh = params.geometry.asSurface;
|
|
@@ -421,17 +466,19 @@ function addNormal(builder, animated) {
|
|
|
421
466
|
builder.frag.addGlobal("g_normal", 4 /* VariableType.Vec3 */);
|
|
422
467
|
let finalizeNormal = finalizeNormalPrelude;
|
|
423
468
|
finalizeNormal += finalizeNormalNormalMap;
|
|
469
|
+
builder.frag.addFunction(constantLodTextureLookup);
|
|
424
470
|
builder.frag.addUniform("u_normalMapScale", 2 /* VariableType.Float */, (prog) => {
|
|
425
471
|
prog.addGraphicUniform("u_normalMapScale", (uniform, params) => {
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
undefined !==
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
472
|
+
if (undefined !== params.geometry.materialInfo && !params.geometry.materialInfo.isAtlas) {
|
|
473
|
+
const normalMapParams = params.geometry.materialInfo.textureMapping?.normalMapParams;
|
|
474
|
+
if (undefined !== normalMapParams) {
|
|
475
|
+
let normalMapScale = 1.0;
|
|
476
|
+
normalMapScale = normalMapParams.scale ?? 1.0;
|
|
477
|
+
if (normalMapParams.greenUp)
|
|
478
|
+
normalMapScale = -normalMapScale;
|
|
479
|
+
uniform.setUniform1f(normalMapScale);
|
|
480
|
+
}
|
|
433
481
|
}
|
|
434
|
-
uniform.setUniform1f(normalMapScale);
|
|
435
482
|
});
|
|
436
483
|
});
|
|
437
484
|
finalizeNormal += finalizeNormalPostlude;
|
|
@@ -467,7 +514,6 @@ function addTexture(builder, animated, isThematic, isPointCloud, isHilite) {
|
|
|
467
514
|
}
|
|
468
515
|
});
|
|
469
516
|
});
|
|
470
|
-
builder.frag.addFunction(sampleSurfaceTexture);
|
|
471
517
|
}
|
|
472
518
|
builder.frag.addUniform("s_texture", 8 /* VariableType.Sampler2D */, (prog) => {
|
|
473
519
|
prog.addGraphicUniform("s_texture", (uniform, params) => {
|
|
@@ -547,8 +593,17 @@ function createSurfaceBuilder(flags) {
|
|
|
547
593
|
opts &= ~16 /* FeatureSymbologyOptions.Alpha */;
|
|
548
594
|
(0, PlanarClassification_1.addColorPlanarClassifier)(builder, flags.isTranslucent, flags.isThematic);
|
|
549
595
|
}
|
|
550
|
-
if (flags.isThematic)
|
|
596
|
+
if (flags.isThematic) {
|
|
551
597
|
(0, Thematic_1.addThematicDisplay)(builder);
|
|
598
|
+
}
|
|
599
|
+
else {
|
|
600
|
+
builder.vert.addUniform("u_modelToWorld", 7 /* VariableType.Mat4 */, (prog) => {
|
|
601
|
+
prog.addGraphicUniform("u_modelToWorld", (uniform, params) => {
|
|
602
|
+
if (undefined !== params.geometry.asSurface?.mesh.constantLodVParams)
|
|
603
|
+
params.target.uniforms.branch.bindModelToWorldTransform(uniform, params.geometry, false);
|
|
604
|
+
});
|
|
605
|
+
});
|
|
606
|
+
}
|
|
552
607
|
(0, FeatureSymbology_1.addFeatureSymbology)(builder, feat, opts);
|
|
553
608
|
addSurfaceFlags(builder, 2 /* FeatureMode.Overrides */ === feat, true);
|
|
554
609
|
(0, FeatureSymbology_1.addSurfaceDiscard)(builder, flags);
|
|
@@ -592,6 +647,25 @@ function createSurfaceBuilder(flags) {
|
|
|
592
647
|
(0, Fragment_1.addAltPickBufferOutputs)(builder.frag);
|
|
593
648
|
}
|
|
594
649
|
}
|
|
650
|
+
builder.addVarying("v_uvCustom", 4 /* VariableType.Vec3 */);
|
|
651
|
+
builder.vert.addUniform("u_constantLodVParams", 4 /* VariableType.Vec3 */, (prog) => {
|
|
652
|
+
prog.addGraphicUniform("u_constantLodVParams", (uniform, params) => {
|
|
653
|
+
const vParams = params.geometry.asSurface?.mesh.constantLodVParams;
|
|
654
|
+
if (undefined !== vParams) {
|
|
655
|
+
vParams[2] = params.target.planFrustum.points[core_common_1.Npc.LeftTopRear].distance(params.target.planFrustum.points[core_common_1.Npc.RightTopRear]);
|
|
656
|
+
uniform.setUniform3fv(vParams);
|
|
657
|
+
}
|
|
658
|
+
});
|
|
659
|
+
});
|
|
660
|
+
builder.frag.addUniform("u_constantLodFParams", 4 /* VariableType.Vec3 */, (prog) => {
|
|
661
|
+
prog.addGraphicUniform("u_constantLodFParams", (uniform, params) => {
|
|
662
|
+
const fParams = params.geometry.asSurface?.mesh.constantLodFParams;
|
|
663
|
+
if (undefined !== fParams)
|
|
664
|
+
uniform.setUniform3fv(fParams);
|
|
665
|
+
});
|
|
666
|
+
});
|
|
667
|
+
builder.frag.addFunction(constantLodTextureLookup);
|
|
668
|
+
builder.frag.addFunction(sampleSurfaceTexture);
|
|
595
669
|
builder.frag.addGlobal("g_surfaceTexel", 5 /* VariableType.Vec4 */);
|
|
596
670
|
builder.frag.set(1 /* FragmentShaderComponent.ComputeBaseColor */, (flags.isThematic === 0 /* IsThematic.No */) ? computeBaseColor : "return getSurfaceColor();");
|
|
597
671
|
if (flags.isClassified)
|
|
@@ -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 {\r\n FeatureMode, IsAnimated, IsClassified, IsInstanced, IsShadowable, IsThematic, PositionType, TechniqueFlags,\r\n} 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 { addChooseVec2WithBitFlagsFunction, addChooseVec3WithBitFlagFunction, 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 addChooseVec3WithBitFlagFunction(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 vert.addInitializer(\"use_material = (0u == (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, isHiliter: boolean, positionType: PositionType): ProgramBuilder {\r\n const instanced = IsInstanced.Yes === isInstanced;\r\n const attrMap = AttributeMap.findAttributeMap(TechniqueId.Surface, instanced);\r\n const builder = new ProgramBuilder(attrMap, { positionType, instanced });\r\n const vert = builder.vert;\r\n\r\n if (animated)\r\n addAnimation(vert, true);\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, posType: PositionType): ProgramBuilder {\r\n const builder = createCommon(instanced, IsAnimated.No, IsShadowable.No, true, posType);\r\n\r\n addSurfaceFlags(builder, true, false);\r\n addTexture(builder, IsAnimated.No, IsThematic.No, false, true);\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(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_HasNormalMap\", VariableType.Int, SurfaceBitIndex.HasNormalMap.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 builder.addBitFlagConstant(\"kSurfaceBit_HasNormalMap\", SurfaceBitIndex.HasNormalMap);\r\n\r\n // Only need masks for flags modified in vertex shader\r\n const suffix = \"u\";\r\n const type = VariableType.Uint;\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 builder.addConstant(\"kSurfaceMask_HasNormalMap\", type, SurfaceFlags.HasNormalMap.toString() + suffix);\r\n\r\n addExtractNthBit(builder);\r\n builder.addFunction(isSurfaceBitSet);\r\n builder.addGlobal(\"surfaceFlags\", VariableType.Uint);\r\n}\r\n\r\nconst initSurfaceFlags = `\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 surfaceFlags += u_surfaceFlags[kSurfaceBitIndex_HasNormalMap] ? kSurfaceMask_HasNormalMap : 0u;\r\n`;\r\n\r\nconst computeBaseSurfaceFlags = `\r\n if (feature_ignore_material) {\r\n if (u_surfaceFlags[kSurfaceBitIndex_HasTexture])\r\n surfaceFlags -= kSurfaceMask_HasTexture;\r\n if (u_surfaceFlags[kSurfaceBitIndex_HasNormalMap])\r\n surfaceFlags -= kSurfaceMask_HasNormalMap;\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 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\nfunction getComputeNormal(quantized: boolean): string {\r\n const a = quantized ? \"g_vertLutData3.xy\" : \"g_vertLutData4.zw\";\r\n const b = quantized ? \"g_vertLutData1.zw\" : \"g_vertLutData5.xy\";\r\n return `\r\n if (!u_surfaceFlags[kSurfaceBitIndex_HasNormals])\r\n return vec3(0.0);\r\n\r\n vec2 normal = (u_surfaceFlags[kSurfaceBitIndex_HasColorAndNormal]) ? ${a} : ${b};\r\n return normalize(MAT_NORM * octDecodeNormal(normal));\r\n`;\r\n}\r\n\r\nconst finalizeNormalPrelude = `\r\n vec3 normal = normalize(v_n) * (2.0 * float(gl_FrontFacing) - 1.0);\r\n`;\r\n\r\nconst finalizeNormalNormalMap = `\r\n if (isSurfaceBitSet(kSurfaceBit_HasNormalMap)) {\r\n // Modify the normal with the normal map texture.\r\n // First calculate the tangent.\r\n vec3 dp1 = dFdx(v_eyeSpace);\r\n vec3 dp2 = dFdy(v_eyeSpace);\r\n vec2 duv1 = dFdx(v_texCoord);\r\n vec2 duv2 = dFdy(v_texCoord);\r\n vec3 tangent = normalize(duv2.y * dp1 - duv1.y * dp2);\r\n tangent = normalize (tangent - normal * dot (normal, tangent)); // re-orthogonalize with normal\r\n bool flip = (duv1.x * duv2.y - duv2.x * duv1.y) < 0.0;\r\n if (flip)\r\n tangent = -tangent;\r\n vec3 biTangent = cross (normal, tangent);\r\n if (flip)\r\n biTangent = -biTangent;\r\n vec3 normM = TEXTURE(s_normalMap, v_texCoord).xyz;\r\n if (length (normM) > 0.0001) { // check for empty normal texture\r\n normM = (normM - 0.5) * 2.0;\r\n normM = normalize (normM);\r\n normM.x *= abs(u_normalMapScale);\r\n normM.y *= u_normalMapScale;\r\n normM = normalize (normM);\r\n normal = normalize (normM.x * tangent + normM.y * biTangent + normM.z * normal);\r\n }\r\n }\r\n`;\r\n\r\nconst finalizeNormalPostlude = `\r\n return normal;\r\n`;\r\n\r\nfunction getComputeAnimatedNormal(quantized: boolean): string {\r\n return `\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\r\n ${getComputeNormal(quantized)}`;\r\n}\r\n\r\nconst applyBackgroundColor = `\r\n return u_surfaceFlags[kSurfaceBitIndex_BackgroundFill] ? vec4(u_bgColor.rgb, baseColor.a) : baseColor;\r\n`;\r\n\r\nfunction getComputeTexCoord(quantized: boolean): string {\r\n const vertData = quantized ? \"g_vertLutData3\" : \"g_vertLutData4\";\r\n return `\r\n vec4 rgba = ${vertData};\r\n vec2 qcoords = vec2(decodeUInt16(rgba.xy), decodeUInt16(rgba.zw));\r\n return chooseVec2With2BitFlags(vec2(0.0), unquantize2d(qcoords, u_qTexCoordParams), surfaceFlags, kSurfaceBit_HasTexture, kSurfaceBit_HasNormalMap);\r\n`;\r\n}\r\n\r\nfunction getComputeAnimatedTexCoord(quantized: boolean): string {\r\n return `\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\r\n ${getComputeTexCoord(quantized)}\r\n`;\r\n}\r\n\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 = initSurfaceFlags;\r\n if (withFeatureOverrides)\r\n compute += `${withFeatureColor ? computeSurfaceFlagsWithColor : computeSurfaceFlags}\\n`;\r\n compute += returnSurfaceFlags;\r\n builder.addFunctionComputedVarying(\"v_surfaceFlags\", VariableType.Float, \"computeSurfaceFlags\", compute);\r\n\r\n builder.frag.addInitializer(\"surfaceFlags = uint(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, animated: IsAnimated) {\r\n addNormalMatrix(builder.vert);\r\n\r\n const quantized = \"quantized\" === builder.vert.positionType;\r\n builder.vert.addFunction(octDecodeNormal);\r\n builder.vert.addFunction(\"vec3 computeSurfaceNormal()\", getComputeNormal(quantized));\r\n builder.addFunctionComputedVarying(\"v_n\", VariableType.Vec3, \"computeLightingNormal\", animated ? getComputeAnimatedNormal(quantized) : \"return computeSurfaceNormal();\");\r\n builder.frag.addGlobal(\"g_normal\", VariableType.Vec3);\r\n let finalizeNormal = finalizeNormalPrelude;\r\n\r\n finalizeNormal += finalizeNormalNormalMap;\r\n builder.frag.addUniform(\"u_normalMapScale\", VariableType.Float, (prog) => {\r\n prog.addGraphicUniform(\"u_normalMapScale\", (uniform, params) => {\r\n let normalMapScale = 1.0;\r\n if (undefined !== params.geometry.materialInfo && !params.geometry.materialInfo.isAtlas &&\r\n undefined !== params.geometry.materialInfo.textureMapping &&\r\n undefined !== params.geometry.materialInfo.textureMapping.normalMapParams) {\r\n normalMapScale = params.geometry.materialInfo.textureMapping.normalMapParams.scale ?? 1.0;\r\n if (params.geometry.materialInfo.textureMapping.normalMapParams.greenUp)\r\n normalMapScale = -normalMapScale;\r\n }\r\n uniform.setUniform1f(normalMapScale);\r\n });\r\n });\r\n\r\n finalizeNormal += finalizeNormalPostlude;\r\n builder.frag.set(FragmentShaderComponent.FinalizeNormal, finalizeNormal);\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: boolean, isHilite: boolean) {\r\n if (isThematic) {\r\n builder.addInlineComputedVarying(\"v_thematicIndex\", VariableType.Float, getComputeThematicIndex(builder.vert.usesInstancedGeometry, isPointCloud, true));\r\n }\r\n\r\n // Point clouds do not need to compute texture coordinates since the only texture they use is the thematic gradient.\r\n // Surfaces now need texture coordinates even for thematic in case they have a normal map.\r\n if (!isPointCloud) {\r\n builder.vert.addFunction(unquantize2d);\r\n addChooseVec2WithBitFlagsFunction(builder.vert);\r\n const quantized = \"quantized\" === builder.vert.positionType;\r\n builder.addFunctionComputedVarying(\"v_texCoord\", VariableType.Vec2, \"computeTexCoord\", animated ? getComputeAnimatedTexCoord(quantized) : getComputeTexCoord(quantized));\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) || (surfGeom.useNormalMap(params.programParams) && !isPointCloud)) {\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 if (!isHilite && !isPointCloud) {\r\n builder.frag.addUniform(\"s_normalMap\", VariableType.Sampler2D, (prog) => {\r\n prog.addGraphicUniform(\"s_normalMap\", (uniform, params) => {\r\n const surfGeom = params.geometry.asSurface!;\r\n if (surfGeom.useNormalMap(params.programParams)) {\r\n const normalMap = surfGeom.normalMap;\r\n assert(undefined !== normalMap);\r\n normalMap.texture.bindSampler(uniform, TextureUnit.NormalMap);\r\n } else {\r\n System.instance.ensureSamplerBound(uniform, TextureUnit.NormalMap);\r\n }\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, false, flags.positionType);\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.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 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, false, false);\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"]}
|
|
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 {\r\n FeatureMode, IsAnimated, IsClassified, IsInstanced, IsShadowable, IsThematic, PositionType, TechniqueFlags,\r\n} 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 { addChooseVec2WithBitFlagsFunction, addChooseVec3WithBitFlagFunction, 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\nimport { Npc } from \"@itwin/core-common\";\r\n\r\nconst constantLodTextureLookup = `\r\nvec4 constantLodTextureLookup(sampler2D textureSampler) {\r\n float logDepth = log2(v_uvCustom.z);\r\n float f = fract(logDepth);\r\n float p = floor(logDepth);\r\n // When p changes, both tc1 and tc2 jumped by a power of 2 at that transition (and f goes from ~1 to 0).\r\n // This caused a line to show up with incorrect tex coords, we believe due to a problem with the derivative\r\n // that is auto calculated on the tex coords for the mip-map. The below approach attempts to \"smooth\"\r\n // the transition of the coord in use at the transition by only changing the coord that is not in use\r\n // (but by 2 powers of 2) and switching the mix selector to account for it. It does this by using whether\r\n // p is odd or even to select which way it is going, so it alternates at the boundaries. This fixes the\r\n // line problem.\r\n float p1, p2;\r\n if (0u == (uint(p) & 1u)) { // p is even\r\n p1 = p;\r\n p2 = p + 1.0;\r\n } else { // p is odd\r\n p1 = p + 1.0;\r\n p2 = p;\r\n f = 1.0 - f;\r\n }\r\n\r\n vec2 tc1 = v_uvCustom.xy / clamp(pow(2.0, p1), float(u_constantLodFParams.x), float(u_constantLodFParams.y)) * u_constantLodFParams.z;\r\n vec2 tc2 = v_uvCustom.xy / clamp(pow(2.0, p2), float(u_constantLodFParams.x), float(u_constantLodFParams.y)) * u_constantLodFParams.z;\r\n return mix(TEXTURE(textureSampler, tc1), TEXTURE(textureSampler, tc2), f);\r\n}\r\n`;\r\n\r\n// NB: Textures do not contain pre-multiplied alpha.\r\nconst sampleSurfaceTexture = `\r\nvec4 sampleSurfaceTexture() {\r\n vec4 clr;\r\n if (!isSurfaceBitSet(kSurfaceBit_HasTexture))\r\n clr = vec4(1.0, 1.0, 1.0, 1.0);\r\n else if (u_surfaceFlags[kSurfaceBitIndex_UseConstantLodTextureMapping])\r\n clr = constantLodTextureLookup(s_texture);\r\n else\r\n clr = TEXTURE(s_texture, v_texCoord);\r\n return clr;\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 addChooseVec3WithBitFlagFunction(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 vert.addInitializer(\"use_material = (0u == (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 computeConstantLodUvCustom = `\r\n vec2 worldpos = (u_modelToWorld * vec4(rawPos.xyz, 0.0)).xy;\r\n v_uvCustom = vec3((u_constantLodVParams.xy + worldpos) * vec2(1.0, -1.0), kFrustumType_Perspective == u_frustum.z ? -v_eyeSpace.z : u_constantLodVParams.z);\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, isHiliter: boolean, positionType: PositionType): ProgramBuilder {\r\n const instanced = IsInstanced.Yes === isInstanced;\r\n const attrMap = AttributeMap.findAttributeMap(TechniqueId.Surface, instanced);\r\n const builder = new ProgramBuilder(attrMap, { positionType, instanced });\r\n const vert = builder.vert;\r\n\r\n if (animated)\r\n addAnimation(vert, true);\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 = computePositionPrelude;\r\n if (!isHiliter || System.instance.supportsLogZBuffer) {\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 += adjustEyeSpace;\r\n }\r\n if (!isHiliter)\r\n computePosition += computeConstantLodUvCustom;\r\n computePosition += computePositionPostlude;\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, posType: PositionType): ProgramBuilder {\r\n const builder = createCommon(instanced, IsAnimated.No, IsShadowable.No, true, posType);\r\n\r\n addSurfaceFlags(builder, true, false);\r\n addTexture(builder, IsAnimated.No, IsThematic.No, false, true);\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(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_HasNormalMap\", VariableType.Int, SurfaceBitIndex.HasNormalMap.toString());\r\n builder.addConstant(\"kSurfaceBitIndex_HasMaterialAtlas\", VariableType.Int, SurfaceBitIndex.HasMaterialAtlas.toString());\r\n builder.addConstant(\"kSurfaceBitIndex_UseConstantLodTextureMapping\", VariableType.Int, SurfaceBitIndex.UseConstantLodTextureMapping.toString());\r\n builder.addConstant(\"kSurfaceBitIndex_UseConstantLodNormalMapMapping\", VariableType.Int, SurfaceBitIndex.UseConstantLodNormalMapMapping.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 builder.addBitFlagConstant(\"kSurfaceBit_HasNormalMap\", SurfaceBitIndex.HasNormalMap);\r\n\r\n // Only need masks for flags modified in vertex shader\r\n const suffix = \"u\";\r\n const type = VariableType.Uint;\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 builder.addConstant(\"kSurfaceMask_HasNormalMap\", type, SurfaceFlags.HasNormalMap.toString() + suffix);\r\n\r\n addExtractNthBit(builder);\r\n builder.addFunction(isSurfaceBitSet);\r\n builder.addGlobal(\"surfaceFlags\", VariableType.Uint);\r\n}\r\n\r\nconst initSurfaceFlags = `\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 surfaceFlags += u_surfaceFlags[kSurfaceBitIndex_HasNormalMap] ? kSurfaceMask_HasNormalMap : 0u;\r\n`;\r\n\r\nconst computeBaseSurfaceFlags = `\r\n if (feature_ignore_material) {\r\n if (u_surfaceFlags[kSurfaceBitIndex_HasTexture])\r\n surfaceFlags -= kSurfaceMask_HasTexture;\r\n if (u_surfaceFlags[kSurfaceBitIndex_HasNormalMap])\r\n surfaceFlags -= kSurfaceMask_HasNormalMap;\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 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\nfunction getComputeNormal(quantized: boolean): string {\r\n const a = quantized ? \"g_vertLutData3.xy\" : \"g_vertLutData4.zw\";\r\n const b = quantized ? \"g_vertLutData1.zw\" : \"g_vertLutData5.xy\";\r\n return `\r\n if (!u_surfaceFlags[kSurfaceBitIndex_HasNormals])\r\n return vec3(0.0);\r\n\r\n vec2 normal = (u_surfaceFlags[kSurfaceBitIndex_HasColorAndNormal]) ? ${a} : ${b};\r\n return normalize(MAT_NORM * octDecodeNormal(normal));\r\n`;\r\n}\r\n\r\nconst finalizeNormalPrelude = `\r\n vec3 normal = normalize(v_n) * (2.0 * float(gl_FrontFacing) - 1.0);\r\n`;\r\n\r\nconst finalizeNormalNormalMap = `\r\n if (isSurfaceBitSet(kSurfaceBit_HasNormalMap)) {\r\n // Modify the normal with the normal map texture.\r\n // First calculate the tangent.\r\n vec3 dp1 = dFdx(v_eyeSpace);\r\n vec3 dp2 = dFdy(v_eyeSpace);\r\n vec2 duv1 = dFdx(v_texCoord);\r\n vec2 duv2 = dFdy(v_texCoord);\r\n vec3 tangent = normalize(duv2.y * dp1 - duv1.y * dp2);\r\n tangent = normalize (tangent - normal * dot (normal, tangent)); // re-orthogonalize with normal\r\n bool flip = (duv1.x * duv2.y - duv2.x * duv1.y) < 0.0;\r\n if (flip)\r\n tangent = -tangent;\r\n vec3 biTangent = cross (normal, tangent);\r\n if (flip)\r\n biTangent = -biTangent;\r\n vec3 normM;\r\n if (u_surfaceFlags[kSurfaceBitIndex_UseConstantLodNormalMapMapping])\r\n normM = constantLodTextureLookup(s_normalMap).xyz;\r\n else\r\n normM = TEXTURE(s_normalMap, v_texCoord).xyz;\r\n if (length (normM) > 0.0001) { // check for empty normal texture\r\n normM = (normM - 0.5) * 2.0;\r\n normM = normalize (normM);\r\n normM.x *= abs(u_normalMapScale);\r\n normM.y *= u_normalMapScale;\r\n normM = normalize (normM);\r\n normal = normalize (normM.x * tangent + normM.y * biTangent + normM.z * normal);\r\n }\r\n }\r\n`;\r\n\r\nconst finalizeNormalPostlude = `\r\n return normal;\r\n`;\r\n\r\nfunction getComputeAnimatedNormal(quantized: boolean): string {\r\n return `\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\r\n ${getComputeNormal(quantized)}`;\r\n}\r\n\r\nconst applyBackgroundColor = `\r\n return u_surfaceFlags[kSurfaceBitIndex_BackgroundFill] ? vec4(u_bgColor.rgb, baseColor.a) : baseColor;\r\n`;\r\n\r\nfunction getComputeTexCoord(quantized: boolean): string {\r\n const vertData = quantized ? \"g_vertLutData3\" : \"g_vertLutData4\";\r\n return `\r\n vec4 rgba = ${vertData};\r\n vec2 qcoords = vec2(decodeUInt16(rgba.xy), decodeUInt16(rgba.zw));\r\n return chooseVec2With2BitFlags(vec2(0.0), unquantize2d(qcoords, u_qTexCoordParams), surfaceFlags, kSurfaceBit_HasTexture, kSurfaceBit_HasNormalMap);\r\n`;\r\n}\r\n\r\nfunction getComputeAnimatedTexCoord(quantized: boolean): string {\r\n return `\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\r\n ${getComputeTexCoord(quantized)}\r\n`;\r\n}\r\n\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 = initSurfaceFlags;\r\n if (withFeatureOverrides)\r\n compute += `${withFeatureColor ? computeSurfaceFlagsWithColor : computeSurfaceFlags}\\n`;\r\n compute += returnSurfaceFlags;\r\n builder.addFunctionComputedVarying(\"v_surfaceFlags\", VariableType.Float, \"computeSurfaceFlags\", compute);\r\n\r\n builder.frag.addInitializer(\"surfaceFlags = uint(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, animated: IsAnimated) {\r\n addNormalMatrix(builder.vert);\r\n\r\n const quantized = \"quantized\" === builder.vert.positionType;\r\n builder.vert.addFunction(octDecodeNormal);\r\n builder.vert.addFunction(\"vec3 computeSurfaceNormal()\", getComputeNormal(quantized));\r\n builder.addFunctionComputedVarying(\"v_n\", VariableType.Vec3, \"computeLightingNormal\", animated ? getComputeAnimatedNormal(quantized) : \"return computeSurfaceNormal();\");\r\n builder.frag.addGlobal(\"g_normal\", VariableType.Vec3);\r\n let finalizeNormal = finalizeNormalPrelude;\r\n\r\n finalizeNormal += finalizeNormalNormalMap;\r\n builder.frag.addFunction(constantLodTextureLookup);\r\n builder.frag.addUniform(\"u_normalMapScale\", VariableType.Float, (prog) => {\r\n prog.addGraphicUniform(\"u_normalMapScale\", (uniform, params) => {\r\n if (undefined !== params.geometry.materialInfo && !params.geometry.materialInfo.isAtlas) {\r\n const normalMapParams = params.geometry.materialInfo.textureMapping?.normalMapParams;\r\n if (undefined !== normalMapParams) {\r\n let normalMapScale = 1.0;\r\n normalMapScale = normalMapParams.scale ?? 1.0;\r\n if (normalMapParams.greenUp)\r\n normalMapScale = -normalMapScale;\r\n uniform.setUniform1f(normalMapScale);\r\n }\r\n }\r\n });\r\n });\r\n\r\n finalizeNormal += finalizeNormalPostlude;\r\n builder.frag.set(FragmentShaderComponent.FinalizeNormal, finalizeNormal);\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: boolean, isHilite: boolean) {\r\n if (isThematic) {\r\n builder.addInlineComputedVarying(\"v_thematicIndex\", VariableType.Float, getComputeThematicIndex(builder.vert.usesInstancedGeometry, isPointCloud, true));\r\n }\r\n\r\n // Point clouds do not need to compute texture coordinates since the only texture they use is the thematic gradient.\r\n // Surfaces now need texture coordinates even for thematic in case they have a normal map.\r\n if (!isPointCloud) {\r\n builder.vert.addFunction(unquantize2d);\r\n addChooseVec2WithBitFlagsFunction(builder.vert);\r\n const quantized = \"quantized\" === builder.vert.positionType;\r\n builder.addFunctionComputedVarying(\"v_texCoord\", VariableType.Vec2, \"computeTexCoord\", animated ? getComputeAnimatedTexCoord(quantized) : getComputeTexCoord(quantized));\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) || (surfGeom.useNormalMap(params.programParams) && !isPointCloud)) {\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 }\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 if (!isHilite && !isPointCloud) {\r\n builder.frag.addUniform(\"s_normalMap\", VariableType.Sampler2D, (prog) => {\r\n prog.addGraphicUniform(\"s_normalMap\", (uniform, params) => {\r\n const surfGeom = params.geometry.asSurface!;\r\n if (surfGeom.useNormalMap(params.programParams)) {\r\n const normalMap = surfGeom.normalMap;\r\n assert(undefined !== normalMap);\r\n normalMap.texture.bindSampler(uniform, TextureUnit.NormalMap);\r\n } else {\r\n System.instance.ensureSamplerBound(uniform, TextureUnit.NormalMap);\r\n }\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, false, flags.positionType);\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 } else {\r\n builder.vert.addUniform(\"u_modelToWorld\", VariableType.Mat4, (prog) => {\r\n prog.addGraphicUniform(\"u_modelToWorld\", (uniform, params) => {\r\n if (undefined !== params.geometry.asSurface?.mesh.constantLodVParams)\r\n params.target.uniforms.branch.bindModelToWorldTransform(uniform, params.geometry, false);\r\n });\r\n });\r\n }\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.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 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, false, false);\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.addVarying(\"v_uvCustom\", VariableType.Vec3);\r\n\r\n builder.vert.addUniform(\"u_constantLodVParams\", VariableType.Vec3, (prog) => {\r\n prog.addGraphicUniform(\"u_constantLodVParams\", (uniform, params) => {\r\n const vParams = params.geometry.asSurface?.mesh.constantLodVParams;\r\n if (undefined !== vParams) {\r\n vParams[2] = params.target.planFrustum.points[Npc.LeftTopRear].distance(params.target.planFrustum.points[Npc.RightTopRear]);\r\n uniform.setUniform3fv(vParams);\r\n }\r\n });\r\n });\r\n\r\n builder.frag.addUniform(\"u_constantLodFParams\", VariableType.Vec3, (prog) => {\r\n prog.addGraphicUniform(\"u_constantLodFParams\", (uniform, params) => {\r\n const fParams = params.geometry.asSurface?.mesh.constantLodFParams;\r\n if (undefined !== fParams)\r\n uniform.setUniform3fv(fParams);\r\n });\r\n });\r\n builder.frag.addFunction(constantLodTextureLookup);\r\n builder.frag.addFunction(sampleSurfaceTexture);\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"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Vertex.d.ts","sourceRoot":"","sources":["../../../../../src/render/webgl/glsl/Vertex.ts"],"names":[],"mappings":"AAIA;;GAEG;AAQH,OAAO,EAAgB,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAUrE,gBAAgB;AAChB,eAAO,MAAM,kBAAkB,+GAE9B,CAAC;AAiCF,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,mBAAmB,GAAG,IAAI,CAEjE;
|
|
1
|
+
{"version":3,"file":"Vertex.d.ts","sourceRoot":"","sources":["../../../../../src/render/webgl/glsl/Vertex.ts"],"names":[],"mappings":"AAIA;;GAEG;AAQH,OAAO,EAAgB,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAUrE,gBAAgB;AAChB,eAAO,MAAM,kBAAkB,+GAE9B,CAAC;AAiCF,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,mBAAmB,GAAG,IAAI,CAEjE;AAgCD,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;AAQD,gBAAgB;AAChB,wBAAgB,eAAe,CAAC,IAAI,EAAE,mBAAmB,QAUxD;AA8ED,gBAAgB;AAChB,wBAAgB,WAAW,CAAC,IAAI,EAAE,mBAAmB,EAAE,OAAO,EAAE,OAAO,QAsBtE;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"}
|
|
@@ -53,33 +53,31 @@ function addSamplePosition(vert) {
|
|
|
53
53
|
vert.addFunction(getSamplePosition(vert.positionType));
|
|
54
54
|
}
|
|
55
55
|
exports.addSamplePosition = addSamplePosition;
|
|
56
|
+
const getSamplePositionPrelude = `
|
|
57
|
+
vec4 samplePosition(float index) {
|
|
58
|
+
vec2 tc = compute_vert_coords(index);`;
|
|
59
|
+
const getSamplePositionQuantizedPostlude = `
|
|
60
|
+
vec4 e0 = floor(TEXTURE(u_vertLUT, tc) * 255.0 + 0.5);
|
|
61
|
+
tc.x += g_vert_stepX;
|
|
62
|
+
vec4 e1 = floor(TEXTURE(u_vertLUT, tc) * 255.0 + 0.5);
|
|
63
|
+
vec3 qpos = vec3(decodeUInt16(e0.xy), decodeUInt16(e0.zw), decodeUInt16(e1.xy));
|
|
64
|
+
return unquantizePosition(qpos, u_qOrigin, u_qScale);
|
|
65
|
+
}
|
|
66
|
+
`;
|
|
67
|
+
const getSamplePositionUnquantizedPostlude = `
|
|
68
|
+
uvec3 vux = uvec3(floor(TEXTURE(u_vertLUT, tc).xyz * 255.0 + 0.5));
|
|
69
|
+
tc.x += g_vert_stepX;
|
|
70
|
+
uvec3 vuy = uvec3(floor(TEXTURE(u_vertLUT, tc).xyz * 255.0 + 0.5));
|
|
71
|
+
tc.x += g_vert_stepX;
|
|
72
|
+
uvec3 vuz = uvec3(floor(TEXTURE(u_vertLUT, tc).xyz * 255.0 + 0.5));
|
|
73
|
+
tc.x += g_vert_stepX;
|
|
74
|
+
uvec3 vuw = uvec3(floor(TEXTURE(u_vertLUT, tc).xyz * 255.0 + 0.5));
|
|
75
|
+
uvec3 u = (vuw << 24) | (vuz << 16) | (vuy << 8) | vux;
|
|
76
|
+
return vec4(uintBitsToFloat(u), 1.0);
|
|
77
|
+
}
|
|
78
|
+
`;
|
|
56
79
|
function getSamplePosition(type) {
|
|
57
|
-
|
|
58
|
-
vec4 samplePosition(float index) {
|
|
59
|
-
vec2 tc = compute_vert_coords(index);`;
|
|
60
|
-
if ("quantized" === type) {
|
|
61
|
-
return `
|
|
62
|
-
${prelude}
|
|
63
|
-
vec4 e0 = floor(TEXTURE(u_vertLUT, tc) * 255.0 + 0.5);
|
|
64
|
-
tc.x += g_vert_stepX;
|
|
65
|
-
vec4 e1 = floor(TEXTURE(u_vertLUT, tc) * 255.0 + 0.5);
|
|
66
|
-
vec3 qpos = vec3(decodeUInt16(e0.xy), decodeUInt16(e0.zw), decodeUInt16(e1.xy));
|
|
67
|
-
return unquantizePosition(qpos, u_qOrigin, u_qScale);
|
|
68
|
-
}
|
|
69
|
-
`;
|
|
70
|
-
}
|
|
71
|
-
return `
|
|
72
|
-
${prelude}
|
|
73
|
-
uvec3 vux = uvec3(floor(TEXTURE(u_vertLUT, tc).xyz * 255.0 + 0.5));
|
|
74
|
-
tc.x += g_vert_stepX;
|
|
75
|
-
uvec3 vuy = uvec3(floor(TEXTURE(u_vertLUT, tc).xyz * 255.0 + 0.5));
|
|
76
|
-
tc.x += g_vert_stepX;
|
|
77
|
-
uvec3 vuz = uvec3(floor(TEXTURE(u_vertLUT, tc).xyz * 255.0 + 0.5));
|
|
78
|
-
tc.x += g_vert_stepX;
|
|
79
|
-
uvec3 vuw = uvec3(floor(TEXTURE(u_vertLUT, tc).xyz * 255.0 + 0.5));
|
|
80
|
-
uvec3 u = (vuw << 24) | (vuz << 16) | (vuy << 8) | vux;
|
|
81
|
-
return vec4(uintBitsToFloat(u), 1.0);
|
|
82
|
-
}`;
|
|
80
|
+
return `${getSamplePositionPrelude}${"quantized" === type ? getSamplePositionQuantizedPostlude : getSamplePositionUnquantizedPostlude}`;
|
|
83
81
|
}
|
|
84
82
|
/** @internal */
|
|
85
83
|
function addModelViewProjectionMatrix(vert) {
|