UNPKG

@niivue/niivue

Version:

minimal webgl2 nifti image viewer

1 lines 880 kB
export const esm = "var%20t%3DObject.defineProperty%2Ce%3Dt%3D%3E%7Bthrow%20TypeError(t)%7D%2Ci%3D(e%2Ci)%3D%3E%7Bfor(var%20r%20in%20i)t(e%2Cr%2C%7Bget%3Ai%5Br%5D%2Cenumerable%3A!0%7D)%7D%2Cr%3D(e%2Ci%2Cr)%3D%3E((e%2Ci%2Cr)%3D%3Ei%20in%20e%3Ft(e%2Ci%2C%7Benumerable%3A!0%2Cconfigurable%3A!0%2Cwritable%3A!0%2Cvalue%3Ar%7D)%3Ae%5Bi%5D%3Dr)(e%2C%22symbol%22!%3Dtypeof%20i%3Fi%2B%22%22%3Ai%2Cr)%2Cs%3D(t%2Ci%2Cr)%3D%3Ei.has(t)%7C%7Ce(%22Cannot%20%22%2Br)%2Cn%3D(t%2Ce%2Ci)%3D%3E(s(t%2Ce%2C%22read%20from%20private%20field%22)%2Ci%3Fi.call(t)%3Ae.get(t))%2Ca%3D(t%2Ci%2Cr)%3D%3Ei.has(t)%3Fe(%22Cannot%20add%20the%20same%20private%20member%20more%20than%20once%22)%3Ai%20instanceof%20WeakSet%3Fi.add(t)%3Ai.set(t%2Cr)%2Co%3D(t%2Ce%2Ci%2Cr)%3D%3E(s(t%2Ce%2C%22write%20to%20private%20field%22)%2Cr%3Fr.call(t%2Ci)%3Ae.set(t%2Ci)%2Ci)%3Bimport%7Bmat4%20as%20l%2Cvec2%20as%20h%2Cvec3%20as%20c%2Cvec4%20as%20d%7Dfrom%22gl-matrix%22%3Bvar%20m%3D%220.53.1%22%2Cu%3Dclass%20t%7Bconstructor(%7Bname%3At%3D%22niivue%22%2Clevel%3Ae%3D%22info%22%7D%3D%7B%7D)%7Br(this%2C%22level%22)%2Cr(this%2C%22name%22)%2Cthis.name%3D%60%24%7Bt%7D%60%2Cthis.level%3De%7Ddebug(...e)%7Bt.levels%5Bthis.level%5D%3Et.levels.debug%7C%7Cconsole.debug(%60%24%7Bthis.name%7D-debug%60%2C...e)%7Dinfo(...e)%7Bt.levels%5Bthis.level%5D%3Et.levels.info%7C%7Cconsole.info(%60%24%7Bthis.name%7D-info%60%2C...e)%7Dwarn(...e)%7Bt.levels%5Bthis.level%5D%3Et.levels.warn%7C%7Cconsole.warn(%60%24%7Bthis.name%7D-warn%60%2C...e)%7Derror(...e)%7Bt.levels%5Bthis.level%5D%3Et.levels.error%7C%7Cconsole.error(%60%24%7Bthis.name%7D-error%60%2C...e)%7Dfatal(...e)%7Bt.levels%5Bthis.level%5D%3Et.levels.fatal%7C%7Cconsole.error(%60%24%7Bthis.name%7D-fatal%60%2C...e)%7DsetLogLevel(t)%7Bthis.level%3Dt%7DsetName(t)%7Bthis.name%3Dt%7D%7D%3Br(u%2C%22levels%22%2C%7Bdebug%3A0%2Cinfo%3A1%2Cwarn%3A2%2Cerror%3A3%2Cfatal%3A4%2Csilent%3A1%2F0%7D)%3Bvar%20f%3Dnew%20u(%7Bname%3A%22niivue%22%2Clevel%3A%22info%22%7D)%2CA%3Dclass%7Bconstructor(t%2Ce%2Ci)%7Br(this%2C%22program%22)%2Cr(this%2C%22uniforms%22%2C%7B%7D)%2Cr(this%2C%22isMatcap%22)%2Cthis.program%3Dfunction(t%2Ce%2Ci)%7Bconst%20r%3Dt.createShader(t.VERTEX_SHADER)%3Bt.shaderSource(r%2Ce)%2Ct.compileShader(r)%3Bconst%20s%3Dt.createShader(t.FRAGMENT_SHADER)%3Bt.shaderSource(s%2Ci)%2Ct.compileShader(s)%3Bconst%20n%3Dt.createProgram()%3Bif(t.attachShader(n%2Cr)%2Ct.attachShader(n%2Cs)%2Ct.linkProgram(n)%2C!t.getProgramParameter(n%2Ct.LINK_STATUS))throw%20console.log(t.getProgramInfoLog(n))%2Ct.getShaderParameter(r%2Ct.COMPILE_STATUS)%7C%7Cconsole.log(%22Vertex%20shader%20compilation%20error%3A%22%2Ct.getShaderInfoLog(r))%2Ct.getShaderParameter(s%2Ct.COMPILE_STATUS)%7C%7Cconsole.log(%22Fragment%20shader%20compilation%20error%3A%22%2Ct.getShaderInfoLog(s))%2Cf.error(t.getProgramInfoLog(n))%2Cnew%20Error(%22Shader%20failed%20to%20link%2C%20see%20console%20for%20log%22)%3Breturn%20n%7D(t%2Ce%2Ci)%3Bconst%20s%3D%2Funiform%5B%5E%3B%5D%2B%5B%20%5D(%5Cw%2B)%3B%2Fg%2Cn%3D%2Funiform%5B%5E%3B%5D%2B%5B%20%5D(%5Cw%2B)%3B%2F%2Ca%3De.match(s)%2Co%3Di.match(s)%3Ba%26%26a.forEach((t%3D%3E%7Bconst%20e%3Dt.match(n)%3Bthis.uniforms%5Be%5B1%5D%5D%3D-1%7D))%2Co%26%26o.forEach((t%3D%3E%7Bconst%20e%3Dt.match(n)%3Bthis.uniforms%5Be%5B1%5D%5D%3D-1%7D))%3Bfor(const%20e%20in%20this.uniforms)this.uniforms%5Be%5D%3Dt.getUniformLocation(this.program%2Ce)%7Duse(t)%7Bt.useProgram(this.program)%7D%7D%2Cg%3D%22%23version%20300%20es%5Cn%23line%204%5Cnlayout(location%3D0)%20in%20vec3%20pos%3B%5Cnlayout(location%3D1)%20in%20vec3%20texCoords%3B%5Cnuniform%20mat4%20mvpMtx%3B%5Cnout%20vec3%20vColor%3B%5Cnvoid%20main(void)%20%7B%5Cn%5Ctgl_Position%20%3D%20mvpMtx%20*%20vec4(pos%2C%201.0)%3B%5Cn%5CtvColor%20%3D%20texCoords%3B%5Cn%7D%22%2Cp%3D%22%5Cn%5Ctvec4%20drawColor(float%20scalar%2C%20float%20drawOpacity)%20%7B%5Cn%5Ct%5Ctfloat%20nlayer%20%3D%20float(textureSize(colormap%2C%200).y)%3B%5Cn%5Ct%5Ctfloat%20layer%20%3D%20(nlayer%20-%200.5)%20%2F%20nlayer%3B%5Cn%5Ct%5Ctvec4%20dcolor%20%3D%20texture(colormap%2C%20vec2((scalar%20*%20255.0)%2F256.0%20%2B%200.5%2F256.0%2C%20layer)).rgba%3B%5Cn%5Ct%5Ctdcolor.a%20*%3D%20drawOpacity%3B%5Cn%5Ct%5Ctreturn%20dcolor%3B%5Cn%7D%22%2Cv%3D%22vec3%20GetBackPosition(vec3%20startPositionTex)%20%7B%5Cn%5Ctvec3%20startPosition%20%3D%20startPositionTex%20*%20volScale%3B%5Cn%5Ctvec3%20invR%20%3D%201.0%20%2F%20rayDir%3B%5Cn%5Ctvec3%20tbot%20%3D%20invR%20*%20(vec3(0.0)-startPosition)%3B%5Cn%5Ctvec3%20ttop%20%3D%20invR%20*%20(volScale-startPosition)%3B%5Cn%5Ctvec3%20tmax%20%3D%20max(ttop%2C%20tbot)%3B%5Cn%5Ctvec2%20t%20%3D%20min(tmax.xx%2C%20tmax.yz)%3B%5Cn%5Ctvec3%20endPosition%20%3D%20startPosition%20%2B%20(rayDir%20*%20min(t.x%2C%20t.y))%3B%5Cn%5Ct%2F%2Fconvert%20world%20position%20back%20to%20texture%20position%3A%5Cn%5CtendPosition%20%3D%20endPosition%20%2F%20volScale%3B%5Cn%5Ctreturn%20endPosition%3B%5Cn%7D%5Cn%5Cnvec4%20applyClip%20(vec3%20dir%2C%20inout%20vec4%20samplePos%2C%20inout%20float%20len%2C%20inout%20bool%20isClip)%20%7B%5Cn%5Ctfloat%20cdot%20%3D%20dot(dir%2CclipPlane.xyz)%3B%5Cn%5CtisClip%20%3D%20false%3B%5Cn%5Ctif%20%20((clipPlane.a%20%3E%201.0)%20%7C%7C%20(cdot%20%3D%3D%200.0))%20return%20samplePos%3B%5Cn%5Ctbool%20frontface%20%3D%20(cdot%20%3E%200.0)%3B%5Cn%5Ctfloat%20dis%20%3D%20(-clipPlane.a%20-%20dot(clipPlane.xyz%2C%20samplePos.xyz-0.5))%20%2F%20cdot%3B%5Cn%5Ctfloat%20thick%20%3D%20clipThick%3B%5Cn%5Ctif%20(thick%20%3C%3D%200.0)%20thick%20%3D%202.0%3B%5Cn%5Ctfloat%20%20disBackFace%20%3D%20(-(clipPlane.a-thick)%20-%20dot(clipPlane.xyz%2C%20samplePos.xyz-0.5))%20%2F%20cdot%3B%5Cn%5Ctif%20(((frontface)%20%26%26%20(dis%20%3E%3D%20len))%20%7C%7C%20((!frontface)%20%26%26%20(dis%20%3C%3D%200.0)))%20%7B%5Cn%5Ct%5CtsamplePos.a%20%3D%20len%20%2B%201.0%3B%5Cn%5Ct%5Ctreturn%20samplePos%3B%5Cn%5Ct%7D%5Cn%5Ctif%20(frontface)%20%7B%5Cn%5Ct%5Ctdis%20%3D%20max(0.0%2C%20dis)%3B%5Cn%5Ct%5CtsamplePos%20%3D%20vec4(samplePos.xyz%2Bdir%20*%20dis%2C%20dis)%3B%5Cn%5Ct%5Ctif%20(dis%20%3E%200.0)%20isClip%20%3D%20true%3B%5Cn%5Ct%5Ctlen%20%3D%20min(disBackFace%2C%20len)%3B%5Cn%5Ct%7D%5Cn%5Ctif%20(!frontface)%20%7B%5Cn%5Ct%5Ctlen%20%3D%20min(dis%2C%20len)%3B%5Cn%5Ct%5CtdisBackFace%20%3D%20max(0.0%2C%20disBackFace)%3B%5Cn%5Ct%5Ctif%20(len%20%3D%3D%20dis)%20isClip%20%3D%20true%3B%5Cn%5Ct%5CtsamplePos%20%3D%20vec4(samplePos.xyz%2Bdir%20*%20disBackFace%2C%20disBackFace)%3B%5Cn%5Ct%7D%5Cn%5Ctreturn%20samplePos%3B%5Cn%7D%5Cn%5Cnvoid%20clipVolume(inout%20vec3%20startPos%2C%20inout%20vec3%20backPos%2C%20int%20dim%2C%20float%20frac%2C%20bool%20isLo)%20%7B%5Cn%5Ctvec3%20dir%20%3D%20backPos%20-%20startPos%3B%5Cn%5Ctfloat%20len%20%3D%20length(dir)%3B%5Cn%5Ctdir%20%3D%20normalize(dir)%3B%5Cn%5Ct%2F%2F%20Discard%20if%20both%20startPos%20and%20backPos%20are%20outside%20the%20clipping%20plane%5Cn%5Ctif%20(isLo%20%26%26%20startPos%5Bdim%5D%20%3C%20frac%20%26%26%20backPos%5Bdim%5D%20%3C%20frac)%20%7B%5Cn%5Ct%5Ctdiscard%3B%5Cn%5Ct%7D%5Cn%5Ctif%20(!isLo%20%26%26%20startPos%5Bdim%5D%20%3E%20frac%20%26%26%20backPos%5Bdim%5D%20%3E%20frac)%20%7B%5Cn%5Ct%5Ctdiscard%3B%5Cn%5Ct%7D%5Cn%5Ctvec4%20plane%20%3D%20vec4(0.0%2C%200.0%2C%200.0%2C%200.5%20-%20frac)%3B%5Cn%5Ctplane%5Bdim%5D%20%3D%201.0%3B%5Cn%5Ctfloat%20cdot%20%3D%20dot(dir%2C%20plane.xyz)%3B%5Cn%5Ctfloat%20dis%20%3D%20(-plane.w%20-%20dot(plane.xyz%2C%20startPos%20-%20vec3(0.5)))%20%2F%20cdot%3B%5Cn%5Ct%2F%2F%20Adjust%20startPos%20or%20backPos%20based%20on%20the%20intersection%20with%20the%20plane%5Cn%5Ctbool%20isFrontFace%20%3D%20(cdot%20%3E%200.0)%3B%5Cn%5Ctif%20(!isLo)%5Cn%5Ct%5CtisFrontFace%20%3D%20!isFrontFace%3B%5Cn%5Ctif%20(dis%20%3E%200.0)%20%7B%5Cn%5Ct%5Ctif%20(isFrontFace)%20%7B%5Cn%5Ct%5Ct%5Ct%5Ctif%20(dis%20%3C%3D%20len)%20%7B%5Cn%5Ct%5Ct%5Ct%5Ct%5CtstartPos%20%3D%20startPos%20%2B%20dir%20*%20dis%3B%5Cn%5Ct%5Ct%5Ct%5Ct%7D%5Cn%5Ct%5Ct%7D%20else%20%7B%5Cn%5Ct%5Ct%5Ctif%20(dis%20%3C%20len)%20%7B%5Cn%5Ct%5Ct%5Ct%5CtbackPos%20%3D%20startPos%20%2B%20dir%20*%20dis%3B%5Cn%5Ct%5Ct%5Ct%7D%5Cn%5Ct%5Ct%7D%5Cn%5Ct%7D%5Cn%7D%5Cn%5Cnvoid%20clipVolumeStart%20(inout%20vec3%20startPos%2C%20inout%20vec3%20backPos)%20%7B%5Cn%5Ct%2F%2F%20vec3%20clipLo%20%3D%20vec3(0.1%2C%200.2%2C%200.4)%3B%5Cn%5Ct%2F%2F%20vec3%20clipHi%20%3D%20vec3(0.8%2C%200.7%2C%200.7)%3B%5Cn%5Ctfor%20(int%20i%20%3D%200%3B%20i%20%3C%203%3B%20i%2B%2B)%20%7B%5Cn%5Ct%5Ctif%20(clipLo%5Bi%5D%20%3E%200.0)%5Cn%5Ct%5Ct%5CtclipVolume(startPos%2C%20backPos%2C%20i%2C%20clipLo%5Bi%5D%2C%20true)%3B%5Cn%5Ct%7D%5Cn%5Ctfor%20(int%20i%20%3D%200%3B%20i%20%3C%203%3B%20i%2B%2B)%20%7B%5Cn%5Ct%5Ctif%20(clipHi%5Bi%5D%20%3C%201.0)%5Cn%5Ct%5Ct%5CtclipVolume(startPos%2C%20backPos%2C%20i%2C%20clipHi%5Bi%5D%2C%20false)%3B%5Cn%5Ct%7D%5Cn%7D%5Cn%5Cnfloat%20frac2ndc(vec3%20frac)%20%7B%5Cn%2F%2Fhttps%3A%2F%2Fstackoverflow.com%2Fquestions%2F7777913%2Fhow-to-render-depth-linearly-in-modern-opengl-with-gl-fragcoord-z-in-fragment-sh%5Cn%5Ctvec4%20pos%20%3D%20vec4(frac.xyz%2C%201.0)%3B%20%2F%2Ffraction%5Cn%5Ctvec4%20dim%20%3D%20vec4(vec3(textureSize(volume%2C%200))%2C%201.0)%3B%5Cn%5Ctpos%20%3D%20pos%20*%20dim%3B%5Cn%5Ctvec4%20shim%20%3D%20vec4(-0.5%2C%20-0.5%2C%20-0.5%2C%200.0)%3B%5Cn%5Ctpos%20%2B%3D%20shim%3B%5Cn%5Ctvec4%20mm%20%3D%20transpose(matRAS)%20*%20pos%3B%5Cn%5Ctfloat%20z_ndc%20%3D%20(mvpMtx%20*%20vec4(mm.xyz%2C%201.0)).z%3B%5Cn%5Ctreturn%20(z_ndc%20%2B%201.0)%20%2F%202.0%3B%5Cn%7D%22%2Bp%2Cx%3D%22void%20main()%20%7B%5Cn%5Ctif%20(fColor.x%20%3E%202.0)%20%7B%5Cn%5Ct%5CtfColor%20%3D%20vec4(1.0%2C%200.0%2C%200.0%2C%200.5)%3B%5Cn%5Ct%5Ctreturn%3B%5Cn%5Ct%7D%5Cn%5CtfColor%20%3D%20vec4(0.0%2C0.0%2C0.0%2C0.0)%3B%5Cn%5Ctvec4%20clipPlaneColorX%20%3D%20clipPlaneColor%3B%5Cn%5Ct%2F%2Fif%20(clipPlaneColor.a%20%3C%200.0)%5Cn%5Ct%2F%2F%5CtclipPlaneColorX.a%20%3D%20-%201.0%3B%5Cn%5Ctbool%20isColorPlaneInVolume%20%3D%20false%3B%5Cn%5Ctif%20(clipPlaneColorX.a%20%3C%200.0)%20%7B%5Cn%5Ct%5CtisColorPlaneInVolume%20%3D%20true%3B%5Cn%5Ct%5CtclipPlaneColorX.a%20%3D%200.0%3B%5Cn%5Ct%7D%5Cn%5Ct%2F%2FfColor%20%3D%20vec4(vColor.rgb%2C%201.0)%3B%20return%3B%5Cn%5Ctvec3%20start%20%3D%20vColor%3B%5Cn%5Ctgl_FragDepth%20%3D%200.0%3B%5Cn%5Ctvec3%20backPosition%20%3D%20GetBackPosition(start)%3B%5Cn%5Ct%2F%2F%20fColor%20%3D%20vec4(backPosition%2C%201.0)%3B%20return%3B%5Cn%5Ctvec3%20dir%20%3D%20normalize(backPosition%20-%20start)%3B%5Cn%5CtclipVolumeStart(start%2C%20backPosition)%3B%5Cn%5Ctdir%20%3D%20normalize(dir)%3B%5Cn%5Ctfloat%20len%20%3D%20length(backPosition%20-%20start)%3B%5Cn%5Ctfloat%20lenVox%20%3D%20length((texVox%20*%20start)%20-%20(texVox%20*%20backPosition))%3B%5Cn%5Ctif%20((lenVox%20%3C%200.5)%20%7C%7C%20(len%20%3E%203.0))%20%7B%20%2F%2Flength%20limit%20for%20parallel%20rays%5Cn%5Ct%5Ctreturn%3B%5Cn%5Ct%7D%5Cn%5Ctfloat%20sliceSize%20%3D%20len%20%2F%20lenVox%3B%20%2F%2Fe.g.%20if%20ray%20length%20is%201.0%20and%20traverses%2050%20voxels%2C%20each%20voxel%20is%200.02%20in%20unit%20cube%5Cn%5Ctfloat%20stepSize%20%3D%20sliceSize%3B%20%2F%2Fquality%3A%20larger%20step%20is%20faster%20traversal%2C%20but%20fewer%20samples%5Cn%5Ctfloat%20opacityCorrection%20%3D%20stepSize%2FsliceSize%3B%5Cn%5Ctvec4%20deltaDir%20%3D%20vec4(dir.xyz%20*%20stepSize%2C%20stepSize)%3B%5Cn%5Ctvec4%20samplePos%20%3D%20vec4(start.xyz%2C%200.0)%3B%20%2F%2Fray%20position%5Cn%5Ctfloat%20lenNoClip%20%3D%20len%3B%5Cn%5Ctbool%20isClip%20%3D%20false%3B%5Cn%5Ctvec4%20clipPos%20%3D%20applyClip(dir%2C%20samplePos%2C%20len%2C%20isClip)%3B%5Cn%5Ct%2F%2Fif%20((clipPos.a%20!%3D%20samplePos.a)%20%26%26%20(len%20%3C%203.0))%20%7B%5Cn%5Ct%2F%2Fstart%3A%20OPTIONAL%20fast%20pass%3A%20rapid%20traversal%20until%20first%20hit%5Cn%5Ctfloat%20stepSizeFast%20%3D%20sliceSize%20*%201.9%3B%5Cn%5Ctvec4%20deltaDirFast%20%3D%20vec4(dir.xyz%20*%20stepSizeFast%2C%20stepSizeFast)%3B%5Cn%5Ctwhile%20(samplePos.a%20%3C%3D%20len)%20%7B%5Cn%5Ct%5Ctfloat%20val%20%3D%20texture(volume%2C%20samplePos.xyz).a%3B%5Cn%5Ct%5Ctif%20(val%20%3E%200.01)%5Cn%5Ct%5Ct%5Ctbreak%3B%5Cn%5Ct%5CtsamplePos%20%2B%3D%20deltaDirFast%3B%20%2F%2Fadvance%20ray%20position%5Cn%5Ct%7D%5Cn%5Ctfloat%20drawOpacityA%20%3D%20renderDrawAmbientOcclusionXY.y%3B%5Cn%5Ctif%20((samplePos.a%20%3E%3D%20len)%20%26%26%20(((overlays%20%3C%201.0)%20%26%26%20(drawOpacityA%20%3C%3D%200.0)%20)%20%7C%7C%20(backgroundMasksOverlays%20%3E%200)))%20%20%7B%5Cn%5Ct%5Ctif%20(isClip)%5Cn%5Ct%5Ct%5CtfColor%20%2B%3D%20clipPlaneColorX%3B%5Cn%5Ct%5Ctreturn%3B%5Cn%5Ct%7D%5Cn%5CtfColor%20%3D%20vec4(1.0%2C%201.0%2C%201.0%2C%201.0)%3B%5Cn%5Ct%2F%2Fgl_FragDepth%20%3D%20frac2ndc(samplePos.xyz)%3B%20%2F%2Fcrude%20due%20to%20fast%20pass%20resolution%5Cn%5CtsamplePos%20-%3D%20deltaDirFast%3B%5Cn%5Ctif%20(samplePos.a%20%3C%200.0)%5Cn%5Ct%5Ctvec4%20samplePos%20%3D%20vec4(start.xyz%2C%200.0)%3B%20%2F%2Fray%20position%5Cn%5Ct%2F%2Fend%3A%20fast%20pass%5Cn%5Ctvec4%20colAcc%20%3D%20vec4(0.0%2C0.0%2C0.0%2C0.0)%3B%5Cn%5Ctvec4%20firstHit%20%3D%20vec4(0.0%2C0.0%2C0.0%2C2.0%20*%20lenNoClip)%3B%5Cn%5Ctconst%20float%20earlyTermination%20%3D%200.95%3B%5Cn%5Ctfloat%20backNearest%20%3D%20len%3B%20%2F%2Fassume%20no%20hit%5Cn%5Ctfloat%20ran%20%3D%20fract(sin(gl_FragCoord.x%20*%2012.9898%20%2B%20gl_FragCoord.y%20*%2078.233)%20*%2043758.5453)%3B%5Cn%5CtsamplePos%20%2B%3D%20deltaDir%20*%20ran%3B%20%2F%2Fjitter%20ray%5Cn%22%2Cw%3D%22%5Cn%5Ctif%20(firstHit.a%20%3C%20len)%5Cn%5Ct%5Ctgl_FragDepth%20%3D%20frac2ndc(firstHit.xyz)%3B%5Cn%5CtcolAcc.a%20%3D%20(colAcc.a%20%2F%20earlyTermination)%20*%20backOpacity%3B%5Cn%5CtfColor%20%3D%20colAcc%3B%5Cn%5Ct%2F%2Fif%20(isClip)%20%2F%2FCR%5Cn%5Ctif%20((isColorPlaneInVolume)%20%26%26%20(clipPos.a%20!%3D%20samplePos.a)%20%26%26%20(abs(firstHit.a%20-%20clipPos.a)%20%3C%20deltaDir.a))%5Cn%5Ct%5CtfColor.rgb%20%3D%20mix(fColor.rgb%2C%20clipPlaneColorX.rgb%2C%20abs(clipPlaneColor.a))%3B%5Cn%5Ct%5Ct%2F%2FfColor.rgb%20%3D%20mix(fColor.rgb%2C%20clipPlaneColorX.rgb%2C%20clipPlaneColorX.a%20*%200.65)%3B%5Cn%5Ctfloat%20renderDrawAmbientOcclusionX%20%3D%20renderDrawAmbientOcclusionXY.x%3B%5Cn%5Ctfloat%20drawOpacity%20%3D%20renderDrawAmbientOcclusionXY.y%3B%5Cn%5Ctif%20((overlays%20%3C%201.0)%20%26%26%20(drawOpacity%20%3C%3D%200.0))%5Cn%5Ct%5Ctreturn%3B%5Cn%5Ct%2F%2Foverlay%20pass%5Cn%5Ctlen%20%3D%20lenNoClip%3B%5Cn%5CtsamplePos%20%3D%20vec4(start.xyz%2C%200.0)%3B%20%2F%2Fray%20position%5Cn%5Ct%2F%2Fstart%3A%20OPTIONAL%20fast%20pass%3A%20rapid%20traversal%20until%20first%20hit%5Cn%5CtstepSizeFast%20%3D%20sliceSize%20*%201.0%3B%5Cn%5CtdeltaDirFast%20%3D%20vec4(dir.xyz%20*%20stepSizeFast%2C%20stepSizeFast)%3B%5Cn%5Ctwhile%20(samplePos.a%20%3C%3D%20len)%20%7B%5Cn%5Ct%5Ctfloat%20val%20%3D%20texture(overlay%2C%20samplePos.xyz).a%3B%5Cn%5Ct%5Ctif%20(drawOpacity%20%3E%200.0)%5Cn%5Ct%5Ct%5Ctval%20%3D%20max(val%2C%20texture(drawing%2C%20samplePos.xyz).r)%3B%5Cn%5Ct%5Ctif%20(val%20%3E%200.001)%5Cn%5Ct%5Ct%5Ctbreak%3B%5Cn%5Ct%5CtsamplePos%20%2B%3D%20deltaDirFast%3B%20%2F%2Fadvance%20ray%20position%5Cn%5Ct%7D%5Cn%5Ctif%20(samplePos.a%20%3E%3D%20len)%20%7B%5Cn%5Ct%5Ctif%20(isClip%20%26%26%20(fColor.a%20%3D%3D%200.0))%5Cn%5Ct%5Ct%5Ct%5CtfColor%20%2B%3D%20clipPlaneColorX%3B%5Cn%5Ct%5Ct%5Ctreturn%3B%5Cn%5Ct%7D%5Cn%5CtsamplePos%20-%3D%20deltaDirFast%3B%5Cn%5Ctif%20(samplePos.a%20%3C%200.0)%5Cn%5Ct%5Ctvec4%20samplePos%20%3D%20vec4(start.xyz%2C%200.0)%3B%20%2F%2Fray%20position%5Cn%5Ct%2F%2Fend%3A%20fast%20pass%5Cn%5Ctfloat%20overFarthest%20%3D%20len%3B%5Cn%5CtcolAcc%20%3D%20vec4(0.0%2C%200.0%2C%200.0%2C%200.0)%3B%5Cn%5Cn%5CtsamplePos%20%2B%3D%20deltaDir%20*%20ran%3B%20%2F%2Fjitter%20ray%5Cn%5Ctvec4%20overFirstHit%20%3D%20vec4(0.0%2C0.0%2C0.0%2C2.0%20*%20len)%3B%5Cn%5Ctif%20(backgroundMasksOverlays%20%3E%200)%5Cn%5Ct%5CtsamplePos%20%3D%20firstHit%3B%5Cn%5Ctbool%20firstDraw%20%3D%20true%3B%5Cn%5Ctwhile%20(samplePos.a%20%3C%3D%20len)%20%7B%5Cn%5Ct%5Ctvec4%20colorSample%20%3D%20texture(overlay%2C%20samplePos.xyz)%3B%5Cn%5Ct%5Ctif%20((colorSample.a%20%3C%200.01)%20%26%26%20(drawOpacity%20%3E%200.0))%20%7B%5Cn%5Ct%5Ct%5Ctfloat%20val%20%3D%20texture(drawing%2C%20samplePos.xyz).r%3B%5Cn%5Ct%5Ct%5Ctvec4%20draw%20%3D%20drawColor(val%2C%20drawOpacity)%3B%5Cn%5Ct%5Ct%5Ctif%20((draw.a%20%3E%200.0)%20%26%26%20(firstDraw))%20%7B%5Cn%5Ct%5Ct%5Ct%5CtfirstDraw%20%3D%20false%3B%5Cn%5Ct%5Ct%5Ct%5Ctfloat%20sum%20%3D%200.0%3B%5Cn%5Ct%5Ct%5Ct%5Ctconst%20float%20mn%20%3D%201.0%20%2F%20256.0%3B%5Cn%5Ct%5Ct%5Ct%5Ctconst%20float%20sampleRadius%20%3D%201.1%3B%5Cn%5Ct%5Ct%5Ct%5Ctfloat%20dx%20%3D%20sliceSize%20*%20sampleRadius%3B%5Cn%5Ct%5Ct%5Ct%5Ctvec3%20center%20%3D%20samplePos.xyz%3B%5Cn%5Ct%5Ct%5Ct%5Ct%2F%2Fsix%20neighbors%20that%20share%20a%20face%5Cn%5Ct%5Ct%5Ct%5Ctsum%20%2B%3D%20min(texture(drawing%2C%20center.xyz%20%2B%20cross(vec3(0.0%2C0.0%2C%2Bdx)%2C%20dir)).r%2C%20mn)%3B%5Cn%5Ct%5Ct%5Ct%5Ctsum%20%2B%3D%20min(texture(drawing%2C%20center.xyz%20%2B%20cross(vec3(0.0%2C0.0%2C-dx)%2C%20dir)).r%2C%20mn)%3B%5Cn%5Ct%5Ct%5Ct%5Ctsum%20%2B%3D%20min(texture(drawing%2C%20center.xyz%20%2B%20cross(vec3(0.0%2C%2Bdx%2C0.0)%2C%20dir)).r%2C%20mn)%3B%5Cn%5Ct%5Ct%5Ct%5Ctsum%20%2B%3D%20min(texture(drawing%2C%20center.xyz%20%2B%20cross(vec3(0.0%2C-dx%2C0.0)%2C%20dir)).r%2C%20mn)%3B%5Cn%5Ct%5Ct%5Ct%5Ctsum%20%2B%3D%20min(texture(drawing%2C%20center.xyz%20%2B%20cross(vec3(%2Bdx%2C0.0%2C0.0)%2C%20dir)).r%2C%20mn)%3B%5Cn%5Ct%5Ct%5Ct%5Ctsum%20%2B%3D%20min(texture(drawing%2C%20center.xyz%20%2B%20cross(vec3(-dx%2C0.0%2C0.0)%2C%20dir)).r%2C%20mn)%3B%5Cn%5Ct%5Ct%5Ct%5Ct%2F%2Ffloat%20proportion%20%3D%20(sum%20%2F%20mn)%20%2F%206.0%3B%5Cn%5Ct%5Ct%5Ct%5Ct%5Cn%5Ct%5Ct%5Ct%5Ct%2F%2F12%20neighbors%20that%20share%20an%20edge%5Cn%5Ct%5Ct%5Ct%5Ctdx%20%3D%20sliceSize%20*%20sampleRadius%20*%20sqrt(2.0)%20*%200.5%3B%5Cn%5Ct%5Ct%5Ct%5Ctsum%20%2B%3D%20min(texture(drawing%2C%20center.xyz%20%2B%20cross(vec3(0.0%2C%2Bdx%2C%2Bdx)%2C%20dir)).r%2C%20mn)%3B%5Cn%5Ct%5Ct%5Ct%5Ctsum%20%2B%3D%20min(texture(drawing%2C%20center.xyz%20%2B%20cross(vec3(%2Bdx%2C0.0%2C%2Bdx)%2C%20dir)).r%2C%20mn)%3B%5Cn%5Ct%5Ct%5Ct%5Ctsum%20%2B%3D%20min(texture(drawing%2C%20center.xyz%20%2B%20cross(vec3(%2Bdx%2C%2Bdx%2C0.0)%2C%20dir)).r%2C%20mn)%3B%5Cn%5Ct%5Ct%5Ct%5Ctsum%20%2B%3D%20min(texture(drawing%2C%20center.xyz%20%2B%20cross(vec3(0.0%2C-dx%2C-dx)%2C%20dir)).r%2C%20mn)%3B%5Cn%5Ct%5Ct%5Ct%5Ctsum%20%2B%3D%20min(texture(drawing%2C%20center.xyz%20%2B%20cross(vec3(-dx%2C0.0%2C-dx)%2C%20dir)).r%2C%20mn)%3B%5Cn%5Ct%5Ct%5Ct%5Ctsum%20%2B%3D%20min(texture(drawing%2C%20center.xyz%20%2B%20cross(vec3(-dx%2C-dx%2C0.0)%2C%20dir)).r%2C%20mn)%3B%5Cn%5Cn%5Ct%5Ct%5Ct%5Ctsum%20%2B%3D%20min(texture(drawing%2C%20center.xyz%20%2B%20cross(vec3(0.0%2C%2Bdx%2C-dx)%2C%20dir)).r%2C%20mn)%3B%5Cn%5Ct%5Ct%5Ct%5Ctsum%20%2B%3D%20min(texture(drawing%2C%20center.xyz%20%2B%20cross(vec3(%2Bdx%2C0.0%2C-dx)%2C%20dir)).r%2C%20mn)%3B%5Cn%5Ct%5Ct%5Ct%5Ctsum%20%2B%3D%20min(texture(drawing%2C%20center.xyz%20%2B%20cross(vec3(%2Bdx%2C-dx%2C0.0)%2C%20dir)).r%2C%20mn)%3B%5Cn%5Ct%5Ct%5Ct%5Ct%5Cn%5Ct%5Ct%5Ct%5Ctsum%20%2B%3D%20min(texture(drawing%2C%20center.xyz%20%2B%20cross(vec3(0.0%2C-dx%2C%2Bdx)%2C%20dir)).r%2C%20mn)%3B%5Cn%5Ct%5Ct%5Ct%5Ctsum%20%2B%3D%20min(texture(drawing%2C%20center.xyz%20%2B%20cross(vec3(-dx%2C0.0%2C%2Bdx)%2C%20dir)).r%2C%20mn)%3B%5Cn%5Ct%5Ct%5Ct%5Ctsum%20%2B%3D%20min(texture(drawing%2C%20center.xyz%20%2B%20cross(vec3(-dx%2C%2Bdx%2C0.0)%2C%20dir)).r%2C%20mn)%3B%5Cn%5Ct%5Ct%5Ct%5Ctfloat%20proportion%20%3D%20(sum%20%2F%20mn)%20%2F%2018.0%3B%20%2F%2Fproportion%20of%20six%20neighbors%20is%20non-zero%5Cn%5Ct%5Ct%5Ct%5Ct%5Cn%5Ct%5Ct%5Ct%5Ct%2F%2Fa%20high%20proportion%20of%20hits%20means%20crevice%5Cn%5Ct%5Ct%5Ct%5Ct%2F%2Fsince%20the%20AO%20term%20adds%20shadows%20that%20darken%20most%20voxels%2C%20it%20will%20result%20in%20dark%20surfaces%5Cn%5Ct%5Ct%5Ct%5Ct%2F%2Fthe%20term%20brighten%20adds%20a%20little%20illumination%20to%20balance%20this%5Cn%5Ct%5Ct%5Ct%5Ct%2F%2F%20without%20brighten%2C%20only%20the%20most%20extreme%20ridges%20will%20not%20be%20darker%5Cn%5Ct%5Ct%5Ct%5Ctconst%20float%20brighten%20%3D%201.2%3B%5Cn%5Ct%5Ct%5Ct%5Ctvec3%20ao%20%3D%20draw.rgb%20*%20(1.0%20-%20proportion)%20*%20brighten%3B%5Cn%5Ct%5Ct%5Ct%5Ctdraw.rgb%20%3D%20mix%20(draw.rgb%2C%20ao%20%2C%20renderDrawAmbientOcclusionX)%3B%5Cn%5Ct%5Ct%5Ct%7D%5Cn%5Ct%5Ct%5CtcolorSample%20%3D%20draw%3B%5Cn%5Ct%5Ct%7D%5Cn%5Ct%5CtsamplePos%20%2B%3D%20deltaDir%3B%20%2F%2Fadvance%20ray%20position%5Cn%5Ct%5Ctif%20(colorSample.a%20%3E%3D%200.01)%20%7B%5Cn%5Ct%5Ct%5Ctif%20(overFirstHit.a%20%3E%20len)%5Cn%5Ct%5Ct%5Ct%5CtoverFirstHit%20%3D%20samplePos%3B%5Cn%5Ct%5Ct%5CtcolorSample.a%20*%3D%20renderOverlayBlend%3B%5Cn%5Ct%5Ct%5CtcolorSample.a%20%3D%201.0-pow((1.0%20-%20colorSample.a)%2C%20opacityCorrection)%3B%5Cn%5Ct%5Ct%5CtcolorSample.rgb%20*%3D%20colorSample.a%3B%5Cn%5Ct%5Ct%5CtcolAcc%3D%20(1.0%20-%20colAcc.a)%20*%20colorSample%20%2B%20colAcc%3B%5Cn%5Ct%5Ct%5CtoverFarthest%20%3D%20samplePos.a%3B%5Cn%5Ct%5Ct%5Ctif%20(%20colAcc.a%20%3E%20earlyTermination%20)%5Cn%5Ct%5Ct%5Ct%5Ctbreak%3B%5Cn%5Ct%5Ct%7D%5Cn%5Ct%7D%5Cn%5Ct%2F%2Fif%20(samplePos.a%20%3E%3D%20len)%20%7B%5Cn%5Ctif%20(colAcc.a%20%3C%3D%200.0)%20%7B%5Cn%5Ct%5Ctif%20(isClip%20%26%26%20(fColor.a%20%3D%3D%200.0))%5Cn%5Ct%5Ct%5CtfColor%20%2B%3D%20clipPlaneColorX%3B%5Cn%5Ct%5Ctreturn%3B%5Cn%5Ct%7D%5Cn%5Ctif%20(overFirstHit.a%20%3C%20firstHit.a)%5Cn%5Ct%5Ctgl_FragDepth%20%3D%20frac2ndc(overFirstHit.xyz)%3B%5Cn%5Ctfloat%20overMix%20%3D%20colAcc.a%3B%5Cn%5Ctfloat%20overlayDepth%20%3D%200.3%3B%5Cn%5Ctif%20(fColor.a%20%3C%3D%200.0)%5Cn%5Ct%5CtoverMix%20%3D%201.0%3B%5Cn%5Ctelse%20if%20(((overFarthest)%20%3E%20backNearest))%20%7B%5Cn%5Ct%5Ctfloat%20dx%20%3D%20(overFarthest%20-%20backNearest)%2F1.73%3B%5Cn%5Ct%5Ctdx%20%3D%20fColor.a%20*%20pow(dx%2C%20overlayDepth)%3B%5Cn%5Ct%5CtoverMix%20*%3D%201.0%20-%20dx%3B%5Cn%5Ct%7D%5Cn%5CtfColor.rgb%20%3D%20mix(fColor.rgb%2C%20colAcc.rgb%2C%20overMix)%3B%5Cn%5CtfColor.a%20%3D%20max(fColor.a%2C%20colAcc.a)%3B%5Cn%7D%22%2Cb%3D%22%23version%20300%20es%5Cn%23line%20215%5Cnprecision%20highp%20int%3B%5Cnprecision%20highp%20float%3B%5Cnuniform%20vec3%20rayDir%3B%5Cnuniform%20vec3%20texVox%3B%5Cnuniform%20int%20backgroundMasksOverlays%3B%5Cnuniform%20vec3%20volScale%3B%5Cnuniform%20vec4%20clipPlane%3B%5Cnuniform%20highp%20sampler3D%20volume%2C%20overlay%3B%5Cnuniform%20float%20overlays%3B%5Cnuniform%20float%20clipThick%3B%5Cnuniform%20vec3%20clipLo%3B%5Cnuniform%20vec3%20clipHi%3B%5Cnuniform%20float%20backOpacity%3B%5Cnuniform%20mat4%20mvpMtx%3B%5Cnuniform%20mat4%20matRAS%3B%5Cnuniform%20vec4%20clipPlaneColor%3B%5Cnuniform%20float%20renderOverlayBlend%3B%5Cnuniform%20highp%20sampler3D%20drawing%3B%5Cnuniform%20highp%20sampler2D%20colormap%3B%5Cnuniform%20vec2%20renderDrawAmbientOcclusionXY%3B%5Cnin%20vec3%20vColor%3B%5Cnout%20vec4%20fColor%3B%5Cn%22%2Bv%2B%22%5Cn%5Ctvoid%20main()%20%7B%5Cn%5Ctvec3%20start%20%3D%20vColor%3B%5Cn%5Ctgl_FragDepth%20%3D%200.0%3B%5Cn%5Ctvec3%20backPosition%20%3D%20GetBackPosition(start)%3B%5Cn%5Ctvec3%20dir%20%3D%20normalize(backPosition%20-%20start)%3B%5Cn%5CtclipVolumeStart(start%2C%20backPosition)%3B%5Cn%5Ctfloat%20len%20%3D%20length(backPosition%20-%20start)%3B%5Cn%5Ctfloat%20lenVox%20%3D%20length((texVox%20*%20start)%20-%20(texVox%20*%20backPosition))%3B%5Cn%5Ctif%20((lenVox%20%3C%200.5)%20%7C%7C%20(len%20%3E%203.0))%20%7B%20%2F%2Flength%20limit%20for%20parallel%20rays%5Cn%5Ct%5CtfColor%20%3D%20vec4(0.0%2C0.0%2C0.0%2C0.0)%3B%5Cn%5Ct%5Ctreturn%3B%5Cn%5Ct%7D%5Cn%5Ctfloat%20sliceSize%20%3D%20len%20%2F%20lenVox%3B%20%2F%2Fe.g.%20if%20ray%20length%20is%201.0%20and%20traverses%2050%20voxels%2C%20each%20voxel%20is%200.02%20in%20unit%20cube%5Cn%5Ctfloat%20stepSize%20%3D%20sliceSize%3B%20%2F%2Fquality%3A%20larger%20step%20is%20faster%20traversal%2C%20but%20fewer%20samples%5Cn%5Ctfloat%20opacityCorrection%20%3D%20stepSize%2FsliceSize%3B%5Cn%5Ctvec4%20deltaDir%20%3D%20vec4(dir.xyz%20*%20stepSize%2C%20stepSize)%3B%5Cn%5Ctvec4%20samplePos%20%3D%20vec4(start.xyz%2C%200.0)%3B%20%2F%2Fray%20position%5Cn%5Ctvec4%20colAcc%20%3D%20vec4(0.0%2C0.0%2C0.0%2C0.0)%3B%5Cn%5Ctvec4%20firstHit%20%3D%20vec4(0.0%2C0.0%2C0.0%2C2.0%20*%20len)%3B%5Cn%5Ctconst%20float%20earlyTermination%20%3D%200.95%3B%5Cn%5Ctfloat%20backNearest%20%3D%20len%3B%20%2F%2Fassume%20no%20hit%5Cn%5Ctfloat%20dis%20%3D%20len%3B%5Cn%5Ct%2F%2Fcheck%20if%20axial%20plane%20is%20closest%5Cn%5Ctvec4%20aClip%20%3D%20vec4(0.0%2C%200.0%2C%201.0%2C%20(1.0-%20clipPlane.z)%20-%200.5)%3B%5Cn%5Ctfloat%20adis%20%3D%20(-aClip.a%20-%20dot(aClip.xyz%2C%20samplePos.xyz-0.5))%20%2F%20dot(dir%2CaClip.xyz)%3B%5Cn%5Ctif%20(adis%20%3E%200.0)%5Cn%5Ct%5Ctdis%20%3D%20min(adis%2C%20dis)%3B%5Cn%5Ct%2F%2Fcheck%20of%20coronal%20plane%20is%20closest%5Cn%5Ctvec4%20cClip%20%3D%20vec4(0.0%2C%201.0%2C%200.0%2C%20(1.0-%20clipPlane.y)%20-%200.5)%3B%5Cn%5Ctfloat%20cdis%20%3D%20(-cClip.a%20-%20dot(cClip.xyz%2C%20samplePos.xyz-0.5))%20%2F%20dot(dir%2CcClip.xyz)%3B%5Cn%5Ctif%20(cdis%20%3E%200.0)%5Cn%5Ct%5Ctdis%20%3D%20min(cdis%2C%20dis)%3B%5Cn%5Ct%2F%2Fcheck%20if%20coronal%20slice%20is%20closest%5Cn%5Ctvec4%20sClip%20%3D%20vec4(1.0%2C%200.0%2C%200.0%2C%20(1.0-%20clipPlane.x)%20-%200.5)%3B%5Cn%5Ctfloat%20sdis%20%3D%20(-sClip.a%20-%20dot(sClip.xyz%2C%20samplePos.xyz-0.5))%20%2F%20dot(dir%2CsClip.xyz)%3B%5Cn%5Ctif%20(sdis%20%3E%200.0)%5Cn%5Ct%5Ctdis%20%3D%20min(sdis%2C%20dis)%3B%5Cn%5Ctif%20((dis%20%3E%200.0)%20%26%26%20(dis%20%3C%20len))%20%7B%5Cn%5Ct%5CtsamplePos%20%3D%20vec4(samplePos.xyz%2Bdir%20*%20dis%2C%20dis)%3B%5Cn%5Ct%5CtcolAcc%20%3D%20texture(volume%2C%20samplePos.xyz)%3B%5Cn%5Ct%5CtcolAcc.a%20%3D%20earlyTermination%3B%5Cn%5Ct%5CtfirstHit%20%3D%20samplePos%3B%5Cn%5Ct%5CtbackNearest%20%3D%20min(backNearest%2C%20samplePos.a)%3B%5Cn%5Ct%7D%5Cn%5Ct%2F%2Fthe%20following%20are%20only%20used%20by%20overlays%5Cn%5Ctvec4%20clipPlaneColorX%20%3D%20clipPlaneColor%3B%5Cn%5Ctbool%20isColorPlaneInVolume%20%3D%20false%3B%5Cn%5Ctfloat%20lenNoClip%20%3D%20len%3B%5Cn%5Ctbool%20isClip%20%3D%20false%3B%5Cn%5Ctvec4%20clipPos%20%3D%20applyClip(dir%2C%20samplePos%2C%20len%2C%20isClip)%3B%5Cn%5Ctfloat%20stepSizeFast%20%3D%20sliceSize%20*%201.9%3B%5Cn%5Ctvec4%20deltaDirFast%20%3D%20vec4(dir.xyz%20*%20stepSizeFast%2C%20stepSizeFast)%3B%5Cn%5Ctif%20(samplePos.a%20%3C%200.0)%5Cn%5Ct%5Ctvec4%20samplePos%20%3D%20vec4(start.xyz%2C%200.0)%3B%20%2F%2Fray%20position%5Cn%5Ctfloat%20ran%20%3D%20fract(sin(gl_FragCoord.x%20*%2012.9898%20%2B%20gl_FragCoord.y%20*%2078.233)%20*%2043758.5453)%3B%5Cn%5CtsamplePos%20%2B%3D%20deltaDir%20*%20ran%3B%20%2F%2Fjitter%20ray%5Cn%22%2Bw%2CC%3D%22%23version%20300%20es%5Cn%23line%20215%5Cnprecision%20highp%20int%3B%5Cnprecision%20highp%20float%3B%5Cnuniform%20vec3%20rayDir%3B%5Cnuniform%20vec3%20texVox%3B%5Cnuniform%20int%20backgroundMasksOverlays%3B%5Cnuniform%20vec3%20volScale%3B%5Cnuniform%20vec4%20clipPlane%3B%5Cnuniform%20highp%20sampler3D%20volume%2C%20overlay%3B%5Cnuniform%20float%20overlays%3B%5Cnuniform%20float%20clipThick%3B%5Cnuniform%20vec3%20clipLo%3B%5Cnuniform%20vec3%20clipHi%3B%5Cnuniform%20float%20backOpacity%3B%5Cnuniform%20mat4%20mvpMtx%3B%5Cnuniform%20mat4%20matRAS%3B%5Cnuniform%20vec4%20clipPlaneColor%3B%5Cnuniform%20float%20renderOverlayBlend%3B%5Cnuniform%20highp%20sampler3D%20drawing%3B%5Cnuniform%20highp%20sampler2D%20colormap%3B%5Cnuniform%20vec2%20renderDrawAmbientOcclusionXY%3B%5Cnin%20vec3%20vColor%3B%5Cnout%20vec4%20fColor%3B%5Cn%22%2Bv%2Bx%2B%22while%20(samplePos.a%20%3C%3D%20len)%20%7B%5Cn%5Ct%5Ctvec4%20colorSample%20%3D%20texture(volume%2C%20samplePos.xyz)%3B%5Cn%5Ct%5CtsamplePos%20%2B%3D%20deltaDir%3B%20%2F%2Fadvance%20ray%20position%5Cn%5Ct%5Ctif%20(colorSample.a%20%3E%3D%200.01)%20%7B%5Cn%5Ct%5Ct%5Ctif%20(firstHit.a%20%3E%20lenNoClip)%5Cn%5Ct%5Ct%5Ct%5CtfirstHit%20%3D%20samplePos%3B%5Cn%5Ct%5Ct%5CtbackNearest%20%3D%20min(backNearest%2C%20samplePos.a)%3B%5Cn%5Ct%5Ct%5CtcolorSample.a%20%3D%201.0-pow((1.0%20-%20colorSample.a)%2C%20opacityCorrection)%3B%5Cn%5Ct%5Ct%5CtcolorSample.rgb%20*%3D%20colorSample.a%3B%5Cn%5Ct%5Ct%5CtcolAcc%3D%20(1.0%20-%20colAcc.a)%20*%20colorSample%20%2B%20colAcc%3B%5Cn%5Ct%5Ct%5Ctif%20(%20colAcc.a%20%3E%20earlyTermination%20)%5Cn%5Ct%5Ct%5Ct%5Ctbreak%3B%5Cn%5Ct%5Ct%7D%5Cn%5Ct%7D%5Cn%22%2Bw%2Cy%3D%22%23version%20300%20es%5Cn%23line%20215%5Cnprecision%20highp%20int%3B%5Cnprecision%20highp%20float%3B%5Cnuniform%20vec3%20rayDir%3B%5Cnuniform%20vec3%20texVox%3B%5Cnuniform%20int%20backgroundMasksOverlays%3B%5Cnuniform%20vec3%20volScale%3B%5Cnuniform%20vec4%20clipPlane%3B%5Cnuniform%20highp%20sampler3D%20volume%2C%20overlay%3B%5Cnuniform%20float%20overlays%3B%5Cnuniform%20float%20clipThick%3B%5Cnuniform%20vec3%20clipLo%3B%5Cnuniform%20vec3%20clipHi%3B%5Cnuniform%20float%20backOpacity%3B%5Cnuniform%20mat4%20mvpMtx%3B%5Cnuniform%20mat4%20normMtx%3B%5Cnuniform%20mat4%20matRAS%3B%5Cnuniform%20vec4%20clipPlaneColor%3B%5Cnuniform%20float%20renderOverlayBlend%3B%5Cnuniform%20highp%20sampler3D%20drawing%2C%20gradient%3B%5Cnuniform%20highp%20sampler2D%20colormap%3B%5Cnuniform%20highp%20sampler2D%20matCap%3B%5Cnuniform%20vec2%20renderDrawAmbientOcclusionXY%3B%5Cnuniform%20float%20gradientAmount%3B%5Cnuniform%20float%20gradientOpacity%5B256%5D%3B%5Cnin%20vec3%20vColor%3B%5Cnout%20vec4%20fColor%3B%5Cn%22%2CI%3Dy%2Bv%2Bx%2B%22%5Cn%5Ctfloat%20startPos%20%3D%20samplePos.a%3B%5Cn%5Ctfloat%20clipClose%20%3D%20clipPos.a%20%2B%203.0%20*%20deltaDir.a%3B%20%2F%2Fdo%20not%20apply%20gradients%20near%20clip%20plane%5Cn%5Ctfloat%20brighten%20%3D%202.0%3B%20%2F%2Fmodulating%20makes%20average%20intensity%20darker%200.5%20*%200.5%20%3D%200.25%5Cn%5Ct%2F%2Fvec4%20prevGrad%20%3D%20vec4(0.0)%3B%5Cn%5Ctwhile%20(samplePos.a%20%3C%3D%20len)%20%7B%5Cn%5Ct%5Ctvec4%20colorSample%20%3D%20texture(volume%2C%20samplePos.xyz)%3B%5Cn%5Ct%5Ctif%20(colorSample.a%20%3E%3D%200.0)%20%7B%5Cn%5Ct%5Ct%5Ctvec4%20grad%20%3D%20texture(gradient%2C%20samplePos.xyz)%3B%5Cn%5Ct%5Ct%5Ctgrad.rgb%20%3D%20normalize(grad.rgb*2.0%20-%201.0)%3B%5Cn%5Ct%5Ct%5Ct%2F%2Fif%20(grad.a%20%3C%20prevGrad.a)%5Cn%5Ct%5Ct%5Ct%2F%2F%5Ctgrad.rgb%20%3D%20prevGrad.rgb%3B%5Cn%5Ct%5Ct%5Ct%2F%2FprevGrad%20%3D%20grad%3B%5Cn%5Ct%5Ct%5Ctvec3%20n%20%3D%20mat3(normMtx)%20*%20grad.rgb%3B%5Cn%5Ct%5Ct%5Ctn.y%20%3D%20-%20n.y%3B%5Cn%5Ct%5Ct%5Ctvec4%20mc%20%3D%20vec4(texture(matCap%2C%20n.xy%20*%200.5%20%2B%200.5).rgb%2C%201.0)%20*%20brighten%3B%5Cn%5Ct%5Ct%5Ctmc%20%3D%20mix(vec4(1.0)%2C%20mc%2C%20gradientAmount)%3B%5Cn%5Ct%5Ct%5Ctif%20(samplePos.a%20%3E%20clipClose)%5Cn%5Ct%5Ct%5Ct%5CtcolorSample.rgb%20*%3D%20mc.rgb%3B%5Cn%5Ct%5Ct%5Ctif%20(firstHit.a%20%3E%20lenNoClip)%5Cn%5Ct%5Ct%5Ct%5CtfirstHit%20%3D%20samplePos%3B%5Cn%5Ct%5Ct%5CtbackNearest%20%3D%20min(backNearest%2C%20samplePos.a)%3B%5Cn%5Ct%5Ct%5CtcolorSample.a%20%3D%201.0-pow((1.0%20-%20colorSample.a)%2C%20opacityCorrection)%3B%5Cn%5Ct%5Ct%5Ctint%20gradIdx%20%3D%20int(grad.a%20*%20255.0)%3B%5Cn%5Ct%5Ct%5CtcolorSample.a%20*%3D%20gradientOpacity%5BgradIdx%5D%3B%5Cn%5Ct%5Ct%5CtcolorSample.rgb%20*%3D%20colorSample.a%3B%5Cn%5Ct%5Ct%5CtcolAcc%3D%20(1.0%20-%20colAcc.a)%20*%20colorSample%20%2B%20colAcc%3B%5Cn%5Ct%5Ct%5Ctif%20(%20colAcc.a%20%3E%20earlyTermination%20)%5Cn%5Ct%5Ct%5Ct%5Ctbreak%3B%5Cn%5Ct%5Ct%7D%5Cn%5Ct%5CtsamplePos%20%2B%3D%20deltaDir%3B%20%2F%2Fadvance%20ray%20position%5Cn%5Ct%7D%5Cn%22%2Bw%2CM%3Dy%2Bv%2Bx%2B%22%5Cn%5Ctfloat%20startPos%20%3D%20samplePos.a%3B%5Cn%5Ctfloat%20clipClose%20%3D%20clipPos.a%20%2B%203.0%20*%20deltaDir.a%3B%20%2F%2Fdo%20not%20apply%20gradients%20near%20clip%20plane%5Cn%5Ctfloat%20brighten%20%3D%202.0%3B%20%2F%2Fmodulating%20makes%20average%20intensity%20darker%200.5%20*%200.5%20%3D%200.25%5Cn%5Ct%2F%2Fvec4%20prevGrad%20%3D%20vec4(0.0)%3B%5Cn%5Ctwhile%20(samplePos.a%20%3C%3D%20len)%20%7B%5Cn%5Ct%5Ctvec4%20colorSample%20%3D%20texture(volume%2C%20samplePos.xyz)%3B%5Cn%5Ct%5Ctif%20(colorSample.a%20%3E%3D%200.0)%20%7B%5Cn%5Ct%5Ct%5Ctvec4%20grad%20%3D%20texture(gradient%2C%20samplePos.xyz)%3B%5Cn%5Ct%5Ct%5CtcolorSample.rgb%20%3D%20abs(normalize(grad.rgb*2.0%20-%201.0))%3B%5Cn%5Ct%5Ct%5Ctif%20(firstHit.a%20%3E%20lenNoClip)%5Cn%5Ct%5Ct%5Ct%5CtfirstHit%20%3D%20samplePos%3B%5Cn%5Ct%5Ct%5CtbackNearest%20%3D%20min(backNearest%2C%20samplePos.a)%3B%5Cn%5Ct%5Ct%5CtcolorSample.a%20%3D%201.0-pow((1.0%20-%20colorSample.a)%2C%20opacityCorrection)%3B%5Cn%5Ct%5Ct%5CtcolorSample.rgb%20*%3D%20colorSample.a%3B%5Cn%5Ct%5Ct%5CtcolAcc%3D%20(1.0%20-%20colAcc.a)%20*%20colorSample%20%2B%20colAcc%3B%5Cn%5Ct%5Ct%5Ctif%20(%20colAcc.a%20%3E%20earlyTermination%20)%5Cn%5Ct%5Ct%5Ct%5Ctbreak%3B%5Cn%5Ct%5Ct%7D%5Cn%5Ct%5CtsamplePos%20%2B%3D%20deltaDir%3B%20%2F%2Fadvance%20ray%20position%5Cn%5Ct%7D%5Cn%22%2Bw%2CD%3D%22%23version%20300%20es%5Cn%23line%20392%5Cnlayout(location%3D0)%20in%20vec3%20pos%3B%5Cnuniform%20int%20axCorSag%3B%5Cnuniform%20mat4%20mvpMtx%3B%5Cnuniform%20mat4%20frac2mm%3B%5Cnuniform%20float%20slice%3B%5Cnout%20vec3%20texPos%3B%5Cnvoid%20main(void)%20%7B%5Cn%5CttexPos%20%3D%20vec3(pos.x%2C%20pos.y%2C%20slice)%3B%5Cn%5Ctif%20(axCorSag%20%3E%201)%5Cn%5Ct%5CttexPos%20%3D%20vec3(slice%2C%20pos.x%2C%20pos.y)%3B%5Cn%5Ctelse%20if%20(axCorSag%20%3E%200)%5Cn%5Ct%5CttexPos%20%3D%20vec3(pos.x%2C%20slice%2C%20pos.y)%3B%5Cn%5Ctvec4%20mm%20%3D%20frac2mm%20*%20vec4(texPos%2C%201.0)%3B%5Cn%5Ctgl_Position%20%3D%20mvpMtx%20*%20mm%3B%5Cn%7D%22%2CF%3D%22%23version%20300%20es%5Cn%23line%20411%5Cnprecision%20highp%20int%3B%5Cnprecision%20highp%20float%3B%5Cnuniform%20highp%20sampler3D%20volume%2C%20overlay%3B%5Cnuniform%20int%20backgroundMasksOverlays%3B%5Cnuniform%20float%20overlayOutlineWidth%3B%5Cnuniform%20float%20overlayAlphaShader%3B%5Cnuniform%20int%20axCorSag%3B%5Cnuniform%20float%20overlays%3B%5Cnuniform%20float%20opacity%3B%5Cnuniform%20float%20drawOpacity%3B%5Cnuniform%20bool%20isAlphaClipDark%3B%5Cnuniform%20highp%20sampler3D%20drawing%3B%5Cnuniform%20highp%20sampler2D%20colormap%3B%5Cnin%20vec3%20texPos%3B%5Cnout%20vec4%20color%3B%22%2Bp%2B'void%20main()%20%7B%5Cn%5Ct%2F%2Fcolor%20%3D%20vec4(1.0%2C%200.0%2C%201.0%2C%201.0)%3Breturn%3B%5Cn%5Ctvec4%20background%20%3D%20texture(volume%2C%20texPos)%3B%5Cn%5Ctcolor%20%3D%20vec4(background.rgb%2C%20opacity)%3B%5Cn%5Ctif%20((isAlphaClipDark)%20%26%26%20(background.a%20%3D%3D%200.0))%20color.a%20%3D%200.0%3B%20%2F%2FFSLeyes%20clipping%20range%5Cn%5Ctvec4%20ocolor%20%3D%20vec4(0.0)%3B%5Cn%5Ctfloat%20overlayAlpha%20%3D%20overlayAlphaShader%3B%5Cn%5Ctif%20(overlays%20%3E%200.0)%20%7B%5Cn%5Ct%5Ctocolor%20%3D%20texture(overlay%2C%20texPos)%3B%5Cn%5Ct%5Ct%2F%2FdFdx%20for%20%22boxing%22%20issue%20435%20has%20aliasing%20on%20some%20implementations%20(coarse%20vs%20fine)%5Cn%5Ct%5Ct%2F%2Fhowever%2C%20this%20only%20identifies%2050%25%20of%20the%20edges%20due%20to%20aliasing%20effects%5Cn%5Ct%5Ct%2F%2F%20http%3A%2F%2Fwww.aclockworkberry.com%2Fshader-derivative-functions%2F%5Cn%5Ct%5Ct%2F%2F%20https%3A%2F%2Fbgolus.medium.com%2Fdistinctive-derivative-differences-cce38d36797b%5Cn%5Ct%5Ct%2F%2Fif%20((ocolor.a%20%3E%3D%201.0)%20%26%26%20((dFdx(ocolor.a)%20!%3D%200.0)%20%7C%7C%20(dFdy(ocolor.a)%20!%3D%200.0)%20%20))%5Cn%5Ct%5Ct%2F%2F%5Ctocolor.rbg%20%3D%20vec3(0.0%2C%200.0%2C%200.0)%3B%5Cn%5Ct%5Ctbool%20isOutlineBelowNotAboveThreshold%20%3D%20true%3B%5Cn%5Ct%5Ctif%20(isOutlineBelowNotAboveThreshold)%20%7B%5Cn%5Ct%5Ct%5Ctif%20((overlayOutlineWidth%20%3E%200.0)%20%26%26%20(ocolor.a%20%3C%201.0))%20%7B%20%2F%2Fcheck%20voxel%20neighbors%20for%20edge%5Cn%5Ct%5Ct%5Ct%5Ctvec3%20vx%20%3D%20(overlayOutlineWidth%20)%20%2F%20vec3(textureSize(overlay%2C%200))%3B%5Cn%5Ct%5Ct%5Ct%5Ct%2F%2F6%20voxel%20neighbors%20that%20share%20a%20face%5Cn%5Ct%5Ct%5Ct%5Ctvec3%20vxR%20%3D%20vec3(texPos.x%2Bvx.x%2C%20texPos.y%2C%20texPos.z)%3B%5Cn%5Ct%5Ct%5Ct%5Ctvec3%20vxL%20%3D%20vec3(texPos.x-vx.x%2C%20texPos.y%2C%20texPos.z)%3B%5Cn%5Ct%5Ct%5Ct%5Ctvec3%20vxA%20%3D%20vec3(texPos.x%2C%20texPos.y%2Bvx.y%2C%20texPos.z)%3B%5Cn%5Ct%5Ct%5Ct%5Ctvec3%20vxP%20%3D%20vec3(texPos.x%2C%20texPos.y-vx.y%2C%20texPos.z)%3B%5Cn%5Ct%5Ct%5Ct%5Ctvec3%20vxS%20%3D%20vec3(texPos.x%2C%20texPos.y%2C%20texPos.z%2Bvx.z)%3B%5Cn%5Ct%5Ct%5Ct%5Ctvec3%20vxI%20%3D%20vec3(texPos.x%2C%20texPos.y%2C%20texPos.z-vx.z)%3B%5Cn%5Ct%5Ct%5Ct%5Ctfloat%20a%20%3D%200.0%3B%5Cn%5Ct%5Ct%5Ct%5Ctif%20(axCorSag%20!%3D%202)%20%7B%5Cn%5Ct%5Ct%5Ct%5Ct%5Cta%20%3D%20max(a%2C%20texture(overlay%2C%20vxR).a)%3B%5Cn%5Ct%5Ct%5Ct%5Ct%5Cta%20%3D%20max(a%2C%20texture(overlay%2C%20vxL).a)%3B%5Cn%5Ct%5Ct%5Ct%5Ct%7D%5Cn%5Ct%5Ct%5Ct%5Ctif%20(axCorSag%20!%3D%201)%20%7B%5Cn%5Ct%5Ct%5Ct%5Ct%5Cta%20%3D%20max(a%2C%20texture(overlay%2C%20vxA).a)%3B%5Cn%5Ct%5Ct%5Ct%5Ct%5Cta%20%3D%20max(a%2C%20texture(overlay%2C%20vxP).a)%3B%5Cn%5Ct%5Ct%5Ct%5Ct%7D%5Cn%5Ct%5Ct%5Ct%5Ctif%20(axCorSag%20!%3D%200)%20%7B%5Cn%5Ct%5Ct%5Ct%5Ct%5Cta%20%3D%20max(a%2C%20texture(overlay%2C%20vxS).a)%3B%5Cn%5Ct%5Ct%5Ct%5Ct%5Cta%20%3D%20max(a%2C%20texture(overlay%2C%20vxI).a)%3B%5Cn%5Ct%5Ct%5Ct%5Ct%7D%5Cn%5Ct%5Ct%5Ct%5Ctbool%20isCheckCorners%20%3D%20true%3B%5Cn%5Ct%5Ct%5Ct%5Ctif%20(isCheckCorners)%20%7B%5Cn%5Ct%5Ct%5Ct%5Ct%5Ct%2F%2F12%20voxel%20neighbors%20that%20share%20an%20edge%5Cn%5Ct%5Ct%5Ct%5Ct%5Ctvec3%20vxRA%20%3D%20vec3(texPos.x%2Bvx.x%2C%20texPos.y%2Bvx.y%2C%20texPos.z)%3B%5Cn%5Ct%5Ct%5Ct%5Ct%5Ctvec3%20vxLA%20%3D%20vec3(texPos.x-vx.x%2C%20texPos.y%2Bvx.y%2C%20texPos.z)%3B%5Cn%5Ct%5Ct%5Ct%5Ct%5Ctvec3%20vxRP%20%3D%20vec3(texPos.x%2Bvx.x%2C%20texPos.y-vx.y%2C%20texPos.z)%3B%5Cn%5Ct%5Ct%5Ct%5Ct%5Ctvec3%20vxLP%20%3D%20vec3(texPos.x-vx.x%2C%20texPos.y-vx.y%2C%20texPos.z)%3B%5Cn%5Ct%5Ct%5Ct%5Ct%5Ctvec3%20vxRS%20%3D%20vec3(texPos.x%2Bvx.x%2C%20texPos.y%2C%20texPos.z%2Bvx.z)%3B%5Cn%5Ct%5Ct%5Ct%5Ct%5Ctvec3%20vxLS%20%3D%20vec3(texPos.x-vx.x%2C%20texPos.y%2C%20texPos.z%2Bvx.z)%3B%5Cn%5Ct%5Ct%5Ct%5Ct%5Ctvec3%20vxRI%20%3D%20vec3(texPos.x%2Bvx.x%2C%20texPos.y%2C%20texPos.z-vx.z)%3B%5Cn%5Ct%5Ct%5Ct%5Ct%5Ctvec3%20vxLI%20%3D%20vec3(texPos.x-vx.x%2C%20texPos.y%2C%20texPos.z-vx.z)%3B%5Cn%5Ct%5Ct%5Ct%5Ct%5Ctvec3%20vxAS%20%3D%20vec3(texPos.x%2C%20texPos.y%2Bvx.y%2C%20texPos.z%2Bvx.z)%3B%5Cn%5Ct%5Ct%5Ct%5Ct%5Ctvec3%20vxPS%20%3D%20vec3(texPos.x%2C%20texPos.y-vx.y%2C%20texPos.z%2Bvx.z)%3B%5Cn%5Ct%5Ct%5Ct%5Ct%5Ctvec3%20vxAI%20%3D%20vec3(texPos.x%2C%20texPos.y%2Bvx.y%2C%20texPos.z-vx.z)%3B%5Cn%5Ct%5Ct%5Ct%5Ct%5Ctvec3%20vxPI%20%3D%20vec3(texPos.x%2C%20texPos.y-vx.y%2C%20texPos.z-vx.z)%3B%5Cn%5Cn%5Ct%5Ct%5Ct%5Ct%5Ctif%20(axCorSag%20%3D%3D%200)%20%7B%20%2F%2Faxial%20corners%5Cn%5Ct%5Ct%5Ct%5Ct%5Ct%5Cta%20%3D%20max(a%2C%20texture(overlay%2C%20vxRA).a)%3B%5Cn%5Ct%5Ct%5Ct%5Ct%5Ct%5Cta%20%3D%20max(a%2C%20texture(overlay%2C%20vxLA).a)%3B%5Cn%5Ct%5Ct%5Ct%5Ct%5Ct%5Cta%20%3D%20max(a%2C%20texture(overlay%2C%20vxRP).a)%3B%5Cn%5Ct%5Ct%5Ct%5Ct%5Ct%5Cta%20%3D%20max(a%2C%20texture(overlay%2C%20vxLP).a)%3B%5Cn%5Ct%5Ct%5Ct%5Ct%5Ct%7D%5Cn%5Ct%5Ct%5Ct%5Ct%5Ctif%20(axCorSag%20%3D%3D%201)%20%7B%20%2F%2Fcoronal%20corners%5Cn%5Ct%5Ct%5Ct%5Ct%5Ct%5Cta%20%3D%20max(a%2C%20texture(overlay%2C%20vxRS).a)%3B%5Cn%5Ct%5Ct%5Ct%5Ct%5Ct%5Cta%20%3D%20max(a%2C%20texture(overlay%2C%20vxLS).a)%3B%5Cn%5Ct%5Ct%5Ct%5Ct%5Ct%5Cta%20%3D%20max(a%2C%20texture(overlay%2C%20vxRI).a)%3B%5Cn%5Ct%5Ct%5Ct%5Ct%5Ct%5Cta%20%3D%20max(a%2C%20texture(overlay%2C%20vxLI).a)%3B%5Cn%5Ct%5Ct%5Ct%5Ct%5Ct%7D%5Cn%5Ct%5Ct%5Ct%5Ct%5Ctif%20(axCorSag%20%3D%3D%202)%20%7B%20%2F%2Fsagittal%20corners%5Cn%5Ct%5Ct%5Ct%5Ct%5Ct%5Cta%20%3D%20max(a%2C%20texture(overlay%2C%20vxAS).a)%3B%5Cn%5Ct%5Ct%5Ct%5Ct%5Ct%5Cta%20%3D%20max(a%2C%20texture(overlay%2C%20vxPS).a)%3B%5Cn%5Ct%5Ct%5Ct%5Ct%5Ct%5Cta%20%3D%20max(a%2C%20texture(overlay%2C%20vxAI).a)%3B%5Cn%5Ct%5Ct%5Ct%5Ct%5Ct%5Cta%20%3D%20max(a%2C%20texture(overlay%2C%20vxPI).a)%3B%5Cn%5Ct%5Ct%5Ct%5Ct%5Ct%7D%5Cn%5Ct%5Ct%5Ct%5Ct%7D%5Cn%5Ct%5Ct%5Ct%5Ctif%20(a%20%3E%3D%201.0)%20%7B%5Cn%5Ct%5Ct%5Ct%5Ct%5Ctocolor%20%3D%20vec4(0.0%2C%200.0%2C%200.0%2C%201.0)%3B%5Cn%5Ct%5Ct%5Ct%5Ct%5CtoverlayAlpha%20%3D%201.0%3B%5Cn%5Ct%5Ct%5Ct%5Ct%7D%5Cn%5Ct%5Ct%5Ct%7D%5Cn%5Cn%5Ct%5Ct%7D%20else%20%7B%5Cn%5Ct%5Ct%5Ctif%20((overlayOutlineWidth%20%3E%200.0)%20%26%26%20(ocolor.a%20%3E%3D%201.0))%20%7B%20%2F%2Fcheck%20voxel%20neighbors%20for%20edge%5Cn%5Ct%5Ct%5Ct%5Ctvec3%20vx%20%3D%20(overlayOutlineWidth%20)%20%2F%20vec3(textureSize(overlay%2C%200))%3B%5Cn%5Ct%5Ct%5Ct%5Ctvec3%20vxR%20%3D%20vec3(texPos.x%2Bvx.x%2C%20texPos.y%2C%20texPos.z)%3B%5Cn%5Ct%5Ct%5Ct%5Ctvec3%20vxL%20%3D%20vec3(texPos.x-vx.x%2C%20texPos.y%2C%20texPos.z)%3B%5Cn%5Ct%5Ct%5Ct%5Ctvec3%20vxA%20%3D%20vec3(texPos.x%2C%20texPos.y%2Bvx.y%2C%20texPos.z)%3B%5Cn%5Ct%5Ct%5Ct%5Ctvec3%20vxP%20%3D%20vec3(texPos.x%2C%20texPos.y-vx.y%2C%20texPos.z)%3B%5Cn%5Ct%5Ct%5Ct%5Ctvec3%20vxS%20%3D%20vec3(texPos.x%2C%20texPos.y%2C%20texPos.z%2Bvx.z)%3B%5Cn%5Ct%5Ct%5Ct%5Ctvec3%20vxI%20%3D%20vec3(texPos.x%2C%20texPos.y%2C%20texPos.z-vx.z)%3B%5Cn%5Ct%5Ct%5Ct%5Ctfloat%20a%20%3D%201.0%3B%5Cn%5Ct%5Ct%5Ct%5Ctif%20(axCorSag%20!%3D%202)%20%7B%5Cn%5Ct%5Ct%5Ct%5Ct%5Cta%20%3D%20min(a%2C%20texture(overlay%2C%20vxR).a)%3B%5Cn%5Ct%5Ct%5Ct%5Ct%5Cta%20%3D%20min(a%2C%20texture(overlay%2C%20vxL).a)%3B%5Cn%5Ct%5Ct%5Ct%5Ct%7D%5Cn%5Ct%5Ct%5Ct%5Ctif%20(axCorSag%20!%3D%201)%20%7B%5Cn%5Ct%5Ct%5Ct%5Ct%5Cta%20%3D%20min(a%2C%20texture(overlay%2C%20vxA).a)%3B%5Cn%5Ct%5Ct%5Ct%5Ct%5Cta%20%3D%20min(a%2C%20texture(overlay%2C%20vxP).a)%3B%5Cn%5Ct%5Ct%5Ct%5Ct%7D%5Cn%5Ct%5Ct%5Ct%5Ctif%20(axCorSag%20!%3D%200)%20%7B%5Cn%5Ct%5Ct%5Ct%5Ct%5Cta%20%3D%20min(a%2C%20texture(overlay%2C%20vxS).a)%3B%5Cn%5Ct%5Ct%5Ct%5Ct%5Cta%20%3D%20min(a%2C%20texture(overlay%2C%20vxI).a)%3B%5Cn%5Ct%5Ct%5Ct%5Ct%7D%5Cn%5Ct%5Ct%5Ct%5Ctif%20(a%20%3C%201.0)%20%7B%5Cn%5Ct%5Ct%5Ct%5Ct%5Ctocolor%20%3D%20vec4(0.0%2C%200.0%2C%200.0%2C%201.0)%3B%5Cn%5Ct%5Ct%5Ct%5Ct%5CtoverlayAlpha%20%3D%201.0%3B%5Cn%5Ct%5Ct%5Ct%5Ct%7D%5Cn%5Ct%5Ct%5Ct%7D%5Cn%5Ct%5Ct%7D%20%2F%2Foutline%20above%20threshold%5Cn%5Ct%7D%5Cn%5Cn'%2CT%3D%22%5Ctocolor.a%20*%3D%20overlayAlpha%3B%5Cn%5Ctvec4%20dcolor%20%3D%20drawColor(texture(drawing%2C%20texPos).r%2C%20drawOpacity)%3B%5Cn%5Ctif%20(dcolor.a%20%3E%200.0)%20%7B%5Cn%5Ct%5Ctcolor.rgb%20%3D%20mix(color.rgb%2C%20dcolor.rgb%2C%20dcolor.a)%3B%5Cn%5Ct%5Ctcolor.a%20%3D%20max(drawOpacity%2C%20color.a)%3B%5Cn%5Ct%7D%5Cn%5Ctif%20((backgroundMasksOverlays%20%3E%200)%20%26%26%20(background.a%20%3D%3D%200.0))%5Cn%5Ct%5Ctreturn%3B%5Cn%5Ctfloat%20a%20%3D%20color.a%20%2B%20ocolor.a%20*%20(1.0%20-%20color.a)%3B%20%2F%2F%20premultiplied%20alpha%5Cn%5Ctif%20(a%20%3D%3D%200.0)%20return%3B%5Cn%5Ctcolor.rgb%20%3D%20mix(color.rgb%2C%20ocolor.rgb%2C%20ocolor.a%20%2F%20a)%3B%5Cn%5Ctcolor.a%20%3D%20a%3B%5Cn%7D%22%2CV%3DF%2BT%2CE%3DF%2B%22%5Ctif%20(ocolor.a%20%3E%200.0)%20%7B%5Cn%5Ct%5Ct%2F%2Fhttps%3A%2F%2Fgamedev.stackexchange.com%2Fquestions%2F102889%2Fis-it-possible-to-convert-vec4-to-int-in-glsl-using-opengl-es%5Cn%5Ct%5Ctuint%20alpha%20%3D%20uint(ocolor.a%20*%20255.0)%3B%5Cn%5Ct%5Ctvec3%20xyzFlip%20%3D%20vec3(float((uint(1)%20%26%20alpha)%20%3E%20uint(0))%2C%20float((uint(2)%20%26%20alpha)%20%3E%20uint(0))%2C%20float((uint(4)%20%26%20alpha)%20%3E%20uint(0)))%3B%5Cn%5Ct%5Ct%2F%2Fconvert%20from%200%20and%201%20to%20-1%20and%201%5Cn%5Ct%5CtxyzFlip%20%3D%20(xyzFlip%20*%202.0)%20-%201.0%3B%5Cn%5Ct%5Ct%2F%2Fhttps%3A%2F%2Fmath.stackexchange.com%2Fquestions%2F1905533%2Ffind-perpendicular-distance-from-point-to-line-in-3d%5Cn%5Ct%5Ct%2F%2Fv1%20principle%20direction%20of%20tensor%20for%20this%20voxel%5Cn%5Ct%5Ctvec3%20v1%20%3D%20ocolor.rgb%3B%5Cn%5Ct%5Ct%2F%2Fflips%20encode%20polarity%20to%20convert%20from%200..1%20to%20-1..1%20(27%20bits%20vs%2024%20bit%20precision)%5Cn%5Ct%5Ctv1%20%3D%20normalize(%20v1%20*%20xyzFlip)%3B%5Cn%5Ct%5Ctvec3%20vxl%20%3D%20fract(texPos%20*%20vec3(textureSize(volume%2C%200)))%20-%200.5%3B%5Cn%5Ct%5Ct%2F%2Fvxl%20coordinates%20now%20-0.5..%2B0.5%20so%200%2C0%2C0%20is%20origin%5Cn%5Ct%5Ctvxl.x%20%3D%20-vxl.x%3B%5Cn%5Ct%5Ctfloat%20t%20%3D%20dot(vxl%2Cv1)%3B%5Cn%5Ct%5Ctvec3%20P%20%3D%20t%20*%20v1%3B%5Cn%5Ct%5Ctfloat%20dx%20%3D%20length(P-vxl)%3B%5Cn%5Ct%5Ctocolor.a%20%3D%201.0%20-%20smoothstep(0.2%2C0.25%2C%20dx)%3B%5Cn%5Ct%5Ct%2F%2Fif%20modulation%20was%20applied%2C%20use%20that%20to%20scale%20alpha%20not%20color%3A%5Cn%5Ct%5Ctocolor.a%20*%3D%20length(ocolor.rgb)%3B%5Cn%5Ct%5Ctocolor.rgb%20%3D%20normalize(ocolor.rgb)%3B%5Cn%5Ct%5Ct%2F%2Fcompute%20distance%20one%20half%20voxel%20closer%20to%20viewer%3A%5Cn%5Ct%5Ctfloat%20pan%20%3D%200.5%3B%5Cn%5Ct%5Ctif%20(axCorSag%20%3D%3D%200)%5Cn%5Ct%5Ct%5Ctvxl.z%20-%3D%20pan%3B%5Cn%5Ct%5Ctif%20(axCorSag%20%3D%3D%201)%5Cn%5Ct%5Ct%5Ctvxl.y%20-%3D%20pan%3B%5Cn%5Ct%5Ctif%20(axCorSag%20%3D%3D%202)%5Cn%5Ct%5Ct%5Ctvxl.x%20%2B%3D%20pan%3B%5Cn%5Ct%5Ctt%20%3D%20dot(vxl%2Cv1)%3B%5Cn%5Ct%5CtP%20%3D%20t%20*%20v1%3B%5Cn%5Ct%5Ctfloat%20dx2%20%3D%20length(P-vxl)%3B%5Cn%5Ct%5Ctocolor.rgb%20%2B%3D%20(dx2-dx-(0.5%20*%20pan))%20*%201.0%3B%5Cn%5Ct%7D%5Cn%22%2BT%2CS%3D%22%23version%20300%20es%5Cn%23line%20480%5Cnprecision%20highp%20int%3B%5Cnprecision%20highp%20float%3B%5Cnuniform%20vec4%20lineColor%3B%5Cnout%20vec4%20color%3B%5Cnvoid%20main()%20%7B%5Cn%5Ctcolor%20%3D%20lineColor%3B%5Cn%7D%22%2CB%3D%22%23version%20300%20es%5Cn%23line%20520%5Cnlayout(location%3D0)%20in%20vec3%20pos%3B%5Cnuniform%20vec2%20canvasWidthHeight%3B%5Cnuniform%20vec4%20leftTopWidthHeight%3B%5Cnvoid%20main(void)%20%7B%5Cn%5Ct%2F%2Fconvert%20pixel%20x%2Cy%20space%201..canvasWidth%2C1..canvasHeight%20to%20WebGL%201..-1%2C-1..1%5Cn%5Ctvec2%20frac%3B%5Cn%5Ctfrac.x%20%3D%20(leftTopWidthHeight.x%20%2B%20(pos.x%20*%20leftTopWidthHeight.z))%20%2F%20canvasWidthHeight.x%3B%20%2F%2F0..1%5Cn%5Ctfrac.y%20%3D%201.0%20-%20((leftTopWidthHeight.y%20%2B%20((1.0%20-%20pos.y)%20*%20leftTopWidthHeight.w))%20%2F%20canvasWidthHeight.y)%3B%20%2F%2F1..0%5Cn%5Ctfrac%20%3D%20(frac%20*%202.0)%20-%201.0%3B%5Cn%5Ctgl_Position%20%3D%20vec4(frac%2C%200.0%2C%201.0)%3B%5Cn%7D%22%2CU%3D%22%23version%20300%20es%5Cn%23line%20613%5Cnprecision%20highp%20int%3B%5Cnprecision%20highp%20float%3B%5Cnin%20vec3%20vPos%3B%5Cnout%20vec2%20TexCoord%3B%5Cnvoid%20main()%20%7B%5Cn%5CtTexCoord%20%3D%20vPos.xy%3B%5Cn%5Ctgl_Position%20%3D%20vec4(%20(vPos.xy-vec2(0.5%2C0.5))%20*%202.0%2C%200.0%2C%201.0)%3B%5Cn%7D%22%2CR%3D%22%23version%20300%20es%5Cnuniform%20highp%20usampler3D%20intensityVol%3B%5Cn%22%2CN%3D%22%23version%20300%20es%5Cnuniform%20highp%20isampler3D%20intensityVol%3B%5Cn%22%2CP%3D%22%23version%20300%20es%5Cnuniform%20highp%20sampler3D%20intensityVol%3B%5Cn%22%2CL%3D%22%23line%20636%5Cnprecision%20highp%20int%3B%5Cnprecision%20highp%20float%3B%5Cnin%20vec2%20TexCoord%3B%5Cnout%20vec4%20FragColor%3B%5Cnuniform%20float%20coordZ%3B%5Cnuniform%20float%20layer%3B%5Cnuniform%20highp%20sampler2D%20colormap%3B%5Cnuniform%20lowp%20sampler3D%20blend3D%3B%5Cnuniform%20float%20opacity%3B%5Cnuniform%20vec4%20xyzaFrac%3B%5Cnuniform%20mat4%20mtx%3B%5Cnvoid%20main(void)%20%7B%5Cn%5Ctvec4%20vx%20%3D%20vec4(TexCoord.x%2C%20TexCoord.y%2C%20coordZ%2C%201.0)%20*%20mtx%3B%5Cn%5Ctuint%20idx%20%3D%20uint(texture(intensityVol%2C%20vx.xyz).r)%3B%5Cn%5CtFragColor%20%3D%20vec4(0.0%2C%200.0%2C%200.0%2C%200.0)%3B%5Cn%5Ctif%20(idx%20%3D%3D%20uint(0))%5Cn%5Ct%5Ctreturn%3B%5Cn%5Ct%2F%2Fidx%20%3D%20((idx%20-%20uint(1))%20%25%20uint(100))%2Buint(1)%3B%5Cn%5Ctfloat%20textureWidth%20%3D%20float(textureSize(colormap%2C%200).x)%3B%5Cn%5Ctfloat%20fx%20%3D%20(float(idx)%2B0.5)%20%2F%20textureWidth%3B%5Cn%5Ctfloat%20nlayer%20%3D%20float(textureSize(colormap%2C%200).y)%3B%5Cn%5Ctfloat%20y%20%3D%20((2.0%20*%20layer)%20%2B%201.5)%2Fnlayer%3B%5Cn%5CtFragColor%20%3D%20texture(colormap%2C%20vec2(fx%2C%20y)).rgba%3B%5Cn%5Ctfloat%20alpha%20%3D%20FragColor.a%3B%5Cn%5CtFragColor.a%20*%3D%20opacity%3B%5Cn%5Ctif%20(xyzaFrac.a%20%3E%200.0)%20%7B%20%2F%2Foutline%5Cn%5Ct%5Ctvx%20%3D%20vec4(TexCoord.x%2BxyzaFrac.x%2C%20TexCoord.y%2C%20coordZ%2C%201.0)%20*%20mtx%3B%5Cn%5Ct%5Ctuint%20R%20%3D%20uint(texture(intensityVol%2C%20vx.xyz).r)%3B%5Cn%5Ct%5Ctvx%20%3D%20vec4(TexCoord.x-xyzaFrac.x%2C%20TexCoord.y%2C%20coordZ%2C%201.0)%20*%20mtx%3B%5Cn%5Ct%5Ctuint%20L%20%3D%20uint(texture(intensityVol%2C%20vx.xyz).r)%3B%5Cn%5Ct%5Ctvx%20%3D%20vec4(TexCoord.x%2C%20TexCoord.y%2BxyzaFrac.y%2C%20coordZ%2C%201.0)%20*%20mtx%3B%5Cn%5Ct%5Ctuint%20A%20%3D%20uint(texture(intensityVol%2C%20vx.xyz).r)%3B%5Cn%5Ct%5Ctvx%20%3D%20vec4(TexCoord.x%2C%20TexCoord.y-xyzaFrac.y%2C%20coordZ%2C%201.0)%20*%20mtx%3B%5Cn%5Ct%5Ctuint%20P%20%3D%20uint(texture(intensityVol%2C%20vx.xyz).r)%3B%5Cn%5Ct%5Ctvx%20%3D%20vec4(TexCoord.x%2C%20TexCoord.y%2C%20coordZ%2BxyzaFrac.z%2C%201.0)%20*%20mtx%3B%5Cn%5Ct%5Ctuint%20S%20%3D%20uint(texture(intensityVol%2C%20vx.xyz).r)%3B%5Cn%5Ct%5Ctvx%20%3D%20vec4(TexCoord.x%2C%20TexCoord.y%2C%20coordZ-xyzaFrac.z%2C%201.0)%20*%20mtx%3B%5Cn%5Ct%5Ctuint%20I%20%3D%20uint(texture(intensityVol%2C%20vx.xyz).r)%3B%5Cn%5Ct%5Ctif%20((idx%20!%3D%20R)%20%7C%7C%20(idx%20!%3D%20L)%20%7C%7C%20(idx%20!%3D%20A)%20%7C%7C%20(idx%20!%3D%20P)%20%7C%7C%20(idx%20!%3D%20S)%20%7C%7C%20(idx%20!%3D%20I))%5Cn%5Ct%5Ct%5CtFragColor.a%20%3D%20alpha%20*%20xyzaFrac.a%3B%5Cn%5Ct%7D%5Cn%7D%22%2Ck%3D%22%23line%20691%5Cnprecision%20highp%20int%3B%5Cnprecision%20highp%20float%3B%5Cnin%20vec2%20TexCoord%3B%5Cnout%20vec4%20FragColor%3B%5Cnuniform%20float%20coordZ%3B%5Cnuniform%20float%20layer%3B%5Cnuniform%20float%20scl_slope%3B%5Cnuniform%20float%20scl_inter%3B%5Cnuniform%20float%20cal_max%3B%5Cnuniform%20float%20cal_min%3B%5Cnuniform%20float%20cal_maxNeg%3B%5Cnuniform%20float%20cal_minNeg%3B%5Cnuniform%20bool%20isAlphaThreshold%3B%5Cnuniform%20bool%20isColorbarFromZero%3B%5Cnuniform%20bool%20isAdditiveBlend%3B%5Cnuniform%20highp%20sampler2D%20colormap%3B%5Cnuniform%20lowp%20sampler3D%20blend3D%3B%5Cnuniform%20int%20modulation%3B%5Cnuniform%20highp%20sampler3D%20modulationVol%3B%5Cnuniform%20float%20opacity%3B%5Cnuniform%20mat4%20mtx%3B%5Cnvoid%20main(void)%20%7B%5Cn%5Ctvec4%20vx%20%3D%20vec4(TexCoord.xy%2C%20coordZ%2C%201.0)%20*%20mtx%3B%5Cn%5Ctif%20((vx.x%20%3C%200.0)%20%7C%7C%20(vx.x%20%3E%201.0)%20%7C%7C%20(vx.y%20%3C%200.0)%20%7C%7C%20(vx.y%20%3E%201.0)%20%7C%7C%20(vx.z%20%3C%200.0)%20%7C%7C%20(vx.z%20%3E%201.0))%20%7B%5Cn%5Ct%5Ct%2F%2Fset%20transparent%20if%20out%20of%20range%5Cn%5Ct%5Ct%2F%2Fhttps%3A%2F%2Fwebglfundamentals.org%2Fwebgl%2Fwebgl-3d-textures-repeat-clamp.html%5Cn%5Ct%5CtFragColor%20%3D%20texture(blend3D%2C%20vec3(TexCoord.xy%2C%20coordZ))%3B%5Cn%5Ct%5Ctreturn%3B%5Cn%5Ct%7D%5Cn%5Ctfloat%20f%20%3D%20(scl_slope%20*%20float(texture(intensityVol%2C%20vx.xyz).r))%20%2B%20scl_inter%3B%5Cn%5Ctfloat%20mn%20%3D%20cal_min%3B%5Cn%5Ctfloat%20mx%20%3D%20cal_max%3B%5Cn%5Ctif%20((isAlphaThreshold)%20%7C%7C%20(isColorbarFromZero))%5Cn%5Ct%5Ctmn%20%3D%200.0%3B%5Cn%5Ctfloat%20r%20%3D%20max(0.00001%2C%20abs(mx%20-%20mn))%3B%5Cn%5Ctmn%20%3D%20min(mn%2C%20mx)%3B%5Cn%5Ctfloat%20txl%20%3D%20mix(0.0%2C%201.0%2C%20(f%20-%20mn)%20%2F%20r)%3B%5Cn%5Ctif%20(f%20%3E%20mn)%20%7B%20%2F%2Fissue1139%3A%20survives%20threshold%2C%20so%20round%20up%20to%20opaque%20vox