@arcgis/core 5.2.0-next.85 → 5.2.0-next.87

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.
Files changed (127) hide show
  1. package/assets/esri/core/workers/RemoteClient.js +1 -1
  2. package/assets/esri/core/workers/chunks/0993e51d3a9701ed2198.js +1 -0
  3. package/assets/esri/core/workers/chunks/114ba901fd319ce87dc6.js +1 -0
  4. package/assets/esri/core/workers/chunks/{3aeb934ebdab1d8c4608.js → 12a3b55195ce3244259d.js} +1 -1
  5. package/assets/esri/core/workers/chunks/{7c3d46201b11a45f79d0.js → 39c0a3eb6a870953d530.js} +74 -107
  6. package/assets/esri/core/workers/chunks/3b009c05eaec5a7048a8.js +1 -0
  7. package/assets/esri/core/workers/chunks/3b376318df4ff8519370.js +1 -0
  8. package/assets/esri/core/workers/chunks/{a0da026a06de379b8f39.js → 3de20165796fa4f76728.js} +1 -1
  9. package/assets/esri/core/workers/chunks/414093fa4957d17bf551.js +1 -0
  10. package/assets/esri/core/workers/chunks/{4ec306e5c11808b96e07.js → 48b31b8534e7bfe42976.js} +1 -1
  11. package/assets/esri/core/workers/chunks/48f6af09436723f2d861.js +1 -0
  12. package/assets/esri/core/workers/chunks/5536cee0dfc183584a9b.js +1 -0
  13. package/assets/esri/core/workers/chunks/6561c01c67db1f4c546e.js +1 -0
  14. package/assets/esri/core/workers/chunks/68705692335d57522030.js +1 -0
  15. package/assets/esri/core/workers/chunks/{ed5e9718c4dcad1156f7.js → 6f2a9259240769c7cd6e.js} +1 -1
  16. package/assets/esri/core/workers/chunks/7b2174b19d06c16715f0.js +1 -0
  17. package/assets/esri/core/workers/chunks/{b015b8c7a073dbc4a3ad.js → 820c530b8765ecb1f36e.js} +1 -1
  18. package/assets/esri/core/workers/chunks/830daaca32352da6eebe.js +1 -0
  19. package/assets/esri/core/workers/chunks/8c2921081ca3e7fd0385.js +1 -0
  20. package/assets/esri/core/workers/chunks/91496f5a9fd8ae197d3f.js +1 -0
  21. package/assets/esri/core/workers/chunks/9407db0584c730591161.js +1 -0
  22. package/assets/esri/core/workers/chunks/9658b46a7111cda53b0d.js +1 -0
  23. package/assets/esri/core/workers/chunks/974bcaf2a059b8cfb153.js +1 -0
  24. package/assets/esri/core/workers/chunks/9c7fc1c97125ea2a7b7e.js +1 -0
  25. package/assets/esri/core/workers/chunks/9ee6e8a6b9bfda758c21.js +1 -0
  26. package/assets/esri/core/workers/chunks/b3c518ca8679fbe16ece.js +1 -0
  27. package/assets/esri/core/workers/chunks/b61b7005edd9ced925e9.js +1 -0
  28. package/assets/esri/core/workers/chunks/bfdb332c155a39028c9d.js +1 -0
  29. package/assets/esri/core/workers/chunks/c1a7c475ce0c59ffa75a.js +1 -0
  30. package/assets/esri/core/workers/chunks/{3da39efc5f68f15c105f.js → c2b2942456f1b10d0e96.js} +1 -1
  31. package/assets/esri/core/workers/chunks/c5dc2743c7116d0bc0d8.js +1 -0
  32. package/assets/esri/core/workers/chunks/c68cc3b9c170b8de22dc.js +1 -0
  33. package/assets/esri/core/workers/chunks/d56603e1d0031f3c5f3b.js +1 -0
  34. package/assets/esri/core/workers/chunks/e474106292834633e7d4.js +1 -0
  35. package/assets/esri/core/workers/chunks/{d09491b340af3b779505.js → f988d5a6dcc15fe34797.js} +1 -1
  36. package/assets/esri/core/workers/chunks/fbd02e8277fe2252ecd2.js +1 -0
  37. package/assets/esri/rest/knowledgeGraph/wasmInterface/arcgis-knowledge-client-core-simd.wasm +0 -0
  38. package/assets/esri/rest/knowledgeGraph/wasmInterface/arcgis-knowledge-client-core.wasm +0 -0
  39. package/assets/esri/themes/base/widgets/_BuildingDisciplinesTree.scss +1 -1
  40. package/assets/esri/themes/base/widgets/_Daylight.scss +2 -2
  41. package/assets/esri/themes/base/widgets/_Editor.scss +1 -1
  42. package/assets/esri/themes/base/widgets/_Sketch.scss +1 -1
  43. package/assets/esri/themes/base/widgets/_SketchTooltipControls.scss +1 -1
  44. package/assets/esri/themes/base/widgets/_Slider.scss +1 -1
  45. package/assets/esri/themes/base/widgets/_SnappingControls.scss +1 -1
  46. package/assets/esri/themes/base/widgets/_TimezonePicker.scss +1 -1
  47. package/chunks/EmissionComposite.glsl.js +2 -2
  48. package/chunks/GlobalIllumination.glsl.js +69 -102
  49. package/chunks/RibbonLine.glsl.js +202 -141
  50. package/chunks/arcgis-knowledge-client-core-simd.js +1 -1
  51. package/chunks/arcgis-knowledge-client-core.js +1 -1
  52. package/config.js +1 -1
  53. package/core/libs/gl-matrix-2/math/vec3.js +1 -1
  54. package/geometry/operators/projectOperator.d.ts +1 -1
  55. package/geometry/operators/shapePreservingProjectOperator.d.ts +15 -1
  56. package/geometry/operators/support/GeographicTransformation.d.ts +4 -3
  57. package/geometry/operators/support/GeographicTransformationStep.d.ts +2 -1
  58. package/geometry/operators/support/geographicTransformationUtils.d.ts +22 -15
  59. package/geometry/operators/types.d.ts +2 -1
  60. package/geometry/support/convexPolyhedron.js +2 -0
  61. package/geometry/support/frustum.js +1 -1
  62. package/kernel.js +1 -1
  63. package/layers/LinkChartLayer.js +1 -1
  64. package/layers/support/mediaUtils.js +1 -1
  65. package/package.json +3 -3
  66. package/popup/FeatureContentCollection.js +1 -1
  67. package/support/actions/ActionBase.d.ts +1 -1
  68. package/support/revision.js +1 -1
  69. package/views/2d/engine/webgl/shaderGraph/techniques/labels/LabelMeshWriter.js +1 -1
  70. package/views/3d/layers/graphics/Graphics3DExtrudeSymbolLayer.js +1 -1
  71. package/views/3d/layers/graphics/Graphics3DLineCalloutSymbolLayer.js +1 -1
  72. package/views/3d/layers/graphics/Graphics3DMeshFillSymbolLayer.js +1 -1
  73. package/views/3d/layers/graphics/polygonUtils.js +1 -1
  74. package/views/3d/layers/support/FeatureTileVisibility3D.js +1 -1
  75. package/views/3d/layers/support/HeatmapFeatureProcessor.js +1 -1
  76. package/views/3d/state/utils/navigationUtils.js +1 -1
  77. package/views/3d/state/utils/ropePullUtils.js +2 -0
  78. package/views/3d/support/ElevationAgnosticVisibility.js +2 -0
  79. package/views/3d/support/engineContent/line.js +1 -1
  80. package/views/3d/support/sphericalTileUtils.js +2 -0
  81. package/views/3d/webgl-engine/core/shaderLibrary/util/GaussianSplatCovariance.glsl.js +9 -3
  82. package/views/3d/webgl-engine/core/shaderLibrary/util/GaussianSplatEvaluation.glsl.js +5 -8
  83. package/views/3d/webgl-engine/lib/Geometry.js +1 -1
  84. package/views/3d/webgl-engine/lib/GeometryUtil.js +1 -1
  85. package/views/3d/webgl-engine/lib/GridLocalOriginFactory.js +1 -1
  86. package/views/3d/webgl-engine/lib/Material.js +1 -1
  87. package/views/3d/webgl-engine/lib/PathGeometry.js +1 -1
  88. package/views/3d/webgl-engine/lib/RayIntersections.js +1 -1
  89. package/views/3d/webgl-engine/lib/RenderGeometry.js +1 -1
  90. package/views/3d/webgl-engine/lib/screenPolygonTriangleIntersections.js +1 -1
  91. package/views/3d/webgl-engine/materials/HUDMaterial.js +1 -1
  92. package/views/3d/webgl-engine/materials/HeatmapDensityMaterial.js +1 -1
  93. package/views/3d/webgl-engine/materials/LineCalloutMaterial.js +1 -1
  94. package/views/3d/webgl-engine/materials/LineMarkerMaterial.js +1 -1
  95. package/views/3d/webgl-engine/materials/MeasurementArrowMaterial.js +1 -1
  96. package/views/3d/webgl-engine/materials/NativeLineMaterial.js +1 -1
  97. package/views/3d/webgl-engine/materials/RibbonLineMaterial.js +1 -1
  98. package/views/3d/webgl-engine/shaders/GaussianSplatPass.glsl.js +39 -51
  99. package/views/3d/webgl-engine/shaders/RibbonLine.glsl.js +1 -1
  100. package/views/popupAdapter.js +1 -1
  101. package/assets/esri/core/workers/chunks/05acc17cb66fa6c08845.js +0 -1
  102. package/assets/esri/core/workers/chunks/11224af8b037ccbf252c.js +0 -1
  103. package/assets/esri/core/workers/chunks/17a10916114754f1f216.js +0 -1
  104. package/assets/esri/core/workers/chunks/1b4e050a3884fc6fa6cf.js +0 -1
  105. package/assets/esri/core/workers/chunks/2f652b330a9978a68e83.js +0 -1
  106. package/assets/esri/core/workers/chunks/33d6ca59eeb88e739c81.js +0 -1
  107. package/assets/esri/core/workers/chunks/3cecf627827f5d9213a9.js +0 -1
  108. package/assets/esri/core/workers/chunks/40ec85b7813a396ee490.js +0 -1
  109. package/assets/esri/core/workers/chunks/4e94793aab42ebd251ca.js +0 -1
  110. package/assets/esri/core/workers/chunks/5903dceb172897e5675b.js +0 -1
  111. package/assets/esri/core/workers/chunks/5e5a05abcb41915802f6.js +0 -1
  112. package/assets/esri/core/workers/chunks/62f37d1075390a177ae9.js +0 -1
  113. package/assets/esri/core/workers/chunks/73cb944b87ffce33bb49.js +0 -1
  114. package/assets/esri/core/workers/chunks/86de2d1f13915ab7a51d.js +0 -1
  115. package/assets/esri/core/workers/chunks/9b5e890fb0ab29f3a3f1.js +0 -1
  116. package/assets/esri/core/workers/chunks/a183b77854f5b42c1a86.js +0 -1
  117. package/assets/esri/core/workers/chunks/ad29b77843a7d93d9f8a.js +0 -1
  118. package/assets/esri/core/workers/chunks/b812f817c465c64e8c63.js +0 -1
  119. package/assets/esri/core/workers/chunks/b94b36581842749863f0.js +0 -1
  120. package/assets/esri/core/workers/chunks/bc6e488f5fbd50f9f3d0.js +0 -1
  121. package/assets/esri/core/workers/chunks/c229325f41f10fe7f732.js +0 -1
  122. package/assets/esri/core/workers/chunks/ca6652c6304ad0e37e8f.js +0 -1
  123. package/assets/esri/core/workers/chunks/d4d2a0d882fef463e7bc.js +0 -1
  124. package/assets/esri/core/workers/chunks/da45d9576b8d66131623.js +0 -1
  125. package/assets/esri/core/workers/chunks/e76662562e03eef52ba4.js +0 -1
  126. package/assets/esri/core/workers/chunks/f1d0208c6b09c1c4b248.js +0 -1
  127. package/assets/esri/core/workers/chunks/f3680b71d496839de72c.js +0 -1
