@cognite/reveal 4.35.2 → 4.35.3
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/dist/index.js +4 -4
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
package/dist/index.js
CHANGED
|
@@ -24,7 +24,7 @@ var Jt = Object.create, Yt = Object.defineProperty, Xt = Object.getOwnPropertyDe
|
|
|
24
24
|
enumerable: !0
|
|
25
25
|
}) : n, e)), rn = {
|
|
26
26
|
name: "@cognite/reveal",
|
|
27
|
-
version: "4.35.
|
|
27
|
+
version: "4.35.3",
|
|
28
28
|
description: "WebGL based 3D viewer for CAD and point clouds processed in Cognite Data Fusion.",
|
|
29
29
|
homepage: "https://github.com/cognitedata/reveal/tree/master/viewer",
|
|
30
30
|
repository: {
|
|
@@ -139,8 +139,8 @@ var Jt = Object.create, Yt = Object.defineProperty, Xt = Object.getOwnPropertyDe
|
|
|
139
139
|
three: "0.184.0"
|
|
140
140
|
},
|
|
141
141
|
files: ["dist"],
|
|
142
|
-
packageManager: "pnpm@11.
|
|
143
|
-
}, an = "precision highp float;vec4 LinearTosRGB(in vec4 value){return vec4(mix(pow(value.rgb,vec3(0.41666))*1.055-vec3(0.055),value.rgb*12.92,vec3(lessThanEqual(value.rgb,vec3(0.0031308)))),value.a);}vec3 derivateNormal(vec3 v_viewPosition){vec3 fdx=vec3(dFdx(v_viewPosition.x),dFdx(v_viewPosition.y),dFdx(v_viewPosition.z));vec3 fdy=vec3(dFdy(v_viewPosition.x),dFdy(v_viewPosition.y),dFdy(v_viewPosition.z));vec3 normal=normalize(cross(fdx,fdy));return normal;}vec3 rgb2hsv(vec3 c){vec4 K=vec4(0.0,-1.0/3.0,2.0/3.0,-1.0);vec4 p=mix(vec4(c.bg,K.wz),vec4(c.gb,K.xy),step(c.b,c.g));vec4 q=mix(vec4(p.xyw,c.r),vec4(c.r,p.yzx),step(p.x,c.r));float d=q.x-min(q.w,q.y);float e=1.0e-10;return vec3(abs(q.z+(q.w-q.y)/(6.0*d+e)),d/(q.x+e),q.x);}vec3 hsv2rgb(vec3 c){vec4 K=vec4(1.0,2.0/3.0,1.0/3.0,3.0);vec3 p=abs(fract(c.xxx+K.xyz)*6.0-K.www);return c.z*mix(K.xxx,clamp(p-K.xxx,0.0,1.0),c.y);}vec3 packIntToColor(float number){float r=floor(number/(255.0*255.0))/255.0;float g=mod(floor(number/255.0),255.0)/255.0;float b=mod(number,255.0)/255.0;return vec3(r,g,b);}struct GeometryTypeEnum{int Quad;int Primitive;int TriangleMesh;int InstancedMesh;};const GeometryTypeEnum GeometryType=GeometryTypeEnum(1,2,3,4);const int RenderTypeColor=1;const int RenderTypeNormal=2;const int RenderTypeTreeIndex=3;const int RenderTypePackColorAndNormal=4;const int RenderTypeDepth=5;const int RenderTypeEffects=6;const int RenderTypeGhost=7;const int RenderTypeLOD=8;const int RenderTypeDepthBufferOnly=9;const int RenderTypeGeometryType=10;\n#include <packing>\nout vec4 outputColor;vec3 packNormalToRgb(const in vec3 normal){return normalize(normal)*0.5+0.5;}void updateFragmentColor(int renderMode,vec4 color,float treeIndex,vec3 normal,float depth,sampler2D matCapTexture,int geometryType){if(renderMode==RenderTypeColor||renderMode==RenderTypeEffects){\n#if defined(IS_TEXTURED)\nvec3 colorRGB=color.rgb;\n#else\nvec3 hsv=rgb2hsv(color.rgb);hsv.z=min(0.5*hsv.z+0.5,1.0);vec3 colorRGB=hsv2rgb(hsv);\n#endif\nfloat amplitude=max(0.0,dot(normal,vec3(0.0,0.0,1.0)));vec4 albedo=vec4(colorRGB*(0.4+0.6*amplitude),1.0);vec2 cap=normal.xy*0.5+0.5;vec4 mc=vec4(texture(matCapTexture,cap).rgb,1.0);outputColor=vec4(albedo.rgb*mc.rgb*1.7,color.a);}else if(renderMode==RenderTypeGhost){float amplitude=max(0.0,dot(normal,vec3(0.0,0.0,1.0)));float s=0.4+0.6*amplitude;outputColor=vec4(vec3(s),0.3);}else if(renderMode==RenderTypeDepthBufferOnly){outputColor=vec4(1.0,0.0,1.0,1.0);}else if(renderMode==RenderTypePackColorAndNormal){vec3 hsv=rgb2hsv(color.rgb);float a=0.0;if(hsv.y>0.01){if(hsv.z>0.5){a=(0.55+hsv.x*0.45);}else{a=(0.1+hsv.x*0.45);}}else{a=hsv.z*0.09;}outputColor=vec4(packNormalToRgb(normal.rgb),color.a);}else if(renderMode==RenderTypeNormal){outputColor=vec4(packNormalToRgb(normal),color.a);}else if(renderMode==RenderTypeTreeIndex){outputColor=vec4(packIntToColor(treeIndex),color.a);}else if(renderMode==RenderTypeDepth){outputColor=packDepthToRGBA(depth);}else if(renderMode==RenderTypeLOD){bool isHighDetail=geometryType!=GeometryType.Quad;vec2 cap=normal.xy*0.5+0.5;vec3 mc=texture(matCapTexture,cap).rgb*1.5;outputColor=isHighDetail ? vec4(vec3(0.0,1.0,0.0)*mc,color.a): vec4(vec3(1.0,1.0,0.0)*mc,color.a);}else if(renderMode==RenderTypeGeometryType){vec2 cap=normal.xy*0.5+0.5;vec3 mc=texture(matCapTexture,cap).rgb;vec3 geometryColor=float(geometryType==1)*vec3(1.0,0.0,0.0)+float(geometryType==2)*vec3(0.0,1.0,0.0)+float(geometryType==3)*vec3(0.0,0.0,1.0)+float(geometryType==4)*vec3(1.0,1.0,0.0);outputColor=vec4(geometryColor*mc,color.a);}else{outputColor=vec4(1.0,0.0,1.0,1.0);}}struct NodeAppearance{vec4 colorTexel;bool isVisible;bool renderInFront;bool renderGhosted;};float floatBitsSubset(float inNumber,int fromLeastSignificantBitIndex,int toMostSignificantBitIndex){float r=float(fromLeastSignificantBitIndex);float l=float(toMostSignificantBitIndex);float bitShift=pow(2.0,r);return mod(((inNumber-mod(inNumber,bitShift))/bitShift),pow(2.0,l - r));}NodeAppearance nodeAppearanceFromTexel(vec4 nodeAppearanceTexel){float alphaUnwrapped=floor((nodeAppearanceTexel.a*255.0)+0.5);bool isVisible=floatBitsSubset(alphaUnwrapped,0,1)==1.0;bool renderInFront=floatBitsSubset(alphaUnwrapped,1,2)==1.0;bool renderGhosted=floatBitsSubset(alphaUnwrapped,2,3)==1.0;return NodeAppearance(nodeAppearanceTexel,isVisible,renderInFront,renderGhosted);}NodeAppearance determineNodeAppearance(sampler2D nodeAppearanceTexture,vec2 textureSize,highp float treeIndex){highp int dataTextureWidth=int(textureSize.x);highp int dataTextureHeight=int(textureSize.y);highp int iTreeIndex=int(treeIndex);highp int xTreeIndexTextureCoord=iTreeIndex % dataTextureWidth;highp int yTreeIndexTextureCoord=iTreeIndex/dataTextureWidth;vec4 texel=texelFetch(nodeAppearanceTexture,ivec2(xTreeIndexTextureCoord,yTreeIndexTextureCoord),0);return nodeAppearanceFromTexel(texel);}vec4 determineColor(vec3 originalColor,NodeAppearance nodeAppearance){vec4 overrideColor=nodeAppearance.colorTexel;if(any(greaterThan(overrideColor.rgb,vec3(0.0)))){return overrideColor;}return vec4(originalColor.rgb,overrideColor.a);}\n#if NUM_CLIPPING_PLANES > 0\nuniform vec4 clippingPlanes[NUM_CLIPPING_PLANES];\n#endif\nbool isClipped(vec3 point){\n#if NUM_CLIPPING_PLANES > 0\nvec3 pointFlipped=-point;vec4 plane;for(int i=0;i<UNION_CLIPPING_PLANES;i++){plane=clippingPlanes[i];if(dot(pointFlipped,plane.xyz)>plane.w)return true;}\n#if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES\nbool clipped=true;for(int i=UNION_CLIPPING_PLANES;i<NUM_CLIPPING_PLANES;i++){plane=clippingPlanes[i];clipped=(dot(pointFlipped,plane.xyz)>plane.w)&&clipped;}if(clipped)return true;\n#endif\n#endif\nreturn false;}struct UnusedTreeIndexPacked{highp float thousands;highp float subThousands;};highp vec2 packTreeIndex(float treeIndex){highp float roundedTreeIndex=round(treeIndex);highp float treeIndexThousands=floor(roundedTreeIndex/1000.0);highp float treeIndexSubThousands=mod(roundedTreeIndex,1000.0);return vec2(treeIndexThousands,treeIndexSubThousands);}highp float unpackTreeIndex(highp vec2 treeIndexPacked){highp float treeIndex=round(treeIndexPacked.x)*1000.0+round(treeIndexPacked.y);return treeIndex;}uniform sampler2D matCapTexture;uniform lowp int renderMode;\n#if defined(IS_TEXTURED)\nuniform sampler2D tDiffuse;in vec2 v_uv;\n#else\nin vec3 v_color;\n#endif\nin vec3 v_viewPosition;in vec4 v_nodeAppearanceTexel;in highp vec2 v_treeIndexPacked;void main(){highp float v_treeIndex=unpackTreeIndex(v_treeIndexPacked);NodeAppearance appearance=nodeAppearanceFromTexel(v_nodeAppearanceTexel);if(isClipped(v_viewPosition)){discard;}\n#if defined(IS_TEXTURED)\nvec3 diffuseColor=texture(tDiffuse,v_uv).rgb;diffuseColor=LinearTosRGB(vec4(diffuseColor,1.0)).xyz;vec4 color=determineColor(diffuseColor,appearance);color=vec4(mix(diffuseColor,vec3(color),0.6),color.a);\n#else\nvec4 color=determineColor(v_color,appearance);\n#endif\nvec3 normal=derivateNormal(v_viewPosition);updateFragmentColor(renderMode,color,v_treeIndex,normal,gl_FragCoord.z,matCapTexture,GeometryType.TriangleMesh);}", on = "mat4 determineMatrixOverride(float treeIndex,vec2 treeIndexTextureSize,sampler2D transformOverrideIndexTexture,vec2 transformOverrideTextureSize,sampler2D transformOverrideTexture){float dataTextureWidth=treeIndexTextureSize.x;float dataTextureHeight=treeIndexTextureSize.y;int xTreeIndexTextureCoord=int(mod(treeIndex,dataTextureWidth));int yTreeIndexTextureCoord=int(floor(treeIndex/dataTextureWidth));float index=texelFetch(transformOverrideIndexTexture,ivec2(xTreeIndexTextureCoord,yTreeIndexTextureCoord),0).r;if(index==0.0){return mat4(1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0);}index-=1.0;float matrixElements[12];for(int i=0;i<12;i++){matrixElements[i]=texelFetch(transformOverrideTexture,ivec2(i+int(index)*16,0.0),0).r;}return mat4(matrixElements[0],matrixElements[4],matrixElements[8],0,matrixElements[1],matrixElements[5],matrixElements[9],0,matrixElements[2],matrixElements[6],matrixElements[10],0,matrixElements[3],matrixElements[7],matrixElements[11],1);}struct UnusedTreeIndexPacked{highp float thousands;highp float subThousands;};highp vec2 packTreeIndex(float treeIndex){highp float roundedTreeIndex=round(treeIndex);highp float treeIndexThousands=floor(roundedTreeIndex/1000.0);highp float treeIndexSubThousands=mod(roundedTreeIndex,1000.0);return vec2(treeIndexThousands,treeIndexSubThousands);}highp float unpackTreeIndex(highp vec2 treeIndexPacked){highp float treeIndex=round(treeIndexPacked.x)*1000.0+round(treeIndexPacked.y);return treeIndex;}const int RenderTypeColor=1;const int RenderTypeNormal=2;const int RenderTypeTreeIndex=3;const int RenderTypePackColorAndNormal=4;const int RenderTypeDepth=5;const int RenderTypeEffects=6;const int RenderTypeGhost=7;const int RenderTypeLOD=8;const int RenderTypeDepthBufferOnly=9;const int RenderTypeGeometryType=10;struct NodeAppearance{vec4 colorTexel;bool isVisible;bool renderInFront;bool renderGhosted;};float floatBitsSubset(float inNumber,int fromLeastSignificantBitIndex,int toMostSignificantBitIndex){float r=float(fromLeastSignificantBitIndex);float l=float(toMostSignificantBitIndex);float bitShift=pow(2.0,r);return mod(((inNumber-mod(inNumber,bitShift))/bitShift),pow(2.0,l - r));}NodeAppearance nodeAppearanceFromTexel(vec4 nodeAppearanceTexel){float alphaUnwrapped=floor((nodeAppearanceTexel.a*255.0)+0.5);bool isVisible=floatBitsSubset(alphaUnwrapped,0,1)==1.0;bool renderInFront=floatBitsSubset(alphaUnwrapped,1,2)==1.0;bool renderGhosted=floatBitsSubset(alphaUnwrapped,2,3)==1.0;return NodeAppearance(nodeAppearanceTexel,isVisible,renderInFront,renderGhosted);}NodeAppearance determineNodeAppearance(sampler2D nodeAppearanceTexture,vec2 textureSize,highp float treeIndex){highp int dataTextureWidth=int(textureSize.x);highp int dataTextureHeight=int(textureSize.y);highp int iTreeIndex=int(treeIndex);highp int xTreeIndexTextureCoord=iTreeIndex % dataTextureWidth;highp int yTreeIndexTextureCoord=iTreeIndex/dataTextureWidth;vec4 texel=texelFetch(nodeAppearanceTexture,ivec2(xTreeIndexTextureCoord,yTreeIndexTextureCoord),0);return nodeAppearanceFromTexel(texel);}bool determineVisibility(NodeAppearance nodeAppearance,int renderMode){bool visible=nodeAppearance.isVisible;bool ghost=(renderMode==RenderTypeGhost)&&nodeAppearance.renderGhosted;bool inFront=(renderMode==RenderTypeEffects)&&nodeAppearance.renderInFront;bool back=(renderMode==RenderTypeColor)&&!nodeAppearance.renderGhosted&&!nodeAppearance.renderInFront;bool other=(renderMode!=RenderTypeColor&&renderMode!=RenderTypeEffects&&renderMode!=RenderTypeGhost)&&!nodeAppearance.renderGhosted;return visible&&(ghost||inFront||back||other);}uniform mat4 modelViewMatrix;uniform mat4 projectionMatrix;uniform vec2 treeIndexTextureSize;uniform vec2 transformOverrideTextureSize;uniform sampler2D transformOverrideIndexTexture;uniform sampler2D transformOverrideTexture;uniform sampler2D colorDataTexture;uniform lowp int renderMode;\n#if defined(IS_TEXTURED)\nin vec2 uv;\n#else\nin vec3 color;\n#endif\nin vec3 position;in float treeIndex;out vec3 v_viewPosition;out vec4 v_nodeAppearanceTexel;\n#if defined(IS_TEXTURED)\nout vec2 v_uv;\n#else\nout vec3 v_color;\n#endif\nout highp vec2 v_treeIndexPacked;void main(){NodeAppearance appearance=determineNodeAppearance(colorDataTexture,treeIndexTextureSize,treeIndex);if(!determineVisibility(appearance,renderMode)){gl_Position=vec4(2.0,2.0,2.0,1.0);return;}v_nodeAppearanceTexel=appearance.colorTexel;v_treeIndexPacked=packTreeIndex(treeIndex);mat4 treeIndexWorldTransform=determineMatrixOverride(treeIndex,treeIndexTextureSize,transformOverrideIndexTexture,transformOverrideTextureSize,transformOverrideTexture);vec4 modelViewPosition=modelViewMatrix*treeIndexWorldTransform*vec4(position,1.0);v_viewPosition=modelViewPosition.xyz;\n#if defined(IS_TEXTURED)\nv_uv=uv;\n#else\nv_color=color;\n#endif\ngl_Position=projectionMatrix*modelViewPosition;}", sn = "precision highp float;vec3 derivateNormal(vec3 v_viewPosition){vec3 fdx=vec3(dFdx(v_viewPosition.x),dFdx(v_viewPosition.y),dFdx(v_viewPosition.z));vec3 fdy=vec3(dFdy(v_viewPosition.x),dFdy(v_viewPosition.y),dFdy(v_viewPosition.z));vec3 normal=normalize(cross(fdx,fdy));return normal;}vec3 rgb2hsv(vec3 c){vec4 K=vec4(0.0,-1.0/3.0,2.0/3.0,-1.0);vec4 p=mix(vec4(c.bg,K.wz),vec4(c.gb,K.xy),step(c.b,c.g));vec4 q=mix(vec4(p.xyw,c.r),vec4(c.r,p.yzx),step(p.x,c.r));float d=q.x-min(q.w,q.y);float e=1.0e-10;return vec3(abs(q.z+(q.w-q.y)/(6.0*d+e)),d/(q.x+e),q.x);}vec3 hsv2rgb(vec3 c){vec4 K=vec4(1.0,2.0/3.0,1.0/3.0,3.0);vec3 p=abs(fract(c.xxx+K.xyz)*6.0-K.www);return c.z*mix(K.xxx,clamp(p-K.xxx,0.0,1.0),c.y);}vec3 packIntToColor(float number){float r=floor(number/(255.0*255.0))/255.0;float g=mod(floor(number/255.0),255.0)/255.0;float b=mod(number,255.0)/255.0;return vec3(r,g,b);}struct GeometryTypeEnum{int Quad;int Primitive;int TriangleMesh;int InstancedMesh;};const GeometryTypeEnum GeometryType=GeometryTypeEnum(1,2,3,4);const int RenderTypeColor=1;const int RenderTypeNormal=2;const int RenderTypeTreeIndex=3;const int RenderTypePackColorAndNormal=4;const int RenderTypeDepth=5;const int RenderTypeEffects=6;const int RenderTypeGhost=7;const int RenderTypeLOD=8;const int RenderTypeDepthBufferOnly=9;const int RenderTypeGeometryType=10;\n#include <packing>\nout vec4 outputColor;vec3 packNormalToRgb(const in vec3 normal){return normalize(normal)*0.5+0.5;}void updateFragmentColor(int renderMode,vec4 color,float treeIndex,vec3 normal,float depth,sampler2D matCapTexture,int geometryType){if(renderMode==RenderTypeColor||renderMode==RenderTypeEffects){\n#if defined(IS_TEXTURED)\nvec3 colorRGB=color.rgb;\n#else\nvec3 hsv=rgb2hsv(color.rgb);hsv.z=min(0.5*hsv.z+0.5,1.0);vec3 colorRGB=hsv2rgb(hsv);\n#endif\nfloat amplitude=max(0.0,dot(normal,vec3(0.0,0.0,1.0)));vec4 albedo=vec4(colorRGB*(0.4+0.6*amplitude),1.0);vec2 cap=normal.xy*0.5+0.5;vec4 mc=vec4(texture(matCapTexture,cap).rgb,1.0);outputColor=vec4(albedo.rgb*mc.rgb*1.7,color.a);}else if(renderMode==RenderTypeGhost){float amplitude=max(0.0,dot(normal,vec3(0.0,0.0,1.0)));float s=0.4+0.6*amplitude;outputColor=vec4(vec3(s),0.3);}else if(renderMode==RenderTypeDepthBufferOnly){outputColor=vec4(1.0,0.0,1.0,1.0);}else if(renderMode==RenderTypePackColorAndNormal){vec3 hsv=rgb2hsv(color.rgb);float a=0.0;if(hsv.y>0.01){if(hsv.z>0.5){a=(0.55+hsv.x*0.45);}else{a=(0.1+hsv.x*0.45);}}else{a=hsv.z*0.09;}outputColor=vec4(packNormalToRgb(normal.rgb),color.a);}else if(renderMode==RenderTypeNormal){outputColor=vec4(packNormalToRgb(normal),color.a);}else if(renderMode==RenderTypeTreeIndex){outputColor=vec4(packIntToColor(treeIndex),color.a);}else if(renderMode==RenderTypeDepth){outputColor=packDepthToRGBA(depth);}else if(renderMode==RenderTypeLOD){bool isHighDetail=geometryType!=GeometryType.Quad;vec2 cap=normal.xy*0.5+0.5;vec3 mc=texture(matCapTexture,cap).rgb*1.5;outputColor=isHighDetail ? vec4(vec3(0.0,1.0,0.0)*mc,color.a): vec4(vec3(1.0,1.0,0.0)*mc,color.a);}else if(renderMode==RenderTypeGeometryType){vec2 cap=normal.xy*0.5+0.5;vec3 mc=texture(matCapTexture,cap).rgb;vec3 geometryColor=float(geometryType==1)*vec3(1.0,0.0,0.0)+float(geometryType==2)*vec3(0.0,1.0,0.0)+float(geometryType==3)*vec3(0.0,0.0,1.0)+float(geometryType==4)*vec3(1.0,1.0,0.0);outputColor=vec4(geometryColor*mc,color.a);}else{outputColor=vec4(1.0,0.0,1.0,1.0);}}struct NodeAppearance{vec4 colorTexel;bool isVisible;bool renderInFront;bool renderGhosted;};float floatBitsSubset(float inNumber,int fromLeastSignificantBitIndex,int toMostSignificantBitIndex){float r=float(fromLeastSignificantBitIndex);float l=float(toMostSignificantBitIndex);float bitShift=pow(2.0,r);return mod(((inNumber-mod(inNumber,bitShift))/bitShift),pow(2.0,l - r));}NodeAppearance nodeAppearanceFromTexel(vec4 nodeAppearanceTexel){float alphaUnwrapped=floor((nodeAppearanceTexel.a*255.0)+0.5);bool isVisible=floatBitsSubset(alphaUnwrapped,0,1)==1.0;bool renderInFront=floatBitsSubset(alphaUnwrapped,1,2)==1.0;bool renderGhosted=floatBitsSubset(alphaUnwrapped,2,3)==1.0;return NodeAppearance(nodeAppearanceTexel,isVisible,renderInFront,renderGhosted);}NodeAppearance determineNodeAppearance(sampler2D nodeAppearanceTexture,vec2 textureSize,highp float treeIndex){highp int dataTextureWidth=int(textureSize.x);highp int dataTextureHeight=int(textureSize.y);highp int iTreeIndex=int(treeIndex);highp int xTreeIndexTextureCoord=iTreeIndex % dataTextureWidth;highp int yTreeIndexTextureCoord=iTreeIndex/dataTextureWidth;vec4 texel=texelFetch(nodeAppearanceTexture,ivec2(xTreeIndexTextureCoord,yTreeIndexTextureCoord),0);return nodeAppearanceFromTexel(texel);}vec4 determineColor(vec3 originalColor,NodeAppearance nodeAppearance){vec4 overrideColor=nodeAppearance.colorTexel;if(any(greaterThan(overrideColor.rgb,vec3(0.0)))){return overrideColor;}return vec4(originalColor.rgb,overrideColor.a);}\n#if NUM_CLIPPING_PLANES > 0\nuniform vec4 clippingPlanes[NUM_CLIPPING_PLANES];\n#endif\nbool isClipped(vec3 point){\n#if NUM_CLIPPING_PLANES > 0\nvec3 pointFlipped=-point;vec4 plane;for(int i=0;i<UNION_CLIPPING_PLANES;i++){plane=clippingPlanes[i];if(dot(pointFlipped,plane.xyz)>plane.w)return true;}\n#if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES\nbool clipped=true;for(int i=UNION_CLIPPING_PLANES;i<NUM_CLIPPING_PLANES;i++){plane=clippingPlanes[i];clipped=(dot(pointFlipped,plane.xyz)>plane.w)&&clipped;}if(clipped)return true;\n#endif\n#endif\nreturn false;}struct UnusedTreeIndexPacked{highp float thousands;highp float subThousands;};highp vec2 packTreeIndex(float treeIndex){highp float roundedTreeIndex=round(treeIndex);highp float treeIndexThousands=floor(roundedTreeIndex/1000.0);highp float treeIndexSubThousands=mod(roundedTreeIndex,1000.0);return vec2(treeIndexThousands,treeIndexSubThousands);}highp float unpackTreeIndex(highp vec2 treeIndexPacked){highp float treeIndex=round(treeIndexPacked.x)*1000.0+round(treeIndexPacked.y);return treeIndex;}uniform sampler2D matCapTexture;uniform lowp int renderMode;in vec3 v_color;in vec3 v_viewPosition;in vec4 v_nodeAppearanceTexel;in highp vec2 v_treeIndexPacked;void main(){highp float treeIndex=unpackTreeIndex(v_treeIndexPacked);NodeAppearance appearance=nodeAppearanceFromTexel(v_nodeAppearanceTexel);if(isClipped(v_viewPosition)){discard;}vec4 color=determineColor(v_color,appearance);vec3 normal=derivateNormal(v_viewPosition);updateFragmentColor(renderMode,color,treeIndex,normal,gl_FragCoord.z,matCapTexture,GeometryType.InstancedMesh);}", cn = "mat4 determineMatrixOverride(float treeIndex,vec2 treeIndexTextureSize,sampler2D transformOverrideIndexTexture,vec2 transformOverrideTextureSize,sampler2D transformOverrideTexture){float dataTextureWidth=treeIndexTextureSize.x;float dataTextureHeight=treeIndexTextureSize.y;int xTreeIndexTextureCoord=int(mod(treeIndex,dataTextureWidth));int yTreeIndexTextureCoord=int(floor(treeIndex/dataTextureWidth));float index=texelFetch(transformOverrideIndexTexture,ivec2(xTreeIndexTextureCoord,yTreeIndexTextureCoord),0).r;if(index==0.0){return mat4(1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0);}index-=1.0;float matrixElements[12];for(int i=0;i<12;i++){matrixElements[i]=texelFetch(transformOverrideTexture,ivec2(i+int(index)*16,0.0),0).r;}return mat4(matrixElements[0],matrixElements[4],matrixElements[8],0,matrixElements[1],matrixElements[5],matrixElements[9],0,matrixElements[2],matrixElements[6],matrixElements[10],0,matrixElements[3],matrixElements[7],matrixElements[11],1);}struct UnusedTreeIndexPacked{highp float thousands;highp float subThousands;};highp vec2 packTreeIndex(float treeIndex){highp float roundedTreeIndex=round(treeIndex);highp float treeIndexThousands=floor(roundedTreeIndex/1000.0);highp float treeIndexSubThousands=mod(roundedTreeIndex,1000.0);return vec2(treeIndexThousands,treeIndexSubThousands);}highp float unpackTreeIndex(highp vec2 treeIndexPacked){highp float treeIndex=round(treeIndexPacked.x)*1000.0+round(treeIndexPacked.y);return treeIndex;}const int RenderTypeColor=1;const int RenderTypeNormal=2;const int RenderTypeTreeIndex=3;const int RenderTypePackColorAndNormal=4;const int RenderTypeDepth=5;const int RenderTypeEffects=6;const int RenderTypeGhost=7;const int RenderTypeLOD=8;const int RenderTypeDepthBufferOnly=9;const int RenderTypeGeometryType=10;struct NodeAppearance{vec4 colorTexel;bool isVisible;bool renderInFront;bool renderGhosted;};float floatBitsSubset(float inNumber,int fromLeastSignificantBitIndex,int toMostSignificantBitIndex){float r=float(fromLeastSignificantBitIndex);float l=float(toMostSignificantBitIndex);float bitShift=pow(2.0,r);return mod(((inNumber-mod(inNumber,bitShift))/bitShift),pow(2.0,l - r));}NodeAppearance nodeAppearanceFromTexel(vec4 nodeAppearanceTexel){float alphaUnwrapped=floor((nodeAppearanceTexel.a*255.0)+0.5);bool isVisible=floatBitsSubset(alphaUnwrapped,0,1)==1.0;bool renderInFront=floatBitsSubset(alphaUnwrapped,1,2)==1.0;bool renderGhosted=floatBitsSubset(alphaUnwrapped,2,3)==1.0;return NodeAppearance(nodeAppearanceTexel,isVisible,renderInFront,renderGhosted);}NodeAppearance determineNodeAppearance(sampler2D nodeAppearanceTexture,vec2 textureSize,highp float treeIndex){highp int dataTextureWidth=int(textureSize.x);highp int dataTextureHeight=int(textureSize.y);highp int iTreeIndex=int(treeIndex);highp int xTreeIndexTextureCoord=iTreeIndex % dataTextureWidth;highp int yTreeIndexTextureCoord=iTreeIndex/dataTextureWidth;vec4 texel=texelFetch(nodeAppearanceTexture,ivec2(xTreeIndexTextureCoord,yTreeIndexTextureCoord),0);return nodeAppearanceFromTexel(texel);}bool determineVisibility(NodeAppearance nodeAppearance,int renderMode){bool visible=nodeAppearance.isVisible;bool ghost=(renderMode==RenderTypeGhost)&&nodeAppearance.renderGhosted;bool inFront=(renderMode==RenderTypeEffects)&&nodeAppearance.renderInFront;bool back=(renderMode==RenderTypeColor)&&!nodeAppearance.renderGhosted&&!nodeAppearance.renderInFront;bool other=(renderMode!=RenderTypeColor&&renderMode!=RenderTypeEffects&&renderMode!=RenderTypeGhost)&&!nodeAppearance.renderGhosted;return visible&&(ghost||inFront||back||other);}uniform mat4 modelViewMatrix;uniform mat4 projectionMatrix;uniform vec2 treeIndexTextureSize;uniform vec2 transformOverrideTextureSize;uniform sampler2D transformOverrideIndexTexture;uniform sampler2D transformOverrideTexture;uniform sampler2D colorDataTexture;uniform lowp int renderMode;in vec3 position;in mat4 a_instanceMatrix;in float a_treeIndex;in vec3 a_color;out vec3 v_color;out vec3 v_viewPosition;out highp vec2 v_treeIndexPacked;out vec4 v_nodeAppearanceTexel;void main(){NodeAppearance appearance=determineNodeAppearance(colorDataTexture,treeIndexTextureSize,a_treeIndex);if(!determineVisibility(appearance,renderMode)){gl_Position=vec4(2.0,2.0,2.0,1.0);return;}v_nodeAppearanceTexel=appearance.colorTexel;v_treeIndexPacked=packTreeIndex(a_treeIndex);mat4 treeIndexWorldTransform=determineMatrixOverride(a_treeIndex,treeIndexTextureSize,transformOverrideIndexTexture,transformOverrideTextureSize,transformOverrideTexture);v_color=a_color;vec3 transformed=(a_instanceMatrix*vec4(position,1.0)).xyz;vec4 modelViewPosition=modelViewMatrix*treeIndexWorldTransform*vec4(transformed,1.0);v_viewPosition=modelViewPosition.xyz;gl_Position=projectionMatrix*modelViewPosition;}", ln = "precision highp float;vec3 rgb2hsv(vec3 c){vec4 K=vec4(0.0,-1.0/3.0,2.0/3.0,-1.0);vec4 p=mix(vec4(c.bg,K.wz),vec4(c.gb,K.xy),step(c.b,c.g));vec4 q=mix(vec4(p.xyw,c.r),vec4(c.r,p.yzx),step(p.x,c.r));float d=q.x-min(q.w,q.y);float e=1.0e-10;return vec3(abs(q.z+(q.w-q.y)/(6.0*d+e)),d/(q.x+e),q.x);}vec3 hsv2rgb(vec3 c){vec4 K=vec4(1.0,2.0/3.0,1.0/3.0,3.0);vec3 p=abs(fract(c.xxx+K.xyz)*6.0-K.www);return c.z*mix(K.xxx,clamp(p-K.xxx,0.0,1.0),c.y);}vec3 packIntToColor(float number){float r=floor(number/(255.0*255.0))/255.0;float g=mod(floor(number/255.0),255.0)/255.0;float b=mod(number,255.0)/255.0;return vec3(r,g,b);}struct GeometryTypeEnum{int Quad;int Primitive;int TriangleMesh;int InstancedMesh;};const GeometryTypeEnum GeometryType=GeometryTypeEnum(1,2,3,4);const int RenderTypeColor=1;const int RenderTypeNormal=2;const int RenderTypeTreeIndex=3;const int RenderTypePackColorAndNormal=4;const int RenderTypeDepth=5;const int RenderTypeEffects=6;const int RenderTypeGhost=7;const int RenderTypeLOD=8;const int RenderTypeDepthBufferOnly=9;const int RenderTypeGeometryType=10;\n#include <packing>\nout vec4 outputColor;vec3 packNormalToRgb(const in vec3 normal){return normalize(normal)*0.5+0.5;}void updateFragmentColor(int renderMode,vec4 color,float treeIndex,vec3 normal,float depth,sampler2D matCapTexture,int geometryType){if(renderMode==RenderTypeColor||renderMode==RenderTypeEffects){\n#if defined(IS_TEXTURED)\nvec3 colorRGB=color.rgb;\n#else\nvec3 hsv=rgb2hsv(color.rgb);hsv.z=min(0.5*hsv.z+0.5,1.0);vec3 colorRGB=hsv2rgb(hsv);\n#endif\nfloat amplitude=max(0.0,dot(normal,vec3(0.0,0.0,1.0)));vec4 albedo=vec4(colorRGB*(0.4+0.6*amplitude),1.0);vec2 cap=normal.xy*0.5+0.5;vec4 mc=vec4(texture(matCapTexture,cap).rgb,1.0);outputColor=vec4(albedo.rgb*mc.rgb*1.7,color.a);}else if(renderMode==RenderTypeGhost){float amplitude=max(0.0,dot(normal,vec3(0.0,0.0,1.0)));float s=0.4+0.6*amplitude;outputColor=vec4(vec3(s),0.3);}else if(renderMode==RenderTypeDepthBufferOnly){outputColor=vec4(1.0,0.0,1.0,1.0);}else if(renderMode==RenderTypePackColorAndNormal){vec3 hsv=rgb2hsv(color.rgb);float a=0.0;if(hsv.y>0.01){if(hsv.z>0.5){a=(0.55+hsv.x*0.45);}else{a=(0.1+hsv.x*0.45);}}else{a=hsv.z*0.09;}outputColor=vec4(packNormalToRgb(normal.rgb),color.a);}else if(renderMode==RenderTypeNormal){outputColor=vec4(packNormalToRgb(normal),color.a);}else if(renderMode==RenderTypeTreeIndex){outputColor=vec4(packIntToColor(treeIndex),color.a);}else if(renderMode==RenderTypeDepth){outputColor=packDepthToRGBA(depth);}else if(renderMode==RenderTypeLOD){bool isHighDetail=geometryType!=GeometryType.Quad;vec2 cap=normal.xy*0.5+0.5;vec3 mc=texture(matCapTexture,cap).rgb*1.5;outputColor=isHighDetail ? vec4(vec3(0.0,1.0,0.0)*mc,color.a): vec4(vec3(1.0,1.0,0.0)*mc,color.a);}else if(renderMode==RenderTypeGeometryType){vec2 cap=normal.xy*0.5+0.5;vec3 mc=texture(matCapTexture,cap).rgb;vec3 geometryColor=float(geometryType==1)*vec3(1.0,0.0,0.0)+float(geometryType==2)*vec3(0.0,1.0,0.0)+float(geometryType==3)*vec3(0.0,0.0,1.0)+float(geometryType==4)*vec3(1.0,1.0,0.0);outputColor=vec4(geometryColor*mc,color.a);}else{outputColor=vec4(1.0,0.0,1.0,1.0);}}struct NodeAppearance{vec4 colorTexel;bool isVisible;bool renderInFront;bool renderGhosted;};float floatBitsSubset(float inNumber,int fromLeastSignificantBitIndex,int toMostSignificantBitIndex){float r=float(fromLeastSignificantBitIndex);float l=float(toMostSignificantBitIndex);float bitShift=pow(2.0,r);return mod(((inNumber-mod(inNumber,bitShift))/bitShift),pow(2.0,l - r));}NodeAppearance nodeAppearanceFromTexel(vec4 nodeAppearanceTexel){float alphaUnwrapped=floor((nodeAppearanceTexel.a*255.0)+0.5);bool isVisible=floatBitsSubset(alphaUnwrapped,0,1)==1.0;bool renderInFront=floatBitsSubset(alphaUnwrapped,1,2)==1.0;bool renderGhosted=floatBitsSubset(alphaUnwrapped,2,3)==1.0;return NodeAppearance(nodeAppearanceTexel,isVisible,renderInFront,renderGhosted);}NodeAppearance determineNodeAppearance(sampler2D nodeAppearanceTexture,vec2 textureSize,highp float treeIndex){highp int dataTextureWidth=int(textureSize.x);highp int dataTextureHeight=int(textureSize.y);highp int iTreeIndex=int(treeIndex);highp int xTreeIndexTextureCoord=iTreeIndex % dataTextureWidth;highp int yTreeIndexTextureCoord=iTreeIndex/dataTextureWidth;vec4 texel=texelFetch(nodeAppearanceTexture,ivec2(xTreeIndexTextureCoord,yTreeIndexTextureCoord),0);return nodeAppearanceFromTexel(texel);}vec4 determineColor(vec3 originalColor,NodeAppearance nodeAppearance){vec4 overrideColor=nodeAppearance.colorTexel;if(any(greaterThan(overrideColor.rgb,vec3(0.0)))){return overrideColor;}return vec4(originalColor.rgb,overrideColor.a);}\n#if NUM_CLIPPING_PLANES > 0\nuniform vec4 clippingPlanes[NUM_CLIPPING_PLANES];\n#endif\nbool isClipped(vec3 point){\n#if NUM_CLIPPING_PLANES > 0\nvec3 pointFlipped=-point;vec4 plane;for(int i=0;i<UNION_CLIPPING_PLANES;i++){plane=clippingPlanes[i];if(dot(pointFlipped,plane.xyz)>plane.w)return true;}\n#if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES\nbool clipped=true;for(int i=UNION_CLIPPING_PLANES;i<NUM_CLIPPING_PLANES;i++){plane=clippingPlanes[i];clipped=(dot(pointFlipped,plane.xyz)>plane.w)&&clipped;}if(clipped)return true;\n#endif\n#endif\nreturn false;}struct UnusedTreeIndexPacked{highp float thousands;highp float subThousands;};highp vec2 packTreeIndex(float treeIndex){highp float roundedTreeIndex=round(treeIndex);highp float treeIndexThousands=floor(roundedTreeIndex/1000.0);highp float treeIndexSubThousands=mod(roundedTreeIndex,1000.0);return vec2(treeIndexThousands,treeIndexSubThousands);}highp float unpackTreeIndex(highp vec2 treeIndexPacked){highp float treeIndex=round(treeIndexPacked.x)*1000.0+round(treeIndexPacked.y);return treeIndex;}uniform sampler2D matCapTexture;uniform lowp int renderMode;in vec2 v_xy;in vec3 v_color;in vec3 v_normal;in vec3 vViewPosition;in vec4 v_nodeAppearanceTexel;in highp vec2 v_treeIndexPacked;void main(){highp float v_treeIndex=unpackTreeIndex(v_treeIndexPacked);float dist=dot(v_xy,v_xy);vec3 normal=normalize(v_normal);if(dist>0.25)discard;NodeAppearance appearance=nodeAppearanceFromTexel(v_nodeAppearanceTexel);if(isClipped(vViewPosition)){discard;}vec4 color=determineColor(v_color,appearance);updateFragmentColor(renderMode,color,v_treeIndex,normal,gl_FragCoord.z,matCapTexture,GeometryType.Primitive);}", un = "mat4 determineMatrixOverride(float treeIndex,vec2 treeIndexTextureSize,sampler2D transformOverrideIndexTexture,vec2 transformOverrideTextureSize,sampler2D transformOverrideTexture){float dataTextureWidth=treeIndexTextureSize.x;float dataTextureHeight=treeIndexTextureSize.y;int xTreeIndexTextureCoord=int(mod(treeIndex,dataTextureWidth));int yTreeIndexTextureCoord=int(floor(treeIndex/dataTextureWidth));float index=texelFetch(transformOverrideIndexTexture,ivec2(xTreeIndexTextureCoord,yTreeIndexTextureCoord),0).r;if(index==0.0){return mat4(1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0);}index-=1.0;float matrixElements[12];for(int i=0;i<12;i++){matrixElements[i]=texelFetch(transformOverrideTexture,ivec2(i+int(index)*16,0.0),0).r;}return mat4(matrixElements[0],matrixElements[4],matrixElements[8],0,matrixElements[1],matrixElements[5],matrixElements[9],0,matrixElements[2],matrixElements[6],matrixElements[10],0,matrixElements[3],matrixElements[7],matrixElements[11],1);}struct UnusedTreeIndexPacked{highp float thousands;highp float subThousands;};highp vec2 packTreeIndex(float treeIndex){highp float roundedTreeIndex=round(treeIndex);highp float treeIndexThousands=floor(roundedTreeIndex/1000.0);highp float treeIndexSubThousands=mod(roundedTreeIndex,1000.0);return vec2(treeIndexThousands,treeIndexSubThousands);}highp float unpackTreeIndex(highp vec2 treeIndexPacked){highp float treeIndex=round(treeIndexPacked.x)*1000.0+round(treeIndexPacked.y);return treeIndex;}const int RenderTypeColor=1;const int RenderTypeNormal=2;const int RenderTypeTreeIndex=3;const int RenderTypePackColorAndNormal=4;const int RenderTypeDepth=5;const int RenderTypeEffects=6;const int RenderTypeGhost=7;const int RenderTypeLOD=8;const int RenderTypeDepthBufferOnly=9;const int RenderTypeGeometryType=10;struct NodeAppearance{vec4 colorTexel;bool isVisible;bool renderInFront;bool renderGhosted;};float floatBitsSubset(float inNumber,int fromLeastSignificantBitIndex,int toMostSignificantBitIndex){float r=float(fromLeastSignificantBitIndex);float l=float(toMostSignificantBitIndex);float bitShift=pow(2.0,r);return mod(((inNumber-mod(inNumber,bitShift))/bitShift),pow(2.0,l - r));}NodeAppearance nodeAppearanceFromTexel(vec4 nodeAppearanceTexel){float alphaUnwrapped=floor((nodeAppearanceTexel.a*255.0)+0.5);bool isVisible=floatBitsSubset(alphaUnwrapped,0,1)==1.0;bool renderInFront=floatBitsSubset(alphaUnwrapped,1,2)==1.0;bool renderGhosted=floatBitsSubset(alphaUnwrapped,2,3)==1.0;return NodeAppearance(nodeAppearanceTexel,isVisible,renderInFront,renderGhosted);}NodeAppearance determineNodeAppearance(sampler2D nodeAppearanceTexture,vec2 textureSize,highp float treeIndex){highp int dataTextureWidth=int(textureSize.x);highp int dataTextureHeight=int(textureSize.y);highp int iTreeIndex=int(treeIndex);highp int xTreeIndexTextureCoord=iTreeIndex % dataTextureWidth;highp int yTreeIndexTextureCoord=iTreeIndex/dataTextureWidth;vec4 texel=texelFetch(nodeAppearanceTexture,ivec2(xTreeIndexTextureCoord,yTreeIndexTextureCoord),0);return nodeAppearanceFromTexel(texel);}bool determineVisibility(NodeAppearance nodeAppearance,int renderMode){bool visible=nodeAppearance.isVisible;bool ghost=(renderMode==RenderTypeGhost)&&nodeAppearance.renderGhosted;bool inFront=(renderMode==RenderTypeEffects)&&nodeAppearance.renderInFront;bool back=(renderMode==RenderTypeColor)&&!nodeAppearance.renderGhosted&&!nodeAppearance.renderInFront;bool other=(renderMode!=RenderTypeColor&&renderMode!=RenderTypeEffects&&renderMode!=RenderTypeGhost)&&!nodeAppearance.renderGhosted;return visible&&(ghost||inFront||back||other);}uniform mat4 modelViewMatrix;uniform mat4 projectionMatrix;uniform mat3 normalMatrix;uniform vec2 treeIndexTextureSize;uniform vec2 transformOverrideTextureSize;uniform sampler2D transformOverrideIndexTexture;uniform sampler2D transformOverrideTexture;uniform sampler2D colorDataTexture;uniform lowp int renderMode;in vec3 position;in mat4 a_instanceMatrix;in float a_treeIndex;in vec3 a_color;in vec3 a_normal;out vec2 v_xy;out vec3 v_color;out vec3 v_normal;out vec3 vViewPosition;out vec4 v_nodeAppearanceTexel;out highp vec2 v_treeIndexPacked;void main(){NodeAppearance appearance=determineNodeAppearance(colorDataTexture,treeIndexTextureSize,a_treeIndex);if(!determineVisibility(appearance,renderMode)){gl_Position=vec4(2.0,2.0,2.0,1.0);return;}v_nodeAppearanceTexel=appearance.colorTexel;v_treeIndexPacked=packTreeIndex(a_treeIndex);v_xy=vec2(position.x,position.y);mat4 treeIndexWorldTransform=determineMatrixOverride(a_treeIndex,treeIndexTextureSize,transformOverrideIndexTexture,transformOverrideTextureSize,transformOverrideTexture);vec3 transformed=(a_instanceMatrix*vec4(position,1.0)).xyz;vec4 mvPosition=modelViewMatrix*treeIndexWorldTransform*vec4(transformed,1.0);v_color=a_color;v_normal=normalMatrix*normalize(treeIndexWorldTransform*vec4(normalize(a_normal),0.0)).xyz;vViewPosition=mvPosition.xyz;gl_Position=projectionMatrix*mvPosition;}", dn = "precision highp float;struct NodeAppearance{vec4 colorTexel;bool isVisible;bool renderInFront;bool renderGhosted;};vec3 rgb2hsv(vec3 c){vec4 K=vec4(0.0,-1.0/3.0,2.0/3.0,-1.0);vec4 p=mix(vec4(c.bg,K.wz),vec4(c.gb,K.xy),step(c.b,c.g));vec4 q=mix(vec4(p.xyw,c.r),vec4(c.r,p.yzx),step(p.x,c.r));float d=q.x-min(q.w,q.y);float e=1.0e-10;return vec3(abs(q.z+(q.w-q.y)/(6.0*d+e)),d/(q.x+e),q.x);}vec3 hsv2rgb(vec3 c){vec4 K=vec4(1.0,2.0/3.0,1.0/3.0,3.0);vec3 p=abs(fract(c.xxx+K.xyz)*6.0-K.www);return c.z*mix(K.xxx,clamp(p-K.xxx,0.0,1.0),c.y);}vec3 packIntToColor(float number){float r=floor(number/(255.0*255.0))/255.0;float g=mod(floor(number/255.0),255.0)/255.0;float b=mod(number,255.0)/255.0;return vec3(r,g,b);}struct GeometryTypeEnum{int Quad;int Primitive;int TriangleMesh;int InstancedMesh;};const GeometryTypeEnum GeometryType=GeometryTypeEnum(1,2,3,4);const int RenderTypeColor=1;const int RenderTypeNormal=2;const int RenderTypeTreeIndex=3;const int RenderTypePackColorAndNormal=4;const int RenderTypeDepth=5;const int RenderTypeEffects=6;const int RenderTypeGhost=7;const int RenderTypeLOD=8;const int RenderTypeDepthBufferOnly=9;const int RenderTypeGeometryType=10;\n#include <packing>\nout vec4 outputColor;vec3 packNormalToRgb(const in vec3 normal){return normalize(normal)*0.5+0.5;}void updateFragmentColor(int renderMode,vec4 color,float treeIndex,vec3 normal,float depth,sampler2D matCapTexture,int geometryType){if(renderMode==RenderTypeColor||renderMode==RenderTypeEffects){\n#if defined(IS_TEXTURED)\nvec3 colorRGB=color.rgb;\n#else\nvec3 hsv=rgb2hsv(color.rgb);hsv.z=min(0.5*hsv.z+0.5,1.0);vec3 colorRGB=hsv2rgb(hsv);\n#endif\nfloat amplitude=max(0.0,dot(normal,vec3(0.0,0.0,1.0)));vec4 albedo=vec4(colorRGB*(0.4+0.6*amplitude),1.0);vec2 cap=normal.xy*0.5+0.5;vec4 mc=vec4(texture(matCapTexture,cap).rgb,1.0);outputColor=vec4(albedo.rgb*mc.rgb*1.7,color.a);}else if(renderMode==RenderTypeGhost){float amplitude=max(0.0,dot(normal,vec3(0.0,0.0,1.0)));float s=0.4+0.6*amplitude;outputColor=vec4(vec3(s),0.3);}else if(renderMode==RenderTypeDepthBufferOnly){outputColor=vec4(1.0,0.0,1.0,1.0);}else if(renderMode==RenderTypePackColorAndNormal){vec3 hsv=rgb2hsv(color.rgb);float a=0.0;if(hsv.y>0.01){if(hsv.z>0.5){a=(0.55+hsv.x*0.45);}else{a=(0.1+hsv.x*0.45);}}else{a=hsv.z*0.09;}outputColor=vec4(packNormalToRgb(normal.rgb),color.a);}else if(renderMode==RenderTypeNormal){outputColor=vec4(packNormalToRgb(normal),color.a);}else if(renderMode==RenderTypeTreeIndex){outputColor=vec4(packIntToColor(treeIndex),color.a);}else if(renderMode==RenderTypeDepth){outputColor=packDepthToRGBA(depth);}else if(renderMode==RenderTypeLOD){bool isHighDetail=geometryType!=GeometryType.Quad;vec2 cap=normal.xy*0.5+0.5;vec3 mc=texture(matCapTexture,cap).rgb*1.5;outputColor=isHighDetail ? vec4(vec3(0.0,1.0,0.0)*mc,color.a): vec4(vec3(1.0,1.0,0.0)*mc,color.a);}else if(renderMode==RenderTypeGeometryType){vec2 cap=normal.xy*0.5+0.5;vec3 mc=texture(matCapTexture,cap).rgb;vec3 geometryColor=float(geometryType==1)*vec3(1.0,0.0,0.0)+float(geometryType==2)*vec3(0.0,1.0,0.0)+float(geometryType==3)*vec3(0.0,0.0,1.0)+float(geometryType==4)*vec3(1.0,1.0,0.0);outputColor=vec4(geometryColor*mc,color.a);}else{outputColor=vec4(1.0,0.0,1.0,1.0);}}float floatBitsSubset(float inNumber,int fromLeastSignificantBitIndex,int toMostSignificantBitIndex){float r=float(fromLeastSignificantBitIndex);float l=float(toMostSignificantBitIndex);float bitShift=pow(2.0,r);return mod(((inNumber-mod(inNumber,bitShift))/bitShift),pow(2.0,l - r));}NodeAppearance nodeAppearanceFromTexel(vec4 nodeAppearanceTexel){float alphaUnwrapped=floor((nodeAppearanceTexel.a*255.0)+0.5);bool isVisible=floatBitsSubset(alphaUnwrapped,0,1)==1.0;bool renderInFront=floatBitsSubset(alphaUnwrapped,1,2)==1.0;bool renderGhosted=floatBitsSubset(alphaUnwrapped,2,3)==1.0;return NodeAppearance(nodeAppearanceTexel,isVisible,renderInFront,renderGhosted);}NodeAppearance determineNodeAppearance(sampler2D nodeAppearanceTexture,vec2 textureSize,highp float treeIndex){highp int dataTextureWidth=int(textureSize.x);highp int dataTextureHeight=int(textureSize.y);highp int iTreeIndex=int(treeIndex);highp int xTreeIndexTextureCoord=iTreeIndex % dataTextureWidth;highp int yTreeIndexTextureCoord=iTreeIndex/dataTextureWidth;vec4 texel=texelFetch(nodeAppearanceTexture,ivec2(xTreeIndexTextureCoord,yTreeIndexTextureCoord),0);return nodeAppearanceFromTexel(texel);}vec4 determineColor(vec3 originalColor,NodeAppearance nodeAppearance){vec4 overrideColor=nodeAppearance.colorTexel;if(any(greaterThan(overrideColor.rgb,vec3(0.0)))){return overrideColor;}return vec4(originalColor.rgb,overrideColor.a);}\n#if NUM_CLIPPING_PLANES > 0\nuniform vec4 clippingPlanes[NUM_CLIPPING_PLANES];\n#endif\nbool isClipped(vec3 point){\n#if NUM_CLIPPING_PLANES > 0\nvec3 pointFlipped=-point;vec4 plane;for(int i=0;i<UNION_CLIPPING_PLANES;i++){plane=clippingPlanes[i];if(dot(pointFlipped,plane.xyz)>plane.w)return true;}\n#if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES\nbool clipped=true;for(int i=UNION_CLIPPING_PLANES;i<NUM_CLIPPING_PLANES;i++){plane=clippingPlanes[i];clipped=(dot(pointFlipped,plane.xyz)>plane.w)&&clipped;}if(clipped)return true;\n#endif\n#endif\nreturn false;}struct UnusedTreeIndexPacked{highp float thousands;highp float subThousands;};highp vec2 packTreeIndex(float treeIndex){highp float roundedTreeIndex=round(treeIndex);highp float treeIndexThousands=floor(roundedTreeIndex/1000.0);highp float treeIndexSubThousands=mod(roundedTreeIndex,1000.0);return vec2(treeIndexThousands,treeIndexSubThousands);}highp float unpackTreeIndex(highp vec2 treeIndexPacked){highp float treeIndex=round(treeIndexPacked.x)*1000.0+round(treeIndexPacked.y);return treeIndex;}\n#define PI 3.14159265359\n#define PI2 6.28318530718\n#define PI_HALF 1.5707963267949\nuniform sampler2D colorDataTexture;uniform sampler2D matCapTexture;uniform vec2 treeIndexTextureSize;uniform mat4 projectionMatrix;uniform lowp int renderMode;float computeFragmentDepth(vec3 p,mat4 projectionMatrix){float projected_intersection_z=projectionMatrix[0][2]*p.x+projectionMatrix[1][2]*p.y+projectionMatrix[2][2]*p.z+projectionMatrix[3][2];float projected_intersection_w=projectionMatrix[0][3]*p.x+projectionMatrix[1][3]*p.y+projectionMatrix[2][3]*p.z+projectionMatrix[3][3];return((gl_DepthRange.diff*(projected_intersection_z/projected_intersection_w))+gl_DepthRange.near+gl_DepthRange.far)*.5;}float updateFragmentDepth(vec3 p,mat4 projectionMatrix){gl_FragDepth=computeFragmentDepth(p,projectionMatrix);return gl_FragDepth;}in vec4 v_centerB;in vec4 v_W;in vec4 v_U;in float v_angle;in float v_arcAngle;in vec4 v_centerA;in vec4 v_V;in vec3 v_color;in vec3 v_normal;in highp vec2 v_treeIndexPacked;void main(){highp float v_treeIndex=unpackTreeIndex(v_treeIndexPacked);NodeAppearance appearance=determineNodeAppearance(colorDataTexture,treeIndexTextureSize,v_treeIndex);vec3 normal=normalize(v_normal);vec4 color=determineColor(v_color,appearance);float R1=v_centerB.w;vec4 U=v_U;vec4 W=v_W;vec4 V=v_V;float height=length(v_centerA.xyz-v_centerB.xyz);float R2=v_centerA.w;float dR=R2-R1;mat3 basis=mat3(U.xyz,V.xyz,W.xyz);vec3 surfacePoint=vec3(U.w,V.w,W.w);vec3 rayTarget=surfacePoint;float rayTargetDist=length(rayTarget);\n#if defined(COGNITE_ORTHOGRAPHIC_CAMERA)\nvec3 rayDirection=vec3(0.0,0.0,-1.0);\n#else\nvec3 rayDirection=normalize(rayTarget);\n#endif\nvec3 diff=rayTarget-v_centerB.xyz;vec3 E=diff*basis;vec3 D=rayDirection*basis;float a=dot(D.xy,D.xy);float b=dot(E.xy,D.xy);float c=dot(E.xy,E.xy)-R1*R1;if(R1!=R2){float dRLInv=dR/height;float dRdRL2Inv=dRLInv*dRLInv;a-=D.z*D.z*dRdRL2Inv;b-=dRLInv*(E.z*D.z*dRLInv+R1*D.z);c-=dRLInv*(E.z*E.z*dRLInv+2.0*R1*E.z);}float d=b*b-a*c;if(d<0.0){discard;}float sqrtd=sqrt(d);float dist1=(-b-sqrtd)/a;float dist2=(-b+sqrtd)/a;if(dist2<dist1){float tmp=dist1;dist1=dist2;dist2=tmp;}float dist=dist1;vec3 intersectionPoint=E+dist*D;float theta=atan(intersectionPoint.y,intersectionPoint.x);if(theta<v_angle)theta+=2.0*PI;if(theta<v_angle)theta+=2.0*PI;vec3 p=rayTarget+dist*rayDirection;bool isInner=false;if(intersectionPoint.z<=0.0||intersectionPoint.z>height||theta>v_angle+v_arcAngle||isClipped(p)||rayTargetDist+dist<0.0){isInner=true;dist=dist2;intersectionPoint=E+dist*D;theta=atan(intersectionPoint.y,intersectionPoint.x);p=rayTarget+dist*rayDirection;if(theta<v_angle)theta+=2.0*PI;if(theta<v_angle)theta+=2.0*PI;if(intersectionPoint.z<=0.0||intersectionPoint.z>height||theta>v_angle+v_arcAngle||isClipped(p)||rayTargetDist+dist<0.0){discard;}}\n#if !defined(COGNITE_RENDER_COLOR_ID) && !defined(COGNITE_RENDER_DEPTH)\nif(R1!=R2){vec3 n=-normalize(W.xyz);vec3 P1=v_centerB.xyz;vec3 P2=v_centerA.xyz;vec3 A=cross(P1-p,P2 - p);vec3 t=normalize(cross(n,A));vec3 o1=P1+R1*t;vec3 o2=P2+R2*t;vec3 B=o2-o1;normal=normalize(cross(A,B));}else{vec3 p_local=p-v_centerB.xyz;normal=normalize(p_local-W.xyz*dot(p_local,W.xyz));}if(dot(normal,vec3(0.0,0.0,1.0))<0.0){normal*=-1.0;}\n#endif\nfloat fragDepth=updateFragmentDepth(p,projectionMatrix);updateFragmentColor(renderMode,color,v_treeIndex,normal,fragDepth,matCapTexture,GeometryType.Primitive);}", fn = "vec3 mul3(mat4 M,vec3 v){vec4 u=M*vec4(v,1.0);return u.xyz/u.w;}bool isWithinSpan(vec3 point,vec3 span){return all(lessThan(abs(point),span));}vec3 transformQuadToCoverScreenInViewSpace(vec3 position,mat4 projectionMatrix,float near){float tanFov=1.0/projectionMatrix[1][1];float aspect=projectionMatrix[1][1]/projectionMatrix[0][0];float maxAspect=max(aspect,1.0/aspect);vec3 fullScreenQuadCorner=vec3(position.xy*maxAspect*tanFov*near,-near - 1e-6);return fullScreenQuadCorner;}mat4 determineMatrixOverride(float treeIndex,vec2 treeIndexTextureSize,sampler2D transformOverrideIndexTexture,vec2 transformOverrideTextureSize,sampler2D transformOverrideTexture){float dataTextureWidth=treeIndexTextureSize.x;float dataTextureHeight=treeIndexTextureSize.y;int xTreeIndexTextureCoord=int(mod(treeIndex,dataTextureWidth));int yTreeIndexTextureCoord=int(floor(treeIndex/dataTextureWidth));float index=texelFetch(transformOverrideIndexTexture,ivec2(xTreeIndexTextureCoord,yTreeIndexTextureCoord),0).r;if(index==0.0){return mat4(1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0);}index-=1.0;float matrixElements[12];for(int i=0;i<12;i++){matrixElements[i]=texelFetch(transformOverrideTexture,ivec2(i+int(index)*16,0.0),0).r;}return mat4(matrixElements[0],matrixElements[4],matrixElements[8],0,matrixElements[1],matrixElements[5],matrixElements[9],0,matrixElements[2],matrixElements[6],matrixElements[10],0,matrixElements[3],matrixElements[7],matrixElements[11],1);}struct UnusedTreeIndexPacked{highp float thousands;highp float subThousands;};highp vec2 packTreeIndex(float treeIndex){highp float roundedTreeIndex=round(treeIndex);highp float treeIndexThousands=floor(roundedTreeIndex/1000.0);highp float treeIndexSubThousands=mod(roundedTreeIndex,1000.0);return vec2(treeIndexThousands,treeIndexSubThousands);}highp float unpackTreeIndex(highp vec2 treeIndexPacked){highp float treeIndex=round(treeIndexPacked.x)*1000.0+round(treeIndexPacked.y);return treeIndex;}const int RenderTypeColor=1;const int RenderTypeNormal=2;const int RenderTypeTreeIndex=3;const int RenderTypePackColorAndNormal=4;const int RenderTypeDepth=5;const int RenderTypeEffects=6;const int RenderTypeGhost=7;const int RenderTypeLOD=8;const int RenderTypeDepthBufferOnly=9;const int RenderTypeGeometryType=10;struct NodeAppearance{vec4 colorTexel;bool isVisible;bool renderInFront;bool renderGhosted;};float floatBitsSubset(float inNumber,int fromLeastSignificantBitIndex,int toMostSignificantBitIndex){float r=float(fromLeastSignificantBitIndex);float l=float(toMostSignificantBitIndex);float bitShift=pow(2.0,r);return mod(((inNumber-mod(inNumber,bitShift))/bitShift),pow(2.0,l - r));}NodeAppearance nodeAppearanceFromTexel(vec4 nodeAppearanceTexel){float alphaUnwrapped=floor((nodeAppearanceTexel.a*255.0)+0.5);bool isVisible=floatBitsSubset(alphaUnwrapped,0,1)==1.0;bool renderInFront=floatBitsSubset(alphaUnwrapped,1,2)==1.0;bool renderGhosted=floatBitsSubset(alphaUnwrapped,2,3)==1.0;return NodeAppearance(nodeAppearanceTexel,isVisible,renderInFront,renderGhosted);}NodeAppearance determineNodeAppearance(sampler2D nodeAppearanceTexture,vec2 textureSize,highp float treeIndex){highp int dataTextureWidth=int(textureSize.x);highp int dataTextureHeight=int(textureSize.y);highp int iTreeIndex=int(treeIndex);highp int xTreeIndexTextureCoord=iTreeIndex % dataTextureWidth;highp int yTreeIndexTextureCoord=iTreeIndex/dataTextureWidth;vec4 texel=texelFetch(nodeAppearanceTexture,ivec2(xTreeIndexTextureCoord,yTreeIndexTextureCoord),0);return nodeAppearanceFromTexel(texel);}bool determineVisibility(NodeAppearance nodeAppearance,int renderMode){bool visible=nodeAppearance.isVisible;bool ghost=(renderMode==RenderTypeGhost)&&nodeAppearance.renderGhosted;bool inFront=(renderMode==RenderTypeEffects)&&nodeAppearance.renderInFront;bool back=(renderMode==RenderTypeColor)&&!nodeAppearance.renderGhosted&&!nodeAppearance.renderInFront;bool other=(renderMode!=RenderTypeColor&&renderMode!=RenderTypeEffects&&renderMode!=RenderTypeGhost)&&!nodeAppearance.renderGhosted;return visible&&(ghost||inFront||back||other);}uniform mat4 inverseModelMatrix;uniform mat4 modelViewMatrix;uniform mat4 projectionMatrix;uniform mat3 normalMatrix;uniform vec3 cameraPosition;uniform vec2 treeIndexTextureSize;uniform vec2 transformOverrideTextureSize;uniform sampler2D transformOverrideIndexTexture;uniform sampler2D transformOverrideTexture;uniform sampler2D colorDataTexture;uniform lowp int renderMode;in vec3 position;in vec3 normal;in float a_treeIndex;in vec3 a_centerA;in vec3 a_centerB;in float a_radiusA;in float a_radiusB;in vec3 a_color;in vec3 a_localXAxis;in float a_angle;in float a_arcAngle;out vec4 v_centerB;out vec4 v_U;out vec4 v_W;out vec4 v_centerA;out vec4 v_V;out float v_angle;out float v_arcAngle;out vec3 v_color;out vec3 v_normal;out highp vec2 v_treeIndexPacked;void main(){NodeAppearance appearance=determineNodeAppearance(colorDataTexture,treeIndexTextureSize,a_treeIndex);if(!determineVisibility(appearance,renderMode)){gl_Position=vec4(2.0,2.0,2.0,1.0);return;}v_treeIndexPacked=packTreeIndex(a_treeIndex);mat4 treeIndexWorldTransform=determineMatrixOverride(a_treeIndex,treeIndexTextureSize,transformOverrideIndexTexture,transformOverrideTextureSize,transformOverrideTexture);vec3 centerA=mul3(treeIndexWorldTransform,a_centerA);vec3 centerB=mul3(treeIndexWorldTransform,a_centerB);vec3 center=0.5*(centerA+centerB);float halfHeight=0.5*length(centerA-centerB);vec3 dir=normalize(centerA-centerB);vec3 newPosition=position;vec3 rayOrigin=(inverseModelMatrix*vec4(cameraPosition,1.0)).xyz;vec3 objectToCameraModelSpace=rayOrigin-center;float maxRadius=max(a_radiusA,a_radiusB);float leftUpScale=maxRadius;vec3 lDir=dir;if(dot(objectToCameraModelSpace,dir)<0.0){lDir=-lDir;}vec3 left=normalize(cross(objectToCameraModelSpace,lDir));vec3 up=normalize(cross(left,lDir));newPosition.x*=1.0-(maxRadius*(position.x+1.0)*0.0025/halfHeight);mat3 billboardWorldRotation=mat3(lDir,left,up);vec3 cylinderAxisScales=vec3(halfHeight,maxRadius,maxRadius);mat3 inverseBillboardWorldRotation=transpose(billboardWorldRotation);vec3 cameraPosInCylinderSpace=inverseBillboardWorldRotation*(rayOrigin-center);mat3 billboardWorldScaleRotation=mat3(halfHeight*lDir,maxRadius*left,maxRadius*up);vec3 localBillboardPosition=center+billboardWorldScaleRotation*newPosition;vec3 surfacePoint=mul3(modelViewMatrix,localBillboardPosition);float near=min(1.0,projectionMatrix[3][2]/(projectionMatrix[2][2]-1.0));if(isWithinSpan(cameraPosInCylinderSpace,cylinderAxisScales+vec3(near))){surfacePoint=transformQuadToCoverScreenInViewSpace(newPosition,projectionMatrix,near);}gl_Position=projectionMatrix*vec4(surfacePoint,1.0);v_angle=a_angle;v_arcAngle=a_arcAngle;v_W.xyz=dir;v_U.xyz=(treeIndexWorldTransform*vec4(a_localXAxis,0.0)).xyz;v_W.xyz=normalize(normalMatrix*v_W.xyz);v_U.xyz=normalize(normalMatrix*v_U.xyz);v_W.w=surfacePoint.z;v_U.w=surfacePoint.x;mat4 modelToTransformOffset=modelViewMatrix*treeIndexWorldTransform;float radiusB=length((modelToTransformOffset*vec4(a_localXAxis*a_radiusB,0.0)).xyz);float radiusA=length((modelToTransformOffset*vec4(a_localXAxis*a_radiusA,0.0)).xyz);v_centerB.xyz=mul3(modelViewMatrix,centerB);v_centerB.w=radiusB;v_V.xyz=-cross(v_U.xyz,v_W.xyz);v_V.w=surfacePoint.y;v_centerA.xyz=mul3(modelViewMatrix,centerA);v_centerA.w=radiusA;v_color=a_color;v_normal=normalMatrix*normal;}", pn = "precision highp float;struct NodeAppearance{vec4 colorTexel;bool isVisible;bool renderInFront;bool renderGhosted;};vec3 rgb2hsv(vec3 c){vec4 K=vec4(0.0,-1.0/3.0,2.0/3.0,-1.0);vec4 p=mix(vec4(c.bg,K.wz),vec4(c.gb,K.xy),step(c.b,c.g));vec4 q=mix(vec4(p.xyw,c.r),vec4(c.r,p.yzx),step(p.x,c.r));float d=q.x-min(q.w,q.y);float e=1.0e-10;return vec3(abs(q.z+(q.w-q.y)/(6.0*d+e)),d/(q.x+e),q.x);}vec3 hsv2rgb(vec3 c){vec4 K=vec4(1.0,2.0/3.0,1.0/3.0,3.0);vec3 p=abs(fract(c.xxx+K.xyz)*6.0-K.www);return c.z*mix(K.xxx,clamp(p-K.xxx,0.0,1.0),c.y);}vec3 packIntToColor(float number){float r=floor(number/(255.0*255.0))/255.0;float g=mod(floor(number/255.0),255.0)/255.0;float b=mod(number,255.0)/255.0;return vec3(r,g,b);}struct GeometryTypeEnum{int Quad;int Primitive;int TriangleMesh;int InstancedMesh;};const GeometryTypeEnum GeometryType=GeometryTypeEnum(1,2,3,4);const int RenderTypeColor=1;const int RenderTypeNormal=2;const int RenderTypeTreeIndex=3;const int RenderTypePackColorAndNormal=4;const int RenderTypeDepth=5;const int RenderTypeEffects=6;const int RenderTypeGhost=7;const int RenderTypeLOD=8;const int RenderTypeDepthBufferOnly=9;const int RenderTypeGeometryType=10;\n#include <packing>\nout vec4 outputColor;vec3 packNormalToRgb(const in vec3 normal){return normalize(normal)*0.5+0.5;}void updateFragmentColor(int renderMode,vec4 color,float treeIndex,vec3 normal,float depth,sampler2D matCapTexture,int geometryType){if(renderMode==RenderTypeColor||renderMode==RenderTypeEffects){\n#if defined(IS_TEXTURED)\nvec3 colorRGB=color.rgb;\n#else\nvec3 hsv=rgb2hsv(color.rgb);hsv.z=min(0.5*hsv.z+0.5,1.0);vec3 colorRGB=hsv2rgb(hsv);\n#endif\nfloat amplitude=max(0.0,dot(normal,vec3(0.0,0.0,1.0)));vec4 albedo=vec4(colorRGB*(0.4+0.6*amplitude),1.0);vec2 cap=normal.xy*0.5+0.5;vec4 mc=vec4(texture(matCapTexture,cap).rgb,1.0);outputColor=vec4(albedo.rgb*mc.rgb*1.7,color.a);}else if(renderMode==RenderTypeGhost){float amplitude=max(0.0,dot(normal,vec3(0.0,0.0,1.0)));float s=0.4+0.6*amplitude;outputColor=vec4(vec3(s),0.3);}else if(renderMode==RenderTypeDepthBufferOnly){outputColor=vec4(1.0,0.0,1.0,1.0);}else if(renderMode==RenderTypePackColorAndNormal){vec3 hsv=rgb2hsv(color.rgb);float a=0.0;if(hsv.y>0.01){if(hsv.z>0.5){a=(0.55+hsv.x*0.45);}else{a=(0.1+hsv.x*0.45);}}else{a=hsv.z*0.09;}outputColor=vec4(packNormalToRgb(normal.rgb),color.a);}else if(renderMode==RenderTypeNormal){outputColor=vec4(packNormalToRgb(normal),color.a);}else if(renderMode==RenderTypeTreeIndex){outputColor=vec4(packIntToColor(treeIndex),color.a);}else if(renderMode==RenderTypeDepth){outputColor=packDepthToRGBA(depth);}else if(renderMode==RenderTypeLOD){bool isHighDetail=geometryType!=GeometryType.Quad;vec2 cap=normal.xy*0.5+0.5;vec3 mc=texture(matCapTexture,cap).rgb*1.5;outputColor=isHighDetail ? vec4(vec3(0.0,1.0,0.0)*mc,color.a): vec4(vec3(1.0,1.0,0.0)*mc,color.a);}else if(renderMode==RenderTypeGeometryType){vec2 cap=normal.xy*0.5+0.5;vec3 mc=texture(matCapTexture,cap).rgb;vec3 geometryColor=float(geometryType==1)*vec3(1.0,0.0,0.0)+float(geometryType==2)*vec3(0.0,1.0,0.0)+float(geometryType==3)*vec3(0.0,0.0,1.0)+float(geometryType==4)*vec3(1.0,1.0,0.0);outputColor=vec4(geometryColor*mc,color.a);}else{outputColor=vec4(1.0,0.0,1.0,1.0);}}float floatBitsSubset(float inNumber,int fromLeastSignificantBitIndex,int toMostSignificantBitIndex){float r=float(fromLeastSignificantBitIndex);float l=float(toMostSignificantBitIndex);float bitShift=pow(2.0,r);return mod(((inNumber-mod(inNumber,bitShift))/bitShift),pow(2.0,l - r));}NodeAppearance nodeAppearanceFromTexel(vec4 nodeAppearanceTexel){float alphaUnwrapped=floor((nodeAppearanceTexel.a*255.0)+0.5);bool isVisible=floatBitsSubset(alphaUnwrapped,0,1)==1.0;bool renderInFront=floatBitsSubset(alphaUnwrapped,1,2)==1.0;bool renderGhosted=floatBitsSubset(alphaUnwrapped,2,3)==1.0;return NodeAppearance(nodeAppearanceTexel,isVisible,renderInFront,renderGhosted);}NodeAppearance determineNodeAppearance(sampler2D nodeAppearanceTexture,vec2 textureSize,highp float treeIndex){highp int dataTextureWidth=int(textureSize.x);highp int dataTextureHeight=int(textureSize.y);highp int iTreeIndex=int(treeIndex);highp int xTreeIndexTextureCoord=iTreeIndex % dataTextureWidth;highp int yTreeIndexTextureCoord=iTreeIndex/dataTextureWidth;vec4 texel=texelFetch(nodeAppearanceTexture,ivec2(xTreeIndexTextureCoord,yTreeIndexTextureCoord),0);return nodeAppearanceFromTexel(texel);}vec4 determineColor(vec3 originalColor,NodeAppearance nodeAppearance){vec4 overrideColor=nodeAppearance.colorTexel;if(any(greaterThan(overrideColor.rgb,vec3(0.0)))){return overrideColor;}return vec4(originalColor.rgb,overrideColor.a);}\n#if NUM_CLIPPING_PLANES > 0\nuniform vec4 clippingPlanes[NUM_CLIPPING_PLANES];\n#endif\nbool isClipped(vec3 point){\n#if NUM_CLIPPING_PLANES > 0\nvec3 pointFlipped=-point;vec4 plane;for(int i=0;i<UNION_CLIPPING_PLANES;i++){plane=clippingPlanes[i];if(dot(pointFlipped,plane.xyz)>plane.w)return true;}\n#if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES\nbool clipped=true;for(int i=UNION_CLIPPING_PLANES;i<NUM_CLIPPING_PLANES;i++){plane=clippingPlanes[i];clipped=(dot(pointFlipped,plane.xyz)>plane.w)&&clipped;}if(clipped)return true;\n#endif\n#endif\nreturn false;}struct UnusedTreeIndexPacked{highp float thousands;highp float subThousands;};highp vec2 packTreeIndex(float treeIndex){highp float roundedTreeIndex=round(treeIndex);highp float treeIndexThousands=floor(roundedTreeIndex/1000.0);highp float treeIndexSubThousands=mod(roundedTreeIndex,1000.0);return vec2(treeIndexThousands,treeIndexSubThousands);}highp float unpackTreeIndex(highp vec2 treeIndexPacked){highp float treeIndex=round(treeIndexPacked.x)*1000.0+round(treeIndexPacked.y);return treeIndex;}\n#define PI 3.14159265359\n#define PI2 6.28318530718\n#define PI_HALF 1.5707963267949\nuniform sampler2D colorDataTexture;uniform sampler2D matCapTexture;uniform vec2 treeIndexTextureSize;uniform mat4 projectionMatrix;uniform lowp int renderMode;float computeFragmentDepth(vec3 p,mat4 projectionMatrix){float projected_intersection_z=projectionMatrix[0][2]*p.x+projectionMatrix[1][2]*p.y+projectionMatrix[2][2]*p.z+projectionMatrix[3][2];float projected_intersection_w=projectionMatrix[0][3]*p.x+projectionMatrix[1][3]*p.y+projectionMatrix[2][3]*p.z+projectionMatrix[3][3];return((gl_DepthRange.diff*(projected_intersection_z/projected_intersection_w))+gl_DepthRange.near+gl_DepthRange.far)*.5;}float updateFragmentDepth(vec3 p,mat4 projectionMatrix){gl_FragDepth=computeFragmentDepth(p,projectionMatrix);return gl_FragDepth;}in vec4 U;in vec4 V;in vec4 axis;in vec4 v_centerA;in vec4 v_centerB;in float height;in vec3 v_color;in vec3 v_normal;in highp vec2 v_treeIndexPacked;void main(){highp float v_treeIndex=unpackTreeIndex(v_treeIndexPacked);NodeAppearance appearance=determineNodeAppearance(colorDataTexture,treeIndexTextureSize,v_treeIndex);vec4 color=determineColor(v_color,appearance);vec3 normal=normalize(v_normal);mat3 basis=mat3(U.xyz,V.xyz,axis.xyz);vec3 surfacePoint=vec3(U.w,V.w,axis.w);vec3 rayTarget=surfacePoint;float rayTargetDist=length(rayTarget);\n#if defined(COGNITE_ORTHOGRAPHIC_CAMERA)\nvec3 rayDirection=vec3(0.0,0.0,-1.0);\n#else\nvec3 rayDirection=normalize(rayTarget);\n#endif\nvec3 diff=rayTarget-v_centerA.xyz;vec3 E=diff*basis;float L=height;vec3 D=rayDirection*basis;float R1=v_centerA.w;float R2=v_centerB.w;float dR=R2-R1;float a=dot(D.xy,D.xy);float b=dot(E.xy,D.xy);float c=dot(E.xy,E.xy)-R1*R1;float L2Inv=1.0/(L*L);if(R1!=R2){float dRLInv=dR/L;float dRdRL2Inv=dRLInv*dRLInv;a-=D.z*D.z*dRdRL2Inv;b-=dRLInv*(E.z*D.z*dRLInv+R1*D.z);c-=dRLInv*(E.z*E.z*dRLInv+2.0*R1*E.z);}vec2 displacement=((v_centerB.xyz-v_centerA.xyz)*basis).xy;float displacementLengthSquared=dot(displacement,displacement);a+=D.z*(D.z*displacementLengthSquared-2.0*L*dot(D.xy,displacement))*L2Inv;b+=(D.z*E.z*displacementLengthSquared-L*(D.x*E.z*displacement.x+D.y*E.z*displacement.y+D.z*E.x*displacement.x+D.z*E.y*displacement.y))*L2Inv;c+=E.z*(E.z*displacementLengthSquared-2.0*L*dot(E.xy,displacement))*L2Inv;float d=b*b-a*c;if(d<0.0){discard;}float sqrtd=sqrt(d);float dist1=(-b-sqrtd)/a;float dist2=(-b+sqrtd)/a;if(dist2<dist1){float tmp=dist1;dist1=dist2;dist2=tmp;}float dist=dist1;float intersectionPointZ=E.z+dist*D.z;vec3 p=rayTarget+dist*rayDirection;if(intersectionPointZ<=0.0||intersectionPointZ>=L||isClipped(p)||rayTargetDist+dist<0.0){dist=dist2;intersectionPointZ=E.z+dist*D.z;p=rayTarget+dist*rayDirection;if(intersectionPointZ<=0.0||intersectionPointZ>=L||isClipped(p)||rayTargetDist+dist<0.0){discard;}}\n#if !defined(COGNITE_RENDER_COLOR_ID) && !defined(COGNITE_RENDER_DEPTH)\nvec3 n=normalize(-axis.xyz);vec3 v_centerA=v_centerA.xyz;vec3 v_centerB=v_centerB.xyz;vec3 A=cross(v_centerA-p,v_centerB - p);vec3 t=normalize(cross(n,A));vec3 o1=v_centerA+R1*t;vec3 o2=v_centerB+R2*t;vec3 B=o2-o1;normal=normalize(cross(A,B));\n#endif\nif(dot(normal,vec3(0.0,0.0,1.0))<0.0){normal*=-1.0;}float fragDepth=updateFragmentDepth(p,projectionMatrix);updateFragmentColor(renderMode,color,v_treeIndex,normal,fragDepth,matCapTexture,GeometryType.Primitive);}", mn = "vec3 mul3(mat4 M,vec3 v){vec4 u=M*vec4(v,1.0);return u.xyz/u.w;}bool isWithinSpan(vec3 point,vec3 span){return all(lessThan(abs(point),span));}vec3 transformQuadToCoverScreenInViewSpace(vec3 position,mat4 projectionMatrix,float near){float tanFov=1.0/projectionMatrix[1][1];float aspect=projectionMatrix[1][1]/projectionMatrix[0][0];float maxAspect=max(aspect,1.0/aspect);vec3 fullScreenQuadCorner=vec3(position.xy*maxAspect*tanFov*near,-near - 1e-6);return fullScreenQuadCorner;}mat4 determineMatrixOverride(float treeIndex,vec2 treeIndexTextureSize,sampler2D transformOverrideIndexTexture,vec2 transformOverrideTextureSize,sampler2D transformOverrideTexture){float dataTextureWidth=treeIndexTextureSize.x;float dataTextureHeight=treeIndexTextureSize.y;int xTreeIndexTextureCoord=int(mod(treeIndex,dataTextureWidth));int yTreeIndexTextureCoord=int(floor(treeIndex/dataTextureWidth));float index=texelFetch(transformOverrideIndexTexture,ivec2(xTreeIndexTextureCoord,yTreeIndexTextureCoord),0).r;if(index==0.0){return mat4(1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0);}index-=1.0;float matrixElements[12];for(int i=0;i<12;i++){matrixElements[i]=texelFetch(transformOverrideTexture,ivec2(i+int(index)*16,0.0),0).r;}return mat4(matrixElements[0],matrixElements[4],matrixElements[8],0,matrixElements[1],matrixElements[5],matrixElements[9],0,matrixElements[2],matrixElements[6],matrixElements[10],0,matrixElements[3],matrixElements[7],matrixElements[11],1);}struct UnusedTreeIndexPacked{highp float thousands;highp float subThousands;};highp vec2 packTreeIndex(float treeIndex){highp float roundedTreeIndex=round(treeIndex);highp float treeIndexThousands=floor(roundedTreeIndex/1000.0);highp float treeIndexSubThousands=mod(roundedTreeIndex,1000.0);return vec2(treeIndexThousands,treeIndexSubThousands);}highp float unpackTreeIndex(highp vec2 treeIndexPacked){highp float treeIndex=round(treeIndexPacked.x)*1000.0+round(treeIndexPacked.y);return treeIndex;}const int RenderTypeColor=1;const int RenderTypeNormal=2;const int RenderTypeTreeIndex=3;const int RenderTypePackColorAndNormal=4;const int RenderTypeDepth=5;const int RenderTypeEffects=6;const int RenderTypeGhost=7;const int RenderTypeLOD=8;const int RenderTypeDepthBufferOnly=9;const int RenderTypeGeometryType=10;struct NodeAppearance{vec4 colorTexel;bool isVisible;bool renderInFront;bool renderGhosted;};float floatBitsSubset(float inNumber,int fromLeastSignificantBitIndex,int toMostSignificantBitIndex){float r=float(fromLeastSignificantBitIndex);float l=float(toMostSignificantBitIndex);float bitShift=pow(2.0,r);return mod(((inNumber-mod(inNumber,bitShift))/bitShift),pow(2.0,l - r));}NodeAppearance nodeAppearanceFromTexel(vec4 nodeAppearanceTexel){float alphaUnwrapped=floor((nodeAppearanceTexel.a*255.0)+0.5);bool isVisible=floatBitsSubset(alphaUnwrapped,0,1)==1.0;bool renderInFront=floatBitsSubset(alphaUnwrapped,1,2)==1.0;bool renderGhosted=floatBitsSubset(alphaUnwrapped,2,3)==1.0;return NodeAppearance(nodeAppearanceTexel,isVisible,renderInFront,renderGhosted);}NodeAppearance determineNodeAppearance(sampler2D nodeAppearanceTexture,vec2 textureSize,highp float treeIndex){highp int dataTextureWidth=int(textureSize.x);highp int dataTextureHeight=int(textureSize.y);highp int iTreeIndex=int(treeIndex);highp int xTreeIndexTextureCoord=iTreeIndex % dataTextureWidth;highp int yTreeIndexTextureCoord=iTreeIndex/dataTextureWidth;vec4 texel=texelFetch(nodeAppearanceTexture,ivec2(xTreeIndexTextureCoord,yTreeIndexTextureCoord),0);return nodeAppearanceFromTexel(texel);}bool determineVisibility(NodeAppearance nodeAppearance,int renderMode){bool visible=nodeAppearance.isVisible;bool ghost=(renderMode==RenderTypeGhost)&&nodeAppearance.renderGhosted;bool inFront=(renderMode==RenderTypeEffects)&&nodeAppearance.renderInFront;bool back=(renderMode==RenderTypeColor)&&!nodeAppearance.renderGhosted&&!nodeAppearance.renderInFront;bool other=(renderMode!=RenderTypeColor&&renderMode!=RenderTypeEffects&&renderMode!=RenderTypeGhost)&&!nodeAppearance.renderGhosted;return visible&&(ghost||inFront||back||other);}uniform mat4 inverseModelMatrix;uniform mat4 modelViewMatrix;uniform mat4 projectionMatrix;uniform mat3 normalMatrix;uniform vec3 cameraPosition;uniform vec2 treeIndexTextureSize;uniform vec2 transformOverrideTextureSize;uniform sampler2D transformOverrideIndexTexture;uniform sampler2D transformOverrideTexture;uniform sampler2D colorDataTexture;uniform lowp int renderMode;in vec3 position;in vec3 normal;in float a_treeIndex;in vec3 a_centerA;in vec3 a_centerB;in float a_radiusA;in float a_radiusB;in vec3 a_normal;in vec3 a_color;out vec4 v_centerA;out vec4 v_centerB;out vec4 U;out vec4 V;out vec4 axis;out float height;out vec3 v_color;out vec3 v_normal;out highp vec2 v_treeIndexPacked;void main(){NodeAppearance appearance=determineNodeAppearance(colorDataTexture,treeIndexTextureSize,a_treeIndex);if(!determineVisibility(appearance,renderMode)){gl_Position=vec4(2.0,2.0,2.0,1.0);return;}v_treeIndexPacked=packTreeIndex(a_treeIndex);mat4 treeIndexWorldTransform=determineMatrixOverride(a_treeIndex,treeIndexTextureSize,transformOverrideIndexTexture,transformOverrideTextureSize,transformOverrideTexture);mat4 modelToTransformOffset=modelViewMatrix*treeIndexWorldTransform;vec3 centerA=mul3(treeIndexWorldTransform,a_centerA);vec3 centerB=mul3(treeIndexWorldTransform,a_centerB);vec3 normalWithOffset=normalize((treeIndexWorldTransform*vec4(a_normal,0)).xyz);vec3 centerAInCameraSpace=(modelViewMatrix*vec4(centerA,1.0)).xyz;vec3 centerBInCameraSpace=(modelViewMatrix*vec4(centerB,1.0)).xyz;height=dot(normalize(centerA-centerB),normalWithOffset)*length(centerAInCameraSpace - centerBInCameraSpace);vec3 lDir;vec3 center=0.5*(centerA+centerB);vec3 newPosition=position;vec3 rayOrigin=(inverseModelMatrix*vec4(cameraPosition,1.0)).xyz;vec3 objectToCameraModelSpace=rayOrigin-center;vec3 maxCenterProjected=centerA-dot(centerA,normalWithOffset)*normalWithOffset;vec3 minCenterProjected=centerB-dot(centerB,normalWithOffset)*normalWithOffset;float distanceBetweenProjectedCenters=length(maxCenterProjected-minCenterProjected);lDir=normalWithOffset;float dirSign=1.0;if(dot(objectToCameraModelSpace,lDir)<0.0){dirSign=-1.0;lDir*=-1.;}vec3 left=normalize(cross(objectToCameraModelSpace,lDir));vec3 up=normalize(cross(left,lDir));axis.xyz=-normalWithOffset;U.xyz=cross(objectToCameraModelSpace,axis.xyz);V.xyz=cross(U.xyz,axis.xyz);axis.xyz=normalize(normalMatrix*axis.xyz);U.xyz=normalize(normalMatrix*U.xyz);V.xyz=normalize(normalMatrix*V.xyz);newPosition.x*=1.0-(a_radiusA*(position.x+1.0)*0.0025/height);v_centerA.xyz=mul3(modelViewMatrix,centerA);v_centerB.xyz=mul3(modelViewMatrix,centerB);float radiusA=length((modelToTransformOffset*vec4(normalize(vec3(1.0))*a_radiusA,0.0)).xyz);float radiusB=length((modelToTransformOffset*vec4(normalize(vec3(1.0))*a_radiusB,0.0)).xyz);v_centerA.w=radiusA;v_centerB.w=radiusB;float radiusIncludedDisplacement=0.5*(2.0*max(a_radiusA,a_radiusB)+distanceBetweenProjectedCenters);mat3 billboardWorldRotation=mat3(lDir,left,up);vec3 cylinderAxisScales=vec3(height,radiusIncludedDisplacement,radiusIncludedDisplacement);mat3 inverseBillboardWorldRotation=transpose(billboardWorldRotation);vec3 cameraPosInCylinderSpace=inverseBillboardWorldRotation*(rayOrigin-center);mat3 billboardWorldScaleRotation=mat3(0.5*height*lDir,radiusIncludedDisplacement*left,radiusIncludedDisplacement*up);vec3 localBillboardPosition=center+billboardWorldScaleRotation*newPosition;vec3 surfacePoint=mul3(modelViewMatrix,localBillboardPosition);float near=min(1.0,projectionMatrix[3][2]/(projectionMatrix[2][2]-1.0));if(isWithinSpan(cameraPosInCylinderSpace,cylinderAxisScales+vec3(near))){surfacePoint=transformQuadToCoverScreenInViewSpace(newPosition,projectionMatrix,near);}U.w=surfacePoint.x;V.w=surfacePoint.y;axis.w=surfacePoint.z;v_color=a_color;v_normal=normalMatrix*normal;gl_Position=projectionMatrix*vec4(surfacePoint,1.0);}", hn = "precision highp float;struct NodeAppearance{vec4 colorTexel;bool isVisible;bool renderInFront;bool renderGhosted;};vec3 rgb2hsv(vec3 c){vec4 K=vec4(0.0,-1.0/3.0,2.0/3.0,-1.0);vec4 p=mix(vec4(c.bg,K.wz),vec4(c.gb,K.xy),step(c.b,c.g));vec4 q=mix(vec4(p.xyw,c.r),vec4(c.r,p.yzx),step(p.x,c.r));float d=q.x-min(q.w,q.y);float e=1.0e-10;return vec3(abs(q.z+(q.w-q.y)/(6.0*d+e)),d/(q.x+e),q.x);}vec3 hsv2rgb(vec3 c){vec4 K=vec4(1.0,2.0/3.0,1.0/3.0,3.0);vec3 p=abs(fract(c.xxx+K.xyz)*6.0-K.www);return c.z*mix(K.xxx,clamp(p-K.xxx,0.0,1.0),c.y);}vec3 packIntToColor(float number){float r=floor(number/(255.0*255.0))/255.0;float g=mod(floor(number/255.0),255.0)/255.0;float b=mod(number,255.0)/255.0;return vec3(r,g,b);}struct GeometryTypeEnum{int Quad;int Primitive;int TriangleMesh;int InstancedMesh;};const GeometryTypeEnum GeometryType=GeometryTypeEnum(1,2,3,4);const int RenderTypeColor=1;const int RenderTypeNormal=2;const int RenderTypeTreeIndex=3;const int RenderTypePackColorAndNormal=4;const int RenderTypeDepth=5;const int RenderTypeEffects=6;const int RenderTypeGhost=7;const int RenderTypeLOD=8;const int RenderTypeDepthBufferOnly=9;const int RenderTypeGeometryType=10;\n#include <packing>\nout vec4 outputColor;vec3 packNormalToRgb(const in vec3 normal){return normalize(normal)*0.5+0.5;}void updateFragmentColor(int renderMode,vec4 color,float treeIndex,vec3 normal,float depth,sampler2D matCapTexture,int geometryType){if(renderMode==RenderTypeColor||renderMode==RenderTypeEffects){\n#if defined(IS_TEXTURED)\nvec3 colorRGB=color.rgb;\n#else\nvec3 hsv=rgb2hsv(color.rgb);hsv.z=min(0.5*hsv.z+0.5,1.0);vec3 colorRGB=hsv2rgb(hsv);\n#endif\nfloat amplitude=max(0.0,dot(normal,vec3(0.0,0.0,1.0)));vec4 albedo=vec4(colorRGB*(0.4+0.6*amplitude),1.0);vec2 cap=normal.xy*0.5+0.5;vec4 mc=vec4(texture(matCapTexture,cap).rgb,1.0);outputColor=vec4(albedo.rgb*mc.rgb*1.7,color.a);}else if(renderMode==RenderTypeGhost){float amplitude=max(0.0,dot(normal,vec3(0.0,0.0,1.0)));float s=0.4+0.6*amplitude;outputColor=vec4(vec3(s),0.3);}else if(renderMode==RenderTypeDepthBufferOnly){outputColor=vec4(1.0,0.0,1.0,1.0);}else if(renderMode==RenderTypePackColorAndNormal){vec3 hsv=rgb2hsv(color.rgb);float a=0.0;if(hsv.y>0.01){if(hsv.z>0.5){a=(0.55+hsv.x*0.45);}else{a=(0.1+hsv.x*0.45);}}else{a=hsv.z*0.09;}outputColor=vec4(packNormalToRgb(normal.rgb),color.a);}else if(renderMode==RenderTypeNormal){outputColor=vec4(packNormalToRgb(normal),color.a);}else if(renderMode==RenderTypeTreeIndex){outputColor=vec4(packIntToColor(treeIndex),color.a);}else if(renderMode==RenderTypeDepth){outputColor=packDepthToRGBA(depth);}else if(renderMode==RenderTypeLOD){bool isHighDetail=geometryType!=GeometryType.Quad;vec2 cap=normal.xy*0.5+0.5;vec3 mc=texture(matCapTexture,cap).rgb*1.5;outputColor=isHighDetail ? vec4(vec3(0.0,1.0,0.0)*mc,color.a): vec4(vec3(1.0,1.0,0.0)*mc,color.a);}else if(renderMode==RenderTypeGeometryType){vec2 cap=normal.xy*0.5+0.5;vec3 mc=texture(matCapTexture,cap).rgb;vec3 geometryColor=float(geometryType==1)*vec3(1.0,0.0,0.0)+float(geometryType==2)*vec3(0.0,1.0,0.0)+float(geometryType==3)*vec3(0.0,0.0,1.0)+float(geometryType==4)*vec3(1.0,1.0,0.0);outputColor=vec4(geometryColor*mc,color.a);}else{outputColor=vec4(1.0,0.0,1.0,1.0);}}float floatBitsSubset(float inNumber,int fromLeastSignificantBitIndex,int toMostSignificantBitIndex){float r=float(fromLeastSignificantBitIndex);float l=float(toMostSignificantBitIndex);float bitShift=pow(2.0,r);return mod(((inNumber-mod(inNumber,bitShift))/bitShift),pow(2.0,l - r));}NodeAppearance nodeAppearanceFromTexel(vec4 nodeAppearanceTexel){float alphaUnwrapped=floor((nodeAppearanceTexel.a*255.0)+0.5);bool isVisible=floatBitsSubset(alphaUnwrapped,0,1)==1.0;bool renderInFront=floatBitsSubset(alphaUnwrapped,1,2)==1.0;bool renderGhosted=floatBitsSubset(alphaUnwrapped,2,3)==1.0;return NodeAppearance(nodeAppearanceTexel,isVisible,renderInFront,renderGhosted);}NodeAppearance determineNodeAppearance(sampler2D nodeAppearanceTexture,vec2 textureSize,highp float treeIndex){highp int dataTextureWidth=int(textureSize.x);highp int dataTextureHeight=int(textureSize.y);highp int iTreeIndex=int(treeIndex);highp int xTreeIndexTextureCoord=iTreeIndex % dataTextureWidth;highp int yTreeIndexTextureCoord=iTreeIndex/dataTextureWidth;vec4 texel=texelFetch(nodeAppearanceTexture,ivec2(xTreeIndexTextureCoord,yTreeIndexTextureCoord),0);return nodeAppearanceFromTexel(texel);}vec4 determineColor(vec3 originalColor,NodeAppearance nodeAppearance){vec4 overrideColor=nodeAppearance.colorTexel;if(any(greaterThan(overrideColor.rgb,vec3(0.0)))){return overrideColor;}return vec4(originalColor.rgb,overrideColor.a);}\n#if NUM_CLIPPING_PLANES > 0\nuniform vec4 clippingPlanes[NUM_CLIPPING_PLANES];\n#endif\nbool isClipped(vec3 point){\n#if NUM_CLIPPING_PLANES > 0\nvec3 pointFlipped=-point;vec4 plane;for(int i=0;i<UNION_CLIPPING_PLANES;i++){plane=clippingPlanes[i];if(dot(pointFlipped,plane.xyz)>plane.w)return true;}\n#if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES\nbool clipped=true;for(int i=UNION_CLIPPING_PLANES;i<NUM_CLIPPING_PLANES;i++){plane=clippingPlanes[i];clipped=(dot(pointFlipped,plane.xyz)>plane.w)&&clipped;}if(clipped)return true;\n#endif\n#endif\nreturn false;}struct UnusedTreeIndexPacked{highp float thousands;highp float subThousands;};highp vec2 packTreeIndex(float treeIndex){highp float roundedTreeIndex=round(treeIndex);highp float treeIndexThousands=floor(roundedTreeIndex/1000.0);highp float treeIndexSubThousands=mod(roundedTreeIndex,1000.0);return vec2(treeIndexThousands,treeIndexSubThousands);}highp float unpackTreeIndex(highp vec2 treeIndexPacked){highp float treeIndex=round(treeIndexPacked.x)*1000.0+round(treeIndexPacked.y);return treeIndex;}uniform sampler2D colorDataTexture;uniform sampler2D matCapTexture;uniform vec2 treeIndexTextureSize;uniform mat4 projectionMatrix;uniform lowp int renderMode;float computeFragmentDepth(vec3 p,mat4 projectionMatrix){float projected_intersection_z=projectionMatrix[0][2]*p.x+projectionMatrix[1][2]*p.y+projectionMatrix[2][2]*p.z+projectionMatrix[3][2];float projected_intersection_w=projectionMatrix[0][3]*p.x+projectionMatrix[1][3]*p.y+projectionMatrix[2][3]*p.z+projectionMatrix[3][3];return((gl_DepthRange.diff*(projected_intersection_z/projected_intersection_w))+gl_DepthRange.near+gl_DepthRange.far)*.5;}float updateFragmentDepth(vec3 p,mat4 projectionMatrix){gl_FragDepth=computeFragmentDepth(p,projectionMatrix);return gl_FragDepth;}in vec4 center;in float hRadius;in float height;in vec4 U;in vec4 V;in vec4 sphereNormal;in vec3 v_color;in vec3 v_normal;in highp vec2 v_treeIndexPacked;void main(){highp float v_treeIndex=unpackTreeIndex(v_treeIndexPacked);NodeAppearance appearance=determineNodeAppearance(colorDataTexture,treeIndexTextureSize,v_treeIndex);vec4 color=determineColor(v_color,appearance);vec3 normal=normalize(sphereNormal.xyz);float vRadius=center.w;float ratio=vRadius/hRadius;mat3 basis=mat3(U.xyz,V.xyz,sphereNormal.xyz);mat3 scaledBasis=mat3(ratio*U.xyz,ratio*V.xyz,sphereNormal.xyz);vec3 surfacePoint=vec3(U.w,V.w,sphereNormal.w);vec3 rayTarget=surfacePoint;\n#if defined(COGNITE_ORTHOGRAPHIC_CAMERA)\nvec3 rayDirection=vec3(0.0,0.0,-1.0);\n#else\nvec3 rayDirection=normalize(rayTarget);\n#endif\nvec3 diff=rayTarget-center.xyz;vec3 E=diff*scaledBasis;vec3 D=rayDirection*scaledBasis;float a=dot(D,D);float b=dot(E,D);float c=dot(E,E)-vRadius*vRadius;float d=b*b-a*c;if(d<0.0)discard;float sqrtd=sqrt(d);float dist1=(-b-sqrtd)/a;float dist2=(-b+sqrtd)/a;if(dist2<dist1){float tmp=dist1;dist1=dist2;dist2=tmp;}float dist=dist1;float intersectionPointZ=E.z+dist*D.z;vec3 p=rayTarget+dist*rayDirection;if(intersectionPointZ<=vRadius-height||intersectionPointZ>vRadius||isClipped(p)){dist=dist2;intersectionPointZ=E.z+dist*D.z;p=rayTarget+dist*rayDirection;if(intersectionPointZ<=vRadius-height||intersectionPointZ>vRadius||isClipped(p)){discard;}}\n#if !defined(COGNITE_RENDER_COLOR_ID) && !defined(COGNITE_RENDER_DEPTH)\nnormal=vec3(p-center.xyz)*basis;normal.z=normal.z*(hRadius/vRadius)*(hRadius/vRadius);normal=normalize(basis*normal);if(dot(normal,rayDirection)>0.){normal=-normal;}\n#endif\nfloat fragDepth=updateFragmentDepth(p,projectionMatrix);updateFragmentColor(renderMode,color,v_treeIndex,normal,fragDepth,matCapTexture,GeometryType.Primitive);}", gn = "vec3 mul3(mat4 M,vec3 v){vec4 u=M*vec4(v,1.0);return u.xyz/u.w;}mat4 determineMatrixOverride(float treeIndex,vec2 treeIndexTextureSize,sampler2D transformOverrideIndexTexture,vec2 transformOverrideTextureSize,sampler2D transformOverrideTexture){float dataTextureWidth=treeIndexTextureSize.x;float dataTextureHeight=treeIndexTextureSize.y;int xTreeIndexTextureCoord=int(mod(treeIndex,dataTextureWidth));int yTreeIndexTextureCoord=int(floor(treeIndex/dataTextureWidth));float index=texelFetch(transformOverrideIndexTexture,ivec2(xTreeIndexTextureCoord,yTreeIndexTextureCoord),0).r;if(index==0.0){return mat4(1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0);}index-=1.0;float matrixElements[12];for(int i=0;i<12;i++){matrixElements[i]=texelFetch(transformOverrideTexture,ivec2(i+int(index)*16,0.0),0).r;}return mat4(matrixElements[0],matrixElements[4],matrixElements[8],0,matrixElements[1],matrixElements[5],matrixElements[9],0,matrixElements[2],matrixElements[6],matrixElements[10],0,matrixElements[3],matrixElements[7],matrixElements[11],1);}struct UnusedTreeIndexPacked{highp float thousands;highp float subThousands;};highp vec2 packTreeIndex(float treeIndex){highp float roundedTreeIndex=round(treeIndex);highp float treeIndexThousands=floor(roundedTreeIndex/1000.0);highp float treeIndexSubThousands=mod(roundedTreeIndex,1000.0);return vec2(treeIndexThousands,treeIndexSubThousands);}highp float unpackTreeIndex(highp vec2 treeIndexPacked){highp float treeIndex=round(treeIndexPacked.x)*1000.0+round(treeIndexPacked.y);return treeIndex;}const int RenderTypeColor=1;const int RenderTypeNormal=2;const int RenderTypeTreeIndex=3;const int RenderTypePackColorAndNormal=4;const int RenderTypeDepth=5;const int RenderTypeEffects=6;const int RenderTypeGhost=7;const int RenderTypeLOD=8;const int RenderTypeDepthBufferOnly=9;const int RenderTypeGeometryType=10;struct NodeAppearance{vec4 colorTexel;bool isVisible;bool renderInFront;bool renderGhosted;};float floatBitsSubset(float inNumber,int fromLeastSignificantBitIndex,int toMostSignificantBitIndex){float r=float(fromLeastSignificantBitIndex);float l=float(toMostSignificantBitIndex);float bitShift=pow(2.0,r);return mod(((inNumber-mod(inNumber,bitShift))/bitShift),pow(2.0,l - r));}NodeAppearance nodeAppearanceFromTexel(vec4 nodeAppearanceTexel){float alphaUnwrapped=floor((nodeAppearanceTexel.a*255.0)+0.5);bool isVisible=floatBitsSubset(alphaUnwrapped,0,1)==1.0;bool renderInFront=floatBitsSubset(alphaUnwrapped,1,2)==1.0;bool renderGhosted=floatBitsSubset(alphaUnwrapped,2,3)==1.0;return NodeAppearance(nodeAppearanceTexel,isVisible,renderInFront,renderGhosted);}NodeAppearance determineNodeAppearance(sampler2D nodeAppearanceTexture,vec2 textureSize,highp float treeIndex){highp int dataTextureWidth=int(textureSize.x);highp int dataTextureHeight=int(textureSize.y);highp int iTreeIndex=int(treeIndex);highp int xTreeIndexTextureCoord=iTreeIndex % dataTextureWidth;highp int yTreeIndexTextureCoord=iTreeIndex/dataTextureWidth;vec4 texel=texelFetch(nodeAppearanceTexture,ivec2(xTreeIndexTextureCoord,yTreeIndexTextureCoord),0);return nodeAppearanceFromTexel(texel);}bool determineVisibility(NodeAppearance nodeAppearance,int renderMode){bool visible=nodeAppearance.isVisible;bool ghost=(renderMode==RenderTypeGhost)&&nodeAppearance.renderGhosted;bool inFront=(renderMode==RenderTypeEffects)&&nodeAppearance.renderInFront;bool back=(renderMode==RenderTypeColor)&&!nodeAppearance.renderGhosted&&!nodeAppearance.renderInFront;bool other=(renderMode!=RenderTypeColor&&renderMode!=RenderTypeEffects&&renderMode!=RenderTypeGhost)&&!nodeAppearance.renderGhosted;return visible&&(ghost||inFront||back||other);}uniform mat4 inverseModelMatrix;uniform mat4 inverseNormalMatrix;uniform mat4 modelViewMatrix;uniform mat4 projectionMatrix;uniform mat3 normalMatrix;uniform vec3 cameraPosition;uniform vec2 treeIndexTextureSize;uniform vec2 transformOverrideTextureSize;uniform sampler2D transformOverrideIndexTexture;uniform sampler2D transformOverrideTexture;uniform sampler2D colorDataTexture;uniform lowp int renderMode;in vec3 position;in float a_treeIndex;in vec3 a_color;in vec3 a_center;in vec3 a_normal;in float a_horizontalRadius;in float a_verticalRadius;in float a_height;out vec4 center;out float hRadius;out float height;out vec4 U;out vec4 V;out vec4 sphereNormal;out vec3 v_color;out vec3 v_normal;out highp vec2 v_treeIndexPacked;void main(){NodeAppearance appearance=determineNodeAppearance(colorDataTexture,treeIndexTextureSize,a_treeIndex);if(!determineVisibility(appearance,renderMode)){gl_Position=vec4(2.0,2.0,2.0,1.0);return;}v_treeIndexPacked=packTreeIndex(a_treeIndex);mat4 treeIndexWorldTransform=determineMatrixOverride(a_treeIndex,treeIndexTextureSize,transformOverrideIndexTexture,transformOverrideTextureSize,transformOverrideTexture);vec3 centerWithOffset=mul3(treeIndexWorldTransform,a_center).xyz;vec3 normalWithOffset=(treeIndexWorldTransform*vec4(a_normal,0)).xyz;vec3 lDir;float distanceToCenterOfSegment=a_verticalRadius-a_height*0.5;vec3 centerOfSegment=centerWithOffset+normalWithOffset*distanceToCenterOfSegment;\n#if defined(COGNITE_ORTHOGRAPHIC_CAMERA)\nvec3 objectToCameraModelSpace=inverseNormalMatrix*vec3(0.0,0.0,1.0);\n#else\nvec3 rayOrigin=(inverseModelMatrix*vec4(cameraPosition,1.0)).xyz;vec3 objectToCameraModelSpace=rayOrigin-centerOfSegment;\n#endif\nvec3 newPosition=position;float bb=dot(objectToCameraModelSpace,normalWithOffset);if(bb<0.0){lDir=-normalWithOffset;}else{lDir=normalWithOffset;}vec3 left=normalize(cross(objectToCameraModelSpace,lDir));vec3 up=normalize(cross(left,lDir));newPosition.x*=1.0-(a_verticalRadius*(position.x+1.0)*0.0025/a_height);float ratio=max(0.0,1.0-a_height/a_verticalRadius);float maxRadiusOfSegment=a_horizontalRadius*sqrt(1.0-ratio*ratio);vec3 displacement=vec3(newPosition.x*a_height*0.5,maxRadiusOfSegment*newPosition.y,maxRadiusOfSegment*newPosition.z);vec3 surfacePoint=centerOfSegment+mat3(lDir,left,up)*displacement;vec3 transformed=surfacePoint;surfacePoint=mul3(modelViewMatrix,surfacePoint);center.xyz=mul3(modelViewMatrix,centerWithOffset);center.w=a_verticalRadius;hRadius=a_horizontalRadius;height=a_height;v_color=a_color;sphereNormal.xyz=normalMatrix*normalWithOffset;U.xyz=normalMatrix*up;V.xyz=normalMatrix*left;U.w=surfacePoint.x;V.w=surfacePoint.y;sphereNormal.w=surfacePoint.z;vec4 mvPosition=modelViewMatrix*vec4(transformed,1.0);gl_Position=projectionMatrix*mvPosition;}", _n = "precision highp float;struct NodeAppearance{vec4 colorTexel;bool isVisible;bool renderInFront;bool renderGhosted;};vec3 rgb2hsv(vec3 c){vec4 K=vec4(0.0,-1.0/3.0,2.0/3.0,-1.0);vec4 p=mix(vec4(c.bg,K.wz),vec4(c.gb,K.xy),step(c.b,c.g));vec4 q=mix(vec4(p.xyw,c.r),vec4(c.r,p.yzx),step(p.x,c.r));float d=q.x-min(q.w,q.y);float e=1.0e-10;return vec3(abs(q.z+(q.w-q.y)/(6.0*d+e)),d/(q.x+e),q.x);}vec3 hsv2rgb(vec3 c){vec4 K=vec4(1.0,2.0/3.0,1.0/3.0,3.0);vec3 p=abs(fract(c.xxx+K.xyz)*6.0-K.www);return c.z*mix(K.xxx,clamp(p-K.xxx,0.0,1.0),c.y);}vec3 packIntToColor(float number){float r=floor(number/(255.0*255.0))/255.0;float g=mod(floor(number/255.0),255.0)/255.0;float b=mod(number,255.0)/255.0;return vec3(r,g,b);}struct GeometryTypeEnum{int Quad;int Primitive;int TriangleMesh;int InstancedMesh;};const GeometryTypeEnum GeometryType=GeometryTypeEnum(1,2,3,4);const int RenderTypeColor=1;const int RenderTypeNormal=2;const int RenderTypeTreeIndex=3;const int RenderTypePackColorAndNormal=4;const int RenderTypeDepth=5;const int RenderTypeEffects=6;const int RenderTypeGhost=7;const int RenderTypeLOD=8;const int RenderTypeDepthBufferOnly=9;const int RenderTypeGeometryType=10;\n#include <packing>\nout vec4 outputColor;vec3 packNormalToRgb(const in vec3 normal){return normalize(normal)*0.5+0.5;}void updateFragmentColor(int renderMode,vec4 color,float treeIndex,vec3 normal,float depth,sampler2D matCapTexture,int geometryType){if(renderMode==RenderTypeColor||renderMode==RenderTypeEffects){\n#if defined(IS_TEXTURED)\nvec3 colorRGB=color.rgb;\n#else\nvec3 hsv=rgb2hsv(color.rgb);hsv.z=min(0.5*hsv.z+0.5,1.0);vec3 colorRGB=hsv2rgb(hsv);\n#endif\nfloat amplitude=max(0.0,dot(normal,vec3(0.0,0.0,1.0)));vec4 albedo=vec4(colorRGB*(0.4+0.6*amplitude),1.0);vec2 cap=normal.xy*0.5+0.5;vec4 mc=vec4(texture(matCapTexture,cap).rgb,1.0);outputColor=vec4(albedo.rgb*mc.rgb*1.7,color.a);}else if(renderMode==RenderTypeGhost){float amplitude=max(0.0,dot(normal,vec3(0.0,0.0,1.0)));float s=0.4+0.6*amplitude;outputColor=vec4(vec3(s),0.3);}else if(renderMode==RenderTypeDepthBufferOnly){outputColor=vec4(1.0,0.0,1.0,1.0);}else if(renderMode==RenderTypePackColorAndNormal){vec3 hsv=rgb2hsv(color.rgb);float a=0.0;if(hsv.y>0.01){if(hsv.z>0.5){a=(0.55+hsv.x*0.45);}else{a=(0.1+hsv.x*0.45);}}else{a=hsv.z*0.09;}outputColor=vec4(packNormalToRgb(normal.rgb),color.a);}else if(renderMode==RenderTypeNormal){outputColor=vec4(packNormalToRgb(normal),color.a);}else if(renderMode==RenderTypeTreeIndex){outputColor=vec4(packIntToColor(treeIndex),color.a);}else if(renderMode==RenderTypeDepth){outputColor=packDepthToRGBA(depth);}else if(renderMode==RenderTypeLOD){bool isHighDetail=geometryType!=GeometryType.Quad;vec2 cap=normal.xy*0.5+0.5;vec3 mc=texture(matCapTexture,cap).rgb*1.5;outputColor=isHighDetail ? vec4(vec3(0.0,1.0,0.0)*mc,color.a): vec4(vec3(1.0,1.0,0.0)*mc,color.a);}else if(renderMode==RenderTypeGeometryType){vec2 cap=normal.xy*0.5+0.5;vec3 mc=texture(matCapTexture,cap).rgb;vec3 geometryColor=float(geometryType==1)*vec3(1.0,0.0,0.0)+float(geometryType==2)*vec3(0.0,1.0,0.0)+float(geometryType==3)*vec3(0.0,0.0,1.0)+float(geometryType==4)*vec3(1.0,1.0,0.0);outputColor=vec4(geometryColor*mc,color.a);}else{outputColor=vec4(1.0,0.0,1.0,1.0);}}float floatBitsSubset(float inNumber,int fromLeastSignificantBitIndex,int toMostSignificantBitIndex){float r=float(fromLeastSignificantBitIndex);float l=float(toMostSignificantBitIndex);float bitShift=pow(2.0,r);return mod(((inNumber-mod(inNumber,bitShift))/bitShift),pow(2.0,l - r));}NodeAppearance nodeAppearanceFromTexel(vec4 nodeAppearanceTexel){float alphaUnwrapped=floor((nodeAppearanceTexel.a*255.0)+0.5);bool isVisible=floatBitsSubset(alphaUnwrapped,0,1)==1.0;bool renderInFront=floatBitsSubset(alphaUnwrapped,1,2)==1.0;bool renderGhosted=floatBitsSubset(alphaUnwrapped,2,3)==1.0;return NodeAppearance(nodeAppearanceTexel,isVisible,renderInFront,renderGhosted);}NodeAppearance determineNodeAppearance(sampler2D nodeAppearanceTexture,vec2 textureSize,highp float treeIndex){highp int dataTextureWidth=int(textureSize.x);highp int dataTextureHeight=int(textureSize.y);highp int iTreeIndex=int(treeIndex);highp int xTreeIndexTextureCoord=iTreeIndex % dataTextureWidth;highp int yTreeIndexTextureCoord=iTreeIndex/dataTextureWidth;vec4 texel=texelFetch(nodeAppearanceTexture,ivec2(xTreeIndexTextureCoord,yTreeIndexTextureCoord),0);return nodeAppearanceFromTexel(texel);}vec4 determineColor(vec3 originalColor,NodeAppearance nodeAppearance){vec4 overrideColor=nodeAppearance.colorTexel;if(any(greaterThan(overrideColor.rgb,vec3(0.0)))){return overrideColor;}return vec4(originalColor.rgb,overrideColor.a);}\n#if NUM_CLIPPING_PLANES > 0\nuniform vec4 clippingPlanes[NUM_CLIPPING_PLANES];\n#endif\nbool isClipped(vec3 point){\n#if NUM_CLIPPING_PLANES > 0\nvec3 pointFlipped=-point;vec4 plane;for(int i=0;i<UNION_CLIPPING_PLANES;i++){plane=clippingPlanes[i];if(dot(pointFlipped,plane.xyz)>plane.w)return true;}\n#if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES\nbool clipped=true;for(int i=UNION_CLIPPING_PLANES;i<NUM_CLIPPING_PLANES;i++){plane=clippingPlanes[i];clipped=(dot(pointFlipped,plane.xyz)>plane.w)&&clipped;}if(clipped)return true;\n#endif\n#endif\nreturn false;}struct UnusedTreeIndexPacked{highp float thousands;highp float subThousands;};highp vec2 packTreeIndex(float treeIndex){highp float roundedTreeIndex=round(treeIndex);highp float treeIndexThousands=floor(roundedTreeIndex/1000.0);highp float treeIndexSubThousands=mod(roundedTreeIndex,1000.0);return vec2(treeIndexThousands,treeIndexSubThousands);}highp float unpackTreeIndex(highp vec2 treeIndexPacked){highp float treeIndex=round(treeIndexPacked.x)*1000.0+round(treeIndexPacked.y);return treeIndex;}\n#define PI 3.14159265359\n#define PI2 6.28318530718\n#define PI_HALF 1.5707963267949\nuniform sampler2D colorDataTexture;uniform sampler2D matCapTexture;uniform vec2 treeIndexTextureSize;uniform mat4 projectionMatrix;uniform lowp int renderMode;float computeFragmentDepth(vec3 p,mat4 projectionMatrix){float projected_intersection_z=projectionMatrix[0][2]*p.x+projectionMatrix[1][2]*p.y+projectionMatrix[2][2]*p.z+projectionMatrix[3][2];float projected_intersection_w=projectionMatrix[0][3]*p.x+projectionMatrix[1][3]*p.y+projectionMatrix[2][3]*p.z+projectionMatrix[3][3];return((gl_DepthRange.diff*(projected_intersection_z/projected_intersection_w))+gl_DepthRange.near+gl_DepthRange.far)*.5;}float updateFragmentDepth(vec3 p,mat4 projectionMatrix){gl_FragDepth=computeFragmentDepth(p,projectionMatrix);return gl_FragDepth;}in highp vec2 v_treeIndexPacked;in vec3 v_color;in vec3 v_viewPos;in mat3 v_modelBasis;in vec3 v_centerB;in vec2 v_angles;in vec4 v_planeA;in vec4 v_planeB;in float v_radius;void main(){highp float v_treeIndex=unpackTreeIndex(v_treeIndexPacked);NodeAppearance appearance=determineNodeAppearance(colorDataTexture,treeIndexTextureSize,v_treeIndex);vec4 color=determineColor(v_color,appearance);vec3 rayTarget=v_viewPos;vec3 rayDirection=normalize(rayTarget);float rayTargetDist=length(rayTarget);vec3 diff=rayTarget-v_centerB;vec3 E=diff*v_modelBasis;vec3 D=rayDirection*v_modelBasis;float a=dot(D.xy,D.xy);float b=dot(E.xy,D.xy);float c=dot(E.xy,E.xy)-v_radius*v_radius;float d=b*b-a*c;if(d<0.0)discard;float sqrtd=sqrt(d);float dist1=(-b-sqrtd)/a;float dist2=(-b+sqrtd)/a;float dist=min(dist1,dist2);vec3 intersectionPoint=E+dist*D;float theta=atan(intersectionPoint.y,intersectionPoint.x);theta+=theta<v_angles[0]? 2.0*PI : 0.0;theta+=theta<v_angles[0]? 2.0*PI : 0.0;vec3 p=rayTarget+dist*rayDirection;vec3 planeACenter=vec3(0.0,0.0,v_planeA.w);vec3 planeANormal=v_planeA.xyz;vec3 planeBCenter=vec3(0.0,0.0,v_planeB.w);vec3 planeBNormal=v_planeB.xyz;float normalFactor=1.0;if(dot(intersectionPoint-planeACenter,planeANormal)>0.0||dot(intersectionPoint-planeBCenter,planeBNormal)>0.0||theta>v_angles[1]+v_angles[0]||isClipped(p)||rayTargetDist+dist<0.0){dist=max(dist1,dist2);intersectionPoint=E+dist*D;theta=atan(intersectionPoint.y,intersectionPoint.x);theta+=theta<0.0 ? 2.0*PI : 0.0;theta+=theta<v_angles[0]? 2.0*PI : 0.0;p=rayTarget+dist*rayDirection;if(dot(intersectionPoint-planeACenter,planeANormal)>0.0||dot(intersectionPoint-planeBCenter,planeBNormal)>0.0||theta>v_angles[1]+v_angles[0]||isClipped(p)||rayTargetDist+dist<0.0){discard;}normalFactor=-1.0;}vec3 p_local=p-v_centerB;vec3 normal=normalize(p_local-v_modelBasis[2]*dot(p_local,v_modelBasis[2]))*normalFactor;float fragDepth=updateFragmentDepth(p,projectionMatrix);updateFragmentColor(renderMode,color,v_treeIndex,normal,fragDepth,matCapTexture,GeometryType.Primitive);}", vn = "vec3 mul3(mat4 M,vec3 v){vec4 u=M*vec4(v,1.0);return u.xyz/u.w;}bool isWithinSpan(vec3 point,vec3 span){return all(lessThan(abs(point),span));}vec3 transformQuadToCoverScreenInViewSpace(vec3 position,mat4 projectionMatrix,float near){float tanFov=1.0/projectionMatrix[1][1];float aspect=projectionMatrix[1][1]/projectionMatrix[0][0];float maxAspect=max(aspect,1.0/aspect);vec3 fullScreenQuadCorner=vec3(position.xy*maxAspect*tanFov*near,-near - 1e-6);return fullScreenQuadCorner;}mat4 determineMatrixOverride(float treeIndex,vec2 treeIndexTextureSize,sampler2D transformOverrideIndexTexture,vec2 transformOverrideTextureSize,sampler2D transformOverrideTexture){float dataTextureWidth=treeIndexTextureSize.x;float dataTextureHeight=treeIndexTextureSize.y;int xTreeIndexTextureCoord=int(mod(treeIndex,dataTextureWidth));int yTreeIndexTextureCoord=int(floor(treeIndex/dataTextureWidth));float index=texelFetch(transformOverrideIndexTexture,ivec2(xTreeIndexTextureCoord,yTreeIndexTextureCoord),0).r;if(index==0.0){return mat4(1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0);}index-=1.0;float matrixElements[12];for(int i=0;i<12;i++){matrixElements[i]=texelFetch(transformOverrideTexture,ivec2(i+int(index)*16,0.0),0).r;}return mat4(matrixElements[0],matrixElements[4],matrixElements[8],0,matrixElements[1],matrixElements[5],matrixElements[9],0,matrixElements[2],matrixElements[6],matrixElements[10],0,matrixElements[3],matrixElements[7],matrixElements[11],1);}struct UnusedTreeIndexPacked{highp float thousands;highp float subThousands;};highp vec2 packTreeIndex(float treeIndex){highp float roundedTreeIndex=round(treeIndex);highp float treeIndexThousands=floor(roundedTreeIndex/1000.0);highp float treeIndexSubThousands=mod(roundedTreeIndex,1000.0);return vec2(treeIndexThousands,treeIndexSubThousands);}highp float unpackTreeIndex(highp vec2 treeIndexPacked){highp float treeIndex=round(treeIndexPacked.x)*1000.0+round(treeIndexPacked.y);return treeIndex;}const int RenderTypeColor=1;const int RenderTypeNormal=2;const int RenderTypeTreeIndex=3;const int RenderTypePackColorAndNormal=4;const int RenderTypeDepth=5;const int RenderTypeEffects=6;const int RenderTypeGhost=7;const int RenderTypeLOD=8;const int RenderTypeDepthBufferOnly=9;const int RenderTypeGeometryType=10;struct NodeAppearance{vec4 colorTexel;bool isVisible;bool renderInFront;bool renderGhosted;};float floatBitsSubset(float inNumber,int fromLeastSignificantBitIndex,int toMostSignificantBitIndex){float r=float(fromLeastSignificantBitIndex);float l=float(toMostSignificantBitIndex);float bitShift=pow(2.0,r);return mod(((inNumber-mod(inNumber,bitShift))/bitShift),pow(2.0,l - r));}NodeAppearance nodeAppearanceFromTexel(vec4 nodeAppearanceTexel){float alphaUnwrapped=floor((nodeAppearanceTexel.a*255.0)+0.5);bool isVisible=floatBitsSubset(alphaUnwrapped,0,1)==1.0;bool renderInFront=floatBitsSubset(alphaUnwrapped,1,2)==1.0;bool renderGhosted=floatBitsSubset(alphaUnwrapped,2,3)==1.0;return NodeAppearance(nodeAppearanceTexel,isVisible,renderInFront,renderGhosted);}NodeAppearance determineNodeAppearance(sampler2D nodeAppearanceTexture,vec2 textureSize,highp float treeIndex){highp int dataTextureWidth=int(textureSize.x);highp int dataTextureHeight=int(textureSize.y);highp int iTreeIndex=int(treeIndex);highp int xTreeIndexTextureCoord=iTreeIndex % dataTextureWidth;highp int yTreeIndexTextureCoord=iTreeIndex/dataTextureWidth;vec4 texel=texelFetch(nodeAppearanceTexture,ivec2(xTreeIndexTextureCoord,yTreeIndexTextureCoord),0);return nodeAppearanceFromTexel(texel);}bool determineVisibility(NodeAppearance nodeAppearance,int renderMode){bool visible=nodeAppearance.isVisible;bool ghost=(renderMode==RenderTypeGhost)&&nodeAppearance.renderGhosted;bool inFront=(renderMode==RenderTypeEffects)&&nodeAppearance.renderInFront;bool back=(renderMode==RenderTypeColor)&&!nodeAppearance.renderGhosted&&!nodeAppearance.renderInFront;bool other=(renderMode!=RenderTypeColor&&renderMode!=RenderTypeEffects&&renderMode!=RenderTypeGhost)&&!nodeAppearance.renderGhosted;return visible&&(ghost||inFront||back||other);}uniform mat4 inverseModelMatrix;uniform mat4 modelViewMatrix;uniform mat4 projectionMatrix;uniform mat3 normalMatrix;uniform vec3 cameraPosition;uniform vec2 treeIndexTextureSize;uniform vec2 transformOverrideTextureSize;uniform sampler2D transformOverrideIndexTexture;uniform sampler2D transformOverrideTexture;uniform sampler2D colorDataTexture;uniform lowp int renderMode;in vec3 position;in vec3 normal;in float a_treeIndex;in vec3 a_centerA;in vec3 a_centerB;in float a_radius;in vec3 a_color;in vec4 a_planeA;in vec4 a_planeB;in vec3 a_localXAxis;in float a_angle;in float a_arcAngle;flat out float v_treeIndex;out vec3 v_centerB;out mat3 v_modelBasis;out vec3 v_viewPos;out vec4 v_planeA;out vec4 v_planeB;out vec2 v_angles;out vec3 v_color;out float v_radius;out highp vec2 v_treeIndexPacked;void main(){NodeAppearance appearance=determineNodeAppearance(colorDataTexture,treeIndexTextureSize,a_treeIndex);if(!determineVisibility(appearance,renderMode)){gl_Position=vec4(2.0,2.0,2.0,1.0);return;}v_treeIndexPacked=packTreeIndex(a_treeIndex);mat4 treeIndexWorldTransform=determineMatrixOverride(a_treeIndex,treeIndexTextureSize,transformOverrideIndexTexture,transformOverrideTextureSize,transformOverrideTexture);mat4 modelToView=modelViewMatrix*treeIndexWorldTransform;vec3 centerA=mul3(treeIndexWorldTransform,a_centerA);vec3 centerB=mul3(treeIndexWorldTransform,a_centerB);vec3 center=0.5*(centerA+centerB);float halfHeight=0.5*length(centerA-centerB);vec3 dir=normalize(centerA-centerB);vec3 rayOrigin=(inverseModelMatrix*vec4(cameraPosition,1.0)).xyz;vec3 objectToCameraModelSpace=rayOrigin-center;vec3 lDir=faceforward(dir,-objectToCameraModelSpace,dir);vec3 left=normalize(cross(objectToCameraModelSpace,lDir));vec3 up=normalize(cross(left,lDir));mat3 billboardWorldRotation=mat3(lDir,left,up);vec3 cylinderAxisScales=vec3(halfHeight,a_radius,a_radius);mat3 inverseBillboardWorldRotation=transpose(billboardWorldRotation);vec3 cameraPosInCylinderSpace=inverseBillboardWorldRotation*(rayOrigin-center);mat3 billboardWorldScaleRotation=mat3(halfHeight*lDir,a_radius*left,a_radius*up);vec3 localBillboardPosition=center+billboardWorldScaleRotation*position;vec3 viewBillboardPosition=mul3(modelViewMatrix,localBillboardPosition);float near=min(1.0,projectionMatrix[3][2]/(projectionMatrix[2][2]-1.0));if(isWithinSpan(cameraPosInCylinderSpace,cylinderAxisScales+vec3(near))){viewBillboardPosition=transformQuadToCoverScreenInViewSpace(position,projectionMatrix,near);}gl_Position=projectionMatrix*vec4(viewBillboardPosition,1.0);v_treeIndex=a_treeIndex;v_angles[0]=a_angle;v_angles[1]=a_arcAngle;v_modelBasis[0]=normalize(normalMatrix*(treeIndexWorldTransform*vec4(a_localXAxis,0.0)).xyz);v_modelBasis[2]=normalize(normalMatrix*dir);v_modelBasis[1]=normalize(cross(v_modelBasis[2],v_modelBasis[0]));float radius=length((modelViewMatrix*vec4(a_localXAxis*a_radius,0.0)).xyz);v_centerB=mul3(modelViewMatrix,centerB);v_radius=radius;float planeAngleA=acos(dot(normalize(a_planeA.xyz),normalize(vec3(0.0,0.0,1.0))));float planeAngleB=acos(dot(normalize(a_planeB.xyz),normalize(vec3(0.0,0.0,-1.0))));vec4 planeA=a_planeA;planeA.w=length((modelViewMatrix*vec4(halfHeight*2.0*dir,0.0)).xyz)-tan(planeAngleA)*radius;vec4 planeB=a_planeB;planeB.w=tan(planeAngleB)*radius;v_planeA=planeA;v_planeB=planeB;v_viewPos=viewBillboardPosition;v_color=a_color;}", yn = "precision highp float;struct NodeAppearance{vec4 colorTexel;bool isVisible;bool renderInFront;bool renderGhosted;};vec3 rgb2hsv(vec3 c){vec4 K=vec4(0.0,-1.0/3.0,2.0/3.0,-1.0);vec4 p=mix(vec4(c.bg,K.wz),vec4(c.gb,K.xy),step(c.b,c.g));vec4 q=mix(vec4(p.xyw,c.r),vec4(c.r,p.yzx),step(p.x,c.r));float d=q.x-min(q.w,q.y);float e=1.0e-10;return vec3(abs(q.z+(q.w-q.y)/(6.0*d+e)),d/(q.x+e),q.x);}vec3 hsv2rgb(vec3 c){vec4 K=vec4(1.0,2.0/3.0,1.0/3.0,3.0);vec3 p=abs(fract(c.xxx+K.xyz)*6.0-K.www);return c.z*mix(K.xxx,clamp(p-K.xxx,0.0,1.0),c.y);}vec3 packIntToColor(float number){float r=floor(number/(255.0*255.0))/255.0;float g=mod(floor(number/255.0),255.0)/255.0;float b=mod(number,255.0)/255.0;return vec3(r,g,b);}struct GeometryTypeEnum{int Quad;int Primitive;int TriangleMesh;int InstancedMesh;};const GeometryTypeEnum GeometryType=GeometryTypeEnum(1,2,3,4);const int RenderTypeColor=1;const int RenderTypeNormal=2;const int RenderTypeTreeIndex=3;const int RenderTypePackColorAndNormal=4;const int RenderTypeDepth=5;const int RenderTypeEffects=6;const int RenderTypeGhost=7;const int RenderTypeLOD=8;const int RenderTypeDepthBufferOnly=9;const int RenderTypeGeometryType=10;\n#include <packing>\nout vec4 outputColor;vec3 packNormalToRgb(const in vec3 normal){return normalize(normal)*0.5+0.5;}void updateFragmentColor(int renderMode,vec4 color,float treeIndex,vec3 normal,float depth,sampler2D matCapTexture,int geometryType){if(renderMode==RenderTypeColor||renderMode==RenderTypeEffects){\n#if defined(IS_TEXTURED)\nvec3 colorRGB=color.rgb;\n#else\nvec3 hsv=rgb2hsv(color.rgb);hsv.z=min(0.5*hsv.z+0.5,1.0);vec3 colorRGB=hsv2rgb(hsv);\n#endif\nfloat amplitude=max(0.0,dot(normal,vec3(0.0,0.0,1.0)));vec4 albedo=vec4(colorRGB*(0.4+0.6*amplitude),1.0);vec2 cap=normal.xy*0.5+0.5;vec4 mc=vec4(texture(matCapTexture,cap).rgb,1.0);outputColor=vec4(albedo.rgb*mc.rgb*1.7,color.a);}else if(renderMode==RenderTypeGhost){float amplitude=max(0.0,dot(normal,vec3(0.0,0.0,1.0)));float s=0.4+0.6*amplitude;outputColor=vec4(vec3(s),0.3);}else if(renderMode==RenderTypeDepthBufferOnly){outputColor=vec4(1.0,0.0,1.0,1.0);}else if(renderMode==RenderTypePackColorAndNormal){vec3 hsv=rgb2hsv(color.rgb);float a=0.0;if(hsv.y>0.01){if(hsv.z>0.5){a=(0.55+hsv.x*0.45);}else{a=(0.1+hsv.x*0.45);}}else{a=hsv.z*0.09;}outputColor=vec4(packNormalToRgb(normal.rgb),color.a);}else if(renderMode==RenderTypeNormal){outputColor=vec4(packNormalToRgb(normal),color.a);}else if(renderMode==RenderTypeTreeIndex){outputColor=vec4(packIntToColor(treeIndex),color.a);}else if(renderMode==RenderTypeDepth){outputColor=packDepthToRGBA(depth);}else if(renderMode==RenderTypeLOD){bool isHighDetail=geometryType!=GeometryType.Quad;vec2 cap=normal.xy*0.5+0.5;vec3 mc=texture(matCapTexture,cap).rgb*1.5;outputColor=isHighDetail ? vec4(vec3(0.0,1.0,0.0)*mc,color.a): vec4(vec3(1.0,1.0,0.0)*mc,color.a);}else if(renderMode==RenderTypeGeometryType){vec2 cap=normal.xy*0.5+0.5;vec3 mc=texture(matCapTexture,cap).rgb;vec3 geometryColor=float(geometryType==1)*vec3(1.0,0.0,0.0)+float(geometryType==2)*vec3(0.0,1.0,0.0)+float(geometryType==3)*vec3(0.0,0.0,1.0)+float(geometryType==4)*vec3(1.0,1.0,0.0);outputColor=vec4(geometryColor*mc,color.a);}else{outputColor=vec4(1.0,0.0,1.0,1.0);}}float floatBitsSubset(float inNumber,int fromLeastSignificantBitIndex,int toMostSignificantBitIndex){float r=float(fromLeastSignificantBitIndex);float l=float(toMostSignificantBitIndex);float bitShift=pow(2.0,r);return mod(((inNumber-mod(inNumber,bitShift))/bitShift),pow(2.0,l - r));}NodeAppearance nodeAppearanceFromTexel(vec4 nodeAppearanceTexel){float alphaUnwrapped=floor((nodeAppearanceTexel.a*255.0)+0.5);bool isVisible=floatBitsSubset(alphaUnwrapped,0,1)==1.0;bool renderInFront=floatBitsSubset(alphaUnwrapped,1,2)==1.0;bool renderGhosted=floatBitsSubset(alphaUnwrapped,2,3)==1.0;return NodeAppearance(nodeAppearanceTexel,isVisible,renderInFront,renderGhosted);}NodeAppearance determineNodeAppearance(sampler2D nodeAppearanceTexture,vec2 textureSize,highp float treeIndex){highp int dataTextureWidth=int(textureSize.x);highp int dataTextureHeight=int(textureSize.y);highp int iTreeIndex=int(treeIndex);highp int xTreeIndexTextureCoord=iTreeIndex % dataTextureWidth;highp int yTreeIndexTextureCoord=iTreeIndex/dataTextureWidth;vec4 texel=texelFetch(nodeAppearanceTexture,ivec2(xTreeIndexTextureCoord,yTreeIndexTextureCoord),0);return nodeAppearanceFromTexel(texel);}vec4 determineColor(vec3 originalColor,NodeAppearance nodeAppearance){vec4 overrideColor=nodeAppearance.colorTexel;if(any(greaterThan(overrideColor.rgb,vec3(0.0)))){return overrideColor;}return vec4(originalColor.rgb,overrideColor.a);}\n#if NUM_CLIPPING_PLANES > 0\nuniform vec4 clippingPlanes[NUM_CLIPPING_PLANES];\n#endif\nbool isClipped(vec3 point){\n#if NUM_CLIPPING_PLANES > 0\nvec3 pointFlipped=-point;vec4 plane;for(int i=0;i<UNION_CLIPPING_PLANES;i++){plane=clippingPlanes[i];if(dot(pointFlipped,plane.xyz)>plane.w)return true;}\n#if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES\nbool clipped=true;for(int i=UNION_CLIPPING_PLANES;i<NUM_CLIPPING_PLANES;i++){plane=clippingPlanes[i];clipped=(dot(pointFlipped,plane.xyz)>plane.w)&&clipped;}if(clipped)return true;\n#endif\n#endif\nreturn false;}struct UnusedTreeIndexPacked{highp float thousands;highp float subThousands;};highp vec2 packTreeIndex(float treeIndex){highp float roundedTreeIndex=round(treeIndex);highp float treeIndexThousands=floor(roundedTreeIndex/1000.0);highp float treeIndexSubThousands=mod(roundedTreeIndex,1000.0);return vec2(treeIndexThousands,treeIndexSubThousands);}highp float unpackTreeIndex(highp vec2 treeIndexPacked){highp float treeIndex=round(treeIndexPacked.x)*1000.0+round(treeIndexPacked.y);return treeIndex;}\n#define PI 3.14159265359\n#define PI2 6.28318530718\n#define PI_HALF 1.5707963267949\nuniform sampler2D colorDataTexture;uniform sampler2D matCapTexture;uniform vec2 treeIndexTextureSize;uniform lowp int renderMode;in float v_oneMinusThicknessSqr;in vec2 v_xy;in float v_angle;in float v_arcAngle;in vec3 v_color;in vec3 v_normal;in vec3 vViewPosition;in highp vec2 v_treeIndexPacked;void main(){highp float v_treeIndex=unpackTreeIndex(v_treeIndexPacked);NodeAppearance appearance=determineNodeAppearance(colorDataTexture,treeIndexTextureSize,v_treeIndex);if(isClipped(vViewPosition)){discard;}vec4 color=determineColor(v_color,appearance);float dist=dot(v_xy,v_xy);float theta=atan(v_xy.y,v_xy.x);vec3 normal=normalize(v_normal);theta+=theta<v_angle ? 2.0*PI : 0.0;theta+=theta<v_angle ? 2.0*PI : 0.0;if(dist>0.25||dist<0.25*v_oneMinusThicknessSqr||theta>=v_angle+v_arcAngle){discard;}updateFragmentColor(renderMode,color,v_treeIndex,normal,gl_FragCoord.z,matCapTexture,GeometryType.Primitive);}", bn = "mat4 determineMatrixOverride(float treeIndex,vec2 treeIndexTextureSize,sampler2D transformOverrideIndexTexture,vec2 transformOverrideTextureSize,sampler2D transformOverrideTexture){float dataTextureWidth=treeIndexTextureSize.x;float dataTextureHeight=treeIndexTextureSize.y;int xTreeIndexTextureCoord=int(mod(treeIndex,dataTextureWidth));int yTreeIndexTextureCoord=int(floor(treeIndex/dataTextureWidth));float index=texelFetch(transformOverrideIndexTexture,ivec2(xTreeIndexTextureCoord,yTreeIndexTextureCoord),0).r;if(index==0.0){return mat4(1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0);}index-=1.0;float matrixElements[12];for(int i=0;i<12;i++){matrixElements[i]=texelFetch(transformOverrideTexture,ivec2(i+int(index)*16,0.0),0).r;}return mat4(matrixElements[0],matrixElements[4],matrixElements[8],0,matrixElements[1],matrixElements[5],matrixElements[9],0,matrixElements[2],matrixElements[6],matrixElements[10],0,matrixElements[3],matrixElements[7],matrixElements[11],1);}struct UnusedTreeIndexPacked{highp float thousands;highp float subThousands;};highp vec2 packTreeIndex(float treeIndex){highp float roundedTreeIndex=round(treeIndex);highp float treeIndexThousands=floor(roundedTreeIndex/1000.0);highp float treeIndexSubThousands=mod(roundedTreeIndex,1000.0);return vec2(treeIndexThousands,treeIndexSubThousands);}highp float unpackTreeIndex(highp vec2 treeIndexPacked){highp float treeIndex=round(treeIndexPacked.x)*1000.0+round(treeIndexPacked.y);return treeIndex;}const int RenderTypeColor=1;const int RenderTypeNormal=2;const int RenderTypeTreeIndex=3;const int RenderTypePackColorAndNormal=4;const int RenderTypeDepth=5;const int RenderTypeEffects=6;const int RenderTypeGhost=7;const int RenderTypeLOD=8;const int RenderTypeDepthBufferOnly=9;const int RenderTypeGeometryType=10;struct NodeAppearance{vec4 colorTexel;bool isVisible;bool renderInFront;bool renderGhosted;};float floatBitsSubset(float inNumber,int fromLeastSignificantBitIndex,int toMostSignificantBitIndex){float r=float(fromLeastSignificantBitIndex);float l=float(toMostSignificantBitIndex);float bitShift=pow(2.0,r);return mod(((inNumber-mod(inNumber,bitShift))/bitShift),pow(2.0,l - r));}NodeAppearance nodeAppearanceFromTexel(vec4 nodeAppearanceTexel){float alphaUnwrapped=floor((nodeAppearanceTexel.a*255.0)+0.5);bool isVisible=floatBitsSubset(alphaUnwrapped,0,1)==1.0;bool renderInFront=floatBitsSubset(alphaUnwrapped,1,2)==1.0;bool renderGhosted=floatBitsSubset(alphaUnwrapped,2,3)==1.0;return NodeAppearance(nodeAppearanceTexel,isVisible,renderInFront,renderGhosted);}NodeAppearance determineNodeAppearance(sampler2D nodeAppearanceTexture,vec2 textureSize,highp float treeIndex){highp int dataTextureWidth=int(textureSize.x);highp int dataTextureHeight=int(textureSize.y);highp int iTreeIndex=int(treeIndex);highp int xTreeIndexTextureCoord=iTreeIndex % dataTextureWidth;highp int yTreeIndexTextureCoord=iTreeIndex/dataTextureWidth;vec4 texel=texelFetch(nodeAppearanceTexture,ivec2(xTreeIndexTextureCoord,yTreeIndexTextureCoord),0);return nodeAppearanceFromTexel(texel);}bool determineVisibility(NodeAppearance nodeAppearance,int renderMode){bool visible=nodeAppearance.isVisible;bool ghost=(renderMode==RenderTypeGhost)&&nodeAppearance.renderGhosted;bool inFront=(renderMode==RenderTypeEffects)&&nodeAppearance.renderInFront;bool back=(renderMode==RenderTypeColor)&&!nodeAppearance.renderGhosted&&!nodeAppearance.renderInFront;bool other=(renderMode!=RenderTypeColor&&renderMode!=RenderTypeEffects&&renderMode!=RenderTypeGhost)&&!nodeAppearance.renderGhosted;return visible&&(ghost||inFront||back||other);}uniform mat4 modelViewMatrix;uniform mat4 projectionMatrix;uniform mat3 normalMatrix;uniform vec2 treeIndexTextureSize;uniform vec2 transformOverrideTextureSize;uniform sampler2D transformOverrideIndexTexture;uniform sampler2D transformOverrideTexture;uniform sampler2D colorDataTexture;uniform lowp int renderMode;in vec3 position;in mat4 a_instanceMatrix;in float a_treeIndex;in vec3 a_color;in float a_angle;in float a_arcAngle;in float a_thickness;in vec3 a_normal;out float v_oneMinusThicknessSqr;out vec2 v_xy;out float v_angle;out float v_arcAngle;out vec3 v_color;out vec3 v_normal;out vec3 vViewPosition;out highp vec2 v_treeIndexPacked;void main(){NodeAppearance appearance=determineNodeAppearance(colorDataTexture,treeIndexTextureSize,a_treeIndex);if(!determineVisibility(appearance,renderMode)){gl_Position=vec4(2.0,2.0,2.0,1.0);return;}v_treeIndexPacked=packTreeIndex(a_treeIndex);v_oneMinusThicknessSqr=(1.0-a_thickness)*(1.0 - a_thickness);v_xy=vec2(position.x,position.y);v_angle=a_angle;v_arcAngle=a_arcAngle;mat4 treeIndexWorldTransform=determineMatrixOverride(a_treeIndex,treeIndexTextureSize,transformOverrideIndexTexture,transformOverrideTextureSize,transformOverrideTexture);vec3 transformed=(a_instanceMatrix*vec4(position,1.0)).xyz;vec4 mvPosition=modelViewMatrix*treeIndexWorldTransform*vec4(transformed,1.0);v_color=a_color;v_normal=normalMatrix*normalize(treeIndexWorldTransform*vec4(normalize(a_normal),0.0)).xyz;vViewPosition=mvPosition.xyz;gl_Position=projectionMatrix*mvPosition;}", xn = "precision highp float;vec3 rgb2hsv(vec3 c){vec4 K=vec4(0.0,-1.0/3.0,2.0/3.0,-1.0);vec4 p=mix(vec4(c.bg,K.wz),vec4(c.gb,K.xy),step(c.b,c.g));vec4 q=mix(vec4(p.xyw,c.r),vec4(c.r,p.yzx),step(p.x,c.r));float d=q.x-min(q.w,q.y);float e=1.0e-10;return vec3(abs(q.z+(q.w-q.y)/(6.0*d+e)),d/(q.x+e),q.x);}vec3 hsv2rgb(vec3 c){vec4 K=vec4(1.0,2.0/3.0,1.0/3.0,3.0);vec3 p=abs(fract(c.xxx+K.xyz)*6.0-K.www);return c.z*mix(K.xxx,clamp(p-K.xxx,0.0,1.0),c.y);}vec3 packIntToColor(float number){float r=floor(number/(255.0*255.0))/255.0;float g=mod(floor(number/255.0),255.0)/255.0;float b=mod(number,255.0)/255.0;return vec3(r,g,b);}struct GeometryTypeEnum{int Quad;int Primitive;int TriangleMesh;int InstancedMesh;};const GeometryTypeEnum GeometryType=GeometryTypeEnum(1,2,3,4);const int RenderTypeColor=1;const int RenderTypeNormal=2;const int RenderTypeTreeIndex=3;const int RenderTypePackColorAndNormal=4;const int RenderTypeDepth=5;const int RenderTypeEffects=6;const int RenderTypeGhost=7;const int RenderTypeLOD=8;const int RenderTypeDepthBufferOnly=9;const int RenderTypeGeometryType=10;\n#include <packing>\nout vec4 outputColor;vec3 packNormalToRgb(const in vec3 normal){return normalize(normal)*0.5+0.5;}void updateFragmentColor(int renderMode,vec4 color,float treeIndex,vec3 normal,float depth,sampler2D matCapTexture,int geometryType){if(renderMode==RenderTypeColor||renderMode==RenderTypeEffects){\n#if defined(IS_TEXTURED)\nvec3 colorRGB=color.rgb;\n#else\nvec3 hsv=rgb2hsv(color.rgb);hsv.z=min(0.5*hsv.z+0.5,1.0);vec3 colorRGB=hsv2rgb(hsv);\n#endif\nfloat amplitude=max(0.0,dot(normal,vec3(0.0,0.0,1.0)));vec4 albedo=vec4(colorRGB*(0.4+0.6*amplitude),1.0);vec2 cap=normal.xy*0.5+0.5;vec4 mc=vec4(texture(matCapTexture,cap).rgb,1.0);outputColor=vec4(albedo.rgb*mc.rgb*1.7,color.a);}else if(renderMode==RenderTypeGhost){float amplitude=max(0.0,dot(normal,vec3(0.0,0.0,1.0)));float s=0.4+0.6*amplitude;outputColor=vec4(vec3(s),0.3);}else if(renderMode==RenderTypeDepthBufferOnly){outputColor=vec4(1.0,0.0,1.0,1.0);}else if(renderMode==RenderTypePackColorAndNormal){vec3 hsv=rgb2hsv(color.rgb);float a=0.0;if(hsv.y>0.01){if(hsv.z>0.5){a=(0.55+hsv.x*0.45);}else{a=(0.1+hsv.x*0.45);}}else{a=hsv.z*0.09;}outputColor=vec4(packNormalToRgb(normal.rgb),color.a);}else if(renderMode==RenderTypeNormal){outputColor=vec4(packNormalToRgb(normal),color.a);}else if(renderMode==RenderTypeTreeIndex){outputColor=vec4(packIntToColor(treeIndex),color.a);}else if(renderMode==RenderTypeDepth){outputColor=packDepthToRGBA(depth);}else if(renderMode==RenderTypeLOD){bool isHighDetail=geometryType!=GeometryType.Quad;vec2 cap=normal.xy*0.5+0.5;vec3 mc=texture(matCapTexture,cap).rgb*1.5;outputColor=isHighDetail ? vec4(vec3(0.0,1.0,0.0)*mc,color.a): vec4(vec3(1.0,1.0,0.0)*mc,color.a);}else if(renderMode==RenderTypeGeometryType){vec2 cap=normal.xy*0.5+0.5;vec3 mc=texture(matCapTexture,cap).rgb;vec3 geometryColor=float(geometryType==1)*vec3(1.0,0.0,0.0)+float(geometryType==2)*vec3(0.0,1.0,0.0)+float(geometryType==3)*vec3(0.0,0.0,1.0)+float(geometryType==4)*vec3(1.0,1.0,0.0);outputColor=vec4(geometryColor*mc,color.a);}else{outputColor=vec4(1.0,0.0,1.0,1.0);}}struct NodeAppearance{vec4 colorTexel;bool isVisible;bool renderInFront;bool renderGhosted;};float floatBitsSubset(float inNumber,int fromLeastSignificantBitIndex,int toMostSignificantBitIndex){float r=float(fromLeastSignificantBitIndex);float l=float(toMostSignificantBitIndex);float bitShift=pow(2.0,r);return mod(((inNumber-mod(inNumber,bitShift))/bitShift),pow(2.0,l - r));}NodeAppearance nodeAppearanceFromTexel(vec4 nodeAppearanceTexel){float alphaUnwrapped=floor((nodeAppearanceTexel.a*255.0)+0.5);bool isVisible=floatBitsSubset(alphaUnwrapped,0,1)==1.0;bool renderInFront=floatBitsSubset(alphaUnwrapped,1,2)==1.0;bool renderGhosted=floatBitsSubset(alphaUnwrapped,2,3)==1.0;return NodeAppearance(nodeAppearanceTexel,isVisible,renderInFront,renderGhosted);}NodeAppearance determineNodeAppearance(sampler2D nodeAppearanceTexture,vec2 textureSize,highp float treeIndex){highp int dataTextureWidth=int(textureSize.x);highp int dataTextureHeight=int(textureSize.y);highp int iTreeIndex=int(treeIndex);highp int xTreeIndexTextureCoord=iTreeIndex % dataTextureWidth;highp int yTreeIndexTextureCoord=iTreeIndex/dataTextureWidth;vec4 texel=texelFetch(nodeAppearanceTexture,ivec2(xTreeIndexTextureCoord,yTreeIndexTextureCoord),0);return nodeAppearanceFromTexel(texel);}vec4 determineColor(vec3 originalColor,NodeAppearance nodeAppearance){vec4 overrideColor=nodeAppearance.colorTexel;if(any(greaterThan(overrideColor.rgb,vec3(0.0)))){return overrideColor;}return vec4(originalColor.rgb,overrideColor.a);}\n#if NUM_CLIPPING_PLANES > 0\nuniform vec4 clippingPlanes[NUM_CLIPPING_PLANES];\n#endif\nbool isClipped(vec3 point){\n#if NUM_CLIPPING_PLANES > 0\nvec3 pointFlipped=-point;vec4 plane;for(int i=0;i<UNION_CLIPPING_PLANES;i++){plane=clippingPlanes[i];if(dot(pointFlipped,plane.xyz)>plane.w)return true;}\n#if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES\nbool clipped=true;for(int i=UNION_CLIPPING_PLANES;i<NUM_CLIPPING_PLANES;i++){plane=clippingPlanes[i];clipped=(dot(pointFlipped,plane.xyz)>plane.w)&&clipped;}if(clipped)return true;\n#endif\n#endif\nreturn false;}struct UnusedTreeIndexPacked{highp float thousands;highp float subThousands;};highp vec2 packTreeIndex(float treeIndex){highp float roundedTreeIndex=round(treeIndex);highp float treeIndexThousands=floor(roundedTreeIndex/1000.0);highp float treeIndexSubThousands=mod(roundedTreeIndex,1000.0);return vec2(treeIndexThousands,treeIndexSubThousands);}highp float unpackTreeIndex(highp vec2 treeIndexPacked){highp float treeIndex=round(treeIndexPacked.x)*1000.0+round(treeIndexPacked.y);return treeIndex;}uniform sampler2D matCapTexture;uniform lowp int renderMode;in vec3 v_color;in vec3 v_normal;in vec3 vViewPosition;in vec4 v_nodeAppearanceTexel;in highp vec2 v_treeIndexPacked;void main(){highp float v_treeIndex=unpackTreeIndex(v_treeIndexPacked);NodeAppearance appearance=nodeAppearanceFromTexel(v_nodeAppearanceTexel);if(isClipped(vViewPosition)){discard;}vec4 color=determineColor(v_color,appearance);vec3 normal=normalize(v_normal);updateFragmentColor(renderMode,color,v_treeIndex,normal,gl_FragCoord.z,matCapTexture,GeometryType.Primitive);}", Sn = "mat4 determineMatrixOverride(float treeIndex,vec2 treeIndexTextureSize,sampler2D transformOverrideIndexTexture,vec2 transformOverrideTextureSize,sampler2D transformOverrideTexture){float dataTextureWidth=treeIndexTextureSize.x;float dataTextureHeight=treeIndexTextureSize.y;int xTreeIndexTextureCoord=int(mod(treeIndex,dataTextureWidth));int yTreeIndexTextureCoord=int(floor(treeIndex/dataTextureWidth));float index=texelFetch(transformOverrideIndexTexture,ivec2(xTreeIndexTextureCoord,yTreeIndexTextureCoord),0).r;if(index==0.0){return mat4(1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0);}index-=1.0;float matrixElements[12];for(int i=0;i<12;i++){matrixElements[i]=texelFetch(transformOverrideTexture,ivec2(i+int(index)*16,0.0),0).r;}return mat4(matrixElements[0],matrixElements[4],matrixElements[8],0,matrixElements[1],matrixElements[5],matrixElements[9],0,matrixElements[2],matrixElements[6],matrixElements[10],0,matrixElements[3],matrixElements[7],matrixElements[11],1);}struct UnusedTreeIndexPacked{highp float thousands;highp float subThousands;};highp vec2 packTreeIndex(float treeIndex){highp float roundedTreeIndex=round(treeIndex);highp float treeIndexThousands=floor(roundedTreeIndex/1000.0);highp float treeIndexSubThousands=mod(roundedTreeIndex,1000.0);return vec2(treeIndexThousands,treeIndexSubThousands);}highp float unpackTreeIndex(highp vec2 treeIndexPacked){highp float treeIndex=round(treeIndexPacked.x)*1000.0+round(treeIndexPacked.y);return treeIndex;}const int RenderTypeColor=1;const int RenderTypeNormal=2;const int RenderTypeTreeIndex=3;const int RenderTypePackColorAndNormal=4;const int RenderTypeDepth=5;const int RenderTypeEffects=6;const int RenderTypeGhost=7;const int RenderTypeLOD=8;const int RenderTypeDepthBufferOnly=9;const int RenderTypeGeometryType=10;struct NodeAppearance{vec4 colorTexel;bool isVisible;bool renderInFront;bool renderGhosted;};float floatBitsSubset(float inNumber,int fromLeastSignificantBitIndex,int toMostSignificantBitIndex){float r=float(fromLeastSignificantBitIndex);float l=float(toMostSignificantBitIndex);float bitShift=pow(2.0,r);return mod(((inNumber-mod(inNumber,bitShift))/bitShift),pow(2.0,l - r));}NodeAppearance nodeAppearanceFromTexel(vec4 nodeAppearanceTexel){float alphaUnwrapped=floor((nodeAppearanceTexel.a*255.0)+0.5);bool isVisible=floatBitsSubset(alphaUnwrapped,0,1)==1.0;bool renderInFront=floatBitsSubset(alphaUnwrapped,1,2)==1.0;bool renderGhosted=floatBitsSubset(alphaUnwrapped,2,3)==1.0;return NodeAppearance(nodeAppearanceTexel,isVisible,renderInFront,renderGhosted);}NodeAppearance determineNodeAppearance(sampler2D nodeAppearanceTexture,vec2 textureSize,highp float treeIndex){highp int dataTextureWidth=int(textureSize.x);highp int dataTextureHeight=int(textureSize.y);highp int iTreeIndex=int(treeIndex);highp int xTreeIndexTextureCoord=iTreeIndex % dataTextureWidth;highp int yTreeIndexTextureCoord=iTreeIndex/dataTextureWidth;vec4 texel=texelFetch(nodeAppearanceTexture,ivec2(xTreeIndexTextureCoord,yTreeIndexTextureCoord),0);return nodeAppearanceFromTexel(texel);}bool determineVisibility(NodeAppearance nodeAppearance,int renderMode){bool visible=nodeAppearance.isVisible;bool ghost=(renderMode==RenderTypeGhost)&&nodeAppearance.renderGhosted;bool inFront=(renderMode==RenderTypeEffects)&&nodeAppearance.renderInFront;bool back=(renderMode==RenderTypeColor)&&!nodeAppearance.renderGhosted&&!nodeAppearance.renderInFront;bool other=(renderMode!=RenderTypeColor&&renderMode!=RenderTypeEffects&&renderMode!=RenderTypeGhost)&&!nodeAppearance.renderGhosted;return visible&&(ghost||inFront||back||other);}uniform mat4 modelViewMatrix;uniform mat4 projectionMatrix;uniform mat3 normalMatrix;uniform vec2 treeIndexTextureSize;uniform vec2 transformOverrideTextureSize;uniform sampler2D transformOverrideIndexTexture;uniform sampler2D transformOverrideTexture;uniform sampler2D colorDataTexture;uniform lowp int renderMode;in vec3 position;in mat4 a_instanceMatrix;in float a_treeIndex;in vec3 a_color;in float a_arcAngle;in float a_radius;in float a_tubeRadius;out vec3 v_color;out vec3 v_normal;out vec3 vViewPosition;out vec4 v_nodeAppearanceTexel;out highp vec2 v_treeIndexPacked;void main(){NodeAppearance appearance=determineNodeAppearance(colorDataTexture,treeIndexTextureSize,a_treeIndex);if(!determineVisibility(appearance,renderMode)){gl_Position=vec4(2.0,2.0,2.0,1.0);return;}v_nodeAppearanceTexel=appearance.colorTexel;v_treeIndexPacked=packTreeIndex(a_treeIndex);float theta=position.x*a_arcAngle;float phi=position.y;float cosTheta=cos(theta);float sinTheta=sin(theta);vec3 pos3=vec3(0);pos3.x=(a_radius+a_tubeRadius*cos(phi))*cosTheta;pos3.y=(a_radius+a_tubeRadius*cos(phi))*sinTheta;pos3.z=a_tubeRadius*sin(phi);mat4 treeIndexWorldTransform=determineMatrixOverride(a_treeIndex,treeIndexTextureSize,transformOverrideIndexTexture,transformOverrideTextureSize,transformOverrideTexture);vec3 transformed=(a_instanceMatrix*vec4(pos3,1.0)).xyz;vec3 center=(a_instanceMatrix*vec4(a_radius*cosTheta,a_radius*sinTheta,0.0,1.0)).xyz;vec3 objectNormal=normalize(transformed.xyz-center);v_color=a_color;v_normal=normalMatrix*normalize(treeIndexWorldTransform*vec4(objectNormal,0.0)).xyz;vec4 modelViewPosition=modelViewMatrix*treeIndexWorldTransform*vec4(transformed,1.0);vViewPosition=modelViewPosition.xyz;gl_Position=projectionMatrix*modelViewPosition;}", Cn = "precision highp float;vec3 rgb2hsv(vec3 c){vec4 K=vec4(0.0,-1.0/3.0,2.0/3.0,-1.0);vec4 p=mix(vec4(c.bg,K.wz),vec4(c.gb,K.xy),step(c.b,c.g));vec4 q=mix(vec4(p.xyw,c.r),vec4(c.r,p.yzx),step(p.x,c.r));float d=q.x-min(q.w,q.y);float e=1.0e-10;return vec3(abs(q.z+(q.w-q.y)/(6.0*d+e)),d/(q.x+e),q.x);}vec3 hsv2rgb(vec3 c){vec4 K=vec4(1.0,2.0/3.0,1.0/3.0,3.0);vec3 p=abs(fract(c.xxx+K.xyz)*6.0-K.www);return c.z*mix(K.xxx,clamp(p-K.xxx,0.0,1.0),c.y);}vec3 packIntToColor(float number){float r=floor(number/(255.0*255.0))/255.0;float g=mod(floor(number/255.0),255.0)/255.0;float b=mod(number,255.0)/255.0;return vec3(r,g,b);}struct GeometryTypeEnum{int Quad;int Primitive;int TriangleMesh;int InstancedMesh;};const GeometryTypeEnum GeometryType=GeometryTypeEnum(1,2,3,4);const int RenderTypeColor=1;const int RenderTypeNormal=2;const int RenderTypeTreeIndex=3;const int RenderTypePackColorAndNormal=4;const int RenderTypeDepth=5;const int RenderTypeEffects=6;const int RenderTypeGhost=7;const int RenderTypeLOD=8;const int RenderTypeDepthBufferOnly=9;const int RenderTypeGeometryType=10;\n#include <packing>\nout vec4 outputColor;vec3 packNormalToRgb(const in vec3 normal){return normalize(normal)*0.5+0.5;}void updateFragmentColor(int renderMode,vec4 color,float treeIndex,vec3 normal,float depth,sampler2D matCapTexture,int geometryType){if(renderMode==RenderTypeColor||renderMode==RenderTypeEffects){\n#if defined(IS_TEXTURED)\nvec3 colorRGB=color.rgb;\n#else\nvec3 hsv=rgb2hsv(color.rgb);hsv.z=min(0.5*hsv.z+0.5,1.0);vec3 colorRGB=hsv2rgb(hsv);\n#endif\nfloat amplitude=max(0.0,dot(normal,vec3(0.0,0.0,1.0)));vec4 albedo=vec4(colorRGB*(0.4+0.6*amplitude),1.0);vec2 cap=normal.xy*0.5+0.5;vec4 mc=vec4(texture(matCapTexture,cap).rgb,1.0);outputColor=vec4(albedo.rgb*mc.rgb*1.7,color.a);}else if(renderMode==RenderTypeGhost){float amplitude=max(0.0,dot(normal,vec3(0.0,0.0,1.0)));float s=0.4+0.6*amplitude;outputColor=vec4(vec3(s),0.3);}else if(renderMode==RenderTypeDepthBufferOnly){outputColor=vec4(1.0,0.0,1.0,1.0);}else if(renderMode==RenderTypePackColorAndNormal){vec3 hsv=rgb2hsv(color.rgb);float a=0.0;if(hsv.y>0.01){if(hsv.z>0.5){a=(0.55+hsv.x*0.45);}else{a=(0.1+hsv.x*0.45);}}else{a=hsv.z*0.09;}outputColor=vec4(packNormalToRgb(normal.rgb),color.a);}else if(renderMode==RenderTypeNormal){outputColor=vec4(packNormalToRgb(normal),color.a);}else if(renderMode==RenderTypeTreeIndex){outputColor=vec4(packIntToColor(treeIndex),color.a);}else if(renderMode==RenderTypeDepth){outputColor=packDepthToRGBA(depth);}else if(renderMode==RenderTypeLOD){bool isHighDetail=geometryType!=GeometryType.Quad;vec2 cap=normal.xy*0.5+0.5;vec3 mc=texture(matCapTexture,cap).rgb*1.5;outputColor=isHighDetail ? vec4(vec3(0.0,1.0,0.0)*mc,color.a): vec4(vec3(1.0,1.0,0.0)*mc,color.a);}else if(renderMode==RenderTypeGeometryType){vec2 cap=normal.xy*0.5+0.5;vec3 mc=texture(matCapTexture,cap).rgb;vec3 geometryColor=float(geometryType==1)*vec3(1.0,0.0,0.0)+float(geometryType==2)*vec3(0.0,1.0,0.0)+float(geometryType==3)*vec3(0.0,0.0,1.0)+float(geometryType==4)*vec3(1.0,1.0,0.0);outputColor=vec4(geometryColor*mc,color.a);}else{outputColor=vec4(1.0,0.0,1.0,1.0);}}struct NodeAppearance{vec4 colorTexel;bool isVisible;bool renderInFront;bool renderGhosted;};float floatBitsSubset(float inNumber,int fromLeastSignificantBitIndex,int toMostSignificantBitIndex){float r=float(fromLeastSignificantBitIndex);float l=float(toMostSignificantBitIndex);float bitShift=pow(2.0,r);return mod(((inNumber-mod(inNumber,bitShift))/bitShift),pow(2.0,l - r));}NodeAppearance nodeAppearanceFromTexel(vec4 nodeAppearanceTexel){float alphaUnwrapped=floor((nodeAppearanceTexel.a*255.0)+0.5);bool isVisible=floatBitsSubset(alphaUnwrapped,0,1)==1.0;bool renderInFront=floatBitsSubset(alphaUnwrapped,1,2)==1.0;bool renderGhosted=floatBitsSubset(alphaUnwrapped,2,3)==1.0;return NodeAppearance(nodeAppearanceTexel,isVisible,renderInFront,renderGhosted);}NodeAppearance determineNodeAppearance(sampler2D nodeAppearanceTexture,vec2 textureSize,highp float treeIndex){highp int dataTextureWidth=int(textureSize.x);highp int dataTextureHeight=int(textureSize.y);highp int iTreeIndex=int(treeIndex);highp int xTreeIndexTextureCoord=iTreeIndex % dataTextureWidth;highp int yTreeIndexTextureCoord=iTreeIndex/dataTextureWidth;vec4 texel=texelFetch(nodeAppearanceTexture,ivec2(xTreeIndexTextureCoord,yTreeIndexTextureCoord),0);return nodeAppearanceFromTexel(texel);}vec4 determineColor(vec3 originalColor,NodeAppearance nodeAppearance){vec4 overrideColor=nodeAppearance.colorTexel;if(any(greaterThan(overrideColor.rgb,vec3(0.0)))){return overrideColor;}return vec4(originalColor.rgb,overrideColor.a);}\n#if NUM_CLIPPING_PLANES > 0\nuniform vec4 clippingPlanes[NUM_CLIPPING_PLANES];\n#endif\nbool isClipped(vec3 point){\n#if NUM_CLIPPING_PLANES > 0\nvec3 pointFlipped=-point;vec4 plane;for(int i=0;i<UNION_CLIPPING_PLANES;i++){plane=clippingPlanes[i];if(dot(pointFlipped,plane.xyz)>plane.w)return true;}\n#if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES\nbool clipped=true;for(int i=UNION_CLIPPING_PLANES;i<NUM_CLIPPING_PLANES;i++){plane=clippingPlanes[i];clipped=(dot(pointFlipped,plane.xyz)>plane.w)&&clipped;}if(clipped)return true;\n#endif\n#endif\nreturn false;}struct UnusedTreeIndexPacked{highp float thousands;highp float subThousands;};highp vec2 packTreeIndex(float treeIndex){highp float roundedTreeIndex=round(treeIndex);highp float treeIndexThousands=floor(roundedTreeIndex/1000.0);highp float treeIndexSubThousands=mod(roundedTreeIndex,1000.0);return vec2(treeIndexThousands,treeIndexSubThousands);}highp float unpackTreeIndex(highp vec2 treeIndexPacked){highp float treeIndex=round(treeIndexPacked.x)*1000.0+round(treeIndexPacked.y);return treeIndex;}uniform sampler2D matCapTexture;uniform lowp int renderMode;in vec3 v_color;in vec3 v_normal;in vec3 vViewPosition;in vec4 v_nodeAppearanceTexel;in highp vec2 v_treeIndexPacked;void main(){highp float v_treeIndex=unpackTreeIndex(v_treeIndexPacked);NodeAppearance appearance=nodeAppearanceFromTexel(v_nodeAppearanceTexel);if(isClipped(vViewPosition)){discard;}vec4 color=determineColor(v_color,appearance);vec3 normal=normalize(v_normal);updateFragmentColor(renderMode,color,v_treeIndex,normal,gl_FragCoord.z,matCapTexture,GeometryType.Primitive);}", wn = "mat4 determineMatrixOverride(float treeIndex,vec2 treeIndexTextureSize,sampler2D transformOverrideIndexTexture,vec2 transformOverrideTextureSize,sampler2D transformOverrideTexture){float dataTextureWidth=treeIndexTextureSize.x;float dataTextureHeight=treeIndexTextureSize.y;int xTreeIndexTextureCoord=int(mod(treeIndex,dataTextureWidth));int yTreeIndexTextureCoord=int(floor(treeIndex/dataTextureWidth));float index=texelFetch(transformOverrideIndexTexture,ivec2(xTreeIndexTextureCoord,yTreeIndexTextureCoord),0).r;if(index==0.0){return mat4(1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0);}index-=1.0;float matrixElements[12];for(int i=0;i<12;i++){matrixElements[i]=texelFetch(transformOverrideTexture,ivec2(i+int(index)*16,0.0),0).r;}return mat4(matrixElements[0],matrixElements[4],matrixElements[8],0,matrixElements[1],matrixElements[5],matrixElements[9],0,matrixElements[2],matrixElements[6],matrixElements[10],0,matrixElements[3],matrixElements[7],matrixElements[11],1);}struct UnusedTreeIndexPacked{highp float thousands;highp float subThousands;};highp vec2 packTreeIndex(float treeIndex){highp float roundedTreeIndex=round(treeIndex);highp float treeIndexThousands=floor(roundedTreeIndex/1000.0);highp float treeIndexSubThousands=mod(roundedTreeIndex,1000.0);return vec2(treeIndexThousands,treeIndexSubThousands);}highp float unpackTreeIndex(highp vec2 treeIndexPacked){highp float treeIndex=round(treeIndexPacked.x)*1000.0+round(treeIndexPacked.y);return treeIndex;}const int RenderTypeColor=1;const int RenderTypeNormal=2;const int RenderTypeTreeIndex=3;const int RenderTypePackColorAndNormal=4;const int RenderTypeDepth=5;const int RenderTypeEffects=6;const int RenderTypeGhost=7;const int RenderTypeLOD=8;const int RenderTypeDepthBufferOnly=9;const int RenderTypeGeometryType=10;struct NodeAppearance{vec4 colorTexel;bool isVisible;bool renderInFront;bool renderGhosted;};float floatBitsSubset(float inNumber,int fromLeastSignificantBitIndex,int toMostSignificantBitIndex){float r=float(fromLeastSignificantBitIndex);float l=float(toMostSignificantBitIndex);float bitShift=pow(2.0,r);return mod(((inNumber-mod(inNumber,bitShift))/bitShift),pow(2.0,l - r));}NodeAppearance nodeAppearanceFromTexel(vec4 nodeAppearanceTexel){float alphaUnwrapped=floor((nodeAppearanceTexel.a*255.0)+0.5);bool isVisible=floatBitsSubset(alphaUnwrapped,0,1)==1.0;bool renderInFront=floatBitsSubset(alphaUnwrapped,1,2)==1.0;bool renderGhosted=floatBitsSubset(alphaUnwrapped,2,3)==1.0;return NodeAppearance(nodeAppearanceTexel,isVisible,renderInFront,renderGhosted);}NodeAppearance determineNodeAppearance(sampler2D nodeAppearanceTexture,vec2 textureSize,highp float treeIndex){highp int dataTextureWidth=int(textureSize.x);highp int dataTextureHeight=int(textureSize.y);highp int iTreeIndex=int(treeIndex);highp int xTreeIndexTextureCoord=iTreeIndex % dataTextureWidth;highp int yTreeIndexTextureCoord=iTreeIndex/dataTextureWidth;vec4 texel=texelFetch(nodeAppearanceTexture,ivec2(xTreeIndexTextureCoord,yTreeIndexTextureCoord),0);return nodeAppearanceFromTexel(texel);}bool determineVisibility(NodeAppearance nodeAppearance,int renderMode){bool visible=nodeAppearance.isVisible;bool ghost=(renderMode==RenderTypeGhost)&&nodeAppearance.renderGhosted;bool inFront=(renderMode==RenderTypeEffects)&&nodeAppearance.renderInFront;bool back=(renderMode==RenderTypeColor)&&!nodeAppearance.renderGhosted&&!nodeAppearance.renderInFront;bool other=(renderMode!=RenderTypeColor&&renderMode!=RenderTypeEffects&&renderMode!=RenderTypeGhost)&&!nodeAppearance.renderGhosted;return visible&&(ghost||inFront||back||other);}uniform mat4 modelViewMatrix;uniform mat4 projectionMatrix;uniform mat3 normalMatrix;uniform vec2 treeIndexTextureSize;uniform vec2 transformOverrideTextureSize;uniform sampler2D transformOverrideIndexTexture;uniform sampler2D transformOverrideTexture;uniform sampler2D colorDataTexture;uniform lowp int renderMode;in vec3 position;in float a_treeIndex;in vec3 a_color;in vec3 a_vertex1;in vec3 a_vertex2;in vec3 a_vertex3;in vec3 a_vertex4;out vec3 v_color;out vec3 v_normal;out vec3 vViewPosition;out vec4 v_nodeAppearanceTexel;out highp vec2 v_treeIndexPacked;void main(){NodeAppearance appearance=determineNodeAppearance(colorDataTexture,treeIndexTextureSize,a_treeIndex);if(!determineVisibility(appearance,renderMode)){gl_Position=vec4(2.0,2.0,2.0,1.0);return;}v_nodeAppearanceTexel=appearance.colorTexel;v_treeIndexPacked=packTreeIndex(a_treeIndex);vec3 transformed;if(position.x<1.5){transformed=position.x==0.0 ? a_vertex1 : a_vertex2;}else{transformed=position.x==2.0 ? a_vertex3 : a_vertex4;}mat4 treeIndexWorldTransform=determineMatrixOverride(a_treeIndex,treeIndexTextureSize,transformOverrideIndexTexture,transformOverrideTextureSize,transformOverrideTexture);vec3 objectNormal=cross(a_vertex1-a_vertex2,a_vertex1 - a_vertex3);v_color=a_color;v_normal=normalMatrix*normalize(treeIndexWorldTransform*vec4(objectNormal,0.0)).xyz;vec4 mvPosition=modelViewMatrix*treeIndexWorldTransform*vec4(transformed,1.0);vViewPosition=mvPosition.xyz;gl_Position=projectionMatrix*mvPosition;}", Tn = "precision highp float;uniform sampler2D tDepth;uniform sampler2D tDiffuse;\n#if defined(use_edl)\n#define MAX_FLOAT 3.402823466e+38\n#define point_size_relative_to_screen_height (1.0 / 1080.0)\nvec2 calculateObscurance(float depth,float screenWidth,float screenHeight,vec2 neighbours[NEIGHBOUR_COUNT],float radius,vec2 vUv,sampler2D depthTexture,sampler2D logDepthTexture){vec2 uvRadius=radius/vec2(screenWidth/(screenHeight*point_size_relative_to_screen_height),1.0f/point_size_relative_to_screen_height);float sum=0.0;float minNeighbourDepth=MAX_FLOAT;vec2 minNeighbourUv=vec2(0.0,0.0);bool thisOutside=depth==0.0;for(int i=0;i<NEIGHBOUR_COUNT;i++){vec2 uvNeighbour=vUv+uvRadius*neighbours[i];float neighbourDepth=texture(logDepthTexture,uvNeighbour).a;bool isSmallestNeighbourDepth=neighbourDepth<minNeighbourDepth;minNeighbourDepth=isSmallestNeighbourDepth ? neighbourDepth : minNeighbourDepth;minNeighbourUv=isSmallestNeighbourDepth ? uvNeighbour : minNeighbourUv;bool otherOutside=neighbourDepth==0.0;sum+=otherOutside ? 0.0:(thisOutside ? 100.0 : max(0.0,depth-neighbourDepth));}return vec2(sum/float(NEIGHBOUR_COUNT),texture(depthTexture,minNeighbourUv).r);}uniform float screenWidth;uniform float screenHeight;uniform vec2 neighbours[NEIGHBOUR_COUNT];uniform float edlStrength;uniform float radius;\n#if defined(points_blend)\nuniform sampler2D tLogDepth;\n#endif\n#endif\n#define EDL_STRENGTH_FACTOR 400.0\nin vec2 vUv;out vec4 outputColor;void main(){float depth=texture(tDepth,vUv).r;vec4 color=texture(tDiffuse,vUv);bool shouldDiscard=depth>=1.0;\n#if defined(points_blend)\ncolor=color/color.w;\n#endif\noutputColor=vec4(color.rgb,1.0);gl_FragDepth=depth;\n#if defined(use_edl)\n#if defined (points_blend)\nfloat edlDepth=texture(tLogDepth,vUv).a;vec2 obs=calculateObscurance(edlDepth,screenWidth,screenHeight,neighbours,radius,vUv,tDepth,tLogDepth);\n#else\nfloat edlDepth=color.a;vec2 obs=calculateObscurance(edlDepth,screenWidth,screenHeight,neighbours,radius,vUv,tDepth,tDiffuse);\n#endif\nfloat shade=exp(-obs.x*EDL_STRENGTH_FACTOR*edlStrength);shouldDiscard=shouldDiscard&&obs.x==0.0;outputColor.xyz*=shade;gl_FragDepth=obs.y;\n#endif\nif(shouldDiscard){discard;}}", En = "uniform mat4 modelMatrix;uniform mat4 projectionMatrix;in vec3 position;in vec2 uv;out vec2 vUv;const mat4 unitOrthographicProjection=mat4(1.,0.,0.,0.,0.,1.,0.,0.,0.,0.,-1.,0.,0.,0.,0.,1.);void main(){vUv=uv;gl_Position=unitOrthographicProjection*modelMatrix*vec4(position,1.0);}", Dn = "precision highp float;precision highp int;uniform mat4 viewMatrix;uniform vec3 cameraPosition;uniform mat4 projectionMatrix;uniform float spacing;uniform float pcIndex;uniform float screenWidth;uniform float screenHeight;out vec4 outputColor;\n#ifdef highlight_point\nuniform vec4 highlightedPointColor;\n#endif\nin vec3 vColor;\n#if defined(weighted_splats)\nin float vLinearDepth;\n#endif\n#if defined(use_edl)\nin float vLogDepth;\n#endif\n#if defined(paraboloid_point_shape)\nin vec3 vViewPosition;\n#endif\n#if defined(weighted_splats) || defined(paraboloid_point_shape)\nin float vRadius;\n#endif\nfloat specularStrength=1.0;void main(){vec3 color=vColor;float depth=gl_FragCoord.z;\n#if defined(circle_point_shape) || defined(paraboloid_point_shape) || defined (weighted_splats)\nfloat u=2.0*gl_PointCoord.x-1.0;float v=2.0*gl_PointCoord.y-1.0;\n#endif\n#if defined(circle_point_shape) || defined(paraboloid_point_shape)\nfloat cc=u*u+v*v;if(cc>1.0){discard;}\n#endif\n#if defined color_type_point_index\noutputColor=vec4(color,pcIndex/255.0);\n#else\noutputColor=vec4(color,1.0);\n#endif\n#if defined paraboloid_point_shape\nfloat wi=0.0-(u*u+v*v);vec4 pos=vec4(vViewPosition,1.0);pos.z+=wi*vRadius;float linearDepth=-pos.z;pos=projectionMatrix*pos;pos=pos/pos.w;float expDepth=pos.z;depth=(pos.z+1.0)/2.0;gl_FragDepth=depth;\n#if defined(color_type_depth)\noutputColor.r=linearDepth;outputColor.g=expDepth;\n#endif\n#endif\n#if defined(use_edl)\noutputColor.a=vLogDepth;\n#endif\n#if defined weighted_splats\nfloat distance=2.0*length(gl_PointCoord.xy-0.5);float weight=max(0.0,1.0-distance);weight=pow(weight,1.5);outputColor.a=weight;outputColor.rgb=outputColor.rgb*weight;\n#endif\n}", On = "precision highp float;precision highp int;\n#define point_size_relative_to_screen_height (1.0 / 1080.0)\n#if NUM_CLIPPING_PLANES > 0\nuniform vec4 clippingPlanes[NUM_CLIPPING_PLANES];\n#endif\nbool isClipped(vec3 point){\n#if NUM_CLIPPING_PLANES > 0\nvec3 pointFlipped=-point;vec4 plane;for(int i=0;i<UNION_CLIPPING_PLANES;i++){plane=clippingPlanes[i];if(dot(pointFlipped,plane.xyz)>plane.w)return true;}\n#if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES\nbool clipped=true;for(int i=UNION_CLIPPING_PLANES;i<NUM_CLIPPING_PLANES;i++){plane=clippingPlanes[i];clipped=(dot(pointFlipped,plane.xyz)>plane.w)&&clipped;}if(clipped)return true;\n#endif\n#endif\nreturn false;}\n#define max_clip_boxes 30\nin vec3 position;in vec3 color;in float intensity;in float classification;in float objectId;in vec4 indices;uniform mat4 modelMatrix;uniform mat4 modelViewMatrix;uniform mat4 projectionMatrix;uniform mat4 viewMatrix;uniform float screenWidth;uniform float screenHeight;uniform float fov;uniform float spacing;uniform float heightMin;uniform float heightMax;uniform float size;uniform float minSize;uniform float maxSize;uniform float octreeSize;uniform float level;uniform float vnStart;uniform bool isLeafNode;uniform vec2 intensityRange;uniform float intensityGamma;uniform float intensityContrast;uniform float intensityBrightness;uniform float rgbGamma;uniform float rgbContrast;uniform float rgbBrightness;uniform sampler2D visibleNodes;uniform sampler2D gradient;uniform sampler2D classificationLUT;uniform sampler2D objectIdLUT;out vec3 vColor;\n#if defined(weighted_splats)\nout float vLinearDepth;\n#endif\n#if defined(use_edl)\nout float vLogDepth;\n#endif\n#if defined(weighted_splats) || defined(paraboloid_point_shape) || defined(hq_depth_pass)\nout float vRadius;out vec3 vViewPosition;\n#endif\n#if defined(adaptive_point_size) || defined(color_type_lod)\nint numberOfOnes(int number,int index){int numOnes=0;int tmp=128;for(int i=7;i>=0;i--){if(number>=tmp){number=number-tmp;if(i<=index){numOnes++;}}tmp=tmp/2;}return numOnes;}bool isBitSet(int number,int index){int powi=1;if(index==0){powi=1;}else if(index==1){powi=2;}else if(index==2){powi=4;}else if(index==3){powi=8;}else if(index==4){powi=16;}else if(index==5){powi=32;}else if(index==6){powi=64;}else if(index==7){powi=128;}int ndp=number/powi;return mod(float(ndp),2.0)!=0.0;}/***Gets the the LOD at the point position.*/float getLOD(){vec3 offset=vec3(0.0,0.0,0.0);int iOffset=int(vnStart);float depth=level;for(float i=0.0;i<=30.0;i++){float nodeSizeAtLevel=octreeSize/pow(2.0,i+level+0.0);vec3 index3d=(position-offset)/nodeSizeAtLevel;index3d=floor(index3d+0.5);int index=int(round(4.0*index3d.x+2.0*index3d.y+index3d.z));vec4 value=texture(visibleNodes,vec2(float(iOffset)/2048.0,0.0));int mask=int(round(value.r*255.0));if(isBitSet(mask,index)){int advanceG=int(round(value.g*255.0))*256;int advanceB=int(round(value.b*255.0));int advanceChild=numberOfOnes(mask,index-1);int advance=advanceG+advanceB+advanceChild;iOffset=iOffset+advance;depth++;}else{return value.a*255.0;}offset=offset+(vec3(1.0,1.0,1.0)*nodeSizeAtLevel*0.5)*index3d;}return depth;}float getPointSizeAttenuation(){return 0.5*pow(2.0,getLOD());}\n#endif\nfloat getContrastFactor(float contrast){return(1.0158730158730156*(contrast+1.0))/(1.0158730158730156-contrast);}vec3 getRGB(){return color;}float getIntensity(){float w=(intensity-intensityRange.x)/(intensityRange.y - intensityRange.x);w=pow(w,intensityGamma);w=w+intensityBrightness;w=(w-0.5)*getContrastFactor(intensityContrast)+0.5;w=clamp(w,0.0,1.0);return w;}vec3 getRgbWithIntensityFallback(){vec3 rgb=getRGB();float intensity=getIntensity();return rgb!=vec3(0.0)? rgb : vec3(intensity);}vec3 getElevation(){vec4 world=modelMatrix*vec4(position,1.0);float w=(world.y-heightMin)/(heightMax-heightMin);vec3 cElevation=texture(gradient,vec2(w,1.0-w)).rgb;return cElevation;}vec4 getClassification(){vec2 uv=vec2(classification/255.0,0.5);vec4 classColor=texture(classificationLUT,uv);return classColor;}void main(){vec4 mvPosition=modelViewMatrix*vec4(position,1.0);\n#if defined paraboloid_point_shape\nvViewPosition=mvPosition.xyz;\n#endif\nvec4 classification=getClassification();float outColorAlpha=classification.a;gl_Position=projectionMatrix*mvPosition;\n#if defined weighted_splats\nvLinearDepth=gl_Position.w;\n#endif\n#if defined(use_edl)\nvLogDepth=log2(-mvPosition.z)/10.0;\n#endif\nfloat pointSize=1.0;float slope=tan(fov/2.0);float projFactor=-0.5/(point_size_relative_to_screen_height*slope*mvPosition.z);float size=size*screenHeight*point_size_relative_to_screen_height;float minSize=minSize*screenHeight*point_size_relative_to_screen_height;float maxSize=maxSize*screenHeight*point_size_relative_to_screen_height;\n#if defined fixed_point_size\npointSize=size;\n#elif defined attenuated_point_size\npointSize=size*spacing*projFactor;\n#elif defined adaptive_point_size\nfloat worldSpaceSize=2.0*size*spacing/getPointSizeAttenuation();pointSize=worldSpaceSize*projFactor;\n#endif\npointSize=max(minSize,pointSize);pointSize=min(maxSize,pointSize);\n#if defined(weighted_splats) || defined(paraboloid_point_shape) || defined(hq_depth_pass)\nvRadius=pointSize/projFactor;\n#endif\ngl_PointSize=pointSize;\n#ifdef color_type_rgb\nvColor=getRGB();\n#elif defined color_type_height\nvec3 rgb=getRgbWithIntensityFallback();vColor=rgb==vec3(0.0,0.0,0.0)? getElevation(): mix(getElevation(),rgb,0.4);\n#elif defined color_type_depth\nfloat linearDepth=-mvPosition.z;float expDepth=(gl_Position.z/gl_Position.w)*0.5+0.5;vColor=vec3(linearDepth,expDepth,0.0);\n#elif defined color_type_intensity\nfloat w=getIntensity();vColor=vec3(w,w,w);\n#elif defined color_type_lod\nfloat w=getLOD()/10.0;vColor=texture(gradient,vec2(w,1.0-w)).rgb;\n#elif defined color_type_point_index\nvColor=indices.rgb;\n#elif defined color_type_classification\nvec3 rgb=getRgbWithIntensityFallback();vColor=rgb==vec3(0.0,0.0,0.0)? classification.rgb: mix(classification.rgb,rgb,0.4);\n#endif\nif(outColorAlpha==0.0){gl_Position=vec4(100.0,100.0,100.0,0.0);return;}\n#if defined hq_depth_pass\nfloat originalDepth=gl_Position.w;float adjustedDepth=originalDepth+2.0*vRadius;float adjust=adjustedDepth/originalDepth;mvPosition.xyz=mvPosition.xyz*adjust;gl_Position=projectionMatrix*mvPosition;\n#endif\nif(isClipped((modelViewMatrix*vec4(position,1.0)).xyz)){gl_Position=vec4(1000.0,1000.0,1000.0,1.0);}int lutX=int(objectId)% OBJECT_STYLING_TEXTURE_WIDTH;int lutY=int(objectId)/OBJECT_STYLING_TEXTURE_WIDTH;vec4 styleTexel=texelFetch(objectIdLUT,ivec2(lutX,lutY),0);vec3 styleColor=styleTexel.rgb;float alphaUnwrapped=floor((styleTexel.a*255.0)+0.5);if(mod(alphaUnwrapped,2.0)==0.0){gl_Position=vec4(100.0,100.0,100.0,0.0);return;}\n#if !defined(color_type_point_index)\nif(any(greaterThan(styleColor,vec3(0.0)))){vColor=(styleColor*0.8+vColor*0.2);}\n#endif\n}", kn = "precision highp float;float rand2d(in vec2 co){return fract(sin(dot(co.xy,vec2(12.9898,78.233)))*43758.5453);}uniform mat4 projMatrix;uniform mat4 inverseProjectionMatrix;uniform vec3 kernel[MAX_KERNEL_SIZE];uniform sampler2D tDepth;uniform float sampleRadius;uniform float bias;in vec2 vUv;out vec4 outputColor;vec3 viewPosFromDepth(float depth,vec2 uv){float z=depth*2.0-1.0;vec4 clipSpacePosition=vec4(uv*2.0-1.0,z,1.0);vec4 viewSpacePosition=inverseProjectionMatrix*clipSpacePosition;viewSpacePosition/=viewSpacePosition.w;return viewSpacePosition.xyz;}vec3 computeWorldNormalFromDepth(sampler2D depthTexture,vec2 resolution,vec2 uv,float sampleDepth){float dx=1.0/resolution.x;float dy=1.0/resolution.y;vec2 uv1=uv+vec2(dx,0.0);float d1=texture(depthTexture,uv1).r;vec2 uv2=uv+vec2(0.0,dy);float d2=texture(depthTexture,uv2).r;vec2 uv3=uv+vec2(-dx,0.0);float d3=texture(depthTexture,uv3).r;vec2 uv4=uv+vec2(0.0,-dy);float d4=texture(depthTexture,uv4).r;bool horizontalSampleCondition=abs(d1-sampleDepth)<abs(d3 - sampleDepth);float horizontalSampleDepth=horizontalSampleCondition ? d1 : d3;vec2 horizontalSampleUv=horizontalSampleCondition ? uv1 : uv3;bool verticalSampleCondition=abs(d2-sampleDepth)<abs(d4 - sampleDepth);float verticalSampleDepth=verticalSampleCondition ? d2 : d4;vec2 verticalSampleUv=verticalSampleCondition ? uv2 : uv4;vec3 viewPos=viewPosFromDepth(sampleDepth,vUv);vec3 viewPos1=(horizontalSampleCondition==verticalSampleCondition)? viewPosFromDepth(horizontalSampleDepth,horizontalSampleUv): viewPosFromDepth(verticalSampleDepth,verticalSampleUv);vec3 viewPos2=(horizontalSampleCondition==verticalSampleCondition)? viewPosFromDepth(verticalSampleDepth,verticalSampleUv): viewPosFromDepth(horizontalSampleDepth,horizontalSampleUv);return normalize(cross(viewPos1-viewPos,viewPos2 - viewPos));}float LARGE_DISTANCE_SAMPLE_FACTOR=0.05;void main(){float d=texture(tDepth,vUv).r;ivec2 textureSize=textureSize(tDepth,0);vec3 viewNormal=computeWorldNormalFromDepth(tDepth,vec2(float(textureSize.x),float(textureSize.y)),vUv,d);vec3 viewPosition=viewPosFromDepth(d,vUv);float distanceFactor=max(length(viewPosition)*LARGE_DISTANCE_SAMPLE_FACTOR,1.0);vec3 covector=normalize(vec3(rand2d(vUv),rand2d(vUv*3.0),rand2d(vUv*5.0)));vec3 tangent=normalize(covector-viewNormal*dot(covector,viewNormal));vec3 bitangent=cross(viewNormal,tangent);mat3 TBN=mat3(tangent,bitangent,viewNormal);float occlusion=0.0;for(int i=0;i<MAX_KERNEL_SIZE;i++){vec3 sampleVector=TBN*kernel[i];vec3 samplePosition=viewPosition+sampleVector*sampleRadius*distanceFactor;vec4 offset=projMatrix*vec4(samplePosition,1.0);offset.xyz/=offset.w;offset.xyz=offset.xyz*0.5+0.5;float realDepth=texture(tDepth,offset.xy).r;vec3 realPos=viewPosFromDepth(realDepth,offset.xy);float rangeCheck=smoothstep(0.0,1.0,sampleRadius/length(viewPosition-realPos));occlusion+=(realPos.z>=samplePosition.z+bias ? 1.0 : 0.0)*rangeCheck;}float occlusionFactor=1.0-clamp(occlusion/float(MAX_KERNEL_SIZE),0.0,1.0);outputColor=vec4(occlusionFactor);}", An = "uniform mat4 modelMatrix;uniform mat4 viewMatrix;uniform mat4 projectionMatrix;in vec3 position;in vec2 uv;out vec2 vUv;void main(){vUv=uv;gl_Position=projectionMatrix*viewMatrix*modelMatrix*vec4(position,1.0);}", jn = "precision highp float;uniform sampler2D tDiffuse;\n#if defined(DEPTH_WRITE)\nuniform sampler2D tDepth;\n#endif\n#if defined(SSAO_BLUR)\nuniform sampler2D tSsao;\n#endif\n#if defined(ALPHA)\nuniform float alpha;\n#endif\n#if defined(OUTLINE)\nuniform sampler2D tOutlineColors;\n#endif\nin vec2 vUv;in float near;in float far;out vec4 fragColor;\n#if defined(SSAO_BLUR)\nvec4 gaussianBlur(sampler2D tDiffuse,vec2 uv){ivec2 textureSize=textureSize(tDiffuse,0);vec2 resolution=vec2(float(textureSize.x),float(textureSize.y));return texture(tDiffuse,uv+vec2(-3.1111111,-3.1111111)/resolution)*0.0012360+texture(tDiffuse,uv+vec2(-1.3333333,-3.1111111)/resolution)*0.0115356+texture(tDiffuse,uv+vec2(-3.1111111,-1.3333333)/resolution)*0.0115356+texture(tDiffuse,uv+vec2(-1.3333333,-1.3333333)/resolution)*0.1076660+texture(tDiffuse,uv+vec2(0.0000000,-3.1111111)/resolution)*0.0096130+texture(tDiffuse,uv+vec2(0.0000000,-1.3333333)/resolution)*0.0897217+texture(tDiffuse,uv+vec2(1.3333333,-3.1111111)/resolution)*0.0115356+texture(tDiffuse,uv+vec2(3.1111111,-3.1111111)/resolution)*0.0012360+texture(tDiffuse,uv+vec2(1.3333333,-1.3333333)/resolution)*0.1076660+texture(tDiffuse,uv+vec2(3.1111111,-1.3333333)/resolution)*0.0115356+texture(tDiffuse,uv+vec2(-3.1111111,0.0000000)/resolution)*0.0096130+texture(tDiffuse,uv+vec2(-1.3333333,0.0000000)/resolution)*0.0897217+texture(tDiffuse,uv+vec2(-3.1111111,1.3333333)/resolution)*0.0115356+texture(tDiffuse,uv+vec2(-1.3333333,1.3333333)/resolution)*0.1076660+texture(tDiffuse,uv+vec2(-3.1111111,3.1111111)/resolution)*0.0012360+texture(tDiffuse,uv+vec2(-1.3333333,3.1111111)/resolution)*0.0115356+texture(tDiffuse,uv+vec2(0.0000000,1.3333333)/resolution)*0.0897217+texture(tDiffuse,uv+vec2(0.0000000,3.1111111)/resolution)*0.0096130+texture(tDiffuse,uv+vec2(1.3333333,1.3333333)/resolution)*0.1076660+texture(tDiffuse,uv+vec2(3.1111111,1.3333333)/resolution)*0.0115356+texture(tDiffuse,uv+vec2(1.3333333,3.1111111)/resolution)*0.0115356+texture(tDiffuse,uv+vec2(3.1111111,3.1111111)/resolution)*0.0012360+texture(tDiffuse,uv+vec2(1.3333333,0.0000000)/resolution)*0.0897217+texture(tDiffuse,uv+vec2(3.1111111,0.0000000)/resolution)*0.0096130+texture(tDiffuse,uv)*0.0747681;}\n#endif\n#if defined(FXAA)\n#ifndef FXAA_REDUCE_MIN\n#define FXAA_REDUCE_MIN (1.0/ 128.0)\n#endif\n#ifndef FXAA_REDUCE_MUL\n#define FXAA_REDUCE_MUL (1.0 / 8.0)\n#endif\n#ifndef FXAA_SPAN_MAX\n#define FXAA_SPAN_MAX 8.0\n#endif\nvec4 fxaa(sampler2D tex){vec4 color;vec2 fragCoord=gl_FragCoord.xy;ivec2 textureSize=textureSize(tDiffuse,0);vec2 resolution=vec2(float(textureSize.x),float(textureSize.y));vec2 inverseResolution=vec2(1.0/resolution.x,1.0/resolution.y);vec2 v_rgbNW=(fragCoord+vec2(-1.0,-1.0))*inverseResolution;vec2 v_rgbNE=(fragCoord+vec2(1.0,-1.0))*inverseResolution;vec2 v_rgbSW=(fragCoord+vec2(-1.0,1.0))*inverseResolution;vec2 v_rgbSE=(fragCoord+vec2(1.0,1.0))*inverseResolution;vec2 v_rgbM=vec2(fragCoord*inverseResolution);vec3 rgbNW=texture(tex,v_rgbNW).xyz;vec3 rgbNE=texture(tex,v_rgbNE).xyz;vec3 rgbSW=texture(tex,v_rgbSW).xyz;vec3 rgbSE=texture(tex,v_rgbSE).xyz;vec4 texColor=texture(tex,v_rgbM);vec3 rgbM=texColor.xyz;vec3 luma=vec3(0.299,0.587,0.114);float lumaNW=dot(rgbNW,luma);float lumaNE=dot(rgbNE,luma);float lumaSW=dot(rgbSW,luma);float lumaSE=dot(rgbSE,luma);float lumaM=dot(rgbM,luma);float lumaMin=min(lumaM,min(min(lumaNW,lumaNE),min(lumaSW,lumaSE)));float lumaMax=max(lumaM,max(max(lumaNW,lumaNE),max(lumaSW,lumaSE)));mediump vec2 dir;dir.x=-((lumaNW+lumaNE)-(lumaSW+lumaSE));dir.y=((lumaNW+lumaSW)-(lumaNE+lumaSE));float dirReduce=max((lumaNW+lumaNE+lumaSW+lumaSE)*(0.25*FXAA_REDUCE_MUL),FXAA_REDUCE_MIN);float rcpDirMin=1.0/(min(abs(dir.x),abs(dir.y))+dirReduce);dir=min(vec2(FXAA_SPAN_MAX,FXAA_SPAN_MAX),max(vec2(-FXAA_SPAN_MAX,-FXAA_SPAN_MAX),dir*rcpDirMin));vec4 rgbA=0.5*(texture(tex,inverseResolution*(fragCoord+dir*(1.0/3.0-0.5)))+texture(tex,inverseResolution*(fragCoord+dir*(2.0/3.0-0.5))));vec4 rgbB=rgbA*0.5+0.25*(texture(tex,inverseResolution*(fragCoord+dir*-0.5))+texture(tex,inverseResolution*(fragCoord+dir*0.5)));float lumaB=dot(rgbB.rgb,luma);if((lumaB<lumaMin)||(lumaB>lumaMax)){color=rgbA;}else{color=rgbB;}return color;}\n#endif\n#if defined(EDGES)\nmat3 G[9];const mat3 g0=mat3(0.3535533845424652,0,-0.3535533845424652,0.5,0,-0.5,0.3535533845424652,0,-0.3535533845424652);const mat3 g1=mat3(0.3535533845424652,0.5,0.3535533845424652,0,0,0,-0.3535533845424652,-0.5,-0.3535533845424652);const mat3 g2=mat3(0,0.3535533845424652,-0.5,-0.3535533845424652,0,0.3535533845424652,0.5,-0.3535533845424652,0);const mat3 g3=mat3(0.5,-0.3535533845424652,0,-0.3535533845424652,0,0.3535533845424652,0,0.3535533845424652,-0.5);const mat3 g4=mat3(0,-0.5,0,0.5,0,0.5,0,-0.5,0);const mat3 g5=mat3(-0.5,0,0.5,0,0,0,0.5,0,-0.5);const mat3 g6=mat3(0.1666666716337204,-0.3333333432674408,0.1666666716337204,-0.3333333432674408,0.6666666865348816,-0.3333333432674408,0.1666666716337204,-0.3333333432674408,0.1666666716337204);const mat3 g7=mat3(-0.3333333432674408,0.1666666716337204,-0.3333333432674408,0.1666666716337204,0.6666666865348816,0.1666666716337204,-0.3333333432674408,0.1666666716337204,-0.3333333432674408);const mat3 g8=mat3(0.3333333432674408,0.3333333432674408,0.3333333432674408,0.3333333432674408,0.3333333432674408,0.3333333432674408,0.3333333432674408,0.3333333432674408,0.3333333432674408);float edgeDetectionFilter(sampler2D baseTexture){ivec2 fragCoord=ivec2(gl_FragCoord.xy);G[0]=g0,G[1]=g1,G[2]=g2,G[3]=g3,G[4]=g4,G[5]=g5,G[6]=g6,G[7]=g7,G[8]=g8;mat3 I;I[0][0]=length(texelFetch(baseTexture,fragCoord+ivec2(-1,-1),0).rgb);I[0][1]=length(texelFetch(baseTexture,fragCoord+ivec2(-1,0),0).rgb);I[0][2]=length(texelFetch(baseTexture,fragCoord+ivec2(-1,1),0).rgb);I[1][0]=length(texelFetch(baseTexture,fragCoord+ivec2(0,-1),0).rgb);I[1][1]=length(texelFetch(baseTexture,fragCoord+ivec2(0,0),0).rgb);I[1][2]=length(texelFetch(baseTexture,fragCoord+ivec2(0,1),0).rgb);I[2][0]=length(texelFetch(baseTexture,fragCoord+ivec2(1,-1),0).rgb);I[2][1]=length(texelFetch(baseTexture,fragCoord+ivec2(1,0),0).rgb);I[2][2]=length(texelFetch(baseTexture,fragCoord+ivec2(1,1),0).rgb);float dp0=dot(G[0][0],I[0])+dot(G[0][1],I[1])+dot(G[0][2],I[2]);float cnv0=dp0*dp0;float dp1=dot(G[1][0],I[0])+dot(G[1][1],I[1])+dot(G[1][2],I[2]);float cnv1=dp1*dp1;float dp2=dot(G[2][0],I[0])+dot(G[2][1],I[1])+dot(G[2][2],I[2]);float cnv2=dp2*dp2;float dp3=dot(G[3][0],I[0])+dot(G[3][1],I[1])+dot(G[3][2],I[2]);float cnv3=dp3*dp3;float dp4=dot(G[4][0],I[0])+dot(G[4][1],I[1])+dot(G[4][2],I[2]);float cnv4=dp4*dp4;float dp5=dot(G[5][0],I[0])+dot(G[5][1],I[1])+dot(G[5][2],I[2]);float cnv5=dp5*dp5;float dp6=dot(G[6][0],I[0])+dot(G[6][1],I[1])+dot(G[6][2],I[2]);float cnv6=dp6*dp6;float dp7=dot(G[7][0],I[0])+dot(G[7][1],I[1])+dot(G[7][2],I[2]);float cnv7=dp7*dp7;float dp8=dot(G[8][0],I[0])+dot(G[8][1],I[1])+dot(G[8][2],I[2]);float cnv8=dp8*dp8;float M=(cnv0+cnv1)+(cnv2+cnv3);float S=(cnv4+cnv5)+(cnv6+cnv7)+(cnv8+M);return sqrt(M/S);}\n#endif\n#if defined(OUTLINE)\nfloat floatBitsSubset(float inNumber,int fromLeastSignificantBitIndex,int toMostSignificantBitIndex){float r=float(fromLeastSignificantBitIndex);float l=float(toMostSignificantBitIndex);float bitShift=pow(2.0,r);return mod(((inNumber-mod(inNumber,bitShift))/bitShift),pow(2.0,l - r));}const int texelOffset=2;int computeFloatEncodedOutlineIndex(float bitEncodedFloat){return int(floatBitsSubset(floor((bitEncodedFloat*255.0)+0.5),5,8));}ivec4 computeNeighborOutlineIndices(sampler2D tDiffuse,ivec2 fragCoord){int outlineN=computeFloatEncodedOutlineIndex(texelFetchOffset(tDiffuse,fragCoord,0,ivec2(0,texelOffset)).a);int outlineS=computeFloatEncodedOutlineIndex(texelFetchOffset(tDiffuse,fragCoord,0,ivec2(texelOffset,0)).a);int outlineE=computeFloatEncodedOutlineIndex(texelFetchOffset(tDiffuse,fragCoord,0,ivec2(0,-texelOffset)).a);int outlineW=computeFloatEncodedOutlineIndex(texelFetchOffset(tDiffuse,fragCoord,0,ivec2(-texelOffset,0)).a);return ivec4(outlineN,outlineS,outlineE,outlineW);}int fetchOutlineIndex(sampler2D tDiffuse){ivec2 fragCoord=ivec2(gl_FragCoord.xy);int outlineIndex=computeFloatEncodedOutlineIndex(texelFetch(tDiffuse,fragCoord,0).a);ivec4 neighbours=computeNeighborOutlineIndices(tDiffuse,fragCoord);bvec4 isEqualToPixel=equal(neighbours,ivec4(outlineIndex));bvec4 isMiss=equal(neighbours,ivec4(0));bvec4 isEqualOrMiss=bvec4(isEqualToPixel.x||isMiss.x,isEqualToPixel.y||isMiss.y,isEqualToPixel.z||isMiss.z,isEqualToPixel.w||isMiss.w);bool hasOutline=outlineIndex>0&&!(all(isEqualToPixel))&&all(isEqualOrMiss);return hasOutline ? outlineIndex : 0;}\n#endif\n#if defined(EDGES) && defined(DEPTH_WRITE)\nfloat toViewZ(float depth,float near,float far){return near*far/(far-depth*(far - near));}\n#endif\nvoid main(){vec4 diffuse=texture(tDiffuse,vUv);if(diffuse.a==0.0){discard;}\n#if defined(FXAA)\nfragColor=fxaa(tDiffuse);\n#else\nfragColor=diffuse;\n#if defined(SSAO_BLUR)\nfragColor*=gaussianBlur(tSsao,vUv);\n#endif\n#if defined(EDGES)\nfloat edgeStrength=edgeDetectionFilter(tDiffuse);edgeStrength=(1.0-pow(1.0 - edgeStrength,2.0));\n#if defined(DEPTH_WRITE)\nfloat depthEdge=toViewZ(texture(tDepth,vUv).r,near,far);edgeStrength*=(1.0-smoothstep(10.0,40.0,depthEdge));\n#endif\nfragColor.rgb*=isnan(edgeStrength)? 1.0 :(1.0-edgeStrength);\n#endif\n#if defined(OUTLINE)\nint outline=fetchOutlineIndex(tDiffuse);fragColor.rgb=outline>0 ? texelFetch(tOutlineColors,ivec2(outline,0),0).rgb : fragColor.rgb;\n#endif\n#endif\n#if defined(ALPHA)\nfragColor.a=alpha;\n#endif\n#if defined(DEPTH_WRITE)\ngl_FragDepth=texture(tDepth,vUv).r;\n#endif\n}", Mn = "uniform mat4 modelMatrix;uniform mat4 projectionMatrix;in vec3 position;in vec2 uv;out float near;out float far;out vec2 vUv;const mat4 unitOrthographicProjection=mat4(1.,0.,0.,0.,0.,1.,0.,0.,0.,0.,-1.,0.,0.,0.,0.,1.);void main(){vUv=uv;near=projectionMatrix[3][2]/(projectionMatrix[2][2]-1.0);far=projectionMatrix[3][2]/(projectionMatrix[2][2]+1.0);gl_Position=unitOrthographicProjection*modelMatrix*vec4(position,1.0);}", Nn = "precision highp float;uniform sampler2D tDiffuse;uniform sampler2D tDepth;uniform sampler2D tBlendDiffuse;uniform sampler2D tBlendDepth;uniform float blendFactor;\n#if defined(ALPHA)\nuniform float alpha;\n#endif\n#if defined(OUTLINE)\nuniform sampler2D tOutlineColors;\n#endif\nin vec2 vUv;out vec4 fragColor;\n#if defined(OUTLINE)\nfloat floatBitsSubset(float inNumber,int fromLeastSignificantBitIndex,int toMostSignificantBitIndex){float r=float(fromLeastSignificantBitIndex);float l=float(toMostSignificantBitIndex);float bitShift=pow(2.0,r);return mod(((inNumber-mod(inNumber,bitShift))/bitShift),pow(2.0,l - r));}const int texelOffset=2;int computeFloatEncodedOutlineIndex(float bitEncodedFloat){return int(floatBitsSubset(floor((bitEncodedFloat*255.0)+0.5),5,8));}ivec4 computeNeighborOutlineIndices(sampler2D tDiffuse,ivec2 fragCoord){int outlineN=computeFloatEncodedOutlineIndex(texelFetchOffset(tDiffuse,fragCoord,0,ivec2(0,texelOffset)).a);int outlineS=computeFloatEncodedOutlineIndex(texelFetchOffset(tDiffuse,fragCoord,0,ivec2(texelOffset,0)).a);int outlineE=computeFloatEncodedOutlineIndex(texelFetchOffset(tDiffuse,fragCoord,0,ivec2(0,-texelOffset)).a);int outlineW=computeFloatEncodedOutlineIndex(texelFetchOffset(tDiffuse,fragCoord,0,ivec2(-texelOffset,0)).a);return ivec4(outlineN,outlineS,outlineE,outlineW);}int fetchOutlineIndex(sampler2D tDiffuse){ivec2 fragCoord=ivec2(gl_FragCoord.xy);int outlineIndex=computeFloatEncodedOutlineIndex(texelFetch(tDiffuse,fragCoord,0).a);ivec4 neighbours=computeNeighborOutlineIndices(tDiffuse,fragCoord);bvec4 isEqualToPixel=equal(neighbours,ivec4(outlineIndex));bvec4 isMiss=equal(neighbours,ivec4(0));bvec4 isEqualOrMiss=bvec4(isEqualToPixel.x||isMiss.x,isEqualToPixel.y||isMiss.y,isEqualToPixel.z||isMiss.z,isEqualToPixel.w||isMiss.w);bool hasOutline=outlineIndex>0&&!(all(isEqualToPixel))&&all(isEqualOrMiss);return hasOutline ? outlineIndex : 0;}\n#endif\nvoid main(){vec4 diffuse=texture(tDiffuse,vUv);if(diffuse.a==0.0){discard;}float depth=texture(tDepth,vUv).r;vec4 blendDiffuse=texture(tBlendDiffuse,vUv);float blendDepth=texture(tBlendDepth,vUv).r;fragColor=mix(diffuse,blendDiffuse,blendFactor*step(0.0,depth-blendDepth));\n#if defined(OUTLINE)\nint outline=fetchOutlineIndex(tDiffuse);fragColor.rgb=outline>0 ? texelFetch(tOutlineColors,ivec2(outline,0),0).rgb : fragColor.rgb;\n#endif\n#if defined(ALPHA)\nfragColor.a=alpha;\n#endif\ngl_FragDepth=min(depth,blendDepth);}", V = {
|
|
142
|
+
packageManager: "pnpm@11.17.0"
|
|
143
|
+
}, an = "precision highp float;vec4 LinearTosRGB(in vec4 value){return vec4(mix(pow(value.rgb,vec3(0.41666))*1.055-vec3(0.055),value.rgb*12.92,vec3(lessThanEqual(value.rgb,vec3(0.0031308)))),value.a);}vec3 derivateNormal(vec3 v_viewPosition){vec3 fdx=vec3(dFdx(v_viewPosition.x),dFdx(v_viewPosition.y),dFdx(v_viewPosition.z));vec3 fdy=vec3(dFdy(v_viewPosition.x),dFdy(v_viewPosition.y),dFdy(v_viewPosition.z));vec3 normal=normalize(cross(fdx,fdy));return normal;}vec3 rgb2hsv(vec3 c){vec4 K=vec4(0.0,-1.0/3.0,2.0/3.0,-1.0);vec4 p=mix(vec4(c.bg,K.wz),vec4(c.gb,K.xy),step(c.b,c.g));vec4 q=mix(vec4(p.xyw,c.r),vec4(c.r,p.yzx),step(p.x,c.r));float d=q.x-min(q.w,q.y);float e=1.0e-10;return vec3(abs(q.z+(q.w-q.y)/(6.0*d+e)),d/(q.x+e),q.x);}vec3 hsv2rgb(vec3 c){vec4 K=vec4(1.0,2.0/3.0,1.0/3.0,3.0);vec3 p=abs(fract(c.xxx+K.xyz)*6.0-K.www);return c.z*mix(K.xxx,clamp(p-K.xxx,0.0,1.0),c.y);}vec3 packIntToColor(float number){float r=floor(number/(255.0*255.0))/255.0;float g=mod(floor(number/255.0),255.0)/255.0;float b=mod(number,255.0)/255.0;return vec3(r,g,b);}struct GeometryTypeEnum{int Quad;int Primitive;int TriangleMesh;int InstancedMesh;};const GeometryTypeEnum GeometryType=GeometryTypeEnum(1,2,3,4);const int RenderTypeColor=1;const int RenderTypeNormal=2;const int RenderTypeTreeIndex=3;const int RenderTypePackColorAndNormal=4;const int RenderTypeDepth=5;const int RenderTypeEffects=6;const int RenderTypeGhost=7;const int RenderTypeLOD=8;const int RenderTypeDepthBufferOnly=9;const int RenderTypeGeometryType=10;\n#include <packing>\nout vec4 outputColor;vec3 packNormalToRgb(const in vec3 normal){return normalize(normal)*0.5+0.5;}void updateFragmentColor(int renderMode,vec4 color,float treeIndex,vec3 normal,float depth,sampler2D matCapTexture,int geometryType){if(renderMode==RenderTypeColor||renderMode==RenderTypeEffects){\n#if defined(IS_TEXTURED)\nvec3 colorRGB=color.rgb;\n#else\nvec3 hsv=rgb2hsv(color.rgb);hsv.z=min(0.5*hsv.z+0.5,1.0);vec3 colorRGB=hsv2rgb(hsv);\n#endif\nfloat amplitude=max(0.0,dot(normal,vec3(0.0,0.0,1.0)));vec4 albedo=vec4(colorRGB*(0.4+0.6*amplitude),1.0);vec2 cap=normal.xy*0.5+0.5;vec4 mc=vec4(texture(matCapTexture,cap).rgb,1.0);outputColor=vec4(albedo.rgb*mc.rgb*1.7,color.a);}else if(renderMode==RenderTypeGhost){float amplitude=max(0.0,dot(normal,vec3(0.0,0.0,1.0)));float s=0.4+0.6*amplitude;outputColor=vec4(vec3(s),0.3);}else if(renderMode==RenderTypeDepthBufferOnly){outputColor=vec4(1.0,0.0,1.0,1.0);}else if(renderMode==RenderTypePackColorAndNormal){vec3 hsv=rgb2hsv(color.rgb);float a=0.0;if(hsv.y>0.01){if(hsv.z>0.5){a=(0.55+hsv.x*0.45);}else{a=(0.1+hsv.x*0.45);}}else{a=hsv.z*0.09;}outputColor=vec4(packNormalToRgb(normal.rgb),color.a);}else if(renderMode==RenderTypeNormal){outputColor=vec4(packNormalToRgb(normal),color.a);}else if(renderMode==RenderTypeTreeIndex){outputColor=vec4(packIntToColor(treeIndex),color.a);}else if(renderMode==RenderTypeDepth){outputColor=packDepthToRGBA(depth);}else if(renderMode==RenderTypeLOD){bool isHighDetail=geometryType!=GeometryType.Quad;vec2 cap=normal.xy*0.5+0.5;vec3 mc=texture(matCapTexture,cap).rgb*1.5;outputColor=isHighDetail ? vec4(vec3(0.0,1.0,0.0)*mc,color.a): vec4(vec3(1.0,1.0,0.0)*mc,color.a);}else if(renderMode==RenderTypeGeometryType){vec2 cap=normal.xy*0.5+0.5;vec3 mc=texture(matCapTexture,cap).rgb;vec3 geometryColor=float(geometryType==1)*vec3(1.0,0.0,0.0)+float(geometryType==2)*vec3(0.0,1.0,0.0)+float(geometryType==3)*vec3(0.0,0.0,1.0)+float(geometryType==4)*vec3(1.0,1.0,0.0);outputColor=vec4(geometryColor*mc,color.a);}else{outputColor=vec4(1.0,0.0,1.0,1.0);}}struct NodeAppearance{vec4 colorTexel;bool isVisible;bool renderInFront;bool renderGhosted;};float floatBitsSubset(float inNumber,int fromLeastSignificantBitIndex,int toMostSignificantBitIndex){float r=float(fromLeastSignificantBitIndex);float l=float(toMostSignificantBitIndex);float bitShift=pow(2.0,r);return mod(((inNumber-mod(inNumber,bitShift))/bitShift),pow(2.0,l - r));}NodeAppearance nodeAppearanceFromTexel(vec4 nodeAppearanceTexel){float alphaUnwrapped=floor((nodeAppearanceTexel.a*255.0)+0.5);bool isVisible=floatBitsSubset(alphaUnwrapped,0,1)==1.0;bool renderInFront=floatBitsSubset(alphaUnwrapped,1,2)==1.0;bool renderGhosted=floatBitsSubset(alphaUnwrapped,2,3)==1.0;return NodeAppearance(nodeAppearanceTexel,isVisible,renderInFront,renderGhosted);}NodeAppearance determineNodeAppearance(sampler2D nodeAppearanceTexture,vec2 textureSize,highp float treeIndex){highp int dataTextureWidth=int(textureSize.x);highp int dataTextureHeight=int(textureSize.y);highp int iTreeIndex=int(treeIndex);highp int xTreeIndexTextureCoord=iTreeIndex % dataTextureWidth;highp int yTreeIndexTextureCoord=iTreeIndex/dataTextureWidth;vec4 texel=texelFetch(nodeAppearanceTexture,ivec2(xTreeIndexTextureCoord,yTreeIndexTextureCoord),0);return nodeAppearanceFromTexel(texel);}vec4 determineColor(vec3 originalColor,NodeAppearance nodeAppearance){vec4 overrideColor=nodeAppearance.colorTexel;if(any(greaterThan(overrideColor.rgb,vec3(0.0)))){return overrideColor;}return vec4(originalColor.rgb,overrideColor.a);}\n#if NUM_CLIPPING_PLANES > 0\nuniform vec4 clippingPlanes[NUM_CLIPPING_PLANES];\n#endif\nbool isClipped(vec3 point){\n#if NUM_CLIPPING_PLANES > 0\nvec3 pointFlipped=-point;vec4 plane;for(int i=0;i<UNION_CLIPPING_PLANES;i++){plane=clippingPlanes[i];if(dot(pointFlipped,plane.xyz)>plane.w)return true;}\n#if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES\nbool clipped=true;for(int i=UNION_CLIPPING_PLANES;i<NUM_CLIPPING_PLANES;i++){plane=clippingPlanes[i];clipped=(dot(pointFlipped,plane.xyz)>plane.w)&&clipped;}if(clipped)return true;\n#endif\n#endif\nreturn false;}struct UnusedTreeIndexPacked{highp float thousands;highp float subThousands;};highp vec2 packTreeIndex(float treeIndex){highp float roundedTreeIndex=round(treeIndex);highp float treeIndexThousands=floor(roundedTreeIndex/1000.0);highp float treeIndexSubThousands=mod(roundedTreeIndex,1000.0);return vec2(treeIndexThousands,treeIndexSubThousands);}highp float unpackTreeIndex(highp vec2 treeIndexPacked){highp float treeIndex=round(treeIndexPacked.x)*1000.0+round(treeIndexPacked.y);return treeIndex;}uniform sampler2D matCapTexture;uniform lowp int renderMode;\n#if defined(IS_TEXTURED)\nuniform sampler2D tDiffuse;in vec2 v_uv;\n#else\nin vec3 v_color;\n#endif\nin vec3 v_viewPosition;in vec4 v_nodeAppearanceTexel;in highp vec2 v_treeIndexPacked;void main(){highp float v_treeIndex=unpackTreeIndex(v_treeIndexPacked);NodeAppearance appearance=nodeAppearanceFromTexel(v_nodeAppearanceTexel);if(isClipped(v_viewPosition)){discard;}\n#if defined(IS_TEXTURED)\nvec3 diffuseColor=texture(tDiffuse,v_uv).rgb;diffuseColor=LinearTosRGB(vec4(diffuseColor,1.0)).xyz;vec4 color=determineColor(diffuseColor,appearance);color=vec4(mix(diffuseColor,vec3(color),0.6),color.a);\n#else\nvec4 color=determineColor(v_color,appearance);\n#endif\nvec3 normal=derivateNormal(v_viewPosition);updateFragmentColor(renderMode,color,v_treeIndex,normal,gl_FragCoord.z,matCapTexture,GeometryType.TriangleMesh);}", on = "mat4 determineMatrixOverride(float treeIndex,vec2 treeIndexTextureSize,sampler2D transformOverrideIndexTexture,vec2 transformOverrideTextureSize,sampler2D transformOverrideTexture){float dataTextureWidth=treeIndexTextureSize.x;float dataTextureHeight=treeIndexTextureSize.y;int xTreeIndexTextureCoord=int(mod(treeIndex,dataTextureWidth));int yTreeIndexTextureCoord=int(floor(treeIndex/dataTextureWidth));float index=texelFetch(transformOverrideIndexTexture,ivec2(xTreeIndexTextureCoord,yTreeIndexTextureCoord),0).r;if(index==0.0){return mat4(1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0);}index-=1.0;float matrixElements[12];for(int i=0;i<12;i++){matrixElements[i]=texelFetch(transformOverrideTexture,ivec2(i+int(index)*16,0.0),0).r;}return mat4(matrixElements[0],matrixElements[4],matrixElements[8],0,matrixElements[1],matrixElements[5],matrixElements[9],0,matrixElements[2],matrixElements[6],matrixElements[10],0,matrixElements[3],matrixElements[7],matrixElements[11],1);}struct UnusedTreeIndexPacked{highp float thousands;highp float subThousands;};highp vec2 packTreeIndex(float treeIndex){highp float roundedTreeIndex=round(treeIndex);highp float treeIndexThousands=floor(roundedTreeIndex/1000.0);highp float treeIndexSubThousands=mod(roundedTreeIndex,1000.0);return vec2(treeIndexThousands,treeIndexSubThousands);}highp float unpackTreeIndex(highp vec2 treeIndexPacked){highp float treeIndex=round(treeIndexPacked.x)*1000.0+round(treeIndexPacked.y);return treeIndex;}const int RenderTypeColor=1;const int RenderTypeNormal=2;const int RenderTypeTreeIndex=3;const int RenderTypePackColorAndNormal=4;const int RenderTypeDepth=5;const int RenderTypeEffects=6;const int RenderTypeGhost=7;const int RenderTypeLOD=8;const int RenderTypeDepthBufferOnly=9;const int RenderTypeGeometryType=10;struct NodeAppearance{vec4 colorTexel;bool isVisible;bool renderInFront;bool renderGhosted;};float floatBitsSubset(float inNumber,int fromLeastSignificantBitIndex,int toMostSignificantBitIndex){float r=float(fromLeastSignificantBitIndex);float l=float(toMostSignificantBitIndex);float bitShift=pow(2.0,r);return mod(((inNumber-mod(inNumber,bitShift))/bitShift),pow(2.0,l - r));}NodeAppearance nodeAppearanceFromTexel(vec4 nodeAppearanceTexel){float alphaUnwrapped=floor((nodeAppearanceTexel.a*255.0)+0.5);bool isVisible=floatBitsSubset(alphaUnwrapped,0,1)==1.0;bool renderInFront=floatBitsSubset(alphaUnwrapped,1,2)==1.0;bool renderGhosted=floatBitsSubset(alphaUnwrapped,2,3)==1.0;return NodeAppearance(nodeAppearanceTexel,isVisible,renderInFront,renderGhosted);}NodeAppearance determineNodeAppearance(sampler2D nodeAppearanceTexture,vec2 textureSize,highp float treeIndex){highp int dataTextureWidth=int(textureSize.x);highp int dataTextureHeight=int(textureSize.y);highp int iTreeIndex=int(treeIndex);highp int xTreeIndexTextureCoord=iTreeIndex % dataTextureWidth;highp int yTreeIndexTextureCoord=iTreeIndex/dataTextureWidth;vec4 texel=texelFetch(nodeAppearanceTexture,ivec2(xTreeIndexTextureCoord,yTreeIndexTextureCoord),0);return nodeAppearanceFromTexel(texel);}bool determineVisibility(NodeAppearance nodeAppearance,int renderMode){bool visible=nodeAppearance.isVisible;bool ghost=(renderMode==RenderTypeGhost)&&nodeAppearance.renderGhosted;bool inFront=(renderMode==RenderTypeEffects)&&nodeAppearance.renderInFront;bool back=(renderMode==RenderTypeColor)&&!nodeAppearance.renderGhosted&&!nodeAppearance.renderInFront;bool other=(renderMode!=RenderTypeColor&&renderMode!=RenderTypeEffects&&renderMode!=RenderTypeGhost)&&!nodeAppearance.renderGhosted;return visible&&(ghost||inFront||back||other);}uniform mat4 modelViewMatrix;uniform mat4 projectionMatrix;uniform vec2 treeIndexTextureSize;uniform vec2 transformOverrideTextureSize;uniform sampler2D transformOverrideIndexTexture;uniform sampler2D transformOverrideTexture;uniform sampler2D colorDataTexture;uniform lowp int renderMode;\n#if defined(IS_TEXTURED)\nin vec2 uv;\n#else\nin vec3 color;\n#endif\nin vec3 position;in float treeIndex;out vec3 v_viewPosition;out vec4 v_nodeAppearanceTexel;\n#if defined(IS_TEXTURED)\nout vec2 v_uv;\n#else\nout vec3 v_color;\n#endif\nout highp vec2 v_treeIndexPacked;void main(){NodeAppearance appearance=determineNodeAppearance(colorDataTexture,treeIndexTextureSize,treeIndex);if(!determineVisibility(appearance,renderMode)){gl_Position=vec4(2.0,2.0,2.0,1.0);return;}v_nodeAppearanceTexel=appearance.colorTexel;v_treeIndexPacked=packTreeIndex(treeIndex);mat4 treeIndexWorldTransform=determineMatrixOverride(treeIndex,treeIndexTextureSize,transformOverrideIndexTexture,transformOverrideTextureSize,transformOverrideTexture);vec4 modelViewPosition=modelViewMatrix*treeIndexWorldTransform*vec4(position,1.0);v_viewPosition=modelViewPosition.xyz;\n#if defined(IS_TEXTURED)\nv_uv=uv;\n#else\nv_color=color;\n#endif\ngl_Position=projectionMatrix*modelViewPosition;}", sn = "precision highp float;vec3 derivateNormal(vec3 v_viewPosition){vec3 fdx=vec3(dFdx(v_viewPosition.x),dFdx(v_viewPosition.y),dFdx(v_viewPosition.z));vec3 fdy=vec3(dFdy(v_viewPosition.x),dFdy(v_viewPosition.y),dFdy(v_viewPosition.z));vec3 normal=normalize(cross(fdx,fdy));return normal;}vec3 rgb2hsv(vec3 c){vec4 K=vec4(0.0,-1.0/3.0,2.0/3.0,-1.0);vec4 p=mix(vec4(c.bg,K.wz),vec4(c.gb,K.xy),step(c.b,c.g));vec4 q=mix(vec4(p.xyw,c.r),vec4(c.r,p.yzx),step(p.x,c.r));float d=q.x-min(q.w,q.y);float e=1.0e-10;return vec3(abs(q.z+(q.w-q.y)/(6.0*d+e)),d/(q.x+e),q.x);}vec3 hsv2rgb(vec3 c){vec4 K=vec4(1.0,2.0/3.0,1.0/3.0,3.0);vec3 p=abs(fract(c.xxx+K.xyz)*6.0-K.www);return c.z*mix(K.xxx,clamp(p-K.xxx,0.0,1.0),c.y);}vec3 packIntToColor(float number){float r=floor(number/(255.0*255.0))/255.0;float g=mod(floor(number/255.0),255.0)/255.0;float b=mod(number,255.0)/255.0;return vec3(r,g,b);}struct GeometryTypeEnum{int Quad;int Primitive;int TriangleMesh;int InstancedMesh;};const GeometryTypeEnum GeometryType=GeometryTypeEnum(1,2,3,4);const int RenderTypeColor=1;const int RenderTypeNormal=2;const int RenderTypeTreeIndex=3;const int RenderTypePackColorAndNormal=4;const int RenderTypeDepth=5;const int RenderTypeEffects=6;const int RenderTypeGhost=7;const int RenderTypeLOD=8;const int RenderTypeDepthBufferOnly=9;const int RenderTypeGeometryType=10;\n#include <packing>\nout vec4 outputColor;vec3 packNormalToRgb(const in vec3 normal){return normalize(normal)*0.5+0.5;}void updateFragmentColor(int renderMode,vec4 color,float treeIndex,vec3 normal,float depth,sampler2D matCapTexture,int geometryType){if(renderMode==RenderTypeColor||renderMode==RenderTypeEffects){\n#if defined(IS_TEXTURED)\nvec3 colorRGB=color.rgb;\n#else\nvec3 hsv=rgb2hsv(color.rgb);hsv.z=min(0.5*hsv.z+0.5,1.0);vec3 colorRGB=hsv2rgb(hsv);\n#endif\nfloat amplitude=max(0.0,dot(normal,vec3(0.0,0.0,1.0)));vec4 albedo=vec4(colorRGB*(0.4+0.6*amplitude),1.0);vec2 cap=normal.xy*0.5+0.5;vec4 mc=vec4(texture(matCapTexture,cap).rgb,1.0);outputColor=vec4(albedo.rgb*mc.rgb*1.7,color.a);}else if(renderMode==RenderTypeGhost){float amplitude=max(0.0,dot(normal,vec3(0.0,0.0,1.0)));float s=0.4+0.6*amplitude;outputColor=vec4(vec3(s),0.3);}else if(renderMode==RenderTypeDepthBufferOnly){outputColor=vec4(1.0,0.0,1.0,1.0);}else if(renderMode==RenderTypePackColorAndNormal){vec3 hsv=rgb2hsv(color.rgb);float a=0.0;if(hsv.y>0.01){if(hsv.z>0.5){a=(0.55+hsv.x*0.45);}else{a=(0.1+hsv.x*0.45);}}else{a=hsv.z*0.09;}outputColor=vec4(packNormalToRgb(normal.rgb),color.a);}else if(renderMode==RenderTypeNormal){outputColor=vec4(packNormalToRgb(normal),color.a);}else if(renderMode==RenderTypeTreeIndex){outputColor=vec4(packIntToColor(treeIndex),color.a);}else if(renderMode==RenderTypeDepth){outputColor=packDepthToRGBA(depth);}else if(renderMode==RenderTypeLOD){bool isHighDetail=geometryType!=GeometryType.Quad;vec2 cap=normal.xy*0.5+0.5;vec3 mc=texture(matCapTexture,cap).rgb*1.5;outputColor=isHighDetail ? vec4(vec3(0.0,1.0,0.0)*mc,color.a): vec4(vec3(1.0,1.0,0.0)*mc,color.a);}else if(renderMode==RenderTypeGeometryType){vec2 cap=normal.xy*0.5+0.5;vec3 mc=texture(matCapTexture,cap).rgb;vec3 geometryColor=float(geometryType==1)*vec3(1.0,0.0,0.0)+float(geometryType==2)*vec3(0.0,1.0,0.0)+float(geometryType==3)*vec3(0.0,0.0,1.0)+float(geometryType==4)*vec3(1.0,1.0,0.0);outputColor=vec4(geometryColor*mc,color.a);}else{outputColor=vec4(1.0,0.0,1.0,1.0);}}struct NodeAppearance{vec4 colorTexel;bool isVisible;bool renderInFront;bool renderGhosted;};float floatBitsSubset(float inNumber,int fromLeastSignificantBitIndex,int toMostSignificantBitIndex){float r=float(fromLeastSignificantBitIndex);float l=float(toMostSignificantBitIndex);float bitShift=pow(2.0,r);return mod(((inNumber-mod(inNumber,bitShift))/bitShift),pow(2.0,l - r));}NodeAppearance nodeAppearanceFromTexel(vec4 nodeAppearanceTexel){float alphaUnwrapped=floor((nodeAppearanceTexel.a*255.0)+0.5);bool isVisible=floatBitsSubset(alphaUnwrapped,0,1)==1.0;bool renderInFront=floatBitsSubset(alphaUnwrapped,1,2)==1.0;bool renderGhosted=floatBitsSubset(alphaUnwrapped,2,3)==1.0;return NodeAppearance(nodeAppearanceTexel,isVisible,renderInFront,renderGhosted);}NodeAppearance determineNodeAppearance(sampler2D nodeAppearanceTexture,vec2 textureSize,highp float treeIndex){highp int dataTextureWidth=int(textureSize.x);highp int dataTextureHeight=int(textureSize.y);highp int iTreeIndex=int(treeIndex);highp int xTreeIndexTextureCoord=iTreeIndex % dataTextureWidth;highp int yTreeIndexTextureCoord=iTreeIndex/dataTextureWidth;vec4 texel=texelFetch(nodeAppearanceTexture,ivec2(xTreeIndexTextureCoord,yTreeIndexTextureCoord),0);return nodeAppearanceFromTexel(texel);}vec4 determineColor(vec3 originalColor,NodeAppearance nodeAppearance){vec4 overrideColor=nodeAppearance.colorTexel;if(any(greaterThan(overrideColor.rgb,vec3(0.0)))){return overrideColor;}return vec4(originalColor.rgb,overrideColor.a);}\n#if NUM_CLIPPING_PLANES > 0\nuniform vec4 clippingPlanes[NUM_CLIPPING_PLANES];\n#endif\nbool isClipped(vec3 point){\n#if NUM_CLIPPING_PLANES > 0\nvec3 pointFlipped=-point;vec4 plane;for(int i=0;i<UNION_CLIPPING_PLANES;i++){plane=clippingPlanes[i];if(dot(pointFlipped,plane.xyz)>plane.w)return true;}\n#if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES\nbool clipped=true;for(int i=UNION_CLIPPING_PLANES;i<NUM_CLIPPING_PLANES;i++){plane=clippingPlanes[i];clipped=(dot(pointFlipped,plane.xyz)>plane.w)&&clipped;}if(clipped)return true;\n#endif\n#endif\nreturn false;}struct UnusedTreeIndexPacked{highp float thousands;highp float subThousands;};highp vec2 packTreeIndex(float treeIndex){highp float roundedTreeIndex=round(treeIndex);highp float treeIndexThousands=floor(roundedTreeIndex/1000.0);highp float treeIndexSubThousands=mod(roundedTreeIndex,1000.0);return vec2(treeIndexThousands,treeIndexSubThousands);}highp float unpackTreeIndex(highp vec2 treeIndexPacked){highp float treeIndex=round(treeIndexPacked.x)*1000.0+round(treeIndexPacked.y);return treeIndex;}uniform sampler2D matCapTexture;uniform lowp int renderMode;in vec3 v_color;in vec3 v_viewPosition;in vec4 v_nodeAppearanceTexel;in highp vec2 v_treeIndexPacked;void main(){highp float treeIndex=unpackTreeIndex(v_treeIndexPacked);NodeAppearance appearance=nodeAppearanceFromTexel(v_nodeAppearanceTexel);if(isClipped(v_viewPosition)){discard;}vec4 color=determineColor(v_color,appearance);vec3 normal=derivateNormal(v_viewPosition);updateFragmentColor(renderMode,color,treeIndex,normal,gl_FragCoord.z,matCapTexture,GeometryType.InstancedMesh);}", cn = "mat4 determineMatrixOverride(float treeIndex,vec2 treeIndexTextureSize,sampler2D transformOverrideIndexTexture,vec2 transformOverrideTextureSize,sampler2D transformOverrideTexture){float dataTextureWidth=treeIndexTextureSize.x;float dataTextureHeight=treeIndexTextureSize.y;int xTreeIndexTextureCoord=int(mod(treeIndex,dataTextureWidth));int yTreeIndexTextureCoord=int(floor(treeIndex/dataTextureWidth));float index=texelFetch(transformOverrideIndexTexture,ivec2(xTreeIndexTextureCoord,yTreeIndexTextureCoord),0).r;if(index==0.0){return mat4(1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0);}index-=1.0;float matrixElements[12];for(int i=0;i<12;i++){matrixElements[i]=texelFetch(transformOverrideTexture,ivec2(i+int(index)*16,0.0),0).r;}return mat4(matrixElements[0],matrixElements[4],matrixElements[8],0,matrixElements[1],matrixElements[5],matrixElements[9],0,matrixElements[2],matrixElements[6],matrixElements[10],0,matrixElements[3],matrixElements[7],matrixElements[11],1);}struct UnusedTreeIndexPacked{highp float thousands;highp float subThousands;};highp vec2 packTreeIndex(float treeIndex){highp float roundedTreeIndex=round(treeIndex);highp float treeIndexThousands=floor(roundedTreeIndex/1000.0);highp float treeIndexSubThousands=mod(roundedTreeIndex,1000.0);return vec2(treeIndexThousands,treeIndexSubThousands);}highp float unpackTreeIndex(highp vec2 treeIndexPacked){highp float treeIndex=round(treeIndexPacked.x)*1000.0+round(treeIndexPacked.y);return treeIndex;}const int RenderTypeColor=1;const int RenderTypeNormal=2;const int RenderTypeTreeIndex=3;const int RenderTypePackColorAndNormal=4;const int RenderTypeDepth=5;const int RenderTypeEffects=6;const int RenderTypeGhost=7;const int RenderTypeLOD=8;const int RenderTypeDepthBufferOnly=9;const int RenderTypeGeometryType=10;struct NodeAppearance{vec4 colorTexel;bool isVisible;bool renderInFront;bool renderGhosted;};float floatBitsSubset(float inNumber,int fromLeastSignificantBitIndex,int toMostSignificantBitIndex){float r=float(fromLeastSignificantBitIndex);float l=float(toMostSignificantBitIndex);float bitShift=pow(2.0,r);return mod(((inNumber-mod(inNumber,bitShift))/bitShift),pow(2.0,l - r));}NodeAppearance nodeAppearanceFromTexel(vec4 nodeAppearanceTexel){float alphaUnwrapped=floor((nodeAppearanceTexel.a*255.0)+0.5);bool isVisible=floatBitsSubset(alphaUnwrapped,0,1)==1.0;bool renderInFront=floatBitsSubset(alphaUnwrapped,1,2)==1.0;bool renderGhosted=floatBitsSubset(alphaUnwrapped,2,3)==1.0;return NodeAppearance(nodeAppearanceTexel,isVisible,renderInFront,renderGhosted);}NodeAppearance determineNodeAppearance(sampler2D nodeAppearanceTexture,vec2 textureSize,highp float treeIndex){highp int dataTextureWidth=int(textureSize.x);highp int dataTextureHeight=int(textureSize.y);highp int iTreeIndex=int(treeIndex);highp int xTreeIndexTextureCoord=iTreeIndex % dataTextureWidth;highp int yTreeIndexTextureCoord=iTreeIndex/dataTextureWidth;vec4 texel=texelFetch(nodeAppearanceTexture,ivec2(xTreeIndexTextureCoord,yTreeIndexTextureCoord),0);return nodeAppearanceFromTexel(texel);}bool determineVisibility(NodeAppearance nodeAppearance,int renderMode){bool visible=nodeAppearance.isVisible;bool ghost=(renderMode==RenderTypeGhost)&&nodeAppearance.renderGhosted;bool inFront=(renderMode==RenderTypeEffects)&&nodeAppearance.renderInFront;bool back=(renderMode==RenderTypeColor)&&!nodeAppearance.renderGhosted&&!nodeAppearance.renderInFront;bool other=(renderMode!=RenderTypeColor&&renderMode!=RenderTypeEffects&&renderMode!=RenderTypeGhost)&&!nodeAppearance.renderGhosted;return visible&&(ghost||inFront||back||other);}uniform mat4 modelViewMatrix;uniform mat4 projectionMatrix;uniform vec2 treeIndexTextureSize;uniform vec2 transformOverrideTextureSize;uniform sampler2D transformOverrideIndexTexture;uniform sampler2D transformOverrideTexture;uniform sampler2D colorDataTexture;uniform lowp int renderMode;in vec3 position;in mat4 a_instanceMatrix;in float a_treeIndex;in vec3 a_color;out vec3 v_color;out vec3 v_viewPosition;out highp vec2 v_treeIndexPacked;out vec4 v_nodeAppearanceTexel;void main(){NodeAppearance appearance=determineNodeAppearance(colorDataTexture,treeIndexTextureSize,a_treeIndex);if(!determineVisibility(appearance,renderMode)){gl_Position=vec4(2.0,2.0,2.0,1.0);return;}v_nodeAppearanceTexel=appearance.colorTexel;v_treeIndexPacked=packTreeIndex(a_treeIndex);mat4 treeIndexWorldTransform=determineMatrixOverride(a_treeIndex,treeIndexTextureSize,transformOverrideIndexTexture,transformOverrideTextureSize,transformOverrideTexture);v_color=a_color;vec3 transformed=(a_instanceMatrix*vec4(position,1.0)).xyz;vec4 modelViewPosition=modelViewMatrix*treeIndexWorldTransform*vec4(transformed,1.0);v_viewPosition=modelViewPosition.xyz;gl_Position=projectionMatrix*modelViewPosition;}", ln = "precision highp float;vec3 rgb2hsv(vec3 c){vec4 K=vec4(0.0,-1.0/3.0,2.0/3.0,-1.0);vec4 p=mix(vec4(c.bg,K.wz),vec4(c.gb,K.xy),step(c.b,c.g));vec4 q=mix(vec4(p.xyw,c.r),vec4(c.r,p.yzx),step(p.x,c.r));float d=q.x-min(q.w,q.y);float e=1.0e-10;return vec3(abs(q.z+(q.w-q.y)/(6.0*d+e)),d/(q.x+e),q.x);}vec3 hsv2rgb(vec3 c){vec4 K=vec4(1.0,2.0/3.0,1.0/3.0,3.0);vec3 p=abs(fract(c.xxx+K.xyz)*6.0-K.www);return c.z*mix(K.xxx,clamp(p-K.xxx,0.0,1.0),c.y);}vec3 packIntToColor(float number){float r=floor(number/(255.0*255.0))/255.0;float g=mod(floor(number/255.0),255.0)/255.0;float b=mod(number,255.0)/255.0;return vec3(r,g,b);}struct GeometryTypeEnum{int Quad;int Primitive;int TriangleMesh;int InstancedMesh;};const GeometryTypeEnum GeometryType=GeometryTypeEnum(1,2,3,4);const int RenderTypeColor=1;const int RenderTypeNormal=2;const int RenderTypeTreeIndex=3;const int RenderTypePackColorAndNormal=4;const int RenderTypeDepth=5;const int RenderTypeEffects=6;const int RenderTypeGhost=7;const int RenderTypeLOD=8;const int RenderTypeDepthBufferOnly=9;const int RenderTypeGeometryType=10;\n#include <packing>\nout vec4 outputColor;vec3 packNormalToRgb(const in vec3 normal){return normalize(normal)*0.5+0.5;}void updateFragmentColor(int renderMode,vec4 color,float treeIndex,vec3 normal,float depth,sampler2D matCapTexture,int geometryType){if(renderMode==RenderTypeColor||renderMode==RenderTypeEffects){\n#if defined(IS_TEXTURED)\nvec3 colorRGB=color.rgb;\n#else\nvec3 hsv=rgb2hsv(color.rgb);hsv.z=min(0.5*hsv.z+0.5,1.0);vec3 colorRGB=hsv2rgb(hsv);\n#endif\nfloat amplitude=max(0.0,dot(normal,vec3(0.0,0.0,1.0)));vec4 albedo=vec4(colorRGB*(0.4+0.6*amplitude),1.0);vec2 cap=normal.xy*0.5+0.5;vec4 mc=vec4(texture(matCapTexture,cap).rgb,1.0);outputColor=vec4(albedo.rgb*mc.rgb*1.7,color.a);}else if(renderMode==RenderTypeGhost){float amplitude=max(0.0,dot(normal,vec3(0.0,0.0,1.0)));float s=0.4+0.6*amplitude;outputColor=vec4(vec3(s),0.3);}else if(renderMode==RenderTypeDepthBufferOnly){outputColor=vec4(1.0,0.0,1.0,1.0);}else if(renderMode==RenderTypePackColorAndNormal){vec3 hsv=rgb2hsv(color.rgb);float a=0.0;if(hsv.y>0.01){if(hsv.z>0.5){a=(0.55+hsv.x*0.45);}else{a=(0.1+hsv.x*0.45);}}else{a=hsv.z*0.09;}outputColor=vec4(packNormalToRgb(normal.rgb),color.a);}else if(renderMode==RenderTypeNormal){outputColor=vec4(packNormalToRgb(normal),color.a);}else if(renderMode==RenderTypeTreeIndex){outputColor=vec4(packIntToColor(treeIndex),color.a);}else if(renderMode==RenderTypeDepth){outputColor=packDepthToRGBA(depth);}else if(renderMode==RenderTypeLOD){bool isHighDetail=geometryType!=GeometryType.Quad;vec2 cap=normal.xy*0.5+0.5;vec3 mc=texture(matCapTexture,cap).rgb*1.5;outputColor=isHighDetail ? vec4(vec3(0.0,1.0,0.0)*mc,color.a): vec4(vec3(1.0,1.0,0.0)*mc,color.a);}else if(renderMode==RenderTypeGeometryType){vec2 cap=normal.xy*0.5+0.5;vec3 mc=texture(matCapTexture,cap).rgb;vec3 geometryColor=float(geometryType==1)*vec3(1.0,0.0,0.0)+float(geometryType==2)*vec3(0.0,1.0,0.0)+float(geometryType==3)*vec3(0.0,0.0,1.0)+float(geometryType==4)*vec3(1.0,1.0,0.0);outputColor=vec4(geometryColor*mc,color.a);}else{outputColor=vec4(1.0,0.0,1.0,1.0);}}struct NodeAppearance{vec4 colorTexel;bool isVisible;bool renderInFront;bool renderGhosted;};float floatBitsSubset(float inNumber,int fromLeastSignificantBitIndex,int toMostSignificantBitIndex){float r=float(fromLeastSignificantBitIndex);float l=float(toMostSignificantBitIndex);float bitShift=pow(2.0,r);return mod(((inNumber-mod(inNumber,bitShift))/bitShift),pow(2.0,l - r));}NodeAppearance nodeAppearanceFromTexel(vec4 nodeAppearanceTexel){float alphaUnwrapped=floor((nodeAppearanceTexel.a*255.0)+0.5);bool isVisible=floatBitsSubset(alphaUnwrapped,0,1)==1.0;bool renderInFront=floatBitsSubset(alphaUnwrapped,1,2)==1.0;bool renderGhosted=floatBitsSubset(alphaUnwrapped,2,3)==1.0;return NodeAppearance(nodeAppearanceTexel,isVisible,renderInFront,renderGhosted);}NodeAppearance determineNodeAppearance(sampler2D nodeAppearanceTexture,vec2 textureSize,highp float treeIndex){highp int dataTextureWidth=int(textureSize.x);highp int dataTextureHeight=int(textureSize.y);highp int iTreeIndex=int(treeIndex);highp int xTreeIndexTextureCoord=iTreeIndex % dataTextureWidth;highp int yTreeIndexTextureCoord=iTreeIndex/dataTextureWidth;vec4 texel=texelFetch(nodeAppearanceTexture,ivec2(xTreeIndexTextureCoord,yTreeIndexTextureCoord),0);return nodeAppearanceFromTexel(texel);}vec4 determineColor(vec3 originalColor,NodeAppearance nodeAppearance){vec4 overrideColor=nodeAppearance.colorTexel;if(any(greaterThan(overrideColor.rgb,vec3(0.0)))){return overrideColor;}return vec4(originalColor.rgb,overrideColor.a);}\n#if NUM_CLIPPING_PLANES > 0\nuniform vec4 clippingPlanes[NUM_CLIPPING_PLANES];\n#endif\nbool isClipped(vec3 point){\n#if NUM_CLIPPING_PLANES > 0\nvec3 pointFlipped=-point;vec4 plane;for(int i=0;i<UNION_CLIPPING_PLANES;i++){plane=clippingPlanes[i];if(dot(pointFlipped,plane.xyz)>plane.w)return true;}\n#if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES\nbool clipped=true;for(int i=UNION_CLIPPING_PLANES;i<NUM_CLIPPING_PLANES;i++){plane=clippingPlanes[i];clipped=(dot(pointFlipped,plane.xyz)>plane.w)&&clipped;}if(clipped)return true;\n#endif\n#endif\nreturn false;}struct UnusedTreeIndexPacked{highp float thousands;highp float subThousands;};highp vec2 packTreeIndex(float treeIndex){highp float roundedTreeIndex=round(treeIndex);highp float treeIndexThousands=floor(roundedTreeIndex/1000.0);highp float treeIndexSubThousands=mod(roundedTreeIndex,1000.0);return vec2(treeIndexThousands,treeIndexSubThousands);}highp float unpackTreeIndex(highp vec2 treeIndexPacked){highp float treeIndex=round(treeIndexPacked.x)*1000.0+round(treeIndexPacked.y);return treeIndex;}uniform sampler2D matCapTexture;uniform lowp int renderMode;in vec2 v_xy;in vec3 v_color;in vec3 v_normal;in vec3 vViewPosition;in vec4 v_nodeAppearanceTexel;in highp vec2 v_treeIndexPacked;void main(){highp float v_treeIndex=unpackTreeIndex(v_treeIndexPacked);float dist=dot(v_xy,v_xy);vec3 normal=normalize(v_normal);if(dist>0.25)discard;NodeAppearance appearance=nodeAppearanceFromTexel(v_nodeAppearanceTexel);if(isClipped(vViewPosition)){discard;}vec4 color=determineColor(v_color,appearance);updateFragmentColor(renderMode,color,v_treeIndex,normal,gl_FragCoord.z,matCapTexture,GeometryType.Primitive);}", un = "mat4 determineMatrixOverride(float treeIndex,vec2 treeIndexTextureSize,sampler2D transformOverrideIndexTexture,vec2 transformOverrideTextureSize,sampler2D transformOverrideTexture){float dataTextureWidth=treeIndexTextureSize.x;float dataTextureHeight=treeIndexTextureSize.y;int xTreeIndexTextureCoord=int(mod(treeIndex,dataTextureWidth));int yTreeIndexTextureCoord=int(floor(treeIndex/dataTextureWidth));float index=texelFetch(transformOverrideIndexTexture,ivec2(xTreeIndexTextureCoord,yTreeIndexTextureCoord),0).r;if(index==0.0){return mat4(1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0);}index-=1.0;float matrixElements[12];for(int i=0;i<12;i++){matrixElements[i]=texelFetch(transformOverrideTexture,ivec2(i+int(index)*16,0.0),0).r;}return mat4(matrixElements[0],matrixElements[4],matrixElements[8],0,matrixElements[1],matrixElements[5],matrixElements[9],0,matrixElements[2],matrixElements[6],matrixElements[10],0,matrixElements[3],matrixElements[7],matrixElements[11],1);}struct UnusedTreeIndexPacked{highp float thousands;highp float subThousands;};highp vec2 packTreeIndex(float treeIndex){highp float roundedTreeIndex=round(treeIndex);highp float treeIndexThousands=floor(roundedTreeIndex/1000.0);highp float treeIndexSubThousands=mod(roundedTreeIndex,1000.0);return vec2(treeIndexThousands,treeIndexSubThousands);}highp float unpackTreeIndex(highp vec2 treeIndexPacked){highp float treeIndex=round(treeIndexPacked.x)*1000.0+round(treeIndexPacked.y);return treeIndex;}const int RenderTypeColor=1;const int RenderTypeNormal=2;const int RenderTypeTreeIndex=3;const int RenderTypePackColorAndNormal=4;const int RenderTypeDepth=5;const int RenderTypeEffects=6;const int RenderTypeGhost=7;const int RenderTypeLOD=8;const int RenderTypeDepthBufferOnly=9;const int RenderTypeGeometryType=10;struct NodeAppearance{vec4 colorTexel;bool isVisible;bool renderInFront;bool renderGhosted;};float floatBitsSubset(float inNumber,int fromLeastSignificantBitIndex,int toMostSignificantBitIndex){float r=float(fromLeastSignificantBitIndex);float l=float(toMostSignificantBitIndex);float bitShift=pow(2.0,r);return mod(((inNumber-mod(inNumber,bitShift))/bitShift),pow(2.0,l - r));}NodeAppearance nodeAppearanceFromTexel(vec4 nodeAppearanceTexel){float alphaUnwrapped=floor((nodeAppearanceTexel.a*255.0)+0.5);bool isVisible=floatBitsSubset(alphaUnwrapped,0,1)==1.0;bool renderInFront=floatBitsSubset(alphaUnwrapped,1,2)==1.0;bool renderGhosted=floatBitsSubset(alphaUnwrapped,2,3)==1.0;return NodeAppearance(nodeAppearanceTexel,isVisible,renderInFront,renderGhosted);}NodeAppearance determineNodeAppearance(sampler2D nodeAppearanceTexture,vec2 textureSize,highp float treeIndex){highp int dataTextureWidth=int(textureSize.x);highp int dataTextureHeight=int(textureSize.y);highp int iTreeIndex=int(treeIndex);highp int xTreeIndexTextureCoord=iTreeIndex % dataTextureWidth;highp int yTreeIndexTextureCoord=iTreeIndex/dataTextureWidth;vec4 texel=texelFetch(nodeAppearanceTexture,ivec2(xTreeIndexTextureCoord,yTreeIndexTextureCoord),0);return nodeAppearanceFromTexel(texel);}bool determineVisibility(NodeAppearance nodeAppearance,int renderMode){bool visible=nodeAppearance.isVisible;bool ghost=(renderMode==RenderTypeGhost)&&nodeAppearance.renderGhosted;bool inFront=(renderMode==RenderTypeEffects)&&nodeAppearance.renderInFront;bool back=(renderMode==RenderTypeColor)&&!nodeAppearance.renderGhosted&&!nodeAppearance.renderInFront;bool other=(renderMode!=RenderTypeColor&&renderMode!=RenderTypeEffects&&renderMode!=RenderTypeGhost)&&!nodeAppearance.renderGhosted;return visible&&(ghost||inFront||back||other);}uniform mat4 modelViewMatrix;uniform mat4 projectionMatrix;uniform mat3 normalMatrix;uniform vec2 treeIndexTextureSize;uniform vec2 transformOverrideTextureSize;uniform sampler2D transformOverrideIndexTexture;uniform sampler2D transformOverrideTexture;uniform sampler2D colorDataTexture;uniform lowp int renderMode;in vec3 position;in mat4 a_instanceMatrix;in float a_treeIndex;in vec3 a_color;in vec3 a_normal;out vec2 v_xy;out vec3 v_color;out vec3 v_normal;out vec3 vViewPosition;out vec4 v_nodeAppearanceTexel;out highp vec2 v_treeIndexPacked;void main(){NodeAppearance appearance=determineNodeAppearance(colorDataTexture,treeIndexTextureSize,a_treeIndex);if(!determineVisibility(appearance,renderMode)){gl_Position=vec4(2.0,2.0,2.0,1.0);return;}v_nodeAppearanceTexel=appearance.colorTexel;v_treeIndexPacked=packTreeIndex(a_treeIndex);v_xy=vec2(position.x,position.y);mat4 treeIndexWorldTransform=determineMatrixOverride(a_treeIndex,treeIndexTextureSize,transformOverrideIndexTexture,transformOverrideTextureSize,transformOverrideTexture);vec3 transformed=(a_instanceMatrix*vec4(position,1.0)).xyz;vec4 mvPosition=modelViewMatrix*treeIndexWorldTransform*vec4(transformed,1.0);v_color=a_color;v_normal=normalMatrix*normalize(treeIndexWorldTransform*vec4(normalize(a_normal),0.0)).xyz;vViewPosition=mvPosition.xyz;gl_Position=projectionMatrix*mvPosition;}", dn = "precision highp float;struct NodeAppearance{vec4 colorTexel;bool isVisible;bool renderInFront;bool renderGhosted;};vec3 rgb2hsv(vec3 c){vec4 K=vec4(0.0,-1.0/3.0,2.0/3.0,-1.0);vec4 p=mix(vec4(c.bg,K.wz),vec4(c.gb,K.xy),step(c.b,c.g));vec4 q=mix(vec4(p.xyw,c.r),vec4(c.r,p.yzx),step(p.x,c.r));float d=q.x-min(q.w,q.y);float e=1.0e-10;return vec3(abs(q.z+(q.w-q.y)/(6.0*d+e)),d/(q.x+e),q.x);}vec3 hsv2rgb(vec3 c){vec4 K=vec4(1.0,2.0/3.0,1.0/3.0,3.0);vec3 p=abs(fract(c.xxx+K.xyz)*6.0-K.www);return c.z*mix(K.xxx,clamp(p-K.xxx,0.0,1.0),c.y);}vec3 packIntToColor(float number){float r=floor(number/(255.0*255.0))/255.0;float g=mod(floor(number/255.0),255.0)/255.0;float b=mod(number,255.0)/255.0;return vec3(r,g,b);}struct GeometryTypeEnum{int Quad;int Primitive;int TriangleMesh;int InstancedMesh;};const GeometryTypeEnum GeometryType=GeometryTypeEnum(1,2,3,4);const int RenderTypeColor=1;const int RenderTypeNormal=2;const int RenderTypeTreeIndex=3;const int RenderTypePackColorAndNormal=4;const int RenderTypeDepth=5;const int RenderTypeEffects=6;const int RenderTypeGhost=7;const int RenderTypeLOD=8;const int RenderTypeDepthBufferOnly=9;const int RenderTypeGeometryType=10;\n#include <packing>\nout vec4 outputColor;vec3 packNormalToRgb(const in vec3 normal){return normalize(normal)*0.5+0.5;}void updateFragmentColor(int renderMode,vec4 color,float treeIndex,vec3 normal,float depth,sampler2D matCapTexture,int geometryType){if(renderMode==RenderTypeColor||renderMode==RenderTypeEffects){\n#if defined(IS_TEXTURED)\nvec3 colorRGB=color.rgb;\n#else\nvec3 hsv=rgb2hsv(color.rgb);hsv.z=min(0.5*hsv.z+0.5,1.0);vec3 colorRGB=hsv2rgb(hsv);\n#endif\nfloat amplitude=max(0.0,dot(normal,vec3(0.0,0.0,1.0)));vec4 albedo=vec4(colorRGB*(0.4+0.6*amplitude),1.0);vec2 cap=normal.xy*0.5+0.5;vec4 mc=vec4(texture(matCapTexture,cap).rgb,1.0);outputColor=vec4(albedo.rgb*mc.rgb*1.7,color.a);}else if(renderMode==RenderTypeGhost){float amplitude=max(0.0,dot(normal,vec3(0.0,0.0,1.0)));float s=0.4+0.6*amplitude;outputColor=vec4(vec3(s),0.3);}else if(renderMode==RenderTypeDepthBufferOnly){outputColor=vec4(1.0,0.0,1.0,1.0);}else if(renderMode==RenderTypePackColorAndNormal){vec3 hsv=rgb2hsv(color.rgb);float a=0.0;if(hsv.y>0.01){if(hsv.z>0.5){a=(0.55+hsv.x*0.45);}else{a=(0.1+hsv.x*0.45);}}else{a=hsv.z*0.09;}outputColor=vec4(packNormalToRgb(normal.rgb),color.a);}else if(renderMode==RenderTypeNormal){outputColor=vec4(packNormalToRgb(normal),color.a);}else if(renderMode==RenderTypeTreeIndex){outputColor=vec4(packIntToColor(treeIndex),color.a);}else if(renderMode==RenderTypeDepth){outputColor=packDepthToRGBA(depth);}else if(renderMode==RenderTypeLOD){bool isHighDetail=geometryType!=GeometryType.Quad;vec2 cap=normal.xy*0.5+0.5;vec3 mc=texture(matCapTexture,cap).rgb*1.5;outputColor=isHighDetail ? vec4(vec3(0.0,1.0,0.0)*mc,color.a): vec4(vec3(1.0,1.0,0.0)*mc,color.a);}else if(renderMode==RenderTypeGeometryType){vec2 cap=normal.xy*0.5+0.5;vec3 mc=texture(matCapTexture,cap).rgb;vec3 geometryColor=float(geometryType==1)*vec3(1.0,0.0,0.0)+float(geometryType==2)*vec3(0.0,1.0,0.0)+float(geometryType==3)*vec3(0.0,0.0,1.0)+float(geometryType==4)*vec3(1.0,1.0,0.0);outputColor=vec4(geometryColor*mc,color.a);}else{outputColor=vec4(1.0,0.0,1.0,1.0);}}float floatBitsSubset(float inNumber,int fromLeastSignificantBitIndex,int toMostSignificantBitIndex){float r=float(fromLeastSignificantBitIndex);float l=float(toMostSignificantBitIndex);float bitShift=pow(2.0,r);return mod(((inNumber-mod(inNumber,bitShift))/bitShift),pow(2.0,l - r));}NodeAppearance nodeAppearanceFromTexel(vec4 nodeAppearanceTexel){float alphaUnwrapped=floor((nodeAppearanceTexel.a*255.0)+0.5);bool isVisible=floatBitsSubset(alphaUnwrapped,0,1)==1.0;bool renderInFront=floatBitsSubset(alphaUnwrapped,1,2)==1.0;bool renderGhosted=floatBitsSubset(alphaUnwrapped,2,3)==1.0;return NodeAppearance(nodeAppearanceTexel,isVisible,renderInFront,renderGhosted);}NodeAppearance determineNodeAppearance(sampler2D nodeAppearanceTexture,vec2 textureSize,highp float treeIndex){highp int dataTextureWidth=int(textureSize.x);highp int dataTextureHeight=int(textureSize.y);highp int iTreeIndex=int(treeIndex);highp int xTreeIndexTextureCoord=iTreeIndex % dataTextureWidth;highp int yTreeIndexTextureCoord=iTreeIndex/dataTextureWidth;vec4 texel=texelFetch(nodeAppearanceTexture,ivec2(xTreeIndexTextureCoord,yTreeIndexTextureCoord),0);return nodeAppearanceFromTexel(texel);}vec4 determineColor(vec3 originalColor,NodeAppearance nodeAppearance){vec4 overrideColor=nodeAppearance.colorTexel;if(any(greaterThan(overrideColor.rgb,vec3(0.0)))){return overrideColor;}return vec4(originalColor.rgb,overrideColor.a);}\n#if NUM_CLIPPING_PLANES > 0\nuniform vec4 clippingPlanes[NUM_CLIPPING_PLANES];\n#endif\nbool isClipped(vec3 point){\n#if NUM_CLIPPING_PLANES > 0\nvec3 pointFlipped=-point;vec4 plane;for(int i=0;i<UNION_CLIPPING_PLANES;i++){plane=clippingPlanes[i];if(dot(pointFlipped,plane.xyz)>plane.w)return true;}\n#if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES\nbool clipped=true;for(int i=UNION_CLIPPING_PLANES;i<NUM_CLIPPING_PLANES;i++){plane=clippingPlanes[i];clipped=(dot(pointFlipped,plane.xyz)>plane.w)&&clipped;}if(clipped)return true;\n#endif\n#endif\nreturn false;}struct UnusedTreeIndexPacked{highp float thousands;highp float subThousands;};highp vec2 packTreeIndex(float treeIndex){highp float roundedTreeIndex=round(treeIndex);highp float treeIndexThousands=floor(roundedTreeIndex/1000.0);highp float treeIndexSubThousands=mod(roundedTreeIndex,1000.0);return vec2(treeIndexThousands,treeIndexSubThousands);}highp float unpackTreeIndex(highp vec2 treeIndexPacked){highp float treeIndex=round(treeIndexPacked.x)*1000.0+round(treeIndexPacked.y);return treeIndex;}\n#define PI 3.14159265359\n#define PI2 6.28318530718\n#define PI_HALF 1.5707963267949\nuniform sampler2D colorDataTexture;uniform sampler2D matCapTexture;uniform vec2 treeIndexTextureSize;uniform mat4 projectionMatrix;uniform lowp int renderMode;float computeFragmentDepth(vec3 p,mat4 projectionMatrix){float projected_intersection_z=projectionMatrix[0][2]*p.x+projectionMatrix[1][2]*p.y+projectionMatrix[2][2]*p.z+projectionMatrix[3][2];float projected_intersection_w=projectionMatrix[0][3]*p.x+projectionMatrix[1][3]*p.y+projectionMatrix[2][3]*p.z+projectionMatrix[3][3];return((gl_DepthRange.diff*(projected_intersection_z/projected_intersection_w))+gl_DepthRange.near+gl_DepthRange.far)*.5;}float updateFragmentDepth(vec3 p,mat4 projectionMatrix){gl_FragDepth=computeFragmentDepth(p,projectionMatrix);return gl_FragDepth;}in vec4 v_centerB;in vec4 v_W;in vec4 v_U;in float v_angle;in float v_arcAngle;in vec4 v_centerA;in vec4 v_V;in vec3 v_color;in vec3 v_normal;in highp vec2 v_treeIndexPacked;void main(){highp float v_treeIndex=unpackTreeIndex(v_treeIndexPacked);NodeAppearance appearance=determineNodeAppearance(colorDataTexture,treeIndexTextureSize,v_treeIndex);vec3 normal=normalize(v_normal);vec4 color=determineColor(v_color,appearance);float R1=v_centerB.w;vec4 U=v_U;vec4 W=v_W;vec4 V=v_V;float height=length(v_centerA.xyz-v_centerB.xyz);float R2=v_centerA.w;float dR=R2-R1;mat3 basis=mat3(U.xyz,V.xyz,W.xyz);vec3 surfacePoint=vec3(U.w,V.w,W.w);vec3 rayTarget=surfacePoint;float rayTargetDist=length(rayTarget);\n#if defined(COGNITE_ORTHOGRAPHIC_CAMERA)\nvec3 rayDirection=vec3(0.0,0.0,-1.0);\n#else\nvec3 rayDirection=normalize(rayTarget);\n#endif\nvec3 diff=rayTarget-v_centerB.xyz;vec3 E=diff*basis;vec3 D=rayDirection*basis;float a=dot(D.xy,D.xy);float b=dot(E.xy,D.xy);float c=dot(E.xy,E.xy)-R1*R1;if(R1!=R2){float dRLInv=dR/height;float dRdRL2Inv=dRLInv*dRLInv;a-=D.z*D.z*dRdRL2Inv;b-=dRLInv*(E.z*D.z*dRLInv+R1*D.z);c-=dRLInv*(E.z*E.z*dRLInv+2.0*R1*E.z);}float d=b*b-a*c;if(d<0.0){discard;}float sqrtd=sqrt(d);float dist1=(-b-sqrtd)/a;float dist2=(-b+sqrtd)/a;if(dist2<dist1){float tmp=dist1;dist1=dist2;dist2=tmp;}float dist=dist1;vec3 intersectionPoint=E+dist*D;float theta=atan(intersectionPoint.y,intersectionPoint.x);if(theta<v_angle)theta+=2.0*PI;if(theta<v_angle)theta+=2.0*PI;vec3 p=rayTarget+dist*rayDirection;bool isInner=false;if(intersectionPoint.z<=0.0||intersectionPoint.z>height||theta>v_angle+v_arcAngle||isClipped(p)||rayTargetDist+dist<0.0){isInner=true;dist=dist2;intersectionPoint=E+dist*D;theta=atan(intersectionPoint.y,intersectionPoint.x);p=rayTarget+dist*rayDirection;if(theta<v_angle)theta+=2.0*PI;if(theta<v_angle)theta+=2.0*PI;if(intersectionPoint.z<=0.0||intersectionPoint.z>height||theta>v_angle+v_arcAngle||isClipped(p)||rayTargetDist+dist<0.0){discard;}}\n#if !defined(COGNITE_RENDER_COLOR_ID) && !defined(COGNITE_RENDER_DEPTH)\nif(R1!=R2){vec3 n=-normalize(W.xyz);vec3 P1=v_centerB.xyz;vec3 P2=v_centerA.xyz;vec3 A=cross(P1-p,P2 - p);vec3 t=normalize(cross(n,A));vec3 o1=P1+R1*t;vec3 o2=P2+R2*t;vec3 B=o2-o1;normal=normalize(cross(A,B));}else{vec3 p_local=p-v_centerB.xyz;normal=normalize(p_local-W.xyz*dot(p_local,W.xyz));}if(dot(normal,vec3(0.0,0.0,1.0))<0.0){normal*=-1.0;}\n#endif\nfloat fragDepth=updateFragmentDepth(p,projectionMatrix);updateFragmentColor(renderMode,color,v_treeIndex,normal,fragDepth,matCapTexture,GeometryType.Primitive);}", fn = "vec3 mul3(mat4 M,vec3 v){vec4 u=M*vec4(v,1.0);return u.xyz/u.w;}bool isWithinSpan(vec3 point,vec3 span){return all(lessThan(abs(point),span));}vec3 transformQuadToCoverScreenInViewSpace(vec3 position,mat4 projectionMatrix,float near){float tanFov=1.0/projectionMatrix[1][1];float aspect=projectionMatrix[1][1]/projectionMatrix[0][0];float maxAspect=max(aspect,1.0/aspect);vec3 fullScreenQuadCorner=vec3(position.xy*maxAspect*tanFov*near,-near - 1e-6);return fullScreenQuadCorner;}mat4 determineMatrixOverride(float treeIndex,vec2 treeIndexTextureSize,sampler2D transformOverrideIndexTexture,vec2 transformOverrideTextureSize,sampler2D transformOverrideTexture){float dataTextureWidth=treeIndexTextureSize.x;float dataTextureHeight=treeIndexTextureSize.y;int xTreeIndexTextureCoord=int(mod(treeIndex,dataTextureWidth));int yTreeIndexTextureCoord=int(floor(treeIndex/dataTextureWidth));float index=texelFetch(transformOverrideIndexTexture,ivec2(xTreeIndexTextureCoord,yTreeIndexTextureCoord),0).r;if(index==0.0){return mat4(1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0);}index-=1.0;float matrixElements[12];for(int i=0;i<12;i++){matrixElements[i]=texelFetch(transformOverrideTexture,ivec2(i+int(index)*16,0.0),0).r;}return mat4(matrixElements[0],matrixElements[4],matrixElements[8],0,matrixElements[1],matrixElements[5],matrixElements[9],0,matrixElements[2],matrixElements[6],matrixElements[10],0,matrixElements[3],matrixElements[7],matrixElements[11],1);}struct UnusedTreeIndexPacked{highp float thousands;highp float subThousands;};highp vec2 packTreeIndex(float treeIndex){highp float roundedTreeIndex=round(treeIndex);highp float treeIndexThousands=floor(roundedTreeIndex/1000.0);highp float treeIndexSubThousands=mod(roundedTreeIndex,1000.0);return vec2(treeIndexThousands,treeIndexSubThousands);}highp float unpackTreeIndex(highp vec2 treeIndexPacked){highp float treeIndex=round(treeIndexPacked.x)*1000.0+round(treeIndexPacked.y);return treeIndex;}const int RenderTypeColor=1;const int RenderTypeNormal=2;const int RenderTypeTreeIndex=3;const int RenderTypePackColorAndNormal=4;const int RenderTypeDepth=5;const int RenderTypeEffects=6;const int RenderTypeGhost=7;const int RenderTypeLOD=8;const int RenderTypeDepthBufferOnly=9;const int RenderTypeGeometryType=10;struct NodeAppearance{vec4 colorTexel;bool isVisible;bool renderInFront;bool renderGhosted;};float floatBitsSubset(float inNumber,int fromLeastSignificantBitIndex,int toMostSignificantBitIndex){float r=float(fromLeastSignificantBitIndex);float l=float(toMostSignificantBitIndex);float bitShift=pow(2.0,r);return mod(((inNumber-mod(inNumber,bitShift))/bitShift),pow(2.0,l - r));}NodeAppearance nodeAppearanceFromTexel(vec4 nodeAppearanceTexel){float alphaUnwrapped=floor((nodeAppearanceTexel.a*255.0)+0.5);bool isVisible=floatBitsSubset(alphaUnwrapped,0,1)==1.0;bool renderInFront=floatBitsSubset(alphaUnwrapped,1,2)==1.0;bool renderGhosted=floatBitsSubset(alphaUnwrapped,2,3)==1.0;return NodeAppearance(nodeAppearanceTexel,isVisible,renderInFront,renderGhosted);}NodeAppearance determineNodeAppearance(sampler2D nodeAppearanceTexture,vec2 textureSize,highp float treeIndex){highp int dataTextureWidth=int(textureSize.x);highp int dataTextureHeight=int(textureSize.y);highp int iTreeIndex=int(treeIndex);highp int xTreeIndexTextureCoord=iTreeIndex % dataTextureWidth;highp int yTreeIndexTextureCoord=iTreeIndex/dataTextureWidth;vec4 texel=texelFetch(nodeAppearanceTexture,ivec2(xTreeIndexTextureCoord,yTreeIndexTextureCoord),0);return nodeAppearanceFromTexel(texel);}bool determineVisibility(NodeAppearance nodeAppearance,int renderMode){bool visible=nodeAppearance.isVisible;bool ghost=(renderMode==RenderTypeGhost)&&nodeAppearance.renderGhosted;bool inFront=(renderMode==RenderTypeEffects)&&nodeAppearance.renderInFront;bool back=(renderMode==RenderTypeColor)&&!nodeAppearance.renderGhosted&&!nodeAppearance.renderInFront;bool other=(renderMode!=RenderTypeColor&&renderMode!=RenderTypeEffects&&renderMode!=RenderTypeGhost)&&!nodeAppearance.renderGhosted;return visible&&(ghost||inFront||back||other);}uniform mat4 inverseModelMatrix;uniform mat4 modelViewMatrix;uniform mat4 projectionMatrix;uniform mat3 normalMatrix;uniform vec3 cameraPosition;uniform vec2 treeIndexTextureSize;uniform vec2 transformOverrideTextureSize;uniform sampler2D transformOverrideIndexTexture;uniform sampler2D transformOverrideTexture;uniform sampler2D colorDataTexture;uniform lowp int renderMode;in vec3 position;in vec3 normal;in float a_treeIndex;in vec3 a_centerA;in vec3 a_centerB;in float a_radiusA;in float a_radiusB;in vec3 a_color;in vec3 a_localXAxis;in float a_angle;in float a_arcAngle;out vec4 v_centerB;out vec4 v_U;out vec4 v_W;out vec4 v_centerA;out vec4 v_V;out float v_angle;out float v_arcAngle;out vec3 v_color;out vec3 v_normal;out highp vec2 v_treeIndexPacked;void main(){NodeAppearance appearance=determineNodeAppearance(colorDataTexture,treeIndexTextureSize,a_treeIndex);if(!determineVisibility(appearance,renderMode)){gl_Position=vec4(2.0,2.0,2.0,1.0);return;}v_treeIndexPacked=packTreeIndex(a_treeIndex);mat4 treeIndexWorldTransform=determineMatrixOverride(a_treeIndex,treeIndexTextureSize,transformOverrideIndexTexture,transformOverrideTextureSize,transformOverrideTexture);vec3 centerA=mul3(treeIndexWorldTransform,a_centerA);vec3 centerB=mul3(treeIndexWorldTransform,a_centerB);vec3 center=0.5*(centerA+centerB);float halfHeight=0.5*length(centerA-centerB);vec3 dir=normalize(centerA-centerB);vec3 newPosition=position;vec3 rayOrigin=(inverseModelMatrix*vec4(cameraPosition,1.0)).xyz;vec3 objectToCameraModelSpace=rayOrigin-center;float maxRadius=max(a_radiusA,a_radiusB);float leftUpScale=maxRadius;vec3 lDir=dir;if(dot(objectToCameraModelSpace,dir)<0.0){lDir=-lDir;}vec3 left=normalize(cross(objectToCameraModelSpace,lDir));vec3 up=normalize(cross(left,lDir));newPosition.x*=1.0-(maxRadius*(position.x+1.0)*0.0025/halfHeight);mat3 billboardWorldRotation=mat3(lDir,left,up);vec3 cylinderAxisScales=vec3(halfHeight,maxRadius,maxRadius);mat3 inverseBillboardWorldRotation=transpose(billboardWorldRotation);vec3 cameraPosInCylinderSpace=inverseBillboardWorldRotation*(rayOrigin-center);mat3 billboardWorldScaleRotation=mat3(halfHeight*lDir,maxRadius*left,maxRadius*up);vec3 localBillboardPosition=center+billboardWorldScaleRotation*newPosition;vec3 surfacePoint=mul3(modelViewMatrix,localBillboardPosition);float near=min(1.0,projectionMatrix[3][2]/(projectionMatrix[2][2]-1.0));if(isWithinSpan(cameraPosInCylinderSpace,cylinderAxisScales+vec3(near))){surfacePoint=transformQuadToCoverScreenInViewSpace(newPosition,projectionMatrix,near);}gl_Position=projectionMatrix*vec4(surfacePoint,1.0);v_angle=a_angle;v_arcAngle=a_arcAngle;v_W.xyz=dir;v_U.xyz=(treeIndexWorldTransform*vec4(a_localXAxis,0.0)).xyz;v_W.xyz=normalize(normalMatrix*v_W.xyz);v_U.xyz=normalize(normalMatrix*v_U.xyz);v_W.w=surfacePoint.z;v_U.w=surfacePoint.x;mat4 modelToTransformOffset=modelViewMatrix*treeIndexWorldTransform;float radiusB=length((modelToTransformOffset*vec4(a_localXAxis*a_radiusB,0.0)).xyz);float radiusA=length((modelToTransformOffset*vec4(a_localXAxis*a_radiusA,0.0)).xyz);v_centerB.xyz=mul3(modelViewMatrix,centerB);v_centerB.w=radiusB;v_V.xyz=-cross(v_U.xyz,v_W.xyz);v_V.w=surfacePoint.y;v_centerA.xyz=mul3(modelViewMatrix,centerA);v_centerA.w=radiusA;v_color=a_color;v_normal=normalMatrix*normal;}", pn = "precision highp float;struct NodeAppearance{vec4 colorTexel;bool isVisible;bool renderInFront;bool renderGhosted;};vec3 rgb2hsv(vec3 c){vec4 K=vec4(0.0,-1.0/3.0,2.0/3.0,-1.0);vec4 p=mix(vec4(c.bg,K.wz),vec4(c.gb,K.xy),step(c.b,c.g));vec4 q=mix(vec4(p.xyw,c.r),vec4(c.r,p.yzx),step(p.x,c.r));float d=q.x-min(q.w,q.y);float e=1.0e-10;return vec3(abs(q.z+(q.w-q.y)/(6.0*d+e)),d/(q.x+e),q.x);}vec3 hsv2rgb(vec3 c){vec4 K=vec4(1.0,2.0/3.0,1.0/3.0,3.0);vec3 p=abs(fract(c.xxx+K.xyz)*6.0-K.www);return c.z*mix(K.xxx,clamp(p-K.xxx,0.0,1.0),c.y);}vec3 packIntToColor(float number){float r=floor(number/(255.0*255.0))/255.0;float g=mod(floor(number/255.0),255.0)/255.0;float b=mod(number,255.0)/255.0;return vec3(r,g,b);}struct GeometryTypeEnum{int Quad;int Primitive;int TriangleMesh;int InstancedMesh;};const GeometryTypeEnum GeometryType=GeometryTypeEnum(1,2,3,4);const int RenderTypeColor=1;const int RenderTypeNormal=2;const int RenderTypeTreeIndex=3;const int RenderTypePackColorAndNormal=4;const int RenderTypeDepth=5;const int RenderTypeEffects=6;const int RenderTypeGhost=7;const int RenderTypeLOD=8;const int RenderTypeDepthBufferOnly=9;const int RenderTypeGeometryType=10;\n#include <packing>\nout vec4 outputColor;vec3 packNormalToRgb(const in vec3 normal){return normalize(normal)*0.5+0.5;}void updateFragmentColor(int renderMode,vec4 color,float treeIndex,vec3 normal,float depth,sampler2D matCapTexture,int geometryType){if(renderMode==RenderTypeColor||renderMode==RenderTypeEffects){\n#if defined(IS_TEXTURED)\nvec3 colorRGB=color.rgb;\n#else\nvec3 hsv=rgb2hsv(color.rgb);hsv.z=min(0.5*hsv.z+0.5,1.0);vec3 colorRGB=hsv2rgb(hsv);\n#endif\nfloat amplitude=max(0.0,dot(normal,vec3(0.0,0.0,1.0)));vec4 albedo=vec4(colorRGB*(0.4+0.6*amplitude),1.0);vec2 cap=normal.xy*0.5+0.5;vec4 mc=vec4(texture(matCapTexture,cap).rgb,1.0);outputColor=vec4(albedo.rgb*mc.rgb*1.7,color.a);}else if(renderMode==RenderTypeGhost){float amplitude=max(0.0,dot(normal,vec3(0.0,0.0,1.0)));float s=0.4+0.6*amplitude;outputColor=vec4(vec3(s),0.3);}else if(renderMode==RenderTypeDepthBufferOnly){outputColor=vec4(1.0,0.0,1.0,1.0);}else if(renderMode==RenderTypePackColorAndNormal){vec3 hsv=rgb2hsv(color.rgb);float a=0.0;if(hsv.y>0.01){if(hsv.z>0.5){a=(0.55+hsv.x*0.45);}else{a=(0.1+hsv.x*0.45);}}else{a=hsv.z*0.09;}outputColor=vec4(packNormalToRgb(normal.rgb),color.a);}else if(renderMode==RenderTypeNormal){outputColor=vec4(packNormalToRgb(normal),color.a);}else if(renderMode==RenderTypeTreeIndex){outputColor=vec4(packIntToColor(treeIndex),color.a);}else if(renderMode==RenderTypeDepth){outputColor=packDepthToRGBA(depth);}else if(renderMode==RenderTypeLOD){bool isHighDetail=geometryType!=GeometryType.Quad;vec2 cap=normal.xy*0.5+0.5;vec3 mc=texture(matCapTexture,cap).rgb*1.5;outputColor=isHighDetail ? vec4(vec3(0.0,1.0,0.0)*mc,color.a): vec4(vec3(1.0,1.0,0.0)*mc,color.a);}else if(renderMode==RenderTypeGeometryType){vec2 cap=normal.xy*0.5+0.5;vec3 mc=texture(matCapTexture,cap).rgb;vec3 geometryColor=float(geometryType==1)*vec3(1.0,0.0,0.0)+float(geometryType==2)*vec3(0.0,1.0,0.0)+float(geometryType==3)*vec3(0.0,0.0,1.0)+float(geometryType==4)*vec3(1.0,1.0,0.0);outputColor=vec4(geometryColor*mc,color.a);}else{outputColor=vec4(1.0,0.0,1.0,1.0);}}float floatBitsSubset(float inNumber,int fromLeastSignificantBitIndex,int toMostSignificantBitIndex){float r=float(fromLeastSignificantBitIndex);float l=float(toMostSignificantBitIndex);float bitShift=pow(2.0,r);return mod(((inNumber-mod(inNumber,bitShift))/bitShift),pow(2.0,l - r));}NodeAppearance nodeAppearanceFromTexel(vec4 nodeAppearanceTexel){float alphaUnwrapped=floor((nodeAppearanceTexel.a*255.0)+0.5);bool isVisible=floatBitsSubset(alphaUnwrapped,0,1)==1.0;bool renderInFront=floatBitsSubset(alphaUnwrapped,1,2)==1.0;bool renderGhosted=floatBitsSubset(alphaUnwrapped,2,3)==1.0;return NodeAppearance(nodeAppearanceTexel,isVisible,renderInFront,renderGhosted);}NodeAppearance determineNodeAppearance(sampler2D nodeAppearanceTexture,vec2 textureSize,highp float treeIndex){highp int dataTextureWidth=int(textureSize.x);highp int dataTextureHeight=int(textureSize.y);highp int iTreeIndex=int(treeIndex);highp int xTreeIndexTextureCoord=iTreeIndex % dataTextureWidth;highp int yTreeIndexTextureCoord=iTreeIndex/dataTextureWidth;vec4 texel=texelFetch(nodeAppearanceTexture,ivec2(xTreeIndexTextureCoord,yTreeIndexTextureCoord),0);return nodeAppearanceFromTexel(texel);}vec4 determineColor(vec3 originalColor,NodeAppearance nodeAppearance){vec4 overrideColor=nodeAppearance.colorTexel;if(any(greaterThan(overrideColor.rgb,vec3(0.0)))){return overrideColor;}return vec4(originalColor.rgb,overrideColor.a);}\n#if NUM_CLIPPING_PLANES > 0\nuniform vec4 clippingPlanes[NUM_CLIPPING_PLANES];\n#endif\nbool isClipped(vec3 point){\n#if NUM_CLIPPING_PLANES > 0\nvec3 pointFlipped=-point;vec4 plane;for(int i=0;i<UNION_CLIPPING_PLANES;i++){plane=clippingPlanes[i];if(dot(pointFlipped,plane.xyz)>plane.w)return true;}\n#if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES\nbool clipped=true;for(int i=UNION_CLIPPING_PLANES;i<NUM_CLIPPING_PLANES;i++){plane=clippingPlanes[i];clipped=(dot(pointFlipped,plane.xyz)>plane.w)&&clipped;}if(clipped)return true;\n#endif\n#endif\nreturn false;}struct UnusedTreeIndexPacked{highp float thousands;highp float subThousands;};highp vec2 packTreeIndex(float treeIndex){highp float roundedTreeIndex=round(treeIndex);highp float treeIndexThousands=floor(roundedTreeIndex/1000.0);highp float treeIndexSubThousands=mod(roundedTreeIndex,1000.0);return vec2(treeIndexThousands,treeIndexSubThousands);}highp float unpackTreeIndex(highp vec2 treeIndexPacked){highp float treeIndex=round(treeIndexPacked.x)*1000.0+round(treeIndexPacked.y);return treeIndex;}\n#define PI 3.14159265359\n#define PI2 6.28318530718\n#define PI_HALF 1.5707963267949\nuniform sampler2D colorDataTexture;uniform sampler2D matCapTexture;uniform vec2 treeIndexTextureSize;uniform mat4 projectionMatrix;uniform lowp int renderMode;float computeFragmentDepth(vec3 p,mat4 projectionMatrix){float projected_intersection_z=projectionMatrix[0][2]*p.x+projectionMatrix[1][2]*p.y+projectionMatrix[2][2]*p.z+projectionMatrix[3][2];float projected_intersection_w=projectionMatrix[0][3]*p.x+projectionMatrix[1][3]*p.y+projectionMatrix[2][3]*p.z+projectionMatrix[3][3];return((gl_DepthRange.diff*(projected_intersection_z/projected_intersection_w))+gl_DepthRange.near+gl_DepthRange.far)*.5;}float updateFragmentDepth(vec3 p,mat4 projectionMatrix){gl_FragDepth=computeFragmentDepth(p,projectionMatrix);return gl_FragDepth;}in vec4 U;in vec4 V;in vec4 axis;in vec4 v_centerA;in vec4 v_centerB;in float height;in vec3 v_color;in vec3 v_normal;in highp vec2 v_treeIndexPacked;void main(){highp float v_treeIndex=unpackTreeIndex(v_treeIndexPacked);NodeAppearance appearance=determineNodeAppearance(colorDataTexture,treeIndexTextureSize,v_treeIndex);vec4 color=determineColor(v_color,appearance);vec3 normal=normalize(v_normal);mat3 basis=mat3(U.xyz,V.xyz,axis.xyz);vec3 surfacePoint=vec3(U.w,V.w,axis.w);vec3 rayTarget=surfacePoint;float rayTargetDist=length(rayTarget);\n#if defined(COGNITE_ORTHOGRAPHIC_CAMERA)\nvec3 rayDirection=vec3(0.0,0.0,-1.0);\n#else\nvec3 rayDirection=normalize(rayTarget);\n#endif\nvec3 diff=rayTarget-v_centerA.xyz;vec3 E=diff*basis;float L=height;vec3 D=rayDirection*basis;float R1=v_centerA.w;float R2=v_centerB.w;float dR=R2-R1;float a=dot(D.xy,D.xy);float b=dot(E.xy,D.xy);float c=dot(E.xy,E.xy)-R1*R1;float L2Inv=1.0/(L*L);if(R1!=R2){float dRLInv=dR/L;float dRdRL2Inv=dRLInv*dRLInv;a-=D.z*D.z*dRdRL2Inv;b-=dRLInv*(E.z*D.z*dRLInv+R1*D.z);c-=dRLInv*(E.z*E.z*dRLInv+2.0*R1*E.z);}vec2 displacement=((v_centerB.xyz-v_centerA.xyz)*basis).xy;float displacementLengthSquared=dot(displacement,displacement);a+=D.z*(D.z*displacementLengthSquared-2.0*L*dot(D.xy,displacement))*L2Inv;b+=(D.z*E.z*displacementLengthSquared-L*(D.x*E.z*displacement.x+D.y*E.z*displacement.y+D.z*E.x*displacement.x+D.z*E.y*displacement.y))*L2Inv;c+=E.z*(E.z*displacementLengthSquared-2.0*L*dot(E.xy,displacement))*L2Inv;float d=b*b-a*c;if(d<0.0){discard;}float sqrtd=sqrt(d);float dist1=(-b-sqrtd)/a;float dist2=(-b+sqrtd)/a;if(dist2<dist1){float tmp=dist1;dist1=dist2;dist2=tmp;}float dist=dist1;float intersectionPointZ=E.z+dist*D.z;vec3 p=rayTarget+dist*rayDirection;if(intersectionPointZ<=0.0||intersectionPointZ>=L||isClipped(p)||rayTargetDist+dist<0.0){dist=dist2;intersectionPointZ=E.z+dist*D.z;p=rayTarget+dist*rayDirection;if(intersectionPointZ<=0.0||intersectionPointZ>=L||isClipped(p)||rayTargetDist+dist<0.0){discard;}}\n#if !defined(COGNITE_RENDER_COLOR_ID) && !defined(COGNITE_RENDER_DEPTH)\nvec3 n=normalize(-axis.xyz);vec3 v_centerA=v_centerA.xyz;vec3 v_centerB=v_centerB.xyz;vec3 A=cross(v_centerA-p,v_centerB - p);vec3 t=normalize(cross(n,A));vec3 o1=v_centerA+R1*t;vec3 o2=v_centerB+R2*t;vec3 B=o2-o1;normal=normalize(cross(A,B));\n#endif\nif(dot(normal,vec3(0.0,0.0,1.0))<0.0){normal*=-1.0;}float fragDepth=updateFragmentDepth(p,projectionMatrix);updateFragmentColor(renderMode,color,v_treeIndex,normal,fragDepth,matCapTexture,GeometryType.Primitive);}", mn = "vec3 mul3(mat4 M,vec3 v){vec4 u=M*vec4(v,1.0);return u.xyz/u.w;}bool isWithinSpan(vec3 point,vec3 span){return all(lessThan(abs(point),span));}vec3 transformQuadToCoverScreenInViewSpace(vec3 position,mat4 projectionMatrix,float near){float tanFov=1.0/projectionMatrix[1][1];float aspect=projectionMatrix[1][1]/projectionMatrix[0][0];float maxAspect=max(aspect,1.0/aspect);vec3 fullScreenQuadCorner=vec3(position.xy*maxAspect*tanFov*near,-near - 1e-6);return fullScreenQuadCorner;}mat4 determineMatrixOverride(float treeIndex,vec2 treeIndexTextureSize,sampler2D transformOverrideIndexTexture,vec2 transformOverrideTextureSize,sampler2D transformOverrideTexture){float dataTextureWidth=treeIndexTextureSize.x;float dataTextureHeight=treeIndexTextureSize.y;int xTreeIndexTextureCoord=int(mod(treeIndex,dataTextureWidth));int yTreeIndexTextureCoord=int(floor(treeIndex/dataTextureWidth));float index=texelFetch(transformOverrideIndexTexture,ivec2(xTreeIndexTextureCoord,yTreeIndexTextureCoord),0).r;if(index==0.0){return mat4(1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0);}index-=1.0;float matrixElements[12];for(int i=0;i<12;i++){matrixElements[i]=texelFetch(transformOverrideTexture,ivec2(i+int(index)*16,0.0),0).r;}return mat4(matrixElements[0],matrixElements[4],matrixElements[8],0,matrixElements[1],matrixElements[5],matrixElements[9],0,matrixElements[2],matrixElements[6],matrixElements[10],0,matrixElements[3],matrixElements[7],matrixElements[11],1);}struct UnusedTreeIndexPacked{highp float thousands;highp float subThousands;};highp vec2 packTreeIndex(float treeIndex){highp float roundedTreeIndex=round(treeIndex);highp float treeIndexThousands=floor(roundedTreeIndex/1000.0);highp float treeIndexSubThousands=mod(roundedTreeIndex,1000.0);return vec2(treeIndexThousands,treeIndexSubThousands);}highp float unpackTreeIndex(highp vec2 treeIndexPacked){highp float treeIndex=round(treeIndexPacked.x)*1000.0+round(treeIndexPacked.y);return treeIndex;}const int RenderTypeColor=1;const int RenderTypeNormal=2;const int RenderTypeTreeIndex=3;const int RenderTypePackColorAndNormal=4;const int RenderTypeDepth=5;const int RenderTypeEffects=6;const int RenderTypeGhost=7;const int RenderTypeLOD=8;const int RenderTypeDepthBufferOnly=9;const int RenderTypeGeometryType=10;struct NodeAppearance{vec4 colorTexel;bool isVisible;bool renderInFront;bool renderGhosted;};float floatBitsSubset(float inNumber,int fromLeastSignificantBitIndex,int toMostSignificantBitIndex){float r=float(fromLeastSignificantBitIndex);float l=float(toMostSignificantBitIndex);float bitShift=pow(2.0,r);return mod(((inNumber-mod(inNumber,bitShift))/bitShift),pow(2.0,l - r));}NodeAppearance nodeAppearanceFromTexel(vec4 nodeAppearanceTexel){float alphaUnwrapped=floor((nodeAppearanceTexel.a*255.0)+0.5);bool isVisible=floatBitsSubset(alphaUnwrapped,0,1)==1.0;bool renderInFront=floatBitsSubset(alphaUnwrapped,1,2)==1.0;bool renderGhosted=floatBitsSubset(alphaUnwrapped,2,3)==1.0;return NodeAppearance(nodeAppearanceTexel,isVisible,renderInFront,renderGhosted);}NodeAppearance determineNodeAppearance(sampler2D nodeAppearanceTexture,vec2 textureSize,highp float treeIndex){highp int dataTextureWidth=int(textureSize.x);highp int dataTextureHeight=int(textureSize.y);highp int iTreeIndex=int(treeIndex);highp int xTreeIndexTextureCoord=iTreeIndex % dataTextureWidth;highp int yTreeIndexTextureCoord=iTreeIndex/dataTextureWidth;vec4 texel=texelFetch(nodeAppearanceTexture,ivec2(xTreeIndexTextureCoord,yTreeIndexTextureCoord),0);return nodeAppearanceFromTexel(texel);}bool determineVisibility(NodeAppearance nodeAppearance,int renderMode){bool visible=nodeAppearance.isVisible;bool ghost=(renderMode==RenderTypeGhost)&&nodeAppearance.renderGhosted;bool inFront=(renderMode==RenderTypeEffects)&&nodeAppearance.renderInFront;bool back=(renderMode==RenderTypeColor)&&!nodeAppearance.renderGhosted&&!nodeAppearance.renderInFront;bool other=(renderMode!=RenderTypeColor&&renderMode!=RenderTypeEffects&&renderMode!=RenderTypeGhost)&&!nodeAppearance.renderGhosted;return visible&&(ghost||inFront||back||other);}uniform mat4 inverseModelMatrix;uniform mat4 modelViewMatrix;uniform mat4 projectionMatrix;uniform mat3 normalMatrix;uniform vec3 cameraPosition;uniform vec2 treeIndexTextureSize;uniform vec2 transformOverrideTextureSize;uniform sampler2D transformOverrideIndexTexture;uniform sampler2D transformOverrideTexture;uniform sampler2D colorDataTexture;uniform lowp int renderMode;in vec3 position;in vec3 normal;in float a_treeIndex;in vec3 a_centerA;in vec3 a_centerB;in float a_radiusA;in float a_radiusB;in vec3 a_normal;in vec3 a_color;out vec4 v_centerA;out vec4 v_centerB;out vec4 U;out vec4 V;out vec4 axis;out float height;out vec3 v_color;out vec3 v_normal;out highp vec2 v_treeIndexPacked;void main(){NodeAppearance appearance=determineNodeAppearance(colorDataTexture,treeIndexTextureSize,a_treeIndex);if(!determineVisibility(appearance,renderMode)){gl_Position=vec4(2.0,2.0,2.0,1.0);return;}v_treeIndexPacked=packTreeIndex(a_treeIndex);mat4 treeIndexWorldTransform=determineMatrixOverride(a_treeIndex,treeIndexTextureSize,transformOverrideIndexTexture,transformOverrideTextureSize,transformOverrideTexture);mat4 modelToTransformOffset=modelViewMatrix*treeIndexWorldTransform;vec3 centerA=mul3(treeIndexWorldTransform,a_centerA);vec3 centerB=mul3(treeIndexWorldTransform,a_centerB);vec3 normalWithOffset=normalize((treeIndexWorldTransform*vec4(a_normal,0)).xyz);vec3 centerAInCameraSpace=(modelViewMatrix*vec4(centerA,1.0)).xyz;vec3 centerBInCameraSpace=(modelViewMatrix*vec4(centerB,1.0)).xyz;height=dot(normalize(centerA-centerB),normalWithOffset)*length(centerAInCameraSpace - centerBInCameraSpace);vec3 lDir;vec3 center=0.5*(centerA+centerB);vec3 newPosition=position;vec3 rayOrigin=(inverseModelMatrix*vec4(cameraPosition,1.0)).xyz;vec3 objectToCameraModelSpace=rayOrigin-center;vec3 maxCenterProjected=centerA-dot(centerA,normalWithOffset)*normalWithOffset;vec3 minCenterProjected=centerB-dot(centerB,normalWithOffset)*normalWithOffset;float distanceBetweenProjectedCenters=length(maxCenterProjected-minCenterProjected);lDir=normalWithOffset;float dirSign=1.0;if(dot(objectToCameraModelSpace,lDir)<0.0){dirSign=-1.0;lDir*=-1.;}vec3 left=normalize(cross(objectToCameraModelSpace,lDir));vec3 up=normalize(cross(left,lDir));axis.xyz=-normalWithOffset;U.xyz=cross(objectToCameraModelSpace,axis.xyz);V.xyz=cross(U.xyz,axis.xyz);axis.xyz=normalize(normalMatrix*axis.xyz);U.xyz=normalize(normalMatrix*U.xyz);V.xyz=normalize(normalMatrix*V.xyz);newPosition.x*=1.0-(a_radiusA*(position.x+1.0)*0.0025/height);v_centerA.xyz=mul3(modelViewMatrix,centerA);v_centerB.xyz=mul3(modelViewMatrix,centerB);float radiusA=length((modelToTransformOffset*vec4(normalize(vec3(1.0))*a_radiusA,0.0)).xyz);float radiusB=length((modelToTransformOffset*vec4(normalize(vec3(1.0))*a_radiusB,0.0)).xyz);v_centerA.w=radiusA;v_centerB.w=radiusB;float radiusIncludedDisplacement=0.5*(2.0*max(a_radiusA,a_radiusB)+distanceBetweenProjectedCenters);mat3 billboardWorldRotation=mat3(lDir,left,up);vec3 cylinderAxisScales=vec3(height,radiusIncludedDisplacement,radiusIncludedDisplacement);mat3 inverseBillboardWorldRotation=transpose(billboardWorldRotation);vec3 cameraPosInCylinderSpace=inverseBillboardWorldRotation*(rayOrigin-center);mat3 billboardWorldScaleRotation=mat3(0.5*height*lDir,radiusIncludedDisplacement*left,radiusIncludedDisplacement*up);vec3 localBillboardPosition=center+billboardWorldScaleRotation*newPosition;vec3 surfacePoint=mul3(modelViewMatrix,localBillboardPosition);float near=min(1.0,projectionMatrix[3][2]/(projectionMatrix[2][2]-1.0));if(isWithinSpan(cameraPosInCylinderSpace,cylinderAxisScales+vec3(near))){surfacePoint=transformQuadToCoverScreenInViewSpace(newPosition,projectionMatrix,near);}U.w=surfacePoint.x;V.w=surfacePoint.y;axis.w=surfacePoint.z;v_color=a_color;v_normal=normalMatrix*normal;gl_Position=projectionMatrix*vec4(surfacePoint,1.0);}", hn = "precision highp float;struct NodeAppearance{vec4 colorTexel;bool isVisible;bool renderInFront;bool renderGhosted;};vec3 rgb2hsv(vec3 c){vec4 K=vec4(0.0,-1.0/3.0,2.0/3.0,-1.0);vec4 p=mix(vec4(c.bg,K.wz),vec4(c.gb,K.xy),step(c.b,c.g));vec4 q=mix(vec4(p.xyw,c.r),vec4(c.r,p.yzx),step(p.x,c.r));float d=q.x-min(q.w,q.y);float e=1.0e-10;return vec3(abs(q.z+(q.w-q.y)/(6.0*d+e)),d/(q.x+e),q.x);}vec3 hsv2rgb(vec3 c){vec4 K=vec4(1.0,2.0/3.0,1.0/3.0,3.0);vec3 p=abs(fract(c.xxx+K.xyz)*6.0-K.www);return c.z*mix(K.xxx,clamp(p-K.xxx,0.0,1.0),c.y);}vec3 packIntToColor(float number){float r=floor(number/(255.0*255.0))/255.0;float g=mod(floor(number/255.0),255.0)/255.0;float b=mod(number,255.0)/255.0;return vec3(r,g,b);}struct GeometryTypeEnum{int Quad;int Primitive;int TriangleMesh;int InstancedMesh;};const GeometryTypeEnum GeometryType=GeometryTypeEnum(1,2,3,4);const int RenderTypeColor=1;const int RenderTypeNormal=2;const int RenderTypeTreeIndex=3;const int RenderTypePackColorAndNormal=4;const int RenderTypeDepth=5;const int RenderTypeEffects=6;const int RenderTypeGhost=7;const int RenderTypeLOD=8;const int RenderTypeDepthBufferOnly=9;const int RenderTypeGeometryType=10;\n#include <packing>\nout vec4 outputColor;vec3 packNormalToRgb(const in vec3 normal){return normalize(normal)*0.5+0.5;}void updateFragmentColor(int renderMode,vec4 color,float treeIndex,vec3 normal,float depth,sampler2D matCapTexture,int geometryType){if(renderMode==RenderTypeColor||renderMode==RenderTypeEffects){\n#if defined(IS_TEXTURED)\nvec3 colorRGB=color.rgb;\n#else\nvec3 hsv=rgb2hsv(color.rgb);hsv.z=min(0.5*hsv.z+0.5,1.0);vec3 colorRGB=hsv2rgb(hsv);\n#endif\nfloat amplitude=max(0.0,dot(normal,vec3(0.0,0.0,1.0)));vec4 albedo=vec4(colorRGB*(0.4+0.6*amplitude),1.0);vec2 cap=normal.xy*0.5+0.5;vec4 mc=vec4(texture(matCapTexture,cap).rgb,1.0);outputColor=vec4(albedo.rgb*mc.rgb*1.7,color.a);}else if(renderMode==RenderTypeGhost){float amplitude=max(0.0,dot(normal,vec3(0.0,0.0,1.0)));float s=0.4+0.6*amplitude;outputColor=vec4(vec3(s),0.3);}else if(renderMode==RenderTypeDepthBufferOnly){outputColor=vec4(1.0,0.0,1.0,1.0);}else if(renderMode==RenderTypePackColorAndNormal){vec3 hsv=rgb2hsv(color.rgb);float a=0.0;if(hsv.y>0.01){if(hsv.z>0.5){a=(0.55+hsv.x*0.45);}else{a=(0.1+hsv.x*0.45);}}else{a=hsv.z*0.09;}outputColor=vec4(packNormalToRgb(normal.rgb),color.a);}else if(renderMode==RenderTypeNormal){outputColor=vec4(packNormalToRgb(normal),color.a);}else if(renderMode==RenderTypeTreeIndex){outputColor=vec4(packIntToColor(treeIndex),color.a);}else if(renderMode==RenderTypeDepth){outputColor=packDepthToRGBA(depth);}else if(renderMode==RenderTypeLOD){bool isHighDetail=geometryType!=GeometryType.Quad;vec2 cap=normal.xy*0.5+0.5;vec3 mc=texture(matCapTexture,cap).rgb*1.5;outputColor=isHighDetail ? vec4(vec3(0.0,1.0,0.0)*mc,color.a): vec4(vec3(1.0,1.0,0.0)*mc,color.a);}else if(renderMode==RenderTypeGeometryType){vec2 cap=normal.xy*0.5+0.5;vec3 mc=texture(matCapTexture,cap).rgb;vec3 geometryColor=float(geometryType==1)*vec3(1.0,0.0,0.0)+float(geometryType==2)*vec3(0.0,1.0,0.0)+float(geometryType==3)*vec3(0.0,0.0,1.0)+float(geometryType==4)*vec3(1.0,1.0,0.0);outputColor=vec4(geometryColor*mc,color.a);}else{outputColor=vec4(1.0,0.0,1.0,1.0);}}float floatBitsSubset(float inNumber,int fromLeastSignificantBitIndex,int toMostSignificantBitIndex){float r=float(fromLeastSignificantBitIndex);float l=float(toMostSignificantBitIndex);float bitShift=pow(2.0,r);return mod(((inNumber-mod(inNumber,bitShift))/bitShift),pow(2.0,l - r));}NodeAppearance nodeAppearanceFromTexel(vec4 nodeAppearanceTexel){float alphaUnwrapped=floor((nodeAppearanceTexel.a*255.0)+0.5);bool isVisible=floatBitsSubset(alphaUnwrapped,0,1)==1.0;bool renderInFront=floatBitsSubset(alphaUnwrapped,1,2)==1.0;bool renderGhosted=floatBitsSubset(alphaUnwrapped,2,3)==1.0;return NodeAppearance(nodeAppearanceTexel,isVisible,renderInFront,renderGhosted);}NodeAppearance determineNodeAppearance(sampler2D nodeAppearanceTexture,vec2 textureSize,highp float treeIndex){highp int dataTextureWidth=int(textureSize.x);highp int dataTextureHeight=int(textureSize.y);highp int iTreeIndex=int(treeIndex);highp int xTreeIndexTextureCoord=iTreeIndex % dataTextureWidth;highp int yTreeIndexTextureCoord=iTreeIndex/dataTextureWidth;vec4 texel=texelFetch(nodeAppearanceTexture,ivec2(xTreeIndexTextureCoord,yTreeIndexTextureCoord),0);return nodeAppearanceFromTexel(texel);}vec4 determineColor(vec3 originalColor,NodeAppearance nodeAppearance){vec4 overrideColor=nodeAppearance.colorTexel;if(any(greaterThan(overrideColor.rgb,vec3(0.0)))){return overrideColor;}return vec4(originalColor.rgb,overrideColor.a);}\n#if NUM_CLIPPING_PLANES > 0\nuniform vec4 clippingPlanes[NUM_CLIPPING_PLANES];\n#endif\nbool isClipped(vec3 point){\n#if NUM_CLIPPING_PLANES > 0\nvec3 pointFlipped=-point;vec4 plane;for(int i=0;i<UNION_CLIPPING_PLANES;i++){plane=clippingPlanes[i];if(dot(pointFlipped,plane.xyz)>plane.w)return true;}\n#if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES\nbool clipped=true;for(int i=UNION_CLIPPING_PLANES;i<NUM_CLIPPING_PLANES;i++){plane=clippingPlanes[i];clipped=(dot(pointFlipped,plane.xyz)>plane.w)&&clipped;}if(clipped)return true;\n#endif\n#endif\nreturn false;}struct UnusedTreeIndexPacked{highp float thousands;highp float subThousands;};highp vec2 packTreeIndex(float treeIndex){highp float roundedTreeIndex=round(treeIndex);highp float treeIndexThousands=floor(roundedTreeIndex/1000.0);highp float treeIndexSubThousands=mod(roundedTreeIndex,1000.0);return vec2(treeIndexThousands,treeIndexSubThousands);}highp float unpackTreeIndex(highp vec2 treeIndexPacked){highp float treeIndex=round(treeIndexPacked.x)*1000.0+round(treeIndexPacked.y);return treeIndex;}uniform sampler2D colorDataTexture;uniform sampler2D matCapTexture;uniform vec2 treeIndexTextureSize;uniform mat4 projectionMatrix;uniform lowp int renderMode;float computeFragmentDepth(vec3 p,mat4 projectionMatrix){float projected_intersection_z=projectionMatrix[0][2]*p.x+projectionMatrix[1][2]*p.y+projectionMatrix[2][2]*p.z+projectionMatrix[3][2];float projected_intersection_w=projectionMatrix[0][3]*p.x+projectionMatrix[1][3]*p.y+projectionMatrix[2][3]*p.z+projectionMatrix[3][3];return((gl_DepthRange.diff*(projected_intersection_z/projected_intersection_w))+gl_DepthRange.near+gl_DepthRange.far)*.5;}float updateFragmentDepth(vec3 p,mat4 projectionMatrix){gl_FragDepth=computeFragmentDepth(p,projectionMatrix);return gl_FragDepth;}in vec4 center;in float hRadius;in float height;in vec4 U;in vec4 V;in vec4 sphereNormal;in vec3 v_color;in vec3 v_normal;in highp vec2 v_treeIndexPacked;void main(){highp float v_treeIndex=unpackTreeIndex(v_treeIndexPacked);NodeAppearance appearance=determineNodeAppearance(colorDataTexture,treeIndexTextureSize,v_treeIndex);vec4 color=determineColor(v_color,appearance);vec3 normal=normalize(sphereNormal.xyz);float vRadius=center.w;float ratio=vRadius/hRadius;mat3 basis=mat3(U.xyz,V.xyz,sphereNormal.xyz);mat3 scaledBasis=mat3(ratio*U.xyz,ratio*V.xyz,sphereNormal.xyz);vec3 surfacePoint=vec3(U.w,V.w,sphereNormal.w);vec3 rayTarget=surfacePoint;\n#if defined(COGNITE_ORTHOGRAPHIC_CAMERA)\nvec3 rayDirection=vec3(0.0,0.0,-1.0);\n#else\nvec3 rayDirection=normalize(rayTarget);\n#endif\nvec3 diff=rayTarget-center.xyz;vec3 E=diff*scaledBasis;vec3 D=rayDirection*scaledBasis;float a=dot(D,D);float b=dot(E,D);float c=dot(E,E)-vRadius*vRadius;float d=b*b-a*c;if(d<0.0)discard;float sqrtd=sqrt(d);float dist1=(-b-sqrtd)/a;float dist2=(-b+sqrtd)/a;if(dist2<dist1){float tmp=dist1;dist1=dist2;dist2=tmp;}float dist=dist1;float intersectionPointZ=E.z+dist*D.z;vec3 p=rayTarget+dist*rayDirection;if(intersectionPointZ<=vRadius-height||intersectionPointZ>vRadius||isClipped(p)){dist=dist2;intersectionPointZ=E.z+dist*D.z;p=rayTarget+dist*rayDirection;if(intersectionPointZ<=vRadius-height||intersectionPointZ>vRadius||isClipped(p)){discard;}}\n#if !defined(COGNITE_RENDER_COLOR_ID) && !defined(COGNITE_RENDER_DEPTH)\nnormal=vec3(p-center.xyz)*basis;normal.z=normal.z*(hRadius/vRadius)*(hRadius/vRadius);normal=normalize(basis*normal);if(dot(normal,rayDirection)>0.){normal=-normal;}\n#endif\nfloat fragDepth=updateFragmentDepth(p,projectionMatrix);updateFragmentColor(renderMode,color,v_treeIndex,normal,fragDepth,matCapTexture,GeometryType.Primitive);}", gn = "vec3 mul3(mat4 M,vec3 v){vec4 u=M*vec4(v,1.0);return u.xyz/u.w;}mat4 determineMatrixOverride(float treeIndex,vec2 treeIndexTextureSize,sampler2D transformOverrideIndexTexture,vec2 transformOverrideTextureSize,sampler2D transformOverrideTexture){float dataTextureWidth=treeIndexTextureSize.x;float dataTextureHeight=treeIndexTextureSize.y;int xTreeIndexTextureCoord=int(mod(treeIndex,dataTextureWidth));int yTreeIndexTextureCoord=int(floor(treeIndex/dataTextureWidth));float index=texelFetch(transformOverrideIndexTexture,ivec2(xTreeIndexTextureCoord,yTreeIndexTextureCoord),0).r;if(index==0.0){return mat4(1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0);}index-=1.0;float matrixElements[12];for(int i=0;i<12;i++){matrixElements[i]=texelFetch(transformOverrideTexture,ivec2(i+int(index)*16,0.0),0).r;}return mat4(matrixElements[0],matrixElements[4],matrixElements[8],0,matrixElements[1],matrixElements[5],matrixElements[9],0,matrixElements[2],matrixElements[6],matrixElements[10],0,matrixElements[3],matrixElements[7],matrixElements[11],1);}struct UnusedTreeIndexPacked{highp float thousands;highp float subThousands;};highp vec2 packTreeIndex(float treeIndex){highp float roundedTreeIndex=round(treeIndex);highp float treeIndexThousands=floor(roundedTreeIndex/1000.0);highp float treeIndexSubThousands=mod(roundedTreeIndex,1000.0);return vec2(treeIndexThousands,treeIndexSubThousands);}highp float unpackTreeIndex(highp vec2 treeIndexPacked){highp float treeIndex=round(treeIndexPacked.x)*1000.0+round(treeIndexPacked.y);return treeIndex;}const int RenderTypeColor=1;const int RenderTypeNormal=2;const int RenderTypeTreeIndex=3;const int RenderTypePackColorAndNormal=4;const int RenderTypeDepth=5;const int RenderTypeEffects=6;const int RenderTypeGhost=7;const int RenderTypeLOD=8;const int RenderTypeDepthBufferOnly=9;const int RenderTypeGeometryType=10;struct NodeAppearance{vec4 colorTexel;bool isVisible;bool renderInFront;bool renderGhosted;};float floatBitsSubset(float inNumber,int fromLeastSignificantBitIndex,int toMostSignificantBitIndex){float r=float(fromLeastSignificantBitIndex);float l=float(toMostSignificantBitIndex);float bitShift=pow(2.0,r);return mod(((inNumber-mod(inNumber,bitShift))/bitShift),pow(2.0,l - r));}NodeAppearance nodeAppearanceFromTexel(vec4 nodeAppearanceTexel){float alphaUnwrapped=floor((nodeAppearanceTexel.a*255.0)+0.5);bool isVisible=floatBitsSubset(alphaUnwrapped,0,1)==1.0;bool renderInFront=floatBitsSubset(alphaUnwrapped,1,2)==1.0;bool renderGhosted=floatBitsSubset(alphaUnwrapped,2,3)==1.0;return NodeAppearance(nodeAppearanceTexel,isVisible,renderInFront,renderGhosted);}NodeAppearance determineNodeAppearance(sampler2D nodeAppearanceTexture,vec2 textureSize,highp float treeIndex){highp int dataTextureWidth=int(textureSize.x);highp int dataTextureHeight=int(textureSize.y);highp int iTreeIndex=int(treeIndex);highp int xTreeIndexTextureCoord=iTreeIndex % dataTextureWidth;highp int yTreeIndexTextureCoord=iTreeIndex/dataTextureWidth;vec4 texel=texelFetch(nodeAppearanceTexture,ivec2(xTreeIndexTextureCoord,yTreeIndexTextureCoord),0);return nodeAppearanceFromTexel(texel);}bool determineVisibility(NodeAppearance nodeAppearance,int renderMode){bool visible=nodeAppearance.isVisible;bool ghost=(renderMode==RenderTypeGhost)&&nodeAppearance.renderGhosted;bool inFront=(renderMode==RenderTypeEffects)&&nodeAppearance.renderInFront;bool back=(renderMode==RenderTypeColor)&&!nodeAppearance.renderGhosted&&!nodeAppearance.renderInFront;bool other=(renderMode!=RenderTypeColor&&renderMode!=RenderTypeEffects&&renderMode!=RenderTypeGhost)&&!nodeAppearance.renderGhosted;return visible&&(ghost||inFront||back||other);}uniform mat4 inverseModelMatrix;uniform mat4 inverseNormalMatrix;uniform mat4 modelViewMatrix;uniform mat4 projectionMatrix;uniform mat3 normalMatrix;uniform vec3 cameraPosition;uniform vec2 treeIndexTextureSize;uniform vec2 transformOverrideTextureSize;uniform sampler2D transformOverrideIndexTexture;uniform sampler2D transformOverrideTexture;uniform sampler2D colorDataTexture;uniform lowp int renderMode;in vec3 position;in float a_treeIndex;in vec3 a_color;in vec3 a_center;in vec3 a_normal;in float a_horizontalRadius;in float a_verticalRadius;in float a_height;out vec4 center;out float hRadius;out float height;out vec4 U;out vec4 V;out vec4 sphereNormal;out vec3 v_color;out vec3 v_normal;out highp vec2 v_treeIndexPacked;void main(){NodeAppearance appearance=determineNodeAppearance(colorDataTexture,treeIndexTextureSize,a_treeIndex);if(!determineVisibility(appearance,renderMode)){gl_Position=vec4(2.0,2.0,2.0,1.0);return;}v_treeIndexPacked=packTreeIndex(a_treeIndex);mat4 treeIndexWorldTransform=determineMatrixOverride(a_treeIndex,treeIndexTextureSize,transformOverrideIndexTexture,transformOverrideTextureSize,transformOverrideTexture);vec3 centerWithOffset=mul3(treeIndexWorldTransform,a_center).xyz;vec3 normalWithOffset=(treeIndexWorldTransform*vec4(a_normal,0)).xyz;vec3 lDir;float distanceToCenterOfSegment=a_verticalRadius-a_height*0.5;vec3 centerOfSegment=centerWithOffset+normalWithOffset*distanceToCenterOfSegment;\n#if defined(COGNITE_ORTHOGRAPHIC_CAMERA)\nvec3 objectToCameraModelSpace=inverseNormalMatrix*vec3(0.0,0.0,1.0);\n#else\nvec3 rayOrigin=(inverseModelMatrix*vec4(cameraPosition,1.0)).xyz;vec3 objectToCameraModelSpace=rayOrigin-centerOfSegment;\n#endif\nvec3 newPosition=position;float bb=dot(objectToCameraModelSpace,normalWithOffset);if(bb<0.0){lDir=-normalWithOffset;}else{lDir=normalWithOffset;}vec3 left=normalize(cross(objectToCameraModelSpace,lDir));vec3 up=normalize(cross(left,lDir));newPosition.x*=1.0-(a_verticalRadius*(position.x+1.0)*0.0025/a_height);float ratio=max(0.0,1.0-a_height/a_verticalRadius);float maxRadiusOfSegment=a_horizontalRadius*sqrt(1.0-ratio*ratio);vec3 displacement=vec3(newPosition.x*a_height*0.5,maxRadiusOfSegment*newPosition.y,maxRadiusOfSegment*newPosition.z);vec3 surfacePoint=centerOfSegment+mat3(lDir,left,up)*displacement;vec3 transformed=surfacePoint;surfacePoint=mul3(modelViewMatrix,surfacePoint);center.xyz=mul3(modelViewMatrix,centerWithOffset);center.w=a_verticalRadius;hRadius=a_horizontalRadius;height=a_height;v_color=a_color;sphereNormal.xyz=normalMatrix*normalWithOffset;U.xyz=normalMatrix*up;V.xyz=normalMatrix*left;U.w=surfacePoint.x;V.w=surfacePoint.y;sphereNormal.w=surfacePoint.z;vec4 mvPosition=modelViewMatrix*vec4(transformed,1.0);gl_Position=projectionMatrix*mvPosition;}", _n = "precision highp float;struct NodeAppearance{vec4 colorTexel;bool isVisible;bool renderInFront;bool renderGhosted;};vec3 rgb2hsv(vec3 c){vec4 K=vec4(0.0,-1.0/3.0,2.0/3.0,-1.0);vec4 p=mix(vec4(c.bg,K.wz),vec4(c.gb,K.xy),step(c.b,c.g));vec4 q=mix(vec4(p.xyw,c.r),vec4(c.r,p.yzx),step(p.x,c.r));float d=q.x-min(q.w,q.y);float e=1.0e-10;return vec3(abs(q.z+(q.w-q.y)/(6.0*d+e)),d/(q.x+e),q.x);}vec3 hsv2rgb(vec3 c){vec4 K=vec4(1.0,2.0/3.0,1.0/3.0,3.0);vec3 p=abs(fract(c.xxx+K.xyz)*6.0-K.www);return c.z*mix(K.xxx,clamp(p-K.xxx,0.0,1.0),c.y);}vec3 packIntToColor(float number){float r=floor(number/(255.0*255.0))/255.0;float g=mod(floor(number/255.0),255.0)/255.0;float b=mod(number,255.0)/255.0;return vec3(r,g,b);}struct GeometryTypeEnum{int Quad;int Primitive;int TriangleMesh;int InstancedMesh;};const GeometryTypeEnum GeometryType=GeometryTypeEnum(1,2,3,4);const int RenderTypeColor=1;const int RenderTypeNormal=2;const int RenderTypeTreeIndex=3;const int RenderTypePackColorAndNormal=4;const int RenderTypeDepth=5;const int RenderTypeEffects=6;const int RenderTypeGhost=7;const int RenderTypeLOD=8;const int RenderTypeDepthBufferOnly=9;const int RenderTypeGeometryType=10;\n#include <packing>\nout vec4 outputColor;vec3 packNormalToRgb(const in vec3 normal){return normalize(normal)*0.5+0.5;}void updateFragmentColor(int renderMode,vec4 color,float treeIndex,vec3 normal,float depth,sampler2D matCapTexture,int geometryType){if(renderMode==RenderTypeColor||renderMode==RenderTypeEffects){\n#if defined(IS_TEXTURED)\nvec3 colorRGB=color.rgb;\n#else\nvec3 hsv=rgb2hsv(color.rgb);hsv.z=min(0.5*hsv.z+0.5,1.0);vec3 colorRGB=hsv2rgb(hsv);\n#endif\nfloat amplitude=max(0.0,dot(normal,vec3(0.0,0.0,1.0)));vec4 albedo=vec4(colorRGB*(0.4+0.6*amplitude),1.0);vec2 cap=normal.xy*0.5+0.5;vec4 mc=vec4(texture(matCapTexture,cap).rgb,1.0);outputColor=vec4(albedo.rgb*mc.rgb*1.7,color.a);}else if(renderMode==RenderTypeGhost){float amplitude=max(0.0,dot(normal,vec3(0.0,0.0,1.0)));float s=0.4+0.6*amplitude;outputColor=vec4(vec3(s),0.3);}else if(renderMode==RenderTypeDepthBufferOnly){outputColor=vec4(1.0,0.0,1.0,1.0);}else if(renderMode==RenderTypePackColorAndNormal){vec3 hsv=rgb2hsv(color.rgb);float a=0.0;if(hsv.y>0.01){if(hsv.z>0.5){a=(0.55+hsv.x*0.45);}else{a=(0.1+hsv.x*0.45);}}else{a=hsv.z*0.09;}outputColor=vec4(packNormalToRgb(normal.rgb),color.a);}else if(renderMode==RenderTypeNormal){outputColor=vec4(packNormalToRgb(normal),color.a);}else if(renderMode==RenderTypeTreeIndex){outputColor=vec4(packIntToColor(treeIndex),color.a);}else if(renderMode==RenderTypeDepth){outputColor=packDepthToRGBA(depth);}else if(renderMode==RenderTypeLOD){bool isHighDetail=geometryType!=GeometryType.Quad;vec2 cap=normal.xy*0.5+0.5;vec3 mc=texture(matCapTexture,cap).rgb*1.5;outputColor=isHighDetail ? vec4(vec3(0.0,1.0,0.0)*mc,color.a): vec4(vec3(1.0,1.0,0.0)*mc,color.a);}else if(renderMode==RenderTypeGeometryType){vec2 cap=normal.xy*0.5+0.5;vec3 mc=texture(matCapTexture,cap).rgb;vec3 geometryColor=float(geometryType==1)*vec3(1.0,0.0,0.0)+float(geometryType==2)*vec3(0.0,1.0,0.0)+float(geometryType==3)*vec3(0.0,0.0,1.0)+float(geometryType==4)*vec3(1.0,1.0,0.0);outputColor=vec4(geometryColor*mc,color.a);}else{outputColor=vec4(1.0,0.0,1.0,1.0);}}float floatBitsSubset(float inNumber,int fromLeastSignificantBitIndex,int toMostSignificantBitIndex){float r=float(fromLeastSignificantBitIndex);float l=float(toMostSignificantBitIndex);float bitShift=pow(2.0,r);return mod(((inNumber-mod(inNumber,bitShift))/bitShift),pow(2.0,l - r));}NodeAppearance nodeAppearanceFromTexel(vec4 nodeAppearanceTexel){float alphaUnwrapped=floor((nodeAppearanceTexel.a*255.0)+0.5);bool isVisible=floatBitsSubset(alphaUnwrapped,0,1)==1.0;bool renderInFront=floatBitsSubset(alphaUnwrapped,1,2)==1.0;bool renderGhosted=floatBitsSubset(alphaUnwrapped,2,3)==1.0;return NodeAppearance(nodeAppearanceTexel,isVisible,renderInFront,renderGhosted);}NodeAppearance determineNodeAppearance(sampler2D nodeAppearanceTexture,vec2 textureSize,highp float treeIndex){highp int dataTextureWidth=int(textureSize.x);highp int dataTextureHeight=int(textureSize.y);highp int iTreeIndex=int(treeIndex);highp int xTreeIndexTextureCoord=iTreeIndex % dataTextureWidth;highp int yTreeIndexTextureCoord=iTreeIndex/dataTextureWidth;vec4 texel=texelFetch(nodeAppearanceTexture,ivec2(xTreeIndexTextureCoord,yTreeIndexTextureCoord),0);return nodeAppearanceFromTexel(texel);}vec4 determineColor(vec3 originalColor,NodeAppearance nodeAppearance){vec4 overrideColor=nodeAppearance.colorTexel;if(any(greaterThan(overrideColor.rgb,vec3(0.0)))){return overrideColor;}return vec4(originalColor.rgb,overrideColor.a);}\n#if NUM_CLIPPING_PLANES > 0\nuniform vec4 clippingPlanes[NUM_CLIPPING_PLANES];\n#endif\nbool isClipped(vec3 point){\n#if NUM_CLIPPING_PLANES > 0\nvec3 pointFlipped=-point;vec4 plane;for(int i=0;i<UNION_CLIPPING_PLANES;i++){plane=clippingPlanes[i];if(dot(pointFlipped,plane.xyz)>plane.w)return true;}\n#if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES\nbool clipped=true;for(int i=UNION_CLIPPING_PLANES;i<NUM_CLIPPING_PLANES;i++){plane=clippingPlanes[i];clipped=(dot(pointFlipped,plane.xyz)>plane.w)&&clipped;}if(clipped)return true;\n#endif\n#endif\nreturn false;}struct UnusedTreeIndexPacked{highp float thousands;highp float subThousands;};highp vec2 packTreeIndex(float treeIndex){highp float roundedTreeIndex=round(treeIndex);highp float treeIndexThousands=floor(roundedTreeIndex/1000.0);highp float treeIndexSubThousands=mod(roundedTreeIndex,1000.0);return vec2(treeIndexThousands,treeIndexSubThousands);}highp float unpackTreeIndex(highp vec2 treeIndexPacked){highp float treeIndex=round(treeIndexPacked.x)*1000.0+round(treeIndexPacked.y);return treeIndex;}\n#define PI 3.14159265359\n#define PI2 6.28318530718\n#define PI_HALF 1.5707963267949\nuniform sampler2D colorDataTexture;uniform sampler2D matCapTexture;uniform vec2 treeIndexTextureSize;uniform mat4 projectionMatrix;uniform lowp int renderMode;float computeFragmentDepth(vec3 p,mat4 projectionMatrix){float projected_intersection_z=projectionMatrix[0][2]*p.x+projectionMatrix[1][2]*p.y+projectionMatrix[2][2]*p.z+projectionMatrix[3][2];float projected_intersection_w=projectionMatrix[0][3]*p.x+projectionMatrix[1][3]*p.y+projectionMatrix[2][3]*p.z+projectionMatrix[3][3];return((gl_DepthRange.diff*(projected_intersection_z/projected_intersection_w))+gl_DepthRange.near+gl_DepthRange.far)*.5;}float updateFragmentDepth(vec3 p,mat4 projectionMatrix){gl_FragDepth=computeFragmentDepth(p,projectionMatrix);return gl_FragDepth;}in highp vec2 v_treeIndexPacked;in vec3 v_color;in vec3 v_viewPos;in mat3 v_modelBasis;in vec3 v_centerB;in vec2 v_angles;in vec4 v_planeA;in vec4 v_planeB;in float v_radius;void main(){highp float v_treeIndex=unpackTreeIndex(v_treeIndexPacked);NodeAppearance appearance=determineNodeAppearance(colorDataTexture,treeIndexTextureSize,v_treeIndex);vec4 color=determineColor(v_color,appearance);vec3 rayTarget=v_viewPos;vec3 rayDirection=normalize(rayTarget);float rayTargetDist=length(rayTarget);vec3 diff=rayTarget-v_centerB;vec3 E=diff*v_modelBasis;vec3 D=rayDirection*v_modelBasis;float a=dot(D.xy,D.xy);float b=dot(E.xy,D.xy);float c=dot(E.xy,E.xy)-v_radius*v_radius;float d=b*b-a*c;if(d<0.0)discard;float sqrtd=sqrt(d);float dist1=(-b-sqrtd)/a;float dist2=(-b+sqrtd)/a;float dist=min(dist1,dist2);vec3 intersectionPoint=E+dist*D;float theta=atan(intersectionPoint.y,intersectionPoint.x);theta+=theta<v_angles[0]? 2.0*PI : 0.0;theta+=theta<v_angles[0]? 2.0*PI : 0.0;vec3 p=rayTarget+dist*rayDirection;vec3 planeACenter=vec3(0.0,0.0,v_planeA.w);vec3 planeANormal=v_planeA.xyz;vec3 planeBCenter=vec3(0.0,0.0,v_planeB.w);vec3 planeBNormal=v_planeB.xyz;float normalFactor=1.0;if(dot(intersectionPoint-planeACenter,planeANormal)>0.0||dot(intersectionPoint-planeBCenter,planeBNormal)>0.0||theta>v_angles[1]+v_angles[0]||isClipped(p)||rayTargetDist+dist<0.0){dist=max(dist1,dist2);intersectionPoint=E+dist*D;theta=atan(intersectionPoint.y,intersectionPoint.x);theta+=theta<0.0 ? 2.0*PI : 0.0;theta+=theta<v_angles[0]? 2.0*PI : 0.0;p=rayTarget+dist*rayDirection;if(dot(intersectionPoint-planeACenter,planeANormal)>0.0||dot(intersectionPoint-planeBCenter,planeBNormal)>0.0||theta>v_angles[1]+v_angles[0]||isClipped(p)||rayTargetDist+dist<0.0){discard;}normalFactor=-1.0;}vec3 p_local=p-v_centerB;vec3 normal=normalize(p_local-v_modelBasis[2]*dot(p_local,v_modelBasis[2]))*normalFactor;float fragDepth=updateFragmentDepth(p,projectionMatrix);updateFragmentColor(renderMode,color,v_treeIndex,normal,fragDepth,matCapTexture,GeometryType.Primitive);}", vn = "vec3 mul3(mat4 M,vec3 v){vec4 u=M*vec4(v,1.0);return u.xyz/u.w;}bool isWithinSpan(vec3 point,vec3 span){return all(lessThan(abs(point),span));}vec3 transformQuadToCoverScreenInViewSpace(vec3 position,mat4 projectionMatrix,float near){float tanFov=1.0/projectionMatrix[1][1];float aspect=projectionMatrix[1][1]/projectionMatrix[0][0];float maxAspect=max(aspect,1.0/aspect);vec3 fullScreenQuadCorner=vec3(position.xy*maxAspect*tanFov*near,-near - 1e-6);return fullScreenQuadCorner;}mat4 determineMatrixOverride(float treeIndex,vec2 treeIndexTextureSize,sampler2D transformOverrideIndexTexture,vec2 transformOverrideTextureSize,sampler2D transformOverrideTexture){float dataTextureWidth=treeIndexTextureSize.x;float dataTextureHeight=treeIndexTextureSize.y;int xTreeIndexTextureCoord=int(mod(treeIndex,dataTextureWidth));int yTreeIndexTextureCoord=int(floor(treeIndex/dataTextureWidth));float index=texelFetch(transformOverrideIndexTexture,ivec2(xTreeIndexTextureCoord,yTreeIndexTextureCoord),0).r;if(index==0.0){return mat4(1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0);}index-=1.0;float matrixElements[12];for(int i=0;i<12;i++){matrixElements[i]=texelFetch(transformOverrideTexture,ivec2(i+int(index)*16,0.0),0).r;}return mat4(matrixElements[0],matrixElements[4],matrixElements[8],0,matrixElements[1],matrixElements[5],matrixElements[9],0,matrixElements[2],matrixElements[6],matrixElements[10],0,matrixElements[3],matrixElements[7],matrixElements[11],1);}struct UnusedTreeIndexPacked{highp float thousands;highp float subThousands;};highp vec2 packTreeIndex(float treeIndex){highp float roundedTreeIndex=round(treeIndex);highp float treeIndexThousands=floor(roundedTreeIndex/1000.0);highp float treeIndexSubThousands=mod(roundedTreeIndex,1000.0);return vec2(treeIndexThousands,treeIndexSubThousands);}highp float unpackTreeIndex(highp vec2 treeIndexPacked){highp float treeIndex=round(treeIndexPacked.x)*1000.0+round(treeIndexPacked.y);return treeIndex;}const int RenderTypeColor=1;const int RenderTypeNormal=2;const int RenderTypeTreeIndex=3;const int RenderTypePackColorAndNormal=4;const int RenderTypeDepth=5;const int RenderTypeEffects=6;const int RenderTypeGhost=7;const int RenderTypeLOD=8;const int RenderTypeDepthBufferOnly=9;const int RenderTypeGeometryType=10;struct NodeAppearance{vec4 colorTexel;bool isVisible;bool renderInFront;bool renderGhosted;};float floatBitsSubset(float inNumber,int fromLeastSignificantBitIndex,int toMostSignificantBitIndex){float r=float(fromLeastSignificantBitIndex);float l=float(toMostSignificantBitIndex);float bitShift=pow(2.0,r);return mod(((inNumber-mod(inNumber,bitShift))/bitShift),pow(2.0,l - r));}NodeAppearance nodeAppearanceFromTexel(vec4 nodeAppearanceTexel){float alphaUnwrapped=floor((nodeAppearanceTexel.a*255.0)+0.5);bool isVisible=floatBitsSubset(alphaUnwrapped,0,1)==1.0;bool renderInFront=floatBitsSubset(alphaUnwrapped,1,2)==1.0;bool renderGhosted=floatBitsSubset(alphaUnwrapped,2,3)==1.0;return NodeAppearance(nodeAppearanceTexel,isVisible,renderInFront,renderGhosted);}NodeAppearance determineNodeAppearance(sampler2D nodeAppearanceTexture,vec2 textureSize,highp float treeIndex){highp int dataTextureWidth=int(textureSize.x);highp int dataTextureHeight=int(textureSize.y);highp int iTreeIndex=int(treeIndex);highp int xTreeIndexTextureCoord=iTreeIndex % dataTextureWidth;highp int yTreeIndexTextureCoord=iTreeIndex/dataTextureWidth;vec4 texel=texelFetch(nodeAppearanceTexture,ivec2(xTreeIndexTextureCoord,yTreeIndexTextureCoord),0);return nodeAppearanceFromTexel(texel);}bool determineVisibility(NodeAppearance nodeAppearance,int renderMode){bool visible=nodeAppearance.isVisible;bool ghost=(renderMode==RenderTypeGhost)&&nodeAppearance.renderGhosted;bool inFront=(renderMode==RenderTypeEffects)&&nodeAppearance.renderInFront;bool back=(renderMode==RenderTypeColor)&&!nodeAppearance.renderGhosted&&!nodeAppearance.renderInFront;bool other=(renderMode!=RenderTypeColor&&renderMode!=RenderTypeEffects&&renderMode!=RenderTypeGhost)&&!nodeAppearance.renderGhosted;return visible&&(ghost||inFront||back||other);}uniform mat4 inverseModelMatrix;uniform mat4 modelViewMatrix;uniform mat4 projectionMatrix;uniform mat3 normalMatrix;uniform vec3 cameraPosition;uniform vec2 treeIndexTextureSize;uniform vec2 transformOverrideTextureSize;uniform sampler2D transformOverrideIndexTexture;uniform sampler2D transformOverrideTexture;uniform sampler2D colorDataTexture;uniform lowp int renderMode;in vec3 position;in vec3 normal;in float a_treeIndex;in vec3 a_centerA;in vec3 a_centerB;in float a_radius;in vec3 a_color;in vec4 a_planeA;in vec4 a_planeB;in vec3 a_localXAxis;in float a_angle;in float a_arcAngle;flat out float v_treeIndex;out vec3 v_centerB;out mat3 v_modelBasis;out vec3 v_viewPos;out vec4 v_planeA;out vec4 v_planeB;out vec2 v_angles;out vec3 v_color;out float v_radius;out highp vec2 v_treeIndexPacked;void main(){NodeAppearance appearance=determineNodeAppearance(colorDataTexture,treeIndexTextureSize,a_treeIndex);if(!determineVisibility(appearance,renderMode)){gl_Position=vec4(2.0,2.0,2.0,1.0);return;}v_treeIndexPacked=packTreeIndex(a_treeIndex);mat4 treeIndexWorldTransform=determineMatrixOverride(a_treeIndex,treeIndexTextureSize,transformOverrideIndexTexture,transformOverrideTextureSize,transformOverrideTexture);mat4 modelToView=modelViewMatrix*treeIndexWorldTransform;vec3 centerA=mul3(treeIndexWorldTransform,a_centerA);vec3 centerB=mul3(treeIndexWorldTransform,a_centerB);vec3 center=0.5*(centerA+centerB);float halfHeight=0.5*length(centerA-centerB);vec3 dir=normalize(centerA-centerB);vec3 rayOrigin=(inverseModelMatrix*vec4(cameraPosition,1.0)).xyz;vec3 objectToCameraModelSpace=rayOrigin-center;vec3 lDir=faceforward(dir,-objectToCameraModelSpace,dir);vec3 left=normalize(cross(objectToCameraModelSpace,lDir));vec3 up=normalize(cross(left,lDir));mat3 billboardWorldRotation=mat3(lDir,left,up);vec3 cylinderAxisScales=vec3(halfHeight,a_radius,a_radius);mat3 inverseBillboardWorldRotation=transpose(billboardWorldRotation);vec3 cameraPosInCylinderSpace=inverseBillboardWorldRotation*(rayOrigin-center);mat3 billboardWorldScaleRotation=mat3(halfHeight*lDir,a_radius*left,a_radius*up);vec3 localBillboardPosition=center+billboardWorldScaleRotation*position;vec3 viewBillboardPosition=mul3(modelViewMatrix,localBillboardPosition);float near=min(1.0,projectionMatrix[3][2]/(projectionMatrix[2][2]-1.0));if(isWithinSpan(cameraPosInCylinderSpace,cylinderAxisScales+vec3(near))){viewBillboardPosition=transformQuadToCoverScreenInViewSpace(position,projectionMatrix,near);}gl_Position=projectionMatrix*vec4(viewBillboardPosition,1.0);v_treeIndex=a_treeIndex;v_angles[0]=a_angle;v_angles[1]=a_arcAngle;v_modelBasis[0]=normalize(normalMatrix*(treeIndexWorldTransform*vec4(a_localXAxis,0.0)).xyz);v_modelBasis[2]=normalize(normalMatrix*dir);v_modelBasis[1]=normalize(cross(v_modelBasis[2],v_modelBasis[0]));float radius=length((modelViewMatrix*vec4(a_localXAxis*a_radius,0.0)).xyz);v_centerB=mul3(modelViewMatrix,centerB);v_radius=radius;float planeAngleA=acos(dot(normalize(a_planeA.xyz),normalize(vec3(0.0,0.0,1.0))));float planeAngleB=acos(dot(normalize(a_planeB.xyz),normalize(vec3(0.0,0.0,-1.0))));vec4 planeA=a_planeA;planeA.w=length((modelViewMatrix*vec4(halfHeight*2.0*dir,0.0)).xyz)-tan(planeAngleA)*radius;vec4 planeB=a_planeB;planeB.w=tan(planeAngleB)*radius;v_planeA=planeA;v_planeB=planeB;v_viewPos=viewBillboardPosition;v_color=a_color;}", yn = "precision highp float;struct NodeAppearance{vec4 colorTexel;bool isVisible;bool renderInFront;bool renderGhosted;};vec3 rgb2hsv(vec3 c){vec4 K=vec4(0.0,-1.0/3.0,2.0/3.0,-1.0);vec4 p=mix(vec4(c.bg,K.wz),vec4(c.gb,K.xy),step(c.b,c.g));vec4 q=mix(vec4(p.xyw,c.r),vec4(c.r,p.yzx),step(p.x,c.r));float d=q.x-min(q.w,q.y);float e=1.0e-10;return vec3(abs(q.z+(q.w-q.y)/(6.0*d+e)),d/(q.x+e),q.x);}vec3 hsv2rgb(vec3 c){vec4 K=vec4(1.0,2.0/3.0,1.0/3.0,3.0);vec3 p=abs(fract(c.xxx+K.xyz)*6.0-K.www);return c.z*mix(K.xxx,clamp(p-K.xxx,0.0,1.0),c.y);}vec3 packIntToColor(float number){float r=floor(number/(255.0*255.0))/255.0;float g=mod(floor(number/255.0),255.0)/255.0;float b=mod(number,255.0)/255.0;return vec3(r,g,b);}struct GeometryTypeEnum{int Quad;int Primitive;int TriangleMesh;int InstancedMesh;};const GeometryTypeEnum GeometryType=GeometryTypeEnum(1,2,3,4);const int RenderTypeColor=1;const int RenderTypeNormal=2;const int RenderTypeTreeIndex=3;const int RenderTypePackColorAndNormal=4;const int RenderTypeDepth=5;const int RenderTypeEffects=6;const int RenderTypeGhost=7;const int RenderTypeLOD=8;const int RenderTypeDepthBufferOnly=9;const int RenderTypeGeometryType=10;\n#include <packing>\nout vec4 outputColor;vec3 packNormalToRgb(const in vec3 normal){return normalize(normal)*0.5+0.5;}void updateFragmentColor(int renderMode,vec4 color,float treeIndex,vec3 normal,float depth,sampler2D matCapTexture,int geometryType){if(renderMode==RenderTypeColor||renderMode==RenderTypeEffects){\n#if defined(IS_TEXTURED)\nvec3 colorRGB=color.rgb;\n#else\nvec3 hsv=rgb2hsv(color.rgb);hsv.z=min(0.5*hsv.z+0.5,1.0);vec3 colorRGB=hsv2rgb(hsv);\n#endif\nfloat amplitude=max(0.0,dot(normal,vec3(0.0,0.0,1.0)));vec4 albedo=vec4(colorRGB*(0.4+0.6*amplitude),1.0);vec2 cap=normal.xy*0.5+0.5;vec4 mc=vec4(texture(matCapTexture,cap).rgb,1.0);outputColor=vec4(albedo.rgb*mc.rgb*1.7,color.a);}else if(renderMode==RenderTypeGhost){float amplitude=max(0.0,dot(normal,vec3(0.0,0.0,1.0)));float s=0.4+0.6*amplitude;outputColor=vec4(vec3(s),0.3);}else if(renderMode==RenderTypeDepthBufferOnly){outputColor=vec4(1.0,0.0,1.0,1.0);}else if(renderMode==RenderTypePackColorAndNormal){vec3 hsv=rgb2hsv(color.rgb);float a=0.0;if(hsv.y>0.01){if(hsv.z>0.5){a=(0.55+hsv.x*0.45);}else{a=(0.1+hsv.x*0.45);}}else{a=hsv.z*0.09;}outputColor=vec4(packNormalToRgb(normal.rgb),color.a);}else if(renderMode==RenderTypeNormal){outputColor=vec4(packNormalToRgb(normal),color.a);}else if(renderMode==RenderTypeTreeIndex){outputColor=vec4(packIntToColor(treeIndex),color.a);}else if(renderMode==RenderTypeDepth){outputColor=packDepthToRGBA(depth);}else if(renderMode==RenderTypeLOD){bool isHighDetail=geometryType!=GeometryType.Quad;vec2 cap=normal.xy*0.5+0.5;vec3 mc=texture(matCapTexture,cap).rgb*1.5;outputColor=isHighDetail ? vec4(vec3(0.0,1.0,0.0)*mc,color.a): vec4(vec3(1.0,1.0,0.0)*mc,color.a);}else if(renderMode==RenderTypeGeometryType){vec2 cap=normal.xy*0.5+0.5;vec3 mc=texture(matCapTexture,cap).rgb;vec3 geometryColor=float(geometryType==1)*vec3(1.0,0.0,0.0)+float(geometryType==2)*vec3(0.0,1.0,0.0)+float(geometryType==3)*vec3(0.0,0.0,1.0)+float(geometryType==4)*vec3(1.0,1.0,0.0);outputColor=vec4(geometryColor*mc,color.a);}else{outputColor=vec4(1.0,0.0,1.0,1.0);}}float floatBitsSubset(float inNumber,int fromLeastSignificantBitIndex,int toMostSignificantBitIndex){float r=float(fromLeastSignificantBitIndex);float l=float(toMostSignificantBitIndex);float bitShift=pow(2.0,r);return mod(((inNumber-mod(inNumber,bitShift))/bitShift),pow(2.0,l - r));}NodeAppearance nodeAppearanceFromTexel(vec4 nodeAppearanceTexel){float alphaUnwrapped=floor((nodeAppearanceTexel.a*255.0)+0.5);bool isVisible=floatBitsSubset(alphaUnwrapped,0,1)==1.0;bool renderInFront=floatBitsSubset(alphaUnwrapped,1,2)==1.0;bool renderGhosted=floatBitsSubset(alphaUnwrapped,2,3)==1.0;return NodeAppearance(nodeAppearanceTexel,isVisible,renderInFront,renderGhosted);}NodeAppearance determineNodeAppearance(sampler2D nodeAppearanceTexture,vec2 textureSize,highp float treeIndex){highp int dataTextureWidth=int(textureSize.x);highp int dataTextureHeight=int(textureSize.y);highp int iTreeIndex=int(treeIndex);highp int xTreeIndexTextureCoord=iTreeIndex % dataTextureWidth;highp int yTreeIndexTextureCoord=iTreeIndex/dataTextureWidth;vec4 texel=texelFetch(nodeAppearanceTexture,ivec2(xTreeIndexTextureCoord,yTreeIndexTextureCoord),0);return nodeAppearanceFromTexel(texel);}vec4 determineColor(vec3 originalColor,NodeAppearance nodeAppearance){vec4 overrideColor=nodeAppearance.colorTexel;if(any(greaterThan(overrideColor.rgb,vec3(0.0)))){return overrideColor;}return vec4(originalColor.rgb,overrideColor.a);}\n#if NUM_CLIPPING_PLANES > 0\nuniform vec4 clippingPlanes[NUM_CLIPPING_PLANES];\n#endif\nbool isClipped(vec3 point){\n#if NUM_CLIPPING_PLANES > 0\nvec3 pointFlipped=-point;vec4 plane;for(int i=0;i<UNION_CLIPPING_PLANES;i++){plane=clippingPlanes[i];if(dot(pointFlipped,plane.xyz)>plane.w)return true;}\n#if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES\nbool clipped=true;for(int i=UNION_CLIPPING_PLANES;i<NUM_CLIPPING_PLANES;i++){plane=clippingPlanes[i];clipped=(dot(pointFlipped,plane.xyz)>plane.w)&&clipped;}if(clipped)return true;\n#endif\n#endif\nreturn false;}struct UnusedTreeIndexPacked{highp float thousands;highp float subThousands;};highp vec2 packTreeIndex(float treeIndex){highp float roundedTreeIndex=round(treeIndex);highp float treeIndexThousands=floor(roundedTreeIndex/1000.0);highp float treeIndexSubThousands=mod(roundedTreeIndex,1000.0);return vec2(treeIndexThousands,treeIndexSubThousands);}highp float unpackTreeIndex(highp vec2 treeIndexPacked){highp float treeIndex=round(treeIndexPacked.x)*1000.0+round(treeIndexPacked.y);return treeIndex;}\n#define PI 3.14159265359\n#define PI2 6.28318530718\n#define PI_HALF 1.5707963267949\nuniform sampler2D colorDataTexture;uniform sampler2D matCapTexture;uniform vec2 treeIndexTextureSize;uniform lowp int renderMode;in float v_oneMinusThicknessSqr;in vec2 v_xy;in float v_angle;in float v_arcAngle;in vec3 v_color;in vec3 v_normal;in vec3 vViewPosition;in highp vec2 v_treeIndexPacked;void main(){highp float v_treeIndex=unpackTreeIndex(v_treeIndexPacked);NodeAppearance appearance=determineNodeAppearance(colorDataTexture,treeIndexTextureSize,v_treeIndex);if(isClipped(vViewPosition)){discard;}vec4 color=determineColor(v_color,appearance);float dist=dot(v_xy,v_xy);float theta=atan(v_xy.y,v_xy.x);vec3 normal=normalize(v_normal);theta+=theta<v_angle ? 2.0*PI : 0.0;theta+=theta<v_angle ? 2.0*PI : 0.0;if(dist>0.25||dist<0.25*v_oneMinusThicknessSqr||theta>=v_angle+v_arcAngle){discard;}updateFragmentColor(renderMode,color,v_treeIndex,normal,gl_FragCoord.z,matCapTexture,GeometryType.Primitive);}", bn = "mat4 determineMatrixOverride(float treeIndex,vec2 treeIndexTextureSize,sampler2D transformOverrideIndexTexture,vec2 transformOverrideTextureSize,sampler2D transformOverrideTexture){float dataTextureWidth=treeIndexTextureSize.x;float dataTextureHeight=treeIndexTextureSize.y;int xTreeIndexTextureCoord=int(mod(treeIndex,dataTextureWidth));int yTreeIndexTextureCoord=int(floor(treeIndex/dataTextureWidth));float index=texelFetch(transformOverrideIndexTexture,ivec2(xTreeIndexTextureCoord,yTreeIndexTextureCoord),0).r;if(index==0.0){return mat4(1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0);}index-=1.0;float matrixElements[12];for(int i=0;i<12;i++){matrixElements[i]=texelFetch(transformOverrideTexture,ivec2(i+int(index)*16,0.0),0).r;}return mat4(matrixElements[0],matrixElements[4],matrixElements[8],0,matrixElements[1],matrixElements[5],matrixElements[9],0,matrixElements[2],matrixElements[6],matrixElements[10],0,matrixElements[3],matrixElements[7],matrixElements[11],1);}struct UnusedTreeIndexPacked{highp float thousands;highp float subThousands;};highp vec2 packTreeIndex(float treeIndex){highp float roundedTreeIndex=round(treeIndex);highp float treeIndexThousands=floor(roundedTreeIndex/1000.0);highp float treeIndexSubThousands=mod(roundedTreeIndex,1000.0);return vec2(treeIndexThousands,treeIndexSubThousands);}highp float unpackTreeIndex(highp vec2 treeIndexPacked){highp float treeIndex=round(treeIndexPacked.x)*1000.0+round(treeIndexPacked.y);return treeIndex;}const int RenderTypeColor=1;const int RenderTypeNormal=2;const int RenderTypeTreeIndex=3;const int RenderTypePackColorAndNormal=4;const int RenderTypeDepth=5;const int RenderTypeEffects=6;const int RenderTypeGhost=7;const int RenderTypeLOD=8;const int RenderTypeDepthBufferOnly=9;const int RenderTypeGeometryType=10;struct NodeAppearance{vec4 colorTexel;bool isVisible;bool renderInFront;bool renderGhosted;};float floatBitsSubset(float inNumber,int fromLeastSignificantBitIndex,int toMostSignificantBitIndex){float r=float(fromLeastSignificantBitIndex);float l=float(toMostSignificantBitIndex);float bitShift=pow(2.0,r);return mod(((inNumber-mod(inNumber,bitShift))/bitShift),pow(2.0,l - r));}NodeAppearance nodeAppearanceFromTexel(vec4 nodeAppearanceTexel){float alphaUnwrapped=floor((nodeAppearanceTexel.a*255.0)+0.5);bool isVisible=floatBitsSubset(alphaUnwrapped,0,1)==1.0;bool renderInFront=floatBitsSubset(alphaUnwrapped,1,2)==1.0;bool renderGhosted=floatBitsSubset(alphaUnwrapped,2,3)==1.0;return NodeAppearance(nodeAppearanceTexel,isVisible,renderInFront,renderGhosted);}NodeAppearance determineNodeAppearance(sampler2D nodeAppearanceTexture,vec2 textureSize,highp float treeIndex){highp int dataTextureWidth=int(textureSize.x);highp int dataTextureHeight=int(textureSize.y);highp int iTreeIndex=int(treeIndex);highp int xTreeIndexTextureCoord=iTreeIndex % dataTextureWidth;highp int yTreeIndexTextureCoord=iTreeIndex/dataTextureWidth;vec4 texel=texelFetch(nodeAppearanceTexture,ivec2(xTreeIndexTextureCoord,yTreeIndexTextureCoord),0);return nodeAppearanceFromTexel(texel);}bool determineVisibility(NodeAppearance nodeAppearance,int renderMode){bool visible=nodeAppearance.isVisible;bool ghost=(renderMode==RenderTypeGhost)&&nodeAppearance.renderGhosted;bool inFront=(renderMode==RenderTypeEffects)&&nodeAppearance.renderInFront;bool back=(renderMode==RenderTypeColor)&&!nodeAppearance.renderGhosted&&!nodeAppearance.renderInFront;bool other=(renderMode!=RenderTypeColor&&renderMode!=RenderTypeEffects&&renderMode!=RenderTypeGhost)&&!nodeAppearance.renderGhosted;return visible&&(ghost||inFront||back||other);}uniform mat4 modelViewMatrix;uniform mat4 projectionMatrix;uniform mat3 normalMatrix;uniform vec2 treeIndexTextureSize;uniform vec2 transformOverrideTextureSize;uniform sampler2D transformOverrideIndexTexture;uniform sampler2D transformOverrideTexture;uniform sampler2D colorDataTexture;uniform lowp int renderMode;in vec3 position;in mat4 a_instanceMatrix;in float a_treeIndex;in vec3 a_color;in float a_angle;in float a_arcAngle;in float a_thickness;in vec3 a_normal;out float v_oneMinusThicknessSqr;out vec2 v_xy;out float v_angle;out float v_arcAngle;out vec3 v_color;out vec3 v_normal;out vec3 vViewPosition;out highp vec2 v_treeIndexPacked;void main(){NodeAppearance appearance=determineNodeAppearance(colorDataTexture,treeIndexTextureSize,a_treeIndex);if(!determineVisibility(appearance,renderMode)){gl_Position=vec4(2.0,2.0,2.0,1.0);return;}v_treeIndexPacked=packTreeIndex(a_treeIndex);v_oneMinusThicknessSqr=(1.0-a_thickness)*(1.0 - a_thickness);v_xy=vec2(position.x,position.y);v_angle=a_angle;v_arcAngle=a_arcAngle;mat4 treeIndexWorldTransform=determineMatrixOverride(a_treeIndex,treeIndexTextureSize,transformOverrideIndexTexture,transformOverrideTextureSize,transformOverrideTexture);vec3 transformed=(a_instanceMatrix*vec4(position,1.0)).xyz;vec4 mvPosition=modelViewMatrix*treeIndexWorldTransform*vec4(transformed,1.0);v_color=a_color;v_normal=normalMatrix*normalize(treeIndexWorldTransform*vec4(normalize(a_normal),0.0)).xyz;vViewPosition=mvPosition.xyz;gl_Position=projectionMatrix*mvPosition;}", xn = "precision highp float;vec3 rgb2hsv(vec3 c){vec4 K=vec4(0.0,-1.0/3.0,2.0/3.0,-1.0);vec4 p=mix(vec4(c.bg,K.wz),vec4(c.gb,K.xy),step(c.b,c.g));vec4 q=mix(vec4(p.xyw,c.r),vec4(c.r,p.yzx),step(p.x,c.r));float d=q.x-min(q.w,q.y);float e=1.0e-10;return vec3(abs(q.z+(q.w-q.y)/(6.0*d+e)),d/(q.x+e),q.x);}vec3 hsv2rgb(vec3 c){vec4 K=vec4(1.0,2.0/3.0,1.0/3.0,3.0);vec3 p=abs(fract(c.xxx+K.xyz)*6.0-K.www);return c.z*mix(K.xxx,clamp(p-K.xxx,0.0,1.0),c.y);}vec3 packIntToColor(float number){float r=floor(number/(255.0*255.0))/255.0;float g=mod(floor(number/255.0),255.0)/255.0;float b=mod(number,255.0)/255.0;return vec3(r,g,b);}struct GeometryTypeEnum{int Quad;int Primitive;int TriangleMesh;int InstancedMesh;};const GeometryTypeEnum GeometryType=GeometryTypeEnum(1,2,3,4);const int RenderTypeColor=1;const int RenderTypeNormal=2;const int RenderTypeTreeIndex=3;const int RenderTypePackColorAndNormal=4;const int RenderTypeDepth=5;const int RenderTypeEffects=6;const int RenderTypeGhost=7;const int RenderTypeLOD=8;const int RenderTypeDepthBufferOnly=9;const int RenderTypeGeometryType=10;\n#include <packing>\nout vec4 outputColor;vec3 packNormalToRgb(const in vec3 normal){return normalize(normal)*0.5+0.5;}void updateFragmentColor(int renderMode,vec4 color,float treeIndex,vec3 normal,float depth,sampler2D matCapTexture,int geometryType){if(renderMode==RenderTypeColor||renderMode==RenderTypeEffects){\n#if defined(IS_TEXTURED)\nvec3 colorRGB=color.rgb;\n#else\nvec3 hsv=rgb2hsv(color.rgb);hsv.z=min(0.5*hsv.z+0.5,1.0);vec3 colorRGB=hsv2rgb(hsv);\n#endif\nfloat amplitude=max(0.0,dot(normal,vec3(0.0,0.0,1.0)));vec4 albedo=vec4(colorRGB*(0.4+0.6*amplitude),1.0);vec2 cap=normal.xy*0.5+0.5;vec4 mc=vec4(texture(matCapTexture,cap).rgb,1.0);outputColor=vec4(albedo.rgb*mc.rgb*1.7,color.a);}else if(renderMode==RenderTypeGhost){float amplitude=max(0.0,dot(normal,vec3(0.0,0.0,1.0)));float s=0.4+0.6*amplitude;outputColor=vec4(vec3(s),0.3);}else if(renderMode==RenderTypeDepthBufferOnly){outputColor=vec4(1.0,0.0,1.0,1.0);}else if(renderMode==RenderTypePackColorAndNormal){vec3 hsv=rgb2hsv(color.rgb);float a=0.0;if(hsv.y>0.01){if(hsv.z>0.5){a=(0.55+hsv.x*0.45);}else{a=(0.1+hsv.x*0.45);}}else{a=hsv.z*0.09;}outputColor=vec4(packNormalToRgb(normal.rgb),color.a);}else if(renderMode==RenderTypeNormal){outputColor=vec4(packNormalToRgb(normal),color.a);}else if(renderMode==RenderTypeTreeIndex){outputColor=vec4(packIntToColor(treeIndex),color.a);}else if(renderMode==RenderTypeDepth){outputColor=packDepthToRGBA(depth);}else if(renderMode==RenderTypeLOD){bool isHighDetail=geometryType!=GeometryType.Quad;vec2 cap=normal.xy*0.5+0.5;vec3 mc=texture(matCapTexture,cap).rgb*1.5;outputColor=isHighDetail ? vec4(vec3(0.0,1.0,0.0)*mc,color.a): vec4(vec3(1.0,1.0,0.0)*mc,color.a);}else if(renderMode==RenderTypeGeometryType){vec2 cap=normal.xy*0.5+0.5;vec3 mc=texture(matCapTexture,cap).rgb;vec3 geometryColor=float(geometryType==1)*vec3(1.0,0.0,0.0)+float(geometryType==2)*vec3(0.0,1.0,0.0)+float(geometryType==3)*vec3(0.0,0.0,1.0)+float(geometryType==4)*vec3(1.0,1.0,0.0);outputColor=vec4(geometryColor*mc,color.a);}else{outputColor=vec4(1.0,0.0,1.0,1.0);}}struct NodeAppearance{vec4 colorTexel;bool isVisible;bool renderInFront;bool renderGhosted;};float floatBitsSubset(float inNumber,int fromLeastSignificantBitIndex,int toMostSignificantBitIndex){float r=float(fromLeastSignificantBitIndex);float l=float(toMostSignificantBitIndex);float bitShift=pow(2.0,r);return mod(((inNumber-mod(inNumber,bitShift))/bitShift),pow(2.0,l - r));}NodeAppearance nodeAppearanceFromTexel(vec4 nodeAppearanceTexel){float alphaUnwrapped=floor((nodeAppearanceTexel.a*255.0)+0.5);bool isVisible=floatBitsSubset(alphaUnwrapped,0,1)==1.0;bool renderInFront=floatBitsSubset(alphaUnwrapped,1,2)==1.0;bool renderGhosted=floatBitsSubset(alphaUnwrapped,2,3)==1.0;return NodeAppearance(nodeAppearanceTexel,isVisible,renderInFront,renderGhosted);}NodeAppearance determineNodeAppearance(sampler2D nodeAppearanceTexture,vec2 textureSize,highp float treeIndex){highp int dataTextureWidth=int(textureSize.x);highp int dataTextureHeight=int(textureSize.y);highp int iTreeIndex=int(treeIndex);highp int xTreeIndexTextureCoord=iTreeIndex % dataTextureWidth;highp int yTreeIndexTextureCoord=iTreeIndex/dataTextureWidth;vec4 texel=texelFetch(nodeAppearanceTexture,ivec2(xTreeIndexTextureCoord,yTreeIndexTextureCoord),0);return nodeAppearanceFromTexel(texel);}vec4 determineColor(vec3 originalColor,NodeAppearance nodeAppearance){vec4 overrideColor=nodeAppearance.colorTexel;if(any(greaterThan(overrideColor.rgb,vec3(0.0)))){return overrideColor;}return vec4(originalColor.rgb,overrideColor.a);}\n#if NUM_CLIPPING_PLANES > 0\nuniform vec4 clippingPlanes[NUM_CLIPPING_PLANES];\n#endif\nbool isClipped(vec3 point){\n#if NUM_CLIPPING_PLANES > 0\nvec3 pointFlipped=-point;vec4 plane;for(int i=0;i<UNION_CLIPPING_PLANES;i++){plane=clippingPlanes[i];if(dot(pointFlipped,plane.xyz)>plane.w)return true;}\n#if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES\nbool clipped=true;for(int i=UNION_CLIPPING_PLANES;i<NUM_CLIPPING_PLANES;i++){plane=clippingPlanes[i];clipped=(dot(pointFlipped,plane.xyz)>plane.w)&&clipped;}if(clipped)return true;\n#endif\n#endif\nreturn false;}struct UnusedTreeIndexPacked{highp float thousands;highp float subThousands;};highp vec2 packTreeIndex(float treeIndex){highp float roundedTreeIndex=round(treeIndex);highp float treeIndexThousands=floor(roundedTreeIndex/1000.0);highp float treeIndexSubThousands=mod(roundedTreeIndex,1000.0);return vec2(treeIndexThousands,treeIndexSubThousands);}highp float unpackTreeIndex(highp vec2 treeIndexPacked){highp float treeIndex=round(treeIndexPacked.x)*1000.0+round(treeIndexPacked.y);return treeIndex;}uniform sampler2D matCapTexture;uniform lowp int renderMode;in vec3 v_color;in vec3 v_normal;in vec3 vViewPosition;in vec4 v_nodeAppearanceTexel;in highp vec2 v_treeIndexPacked;void main(){highp float v_treeIndex=unpackTreeIndex(v_treeIndexPacked);NodeAppearance appearance=nodeAppearanceFromTexel(v_nodeAppearanceTexel);if(isClipped(vViewPosition)){discard;}vec4 color=determineColor(v_color,appearance);vec3 normal=normalize(v_normal);updateFragmentColor(renderMode,color,v_treeIndex,normal,gl_FragCoord.z,matCapTexture,GeometryType.Primitive);}", Sn = "mat4 determineMatrixOverride(float treeIndex,vec2 treeIndexTextureSize,sampler2D transformOverrideIndexTexture,vec2 transformOverrideTextureSize,sampler2D transformOverrideTexture){float dataTextureWidth=treeIndexTextureSize.x;float dataTextureHeight=treeIndexTextureSize.y;int xTreeIndexTextureCoord=int(mod(treeIndex,dataTextureWidth));int yTreeIndexTextureCoord=int(floor(treeIndex/dataTextureWidth));float index=texelFetch(transformOverrideIndexTexture,ivec2(xTreeIndexTextureCoord,yTreeIndexTextureCoord),0).r;if(index==0.0){return mat4(1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0);}index-=1.0;float matrixElements[12];for(int i=0;i<12;i++){matrixElements[i]=texelFetch(transformOverrideTexture,ivec2(i+int(index)*16,0.0),0).r;}return mat4(matrixElements[0],matrixElements[4],matrixElements[8],0,matrixElements[1],matrixElements[5],matrixElements[9],0,matrixElements[2],matrixElements[6],matrixElements[10],0,matrixElements[3],matrixElements[7],matrixElements[11],1);}struct UnusedTreeIndexPacked{highp float thousands;highp float subThousands;};highp vec2 packTreeIndex(float treeIndex){highp float roundedTreeIndex=round(treeIndex);highp float treeIndexThousands=floor(roundedTreeIndex/1000.0);highp float treeIndexSubThousands=mod(roundedTreeIndex,1000.0);return vec2(treeIndexThousands,treeIndexSubThousands);}highp float unpackTreeIndex(highp vec2 treeIndexPacked){highp float treeIndex=round(treeIndexPacked.x)*1000.0+round(treeIndexPacked.y);return treeIndex;}const int RenderTypeColor=1;const int RenderTypeNormal=2;const int RenderTypeTreeIndex=3;const int RenderTypePackColorAndNormal=4;const int RenderTypeDepth=5;const int RenderTypeEffects=6;const int RenderTypeGhost=7;const int RenderTypeLOD=8;const int RenderTypeDepthBufferOnly=9;const int RenderTypeGeometryType=10;struct NodeAppearance{vec4 colorTexel;bool isVisible;bool renderInFront;bool renderGhosted;};float floatBitsSubset(float inNumber,int fromLeastSignificantBitIndex,int toMostSignificantBitIndex){float r=float(fromLeastSignificantBitIndex);float l=float(toMostSignificantBitIndex);float bitShift=pow(2.0,r);return mod(((inNumber-mod(inNumber,bitShift))/bitShift),pow(2.0,l - r));}NodeAppearance nodeAppearanceFromTexel(vec4 nodeAppearanceTexel){float alphaUnwrapped=floor((nodeAppearanceTexel.a*255.0)+0.5);bool isVisible=floatBitsSubset(alphaUnwrapped,0,1)==1.0;bool renderInFront=floatBitsSubset(alphaUnwrapped,1,2)==1.0;bool renderGhosted=floatBitsSubset(alphaUnwrapped,2,3)==1.0;return NodeAppearance(nodeAppearanceTexel,isVisible,renderInFront,renderGhosted);}NodeAppearance determineNodeAppearance(sampler2D nodeAppearanceTexture,vec2 textureSize,highp float treeIndex){highp int dataTextureWidth=int(textureSize.x);highp int dataTextureHeight=int(textureSize.y);highp int iTreeIndex=int(treeIndex);highp int xTreeIndexTextureCoord=iTreeIndex % dataTextureWidth;highp int yTreeIndexTextureCoord=iTreeIndex/dataTextureWidth;vec4 texel=texelFetch(nodeAppearanceTexture,ivec2(xTreeIndexTextureCoord,yTreeIndexTextureCoord),0);return nodeAppearanceFromTexel(texel);}bool determineVisibility(NodeAppearance nodeAppearance,int renderMode){bool visible=nodeAppearance.isVisible;bool ghost=(renderMode==RenderTypeGhost)&&nodeAppearance.renderGhosted;bool inFront=(renderMode==RenderTypeEffects)&&nodeAppearance.renderInFront;bool back=(renderMode==RenderTypeColor)&&!nodeAppearance.renderGhosted&&!nodeAppearance.renderInFront;bool other=(renderMode!=RenderTypeColor&&renderMode!=RenderTypeEffects&&renderMode!=RenderTypeGhost)&&!nodeAppearance.renderGhosted;return visible&&(ghost||inFront||back||other);}uniform mat4 modelViewMatrix;uniform mat4 projectionMatrix;uniform mat3 normalMatrix;uniform vec2 treeIndexTextureSize;uniform vec2 transformOverrideTextureSize;uniform sampler2D transformOverrideIndexTexture;uniform sampler2D transformOverrideTexture;uniform sampler2D colorDataTexture;uniform lowp int renderMode;in vec3 position;in mat4 a_instanceMatrix;in float a_treeIndex;in vec3 a_color;in float a_arcAngle;in float a_radius;in float a_tubeRadius;out vec3 v_color;out vec3 v_normal;out vec3 vViewPosition;out vec4 v_nodeAppearanceTexel;out highp vec2 v_treeIndexPacked;void main(){NodeAppearance appearance=determineNodeAppearance(colorDataTexture,treeIndexTextureSize,a_treeIndex);if(!determineVisibility(appearance,renderMode)){gl_Position=vec4(2.0,2.0,2.0,1.0);return;}v_nodeAppearanceTexel=appearance.colorTexel;v_treeIndexPacked=packTreeIndex(a_treeIndex);float theta=position.x*a_arcAngle;float phi=position.y;float cosTheta=cos(theta);float sinTheta=sin(theta);vec3 pos3=vec3(0);pos3.x=(a_radius+a_tubeRadius*cos(phi))*cosTheta;pos3.y=(a_radius+a_tubeRadius*cos(phi))*sinTheta;pos3.z=a_tubeRadius*sin(phi);mat4 treeIndexWorldTransform=determineMatrixOverride(a_treeIndex,treeIndexTextureSize,transformOverrideIndexTexture,transformOverrideTextureSize,transformOverrideTexture);vec3 transformed=(a_instanceMatrix*vec4(pos3,1.0)).xyz;vec3 center=(a_instanceMatrix*vec4(a_radius*cosTheta,a_radius*sinTheta,0.0,1.0)).xyz;vec3 objectNormal=normalize(transformed.xyz-center);v_color=a_color;v_normal=normalMatrix*normalize(treeIndexWorldTransform*vec4(objectNormal,0.0)).xyz;vec4 modelViewPosition=modelViewMatrix*treeIndexWorldTransform*vec4(transformed,1.0);vViewPosition=modelViewPosition.xyz;gl_Position=projectionMatrix*modelViewPosition;}", Cn = "precision highp float;vec3 rgb2hsv(vec3 c){vec4 K=vec4(0.0,-1.0/3.0,2.0/3.0,-1.0);vec4 p=mix(vec4(c.bg,K.wz),vec4(c.gb,K.xy),step(c.b,c.g));vec4 q=mix(vec4(p.xyw,c.r),vec4(c.r,p.yzx),step(p.x,c.r));float d=q.x-min(q.w,q.y);float e=1.0e-10;return vec3(abs(q.z+(q.w-q.y)/(6.0*d+e)),d/(q.x+e),q.x);}vec3 hsv2rgb(vec3 c){vec4 K=vec4(1.0,2.0/3.0,1.0/3.0,3.0);vec3 p=abs(fract(c.xxx+K.xyz)*6.0-K.www);return c.z*mix(K.xxx,clamp(p-K.xxx,0.0,1.0),c.y);}vec3 packIntToColor(float number){float r=floor(number/(255.0*255.0))/255.0;float g=mod(floor(number/255.0),255.0)/255.0;float b=mod(number,255.0)/255.0;return vec3(r,g,b);}struct GeometryTypeEnum{int Quad;int Primitive;int TriangleMesh;int InstancedMesh;};const GeometryTypeEnum GeometryType=GeometryTypeEnum(1,2,3,4);const int RenderTypeColor=1;const int RenderTypeNormal=2;const int RenderTypeTreeIndex=3;const int RenderTypePackColorAndNormal=4;const int RenderTypeDepth=5;const int RenderTypeEffects=6;const int RenderTypeGhost=7;const int RenderTypeLOD=8;const int RenderTypeDepthBufferOnly=9;const int RenderTypeGeometryType=10;\n#include <packing>\nout vec4 outputColor;vec3 packNormalToRgb(const in vec3 normal){return normalize(normal)*0.5+0.5;}void updateFragmentColor(int renderMode,vec4 color,float treeIndex,vec3 normal,float depth,sampler2D matCapTexture,int geometryType){if(renderMode==RenderTypeColor||renderMode==RenderTypeEffects){\n#if defined(IS_TEXTURED)\nvec3 colorRGB=color.rgb;\n#else\nvec3 hsv=rgb2hsv(color.rgb);hsv.z=min(0.5*hsv.z+0.5,1.0);vec3 colorRGB=hsv2rgb(hsv);\n#endif\nfloat amplitude=max(0.0,dot(normal,vec3(0.0,0.0,1.0)));vec4 albedo=vec4(colorRGB*(0.4+0.6*amplitude),1.0);vec2 cap=normal.xy*0.5+0.5;vec4 mc=vec4(texture(matCapTexture,cap).rgb,1.0);outputColor=vec4(albedo.rgb*mc.rgb*1.7,color.a);}else if(renderMode==RenderTypeGhost){float amplitude=max(0.0,dot(normal,vec3(0.0,0.0,1.0)));float s=0.4+0.6*amplitude;outputColor=vec4(vec3(s),0.3);}else if(renderMode==RenderTypeDepthBufferOnly){outputColor=vec4(1.0,0.0,1.0,1.0);}else if(renderMode==RenderTypePackColorAndNormal){vec3 hsv=rgb2hsv(color.rgb);float a=0.0;if(hsv.y>0.01){if(hsv.z>0.5){a=(0.55+hsv.x*0.45);}else{a=(0.1+hsv.x*0.45);}}else{a=hsv.z*0.09;}outputColor=vec4(packNormalToRgb(normal.rgb),color.a);}else if(renderMode==RenderTypeNormal){outputColor=vec4(packNormalToRgb(normal),color.a);}else if(renderMode==RenderTypeTreeIndex){outputColor=vec4(packIntToColor(treeIndex),color.a);}else if(renderMode==RenderTypeDepth){outputColor=packDepthToRGBA(depth);}else if(renderMode==RenderTypeLOD){bool isHighDetail=geometryType!=GeometryType.Quad;vec2 cap=normal.xy*0.5+0.5;vec3 mc=texture(matCapTexture,cap).rgb*1.5;outputColor=isHighDetail ? vec4(vec3(0.0,1.0,0.0)*mc,color.a): vec4(vec3(1.0,1.0,0.0)*mc,color.a);}else if(renderMode==RenderTypeGeometryType){vec2 cap=normal.xy*0.5+0.5;vec3 mc=texture(matCapTexture,cap).rgb;vec3 geometryColor=float(geometryType==1)*vec3(1.0,0.0,0.0)+float(geometryType==2)*vec3(0.0,1.0,0.0)+float(geometryType==3)*vec3(0.0,0.0,1.0)+float(geometryType==4)*vec3(1.0,1.0,0.0);outputColor=vec4(geometryColor*mc,color.a);}else{outputColor=vec4(1.0,0.0,1.0,1.0);}}struct NodeAppearance{vec4 colorTexel;bool isVisible;bool renderInFront;bool renderGhosted;};float floatBitsSubset(float inNumber,int fromLeastSignificantBitIndex,int toMostSignificantBitIndex){float r=float(fromLeastSignificantBitIndex);float l=float(toMostSignificantBitIndex);float bitShift=pow(2.0,r);return mod(((inNumber-mod(inNumber,bitShift))/bitShift),pow(2.0,l - r));}NodeAppearance nodeAppearanceFromTexel(vec4 nodeAppearanceTexel){float alphaUnwrapped=floor((nodeAppearanceTexel.a*255.0)+0.5);bool isVisible=floatBitsSubset(alphaUnwrapped,0,1)==1.0;bool renderInFront=floatBitsSubset(alphaUnwrapped,1,2)==1.0;bool renderGhosted=floatBitsSubset(alphaUnwrapped,2,3)==1.0;return NodeAppearance(nodeAppearanceTexel,isVisible,renderInFront,renderGhosted);}NodeAppearance determineNodeAppearance(sampler2D nodeAppearanceTexture,vec2 textureSize,highp float treeIndex){highp int dataTextureWidth=int(textureSize.x);highp int dataTextureHeight=int(textureSize.y);highp int iTreeIndex=int(treeIndex);highp int xTreeIndexTextureCoord=iTreeIndex % dataTextureWidth;highp int yTreeIndexTextureCoord=iTreeIndex/dataTextureWidth;vec4 texel=texelFetch(nodeAppearanceTexture,ivec2(xTreeIndexTextureCoord,yTreeIndexTextureCoord),0);return nodeAppearanceFromTexel(texel);}vec4 determineColor(vec3 originalColor,NodeAppearance nodeAppearance){vec4 overrideColor=nodeAppearance.colorTexel;if(any(greaterThan(overrideColor.rgb,vec3(0.0)))){return overrideColor;}return vec4(originalColor.rgb,overrideColor.a);}\n#if NUM_CLIPPING_PLANES > 0\nuniform vec4 clippingPlanes[NUM_CLIPPING_PLANES];\n#endif\nbool isClipped(vec3 point){\n#if NUM_CLIPPING_PLANES > 0\nvec3 pointFlipped=-point;vec4 plane;for(int i=0;i<UNION_CLIPPING_PLANES;i++){plane=clippingPlanes[i];if(dot(pointFlipped,plane.xyz)>plane.w)return true;}\n#if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES\nbool clipped=true;for(int i=UNION_CLIPPING_PLANES;i<NUM_CLIPPING_PLANES;i++){plane=clippingPlanes[i];clipped=(dot(pointFlipped,plane.xyz)>plane.w)&&clipped;}if(clipped)return true;\n#endif\n#endif\nreturn false;}struct UnusedTreeIndexPacked{highp float thousands;highp float subThousands;};highp vec2 packTreeIndex(float treeIndex){highp float roundedTreeIndex=round(treeIndex);highp float treeIndexThousands=floor(roundedTreeIndex/1000.0);highp float treeIndexSubThousands=mod(roundedTreeIndex,1000.0);return vec2(treeIndexThousands,treeIndexSubThousands);}highp float unpackTreeIndex(highp vec2 treeIndexPacked){highp float treeIndex=round(treeIndexPacked.x)*1000.0+round(treeIndexPacked.y);return treeIndex;}uniform sampler2D matCapTexture;uniform lowp int renderMode;in vec3 v_color;in vec3 v_normal;in vec3 vViewPosition;in vec4 v_nodeAppearanceTexel;in highp vec2 v_treeIndexPacked;void main(){highp float v_treeIndex=unpackTreeIndex(v_treeIndexPacked);NodeAppearance appearance=nodeAppearanceFromTexel(v_nodeAppearanceTexel);if(isClipped(vViewPosition)){discard;}vec4 color=determineColor(v_color,appearance);vec3 normal=normalize(v_normal);updateFragmentColor(renderMode,color,v_treeIndex,normal,gl_FragCoord.z,matCapTexture,GeometryType.Primitive);}", wn = "mat4 determineMatrixOverride(float treeIndex,vec2 treeIndexTextureSize,sampler2D transformOverrideIndexTexture,vec2 transformOverrideTextureSize,sampler2D transformOverrideTexture){float dataTextureWidth=treeIndexTextureSize.x;float dataTextureHeight=treeIndexTextureSize.y;int xTreeIndexTextureCoord=int(mod(treeIndex,dataTextureWidth));int yTreeIndexTextureCoord=int(floor(treeIndex/dataTextureWidth));float index=texelFetch(transformOverrideIndexTexture,ivec2(xTreeIndexTextureCoord,yTreeIndexTextureCoord),0).r;if(index==0.0){return mat4(1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0);}index-=1.0;float matrixElements[12];for(int i=0;i<12;i++){matrixElements[i]=texelFetch(transformOverrideTexture,ivec2(i+int(index)*16,0.0),0).r;}return mat4(matrixElements[0],matrixElements[4],matrixElements[8],0,matrixElements[1],matrixElements[5],matrixElements[9],0,matrixElements[2],matrixElements[6],matrixElements[10],0,matrixElements[3],matrixElements[7],matrixElements[11],1);}struct UnusedTreeIndexPacked{highp float thousands;highp float subThousands;};highp vec2 packTreeIndex(float treeIndex){highp float roundedTreeIndex=round(treeIndex);highp float treeIndexThousands=floor(roundedTreeIndex/1000.0);highp float treeIndexSubThousands=mod(roundedTreeIndex,1000.0);return vec2(treeIndexThousands,treeIndexSubThousands);}highp float unpackTreeIndex(highp vec2 treeIndexPacked){highp float treeIndex=round(treeIndexPacked.x)*1000.0+round(treeIndexPacked.y);return treeIndex;}const int RenderTypeColor=1;const int RenderTypeNormal=2;const int RenderTypeTreeIndex=3;const int RenderTypePackColorAndNormal=4;const int RenderTypeDepth=5;const int RenderTypeEffects=6;const int RenderTypeGhost=7;const int RenderTypeLOD=8;const int RenderTypeDepthBufferOnly=9;const int RenderTypeGeometryType=10;struct NodeAppearance{vec4 colorTexel;bool isVisible;bool renderInFront;bool renderGhosted;};float floatBitsSubset(float inNumber,int fromLeastSignificantBitIndex,int toMostSignificantBitIndex){float r=float(fromLeastSignificantBitIndex);float l=float(toMostSignificantBitIndex);float bitShift=pow(2.0,r);return mod(((inNumber-mod(inNumber,bitShift))/bitShift),pow(2.0,l - r));}NodeAppearance nodeAppearanceFromTexel(vec4 nodeAppearanceTexel){float alphaUnwrapped=floor((nodeAppearanceTexel.a*255.0)+0.5);bool isVisible=floatBitsSubset(alphaUnwrapped,0,1)==1.0;bool renderInFront=floatBitsSubset(alphaUnwrapped,1,2)==1.0;bool renderGhosted=floatBitsSubset(alphaUnwrapped,2,3)==1.0;return NodeAppearance(nodeAppearanceTexel,isVisible,renderInFront,renderGhosted);}NodeAppearance determineNodeAppearance(sampler2D nodeAppearanceTexture,vec2 textureSize,highp float treeIndex){highp int dataTextureWidth=int(textureSize.x);highp int dataTextureHeight=int(textureSize.y);highp int iTreeIndex=int(treeIndex);highp int xTreeIndexTextureCoord=iTreeIndex % dataTextureWidth;highp int yTreeIndexTextureCoord=iTreeIndex/dataTextureWidth;vec4 texel=texelFetch(nodeAppearanceTexture,ivec2(xTreeIndexTextureCoord,yTreeIndexTextureCoord),0);return nodeAppearanceFromTexel(texel);}bool determineVisibility(NodeAppearance nodeAppearance,int renderMode){bool visible=nodeAppearance.isVisible;bool ghost=(renderMode==RenderTypeGhost)&&nodeAppearance.renderGhosted;bool inFront=(renderMode==RenderTypeEffects)&&nodeAppearance.renderInFront;bool back=(renderMode==RenderTypeColor)&&!nodeAppearance.renderGhosted&&!nodeAppearance.renderInFront;bool other=(renderMode!=RenderTypeColor&&renderMode!=RenderTypeEffects&&renderMode!=RenderTypeGhost)&&!nodeAppearance.renderGhosted;return visible&&(ghost||inFront||back||other);}uniform mat4 modelViewMatrix;uniform mat4 projectionMatrix;uniform mat3 normalMatrix;uniform vec2 treeIndexTextureSize;uniform vec2 transformOverrideTextureSize;uniform sampler2D transformOverrideIndexTexture;uniform sampler2D transformOverrideTexture;uniform sampler2D colorDataTexture;uniform lowp int renderMode;in vec3 position;in float a_treeIndex;in vec3 a_color;in vec3 a_vertex1;in vec3 a_vertex2;in vec3 a_vertex3;in vec3 a_vertex4;out vec3 v_color;out vec3 v_normal;out vec3 vViewPosition;out vec4 v_nodeAppearanceTexel;out highp vec2 v_treeIndexPacked;void main(){NodeAppearance appearance=determineNodeAppearance(colorDataTexture,treeIndexTextureSize,a_treeIndex);if(!determineVisibility(appearance,renderMode)){gl_Position=vec4(2.0,2.0,2.0,1.0);return;}v_nodeAppearanceTexel=appearance.colorTexel;v_treeIndexPacked=packTreeIndex(a_treeIndex);vec3 transformed;if(position.x<1.5){transformed=position.x==0.0 ? a_vertex1 : a_vertex2;}else{transformed=position.x==2.0 ? a_vertex3 : a_vertex4;}mat4 treeIndexWorldTransform=determineMatrixOverride(a_treeIndex,treeIndexTextureSize,transformOverrideIndexTexture,transformOverrideTextureSize,transformOverrideTexture);vec3 objectNormal=cross(a_vertex1-a_vertex2,a_vertex1 - a_vertex3);v_color=a_color;v_normal=normalMatrix*normalize(treeIndexWorldTransform*vec4(objectNormal,0.0)).xyz;vec4 mvPosition=modelViewMatrix*treeIndexWorldTransform*vec4(transformed,1.0);vViewPosition=mvPosition.xyz;gl_Position=projectionMatrix*mvPosition;}", Tn = "precision highp float;uniform sampler2D tDepth;uniform sampler2D tDiffuse;\n#if defined(use_edl)\n#define MAX_FLOAT 3.402823466e+38\n#define point_size_relative_to_screen_height (1.0 / 1080.0)\nvec2 calculateObscurance(float depth,float screenWidth,float screenHeight,vec2 neighbours[NEIGHBOUR_COUNT],float radius,vec2 vUv,sampler2D depthTexture,sampler2D logDepthTexture){vec2 uvRadius=radius/vec2(screenWidth/(screenHeight*point_size_relative_to_screen_height),1.0f/point_size_relative_to_screen_height);float sum=0.0;float minNeighbourDepth=MAX_FLOAT;vec2 minNeighbourUv=vec2(0.0,0.0);bool thisOutside=depth==0.0;for(int i=0;i<NEIGHBOUR_COUNT;i++){vec2 uvNeighbour=vUv+uvRadius*neighbours[i];float neighbourDepth=texture(logDepthTexture,uvNeighbour).a;bool isSmallestNeighbourDepth=neighbourDepth<minNeighbourDepth;minNeighbourDepth=isSmallestNeighbourDepth ? neighbourDepth : minNeighbourDepth;minNeighbourUv=isSmallestNeighbourDepth ? uvNeighbour : minNeighbourUv;bool otherOutside=neighbourDepth==0.0;sum+=otherOutside ? 0.0:(thisOutside ? 100.0 : max(0.0,depth-neighbourDepth));}return vec2(sum/float(NEIGHBOUR_COUNT),texture(depthTexture,minNeighbourUv).r);}uniform float screenWidth;uniform float screenHeight;uniform vec2 neighbours[NEIGHBOUR_COUNT];uniform float edlStrength;uniform float radius;\n#if defined(points_blend)\nuniform sampler2D tLogDepth;\n#endif\n#endif\n#define EDL_STRENGTH_FACTOR 400.0\nin vec2 vUv;out vec4 outputColor;void main(){float depth=texture(tDepth,vUv).r;vec4 color=texture(tDiffuse,vUv);bool shouldDiscard=depth>=1.0;\n#if defined(points_blend)\ncolor=color/color.w;\n#endif\noutputColor=vec4(color.rgb,1.0);gl_FragDepth=depth;\n#if defined(use_edl)\n#if defined (points_blend)\nfloat edlDepth=texture(tLogDepth,vUv).a;vec2 obs=calculateObscurance(edlDepth,screenWidth,screenHeight,neighbours,radius,vUv,tDepth,tLogDepth);\n#else\nfloat edlDepth=color.a;vec2 obs=calculateObscurance(edlDepth,screenWidth,screenHeight,neighbours,radius,vUv,tDepth,tDiffuse);\n#endif\nfloat shade=exp(-obs.x*EDL_STRENGTH_FACTOR*edlStrength);shouldDiscard=shouldDiscard&&obs.x==0.0;outputColor.xyz*=shade;gl_FragDepth=obs.y;\n#endif\nif(shouldDiscard){discard;}}", En = "uniform mat4 modelMatrix;uniform mat4 projectionMatrix;in vec3 position;in vec2 uv;out vec2 vUv;const mat4 unitOrthographicProjection=mat4(1.,0.,0.,0.,0.,1.,0.,0.,0.,0.,-1.,0.,0.,0.,0.,1.);void main(){vUv=uv;gl_Position=unitOrthographicProjection*modelMatrix*vec4(position,1.0);}", Dn = "precision highp float;precision highp int;uniform mat4 viewMatrix;uniform vec3 cameraPosition;uniform mat4 projectionMatrix;uniform float spacing;uniform float pcIndex;uniform float screenWidth;uniform float screenHeight;out vec4 outputColor;\n#ifdef highlight_point\nuniform vec4 highlightedPointColor;\n#endif\nin vec3 vColor;\n#if defined(weighted_splats)\nin float vLinearDepth;\n#endif\n#if defined(use_edl)\nin float vLogDepth;\n#endif\n#if defined(paraboloid_point_shape)\nin vec3 vViewPosition;\n#endif\n#if defined(weighted_splats) || defined(paraboloid_point_shape)\nin float vRadius;\n#endif\nfloat specularStrength=1.0;void main(){vec3 color=vColor;float depth=gl_FragCoord.z;\n#if defined(circle_point_shape) || defined(paraboloid_point_shape) || defined (weighted_splats)\nfloat u=2.0*gl_PointCoord.x-1.0;float v=2.0*gl_PointCoord.y-1.0;\n#endif\n#if defined(circle_point_shape) || defined(paraboloid_point_shape)\nfloat cc=u*u+v*v;if(cc>1.0){discard;}\n#endif\n#if defined color_type_point_index\noutputColor=vec4(color,pcIndex/255.0);\n#else\noutputColor=vec4(color,1.0);\n#endif\n#if defined paraboloid_point_shape\nfloat wi=0.0-(u*u+v*v);vec4 pos=vec4(vViewPosition,1.0);pos.z+=wi*vRadius;float linearDepth=-pos.z;pos=projectionMatrix*pos;pos=pos/pos.w;float expDepth=pos.z;depth=(pos.z+1.0)/2.0;gl_FragDepth=depth;\n#if defined(color_type_depth)\noutputColor.r=linearDepth;outputColor.g=expDepth;\n#endif\n#endif\n#if defined(use_edl)\noutputColor.a=vLogDepth;\n#endif\n#if defined weighted_splats\nfloat distance=2.0*length(gl_PointCoord.xy-0.5);float weight=max(0.0,1.0-distance);weight=pow(weight,1.5);outputColor.a=weight;outputColor.rgb=outputColor.rgb*weight;\n#endif\n}", On = "precision highp float;precision highp int;\n#define point_size_relative_to_screen_height (1.0 / 1080.0)\n#if NUM_CLIPPING_PLANES > 0\nuniform vec4 clippingPlanes[NUM_CLIPPING_PLANES];\n#endif\nbool isClipped(vec3 point){\n#if NUM_CLIPPING_PLANES > 0\nvec3 pointFlipped=-point;vec4 plane;for(int i=0;i<UNION_CLIPPING_PLANES;i++){plane=clippingPlanes[i];if(dot(pointFlipped,plane.xyz)>plane.w)return true;}\n#if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES\nbool clipped=true;for(int i=UNION_CLIPPING_PLANES;i<NUM_CLIPPING_PLANES;i++){plane=clippingPlanes[i];clipped=(dot(pointFlipped,plane.xyz)>plane.w)&&clipped;}if(clipped)return true;\n#endif\n#endif\nreturn false;}\n#define max_clip_boxes 30\nin vec3 position;in vec3 color;in float intensity;in float classification;in float objectId;in vec4 indices;uniform mat4 modelMatrix;uniform mat4 modelViewMatrix;uniform mat4 projectionMatrix;uniform mat4 viewMatrix;uniform float screenWidth;uniform float screenHeight;uniform float fov;uniform float spacing;uniform float heightMin;uniform float heightMax;uniform float size;uniform float minSize;uniform float maxSize;uniform float octreeSize;uniform float level;uniform float vnStart;uniform bool isLeafNode;uniform vec2 intensityRange;uniform float intensityGamma;uniform float intensityContrast;uniform float intensityBrightness;uniform float rgbGamma;uniform float rgbContrast;uniform float rgbBrightness;uniform sampler2D visibleNodes;uniform sampler2D gradient;uniform sampler2D classificationLUT;uniform sampler2D objectIdLUT;out vec3 vColor;\n#if defined(weighted_splats)\nout float vLinearDepth;\n#endif\n#if defined(use_edl)\nout float vLogDepth;\n#endif\n#if defined(weighted_splats) || defined(paraboloid_point_shape) || defined(hq_depth_pass)\nout float vRadius;out vec3 vViewPosition;\n#endif\n#if defined(adaptive_point_size) || defined(color_type_lod)\nint numberOfOnes(int number,int index){int numOnes=0;int tmp=128;for(int i=7;i>=0;i--){if(number>=tmp){number=number-tmp;if(i<=index){numOnes++;}}tmp=tmp/2;}return numOnes;}bool isBitSet(int number,int index){int powi=1;if(index==0){powi=1;}else if(index==1){powi=2;}else if(index==2){powi=4;}else if(index==3){powi=8;}else if(index==4){powi=16;}else if(index==5){powi=32;}else if(index==6){powi=64;}else if(index==7){powi=128;}int ndp=number/powi;return mod(float(ndp),2.0)!=0.0;}float getLOD(){vec3 offset=vec3(0.0,0.0,0.0);int iOffset=int(vnStart);float depth=level;for(float i=0.0;i<=30.0;i++){float nodeSizeAtLevel=octreeSize/pow(2.0,i+level+0.0);vec3 index3d=(position-offset)/nodeSizeAtLevel;index3d=floor(index3d+0.5);int index=int(round(4.0*index3d.x+2.0*index3d.y+index3d.z));vec4 value=texture(visibleNodes,vec2(float(iOffset)/2048.0,0.0));int mask=int(round(value.r*255.0));if(isBitSet(mask,index)){int advanceG=int(round(value.g*255.0))*256;int advanceB=int(round(value.b*255.0));int advanceChild=numberOfOnes(mask,index-1);int advance=advanceG+advanceB+advanceChild;iOffset=iOffset+advance;depth++;}else{return value.a*255.0;}offset=offset+(vec3(1.0,1.0,1.0)*nodeSizeAtLevel*0.5)*index3d;}return depth;}float getPointSizeAttenuation(){return 0.5*pow(2.0,getLOD());}\n#endif\nfloat getContrastFactor(float contrast){return(1.0158730158730156*(contrast+1.0))/(1.0158730158730156-contrast);}vec3 getRGB(){return color;}float getIntensity(){float w=(intensity-intensityRange.x)/(intensityRange.y - intensityRange.x);w=pow(w,intensityGamma);w=w+intensityBrightness;w=(w-0.5)*getContrastFactor(intensityContrast)+0.5;w=clamp(w,0.0,1.0);return w;}vec3 getRgbWithIntensityFallback(){vec3 rgb=getRGB();float intensity=getIntensity();return rgb!=vec3(0.0)? rgb : vec3(intensity);}vec3 getElevation(){vec4 world=modelMatrix*vec4(position,1.0);float w=(world.y-heightMin)/(heightMax-heightMin);vec3 cElevation=texture(gradient,vec2(w,1.0-w)).rgb;return cElevation;}vec4 getClassification(){vec2 uv=vec2(classification/255.0,0.5);vec4 classColor=texture(classificationLUT,uv);return classColor;}void main(){vec4 mvPosition=modelViewMatrix*vec4(position,1.0);\n#if defined paraboloid_point_shape\nvViewPosition=mvPosition.xyz;\n#endif\nvec4 classification=getClassification();float outColorAlpha=classification.a;gl_Position=projectionMatrix*mvPosition;\n#if defined weighted_splats\nvLinearDepth=gl_Position.w;\n#endif\n#if defined(use_edl)\nvLogDepth=log2(-mvPosition.z)/10.0;\n#endif\nfloat pointSize=1.0;float slope=tan(fov/2.0);float projFactor=-0.5/(point_size_relative_to_screen_height*slope*mvPosition.z);float size=size*screenHeight*point_size_relative_to_screen_height;float minSize=minSize*screenHeight*point_size_relative_to_screen_height;float maxSize=maxSize*screenHeight*point_size_relative_to_screen_height;\n#if defined fixed_point_size\npointSize=size;\n#elif defined attenuated_point_size\npointSize=size*spacing*projFactor;\n#elif defined adaptive_point_size\nfloat worldSpaceSize=2.0*size*spacing/getPointSizeAttenuation();pointSize=worldSpaceSize*projFactor;\n#endif\npointSize=max(minSize,pointSize);pointSize=min(maxSize,pointSize);\n#if defined(weighted_splats) || defined(paraboloid_point_shape) || defined(hq_depth_pass)\nvRadius=pointSize/projFactor;\n#endif\ngl_PointSize=pointSize;\n#ifdef color_type_rgb\nvColor=getRGB();\n#elif defined color_type_height\nvec3 rgb=getRgbWithIntensityFallback();vColor=rgb==vec3(0.0,0.0,0.0)? getElevation(): mix(getElevation(),rgb,0.4);\n#elif defined color_type_depth\nfloat linearDepth=-mvPosition.z;float expDepth=(gl_Position.z/gl_Position.w)*0.5+0.5;vColor=vec3(linearDepth,expDepth,0.0);\n#elif defined color_type_intensity\nfloat w=getIntensity();vColor=vec3(w,w,w);\n#elif defined color_type_lod\nfloat w=getLOD()/10.0;vColor=texture(gradient,vec2(w,1.0-w)).rgb;\n#elif defined color_type_point_index\nvColor=indices.rgb;\n#elif defined color_type_classification\nvec3 rgb=getRgbWithIntensityFallback();vColor=rgb==vec3(0.0,0.0,0.0)? classification.rgb: mix(classification.rgb,rgb,0.4);\n#endif\nif(outColorAlpha==0.0){gl_Position=vec4(100.0,100.0,100.0,0.0);return;}\n#if defined hq_depth_pass\nfloat originalDepth=gl_Position.w;float adjustedDepth=originalDepth+2.0*vRadius;float adjust=adjustedDepth/originalDepth;mvPosition.xyz=mvPosition.xyz*adjust;gl_Position=projectionMatrix*mvPosition;\n#endif\nif(isClipped((modelViewMatrix*vec4(position,1.0)).xyz)){gl_Position=vec4(1000.0,1000.0,1000.0,1.0);}int lutX=int(objectId)% OBJECT_STYLING_TEXTURE_WIDTH;int lutY=int(objectId)/OBJECT_STYLING_TEXTURE_WIDTH;vec4 styleTexel=texelFetch(objectIdLUT,ivec2(lutX,lutY),0);vec3 styleColor=styleTexel.rgb;float alphaUnwrapped=floor((styleTexel.a*255.0)+0.5);if(mod(alphaUnwrapped,2.0)==0.0){gl_Position=vec4(100.0,100.0,100.0,0.0);return;}\n#if !defined(color_type_point_index)\nif(any(greaterThan(styleColor,vec3(0.0)))){vColor=(styleColor*0.8+vColor*0.2);}\n#endif\n}", kn = "precision highp float;float rand2d(in vec2 co){return fract(sin(dot(co.xy,vec2(12.9898,78.233)))*43758.5453);}uniform mat4 projMatrix;uniform mat4 inverseProjectionMatrix;uniform vec3 kernel[MAX_KERNEL_SIZE];uniform sampler2D tDepth;uniform float sampleRadius;uniform float bias;in vec2 vUv;out vec4 outputColor;vec3 viewPosFromDepth(float depth,vec2 uv){float z=depth*2.0-1.0;vec4 clipSpacePosition=vec4(uv*2.0-1.0,z,1.0);vec4 viewSpacePosition=inverseProjectionMatrix*clipSpacePosition;viewSpacePosition/=viewSpacePosition.w;return viewSpacePosition.xyz;}vec3 computeWorldNormalFromDepth(sampler2D depthTexture,vec2 resolution,vec2 uv,float sampleDepth){float dx=1.0/resolution.x;float dy=1.0/resolution.y;vec2 uv1=uv+vec2(dx,0.0);float d1=texture(depthTexture,uv1).r;vec2 uv2=uv+vec2(0.0,dy);float d2=texture(depthTexture,uv2).r;vec2 uv3=uv+vec2(-dx,0.0);float d3=texture(depthTexture,uv3).r;vec2 uv4=uv+vec2(0.0,-dy);float d4=texture(depthTexture,uv4).r;bool horizontalSampleCondition=abs(d1-sampleDepth)<abs(d3 - sampleDepth);float horizontalSampleDepth=horizontalSampleCondition ? d1 : d3;vec2 horizontalSampleUv=horizontalSampleCondition ? uv1 : uv3;bool verticalSampleCondition=abs(d2-sampleDepth)<abs(d4 - sampleDepth);float verticalSampleDepth=verticalSampleCondition ? d2 : d4;vec2 verticalSampleUv=verticalSampleCondition ? uv2 : uv4;vec3 viewPos=viewPosFromDepth(sampleDepth,vUv);vec3 viewPos1=(horizontalSampleCondition==verticalSampleCondition)? viewPosFromDepth(horizontalSampleDepth,horizontalSampleUv): viewPosFromDepth(verticalSampleDepth,verticalSampleUv);vec3 viewPos2=(horizontalSampleCondition==verticalSampleCondition)? viewPosFromDepth(verticalSampleDepth,verticalSampleUv): viewPosFromDepth(horizontalSampleDepth,horizontalSampleUv);return normalize(cross(viewPos1-viewPos,viewPos2 - viewPos));}float LARGE_DISTANCE_SAMPLE_FACTOR=0.05;void main(){float d=texture(tDepth,vUv).r;ivec2 textureSize=textureSize(tDepth,0);vec3 viewNormal=computeWorldNormalFromDepth(tDepth,vec2(float(textureSize.x),float(textureSize.y)),vUv,d);vec3 viewPosition=viewPosFromDepth(d,vUv);float distanceFactor=max(length(viewPosition)*LARGE_DISTANCE_SAMPLE_FACTOR,1.0);vec3 covector=normalize(vec3(rand2d(vUv),rand2d(vUv*3.0),rand2d(vUv*5.0)));vec3 tangent=normalize(covector-viewNormal*dot(covector,viewNormal));vec3 bitangent=cross(viewNormal,tangent);mat3 TBN=mat3(tangent,bitangent,viewNormal);float occlusion=0.0;for(int i=0;i<MAX_KERNEL_SIZE;i++){vec3 sampleVector=TBN*kernel[i];vec3 samplePosition=viewPosition+sampleVector*sampleRadius*distanceFactor;vec4 offset=projMatrix*vec4(samplePosition,1.0);offset.xyz/=offset.w;offset.xyz=offset.xyz*0.5+0.5;float realDepth=texture(tDepth,offset.xy).r;vec3 realPos=viewPosFromDepth(realDepth,offset.xy);float rangeCheck=smoothstep(0.0,1.0,sampleRadius/length(viewPosition-realPos));occlusion+=(realPos.z>=samplePosition.z+bias ? 1.0 : 0.0)*rangeCheck;}float occlusionFactor=1.0-clamp(occlusion/float(MAX_KERNEL_SIZE),0.0,1.0);outputColor=vec4(occlusionFactor);}", An = "uniform mat4 modelMatrix;uniform mat4 viewMatrix;uniform mat4 projectionMatrix;in vec3 position;in vec2 uv;out vec2 vUv;void main(){vUv=uv;gl_Position=projectionMatrix*viewMatrix*modelMatrix*vec4(position,1.0);}", jn = "precision highp float;uniform sampler2D tDiffuse;\n#if defined(DEPTH_WRITE)\nuniform sampler2D tDepth;\n#endif\n#if defined(SSAO_BLUR)\nuniform sampler2D tSsao;\n#endif\n#if defined(ALPHA)\nuniform float alpha;\n#endif\n#if defined(OUTLINE)\nuniform sampler2D tOutlineColors;\n#endif\nin vec2 vUv;in float near;in float far;out vec4 fragColor;\n#if defined(SSAO_BLUR)\nvec4 gaussianBlur(sampler2D tDiffuse,vec2 uv){ivec2 textureSize=textureSize(tDiffuse,0);vec2 resolution=vec2(float(textureSize.x),float(textureSize.y));return texture(tDiffuse,uv+vec2(-3.1111111,-3.1111111)/resolution)*0.0012360+texture(tDiffuse,uv+vec2(-1.3333333,-3.1111111)/resolution)*0.0115356+texture(tDiffuse,uv+vec2(-3.1111111,-1.3333333)/resolution)*0.0115356+texture(tDiffuse,uv+vec2(-1.3333333,-1.3333333)/resolution)*0.1076660+texture(tDiffuse,uv+vec2(0.0000000,-3.1111111)/resolution)*0.0096130+texture(tDiffuse,uv+vec2(0.0000000,-1.3333333)/resolution)*0.0897217+texture(tDiffuse,uv+vec2(1.3333333,-3.1111111)/resolution)*0.0115356+texture(tDiffuse,uv+vec2(3.1111111,-3.1111111)/resolution)*0.0012360+texture(tDiffuse,uv+vec2(1.3333333,-1.3333333)/resolution)*0.1076660+texture(tDiffuse,uv+vec2(3.1111111,-1.3333333)/resolution)*0.0115356+texture(tDiffuse,uv+vec2(-3.1111111,0.0000000)/resolution)*0.0096130+texture(tDiffuse,uv+vec2(-1.3333333,0.0000000)/resolution)*0.0897217+texture(tDiffuse,uv+vec2(-3.1111111,1.3333333)/resolution)*0.0115356+texture(tDiffuse,uv+vec2(-1.3333333,1.3333333)/resolution)*0.1076660+texture(tDiffuse,uv+vec2(-3.1111111,3.1111111)/resolution)*0.0012360+texture(tDiffuse,uv+vec2(-1.3333333,3.1111111)/resolution)*0.0115356+texture(tDiffuse,uv+vec2(0.0000000,1.3333333)/resolution)*0.0897217+texture(tDiffuse,uv+vec2(0.0000000,3.1111111)/resolution)*0.0096130+texture(tDiffuse,uv+vec2(1.3333333,1.3333333)/resolution)*0.1076660+texture(tDiffuse,uv+vec2(3.1111111,1.3333333)/resolution)*0.0115356+texture(tDiffuse,uv+vec2(1.3333333,3.1111111)/resolution)*0.0115356+texture(tDiffuse,uv+vec2(3.1111111,3.1111111)/resolution)*0.0012360+texture(tDiffuse,uv+vec2(1.3333333,0.0000000)/resolution)*0.0897217+texture(tDiffuse,uv+vec2(3.1111111,0.0000000)/resolution)*0.0096130+texture(tDiffuse,uv)*0.0747681;}\n#endif\n#if defined(FXAA)\n#ifndef FXAA_REDUCE_MIN\n#define FXAA_REDUCE_MIN (1.0/ 128.0)\n#endif\n#ifndef FXAA_REDUCE_MUL\n#define FXAA_REDUCE_MUL (1.0 / 8.0)\n#endif\n#ifndef FXAA_SPAN_MAX\n#define FXAA_SPAN_MAX 8.0\n#endif\nvec4 fxaa(sampler2D tex){vec4 color;vec2 fragCoord=gl_FragCoord.xy;ivec2 textureSize=textureSize(tDiffuse,0);vec2 resolution=vec2(float(textureSize.x),float(textureSize.y));vec2 inverseResolution=vec2(1.0/resolution.x,1.0/resolution.y);vec2 v_rgbNW=(fragCoord+vec2(-1.0,-1.0))*inverseResolution;vec2 v_rgbNE=(fragCoord+vec2(1.0,-1.0))*inverseResolution;vec2 v_rgbSW=(fragCoord+vec2(-1.0,1.0))*inverseResolution;vec2 v_rgbSE=(fragCoord+vec2(1.0,1.0))*inverseResolution;vec2 v_rgbM=vec2(fragCoord*inverseResolution);vec3 rgbNW=texture(tex,v_rgbNW).xyz;vec3 rgbNE=texture(tex,v_rgbNE).xyz;vec3 rgbSW=texture(tex,v_rgbSW).xyz;vec3 rgbSE=texture(tex,v_rgbSE).xyz;vec4 texColor=texture(tex,v_rgbM);vec3 rgbM=texColor.xyz;vec3 luma=vec3(0.299,0.587,0.114);float lumaNW=dot(rgbNW,luma);float lumaNE=dot(rgbNE,luma);float lumaSW=dot(rgbSW,luma);float lumaSE=dot(rgbSE,luma);float lumaM=dot(rgbM,luma);float lumaMin=min(lumaM,min(min(lumaNW,lumaNE),min(lumaSW,lumaSE)));float lumaMax=max(lumaM,max(max(lumaNW,lumaNE),max(lumaSW,lumaSE)));mediump vec2 dir;dir.x=-((lumaNW+lumaNE)-(lumaSW+lumaSE));dir.y=((lumaNW+lumaSW)-(lumaNE+lumaSE));float dirReduce=max((lumaNW+lumaNE+lumaSW+lumaSE)*(0.25*FXAA_REDUCE_MUL),FXAA_REDUCE_MIN);float rcpDirMin=1.0/(min(abs(dir.x),abs(dir.y))+dirReduce);dir=min(vec2(FXAA_SPAN_MAX,FXAA_SPAN_MAX),max(vec2(-FXAA_SPAN_MAX,-FXAA_SPAN_MAX),dir*rcpDirMin));vec4 rgbA=0.5*(texture(tex,inverseResolution*(fragCoord+dir*(1.0/3.0-0.5)))+texture(tex,inverseResolution*(fragCoord+dir*(2.0/3.0-0.5))));vec4 rgbB=rgbA*0.5+0.25*(texture(tex,inverseResolution*(fragCoord+dir*-0.5))+texture(tex,inverseResolution*(fragCoord+dir*0.5)));float lumaB=dot(rgbB.rgb,luma);if((lumaB<lumaMin)||(lumaB>lumaMax)){color=rgbA;}else{color=rgbB;}return color;}\n#endif\n#if defined(EDGES)\nmat3 G[9];const mat3 g0=mat3(0.3535533845424652,0,-0.3535533845424652,0.5,0,-0.5,0.3535533845424652,0,-0.3535533845424652);const mat3 g1=mat3(0.3535533845424652,0.5,0.3535533845424652,0,0,0,-0.3535533845424652,-0.5,-0.3535533845424652);const mat3 g2=mat3(0,0.3535533845424652,-0.5,-0.3535533845424652,0,0.3535533845424652,0.5,-0.3535533845424652,0);const mat3 g3=mat3(0.5,-0.3535533845424652,0,-0.3535533845424652,0,0.3535533845424652,0,0.3535533845424652,-0.5);const mat3 g4=mat3(0,-0.5,0,0.5,0,0.5,0,-0.5,0);const mat3 g5=mat3(-0.5,0,0.5,0,0,0,0.5,0,-0.5);const mat3 g6=mat3(0.1666666716337204,-0.3333333432674408,0.1666666716337204,-0.3333333432674408,0.6666666865348816,-0.3333333432674408,0.1666666716337204,-0.3333333432674408,0.1666666716337204);const mat3 g7=mat3(-0.3333333432674408,0.1666666716337204,-0.3333333432674408,0.1666666716337204,0.6666666865348816,0.1666666716337204,-0.3333333432674408,0.1666666716337204,-0.3333333432674408);const mat3 g8=mat3(0.3333333432674408,0.3333333432674408,0.3333333432674408,0.3333333432674408,0.3333333432674408,0.3333333432674408,0.3333333432674408,0.3333333432674408,0.3333333432674408);float edgeDetectionFilter(sampler2D baseTexture){ivec2 fragCoord=ivec2(gl_FragCoord.xy);G[0]=g0,G[1]=g1,G[2]=g2,G[3]=g3,G[4]=g4,G[5]=g5,G[6]=g6,G[7]=g7,G[8]=g8;mat3 I;I[0][0]=length(texelFetch(baseTexture,fragCoord+ivec2(-1,-1),0).rgb);I[0][1]=length(texelFetch(baseTexture,fragCoord+ivec2(-1,0),0).rgb);I[0][2]=length(texelFetch(baseTexture,fragCoord+ivec2(-1,1),0).rgb);I[1][0]=length(texelFetch(baseTexture,fragCoord+ivec2(0,-1),0).rgb);I[1][1]=length(texelFetch(baseTexture,fragCoord+ivec2(0,0),0).rgb);I[1][2]=length(texelFetch(baseTexture,fragCoord+ivec2(0,1),0).rgb);I[2][0]=length(texelFetch(baseTexture,fragCoord+ivec2(1,-1),0).rgb);I[2][1]=length(texelFetch(baseTexture,fragCoord+ivec2(1,0),0).rgb);I[2][2]=length(texelFetch(baseTexture,fragCoord+ivec2(1,1),0).rgb);float dp0=dot(G[0][0],I[0])+dot(G[0][1],I[1])+dot(G[0][2],I[2]);float cnv0=dp0*dp0;float dp1=dot(G[1][0],I[0])+dot(G[1][1],I[1])+dot(G[1][2],I[2]);float cnv1=dp1*dp1;float dp2=dot(G[2][0],I[0])+dot(G[2][1],I[1])+dot(G[2][2],I[2]);float cnv2=dp2*dp2;float dp3=dot(G[3][0],I[0])+dot(G[3][1],I[1])+dot(G[3][2],I[2]);float cnv3=dp3*dp3;float dp4=dot(G[4][0],I[0])+dot(G[4][1],I[1])+dot(G[4][2],I[2]);float cnv4=dp4*dp4;float dp5=dot(G[5][0],I[0])+dot(G[5][1],I[1])+dot(G[5][2],I[2]);float cnv5=dp5*dp5;float dp6=dot(G[6][0],I[0])+dot(G[6][1],I[1])+dot(G[6][2],I[2]);float cnv6=dp6*dp6;float dp7=dot(G[7][0],I[0])+dot(G[7][1],I[1])+dot(G[7][2],I[2]);float cnv7=dp7*dp7;float dp8=dot(G[8][0],I[0])+dot(G[8][1],I[1])+dot(G[8][2],I[2]);float cnv8=dp8*dp8;float M=(cnv0+cnv1)+(cnv2+cnv3);float S=(cnv4+cnv5)+(cnv6+cnv7)+(cnv8+M);return sqrt(M/S);}\n#endif\n#if defined(OUTLINE)\nfloat floatBitsSubset(float inNumber,int fromLeastSignificantBitIndex,int toMostSignificantBitIndex){float r=float(fromLeastSignificantBitIndex);float l=float(toMostSignificantBitIndex);float bitShift=pow(2.0,r);return mod(((inNumber-mod(inNumber,bitShift))/bitShift),pow(2.0,l - r));}const int texelOffset=2;int computeFloatEncodedOutlineIndex(float bitEncodedFloat){return int(floatBitsSubset(floor((bitEncodedFloat*255.0)+0.5),5,8));}ivec4 computeNeighborOutlineIndices(sampler2D tDiffuse,ivec2 fragCoord){int outlineN=computeFloatEncodedOutlineIndex(texelFetchOffset(tDiffuse,fragCoord,0,ivec2(0,texelOffset)).a);int outlineS=computeFloatEncodedOutlineIndex(texelFetchOffset(tDiffuse,fragCoord,0,ivec2(texelOffset,0)).a);int outlineE=computeFloatEncodedOutlineIndex(texelFetchOffset(tDiffuse,fragCoord,0,ivec2(0,-texelOffset)).a);int outlineW=computeFloatEncodedOutlineIndex(texelFetchOffset(tDiffuse,fragCoord,0,ivec2(-texelOffset,0)).a);return ivec4(outlineN,outlineS,outlineE,outlineW);}int fetchOutlineIndex(sampler2D tDiffuse){ivec2 fragCoord=ivec2(gl_FragCoord.xy);int outlineIndex=computeFloatEncodedOutlineIndex(texelFetch(tDiffuse,fragCoord,0).a);ivec4 neighbours=computeNeighborOutlineIndices(tDiffuse,fragCoord);bvec4 isEqualToPixel=equal(neighbours,ivec4(outlineIndex));bvec4 isMiss=equal(neighbours,ivec4(0));bvec4 isEqualOrMiss=bvec4(isEqualToPixel.x||isMiss.x,isEqualToPixel.y||isMiss.y,isEqualToPixel.z||isMiss.z,isEqualToPixel.w||isMiss.w);bool hasOutline=outlineIndex>0&&!(all(isEqualToPixel))&&all(isEqualOrMiss);return hasOutline ? outlineIndex : 0;}\n#endif\n#if defined(EDGES) && defined(DEPTH_WRITE)\nfloat toViewZ(float depth,float near,float far){return near*far/(far-depth*(far - near));}\n#endif\nvoid main(){vec4 diffuse=texture(tDiffuse,vUv);if(diffuse.a==0.0){discard;}\n#if defined(FXAA)\nfragColor=fxaa(tDiffuse);\n#else\nfragColor=diffuse;\n#if defined(SSAO_BLUR)\nfragColor*=gaussianBlur(tSsao,vUv);\n#endif\n#if defined(EDGES)\nfloat edgeStrength=edgeDetectionFilter(tDiffuse);edgeStrength=(1.0-pow(1.0 - edgeStrength,2.0));\n#if defined(DEPTH_WRITE)\nfloat depthEdge=toViewZ(texture(tDepth,vUv).r,near,far);edgeStrength*=(1.0-smoothstep(10.0,40.0,depthEdge));\n#endif\nfragColor.rgb*=isnan(edgeStrength)? 1.0 :(1.0-edgeStrength);\n#endif\n#if defined(OUTLINE)\nint outline=fetchOutlineIndex(tDiffuse);fragColor.rgb=outline>0 ? texelFetch(tOutlineColors,ivec2(outline,0),0).rgb : fragColor.rgb;\n#endif\n#endif\n#if defined(ALPHA)\nfragColor.a=alpha;\n#endif\n#if defined(DEPTH_WRITE)\ngl_FragDepth=texture(tDepth,vUv).r;\n#endif\n}", Mn = "uniform mat4 modelMatrix;uniform mat4 projectionMatrix;in vec3 position;in vec2 uv;out float near;out float far;out vec2 vUv;const mat4 unitOrthographicProjection=mat4(1.,0.,0.,0.,0.,1.,0.,0.,0.,0.,-1.,0.,0.,0.,0.,1.);void main(){vUv=uv;near=projectionMatrix[3][2]/(projectionMatrix[2][2]-1.0);far=projectionMatrix[3][2]/(projectionMatrix[2][2]+1.0);gl_Position=unitOrthographicProjection*modelMatrix*vec4(position,1.0);}", Nn = "precision highp float;uniform sampler2D tDiffuse;uniform sampler2D tDepth;uniform sampler2D tBlendDiffuse;uniform sampler2D tBlendDepth;uniform float blendFactor;\n#if defined(ALPHA)\nuniform float alpha;\n#endif\n#if defined(OUTLINE)\nuniform sampler2D tOutlineColors;\n#endif\nin vec2 vUv;out vec4 fragColor;\n#if defined(OUTLINE)\nfloat floatBitsSubset(float inNumber,int fromLeastSignificantBitIndex,int toMostSignificantBitIndex){float r=float(fromLeastSignificantBitIndex);float l=float(toMostSignificantBitIndex);float bitShift=pow(2.0,r);return mod(((inNumber-mod(inNumber,bitShift))/bitShift),pow(2.0,l - r));}const int texelOffset=2;int computeFloatEncodedOutlineIndex(float bitEncodedFloat){return int(floatBitsSubset(floor((bitEncodedFloat*255.0)+0.5),5,8));}ivec4 computeNeighborOutlineIndices(sampler2D tDiffuse,ivec2 fragCoord){int outlineN=computeFloatEncodedOutlineIndex(texelFetchOffset(tDiffuse,fragCoord,0,ivec2(0,texelOffset)).a);int outlineS=computeFloatEncodedOutlineIndex(texelFetchOffset(tDiffuse,fragCoord,0,ivec2(texelOffset,0)).a);int outlineE=computeFloatEncodedOutlineIndex(texelFetchOffset(tDiffuse,fragCoord,0,ivec2(0,-texelOffset)).a);int outlineW=computeFloatEncodedOutlineIndex(texelFetchOffset(tDiffuse,fragCoord,0,ivec2(-texelOffset,0)).a);return ivec4(outlineN,outlineS,outlineE,outlineW);}int fetchOutlineIndex(sampler2D tDiffuse){ivec2 fragCoord=ivec2(gl_FragCoord.xy);int outlineIndex=computeFloatEncodedOutlineIndex(texelFetch(tDiffuse,fragCoord,0).a);ivec4 neighbours=computeNeighborOutlineIndices(tDiffuse,fragCoord);bvec4 isEqualToPixel=equal(neighbours,ivec4(outlineIndex));bvec4 isMiss=equal(neighbours,ivec4(0));bvec4 isEqualOrMiss=bvec4(isEqualToPixel.x||isMiss.x,isEqualToPixel.y||isMiss.y,isEqualToPixel.z||isMiss.z,isEqualToPixel.w||isMiss.w);bool hasOutline=outlineIndex>0&&!(all(isEqualToPixel))&&all(isEqualOrMiss);return hasOutline ? outlineIndex : 0;}\n#endif\nvoid main(){vec4 diffuse=texture(tDiffuse,vUv);if(diffuse.a==0.0){discard;}float depth=texture(tDepth,vUv).r;vec4 blendDiffuse=texture(tBlendDiffuse,vUv);float blendDepth=texture(tBlendDepth,vUv).r;fragColor=mix(diffuse,blendDiffuse,blendFactor*step(0.0,depth-blendDepth));\n#if defined(OUTLINE)\nint outline=fetchOutlineIndex(tDiffuse);fragColor.rgb=outline>0 ? texelFetch(tOutlineColors,ivec2(outline,0),0).rgb : fragColor.rgb;\n#endif\n#if defined(ALPHA)\nfragColor.a=alpha;\n#endif\ngl_FragDepth=min(depth,blendDepth);}", V = {
|
|
144
144
|
detailedMesh: {
|
|
145
145
|
fragment: an,
|
|
146
146
|
vertex: on
|
|
@@ -7521,7 +7521,7 @@ var Ps = class {
|
|
|
7521
7521
|
externalId: t.revisionExternalId
|
|
7522
7522
|
} },
|
|
7523
7523
|
...a,
|
|
7524
|
-
limit:
|
|
7524
|
+
limit: 100,
|
|
7525
7525
|
cursor: i
|
|
7526
7526
|
} }, o = (await this.client.post(e, n).catch((e) => {
|
|
7527
7527
|
throw Error("Could not fetch signed file URLs for model");
|