@@ -1,7 +1,7 @@
1
1
  /* COPYRIGHT Esri - https://js.arcgis.com/5.2/LICENSE.txt */
2
- import{SliceDraw as e}from"../views/3d/webgl-engine/core/shaderLibrary/Slice.glsl.js";import{RibbonVertexPosition as t}from"../views/3d/webgl-engine/core/shaderLibrary/attributes/RibbonVertexPosition.glsl.js";import{LineStipple as i,computePixelSize as n}from"../views/3d/webgl-engine/core/shaderLibrary/shading/LineStipple.glsl.js";import{MarkerSizing as r}from"../views/3d/webgl-engine/core/shaderLibrary/shading/MarkerSizing.glsl.js";import{PiUtils as o}from"../views/3d/webgl-engine/core/shaderLibrary/shading/PiUtils.glsl.js";import{positionOutsideClipSpace as a}from"../views/3d/webgl-engine/core/shaderLibrary/shading/PositionOutsideClipSpace.js";import{ColorConversion as s}from"../views/3d/webgl-engine/core/shaderLibrary/util/ColorConversion.glsl.js";import{NoPerspectiveWrite as l,NoPerspectiveRead as d}from"../views/3d/webgl-engine/core/shaderLibrary/util/NoPerspective.glsl.js";import{addProjViewLocalOrigin as c,addPixelRatio as p}from"../views/3d/webgl-engine/core/shaderLibrary/util/View.glsl.js";import{Float2BindUniform as m}from"../views/3d/webgl-engine/core/shaderModules/Float2BindUniform.js";import{Float4BindUniform as v}from"../views/3d/webgl-engine/core/shaderModules/Float4BindUniform.js";import{Float4PassUniform as g}from"../views/3d/webgl-engine/core/shaderModules/Float4PassUniform.js";import{FloatBindUniform as f}from"../views/3d/webgl-engine/core/shaderModules/FloatBindUniform.js";import{FloatPassUniform as h}from"../views/3d/webgl-engine/core/shaderModules/FloatPassUniform.js";import{glsl as S,If as u}from"../views/3d/webgl-engine/core/shaderModules/glsl.js";import{Matrix4BindUniform as D}from"../views/3d/webgl-engine/core/shaderModules/Matrix4BindUniform.js";import{alphaCutoff as x}from"../views/3d/webgl-engine/shaders/alphaCutoff.glsl.js";import{AnimatedLine as L}from"../views/3d/webgl-engine/shaders/AnimatedLine.glsl.js";import{outputColorHighlightOLID as b}from"../views/3d/webgl-engine/shaders/OutputColorHighlightOLID.glsl.js";import{getTextureBackedBufferModule as w}from"../views/3d/webgl-engine/shaders/RibbonLineTextureBuffer.glsl.js";import{ShaderBuilder as y}from"../views/webgl/ShaderBuilder.js";const C=1;function P(C){const P=new y,{attributes:z,varyings:F,vertex:j,fragment:A}=P,{applyMarkerOffset:W,draped:I,output:R,capType:V,stippleEnabled:T,falloffEnabled:O,roundJoins:E,wireframe:N,innerColorEnabled:J,hasAnimation:_,hasScreenSizePerspective:M,worldSizedImagePattern:$}=C,U=w(C).createBuilder(P,C);j.inputs.add("position",()=>U.getTextureAttribute("position")),C.hasVVSize?j.inputs.add("sizeFeatureAttribute",()=>U.getTextureAttribute("sizeFeatureAttribute")):j.inputs.add("size",()=>U.getTextureAttribute("size")),C.hasVVOpacity&&j.inputs.add("opacityFeatureAttribute",()=>U.getTextureAttribute("opacityFeatureAttribute")),C.hasVVColor?j.inputs.add("colorFeatureAttribute",()=>U.getTextureAttribute("colorFeatureAttribute")):j.inputs.add("color",()=>U.getTextureAttribute("color")),A.include(o),P.include(t,C),P.include(i,C);const B={animation:C.animation,hasAnimation:C.hasAnimation,timeStampsExpr:U.getTextureAttribute("timeStamps")};P.include(L,B),11===R?(P.varyings.add("objectAndLayerIdColorVarying","vec4"),j.code.add(S`
2
+ import{SliceDraw as e}from"../views/3d/webgl-engine/core/shaderLibrary/Slice.glsl.js";import{RibbonVertexPosition as t}from"../views/3d/webgl-engine/core/shaderLibrary/attributes/RibbonVertexPosition.glsl.js";import{LineStipple as i,computePixelSize as n}from"../views/3d/webgl-engine/core/shaderLibrary/shading/LineStipple.glsl.js";import{MarkerSizing as r}from"../views/3d/webgl-engine/core/shaderLibrary/shading/MarkerSizing.glsl.js";import{PiUtils as o}from"../views/3d/webgl-engine/core/shaderLibrary/shading/PiUtils.glsl.js";import{positionOutsideClipSpace as a}from"../views/3d/webgl-engine/core/shaderLibrary/shading/PositionOutsideClipSpace.js";import{ColorConversion as s}from"../views/3d/webgl-engine/core/shaderLibrary/util/ColorConversion.glsl.js";import{NoPerspectiveWrite as l,NoPerspectiveRead as d}from"../views/3d/webgl-engine/core/shaderLibrary/util/NoPerspective.glsl.js";import{addProjViewLocalOrigin as c,addPixelRatio as p}from"../views/3d/webgl-engine/core/shaderLibrary/util/View.glsl.js";import{Float2BindUniform as m}from"../views/3d/webgl-engine/core/shaderModules/Float2BindUniform.js";import{Float4BindUniform as v}from"../views/3d/webgl-engine/core/shaderModules/Float4BindUniform.js";import{Float4PassUniform as f}from"../views/3d/webgl-engine/core/shaderModules/Float4PassUniform.js";import{FloatBindUniform as h}from"../views/3d/webgl-engine/core/shaderModules/FloatBindUniform.js";import{FloatPassUniform as g}from"../views/3d/webgl-engine/core/shaderModules/FloatPassUniform.js";import{glsl as S,If as u}from"../views/3d/webgl-engine/core/shaderModules/glsl.js";import{Matrix4BindUniform as x}from"../views/3d/webgl-engine/core/shaderModules/Matrix4BindUniform.js";import{alphaCutoff as D}from"../views/3d/webgl-engine/shaders/alphaCutoff.glsl.js";import{AnimatedLine as L}from"../views/3d/webgl-engine/shaders/AnimatedLine.glsl.js";import{outputColorHighlightOLID as b}from"../views/3d/webgl-engine/shaders/OutputColorHighlightOLID.glsl.js";import{getTextureBackedBufferModule as w}from"../views/3d/webgl-engine/shaders/RibbonLineTextureBuffer.glsl.js";import{ShaderBuilder as y}from"../views/webgl/ShaderBuilder.js";const C=1;function P(C){const P=new y,{attributes:F,varyings:j,vertex:z,fragment:A}=P,{applyMarkerOffset:W,draped:T,output:I,capType:R,stippleEnabled:V,falloffEnabled:N,wireframe:E,innerColorEnabled:O,hasAnimation:J,hasScreenSizePerspective:_,worldSizedImagePattern:$}=C,M=2===R,H=V&&M,U=N||H,B=V||M,k=w(C).createBuilder(P,C);z.inputs.add("position",()=>k.getTextureAttribute("position")),C.hasVVSize?z.inputs.add("sizeFeatureAttribute",()=>k.getTextureAttribute("sizeFeatureAttribute")):z.inputs.add("size",()=>k.getTextureAttribute("size")),C.hasVVOpacity&&z.inputs.add("opacityFeatureAttribute",()=>k.getTextureAttribute("opacityFeatureAttribute")),C.hasVVColor?z.inputs.add("colorFeatureAttribute",()=>k.getTextureAttribute("colorFeatureAttribute")):z.inputs.add("color",()=>k.getTextureAttribute("color")),A.include(o),P.include(t,C),P.include(i,C);const G={animation:C.animation,hasAnimation:C.hasAnimation,timeStampsExpr:k.getTextureAttribute("timeStamps")};P.include(L,G),11===I?(P.varyings.add("objectAndLayerIdColorVarying","vec4"),z.code.add(S`
3
3
  vec4 getOlidColor() {
4
- return ${U.getTextureAttribute("olidColor")};
4
+ return ${k.getTextureAttribute("olidColor")};
5
5
  }
6
6
 
7
7
  void forwardObjectAndLayerIdColor() {
@@ -9,40 +9,40 @@ import{SliceDraw as e}from"../views/3d/webgl-engine/core/shaderLibrary/Slice.gls
9
9
  }
10
10
  `),A.code.add(S`void outputObjectAndLayerIdColor() {
11
11
  fragColor = objectAndLayerIdColorVarying;
12
- }`)):(j.code.add(S`void forwardObjectAndLayerIdColor() {}`),A.code.add(S`void outputObjectAndLayerIdColor() {}`));const H=W&&!I;H&&(j.uniforms.add(new h("markerScale",e=>e.markerScale)),P.include(r,{space:2,hasScreenSizePerspective:M})),c(j,C),j.uniforms.add(new D("inverseProjectionMatrix",e=>e.camera.inverseProjectionMatrix),new m("nearFar",e=>e.camera.nearFar),new h("miterLimit",e=>"miter"!==e.join?0:e.miterLimit),new v("viewport",e=>e.camera.fullViewport)),j.constants.add("LARGE_HALF_FLOAT","float",65500),j.constants.add("EPS","float",.001),j.constants.add("NUM_JOIN_SUBDIVISIONS","float",C.numJoinSubdivisions),z.add("textureElementIndex","uint"),z.add("lineParameters","vec2"),F.add("vColor","vec4"),F.add("vpos","vec3",{invariant:!0}),F.add("vLineDistance","float"),F.add("vLineWidth","float"),T||(F.add("vIsInsideJoin","int"),F.add("vStretchFactor","float"),F.add("vJoinCenterLineSDFs","vec2"),F.add("vSubdivisionFactor","float"));const k=T;k&&F.add("vLineSizeInv","float");const G=2===V,X=T&&G,Y=O||X;Y&&F.add("vLineDistanceNorm","float"),G&&(F.add("vSegmentSDF","float"),F.add("vReverseSegmentSDF","float")),j.code.add(S`vec3 perpendicular(vec3 v) {
12
+ }`)):(z.code.add(S`void forwardObjectAndLayerIdColor() {}`),A.code.add(S`void outputObjectAndLayerIdColor() {}`));const X=W&&!T;return X&&(z.uniforms.add(new g("markerScale",e=>e.markerScale)),P.include(r,{space:2,hasScreenSizePerspective:_})),c(z,C),z.uniforms.add(new x("inverseProjectionMatrix",e=>e.camera.inverseProjectionMatrix),new m("nearFar",e=>e.camera.nearFar),new g("miterLimit",e=>"miter"!==e.join?0:e.miterLimit),new v("viewport",e=>e.camera.fullViewport)),z.constants.add("LARGE_HALF_FLOAT","float",65500),z.constants.add("EPS","float",.001),z.constants.add("NUM_JOIN_SUBDIVISIONS","float",C.numJoinSubdivisions),F.add("textureElementIndex","uint"),F.add("lineParameters","vec2"),j.add("vColor","vec4"),j.add("vpos","vec3",{invariant:!0}),j.add("vLineDistance","float"),j.add("vLineWidth","float"),V||(j.add("vIsInsideJoin","int"),j.add("vStretchFactor","float"),j.add("vJoinCenterLineSDFs","vec2"),j.add("vSubdivisionFactor","float")),V&&j.add("vLineSizeInv","float"),U&&j.add("vLineDistanceNorm","float"),M&&(j.add("vSegmentSDF","float"),j.add("vReverseSegmentSDF","float")),z.code.add(S`vec3 perpendicular(vec3 v) {
13
13
  return vec3(v.y, -v.x, 0.0);
14
14
  }
15
- float interp(float ncp, vec4 a, vec4 b) {
16
- return (-ncp - a.z) / (b.z - a.z);
15
+ float nearPlaneInterpolationFactor(float nearPlaneDistance, vec4 start, vec4 end) {
16
+ return (-nearPlaneDistance - start.z) / (end.z - start.z);
17
17
  }
18
18
  vec3 rotateZ(vec3 v, float a) {
19
19
  float s = sin(a);
20
20
  float c = cos(a);
21
21
  mat2 m = mat2(c, -s, s, c);
22
22
  return vec3(m * v.xy, v.z);
23
- }`),j.code.add(S`vec4 projectAndScale(vec4 pos) {
23
+ }`),z.code.add(S`vec4 projectAndScale(vec4 pos) {
24
24
  vec4 posNdc = proj * pos;
25
25
  posNdc.xy *= viewport.zw / posNdc.w;
26
26
  posNdc.z /= posNdc.w;
27
27
  return posNdc;
28
- }`),j.code.add(S`void clip(
28
+ }`),z.code.add(S`void clip(
29
29
  inout vec4 pos,
30
30
  inout vec4 prev,
31
31
  inout vec4 next,
32
32
  bool isStartVertex
33
33
  ) {
34
- float vnp = nearFar[0] * 0.99;
34
+ float adjustedNearPlaneDistance = nearFar[0] * 0.99;
35
35
  if (pos.z > -nearFar[0]) {
36
36
  if (!isStartVertex) {
37
37
  if (prev.z < -nearFar[0]) {
38
- pos = mix(prev, pos, interp(vnp, prev, pos));
38
+ pos = mix(prev, pos, nearPlaneInterpolationFactor(adjustedNearPlaneDistance, prev, pos));
39
39
  next = pos;
40
40
  } else {
41
41
  pos = vec4(0.0, 0.0, 0.0, 1.0);
42
42
  }
43
43
  } else {
44
44
  if (next.z < -nearFar[0]) {
45
- pos = mix(pos, next, interp(vnp, pos, next));
45
+ pos = mix(pos, next, nearPlaneInterpolationFactor(adjustedNearPlaneDistance, pos, next));
46
46
  prev = pos;
47
47
  } else {
48
48
  pos = vec4(0.0, 0.0, 0.0, 1.0);
@@ -50,20 +50,22 @@ pos = vec4(0.0, 0.0, 0.0, 1.0);
50
50
  }
51
51
  } else {
52
52
  if (prev.z > -nearFar[0]) {
53
- prev = mix(pos, prev, interp(vnp, pos, prev));
53
+ prev = mix(pos, prev, nearPlaneInterpolationFactor(adjustedNearPlaneDistance, pos, prev));
54
54
  }
55
55
  if (next.z > -nearFar[0]) {
56
- next = mix(next, pos, interp(vnp, next, pos));
56
+ next = mix(next, pos, nearPlaneInterpolationFactor(adjustedNearPlaneDistance, next, pos));
57
57
  }
58
58
  }
59
- }`),p(j),j.constants.add("aaWidth","float",T?0:1),j.main.add(S`
60
- vec3 position = ${U.getTextureAttribute("position")};
61
- float u0 = ${U.getTextureAttribute("u0")};
59
+ }`),p(z),z.constants.add("aaWidth","float",V?0:1),z.main.add(S`
60
+ vec3 position = ${k.getTextureAttribute("position")};
61
+ float u0 = ${k.getTextureAttribute("u0")};
62
62
 
63
63
  // unpack values from vertex type
64
- bool isStartVertex = abs(abs(lineParameters.y) - 3.0) == 1.0;
65
- vec3 prevPosition = ${U.getTextureAttribute("position",-1)};
66
- vec3 nextPosition = ${U.getTextureAttribute("position",1)};
64
+ float vertexType = abs(lineParameters.y);
65
+ float lineSide = sign(lineParameters.y);
66
+ bool isStartVertex = vertexType == 2.0 || vertexType == 4.0;
67
+ vec3 prevPosition = ${k.getTextureAttribute("position",-1)};
68
+ vec3 nextPosition = ${k.getTextureAttribute("position",1)};
67
69
 
68
70
  float coverage = 1.0;
69
71
 
@@ -77,12 +79,122 @@ next = mix(next, pos, interp(vnp, next, pos));
77
79
  vec4 prev = view * vec4(prevPosition, 1.0);
78
80
  vec4 next = view * vec4(nextPosition, 1.0);
79
81
 
80
- bool isJoin = abs(lineParameters.y) < 3.0;
81
- `),H&&j.main.add(S`vec4 other = isStartVertex ? next : prev;
82
+ bool isJoin = vertexType < 3.0;
83
+ `),X&&z.main.add(S`vec4 other = isStartVertex ? next : prev;
82
84
  bool markersHidden = areWorldMarkersHidden(pos.xyz, other.xyz);
83
85
  if (!isJoin && !markersHidden) {
84
86
  pos.xyz += normalize(other.xyz - pos.xyz) * getWorldMarkerSize(pos.xyz) * 0.5;
85
- }`),P.include(l),j.main.add(S`
87
+ }`),P.include(l),z.code.add(S`
88
+ vec2 computeJoinAndCapDisplacement(
89
+ bool isJoin,
90
+ bool isStartVertex,
91
+ inout vec3 left,
92
+ inout vec3 right,
93
+ float lineSide,
94
+ float lineWidth,
95
+ float subdivisionFactor,
96
+ float perspectiveDivisor
97
+ ) {
98
+ float leftLen = length(left);
99
+ float rightLen = length(right);
100
+ left = leftLen > EPS ? left / leftLen : vec3(0.0);
101
+ right = rightLen > EPS ? right / rightLen : vec3(0.0);
102
+
103
+ vec3 capDisplacementDir = vec3(0.0);
104
+ vec3 joinDisplacementDir = vec3(0.0);
105
+ float displacementLen = lineWidth;
106
+ float miterDisplacementLen = lineWidth;
107
+ float innerDisplacementLen = lineWidth;
108
+ bool isOutside = false;
109
+
110
+ if (isJoin) {
111
+ // Determine if the vertex is on the outside or inside of the join.
112
+ isOutside = (left.x * right.y - left.y * right.x) * lineSide > 0.0;
113
+
114
+ // Compute the miter join position first.
115
+ vec3 joinDirection = normalize(left + right);
116
+ joinDisplacementDir = perpendicular(joinDirection);
117
+
118
+ // Compute the miter stretch.
119
+ if (leftLen > EPS && rightLen > EPS) {
120
+ float nDotSeg = dot(joinDisplacementDir, left);
121
+ displacementLen /= length(nDotSeg * left - joinDisplacementDir);
122
+ miterDisplacementLen = displacementLen;
123
+
124
+ innerDisplacementLen = min(displacementLen, min(leftLen, rightLen) / abs(nDotSeg));
125
+
126
+ // Limit displacement of inner vertices.
127
+ if (!isOutside) {
128
+ displacementLen = innerDisplacementLen;
129
+ }
130
+ }
131
+
132
+ ${u(!V,S`
133
+ // Compute stretch compensation for feathering.
134
+ if (subdivisionFactor > 0.0) {
135
+ vIsInsideJoin = 1;
136
+ }
137
+ vSubdivisionFactor = isOutside ? subdivisionFactor : 0.5;
138
+
139
+ if (miterDisplacementLen > miterLimit * lineWidth) {
140
+ vec2 leftScreenDir = left.xy;
141
+ vec2 rightScreenDir = right.xy;
142
+ float leftScreenLen = length(leftScreenDir);
143
+ float rightScreenLen = length(rightScreenDir);
144
+
145
+ if (leftScreenLen > EPS && rightScreenLen > EPS) {
146
+ leftScreenDir /= leftScreenLen;
147
+ rightScreenDir /= rightScreenLen;
148
+
149
+ /**
150
+ * Feathering AA needs special considerations on join triangles because these can get stretched a lot at acute angles.
151
+ * We use the triangle height to determine by how much they get stretched.
152
+ */
153
+ float theta = acos(clamp(dot(leftScreenDir, rightScreenDir), -1.0, 1.0));
154
+ /**
155
+ * The argument of cos here is half the angle of a join triangle.
156
+ * We start with one triangle, and every subdivision adds another triangle.
157
+ */
158
+ float subdividedTriangleHeight = (innerDisplacementLen + lineWidth) * cos(theta / (2.0 + 2.0 * NUM_JOIN_SUBDIVISIONS));
159
+ float bevelTriangleHeight = innerDisplacementLen + lineWidth * cos(theta * 0.5);
160
+ float triangleHeight = NUM_JOIN_SUBDIVISIONS > 0.0 ? subdividedTriangleHeight : bevelTriangleHeight;
161
+ vStretchFactor = noPerspectiveWrite(max(triangleHeight / (2.0 * lineWidth), 1.0), perspectiveDivisor);
162
+ }
163
+ }
164
+ `)}
165
+
166
+ if (isOutside && displacementLen > miterLimit * lineWidth) {
167
+ ${u(C.roundJoins,S`
168
+ vec3 startDir = perpendicular(leftLen < EPS ? right : left);
169
+ vec3 endDir = perpendicular(rightLen < EPS ? left : right);
170
+ float factor = ${V?S`min(1.0, subdivisionFactor * ((NUM_JOIN_SUBDIVISIONS + 1.0) / NUM_JOIN_SUBDIVISIONS))`:S`subdivisionFactor`};
171
+
172
+ float rotationAngle = acos(clamp(dot(startDir.xy, endDir.xy), -1.0, 1.0));
173
+ joinDisplacementDir = rotateZ(startDir, -lineSide * factor * rotationAngle);
174
+ `,S`
175
+ /**
176
+ * Convert to bevel join if miterLimit is exceeded.
177
+ * Here vertices with a subdivisionFactor > 0 are either START vertices or
178
+ * an additional END vertex to fix line pattern interpolation.
179
+ * The additional vertex is considered to be the END of the previous segment.
180
+ * However, it is pushed to the position of the START of the next segment,
181
+ * so that the entire bevel join will be part of the first segment, pattern-wise.
182
+ */
183
+ vec3 startDir = perpendicular(leftLen < EPS ? right : left);
184
+ vec3 endDir = perpendicular(rightLen < EPS ? left : right);
185
+
186
+ ${u(V,S`joinDisplacementDir = (isStartVertex || subdivisionFactor > 0.0) ? endDir : startDir;`,S`joinDisplacementDir = mix(startDir, endDir, subdivisionFactor);`)}
187
+ `)}
188
+ displacementLen = lineWidth;
189
+ }
190
+ } else {
191
+ joinDisplacementDir = perpendicular(isStartVertex ? right : left);
192
+ ${0!==R?S`capDisplacementDir = vec3((isStartVertex ? -right : left).xy, 0.0);`:""}
193
+ }
194
+
195
+ return (joinDisplacementDir.xy * lineSide + capDisplacementDir.xy) * displacementLen;
196
+ }
197
+ `),z.main.add(S`
86
198
  clip(pos, prev, next, isStartVertex);
87
199
 
88
200
  vec3 clippedPos = pos.xyz;
@@ -95,12 +207,9 @@ pos.xyz += normalize(other.xyz - pos.xyz) * getWorldMarkerSize(pos.xyz) * 0.5;
95
207
  vec3 left = (pos.xyz - prev.xyz);
96
208
  vec3 right = (next.xyz - pos.xyz);
97
209
 
98
- float leftLen = length(left);
99
- float rightLen = length(right);
100
-
101
- float lineSize = getSize(${u(M,"clippedPos")});
102
- ${u(T&&M,"float patternLineSize = getSize(clippedCenter);")}
103
- ${u(T&&!M,"float patternLineSize = lineSize;")}
210
+ float lineSize = getSize(${u(_,"clippedPos")});
211
+ ${u(V&&_,"float patternLineSize = getSize(clippedCenter);")}
212
+ ${u(V&&!_,"float patternLineSize = lineSize;")}
104
213
 
105
214
  ${u($,S`
106
215
  lineSize += aaWidth;
@@ -120,84 +229,31 @@ pos.xyz += normalize(other.xyz - pos.xyz) * getWorldMarkerSize(pos.xyz) * 0.5;
120
229
  `)}
121
230
 
122
231
  vLineWidth = noPerspectiveWrite(lineWidth, pos.w);
123
- ${k?S`vLineSizeInv = noPerspectiveWrite(1.0 / lineSize, pos.w);`:""}
124
- `);(T||G)&&j.main.add(S`
232
+ ${V?S`vLineSizeInv = noPerspectiveWrite(1.0 / lineSize, pos.w);`:""}
233
+ `),B&&z.main.add(S`
125
234
  float isEndVertex = float(!isStartVertex);
126
235
  vec3 segmentOrigin = mix(pos.xyz, prev.xyz, isEndVertex);
127
236
  vec3 segment = mix(right, left, isEndVertex);
128
- ${G?S`vec3 segmentEnd = mix(next.xyz, pos.xyz, isEndVertex);`:""}
129
- `),j.main.add(S`left = (leftLen > EPS) ? left/leftLen : vec3(0.0, 0.0, 0.0);
130
- right = (rightLen > EPS) ? right/rightLen : vec3(0.0, 0.0, 0.0);
131
- vec3 segmentDirection = isStartVertex ? right : left;
132
- vec3 capDisplacementDir = vec3(0.0, 0.0, 0.0);
133
- vec3 joinDisplacementDir = vec3(0.0, 0.0, 0.0);
134
- float displacementLen = lineWidth;
135
- float miterDisplacementLen = lineWidth;
136
- float innerDisplacementLen = lineWidth;`),T||j.main.add(S`vIsInsideJoin = 0;
137
- vStretchFactor = 1.0;
138
- vSubdivisionFactor = 0.0;
139
- vJoinCenterLineSDFs = vec2(LARGE_HALF_FLOAT);`),j.main.add(S`float subdivisionFactor = 0.0;
140
- bool isOutside = false;
141
- if (isJoin) {
142
- isOutside = (left.x * right.y - left.y * right.x) * lineParameters.y > 0.0;
143
- vec3 joinDirection = normalize(left + right);
144
- joinDisplacementDir = perpendicular(joinDirection);
145
- if (leftLen > EPS && rightLen > EPS) {
146
- float nDotSeg = dot(joinDisplacementDir, left);
147
- displacementLen /= length(nDotSeg * left - joinDisplacementDir);
148
- miterDisplacementLen = displacementLen;
149
- innerDisplacementLen = min(displacementLen, min(leftLen, rightLen)/abs(nDotSeg));
150
- if (!isOutside) {
151
- displacementLen = innerDisplacementLen;
152
- }
153
- }
154
- subdivisionFactor = lineParameters.x;`),T||j.main.add(S`if(subdivisionFactor > 0.0) {
155
- vIsInsideJoin = 1;
156
- }
157
- vSubdivisionFactor = isOutside ? subdivisionFactor : 0.5;
158
- if (miterDisplacementLen > miterLimit * lineWidth) {
159
- vec2 leftScreenDir = left.xy;
160
- vec2 rightScreenDir = right.xy;
161
- float leftScreenLen = length(leftScreenDir);
162
- float rightScreenLen = length(rightScreenDir);
163
- if (leftScreenLen > EPS && rightScreenLen > EPS) {
164
- leftScreenDir /= leftScreenLen;
165
- rightScreenDir /= rightScreenLen;
166
- float theta = acos(clamp(dot(leftScreenDir, rightScreenDir), -1.0, 1.0));
167
- float subdividedTriangleHeight = (innerDisplacementLen + lineWidth) * cos(theta / (2.0 + 2.0 * NUM_JOIN_SUBDIVISIONS));
168
- float bevelTriangleHeight = innerDisplacementLen + lineWidth * cos(theta * 0.5);
169
- float triangleHeight = NUM_JOIN_SUBDIVISIONS > 0.0 ? subdividedTriangleHeight : bevelTriangleHeight;
170
- vStretchFactor = noPerspectiveWrite(max(triangleHeight / (2.0 * lineWidth), 1.0), pos.w);
171
- }
172
- }`),j.main.add(S`if (isOutside && (displacementLen > miterLimit * lineWidth)) {`),E?j.main.add(S`
173
- vec3 startDir = leftLen < EPS ? right : left;
174
- startDir = perpendicular(startDir);
175
-
176
- vec3 endDir = rightLen < EPS ? left : right;
177
- endDir = perpendicular(endDir);
178
-
179
- float factor = ${T?S`min(1.0, subdivisionFactor * ((NUM_JOIN_SUBDIVISIONS + 1.0) / NUM_JOIN_SUBDIVISIONS))`:S`subdivisionFactor`};
180
-
181
- float rotationAngle = acos(clamp(dot(startDir.xy, endDir.xy), -1.0, 1.0));
182
- joinDisplacementDir = rotateZ(startDir, -sign(lineParameters.y) * factor * rotationAngle);
183
- `):j.main.add(S`
184
- vec3 startDir = perpendicular(leftLen < EPS ? right : left);
185
- vec3 endDir = perpendicular(rightLen < EPS ? left : right);
186
-
187
- ${u(T,S`joinDisplacementDir = (isStartVertex || subdivisionFactor > 0.0) ? endDir : startDir;`,S`joinDisplacementDir = mix(startDir, endDir, subdivisionFactor);`)}
188
- `);const Z=0!==V;return j.main.add(S`
189
- displacementLen = lineWidth;
190
- }
191
- } else {
192
- // CAP handling ---------------------------------------------------
193
- joinDisplacementDir = isStartVertex ? right : left;
194
- joinDisplacementDir = perpendicular(joinDisplacementDir);
195
-
196
- ${Z?S`capDisplacementDir = vec3((isStartVertex ? -right : left).xy, 0.0);`:""}
197
- }
198
- `),j.main.add(S`
199
- // Displacement (in pixels) caused by join/or cap
200
- vec2 dposXY = (joinDisplacementDir.xy * sign(lineParameters.y) + capDisplacementDir.xy) * displacementLen;
237
+ ${M?S`vec3 segmentEnd = mix(next.xyz, pos.xyz, isEndVertex);`:""}
238
+ `),z.main.add(S`
239
+ ${u(!V,S`
240
+ vIsInsideJoin = 0;
241
+ vStretchFactor = 1.0;
242
+ vSubdivisionFactor = 0.0;
243
+ vJoinCenterLineSDFs = vec2(LARGE_HALF_FLOAT);
244
+ `)}
245
+
246
+ vec2 displacementXY = computeJoinAndCapDisplacement(
247
+ isJoin,
248
+ isStartVertex,
249
+ left,
250
+ right,
251
+ lineSide,
252
+ lineWidth,
253
+ lineParameters.x,
254
+ pos.w
255
+ );
256
+ vec3 segmentDirection = isStartVertex ? right : left;
201
257
 
202
258
  /**
203
259
  * To prevent z-fighting between layers, we also adjust the z value.
@@ -205,17 +261,17 @@ vStretchFactor = noPerspectiveWrite(max(triangleHeight / (2.0 * lineWidth), 1.0)
205
261
  * To do so, the below formula projects the xy displacement onto the original segment direction
206
262
  * to find the z-offset necessary so the triangle orientation is independent of the width.
207
263
  */
208
- float dposZ = dot(dposXY, segmentDirection.xy) / dot(segmentDirection.xy, segmentDirection.xy) * segmentDirection.z;
209
- vec3 dpos = vec3(dposXY, dposZ);
264
+ float displacementZ = dot(displacementXY, segmentDirection.xy) / dot(segmentDirection.xy, segmentDirection.xy) * segmentDirection.z;
265
+ vec3 displacement = vec3(displacementXY, displacementZ);
210
266
 
211
- float lineDistNorm = noPerspectiveWrite(sign(lineParameters.y), pos.w);
267
+ float lineDistNorm = noPerspectiveWrite(lineSide, pos.w);
212
268
 
213
269
  vLineDistance = lineWidth * lineDistNorm;
214
- ${Y?S`vLineDistanceNorm = lineDistNorm;`:""}
270
+ ${U?S`vLineDistanceNorm = lineDistNorm;`:""}
215
271
 
216
- pos.xyz += dpos;
217
- `),T||j.main.add(S`if (isJoin) {
218
- vec2 joinCenterToVertex = dposXY;
272
+ pos.xyz += displacement;
273
+ `),V||z.main.add(S`if (isJoin) {
274
+ vec2 joinCenterToVertex = displacementXY;
219
275
  vec2 leftCenterlineDir = left.xy;
220
276
  vec2 rightCenterlineDir = right.xy;
221
277
  float leftCenterlineLen = length(leftCenterlineDir);
@@ -229,25 +285,28 @@ dot(vec2(leftCenterlineDir.y, -leftCenterlineDir.x), joinCenterToVertex)
229
285
  ),
230
286
  pos.w
231
287
  );
232
- }`),G&&j.main.add(S`vec2 segmentDir = normalize(segment.xy);
288
+ }`),M&&z.main.add(S`vec2 segmentDir = normalize(segment.xy);
233
289
  vSegmentSDF = noPerspectiveWrite((isJoin && isStartVertex) ? LARGE_HALF_FLOAT : (dot(pos.xy - segmentOrigin.xy, segmentDir)), pos.w);
234
- vReverseSegmentSDF = noPerspectiveWrite((isJoin && !isStartVertex) ? LARGE_HALF_FLOAT : (dot(pos.xy - segmentEnd.xy, -segmentDir)), pos.w);`),T&&(I?j.uniforms.add(new f("worldToScreenRatio",e=>1/e.screenToPCSRatio)):j.main.add(S`vec3 segmentCenter = mix((nextPosition + position) * 0.5, (position + prevPosition) * 0.5, isEndVertex);
235
- float worldToScreenRatio = computeWorldToScreenRatio(segmentCenter);`),j.main.add(S`float segmentLengthScreenDouble = length(segment.xy);
236
- float segmentLengthScreen = segmentLengthScreenDouble * 0.5;
237
- float discreteWorldToScreenRatio = discretizeWorldToScreenRatio(worldToScreenRatio);
238
- float segmentLengthRender = length(mix(nextPosition - position, position - prevPosition, isEndVertex));
239
- vStipplePatternStretch = worldToScreenRatio / discreteWorldToScreenRatio;`),I?j.main.add(S`float segmentLengthPseudoScreen = segmentLengthScreen / pixelRatio * discreteWorldToScreenRatio / worldToScreenRatio;
240
- float startPseudoScreen = u0 * discreteWorldToScreenRatio - mix(0.0, segmentLengthPseudoScreen, isEndVertex);`):j.main.add(S`float startPseudoScreen = mix(u0, u0 - segmentLengthRender, isEndVertex) * discreteWorldToScreenRatio;
241
- float segmentLengthPseudoScreen = segmentLengthRender * discreteWorldToScreenRatio;`),j.uniforms.add(new h("stipplePatternPixelSize",e=>n(e))),j.main.add(S`
290
+ vReverseSegmentSDF = noPerspectiveWrite((isJoin && !isStartVertex) ? LARGE_HALF_FLOAT : (dot(pos.xy - segmentEnd.xy, -segmentDir)), pos.w);`),V&&(T?z.uniforms.add(new h("worldToScreenRatio",e=>1/e.screenToPCSRatio)):z.main.add(S`vec3 segmentCenter = mix((nextPosition + position) * 0.5, (position + prevPosition) * 0.5, isEndVertex);
291
+ float worldToScreenRatio = computeWorldToScreenRatio(segmentCenter);`),z.main.add(S`
292
+ float segmentLengthScreenDouble = length(segment.xy);
293
+ float segmentLengthScreen = segmentLengthScreenDouble * 0.5;
294
+ float discreteWorldToScreenRatio = discretizeWorldToScreenRatio(worldToScreenRatio);
295
+ float segmentLengthRender = length(mix(nextPosition - position, position - prevPosition, isEndVertex));
296
+ ${u(!T||$,S`float segmentStartRender = mix(u0, u0 - segmentLengthRender, isEndVertex);`)}
297
+
298
+ vStipplePatternStretch = worldToScreenRatio / discreteWorldToScreenRatio;
299
+ `),T?z.main.add(S`float segmentLengthPseudoScreen = segmentLengthScreen / pixelRatio * discreteWorldToScreenRatio / worldToScreenRatio;
300
+ float startPseudoScreen = u0 * discreteWorldToScreenRatio - mix(0.0, segmentLengthPseudoScreen, isEndVertex);`):z.main.add(S`float startPseudoScreen = segmentStartRender * discreteWorldToScreenRatio;
301
+ float segmentLengthPseudoScreen = segmentLengthRender * discreteWorldToScreenRatio;`),z.uniforms.add(new g("stipplePatternPixelSize",e=>n(e))),z.main.add(S`
242
302
  float patternLength = patternLineSize * stipplePatternPixelSize;
243
303
 
244
304
  ${u($,S`
245
- float uu = mix(u0, u0 - segmentLengthRender, isEndVertex);
246
- vStippleDistanceLimits = vec2(uu, uu + segmentLengthRender);
305
+ vStippleDistanceLimits = vec2(segmentStartRender, segmentStartRender + segmentLengthRender);
247
306
  vStipplePatternStretch = 1.0;
248
307
 
249
308
  // The v-coordinate used in case of an image pattern.
250
- bool isLeft = sign(lineParameters.y) < 0.0;
309
+ bool isLeft = lineSide < 0.0;
251
310
  vStippleV = isLeft ? 0.0 : 1.0;
252
311
  `,S`
253
312
  // Compute the coordinates at both start and end of the line segment, because we need both to clamp to in the
@@ -269,7 +328,7 @@ float segmentLengthPseudoScreen = segmentLengthRender * discreteWorldToScreenRat
269
328
  vStippleDistance += (stippleDisplacementFactor - isEndVertex) * (vStippleDistanceLimits.y - vStippleDistanceLimits.x);
270
329
  }
271
330
 
272
- // Cancel out perspective correct interpolation because we want this length the really represent the screen
331
+ // Cancel out perspective correct interpolation because we want this length to really represent the screen
273
332
  // distance
274
333
  vStippleDistanceLimits = noPerspectiveWrite(vStippleDistanceLimits, pos.w);
275
334
  vStippleDistance = noPerspectiveWrite(vStippleDistance, pos.w);
@@ -280,7 +339,7 @@ float segmentLengthPseudoScreen = segmentLengthRender * discreteWorldToScreenRat
280
339
  isStartVertex ?
281
340
  vec2(-1e34, vStippleDistanceLimits.y) :
282
341
  vec2(vStippleDistanceLimits.x, 1e34);
283
- `)),j.main.add(S`
342
+ `)),z.main.add(S`
284
343
  // Convert back into NDC
285
344
  pos.xy = (pos.xy / viewport.zw) * pos.w;
286
345
  pos.z = pos.z * pos.w;
@@ -288,42 +347,44 @@ float segmentLengthPseudoScreen = segmentLengthRender * discreteWorldToScreenRat
288
347
  vColor = getColor();
289
348
  vColor.a = noPerspectiveWrite(vColor.a * coverage, pos.w);
290
349
 
291
- ${N&&!I?"pos.z -= EPS * pos.w;":""}
350
+ ${E&&!T?"pos.z -= EPS * pos.w;":""}
292
351
 
293
352
  // transform final position to camera space for slicing
294
353
  vpos = (inverseProjectionMatrix * pos).xyz;
295
354
  gl_Position = pos;
296
355
  forwardObjectAndLayerIdColor();
297
- }`),P.fragment.include(e,C),P.include(b,C),A.include(s),A.main.add(S`discardBySlice(vpos);`),P.include(d),A.include(x),A.main.add(S`
356
+ }`),P.fragment.include(e,C),P.include(b,C),A.include(s),A.main.add(S`discardBySlice(vpos);`),P.include(d),A.include(D),V||A.code.add(S`float lineFeatheringFactor(float lineWidth, float lineDistance) {
357
+ float stretchFactor = vIsInsideJoin == 1 ? noPerspectiveRead(vStretchFactor) : 1.0;
358
+ float featherWidth = 2.0;
359
+ float featherStartDistance = max(lineWidth - featherWidth / stretchFactor, 0.0);
360
+ float straightFeatherStartDistance = max(lineWidth - featherWidth, 0.0);
361
+ float value = abs(lineDistance);
362
+ float feather = (value - featherStartDistance) / (lineWidth - featherStartDistance);
363
+ vec2 joinCenterSDFs = noPerspectiveRead(vJoinCenterLineSDFs);
364
+ float joinCenterDistance = abs(vSubdivisionFactor > 0.5 ? joinCenterSDFs.x : joinCenterSDFs.y);
365
+ float straightFeather = (joinCenterDistance - straightFeatherStartDistance) / (lineWidth - straightFeatherStartDistance);
366
+ feather = vIsInsideJoin == 1 ? max(feather, straightFeather) : feather;
367
+ return 1.0 - clamp(feather, 0.0, 1.0);
368
+ }`),A.main.add(S`
298
369
  float lineWidth = noPerspectiveRead(vLineWidth);
299
370
  float lineDistance = noPerspectiveRead(vLineDistance);
300
- ${u(Y,S`float lineDistanceNorm = noPerspectiveRead(vLineDistanceNorm);`)}
301
- `),N?A.main.add(S`vec4 finalColor = vec4(1.0, 0.0, 1.0, 1.0);`):(G&&A.main.add(S`float sdf = noPerspectiveRead(min(vSegmentSDF, vReverseSegmentSDF));
371
+ ${u(U,S`float lineDistanceNorm = noPerspectiveRead(vLineDistanceNorm);`)}
372
+ `),E?A.main.add(S`vec4 finalColor = vec4(1.0, 0.0, 1.0, 1.0);`):(M&&A.main.add(S`float sdf = noPerspectiveRead(min(vSegmentSDF, vReverseSegmentSDF));
302
373
  vec2 fragmentPosition = vec2(min(sdf, 0.0), lineDistance);
303
374
  float fragmentRadius = length(fragmentPosition);
304
375
  float fragmentCapSDF = (fragmentRadius - lineWidth) * 0.5;
305
376
  float capCoverage = clamp(0.5 - fragmentCapSDF, 0.0, 1.0);
306
377
  if (capCoverage < alphaCutoff) {
307
378
  discard;
308
- }`),X?A.main.add(S`vec2 stipplePosition = vec2(
379
+ }`),H?A.main.add(S`vec2 stipplePosition = vec2(
309
380
  min(getStippleSDF() * 2.0 - 1.0, 0.0),
310
381
  lineDistanceNorm
311
382
  );
312
383
  float stippleRadius = length(stipplePosition * lineWidth);
313
384
  float stippleCapSDF = (stippleRadius - lineWidth) * 0.5;
314
385
  float stippleCoverage = clamp(0.5 - stippleCapSDF, 0.0, 1.0);
315
- float stippleAlpha = step(alphaCutoff, stippleCoverage);`):A.main.add(S`float stippleAlpha = getStippleAlpha(lineWidth);`),11!==R&&A.main.add(S`discardByStippleAlpha(stippleAlpha, alphaCutoff);`),P.include(d),A.uniforms.add(new g("intrinsicColor",e=>e.color)).main.add(S`vec4 color = intrinsicColor * vColor;
316
- color.a = noPerspectiveRead(color.a);`),J&&A.uniforms.add(new g("innerColor",e=>e.innerColor??e.color),new h("innerWidth",(e,t)=>e.innerWidth*t.camera.pixelRatio)).main.add(S`float distToInner = abs(lineDistance) - innerWidth;
386
+ float stippleAlpha = step(alphaCutoff, stippleCoverage);`):A.main.add(S`float stippleAlpha = getStippleAlpha(lineWidth);`),11!==I&&A.main.add(S`discardByStippleAlpha(stippleAlpha, alphaCutoff);`),A.uniforms.add(new f("intrinsicColor",e=>e.color)).main.add(S`vec4 color = intrinsicColor * vColor;
387
+ color.a = noPerspectiveRead(color.a);`),O&&A.uniforms.add(new f("innerColor",e=>e.innerColor??e.color),new g("innerWidth",(e,t)=>e.innerWidth*t.camera.pixelRatio)).main.add(S`float distToInner = abs(lineDistance) - innerWidth;
317
388
  float innerAA = clamp(0.5 - distToInner, 0.0, 1.0);
318
389
  float innerAlpha = innerColor.a + color.a * (1.0 - innerColor.a);
319
- color = mix(color, vec4(innerColor.rgb, innerAlpha), innerAA);`),A.main.add(S`vec4 finalColor = blendStipple(color, stippleAlpha);`),O&&(A.uniforms.add(new h("falloff",e=>e.falloff)),A.main.add(S`finalColor.a *= pow(max(0.0, 1.0 - abs(lineDistanceNorm)), falloff);`)),T||A.main.add(S`float stretchFactor = vIsInsideJoin == 1 ? noPerspectiveRead(vStretchFactor) : 1.0;
320
- float featherWidth = 2.0;
321
- float featherStartDistance = max(lineWidth - featherWidth / stretchFactor, 0.0);
322
- float straightFeatherStartDistance = max(lineWidth - featherWidth, 0.0);
323
- float value = abs(lineDistance);
324
- float feather = (value - featherStartDistance) / (lineWidth - featherStartDistance);
325
- vec2 joinCenterSDFs = noPerspectiveRead(vJoinCenterLineSDFs);
326
- float joinCenterDistance = abs(vSubdivisionFactor > 0.5 ? joinCenterSDFs.x : joinCenterSDFs.y);
327
- float straightFeather = (joinCenterDistance - straightFeatherStartDistance) / (lineWidth - straightFeatherStartDistance);
328
- feather = vIsInsideJoin == 1 ? max(feather, straightFeather) : feather;
329
- finalColor.a *= 1.0 - clamp(feather, 0.0, 1.0);`),_&&A.main.add("finalColor = animate(finalColor);")),A.main.add(S`outputColorHighlightOLID(applySlice(finalColor, vpos), finalColor.rgb);`),P}const z=Object.freeze(Object.defineProperty({__proto__:null,build:P,ribbonlineNumRoundJoinSubdivisions:C},Symbol.toStringTag,{value:"Module"}));export{z as R,P as b,C as r};
390
+ color = mix(color, vec4(innerColor.rgb, innerAlpha), innerAA);`),A.main.add(S`vec4 finalColor = blendStipple(color, stippleAlpha);`),N&&(A.uniforms.add(new g("falloff",e=>e.falloff)),A.main.add(S`finalColor.a *= pow(max(0.0, 1.0 - abs(lineDistanceNorm)), falloff);`)),V||A.main.add(S`finalColor.a *= lineFeatheringFactor(lineWidth, lineDistance);`),J&&A.main.add("finalColor = animate(finalColor);")),A.main.add(S`outputColorHighlightOLID(applySlice(finalColor, vpos), finalColor.rgb);`),P}const F=Object.freeze(Object.defineProperty({__proto__:null,build:P,numRoundJoinSubdivisions:C},Symbol.toStringTag,{value:"Module"}));export{F as R,P as b,C as n};