From 3a1e0d2607d3c73c5204a8fc624b8a3d06c9d6f8 Mon Sep 17 00:00:00 2001 From: neurolabusc Date: Mon, 16 Aug 2021 08:13:50 -0400 Subject: [PATCH] Cross hairs on render view (https://github.com/rordenlab/MRIcroGL/issues/24) --- DepthPicking/README.md | 59 +++ DepthPicking/cross_hair.png | Bin 0 -> 149234 bytes DepthPicking/cube_render.png | Bin 0 -> 141945 bytes .../Contents/Resources/shader/Default.glsl | 10 +- .../Contents/Resources/shader/Edges.glsl | 8 +- .../Contents/Resources/shader/FX.glsl | 156 -------- .../Contents/Resources/shader/Glass.glsl | 8 +- .../Contents/Resources/shader/MIP.glsl | 9 +- .../Resources/shader/{Depth.glsl => MX.glsl} | 51 ++- .../Contents/Resources/shader/Matte.glsl | 8 +- .../Contents/Resources/shader/Minimal.glsl | 8 +- .../Contents/Resources/shader/Occlusion.glsl | 8 +- .../Resources/shader/OpacityPeeling.glsl | 8 +- .../Resources/shader/OpacityPeeling2.glsl | 8 +- .../Resources/shader/OverlaySurface.glsl | 8 +- .../Contents/Resources/shader/Raydir.glsl | 155 -------- .../Contents/Resources/shader/Shell.glsl | 8 +- .../Contents/Resources/shader/ShellEdges.glsl | 8 +- .../Contents/Resources/shader/Shiny.glsl | 8 +- .../Contents/Resources/shader/ShinyEdge.glsl | 8 +- .../Contents/Resources/shader/Slow.glsl | 9 +- .../Resources/shader/SpecialEffects.glsl | 8 +- .../Resources/shader/SpecialEffects2.glsl | 150 -------- .../Contents/Resources/shader/Standard.glsl | 8 +- .../Contents/Resources/shader/Tomography.glsl | 8 +- MRIcroGL.lpi | 2 +- MRIcroGL.lpr | 1 + MRIcroGL.lps | 341 +++++++++--------- MRIcroGL_Metal_llvm.lps | 8 +- MRIcroGL_llvm.lpi | 23 +- MRIcroGL_llvm.lps | 4 +- Resources/shader/Default.glsl | 10 +- Resources/shader/Edges.glsl | 8 +- Resources/shader/Glass.glsl | 8 +- Resources/shader/Matte.glsl | 8 +- Resources/shader/Minimal.glsl | 8 +- Resources/shader/Occlusion.glsl | 8 +- Resources/shader/OpacityPeeling.glsl | 8 +- Resources/shader/OpacityPeeling2.glsl | 8 +- Resources/shader/OverlaySurface.glsl | 8 +- Resources/shader/Shell.glsl | 8 +- Resources/shader/ShellEdges.glsl | 8 +- Resources/shader/Shiny.glsl | 8 +- Resources/shader/Slow.glsl | 9 +- Resources/shader/SpecialEffects.glsl | 8 +- Resources/shader/Standard.glsl | 8 +- Resources/shader/Tomography.glsl | 8 +- glvolume2.pas | 303 ++++++++++++---- mainunit.lfm | 4 +- mainunit.pas | 159 ++++++-- nifti_foreign.pas | 63 ++++ opts.inc | 4 +- prefs.pas | 44 ++- umat.pas | 9 + 54 files changed, 997 insertions(+), 818 deletions(-) create mode 100644 DepthPicking/README.md create mode 100644 DepthPicking/cross_hair.png create mode 100644 DepthPicking/cube_render.png delete mode 100755 MRIcroGL.app/Contents/Resources/shader/FX.glsl rename MRIcroGL.app/Contents/Resources/shader/{Depth.glsl => MX.glsl} (50%) delete mode 100755 MRIcroGL.app/Contents/Resources/shader/Raydir.glsl delete mode 100755 MRIcroGL.app/Contents/Resources/shader/SpecialEffects2.glsl diff --git a/DepthPicking/README.md b/DepthPicking/README.md new file mode 100644 index 0000000..8b688b6 --- /dev/null +++ b/DepthPicking/README.md @@ -0,0 +1,59 @@ + +## About + +It is often useful to convert the location of a mouse click to object coordinates (e.g. to select the object). We also want objects that are closer to the camera to occlude more distant objects. OpenGL and other accelerated graphics libraries use the `depth buffer` to hide occluded objects and aid [mouse picking](https://www.cs.cornell.edu/courses/cs4620/2017sp/cs4621/lecture08/exhibit03.html). Unfortunately, the default depth buffer does not work for volume ray casting. Here we describe a simple solution. + +This description assumes a knowledge of volume ray casting. Good introductions are provided by [Philip Rideout](https://prideout.net/blog/old/blog/index.html@p=64.html) and [Will Usher](https://www.willusher.io/webgl/2019/01/13/volume-rendering-with-webgl). As they note, we have the vertex shader draw a simple cube, with a ray launched for each pixel from the front of the cube to the back. Therefore, the depth recorded by the vertex shader refers to the front of the cube, not the rendered surface. Consider the image below: the left panel shows the front-face of the cube, whereas the right panel shows the rendered object. Note that some rays travel completely through the air, never striking the object, while other rays strike the brain's surface close to the cube's front face. Therefore, we tune our shaders to explicitly set the depth buffer, setting [gl_FragDepth](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/gl_FragDepth.xhtml) for each voxel. + +![volume rendering and cube defining ray starts](cube_render.png) + +## Writing the depth buffer + +The code below extends [Will Usher's](https://www.willusher.io/webgl/2019/01/13/volume-rendering-with-webgl) description of a ray casting volume renderer. Please see his page for a full description. Our goal here is to simply extend his code to record the depth of the surface in the OpenGL depth buffer `gl_FragDepth`. The ray traverses the volume from front to back, absorbing color from voxels. Here we use `isHit` to detect the first non-transparent voxel. + +``` + int isHit = 0; //used to detect first non-transparent voxel + for (float t = t_hit.x; t < t_hit.y; t += dt) { + float val = texture(volume, p).r; + vec4 val_color = vec4(texture(transfer_fcn, vec2(val, 0.5)).rgb, val); + p += ray_dir * dt; + if (val_color.a < 0.01) continue; //skip transparent samples + if (!isHit) { //our first non-transparent voxel + isHit = 1; + gl_FragDepth = ((ModelViewProjectionMatrix * vec4(pos, 1.0)).z + 1.0) * 0.5; + } + color.rgb += (1.0 - color.a) * val_color.a * val_color.rgb; + color.a += (1.0 - color.a) * val_color.a; + if (color.a >= 0.95) { + break; + } + } +``` + +The effect is shown in the image below. Our shader sets both the fragment color (upper left) and fragment depth. Once we have set the depth buffer, we can use it to occlude other objects. In the lower panel we subsequently draw three orthogonal lines to show the crosshair. In the image we actually draw these lines twice. First, we draw opaque lines where we enable the [GL_DEPTH_TEST](https://learnopengl.com/Advanced-OpenGL/Depth-testing) with GL_LEQUAL. These lines are occluded when they are behind the rendering surface. Next we draw translucent lines where we disable the depth test, creating faint lines at locations where the line is beneath the rendered surface. + +![color and depth buffers](cross_hair.png) + +## Reading the depth buffer + +Writing to the depth buffer is sufficient to draw occluded items. However, we may also want to determine where the user clicked. For example, we might want the crosshairs to shift move to the location on the volumes surface where the user clicked. + +You can read the depth buffer at canvas pixel X,Y with the following command (make sure to set your glDrawBuffer and glReadBuffer correctly): +``` + glReadPixels( X, Y, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, @depth); +``` + +Historically, users had access to the [gluUnProject](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/gluUnProject.xml) function. The [NeHe tutorial](http://nehe.gamedev.net/article/using_gluunproject/16013/) describes the usage nicely. This allows us to take the combination of the mouse position and depth buffer and compute the selected location in the object's space. Unfortunately, this function is not available in most modern graphics libraries, but it only takes a few lines of code to reconstruct. The code below provides the transform for [GLSL](https://community.khronos.org/t/converting-gl-fragcoord-to-model-space/57397), though you can find solutions for other tools like [WebGL](https://github.com/bringhurst/webgl-unproject) and [Python](http://pyopengl.sourceforge.net/documentation/manual-3.0/gluUnProject.html), + +The input is the mouse horizontal and vertical position (gl_FragCoord.xy) and the depth buffer value at that location (gl_FragCoord.z). It also gets receives the viewport width (view.x), canvas height (view.y) left corner (view.z) and bottom corner (view.w). Note that the variable `gl_ModelViewProjectionMatrixInverse` does not exist in modern OpenGL or webGL, but this is simply the inverse of the matrix used by the vertex shader to warp the vertices to screen space. + +``` +vec4 v = vec4(2.0*(gl_FragCoord.x-view.x)/view.z-1.0, + 2.0*(gl_FragCoord.y-view.y)/view.w-1.0, + 2.0*texture2DRect(DepthTex,gl_FragCoord.xy).z-1.0, + 1.0 ); +v = gl_ModelViewProjectionMatrixInverse * v; +v /= v.w; +``` + +This formula reverses the work of a vertex shader. The vertex shader warps a location from model space to our 2D screen space. Here we warp the screen space to the model's space. This allows us to determine where the user clicked in our volume and update the coordinates accordingly. diff --git a/DepthPicking/cross_hair.png b/DepthPicking/cross_hair.png new file mode 100644 index 0000000000000000000000000000000000000000..a1eee2a492e27169dc7ab60b62ffe696cf296cab GIT binary patch literal 149234 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

Ou7t&##ML%XF**A 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

!R&T^%Z&54O_k*Z(=-1M}CB@!GbLoQ>ybn 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%0A#y88dRe#wLVkOe~%0Eio>8Yz8eadp;pUA=j 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ⅅ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 Z#!HH$W>~AP2>|`a;FgKbo0|^N{|i-$Qr!Rm literal 0 HcmV?d00001 diff --git a/DepthPicking/cube_render.png b/DepthPicking/cube_render.png new file mode 100644 index 0000000000000000000000000000000000000000..27ca4c95c6bad6c6d36e6c1903d6fafb9702b879 GIT binary patch literal 141945 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È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�GqWn4Gt|un44B> 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 T&d 300 ) @@ -59,12 +60,17 @@ void main() { //end fastpass - optional float ran = fract(sin(gl_FragCoord.x * 12.9898 + gl_FragCoord.y * 78.233) * 43758.5453); samplePos += deltaDir * ran; + int nHit = 0; vec3 defaultDiffuse = vec3(0.5, 0.5, 0.5); while (samplePos.a <= len) { colorSample = texture3Df(intensityVol,samplePos.xyz); if (colorSample.a > 0.0) { colorSample.a = 1.0-pow((1.0 - colorSample.a), opacityCorrection); - bgNearest = min(samplePos.a,bgNearest); + if (nHit < 1) { + nHit ++; + bgNearest = samplePos.a; + setDepthBuffer(samplePos.xyz); + } gradSample= texture3Df(gradientVol,samplePos.xyz); gradSample.rgb = normalize(gradSample.rgb*2.0 - 1.0); //reusing Normals http://www.marcusbannerman.co.uk/articles/VolumeRendering.html @@ -82,6 +88,7 @@ void main() { samplePos += deltaDir; } //while samplePos.a < len colAcc.a = colAcc.a/0.95; + colAcc.a *= backAlpha; if ( overlays< 1 ) { #if ( __VERSION__ > 300 ) @@ -147,6 +154,7 @@ void main() { } colAcc.rgb = mix(colAcc.rgb, overAcc.rgb, overMix); colAcc.a = max(colAcc.a, overAcc.a); + //if (nHit < 1 ) discard; #if ( __VERSION__ > 300 ) FragColor = colAcc; #else diff --git a/MRIcroGL.app/Contents/Resources/shader/Edges.glsl b/MRIcroGL.app/Contents/Resources/shader/Edges.glsl index e4649d6..ae4992e 100644 --- a/MRIcroGL.app/Contents/Resources/shader/Edges.glsl +++ b/MRIcroGL.app/Contents/Resources/shader/Edges.glsl @@ -38,6 +38,7 @@ void main() { vec4 samplePos = vec4(start.xyz, 0.0); vec4 clipPos = applyClip(dir, samplePos, len); float opacityCorrection = stepSize/sliceSize; + gl_FragDepth = 1.0; //fast pass - optional fastPass (len, dir, intensityVol, samplePos); #if ( __VERSION__ > 300 ) @@ -71,11 +72,16 @@ void main() { float boundAcc = 0.0; vec3 defaultDiffuse = vec3(0.5, 0.5, 0.5); const float kEarlyTermination = 0.95; + int nHit = 0; while (samplePos.a <= len) { colorSample = texture3Df(intensityVol,samplePos.xyz); samplePos += deltaDir; if (colorSample.a < 0.001) continue; - bgNearest = min(samplePos.a,bgNearest); + if (nHit < 1) { + nHit ++; + bgNearest = samplePos.a; + setDepthBuffer(samplePos.xyz); + } colorSample.a = 1.0-pow((1.0 - colorSample.a), opacityCorrection); gradSample = texture3Df(gradientVol,samplePos.xyz); gradSample.rgb = normalize(gradSample.rgb*2.0 - 1.0); diff --git a/MRIcroGL.app/Contents/Resources/shader/FX.glsl b/MRIcroGL.app/Contents/Resources/shader/FX.glsl deleted file mode 100755 index b8d8617..0000000 --- a/MRIcroGL.app/Contents/Resources/shader/FX.glsl +++ /dev/null @@ -1,156 +0,0 @@ -//pref -ambient|float|0.0|1.0|1|Illuminate surface regardless of lighting -diffuse|float|0.0|0.0|1|Illuminate surface based on light position -specular|float|0.0|0.0|1|Glint from shiny surfaces -shininess|float|0.01|10.0|30|Specular reflections can be rough or precise -overlayFuzzy|float|0.01|0.5|1|Do overlay layers have blurry surfaces? -overlayDepth|float|0.0|0.3|0.8|Can we see overlay layers deep beneath the background image? -overlayClip|float|0|0|1|Does clipping also influence overlay layers? -clippingRadius|float|0|0.5|1| -//frag -uniform float ambient = 1.0; -uniform float diffuse = 0.0; -uniform float specular = 0.0; -uniform float shininess = 10.0; -uniform float overlayFuzzy = 0.5; -uniform float overlayDepth = 0.3; -uniform float overlayClip = 0.0; -uniform float clippingRadius = 0.5; -void main() { - vec3 start = TexCoord1.xyz; - vec3 backPosition = GetBackPosition(start); - vec3 dir = backPosition - start; - float len = length(dir); - dir = normalize(dir); - vec4 deltaDir = vec4(dir.xyz * stepSize, stepSize); - vec4 gradSample, colorSample; - float bgNearest = len; //assume no hit - vec4 colAcc = vec4(0.0,0.0,0.0,0.0); - vec4 prevGrad = vec4(0.0,0.0,0.0,0.0); - vec4 samplePos; - //background pass - float noClipLen = len; - samplePos = vec4(start.xyz +deltaDir.xyz* (fract(sin(gl_FragCoord.x * 12.9898 + gl_FragCoord.y * 78.233) * 43758.5453)), 0.0); - vec4 clipPos = applyClip(dir, samplePos, len); - float stepSizeX2 = samplePos.a + (stepSize * 2.0); - //fast pass - optional - fastPass (len, dir, intensityVol, samplePos); - #if ( __VERSION__ > 300 ) - if ((samplePos.a > len) && ( overlays < 1 )) { //no hit - FragColor = colAcc; - return; - } - #else - if ((textureSz.x < 1) || ((samplePos.a > len) && ( overlays < 1 ))) { //no hit - gl_FragColor = colAcc; - return; - } - #endif - if (samplePos.a < clipPos.a) - samplePos = clipPos; - deltaDir = vec4(dir.xyz * stepSize, stepSize); - //end fastpass - optional - vec3 defaultDiffuse = vec3(0.5, 0.5, 0.5); - vec3 volCenter = vec3(0.5, 0.5, 0.5); - vec3 lightPositionN = normalize(lightPosition); - while (samplePos.a <= len) { - colorSample = texture3Df(intensityVol,samplePos.xyz); - colorSample.a = 1.0-pow((1.0 - colorSample.a), stepSize/sliceSize); - - if ((length(samplePos.rgb-volCenter) < clippingRadius) &&(colorSample.a > 0.01)) { - bgNearest = min(samplePos.a,bgNearest); - if (samplePos.a > stepSizeX2) { - vec3 a = colorSample.rgb * ambient; - gradSample= texture3Df(gradientVol,samplePos.xyz); - gradSample.rgb = normalize(gradSample.rgb*2.0 - 1.0); - //reusing Normals http://www.marcusbannerman.co.uk/articles/VolumeRendering.html - if (gradSample.a < prevGrad.a) - gradSample.rgb = prevGrad.rgb; - prevGrad = gradSample; - float lightNormDot = dot(gradSample.rgb, lightPositionN); - vec3 d = max(lightNormDot, 0.0) * colorSample.rgb * diffuse; - float s = specular * pow(max(dot(reflect(lightPositionN, gradSample.rgb), dir), 0.0), shininess); - colorSample.rgb = a + d + s; - - } else - colorSample.a = clamp(colorSample.a*3.0,0.0, 1.0); - colorSample.rgb *= colorSample.a; - colAcc= (1.0 - colAcc.a) * colorSample + colAcc; - if ( colAcc.a > 0.95 ) - break; - } - samplePos += deltaDir; - } //while samplePos.a < len - colAcc.a = colAcc.a/0.95; - colAcc.a *= backAlpha; - if ( overlays < 1 ) { - #if ( __VERSION__ > 300 ) - FragColor = colAcc; - #else - gl_FragColor = colAcc; - #endif - return; - } - //overlay pass - vec4 overAcc = vec4(0.0,0.0,0.0,0.0); - prevGrad = vec4(0.0,0.0,0.0,0.0); - if (overlayClip > 0) - samplePos = clipPos; - else { - len = noClipLen; - samplePos = vec4(start.xyz +deltaDir.xyz* (fract(sin(gl_FragCoord.x * 12.9898 + gl_FragCoord.y * 78.233) * 43758.5453)), 0.0); - } - //fast pass - optional - clipPos = samplePos; - fastPass (len, dir, intensityOverlay, samplePos); - if (samplePos.a < clipPos.a) - samplePos = clipPos; - //end fastpass - optional - float overFarthest = len; - while (samplePos.a <= len) { - colorSample = texture3Df(intensityOverlay,samplePos.xyz); - if (colorSample.a > 0.00) { - if (overAcc.a < 0.3) - overFarthest = samplePos.a; - colorSample.a = 1.0-pow((1.0 - colorSample.a), stepSize/sliceSize); - colorSample.a *= overlayFuzzy; - vec3 a = colorSample.rgb * ambient; - float s = 0; - vec3 d = vec3(0.0, 0.0, 0.0); - //gradient based lighting http://www.mccauslandcenter.sc.edu/mricrogl/gradients - gradSample = texture3Df(gradientOverlay,samplePos.xyz); //interpolate gradient direction and magnitude - gradSample.rgb = normalize(gradSample.rgb*2.0 - 1.0); - //reusing Normals http://www.marcusbannerman.co.uk/articles/VolumeRendering.html - if (gradSample.a < prevGrad.a) - gradSample.rgb = prevGrad.rgb; - prevGrad = gradSample; - float lightNormDot = dot(gradSample.rgb, lightPosition); - d = max(lightNormDot, 0.0) * colorSample.rgb * diffuse; - s = specular * pow(max(dot(reflect(lightPosition, gradSample.rgb), dir), 0.0), shininess); - - colorSample.rgb = a + d + s; - colorSample.rgb *= colorSample.a; - overAcc= (1.0 - overAcc.a) * colorSample + overAcc; - if (overAcc.a > 0.95 ) - break; - } - samplePos += deltaDir; - } //while samplePos.a < len - overAcc.a = overAcc.a/0.95; - //end ovelay pass clip plane applied to background ONLY... - //if (overAcc.a > 0.0) { //<- conditional not required: overMix always 0 for overAcc.a = 0.0 - float overMix = overAcc.a; - if (((overFarthest) > bgNearest) && (colAcc.a > 0.0)) { //background (partially) occludes overlay - float dx = (overFarthest - bgNearest)/1.73; - dx = colAcc.a * pow(dx, overlayDepth); - overMix *= 1.0 - dx; - } - colAcc.rgb = mix(colAcc.rgb, overAcc.rgb, overMix); - colAcc.a = max(colAcc.a, overAcc.a); - //} - #if ( __VERSION__ > 300 ) - FragColor = colAcc; - #else - gl_FragColor = colAcc; - #endif -} \ No newline at end of file diff --git a/MRIcroGL.app/Contents/Resources/shader/Glass.glsl b/MRIcroGL.app/Contents/Resources/shader/Glass.glsl index 1ab6fdd..f3c2bbe 100644 --- a/MRIcroGL.app/Contents/Resources/shader/Glass.glsl +++ b/MRIcroGL.app/Contents/Resources/shader/Glass.glsl @@ -28,6 +28,8 @@ void main() { vec3 dir = backPosition - start; float len = length(dir); dir = normalize(dir); + gl_FragDepth = 1.0; + int nHit = 0; vec4 deltaDir = vec4(dir.xyz * stepSize, stepSize); vec4 gradSample, colorSample; float bgNearest = len; //assume no hit @@ -73,7 +75,11 @@ void main() { while (samplePos.a <= len) { gradSample= texture3Df(gradientVol,samplePos.xyz); if (gradSample.a > 0.0) { - bgNearest = min(samplePos.a, bgNearest); + if (nHit < 1) { + nHit ++; + bgNearest = samplePos.a; + setDepthBuffer(samplePos.xyz); + } gradSample.rgb = normalize(gradSample.rgb*2.0 - 1.0); colorSample = gradSample; if (gradSample.a > boundThresh) { diff --git a/MRIcroGL.app/Contents/Resources/shader/MIP.glsl b/MRIcroGL.app/Contents/Resources/shader/MIP.glsl index 3ff3851..016a95e 100644 --- a/MRIcroGL.app/Contents/Resources/shader/MIP.glsl +++ b/MRIcroGL.app/Contents/Resources/shader/MIP.glsl @@ -1,4 +1,4 @@ -//pref +\\\//pref overAlpha|float|0.0|0.8|2.0|Ability to see overlay images added to background //frag uniform float overAlpha = 0.8; @@ -14,6 +14,7 @@ void main() { vec3 dir = backPosition - start; float len = length(dir); dir = normalize(dir); + gl_FragDepth = 1.0; vec4 deltaDir = vec4(dir.xyz * stepSize, stepSize); vec4 gradSample, colorSample; float bgNearest = len; //assume no hit @@ -44,10 +45,10 @@ void main() { if ( overlays < 1 ) { //pass without overlays while (samplePos.a <= len) { colorSample = texture3Df(intensityVol,samplePos.xyz); - //if (colorSample.a > colAcc.a) //ties generate errors for TT_desai_dd_mpm - // colAcc = colorSample; - if (colorSample.a > colAcc.a) //ties generate errors for TT_desai_dd_mpm + if (colorSample.a > colAcc.a) {//ties generate errors for TT_desai_dd_mpm colAcc = colorSample+0.00001; + setDepthBuffer(samplePos.xyz); + } samplePos += deltaDir; } //while samplePos.a < len //colAcc.a = step(0.001, colAcc.a); //good for templates... diff --git a/MRIcroGL.app/Contents/Resources/shader/Depth.glsl b/MRIcroGL.app/Contents/Resources/shader/MX.glsl similarity index 50% rename from MRIcroGL.app/Contents/Resources/shader/Depth.glsl rename to MRIcroGL.app/Contents/Resources/shader/MX.glsl index 2338d20..7acf11f 100644 --- a/MRIcroGL.app/Contents/Resources/shader/Depth.glsl +++ b/MRIcroGL.app/Contents/Resources/shader/MX.glsl @@ -1,15 +1,21 @@ //pref +overlayFuzzy|float|0.01|0.5|1|Do overlay layers have blurry surfaces? +overlayDepth|float|0.0|0.3|0.8|Can we see overlay layers deep beneath the background image? overlayClip|float|0|0|1|Does clipping also influence overlay layers? //frag -//in theory, we could write to gl_FragDepth, but getting XYZ simpler than scalar depth +uniform float overlayFuzzy = 0.5; +uniform float overlayDepth = 0.3; uniform float overlayClip = 0.0; void main() { vec3 start = TexCoord1.xyz; + gl_FragColor = vec4(start, 1.0); return; vec3 backPosition = GetBackPosition(start); vec3 dir = backPosition - start; float len = length(dir); dir = normalize(dir); + gl_FragDepth = 1.0; + int nHit = 0; vec4 deltaDir = vec4(dir.xyz * stepSize, stepSize); vec4 colorSample; float bgNearest = len; //assume no hit @@ -21,15 +27,29 @@ void main() { samplePos = vec4(start.xyz +deltaDir.xyz* (fract(sin(gl_FragCoord.x * 12.9898 + gl_FragCoord.y * 78.233) * 43758.5453)), 0.0); vec4 clipPos = applyClip(dir, samplePos, len); float stepSizeX2 = samplePos.a + (stepSize * 2.0); + float dx = 0.0; while (samplePos.a <= len) { colorSample = texture3Df(intensityVol,samplePos.xyz); if (colorSample.a > 0.0) { - colAcc = vec4(samplePos.xyz, 1.0); - bgNearest = samplePos.a; - break; + colorSample.a = 1.0-pow((1.0 - colorSample.a), stepSize/sliceSize); + if (nHit < 1) { + nHit ++; + bgNearest = samplePos.a; + setDepthBuffer(samplePos.xyz); + dx = ((ModelViewProjectionMatrix * vec4(samplePos.xyz, 1.0)).z + 1.0) * 0.5; + } + if (samplePos.a < stepSizeX2) + colorSample.a = clamp(colorSample.a*3.0,0.0, 1.0); + colorSample.rgb *= colorSample.a; + colAcc= (1.0 - colAcc.a) * colorSample + colAcc; + if ( colAcc.a > 0.95 ) + break; } samplePos += deltaDir; } //while samplePos.a < len + colAcc.rgb = vec3(dx, dx, dx); + colAcc.a = colAcc.a/0.95; + colAcc.a *= backAlpha; #if ( __VERSION__ > 300 ) if ( overlays < 1 ) { FragColor = colAcc; @@ -53,15 +73,28 @@ void main() { while (samplePos.a <= len) { colorSample = texture3Df(intensityOverlay,samplePos.xyz); if (colorSample.a > 0.00) { - overAcc = vec4(samplePos.xyz, 1.0); + colorSample.a = 1.0-pow((1.0 - colorSample.a), stepSize/sliceSize); + colorSample.a *= overlayFuzzy; overFarthest = samplePos.a; - break; + colorSample.rgb *= colorSample.a; + overAcc= (1.0 - overAcc.a) * colorSample + overAcc; + if (overAcc.a > 0.95 ) + break; } samplePos += deltaDir; - if (samplePos.a > bgNearest) break; } //while samplePos.a < len - if (overFarthest < bgNearest) - colAcc = overAcc; + overAcc.a = overAcc.a/0.95; + //end ovelay pass clip plane applied to background ONLY... + //if (overAcc.a > 0.0) { //<- conditional not required: overMix always 0 for overAcc.a = 0.0 + float overMix = overAcc.a; + if (((overFarthest) > bgNearest) && (colAcc.a > 0.0)) { //background (partially) occludes overlay + float dx = (overFarthest - bgNearest)/1.73; + dx = colAcc.a * pow(dx, overlayDepth); + overMix *= 1.0 - dx; + } + colAcc.rgb = mix(colAcc.rgb, overAcc.rgb, overMix); + colAcc.a = max(colAcc.a, overAcc.a); + //} #if ( __VERSION__ > 300 ) FragColor = colAcc; #else diff --git a/MRIcroGL.app/Contents/Resources/shader/Matte.glsl b/MRIcroGL.app/Contents/Resources/shader/Matte.glsl index dfaa16a..19d5099 100644 --- a/MRIcroGL.app/Contents/Resources/shader/Matte.glsl +++ b/MRIcroGL.app/Contents/Resources/shader/Matte.glsl @@ -22,6 +22,8 @@ void main() { vec3 dir = backPosition - start; float len = length(dir); dir = normalize(dir); + gl_FragDepth = 1.0; + int nHit = 0; vec4 deltaDir = vec4(dir.xyz * stepSize, stepSize); vec4 gradSample, colorSample; float bgNearest = len; //assume no hit @@ -56,7 +58,11 @@ void main() { colorSample = texture3Df(intensityVol,samplePos.xyz); colorSample.a = 1.0-pow((1.0 - colorSample.a), stepSize/sliceSize); if (colorSample.a > 0.01) { - bgNearest = min(samplePos.a,bgNearest); + if (nHit < 1) { + nHit ++; + bgNearest = samplePos.a; + setDepthBuffer(samplePos.xyz); + } if (samplePos.a > stepSizeX2) { vec3 a = colorSample.rgb * ambient; gradSample= texture3Df(gradientVol,samplePos.xyz); diff --git a/MRIcroGL.app/Contents/Resources/shader/Minimal.glsl b/MRIcroGL.app/Contents/Resources/shader/Minimal.glsl index 9b8fe9b..c523054 100644 --- a/MRIcroGL.app/Contents/Resources/shader/Minimal.glsl +++ b/MRIcroGL.app/Contents/Resources/shader/Minimal.glsl @@ -13,6 +13,8 @@ void main() { vec3 dir = backPosition - start; float len = length(dir); dir = normalize(dir); + gl_FragDepth = 1.0; + int nHit = 0; vec4 deltaDir = vec4(dir.xyz * stepSize, stepSize); vec4 colorSample; float bgNearest = len; //assume no hit @@ -28,7 +30,11 @@ void main() { colorSample = texture3Df(intensityVol,samplePos.xyz); if (colorSample.a > 0.0) { colorSample.a = 1.0-pow((1.0 - colorSample.a), stepSize/sliceSize); - bgNearest = min(samplePos.a,bgNearest); + if (nHit < 1) { + nHit ++; + bgNearest = samplePos.a; + setDepthBuffer(samplePos.xyz); + } if (samplePos.a < stepSizeX2) colorSample.a = clamp(colorSample.a*3.0,0.0, 1.0); colorSample.rgb *= colorSample.a; diff --git a/MRIcroGL.app/Contents/Resources/shader/Occlusion.glsl b/MRIcroGL.app/Contents/Resources/shader/Occlusion.glsl index 3fc5de5..4599981 100644 --- a/MRIcroGL.app/Contents/Resources/shader/Occlusion.glsl +++ b/MRIcroGL.app/Contents/Resources/shader/Occlusion.glsl @@ -21,6 +21,8 @@ void main() { vec3 dir = backPosition - start; float len = length(dir); dir = normalize(dir); + gl_FragDepth = 1.0; + int nHit = 0; vec4 deltaDir = vec4(dir.xyz * stepSize, stepSize); vec4 gradSample, colorSample; float bgNearest = len; //assume no hit @@ -66,7 +68,11 @@ void main() { colorSample = texture3Df(intensityVol,samplePos.xyz); if (colorSample.a > 0.0) { colorSample.a = 1.0-pow((1.0 - colorSample.a), opacityCorrection); - bgNearest = min(samplePos.a,bgNearest); + if (nHit < 1) { + nHit ++; + bgNearest = samplePos.a; + setDepthBuffer(samplePos.xyz); + } gradSample= texture3Df(gradientVol,samplePos.xyz); gradSample.rgb = normalize(gradSample.rgb*2.0 - 1.0); //reusing Normals http://www.marcusbannerman.co.uk/articles/VolumeRendering.html diff --git a/MRIcroGL.app/Contents/Resources/shader/OpacityPeeling.glsl b/MRIcroGL.app/Contents/Resources/shader/OpacityPeeling.glsl index ca0db4e..a549026 100755 --- a/MRIcroGL.app/Contents/Resources/shader/OpacityPeeling.glsl +++ b/MRIcroGL.app/Contents/Resources/shader/OpacityPeeling.glsl @@ -28,6 +28,8 @@ void main() { vec3 dir = backPosition - start; float len = length(dir); dir = normalize(dir); + gl_FragDepth = 1.0; + int nHit = 0; vec4 deltaDir = vec4(dir.xyz * stepSize, stepSize); vec4 gradSample, colorSample; float bgNearest = len; //assume no hit @@ -69,7 +71,11 @@ void main() { colorSample = texture3Df(intensityVol,samplePos.xyz); colorSample.a = 1.0-pow((1.0 - colorSample.a), stepSize/sliceSize); if (colorSample.a > 0.01) { - bgNearest = min(samplePos.a,bgNearest); + if (nHit < 1) { + nHit ++; + bgNearest = samplePos.a; + setDepthBuffer(samplePos.xyz); + } if (samplePos.a > stepSizeX2) { vec3 a = colorSample.rgb * ambient; gradSample= texture3Df(gradientVol,samplePos.xyz); diff --git a/MRIcroGL.app/Contents/Resources/shader/OpacityPeeling2.glsl b/MRIcroGL.app/Contents/Resources/shader/OpacityPeeling2.glsl index 034d5d4..d0b9285 100755 --- a/MRIcroGL.app/Contents/Resources/shader/OpacityPeeling2.glsl +++ b/MRIcroGL.app/Contents/Resources/shader/OpacityPeeling2.glsl @@ -28,6 +28,8 @@ void main() { vec3 dir = backPosition - start; float len = length(dir); dir = normalize(dir); + gl_FragDepth = 1.0; + int nHit = 0; vec4 deltaDir = vec4(dir.xyz * stepSize, stepSize); vec4 gradSample, colorSample; float bgNearest = len; //assume no hit @@ -70,7 +72,11 @@ void main() { colorSample = texture3Df(intensityVol,samplePos.xyz); colorSample.a = 1.0-pow((1.0 - colorSample.a), stepSize/sliceSize); if (colorSample.a > 0.01) { - bgNearest = min(samplePos.a,bgNearest); + if (nHit < 1) { + nHit ++; + bgNearest = samplePos.a; + setDepthBuffer(samplePos.xyz); + } if (samplePos.a > stepSizeX2) { vec3 a = colorSample.rgb * ambient; gradSample= texture3Df(gradientVol,samplePos.xyz); diff --git a/MRIcroGL.app/Contents/Resources/shader/OverlaySurface.glsl b/MRIcroGL.app/Contents/Resources/shader/OverlaySurface.glsl index 89d5123..ce101e7 100644 --- a/MRIcroGL.app/Contents/Resources/shader/OverlaySurface.glsl +++ b/MRIcroGL.app/Contents/Resources/shader/OverlaySurface.glsl @@ -21,6 +21,8 @@ void main() { vec3 dir = backPosition - start; float len = length(dir); dir = normalize(dir); + gl_FragDepth = 1.0; + int nHit = 0; vec4 deltaDir = vec4(dir.xyz * stepSize, stepSize); vec4 gradSample, colorSample; float bgNearest = len; //assume no hit @@ -60,7 +62,11 @@ void main() { colorSample = texture3Df(intensityVol, samplePos.xyz); colorSample.a = 1.0-pow((1.0 - colorSample.a), stepSize/sliceSize); if (colorSample.a > 0.01) { - bgNearest = min(samplePos.a,bgNearest); + if (nHit < 1) { + nHit ++; + bgNearest = samplePos.a; + setDepthBuffer(samplePos.xyz); + } if (samplePos.a > stepSizeX2) { vec3 a = colorSample.rgb * ambient; gradSample= texture3Df(gradientVol,samplePos.xyz); diff --git a/MRIcroGL.app/Contents/Resources/shader/Raydir.glsl b/MRIcroGL.app/Contents/Resources/shader/Raydir.glsl deleted file mode 100755 index c62effd..0000000 --- a/MRIcroGL.app/Contents/Resources/shader/Raydir.glsl +++ /dev/null @@ -1,155 +0,0 @@ -//pref -ambient|float|0.0|1.0|1|Illuminate surface regardless of lighting -diffuse|float|0.0|0.0|1|Illuminate surface based on light position -specular|float|0.0|0.0|1|Glint from shiny surfaces -shininess|float|0.01|10.0|30|Specular reflections can be rough or precise -overlayFuzzy|float|0.01|0.5|1|Do overlay layers have blurry surfaces? -overlayDepth|float|0.0|0.3|0.8|Can we see overlay layers deep beneath the background image? -overlayClip|float|0|0|1|Does clipping also influence overlay layers? - -//frag -uniform float ambient = 1.0; -uniform float diffuse = 0.0; -uniform float specular = 0.0; -uniform float shininess = 10.0; -uniform float overlayFuzzy = 0.5; -uniform float overlayDepth = 0.3; -uniform float overlayClip = 0.0; - -void main() { - gl_FragColor = vec4(rayDir, 1.0); return; - vec3 start = TexCoord1.xyz; - vec3 backPosition = GetBackPosition(start); - vec3 dir = backPosition - start; - float len = length(dir); - dir = normalize(dir); - vec4 deltaDir = vec4(dir.xyz * stepSize, stepSize); - vec4 gradSample, colorSample; - float bgNearest = len; //assume no hit - vec4 colAcc = vec4(0.0,0.0,0.0,0.0); - vec4 prevGrad = vec4(0.0,0.0,0.0,0.0); - vec4 samplePos; - //background pass - float noClipLen = len; - samplePos = vec4(start.xyz +deltaDir.xyz* (fract(sin(gl_FragCoord.x * 12.9898 + gl_FragCoord.y * 78.233) * 43758.5453)), 0.0); - vec4 clipPos = applyClip(dir, samplePos, len); - float stepSizeX2 = samplePos.a + (stepSize * 2.0); - //fast pass - optional - fastPass (len, dir, intensityVol, samplePos); - #if ( __VERSION__ > 300 ) - if ((samplePos.a > len) && ( overlays < 1 )) { //no hit - FragColor = colAcc; - return; - } - #else - if ((textureSz.x < 1) || ((samplePos.a > len) && ( overlays < 1 ))) { //no hit - gl_FragColor = colAcc; - return; - } - #endif - if (samplePos.a < clipPos.a) - samplePos = clipPos; - deltaDir = vec4(dir.xyz * stepSize, stepSize); - //end fastpass - optional - vec3 defaultDiffuse = vec3(0.5, 0.5, 0.5); - vec3 lightPositionN = normalize(lightPosition); - while (samplePos.a <= len) { - colorSample = texture3Df(intensityVol,samplePos.xyz); - colorSample.a = 1.0-pow((1.0 - colorSample.a), stepSize/sliceSize); - if (colorSample.a > 0.01) { - bgNearest = min(samplePos.a,bgNearest); - if (samplePos.a > stepSizeX2) { - vec3 a = colorSample.rgb * ambient; - gradSample= texture3Df(gradientVol,samplePos.xyz); - gradSample.rgb = normalize(gradSample.rgb*2.0 - 1.0); - //reusing Normals http://www.marcusbannerman.co.uk/articles/VolumeRendering.html - if (gradSample.a < prevGrad.a) - gradSample.rgb = prevGrad.rgb; - prevGrad = gradSample; - float lightNormDot = dot(gradSample.rgb, lightPositionN); - vec3 d = max(lightNormDot, 0.0) * colorSample.rgb * diffuse; - float s = specular * pow(max(dot(reflect(lightPositionN, gradSample.rgb), dir), 0.0), shininess); - colorSample.rgb = a + d + s; - - } else - colorSample.a = clamp(colorSample.a*3.0,0.0, 1.0); - colorSample.rgb *= colorSample.a; - colAcc= (1.0 - colAcc.a) * colorSample + colAcc; - if ( colAcc.a > 0.95 ) - break; - } - samplePos += deltaDir; - } //while samplePos.a < len - colAcc.a = colAcc.a/0.95; - colAcc.a *= backAlpha; - if ( overlays < 1 ) { - #if ( __VERSION__ > 300 ) - FragColor = colAcc; - #else - gl_FragColor = colAcc; - #endif - return; - } - //overlay pass - vec4 overAcc = vec4(0.0,0.0,0.0,0.0); - prevGrad = vec4(0.0,0.0,0.0,0.0); - if (overlayClip > 0) - samplePos = clipPos; - else { - len = noClipLen; - samplePos = vec4(start.xyz +deltaDir.xyz* (fract(sin(gl_FragCoord.x * 12.9898 + gl_FragCoord.y * 78.233) * 43758.5453)), 0.0); - } - //fast pass - optional - clipPos = samplePos; - fastPass (len, dir, intensityOverlay, samplePos); - if (samplePos.a < clipPos.a) - samplePos = clipPos; - //end fastpass - optional - float overFarthest = len; - while (samplePos.a <= len) { - colorSample = texture3Df(intensityOverlay,samplePos.xyz); - if (colorSample.a > 0.00) { - if (overAcc.a < 0.3) - overFarthest = samplePos.a; - colorSample.a = 1.0-pow((1.0 - colorSample.a), stepSize/sliceSize); - colorSample.a *= overlayFuzzy; - vec3 a = colorSample.rgb * ambient; - float s = 0; - vec3 d = vec3(0.0, 0.0, 0.0); - //gradient based lighting http://www.mccauslandcenter.sc.edu/mricrogl/gradients - gradSample = texture3Df(gradientOverlay,samplePos.xyz); //interpolate gradient direction and magnitude - gradSample.rgb = normalize(gradSample.rgb*2.0 - 1.0); - //reusing Normals http://www.marcusbannerman.co.uk/articles/VolumeRendering.html - if (gradSample.a < prevGrad.a) - gradSample.rgb = prevGrad.rgb; - prevGrad = gradSample; - float lightNormDot = dot(gradSample.rgb, lightPosition); - d = max(lightNormDot, 0.0) * colorSample.rgb * diffuse; - s = specular * pow(max(dot(reflect(lightPosition, gradSample.rgb), dir), 0.0), shininess); - - colorSample.rgb = a + d + s; - colorSample.rgb *= colorSample.a; - overAcc= (1.0 - overAcc.a) * colorSample + overAcc; - if (overAcc.a > 0.95 ) - break; - } - samplePos += deltaDir; - } //while samplePos.a < len - overAcc.a = overAcc.a/0.95; - //end ovelay pass clip plane applied to background ONLY... - //if (overAcc.a > 0.0) { //<- conditional not required: overMix always 0 for overAcc.a = 0.0 - float overMix = overAcc.a; - if (((overFarthest) > bgNearest) && (colAcc.a > 0.0)) { //background (partially) occludes overlay - float dx = (overFarthest - bgNearest)/1.73; - dx = colAcc.a * pow(dx, overlayDepth); - overMix *= 1.0 - dx; - } - colAcc.rgb = mix(colAcc.rgb, overAcc.rgb, overMix); - colAcc.a = max(colAcc.a, overAcc.a); - //} - #if ( __VERSION__ > 300 ) - FragColor = colAcc; - #else - gl_FragColor = colAcc; - #endif -} \ No newline at end of file diff --git a/MRIcroGL.app/Contents/Resources/shader/Shell.glsl b/MRIcroGL.app/Contents/Resources/shader/Shell.glsl index 00b12bd..5f853d7 100644 --- a/MRIcroGL.app/Contents/Resources/shader/Shell.glsl +++ b/MRIcroGL.app/Contents/Resources/shader/Shell.glsl @@ -23,6 +23,8 @@ void main() { vec3 dir = backPosition - start; float len = length(dir); dir = normalize(dir); + gl_FragDepth = 1.0; + int nHit = 0; vec4 deltaDir = vec4(dir.xyz * stepSize, stepSize); vec4 gradSample, colorSample; float bgNearest = len; //assume no hit @@ -73,7 +75,11 @@ void main() { samplePos += deltaDir; if (gradSample.a < 0.01) continue; - bgNearest = min(samplePos.a,bgNearest); + if (nHit < 1) { + nHit ++; + bgNearest = samplePos.a; + setDepthBuffer(samplePos.xyz); + } if (gradSample.a < prevGrad.a) gradSample.rgb = prevGrad.rgb; prevGrad = gradSample; diff --git a/MRIcroGL.app/Contents/Resources/shader/ShellEdges.glsl b/MRIcroGL.app/Contents/Resources/shader/ShellEdges.glsl index f357088..ac56e81 100644 --- a/MRIcroGL.app/Contents/Resources/shader/ShellEdges.glsl +++ b/MRIcroGL.app/Contents/Resources/shader/ShellEdges.glsl @@ -23,6 +23,8 @@ void main() { vec3 dir = backPosition - start; float len = length(dir); dir = normalize(dir); + gl_FragDepth = 1.0; + int nHit = 0; vec4 deltaDir = vec4(dir.xyz * stepSize, stepSize); vec4 gradSample, colorSample; float bgNearest = len; @@ -72,7 +74,11 @@ void main() { samplePos += deltaDir; if (gradSample.a == 0.00) continue; - bgNearest = min(samplePos.a,bgNearest); + if (nHit < 1) { + nHit ++; + bgNearest = samplePos.a; + setDepthBuffer(samplePos.xyz); + } if (gradSample.a < prevGrad.a) gradSample.rgb = prevGrad.rgb; prevGrad = gradSample; diff --git a/MRIcroGL.app/Contents/Resources/shader/Shiny.glsl b/MRIcroGL.app/Contents/Resources/shader/Shiny.glsl index 4de6301..3dd3563 100644 --- a/MRIcroGL.app/Contents/Resources/shader/Shiny.glsl +++ b/MRIcroGL.app/Contents/Resources/shader/Shiny.glsl @@ -22,6 +22,8 @@ void main() { vec3 dir = backPosition - start; float len = length(dir); dir = normalize(dir); + gl_FragDepth = 1.0; + int nHit = 0; vec4 deltaDir = vec4(dir.xyz * stepSize, stepSize); vec4 gradSample, colorSample; float bgNearest = len; //assume no hit @@ -56,7 +58,11 @@ void main() { colorSample = texture3Df(intensityVol,samplePos.xyz); colorSample.a = 1.0-pow((1.0 - colorSample.a), stepSize/sliceSize); if (colorSample.a > 0.01) { - bgNearest = min(samplePos.a,bgNearest); + if (nHit < 1) { + nHit ++; + bgNearest = samplePos.a; + setDepthBuffer(samplePos.xyz); + } if (samplePos.a > stepSizeX2) { vec3 a = colorSample.rgb * ambient; gradSample= texture3Df(gradientVol,samplePos.xyz); diff --git a/MRIcroGL.app/Contents/Resources/shader/ShinyEdge.glsl b/MRIcroGL.app/Contents/Resources/shader/ShinyEdge.glsl index bc2c4c2..9a2f37e 100755 --- a/MRIcroGL.app/Contents/Resources/shader/ShinyEdge.glsl +++ b/MRIcroGL.app/Contents/Resources/shader/ShinyEdge.glsl @@ -24,6 +24,8 @@ void main() { vec3 dir = backPosition - start; float len = length(dir); dir = normalize(dir); + gl_FragDepth = 1.0; + int nHit = 0; vec4 deltaDir = vec4(dir.xyz * stepSize, stepSize); vec4 gradSample, colorSample; float bgNearest = len; //assume no hit @@ -59,7 +61,11 @@ void main() { colorSample = texture3Df(intensityVol,samplePos.xyz); colorSample.a = 1.0-pow((1.0 - colorSample.a), stepSize/sliceSize); if (colorSample.a > 0.01) { - bgNearest = min(samplePos.a,bgNearest); + if (nHit < 1) { + nHit ++; + bgNearest = samplePos.a; + setDepthBuffer(samplePos.xyz); + } if (samplePos.a > stepSizeX2) { vec3 a = colorSample.rgb * ambient; gradSample= texture3Df(gradientVol,samplePos.xyz); diff --git a/MRIcroGL.app/Contents/Resources/shader/Slow.glsl b/MRIcroGL.app/Contents/Resources/shader/Slow.glsl index 78a2cf3..06c8b21 100644 --- a/MRIcroGL.app/Contents/Resources/shader/Slow.glsl +++ b/MRIcroGL.app/Contents/Resources/shader/Slow.glsl @@ -31,6 +31,8 @@ void main() { vec3 dir = backPosition - start; float len = length(dir); dir = normalize(dir); + gl_FragDepth = 1.0; + int nHit = 0; vec4 deltaDir = vec4(dir.xyz * stepSize, stepSize); vec4 gradSample, colorSample; float bgNearest = len; //assume no hit @@ -102,8 +104,11 @@ void main() { colorSample = texture3Df(intensityVol,samplePos.xyz); if (colorSample.a > 0.0) { colorSample.a = 1.0-pow((1.0 - colorSample.a), stepSize/sliceSize); - bgNearest = min(samplePos.a, bgNearest); - + if (nHit < 1) { + nHit ++; + bgNearest = samplePos.a; + setDepthBuffer(samplePos.xyz); + } gradSample= texture3Df(gradientVol,samplePos.xyz); gradSample.rgb = normalize(gradSample.rgb*2.0 - 1.0); //reusing Normals http://www.marcusbannerman.co.uk/articles/VolumeRendering.html diff --git a/MRIcroGL.app/Contents/Resources/shader/SpecialEffects.glsl b/MRIcroGL.app/Contents/Resources/shader/SpecialEffects.glsl index de5537f..748b3fb 100644 --- a/MRIcroGL.app/Contents/Resources/shader/SpecialEffects.glsl +++ b/MRIcroGL.app/Contents/Resources/shader/SpecialEffects.glsl @@ -23,6 +23,8 @@ void main() { ran = fract(sin(gl_FragCoord.x * 12.9898 + gl_FragCoord.y * 78.233) * 43758.5453); float len = length(dir); dir = normalize(dir); + gl_FragDepth = 1.0; + int nHit = 0; float stepSizeX = stepSize; if (doPoor > 0.5) stepSizeX *= 10.0; vec4 deltaDir = vec4(dir.xyz * stepSizeX, stepSizeX); @@ -60,7 +62,11 @@ void main() { if (colorSample.a > 0.0) { if (showGradient > 0.5) colorSample.rgb = abs(texture3Df(gradientVol,samplePos.xyz).rgb *2.0 - 1.0); - bgNearest = min(samplePos.a,bgNearest); + if (nHit < 1) { + nHit ++; + bgNearest = samplePos.a; + setDepthBuffer(samplePos.xyz); + } colorSample.rgb *= colorSample.a; colAcc= (1.0 - colAcc.a) * colorSample + colAcc; if ( colAcc.a > 0.95 ) diff --git a/MRIcroGL.app/Contents/Resources/shader/SpecialEffects2.glsl b/MRIcroGL.app/Contents/Resources/shader/SpecialEffects2.glsl deleted file mode 100755 index ac7cb1f..0000000 --- a/MRIcroGL.app/Contents/Resources/shader/SpecialEffects2.glsl +++ /dev/null @@ -1,150 +0,0 @@ -//pref -showGradient|float|0|0|1|Display surface angle -doPoor|float|0|1|1|Poor quality reveals rendering strategy -doJitter|float|0|0|1|Jitter hides wood-grain artifacts -showStartEnd|float|0|0.5|1|Show background box - -//frag -uniform float showGradient = 0.0; -uniform float doPoor = 0.0; -uniform float doJitter = 0.0; -uniform float showStartEnd = 0.2; - -void main() { - float ambient = 1.0; - float diffuse = 0.3; - float specular = 0.25; - float shininess = 10.0; - vec3 start = TexCoord1.xyz; -gl_FragColor = vec4(start, 1.0); return; - vec3 backPosition = GetBackPosition(start); - vec3 dir = backPosition - start; - float ran = 0.0; - if (doJitter > 0.5) - ran = fract(sin(gl_FragCoord.x * 12.9898 + gl_FragCoord.y * 78.233) * 43758.5453); - float len = length(dir); - dir = normalize(dir); - float stepSizeX = stepSize; - if (doPoor > 0.5) stepSizeX *= 10.0; - vec4 deltaDir = vec4(dir.xyz * stepSizeX, stepSizeX); - vec4 gradSample, colorSample; - float bgNearest = len; //assume no hit - vec4 colAcc = vec4(0.0,0.0,0.0,0.0); - vec4 prevGrad = vec4(0.0,0.0,0.0,0.0); - //background pass - vec4 samplePos = vec4(start.xyz, 0.0); - samplePos += deltaDir * ran; - vec4 clipPos = applyClip(dir, samplePos, len); - #if ( __VERSION__ > 300 ) - if ( clipPos.a > len ) { - FragColor = colAcc; - return; - } - #else - if ((textureSz.x < 1) || ( clipPos.a > len )) { - gl_FragColor = colAcc; - return; - } - #endif - // float ran = fract(sin(gl_FragCoord.x * 12.9898 + gl_FragCoord.y * 78.233) * 43758.5453); - - vec3 defaultDiffuse = vec3(0.5, 0.5, 0.5); - // - if (doPoor <= 0.5) - fastPass (len, dir, intensityVol, samplePos); - //if (samplePos.a < clipPos.a) - // samplePos = clipPos; - - while (samplePos.a <= len) { - colorSample = texture3Df(intensityVol,samplePos.xyz); - colorSample.a = 1.0-pow((1.0 - colorSample.a), stepSizeX/sliceSize); - if (colorSample.a > 0.0) { - if (showGradient > 0.5) - colorSample.rgb = abs(texture3Df(gradientVol,samplePos.xyz).rgb *2.0 - 1.0); - bgNearest = min(samplePos.a,bgNearest); - colorSample.rgb *= colorSample.a; - colAcc= (1.0 - colAcc.a) * colorSample + colAcc; - if ( colAcc.a > 0.95 ) - break; - } - samplePos += deltaDir; - } //while samplePos.a < len - colAcc.a = colAcc.a/0.95; - colAcc.a *= backAlpha; - if (samplePos.a > (len +0.5)) { - // - } else if (showStartEnd < 0.33) { - colAcc.rgb = mix(clipPos.xyz, colAcc.rgb, colAcc.a); - colAcc.a = 1.0; - } else if (showStartEnd < 0.66) { - colAcc.rgb = mix(clipPos.xyz + (dir * (len - clipPos.a)), colAcc.rgb, colAcc.a); - //colAcc.rgb = mix(clipPos.xyz + (dir * len), colAcc.rgb, colAcc.a); - colAcc.a = 1.0; - } - if ( overlays < 1 ) { - #if ( __VERSION__ > 300 ) - FragColor = colAcc; - #else - gl_FragColor = colAcc; - #endif - return; - } - //overlay pass - vec4 overAcc = vec4(0.0,0.0,0.0,0.0); - prevGrad = vec4(0.0,0.0,0.0,0.0); - samplePos = clipPos; - //fast pass - optional - clipPos = samplePos; - if (doPoor <= 0.5) - fastPass (len, dir, intensityOverlay, samplePos); - if (samplePos.a < clipPos.a) - samplePos = clipPos; - //end fastpass - optional - float overFarthest = len; - while (samplePos.a <= len) { - colorSample = texture3Df(intensityOverlay,samplePos.xyz); - if (colorSample.a > 0.00) { - if (overAcc.a < 0.3) - overFarthest = samplePos.a; - colorSample.a = 1.0-pow((1.0 - colorSample.a), stepSizeX/sliceSize); - vec3 a = colorSample.rgb * ambient; - float s = 0; - vec3 d = vec3(0.0, 0.0, 0.0); - //gradient based lighting http://www.mccauslandcenter.sc.edu/mricrogl/gradients - gradSample = texture3Df(gradientOverlay,samplePos.xyz); //interpolate gradient direction and magnitude - gradSample.rgb = normalize(gradSample.rgb*2.0 - 1.0); - //reusing Normals http://www.marcusbannerman.co.uk/articles/VolumeRendering.html - if (gradSample.a < prevGrad.a) - gradSample.rgb = prevGrad.rgb; - prevGrad = gradSample; - float lightNormDot = dot(gradSample.rgb, lightPosition); - d = max(lightNormDot, 0.0) * colorSample.rgb * diffuse; - s = specular * pow(max(dot(reflect(lightPosition, gradSample.rgb), dir), 0.0), shininess); - - colorSample.rgb = a + d + s; - colorSample.rgb *= colorSample.a; - overAcc= (1.0 - overAcc.a) * colorSample + overAcc; - if (overAcc.a > 0.95 ) - break; - } - samplePos += deltaDir; - } //while samplePos.a < len - overAcc.a = overAcc.a/0.95; - //end ovelay pass clip plane applied to background ONLY... - //if (overAcc.a > 0.0) { //<- conditional not required: overMix always 0 for overAcc.a = 0.0 - float overMix = overAcc.a; - if (((overFarthest) > bgNearest) && (colAcc.a > 0.0)) { //background (partially) occludes overlay - float dx = (overFarthest - bgNearest)/1.73; - float overlayDepth = 0.3; - dx = colAcc.a * pow(dx, overlayDepth); - overMix *= 1.0 - dx; - } - colAcc.rgb = mix(colAcc.rgb, overAcc.rgb, overMix); - colAcc.a = max(colAcc.a, overAcc.a); - //} - #if ( __VERSION__ > 300 ) - FragColor = colAcc; - #else - gl_FragColor = colAcc; - #endif -} \ No newline at end of file diff --git a/MRIcroGL.app/Contents/Resources/shader/Standard.glsl b/MRIcroGL.app/Contents/Resources/shader/Standard.glsl index 3ea42aa..9673213 100644 --- a/MRIcroGL.app/Contents/Resources/shader/Standard.glsl +++ b/MRIcroGL.app/Contents/Resources/shader/Standard.glsl @@ -21,6 +21,8 @@ void main() { vec3 dir = backPosition - start; float len = length(dir); dir = normalize(dir); + gl_FragDepth = 1.0; + int nHit = 0; vec4 deltaDir = vec4(dir.xyz * stepSize, stepSize); vec4 gradSample, colorSample; float bgNearest = len; //assume no hit @@ -54,7 +56,11 @@ void main() { colorSample = texture3Df(intensityVol,samplePos.xyz); colorSample.a = 1.0-pow((1.0 - colorSample.a), stepSize/sliceSize); if (colorSample.a > 0.01) { - bgNearest = min(samplePos.a,bgNearest); + if (nHit < 1) { + nHit ++; + bgNearest = samplePos.a; + setDepthBuffer(samplePos.xyz); + } if (samplePos.a > stepSizeX2) { vec3 a = colorSample.rgb * ambient; gradSample= texture3Df(gradientVol,samplePos.xyz); diff --git a/MRIcroGL.app/Contents/Resources/shader/Tomography.glsl b/MRIcroGL.app/Contents/Resources/shader/Tomography.glsl index 604bfcb..aab214a 100644 --- a/MRIcroGL.app/Contents/Resources/shader/Tomography.glsl +++ b/MRIcroGL.app/Contents/Resources/shader/Tomography.glsl @@ -26,6 +26,8 @@ void main() { vec3 dir = backPosition - start; float len = length(dir); dir = normalize(dir); + gl_FragDepth = 1.0; + int nHit = 0; vec4 deltaDir = vec4(dir.xyz * stepSize, stepSize); vec4 gradSample, colorSample; float bgNearest = len; //assume no hit @@ -77,7 +79,11 @@ void main() { colorSample.a = 1.0-pow((1.0 - colorSample.a), stepSize/sliceSize); if (colorSample.a > 0.01) { if (colorSample.a > colorMax.a) colorMax = colorSample; - bgNearest = min(samplePos.a,bgNearest); + if (nHit < 1) { + nHit ++; + bgNearest = samplePos.a; + setDepthBuffer(samplePos.xyz); + } vec3 a = colorSample.rgb; gradSample= texture3Df(gradientVol,samplePos.xyz); gradSample.rgb = normalize(gradSample.rgb*2.0 - 1.0); diff --git a/MRIcroGL.lpi b/MRIcroGL.lpi index f6e648d..959d1f3 100755 --- a/MRIcroGL.lpi +++ b/MRIcroGL.lpi @@ -153,7 +153,7 @@ +-dXMYPY"/> diff --git a/MRIcroGL.lpr b/MRIcroGL.lpr index 436cd01..13a19fe 100755 --- a/MRIcroGL.lpr +++ b/MRIcroGL.lpr @@ -21,6 +21,7 @@ {$R *.res} begin RequireDerivedFormResource:=True; + Application.Title:='MRIcroGL'; Application.Scaled:=True; Application.Initialize; Application.CreateForm(TGLForm1, GLForm1); diff --git a/MRIcroGL.lps b/MRIcroGL.lps index 9e6ee61..fe3bcd1 100755 --- a/MRIcroGL.lps +++ b/MRIcroGL.lps @@ -3,13 +3,13 @@ - + - - - + + + @@ -21,8 +21,8 @@ - - + + @@ -146,115 +146,121 @@ - + - - - - + + + + + - - - - + + + + + - + - - - + + + - - - - + + + + + - - - + + + - - - - + + + + + - - - - + + + + + - - - - + + + + + - + - - + + - + - + - + - + - - + + @@ -263,28 +269,28 @@ - + - + - + - + @@ -292,21 +298,21 @@ - + - + - - - - + + + + @@ -314,7 +320,7 @@ - + @@ -322,231 +328,220 @@ - + - + - - - - + + + + + - + - - - - - - - - - - + + + - - - + + + - - - + + + + + + + + + + - + - - - + + - + - - + + + - - - - + + + + + + + - - - - - + + + + + - - - - - - - - - - - - - - - - - - - + + + + - + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - + - + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - + - - + + - - + + - - + + - + diff --git a/MRIcroGL_Metal_llvm.lps b/MRIcroGL_Metal_llvm.lps index 47d1d37..3bd57e3 100644 --- a/MRIcroGL_Metal_llvm.lps +++ b/MRIcroGL_Metal_llvm.lps @@ -16,6 +16,8 @@ + + @@ -90,7 +92,11 @@ - + + + + + diff --git a/MRIcroGL_llvm.lpi b/MRIcroGL_llvm.lpi index d2a0097..927c95b 100755 --- a/MRIcroGL_llvm.lpi +++ b/MRIcroGL_llvm.lpi @@ -35,7 +35,7 @@ - + @@ -102,17 +102,6 @@ - - - - - - - - - - - @@ -128,14 +117,12 @@ - + - - @@ -150,9 +137,9 @@ - diff --git a/MRIcroGL_llvm.lps b/MRIcroGL_llvm.lps index 0e254ad..9a5fa72 100644 --- a/MRIcroGL_llvm.lps +++ b/MRIcroGL_llvm.lps @@ -17,7 +17,7 @@ - + @@ -88,7 +88,6 @@ - @@ -96,7 +95,6 @@ - diff --git a/Resources/shader/Default.glsl b/Resources/shader/Default.glsl index 8f3df0e..00d4812 100644 --- a/Resources/shader/Default.glsl +++ b/Resources/shader/Default.glsl @@ -29,6 +29,7 @@ void main() { vec4 samplePos = vec4(start.xyz, 0.0); vec4 clipPos = applyClip(dir, samplePos, len); float opacityCorrection = stepSize/sliceSize; + gl_FragDepth = 1.0; //fast pass - optional fastPass (len, dir, intensityVol, samplePos); #if ( __VERSION__ > 300 ) @@ -59,12 +60,17 @@ void main() { //end fastpass - optional float ran = fract(sin(gl_FragCoord.x * 12.9898 + gl_FragCoord.y * 78.233) * 43758.5453); samplePos += deltaDir * ran; + int nHit = 0; vec3 defaultDiffuse = vec3(0.5, 0.5, 0.5); while (samplePos.a <= len) { colorSample = texture3Df(intensityVol,samplePos.xyz); if (colorSample.a > 0.0) { colorSample.a = 1.0-pow((1.0 - colorSample.a), opacityCorrection); - bgNearest = min(samplePos.a,bgNearest); + if (nHit < 1) { + nHit ++; + bgNearest = samplePos.a; + setDepthBuffer(samplePos.xyz); + } gradSample= texture3Df(gradientVol,samplePos.xyz); gradSample.rgb = normalize(gradSample.rgb*2.0 - 1.0); //reusing Normals http://www.marcusbannerman.co.uk/articles/VolumeRendering.html @@ -82,6 +88,7 @@ void main() { samplePos += deltaDir; } //while samplePos.a < len colAcc.a = colAcc.a/0.95; + colAcc.a *= backAlpha; if ( overlays< 1 ) { #if ( __VERSION__ > 300 ) @@ -147,6 +154,7 @@ void main() { } colAcc.rgb = mix(colAcc.rgb, overAcc.rgb, overMix); colAcc.a = max(colAcc.a, overAcc.a); + //if (nHit < 1 ) discard; #if ( __VERSION__ > 300 ) FragColor = colAcc; #else diff --git a/Resources/shader/Edges.glsl b/Resources/shader/Edges.glsl index e4649d6..ae4992e 100644 --- a/Resources/shader/Edges.glsl +++ b/Resources/shader/Edges.glsl @@ -38,6 +38,7 @@ void main() { vec4 samplePos = vec4(start.xyz, 0.0); vec4 clipPos = applyClip(dir, samplePos, len); float opacityCorrection = stepSize/sliceSize; + gl_FragDepth = 1.0; //fast pass - optional fastPass (len, dir, intensityVol, samplePos); #if ( __VERSION__ > 300 ) @@ -71,11 +72,16 @@ void main() { float boundAcc = 0.0; vec3 defaultDiffuse = vec3(0.5, 0.5, 0.5); const float kEarlyTermination = 0.95; + int nHit = 0; while (samplePos.a <= len) { colorSample = texture3Df(intensityVol,samplePos.xyz); samplePos += deltaDir; if (colorSample.a < 0.001) continue; - bgNearest = min(samplePos.a,bgNearest); + if (nHit < 1) { + nHit ++; + bgNearest = samplePos.a; + setDepthBuffer(samplePos.xyz); + } colorSample.a = 1.0-pow((1.0 - colorSample.a), opacityCorrection); gradSample = texture3Df(gradientVol,samplePos.xyz); gradSample.rgb = normalize(gradSample.rgb*2.0 - 1.0); diff --git a/Resources/shader/Glass.glsl b/Resources/shader/Glass.glsl index 1ab6fdd..f3c2bbe 100644 --- a/Resources/shader/Glass.glsl +++ b/Resources/shader/Glass.glsl @@ -28,6 +28,8 @@ void main() { vec3 dir = backPosition - start; float len = length(dir); dir = normalize(dir); + gl_FragDepth = 1.0; + int nHit = 0; vec4 deltaDir = vec4(dir.xyz * stepSize, stepSize); vec4 gradSample, colorSample; float bgNearest = len; //assume no hit @@ -73,7 +75,11 @@ void main() { while (samplePos.a <= len) { gradSample= texture3Df(gradientVol,samplePos.xyz); if (gradSample.a > 0.0) { - bgNearest = min(samplePos.a, bgNearest); + if (nHit < 1) { + nHit ++; + bgNearest = samplePos.a; + setDepthBuffer(samplePos.xyz); + } gradSample.rgb = normalize(gradSample.rgb*2.0 - 1.0); colorSample = gradSample; if (gradSample.a > boundThresh) { diff --git a/Resources/shader/Matte.glsl b/Resources/shader/Matte.glsl index dfaa16a..19d5099 100644 --- a/Resources/shader/Matte.glsl +++ b/Resources/shader/Matte.glsl @@ -22,6 +22,8 @@ void main() { vec3 dir = backPosition - start; float len = length(dir); dir = normalize(dir); + gl_FragDepth = 1.0; + int nHit = 0; vec4 deltaDir = vec4(dir.xyz * stepSize, stepSize); vec4 gradSample, colorSample; float bgNearest = len; //assume no hit @@ -56,7 +58,11 @@ void main() { colorSample = texture3Df(intensityVol,samplePos.xyz); colorSample.a = 1.0-pow((1.0 - colorSample.a), stepSize/sliceSize); if (colorSample.a > 0.01) { - bgNearest = min(samplePos.a,bgNearest); + if (nHit < 1) { + nHit ++; + bgNearest = samplePos.a; + setDepthBuffer(samplePos.xyz); + } if (samplePos.a > stepSizeX2) { vec3 a = colorSample.rgb * ambient; gradSample= texture3Df(gradientVol,samplePos.xyz); diff --git a/Resources/shader/Minimal.glsl b/Resources/shader/Minimal.glsl index 9b8fe9b..c523054 100644 --- a/Resources/shader/Minimal.glsl +++ b/Resources/shader/Minimal.glsl @@ -13,6 +13,8 @@ void main() { vec3 dir = backPosition - start; float len = length(dir); dir = normalize(dir); + gl_FragDepth = 1.0; + int nHit = 0; vec4 deltaDir = vec4(dir.xyz * stepSize, stepSize); vec4 colorSample; float bgNearest = len; //assume no hit @@ -28,7 +30,11 @@ void main() { colorSample = texture3Df(intensityVol,samplePos.xyz); if (colorSample.a > 0.0) { colorSample.a = 1.0-pow((1.0 - colorSample.a), stepSize/sliceSize); - bgNearest = min(samplePos.a,bgNearest); + if (nHit < 1) { + nHit ++; + bgNearest = samplePos.a; + setDepthBuffer(samplePos.xyz); + } if (samplePos.a < stepSizeX2) colorSample.a = clamp(colorSample.a*3.0,0.0, 1.0); colorSample.rgb *= colorSample.a; diff --git a/Resources/shader/Occlusion.glsl b/Resources/shader/Occlusion.glsl index 3fc5de5..4599981 100644 --- a/Resources/shader/Occlusion.glsl +++ b/Resources/shader/Occlusion.glsl @@ -21,6 +21,8 @@ void main() { vec3 dir = backPosition - start; float len = length(dir); dir = normalize(dir); + gl_FragDepth = 1.0; + int nHit = 0; vec4 deltaDir = vec4(dir.xyz * stepSize, stepSize); vec4 gradSample, colorSample; float bgNearest = len; //assume no hit @@ -66,7 +68,11 @@ void main() { colorSample = texture3Df(intensityVol,samplePos.xyz); if (colorSample.a > 0.0) { colorSample.a = 1.0-pow((1.0 - colorSample.a), opacityCorrection); - bgNearest = min(samplePos.a,bgNearest); + if (nHit < 1) { + nHit ++; + bgNearest = samplePos.a; + setDepthBuffer(samplePos.xyz); + } gradSample= texture3Df(gradientVol,samplePos.xyz); gradSample.rgb = normalize(gradSample.rgb*2.0 - 1.0); //reusing Normals http://www.marcusbannerman.co.uk/articles/VolumeRendering.html diff --git a/Resources/shader/OpacityPeeling.glsl b/Resources/shader/OpacityPeeling.glsl index ca0db4e..a549026 100755 --- a/Resources/shader/OpacityPeeling.glsl +++ b/Resources/shader/OpacityPeeling.glsl @@ -28,6 +28,8 @@ void main() { vec3 dir = backPosition - start; float len = length(dir); dir = normalize(dir); + gl_FragDepth = 1.0; + int nHit = 0; vec4 deltaDir = vec4(dir.xyz * stepSize, stepSize); vec4 gradSample, colorSample; float bgNearest = len; //assume no hit @@ -69,7 +71,11 @@ void main() { colorSample = texture3Df(intensityVol,samplePos.xyz); colorSample.a = 1.0-pow((1.0 - colorSample.a), stepSize/sliceSize); if (colorSample.a > 0.01) { - bgNearest = min(samplePos.a,bgNearest); + if (nHit < 1) { + nHit ++; + bgNearest = samplePos.a; + setDepthBuffer(samplePos.xyz); + } if (samplePos.a > stepSizeX2) { vec3 a = colorSample.rgb * ambient; gradSample= texture3Df(gradientVol,samplePos.xyz); diff --git a/Resources/shader/OpacityPeeling2.glsl b/Resources/shader/OpacityPeeling2.glsl index 034d5d4..d0b9285 100755 --- a/Resources/shader/OpacityPeeling2.glsl +++ b/Resources/shader/OpacityPeeling2.glsl @@ -28,6 +28,8 @@ void main() { vec3 dir = backPosition - start; float len = length(dir); dir = normalize(dir); + gl_FragDepth = 1.0; + int nHit = 0; vec4 deltaDir = vec4(dir.xyz * stepSize, stepSize); vec4 gradSample, colorSample; float bgNearest = len; //assume no hit @@ -70,7 +72,11 @@ void main() { colorSample = texture3Df(intensityVol,samplePos.xyz); colorSample.a = 1.0-pow((1.0 - colorSample.a), stepSize/sliceSize); if (colorSample.a > 0.01) { - bgNearest = min(samplePos.a,bgNearest); + if (nHit < 1) { + nHit ++; + bgNearest = samplePos.a; + setDepthBuffer(samplePos.xyz); + } if (samplePos.a > stepSizeX2) { vec3 a = colorSample.rgb * ambient; gradSample= texture3Df(gradientVol,samplePos.xyz); diff --git a/Resources/shader/OverlaySurface.glsl b/Resources/shader/OverlaySurface.glsl index 89d5123..ce101e7 100644 --- a/Resources/shader/OverlaySurface.glsl +++ b/Resources/shader/OverlaySurface.glsl @@ -21,6 +21,8 @@ void main() { vec3 dir = backPosition - start; float len = length(dir); dir = normalize(dir); + gl_FragDepth = 1.0; + int nHit = 0; vec4 deltaDir = vec4(dir.xyz * stepSize, stepSize); vec4 gradSample, colorSample; float bgNearest = len; //assume no hit @@ -60,7 +62,11 @@ void main() { colorSample = texture3Df(intensityVol, samplePos.xyz); colorSample.a = 1.0-pow((1.0 - colorSample.a), stepSize/sliceSize); if (colorSample.a > 0.01) { - bgNearest = min(samplePos.a,bgNearest); + if (nHit < 1) { + nHit ++; + bgNearest = samplePos.a; + setDepthBuffer(samplePos.xyz); + } if (samplePos.a > stepSizeX2) { vec3 a = colorSample.rgb * ambient; gradSample= texture3Df(gradientVol,samplePos.xyz); diff --git a/Resources/shader/Shell.glsl b/Resources/shader/Shell.glsl index 00b12bd..5f853d7 100644 --- a/Resources/shader/Shell.glsl +++ b/Resources/shader/Shell.glsl @@ -23,6 +23,8 @@ void main() { vec3 dir = backPosition - start; float len = length(dir); dir = normalize(dir); + gl_FragDepth = 1.0; + int nHit = 0; vec4 deltaDir = vec4(dir.xyz * stepSize, stepSize); vec4 gradSample, colorSample; float bgNearest = len; //assume no hit @@ -73,7 +75,11 @@ void main() { samplePos += deltaDir; if (gradSample.a < 0.01) continue; - bgNearest = min(samplePos.a,bgNearest); + if (nHit < 1) { + nHit ++; + bgNearest = samplePos.a; + setDepthBuffer(samplePos.xyz); + } if (gradSample.a < prevGrad.a) gradSample.rgb = prevGrad.rgb; prevGrad = gradSample; diff --git a/Resources/shader/ShellEdges.glsl b/Resources/shader/ShellEdges.glsl index f357088..ac56e81 100644 --- a/Resources/shader/ShellEdges.glsl +++ b/Resources/shader/ShellEdges.glsl @@ -23,6 +23,8 @@ void main() { vec3 dir = backPosition - start; float len = length(dir); dir = normalize(dir); + gl_FragDepth = 1.0; + int nHit = 0; vec4 deltaDir = vec4(dir.xyz * stepSize, stepSize); vec4 gradSample, colorSample; float bgNearest = len; @@ -72,7 +74,11 @@ void main() { samplePos += deltaDir; if (gradSample.a == 0.00) continue; - bgNearest = min(samplePos.a,bgNearest); + if (nHit < 1) { + nHit ++; + bgNearest = samplePos.a; + setDepthBuffer(samplePos.xyz); + } if (gradSample.a < prevGrad.a) gradSample.rgb = prevGrad.rgb; prevGrad = gradSample; diff --git a/Resources/shader/Shiny.glsl b/Resources/shader/Shiny.glsl index 4de6301..3dd3563 100644 --- a/Resources/shader/Shiny.glsl +++ b/Resources/shader/Shiny.glsl @@ -22,6 +22,8 @@ void main() { vec3 dir = backPosition - start; float len = length(dir); dir = normalize(dir); + gl_FragDepth = 1.0; + int nHit = 0; vec4 deltaDir = vec4(dir.xyz * stepSize, stepSize); vec4 gradSample, colorSample; float bgNearest = len; //assume no hit @@ -56,7 +58,11 @@ void main() { colorSample = texture3Df(intensityVol,samplePos.xyz); colorSample.a = 1.0-pow((1.0 - colorSample.a), stepSize/sliceSize); if (colorSample.a > 0.01) { - bgNearest = min(samplePos.a,bgNearest); + if (nHit < 1) { + nHit ++; + bgNearest = samplePos.a; + setDepthBuffer(samplePos.xyz); + } if (samplePos.a > stepSizeX2) { vec3 a = colorSample.rgb * ambient; gradSample= texture3Df(gradientVol,samplePos.xyz); diff --git a/Resources/shader/Slow.glsl b/Resources/shader/Slow.glsl index 78a2cf3..06c8b21 100644 --- a/Resources/shader/Slow.glsl +++ b/Resources/shader/Slow.glsl @@ -31,6 +31,8 @@ void main() { vec3 dir = backPosition - start; float len = length(dir); dir = normalize(dir); + gl_FragDepth = 1.0; + int nHit = 0; vec4 deltaDir = vec4(dir.xyz * stepSize, stepSize); vec4 gradSample, colorSample; float bgNearest = len; //assume no hit @@ -102,8 +104,11 @@ void main() { colorSample = texture3Df(intensityVol,samplePos.xyz); if (colorSample.a > 0.0) { colorSample.a = 1.0-pow((1.0 - colorSample.a), stepSize/sliceSize); - bgNearest = min(samplePos.a, bgNearest); - + if (nHit < 1) { + nHit ++; + bgNearest = samplePos.a; + setDepthBuffer(samplePos.xyz); + } gradSample= texture3Df(gradientVol,samplePos.xyz); gradSample.rgb = normalize(gradSample.rgb*2.0 - 1.0); //reusing Normals http://www.marcusbannerman.co.uk/articles/VolumeRendering.html diff --git a/Resources/shader/SpecialEffects.glsl b/Resources/shader/SpecialEffects.glsl index de5537f..748b3fb 100644 --- a/Resources/shader/SpecialEffects.glsl +++ b/Resources/shader/SpecialEffects.glsl @@ -23,6 +23,8 @@ void main() { ran = fract(sin(gl_FragCoord.x * 12.9898 + gl_FragCoord.y * 78.233) * 43758.5453); float len = length(dir); dir = normalize(dir); + gl_FragDepth = 1.0; + int nHit = 0; float stepSizeX = stepSize; if (doPoor > 0.5) stepSizeX *= 10.0; vec4 deltaDir = vec4(dir.xyz * stepSizeX, stepSizeX); @@ -60,7 +62,11 @@ void main() { if (colorSample.a > 0.0) { if (showGradient > 0.5) colorSample.rgb = abs(texture3Df(gradientVol,samplePos.xyz).rgb *2.0 - 1.0); - bgNearest = min(samplePos.a,bgNearest); + if (nHit < 1) { + nHit ++; + bgNearest = samplePos.a; + setDepthBuffer(samplePos.xyz); + } colorSample.rgb *= colorSample.a; colAcc= (1.0 - colAcc.a) * colorSample + colAcc; if ( colAcc.a > 0.95 ) diff --git a/Resources/shader/Standard.glsl b/Resources/shader/Standard.glsl index 3ea42aa..9673213 100644 --- a/Resources/shader/Standard.glsl +++ b/Resources/shader/Standard.glsl @@ -21,6 +21,8 @@ void main() { vec3 dir = backPosition - start; float len = length(dir); dir = normalize(dir); + gl_FragDepth = 1.0; + int nHit = 0; vec4 deltaDir = vec4(dir.xyz * stepSize, stepSize); vec4 gradSample, colorSample; float bgNearest = len; //assume no hit @@ -54,7 +56,11 @@ void main() { colorSample = texture3Df(intensityVol,samplePos.xyz); colorSample.a = 1.0-pow((1.0 - colorSample.a), stepSize/sliceSize); if (colorSample.a > 0.01) { - bgNearest = min(samplePos.a,bgNearest); + if (nHit < 1) { + nHit ++; + bgNearest = samplePos.a; + setDepthBuffer(samplePos.xyz); + } if (samplePos.a > stepSizeX2) { vec3 a = colorSample.rgb * ambient; gradSample= texture3Df(gradientVol,samplePos.xyz); diff --git a/Resources/shader/Tomography.glsl b/Resources/shader/Tomography.glsl index 604bfcb..aab214a 100644 --- a/Resources/shader/Tomography.glsl +++ b/Resources/shader/Tomography.glsl @@ -26,6 +26,8 @@ void main() { vec3 dir = backPosition - start; float len = length(dir); dir = normalize(dir); + gl_FragDepth = 1.0; + int nHit = 0; vec4 deltaDir = vec4(dir.xyz * stepSize, stepSize); vec4 gradSample, colorSample; float bgNearest = len; //assume no hit @@ -77,7 +79,11 @@ void main() { colorSample.a = 1.0-pow((1.0 - colorSample.a), stepSize/sliceSize); if (colorSample.a > 0.01) { if (colorSample.a > colorMax.a) colorMax = colorSample; - bgNearest = min(samplePos.a,bgNearest); + if (nHit < 1) { + nHit ++; + bgNearest = samplePos.a; + setDepthBuffer(samplePos.xyz); + } vec3 a = colorSample.rgb; gradSample= texture3Df(gradientVol,samplePos.xyz); gradSample.rgb = normalize(gradSample.rgb*2.0 - 1.0); diff --git a/glvolume2.pas b/glvolume2.pas index a8bd6e7..650958b 100644 --- a/glvolume2.pas +++ b/glvolume2.pas @@ -6,6 +6,7 @@ interface {$DEFINE STRIP} //we can define cube as either a triangle or triangle strip - no implications on performance {$DEFINE GPUGRADIENTS} //Computing volume gradients on the GPU is much faster than using the CPU {$DEFINE VIEW2D} +//{$DEFINE LINE3D} {$DEFINE CUBE} {$DEFINE MATCAP} {$DEFINE CLRBAR} @@ -34,23 +35,29 @@ interface TGPUVolume = class private {$IFDEF DEPTHPICKER} - {$IFDEF DEPTHPICKER_USEFRAMEBUFFER} - depthPickerFrameBuffer , depthPickerTex: GLuint; + {$IFNDEF DEPTHPICKER2}depthProgram: GLuint; + rayDirLocDepth, mvpLocDepth, textureSzLocDepth, overlaysLocDepth,lightPositionLocDepth, + clipPlaneLocDepth,clipThickLocDepth,intensityVolLocDepth,sliceSizeLocDepth, + overlayIntensityVolLocDepth,stepSizeLocDepth: GLint; {$ENDIF} - depthProgram: GLuint; - rayDirLocDepth, mvpLocDepth, textureSzLocDepth, overlaysLocDepth,lightPositionLocDepth,clipPlaneLocDepth,clipThickLocDepth,intensityVolLocDepth,sliceSizeLocDepth,overlayIntensityVolLocDepth,stepSizeLocDepth: GLint; {$ENDIF} {$IFDEF VIEW2D} {$IFDEF COREGL} vao, vaoTex2D, vboTex2D, vaoLine2D, vboLine2D, + {$IFDEF LINE3D}vaoLine3D, vboLine3D,{$ENDIF} {$ELSE} textureSzLoc : GLint; dlTex2D, dlLine2D, dlBox3D, dlColorEditor, {$ENDIF} + {$IFDEF LINE3D} + programLine3D, + {$ENDIF} programLine2D, programTex2D: GLuint; slices2D: TSlices2D; + {$IFDEF LINE3D} mvpLine3DLoc, colorLine3DLoc, {$ENDIF} uniform_drawTex, uniform_drawLUT, uniform_drawAlpha, - uniform_texVox, uniform_viewportSizeLine, uniform_viewportSizeTex, uniform_backAlpha, uniform_tex, uniform_overlay, uniform_overlaysLoc: GLint; + uniform_texVox, uniform_viewportSizeLine, uniform_viewportSizeTex, uniform_backAlpha, + uniform_tex, uniform_overlay, uniform_overlaysLoc: GLint; colorEditor: TColorEditor; isSmooth2D, colorEditorVisible: boolean; txt: TGPUFont; @@ -71,6 +78,10 @@ TGPUVolume = class overlayGradientTexture3D, overlayIntensityTexture3D, drawTexture1D, drawTexture3D, gradientTexture3D, intensityTexture3D, programRaycast, programRaycastBetter: GLuint; + {$IFDEF DEPTHPICKER2} + mvp: TMat4; + viewportXYWH: TVec4; + {$ENDIF} {$IFDEF MATCAP} matcap2D: GLuint; {$ENDIF} @@ -99,6 +110,7 @@ TGPUVolume = class function Slice2Dmm(var vol: TNIfTI; out vox: TVec3i): TVec3; procedure SetSlice2DFrac(frac : TVec3); function GetSlice2DFrac(mouseX, mouseY: integer; var oOrient: integer): TVec3; + function Unproject(mouseX, mouseY, depth: single): TVec3; function GetSlice2DMaxXY(mouseX, mouseY: integer; var Lo: TPoint): TPoint; procedure Paint2D(var vol: TNIfTI; Drawing: TDraw; DisplayOrient: integer); {$IFDEF MOSAIC} @@ -122,6 +134,7 @@ TGPUVolume = class procedure Prepare(shaderName: string); procedure SetGradientMode(newMode: integer); constructor Create(fromView: TOpenGLControl); + procedure PaintCrosshair3D(rgba: TVec4); procedure PaintCore(var vol: TNIfTI; widthHeightLeft: TVec3i; clearScreen: boolean = true; isDepthShader: boolean = false); procedure Paint(var vol: TNIfTI); procedure PaintDepth(var vol: TNIfTI; isAxCorSagOrient4: boolean = false); @@ -137,12 +150,58 @@ implementation {$IFNDEF COREGL}{$IFDEF LINUX} {$DEFINE MESA_HACKS} {$ENDIF}{$ENDIF} +{$IFDEF LINE3D}{$IFDEF COREGL} +var gLines3D: array of TVec3; +{$ENDIF}{$ENDIF} procedure printf (lS: AnsiString); begin {$IFNDEF WINDOWS} writeln(lS); {$ENDIF} end; +{$IFDEF DEPTHPICKER2} +function gluUnProject(winXYZ: TVec3; mvp: TMat4; viewportXYWH: TVec4): TVec3; +//viewport[0]=x, viewport[1]=y, viewport[2]=width, viewport[3]=height +//return coordinates in object space +(*vec4 v = vec4(2.0*(gl_FragCoord.x-view.x)/view.z-1.0, + 2.0*(gl_FragCoord.y-view.y)/view.w-1.0, + 2.0*texture2DRect(DepthTex,gl_FragCoord.xy).z-1.0, + 1.0 ); +v = gl_ModelViewProjectionMatrixInverse * v; +v /= v.w;*) +//https://community.khronos.org/t/converting-gl-fragcoord-to-model-space/57397 +//https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/gluUnProject.xml +//http://nehe.gamedev.net/article/using_gluunproject/16013/ +var + v: TVec4; + mvpInv: TMat4; +begin + v := vec4(2.0*(winXYZ.x-viewportXYWH.x)/viewportXYWH.z-1.0, + 2.0*(winXYZ.y-viewportXYWH.y)/viewportXYWH.w-1.0, + 2.0*winXYZ.z-1.0, + 1.0); + mvpInv := mvp.inverse; + v := mvpInv * v; + v := v / v.w; + result := vec3(v.x, v.y, v.z); +end; + +function TGPUVolume.Unproject(mouseX, mouseY, depth: single): TVec3; +var + winXYZ: TVec3; +begin + winXYZ := vec3(mouseX, mouseY, depth); + result := gluUnProject(winXYZ, mvp, viewportXYWH); + //printf(format('windowXYZ %g %g %g', [winXYZ.x, winXYZ.y, winXYZ.z])); + //printf(format('objXYZ %g %g %g', [result.x, result.y, result.z])); +end; +{$ELSE} +function TGPUVolume.Unproject(mouseX, mouseY, depth: single): TVec3; +begin + result := vec3(2.0, 2.0, 2.0); +end; +{$ENDIF} + destructor TGPUVolume.Destroy; begin {$IFDEF VIEW2D} @@ -150,6 +209,9 @@ destructor TGPUVolume.Destroy; colorEditor.free; txt.free; {$ENDIF} + {$IFDEF LINE3D}{$IFDEF COREGL} + gLines3D := nil; + {$ENDIF}{$ENDIF} {$IFDEF CUBE} gCube.free; {$ENDIF} {$IFDEF CLRBAR} clrbar.free; {$ENDIF} inherited; @@ -698,6 +760,24 @@ procedure TGPUVolume.CreateDrawTex(Dim: TVec3i; Vals: TUInt8s); +#10' gl_Position = ModelViewProjectionMatrix * vec4(vPos, 1.0);' +#10' vPosition = gl_Position;' +#10'}'; + +{$IFDEF LINE3D} +kVertLine3D = '#version 330 core' ++#10'layout(location = 0) in vec3 vPos;' ++#10'uniform mat4 ModelViewProjectionMatrix;' ++#10'void main() {' ++#10' gl_Position = ModelViewProjectionMatrix * vec4(vPos, 1.0);' ++#10'}'; + + kFragLine3D = '#version 330 core' ++#10'uniform vec4 Color;' ++#10'out vec4 FragColor;' ++#10'void main() {' ++#10' FragColor = Color;' ++#10'}'; +{$ENDIF}//line3D + + {$ELSE} kVert = '#version 120' +#10'varying vec3 TexCoord1;' @@ -709,6 +789,20 @@ procedure TGPUVolume.CreateDrawTex(Dim: TVec3i; Vals: TUInt8s); +#10' vPosition = gl_Position;' +#10'}'; +{$IFDEF LINE3D} +kVertLine3D = '#version 120' ++#10'uniform mat4 ModelViewProjectionMatrix;' ++#10'void main() {' ++#10' gl_Position = ModelViewProjectionMatrix * vec4(gl_Vertex.xyz, 1.0);' ++#10'}'; + + kFragLine3D = '#version 120' ++#10'uniform vec4 Color;' ++#10'void main() {' ++#10' gl_FragColor = Color;' ++#10'}'; +{$ENDIF}//line3D + {$ENDIF} {$IFDEF MATCAP} @@ -825,6 +919,10 @@ procedure TGPUVolume.SetMatCap(lFilename: string); +#10'uniform float clipThick = 1.0;' +#10'uniform int overlays = 0;' +#10'uniform float backAlpha = 0.5;' ++#10'uniform mat4 ModelViewProjectionMatrix;' ++#10'void setDepthBuffer(vec3 pos) {' ++#10' gl_FragDepth = ((ModelViewProjectionMatrix * vec4(pos, 1.0)).z + 1.0) * 0.5;' ++#10'}' +#10'vec3 GetBackPosition (vec3 startPosition) {' +#10' vec3 invR = 1.0 / rayDir;' +#10' vec3 tbot = invR * (vec3(0.0)-startPosition);' @@ -1098,6 +1196,7 @@ procedure TGPUVolume.SetMatCap(lFilename: string); +#10' FragColor = colAcc;' +#10'}'; +{$IFNDEF DEPTHPICKER2} kFragDepth = kFragFaster +#10'uniform float ambient = 1.0;' +#10'uniform float diffuse = 0.3;' @@ -1199,6 +1298,7 @@ procedure TGPUVolume.SetMatCap(lFilename: string); +#10' } //while samplePos.a < len' +#10' FragColor = colAcc;' +#10'}'; +{$ENDIF} //DepthPicker2 does not need a custom shader {$ELSE} kFragBase = '#version 120' +#10'varying vec3 TexCoord1;' @@ -1212,6 +1312,10 @@ procedure TGPUVolume.SetMatCap(lFilename: string); +#10'uniform int overlays = 0;' +#10'uniform float backAlpha = 0.5;' +#10'uniform vec3 textureSz = vec3(3.0, 2.0, 1.0);' ++#10'uniform mat4 ModelViewProjectionMatrix;' ++#10'void setDepthBuffer(vec3 pos) {' ++#10' gl_FragDepth = ((ModelViewProjectionMatrix * vec4(pos, 1.0)).z + 1.0) * 0.5;' ++#10'}' +#10'vec3 GetBackPosition (vec3 startPosition) {' +#10' vec3 invR = 1.0 / rayDir;' +#10' vec3 tbot = invR * (vec3(0.0)-startPosition);' @@ -1381,6 +1485,7 @@ procedure TGPUVolume.SetMatCap(lFilename: string); +#10' #endif' +#10'}'; +{$IFNDEF DEPTHPICKER2} kFragDepth = kFragFaster +#10'uniform float overlayClip = 0.0;' +#10'void main() {' @@ -1441,6 +1546,7 @@ procedure TGPUVolume.SetMatCap(lFilename: string); +#10' } //while samplePos.a < len' +#10' gl_FragColor = colAcc;' +#10'}'; +{$ENDIF}//not required for depthpicker2 {$ENDIF} procedure TGPUVolume.SetShader(shaderName: string); var @@ -1561,24 +1667,15 @@ procedure TGPUVolume.Prepare(shaderName: string); programLine2D := initVertFrag(kVertLine2D,kFragLine2D); //glUseProgram(programLine2D); uniform_viewportSizeLine := glGetUniformLocation(programLine2D, pAnsiChar('ViewportSize')); - {$IFDEF DEPTHPICKER}{$IFDEF DEPTHPICKER_USEFRAMEBUFFER} + {$IFDEF LINE3D} + programLine3D := initVertFrag(kVertLine3D,kFragLine3D); + mvpLine3DLoc := glGetUniformLocation(programLine3D, pAnsiChar('ModelViewProjectionMatrix')); + colorLine3DLoc := glGetUniformLocation(programLine3D, pAnsiChar('Color')); {$IFDEF COREGL} - glGenFramebuffers(1, @depthPickerFrameBuffer); - glBindFramebuffer(GL_FRAMEBUFFER, depthPickerFrameBuffer); - {$ELSE} - glGenFramebuffersEXT(1, @depthPickerFrameBuffer); - glBindFramebufferEXT(GL_FRAMEBUFFER, depthPickerFrameBuffer); - {$ENDIF} - glGenTextures(1, @depthPickerTex); - glBindTexture(GL_TEXTURE_2D, depthPickerTex); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); - {$IFDEF COREGL} - glBindFramebuffer(GL_FRAMEBUFFER_EXT, 0); - {$ELSE} - glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0); - {$ENDIF} - {$ENDIF}{$ENDIF} + setlength(gLines3D,6); //3D crosshair is six lines + {$ENDIF} //COREGL + + {$ENDIF} //LINE3D {$IFDEF COREGL} //setup VAO for Tex vboTex2D := 0; @@ -1604,6 +1701,7 @@ procedure TGPUVolume.Prepare(shaderName: string); {$ENDIF} //Depth Program {$IFDEF DEPTHPICKER} + {$IFNDEF DEPTHPICKER2} depthProgram := initVertFrag(kVert, kFragDepth); overlaysLocDepth := glGetUniformLocation(depthProgram, pAnsiChar('overlays')); lightPositionLocDepth := glGetUniformLocation(depthProgram, pAnsiChar('lightPosition')); @@ -1617,6 +1715,7 @@ procedure TGPUVolume.Prepare(shaderName: string); mvpLocDepth := glGetUniformLocation(depthProgram, pAnsiChar('ModelViewProjectionMatrix')); rayDirLocDepth := glGetUniformLocation(depthProgram, pAnsiChar('rayDir')); {$ENDIF} + {$ENDIF} //2D program {$IFDEF FX} fnm := '/Users/chris/fx.glsl'; @@ -1659,6 +1758,22 @@ procedure TGPUVolume.Prepare(shaderName: string); glEnableVertexAttribArray(4); glBindBuffer(GL_ARRAY_BUFFER, 0); glBindVertexArray(0); //required, even if we will bind it next + {$IFDEF LINE3D} + //setup VAO for lines + vboLine3D := 0; + vaoLine3D := 0; + glGenVertexArrays(1, @vaoLine3D); + glGenBuffers(1, @vboLine3D); + // Prepare vertrex array object (VAO) + glBindVertexArray(vaoLine3D); + glBindBuffer(GL_ARRAY_BUFFER, vboLine3D); + //Vertices + glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(TVec3), PChar(0)); + glEnableVertexAttribArray(0); + glBindBuffer(GL_ARRAY_BUFFER, 0); + glBindVertexArray(0); //required, even if we will bind it next + + {$ENDIF}//LINE3D {$ELSE} dlLine2D := 0; {$ENDIF} @@ -2671,8 +2786,6 @@ procedure TGPUVolume.Paint2D(var vol: TNIfTI; Drawing: TDraw; DisplayOrient: int end; {$ENDIF} - - procedure TGPUVolume.Paint(var vol: TNIfTI); var widthHeightLeft: TVec3i; @@ -2683,31 +2796,62 @@ procedure TGPUVolume.Paint(var vol: TNIfTI); PaintCore(vol, widthHeightLeft); end; +{$IFDEF DEPTHPICKER2} +procedure TGPUVolume.PaintDepth(var vol: TNIfTI; isAxCorSagOrient4: boolean = false); +var + widthHeightLeft: TVec3i; +begin + widthHeightLeft.x := glControl.clientwidth; + widthHeightLeft.y := glControl.clientheight; + widthHeightLeft.z := 0; + if isAxCorSagOrient4 then + widthHeightLeft := slices2D.axCorSagOrient4XY; + PaintCore(vol, widthHeightLeft, false, false); +end; + +{$ELSE} procedure TGPUVolume.PaintDepth(var vol: TNIfTI; isAxCorSagOrient4: boolean = false); var widthHeightLeft: TVec3i; begin widthHeightLeft.x := glControl.clientwidth; widthHeightLeft.y := glControl.clientheight; - {$IFDEF DEPTHPICKER_USEFRAMEBUFFER} - {$IFDEF COREGL} - glBindFramebuffer(GL_FRAMEBUFFER, depthPickerFrameBuffer); - {$ELSE} - glBindFramebufferEXT(GL_FRAMEBUFFER, depthPickerFrameBuffer); - {$ENDIF} - glBindTexture(GL_TEXTURE_2D, depthPickerTex); - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, widthHeightLeft.x, widthHeightLeft.y, 0, GL_RGBA, GL_UNSIGNED_BYTE, NIL); - {$IFDEF COREGL} - glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, depthPickerTex, 0); - {$ELSE} - glFramebufferTexture2DExt(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, depthPickerTex, 0); - {$ENDIF} - {$ENDIF} widthHeightLeft.z := 0; if isAxCorSagOrient4 then widthHeightLeft := slices2D.axCorSagOrient4XY; PaintCore(vol, widthHeightLeft, false, true); end; +{$ENDIF} + +//def __drawCursor(self): +// """Draws three lines at the current +procedure TGPUVolume.PaintCrosshair3D(rgba: TVec4); +begin + glUniform4f(colorLine3DLoc, rgba.r, rgba.g, rgba.b, rgba.a); + {$IFDEF COREGL} + gLines3D[0] := Vec3(slices2D.sliceFrac.x, slices2D.sliceFrac.y, -0.1); + gLines3D[1] := Vec3(slices2D.sliceFrac.x, slices2D.sliceFrac.y, 1.1); + gLines3D[2] := Vec3(slices2D.sliceFrac.x, -0.1, slices2D.sliceFrac.z); + gLines3D[3] := Vec3(slices2D.sliceFrac.x, 1.1, slices2D.sliceFrac.z); + gLines3D[4] := Vec3(-0.1, slices2D.sliceFrac.y, slices2D.sliceFrac.z); + gLines3D[5] := Vec3(1.1, slices2D.sliceFrac.y, slices2D.sliceFrac.z); + glBindBuffer(GL_ARRAY_BUFFER, vboLine3D); + glBufferData(GL_ARRAY_BUFFER, 6*SizeOf(TVec3), @gLines3D[0], GL_STATIC_DRAW); + glBindVertexArray(vaoLine3D); + glDrawArrays(GL_LINES, 0, 6); + glBindVertexArray(0); + {$ELSE} + glLineWidth( slices2D.LineWidth); + glBegin(GL_LINES); + glVertex3f(slices2D.sliceFrac.x, slices2D.sliceFrac.y, -0.1); + glVertex3f(slices2D.sliceFrac.x, slices2D.sliceFrac.y, 1.1); + glVertex3f(slices2D.sliceFrac.x, -0.1, slices2D.sliceFrac.z); + glVertex3f(slices2D.sliceFrac.x, 1.1, slices2D.sliceFrac.z); + glVertex3f(-0.1, slices2D.sliceFrac.y, slices2D.sliceFrac.z); + glVertex3f(1.1, slices2D.sliceFrac.y, slices2D.sliceFrac.z); + glEnd; + {$ENDIF} +end; procedure TGPUVolume.PaintCore(var vol: TNIfTI; widthHeightLeft: TVec3i; clearScreen: boolean = true; isDepthShader: boolean = false); var @@ -2727,10 +2871,42 @@ procedure TGPUVolume.PaintCore(var vol: TNIfTI; widthHeightLeft: TVec3i; clearSc LoadTexture(vol, false); if (intensityTexture3D = 0) then exit; - {$IFDEF DEPTHPICKER} + {$IFDEF MTX} + modelMatrix := fModelMatrix; + {$ELSE} + modelMatrix := TMat4.Identity; + modelMatrix *= TMat4.Translate(0, 0, -fDistance); + modelMatrix *= TMat4.RotateX(-DegToRad(90-fElevation)); + modelMatrix *= TMat4.RotateZ(DegToRad(fAzimuth)); + modelMatrix *= TMat4.RotateX(DegToRad(fPitch)); + {$ENDIF} + modelMatrix *= TMat4.Translate(-vol.Scale.X/2, -vol.Scale.Y/2, -vol.Scale.Z/2); + modelLightPos := (modelMatrix.Transpose * fLightPos); + modelLightPos := modelLightPos.Normalize; + modelMatrix *= TMat4.Scale(vol.Scale.X, vol.Scale.Y, vol.Scale.Z); //for volumes that are rectangular not square + if fDistance = 0 then + scale := 1 + else + scale := 0.5 * 1/abs(kDefaultDistance/(fDistance+1.0)); + glViewport(widthHeightLeft.z, 0, widthHeightLeft.x, widthHeightLeft.y); + whratio := widthHeightLeft.x /widthHeightLeft.y; + if (whratio > 1) or (whratio = 0) then //Wide window + projectionMatrix := TMat4.OrthoGL (-scale * whratio, scale * whratio, -scale, scale, fDistance-1, fDistance+1) + else + projectionMatrix := TMat4.OrthoGL (-scale, scale, -scale/whratio, scale/whratio, fDistance-1, fDistance+1); + modelViewProjectionMatrix := ( projectionMatrix * modelMatrix); + {$IFDEF DEPTHPICKER2} + //widthHeightLeftX: TVec3i; + mvp := modelViewProjectionMatrix; + viewportXYWH := vec4(widthHeightLeft.z, 0, widthHeightLeft.x, widthHeightLeft.y); + //printf(format('viewport %g %g %g %g', [viewportXYWH.x, viewportXYWH.y, viewportXYWH.z, viewportXYWH.w])); + //viewportXYWH: TVec4; + {$ENDIF} + glEnable(GL_DEPTH_TEST); + {$IFDEF DEPTHPICKER} {$IFNDEF DEPTHPICKER2} if isDepthShader then glUseProgram(depthProgram) - else {$ENDIF} begin + else {$ENDIF}{$ENDIF} begin if Quality1to5 = kQualityBest then glUseProgram(programRaycastBetter) else @@ -2767,32 +2943,6 @@ procedure TGPUVolume.PaintCore(var vol: TNIfTI; widthHeightLeft: TVec3i; clearSc glBindTexture(GL_TEXTURE_3D, overlayGradientTexture3D); //glUniform1i(loopsLoc,round(maxDim*2.2)); //glUniform3f(clearColorLoc, fClearColor.r/255, fClearColor.g/255, fClearColor.b/255); - {$IFDEF MTX} - modelMatrix := fModelMatrix; - {$ELSE} - modelMatrix := TMat4.Identity; - modelMatrix *= TMat4.Translate(0, 0, -fDistance); - modelMatrix *= TMat4.RotateX(-DegToRad(90-fElevation)); - modelMatrix *= TMat4.RotateZ(DegToRad(fAzimuth)); - modelMatrix *= TMat4.RotateX(DegToRad(fPitch)); - {$ENDIF} - modelMatrix *= TMat4.Translate(-vol.Scale.X/2, -vol.Scale.Y/2, -vol.Scale.Z/2); - modelLightPos := (modelMatrix.Transpose * fLightPos); - modelLightPos := modelLightPos.Normalize; - modelMatrix *= TMat4.Scale(vol.Scale.X, vol.Scale.Y, vol.Scale.Z); //for volumes that are rectangular not square - if fDistance = 0 then - scale := 1 - else - scale := 0.5 * 1/abs(kDefaultDistance/(fDistance+1.0)); - glViewport(widthHeightLeft.z, 0, widthHeightLeft.x, widthHeightLeft.y); - //writeln(format('OKRA>%d %d %d', [widthHeightLeft.x, widthHeightLeft.y, widthHeightLeft.z])); //okra - whratio := widthHeightLeft.x /widthHeightLeft.y; - //whratio := glControl.clientwidth /glControl.clientheight; - if (whratio > 1) or (whratio = 0) then //Wide window - projectionMatrix := TMat4.OrthoGL (-scale * whratio, scale * whratio, -scale, scale, fDistance-1, fDistance+1) - else - projectionMatrix := TMat4.OrthoGL (-scale, scale, -scale/whratio, scale/whratio, fDistance-1, fDistance+1); - modelViewProjectionMatrix := ( projectionMatrix * modelMatrix); rayDir.x := 0; RayDir.y := 0; rayDir.z := 1; RayDir.w := 0; v := rayDir; rayDir := (modelViewProjectionMatrix.Inverse * v); @@ -2802,7 +2952,7 @@ procedure TGPUVolume.PaintCore(var vol: TNIfTI; widthHeightLeft: TVec3i; clearSc //printf(format('%g %g %g', [vol.Scale.X, vol.Scale.Y, vol.Scale.Z])); //printMat(modelMatrix); //printf(format('a %d e %d = [%g %g %g]', [fAzimuth, fElevation, rayDir.x, rayDir.y, rayDir.z])); - {$IFDEF DEPTHPICKER} if isDepthShader then begin + {$IFDEF DEPTHPICKER}{$IFNDEF DEPTHPICKER2} if isDepthShader then begin glUniform1i(intensityVolLocDepth, 2); glUniform1i(overlaysLocDepth, overlayNum); //0 if no overlays glUniform1i(overlayIntensityVolLocDepth, 4); @@ -2816,7 +2966,7 @@ procedure TGPUVolume.PaintCore(var vol: TNIfTI; widthHeightLeft: TVec3i; clearSc {$ENDIF} glUniformMatrix4fv(mvpLocDepth, 1, GL_FALSE, @modelViewProjectionMatrix); glUniform3f(rayDirLocDepth,rayDir.x,rayDir.y,rayDir.z); - end else {$ENDIF} begin + end else {$ENDIF}{$ENDIF} begin glUniform1i(intensityVolLoc, 2); //bind background gradient (edges) glActiveTexture(GL_TEXTURE3); @@ -2886,8 +3036,23 @@ procedure TGPUVolume.PaintCore(var vol: TNIfTI; widthHeightLeft: TVec3i; clearSc //Legacy OpenGL glCallList(dlBox3D); {$ENDIF} - glDisable(GL_CULL_FACE); //draw color editor + {$IFDEF VIEW2D}{$IFDEF LINE3D} + if ((not isDepthShader) and (widthHeightLeft.z <> 0) and (slices2D.LineWidth > 0.0)) then begin + glUseProgram(programLine3D); + glUniformMatrix4fv(mvpLine3DLoc, 1, GL_FALSE, @modelViewProjectionMatrix); + + glEnable(GL_DEPTH_TEST); + glDepthFunc(GL_LEQUAL); //GL_LESS); + //draw opaque line occluded by volume render + PaintCrosshair3D( slices2D.LineColor); + glDisable(GL_DEPTH_TEST); + //draw translucent line regardless of volume render + PaintCrosshair3D(Vec4(slices2D.LineColor.r,slices2D.LineColor.g,slices2D.LineColor.b,slices2D.LineColor.a * 0.225)); + //glDepthFunc(GL_ALWAYS); //always pass test + end; + {$ENDIF}{$ENDIF} //IFDEF VIEW2D, LINE3D + glDisable(GL_CULL_FACE); {$IFDEF CLRBAR} if (colorEditorVisible) and (widthHeightLeft.z = 0) then begin clrbar.RulerPixels:= 0; diff --git a/mainunit.lfm b/mainunit.lfm index 4342ed7..8ef86ae 100755 --- a/mainunit.lfm +++ b/mainunit.lfm @@ -1,7 +1,7 @@ object GLForm1: TGLForm1 - Left = 364 + Left = 343 Height = 662 - Top = 56 + Top = 156 Width = 916 AllowDropFiles = True Caption = 'MRIcroGL' diff --git a/mainunit.pas b/mainunit.pas index 8be2c5f..a87509a 100755 --- a/mainunit.pas +++ b/mainunit.pas @@ -77,9 +77,9 @@ interface const {$IFDEF FASTGZ} - kVers = '1.2.20210801'; + kVers = '1.2.20210816'; {$ELSE} - kVers = '1.2.20210801-'; + kVers = '1.2.20210816+'; {$ENDIF} type @@ -670,7 +670,9 @@ implementation uses {$IFDEF GRAPH}glgraph,{$ENDIF} {$IFDEF COREGL}glcorearb,{$ELSE}gl,glext,{$ENDIF} - {$IFDEF LCLCocoa}glcocoanscontext,{$ENDIF}{$IFDEF CLRBAR}glclrbar, {$ENDIF} retinahelper, OpenGLContext, glvolume2, gl_core_utils {$IFDEF MYPY}{$IFDEF PY4LAZ}{$IFNDEF UNIX}, proc_py {$ENDIF}{$ENDIF}{$ENDIF}; + {$IFDEF LCLCocoa}glcocoanscontext,{$ENDIF}{$IFDEF CLRBAR}glclrbar, {$ENDIF} + {$IFDEF RETINA}retinahelper,{$ENDIF} + OpenGLContext, glvolume2, gl_core_utils {$IFDEF MYPY}{$IFDEF PY4LAZ}{$IFNDEF UNIX}, proc_py {$ENDIF}{$ENDIF}{$ENDIF}; const kExt = '.glsl'; {$ENDIF} const @@ -1072,7 +1074,6 @@ procedure TGLForm1.DrawIntensityFilterMenuClick(Sender: TObject); procedure TGLForm1.FormChangeBounds(Sender: TObject); begin - //LayerBox.Caption := inttostr(random(888)); {$IFDEF LCLCocoa} {$IFNDEF METALAPI} ViewGPU1.Invalidate; {$ENDIF}{$ENDIF} @@ -2876,6 +2877,7 @@ function PyLINECOLOR(Self, Args : PPyObject): PPyObject; cdecl; if Boolean(PyArg_ParseTuple(Args, 'iii:linecolor', @R,@G,@B)) then begin clr := Vol1.Slices.LineColor; clr := Vec4(R/255.0, G/255.0, B/255.0, clr.a); + //gPrefs.LineColor := clr; Vol1.Slices.LineColor := clr; gClrbar.RulerColor := SetRGBA(Vol1.Slices.LineColor); GLFOrm1.RulerVisible(); @@ -4360,6 +4362,10 @@ procedure TGLForm1.LineColorBtnClick(Sender: TObject); clr *= 255; ColorDialog1.Color:= RGBToColor(round(clr.r), round(clr.g), round(clr.b)); if not ColorDialog1.Execute then exit; + gPrefs.LineColor.R := Red(ColorDialog1.Color); + gPrefs.LineColor.G := Green(ColorDialog1.Color); + gPrefs.LineColor.B := Blue(ColorDialog1.Color); + clr := Vec4(Red(ColorDialog1.Color)/255.0, Green(ColorDialog1.Color)/255.0, Blue(ColorDialog1.Color)/255.0, clr.a/255.0); Vol1.Slices.LineColor := clr; {$IFDEF CLRBAR} @@ -5211,7 +5217,8 @@ procedure TGLForm1.HelpPrefMenuClick(Sender: TObject); LandmarkCheck.Parent:=PrefForm; {$IFDEF LCLCocoa} //Retina Check - RetinaCheck:=TCheckBox.create(PrefForm); + RetinaCheck :=TCheckBox.create(PrefForm); + {$IFNDEF RETINA} RetinaCheck.Enabled := false;{$ENDIF} RetinaCheck.Checked := gPrefs.RetinaDisplay; RetinaCheck.Caption:='Retina display (better but slower)'; RetinaCheck.AnchorSide[akTop].Side := asrBottom; @@ -7363,15 +7370,15 @@ procedure TGLForm1.ResetDefaultsClick(Sender: TObject); {$ENDIF} if (Sender <> nil) and (ssShift in ss) then begin LineWidthEdit.value := 1; - gPrefs.DisplayOrient := kRenderOrient; - gPrefs.LineWidth := 1; - Vol1.Slices.LineWidth := 1; - Vol1.Slices.LineColor := Vec4(0.5, 0.5, 0.7, 1.0); + //gPrefs.DisplayOrient := kRenderOrient; + //gPrefs.LineWidth := 1; {$IFDEF CLRBAR} gClrbar.RulerColor := SetRGBA(Vol1.Slices.LineColor); {$ENDIF} RulerVisible(); SetDefaultPrefs(gPrefs,true); + Vol1.Slices.LineColor := Vec4(gPrefs.LineColor.R/255.0, gPrefs.LineColor.G/255.0, gPrefs.LineColor.B/255.0, gPrefs.LineColor.A/255.0); + Vol1.Slices.LineWidth := gPrefs.LineWidth; UpdateOpenRecent(); end; UpdateVisibleBoxes(); @@ -7723,7 +7730,9 @@ function ScreenShotGL(GLBox : TOpenGLControl): TBitmap; setlength(p, w4 * h); for TileH := 0 to (nTileH-1) do begin for TileW := 0 to (nTileW-1) do begin + {$IFDEF RETINA} GLBox.enableTiledScreenShot(-TileW*w, -h*TileH,wOut, hOut); //tileLeft, tileBottom,totalWidth, totalHeight + {$ENDIF} GLForm1.ViewGPUPaint(nil); glFlush; glFinish;//<-this would pause until all jobs finished: generally a bad idea! required here @@ -7778,7 +7787,9 @@ function ScreenShotGL(GLBox : TOpenGLControl): TBitmap; DestPtr[z] := DestPtr[z] and $FFFFFF00; end; {$ENDIF} + {$IFDEF RETINA} GLBox.disableTiledScreenShot(); + {$ENDIF} GLbox.ReleaseContext; Vol1.Quality1to5 := q; setlength(p, 0); @@ -7946,7 +7957,6 @@ procedure TGLForm1.AnimateTimerTimer(Sender: TObject); if i >= 0 then begin vols.Layer(i,v); v.SetDisplayVolume(v.VolumeDisplayed + 1); - //LayerBox.caption := format('%d %d/%d ',[i,v.VolumeDisplayed+1, v.VolumesTotal]); //+1 as indexed from 1 UpdateLayerBox(false, true);// e.g. "fMRI (1/60)" -> "fMRI (2/60" //UpdateTimer.Enabled := true; UpdateTimerTimer(Sender); @@ -7975,7 +7985,6 @@ function TGLForm1.DisplayNextMenuClick(Sender: TObject): boolean; v.SetDisplayVolume(v.VolumeDisplayed + 1) else v.SetDisplayVolume(v.VolumeDisplayed - 1); - //LayerBox.caption := format('%d %d/%d ',[i,v.VolumeDisplayed+1, v.VolumesTotal]); //+1 as indexed from 1 UpdateLayerBox(false, true); //UpdateLayerBox(true);// e.g. "fMRI (1/60)" -> "fMRI (2/60" UpdateTimer.Enabled := true; @@ -8003,7 +8012,6 @@ function TGLForm1.DisplayNextMenuClick(Sender: TObject): boolean; v.SetDisplayVolume(v.VolumeDisplayed + 1) else v.SetDisplayVolume(v.VolumeDisplayed - 1); - //LayerBox.caption := format('%d %d/%d ',[i,v.VolumeDisplayed+1, v.VolumesTotal]); //+1 as indexed from 1 UpdateLayerBox(false, true); //UpdateLayerBox(true);// e.g. "fMRI (1/60)" -> "fMRI (2/60" UpdateTimer.Enabled := true; @@ -8677,9 +8685,9 @@ function versionStr: string; w := w + NSProcessInfo.ProcessInfo.operatingSystemVersionString.UTF8String+' '+HWmodel+kEOLN; - {$IFNDEF METALAPI} + {$IFNDEF METALAPI}{$IFDEF RETINA} w := w + format('Retina Scale: %g', [ViewGPU1.retinaScale])+kEOLN; - {$ENDIF} + {$ENDIF}{$ENDIF} {$ENDIF} {$IFDEF Linux} w := w + 'Linux'+kEOLN; @@ -8721,7 +8729,7 @@ procedure TGLForm1.AboutMenuClick(Sender: TObject); v := v+'Apple Metal multisample=' + inttostr(ViewGPU1.renderView.sampleCount); {$ELSE} ViewGPU1.MakeCurrent(false); - {$IFDEF MYPY}{$IFDEF PY4LAZ}v := v + 'PythonForLazarus' + kEOLN;{$ELSE}v := v+ 'PythonBridge ' + kEOLN;{$ENDIF}{$ENDIF} + //{$IFDEF MYPY}{$IFDEF PY4LAZ}v := v + 'PythonForLazarus' + kEOLN;{$ELSE}v := v+ 'PythonBridge ' + kEOLN;{$ENDIF}{$ENDIF} v := v + glGetString(GL_VENDOR)+'; OpenGL= '+glGetString(GL_VERSION)+'; Shader='+glGetString(GL_SHADING_LANGUAGE_VERSION); glGetIntegerv(GL_MAX_3D_TEXTURE_SIZE, @maxVox); //For 3D textures, no dimension can be greater than GL_MAX_3D_TEXTURE_SIZ {$IFDEF COREGL} @@ -8830,6 +8838,45 @@ procedure TGLForm1.SaveColorTable; CFRelease(colorSpace); end; *) {$ENDIF}{$ENDIF} +{$IFDEF DEPTHPICKER2} +procedure TGLForm1.PickRenderDepth( X, Y: Integer); +var + c3: TVec3; + niftiVol: TNIfTI; + depth: single; +begin + if not vols.Layer(0,niftiVol) then exit; + glDrawBuffer(GL_BACK); + Vol1.PaintDepth(niftiVol, gPrefs.DisplayOrient = kAxCorSagOrient4); + glFinish; + glReadBuffer(GL_BACK); + glReadPixels( X, Y, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, @depth); + c3 := Vol1.Unproject(X,Y, depth); + //Vol1.PaintDepth(niftiVol, gPrefs.DisplayOrient = kAxCorSagOrient4); + //Vol1.PaintDepth(niftiVol, false); + //LineBox.caption := format('xyz %0.3g %0.3g %0.3g len %g', [c3.X, c3.Y, c3.Z, c3.Length]); + if (min(c3.X, min(c3.Y, c3.z)) < 0.0) or (max(c3.X, max(c3.Y, c3.z)) > 1.0) then begin + //Caption := ''; + exit; + end; + gSliceMM := niftiVol.FracMM(Vec3(c3.X, c3.Y, c3.Z)); + Caption := format('%0.4g×%0.4g×%0.4g', [gSliceMM.x, gSliceMM.y, gSliceMM.z]); + vol1.SetSlice2DFrac(Vec3(c3.X, c3.Y, c3.Z)); + //gSliceMM := Vec3(sliceMM.X, sliceMM.Y, sliceMM.Z); + {$IFDEF COMPILEYOKE} + SetShareFloats2D(gSliceMM.X,gSliceMM.Y,gSliceMM.Z); + {$ENDIF} + //if (gPrefs.DisplayOrient = kAxCorSagOrient4) then + ViewGPU1.Invalidate + //else + // Vol1.Paint(niftiVol); + {$IFDEF METALAPI} + UpdateTimer.Enabled := true;//OKRA + {$ENDIF} + //ViewGPU1.Invalidate; +end; + +{$ELSE} procedure TGLForm1.PickRenderDepth( X, Y: Integer); {$IFDEF DEPTHPICKER} var @@ -8837,23 +8884,35 @@ procedure TGLForm1.PickRenderDepth( X, Y: Integer); sum: single; sliceMM : TVec3; niftiVol: TNIfTI; - u: uint32; + //u: uint32; + depth: single; begin if not vols.Layer(0,niftiVol) then exit; {$IFNDEF METALAPI} glDrawBuffer(GL_BACK); {$ENDIF} - + glReadPixels( X, Y, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, @depth); + + Vol1.Unproject(X,Y, depth); + //https://www.khronos.org/opengl/wiki/Compute_eye_space_from_window_space + //https://community.khronos.org/t/depth-buffer-how-do-i-get-the-pixels-z-coord/35318/3 + //https://stackoverflow.com/questions/30340558/how-to-get-object-coordinates-from-screen-coordinates + //glm::vec3 result = glm::unProject(a, viewMatrix, proj, viewport); + //https://community.khronos.org/t/converting-gl-fragcoord-to-model-space/57397 + (*vec4 v = vec4(2.0*(gl_FragCoord.x-view.x)/view.z-1.0, + 2.0*(gl_FragCoord.y-view.y)/view.w-1.0, + 2.0*texture2DRect(DepthTex,gl_FragCoord.xy).z-1.0, + 1.0 ); +v = gl_ModelViewProjectionMatrixInverse * v; +v /= v.w;*) Vol1.PaintDepth(niftiVol, gPrefs.DisplayOrient = kAxCorSagOrient4); {$IFDEF METALAPI} //ViewGPU1.Invalidate; //xxx //todo - //LayerBox.caption := format('%0.2g %0.2g %0.2g %0.2g', [c.X, c.Y, c.Z, c.A]); c := Vec4(0.5, 0.5, 0.5, 0.5); u := Vol1.ReadPixel(X,Y); c := Vec4(((u shr 16) and $FF) / 255, ((u shr 8) and $FF) / 255, ((u shr 0) and $FF) / 255, ((u shr 24) and $FF) / 255); - layerBox.Caption := format('%d %d %g %g %g', [X, Y, c.x * 255, c.y * 255, c.z * 255]); //https://stackoverflow.com/questions/28424883/ios-metal-how-to-read-from-the-depth-buffer-at-a-point {$ELSE} //https://learnopengl.com/Advanced-OpenGL/Framebuffers @@ -8869,6 +8928,7 @@ procedure TGLForm1.PickRenderDepth( X, Y: Integer); glBindFramebufferExt(GL_FRAMEBUFFER, 0); {$ENDIF} {$ENDIF} + LayerBox.caption := format('%0.3g %0.3g %0.3g', [c.X, c.Y, c.Z]); sliceMM := niftiVol.FracMM(Vec3(c.X, c.Y, c.Z)); sum := c.r + c.g + c.b; //a click outside the rendering will return background color. No good solution... if (sum < 0.001) or (sum > 2.99) then begin @@ -8894,7 +8954,9 @@ procedure TGLForm1.PickRenderDepth( X, Y: Integer); // {$ENDIF} end; - +{$ENDIF} +var + gAxCorSagOrient4MouseDownOrient: integer = 222; procedure TGLForm1.ViewGPUMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); @@ -8902,7 +8964,7 @@ procedure TGLForm1.ViewGPUMouseDown(Sender: TObject; Button: TMouseButton; niftiVol: TNIfTI; xIn, yIn, i: integer; //{$IFDEF isCocoaOpenGL} - f: single; + f: single = 1.0; //{$ENDIF} Yrev :integer; fracXYZ: TVec3; @@ -8914,8 +8976,9 @@ procedure TGLForm1.ViewGPUMouseDown(Sender: TObject; Button: TMouseButton; Vol1.Slices.distanceLineOrient := 0; Yrev := ViewGPU1.ClientHeight - Y; {$IFDEF isCocoaOpenGL} - //LayerBox.Caption := inttostr(random(222)); + {$IFDEF RETINA} f := ViewGPU1.retinaScale; + {$ENDIF} X := round(X * f); Y := round(Y * f); Yrev := ViewGPU1.ClientHeight - Y; @@ -8960,8 +9023,11 @@ procedure TGLForm1.ViewGPUMouseDown(Sender: TObject; Button: TMouseButton; if ssAlt in Shift then Vol1.Slices.distanceLineOrient := -1; // xxx if (gPrefs.DisplayOrient = kAxCorSagOrient4) then begin Vol1.SetSlice2DFrac(Vol1.GetSlice2DFrac(X,Y,i)); // + //LineBox.caption := inttostr(i); + gAxCorSagOrient4MouseDownOrient := i; if (i < 0) and (gPrefs.RenderDepthPicker) then begin - {$IFDEF METALAPI} + if (ssShift in Shift) then exit; + {$IFDEF METALAPI} {TODO f := Vol1.DrawableWidth(); if (f > 0) and (ViewGPU1.width > 0) then @@ -8972,9 +9038,8 @@ procedure TGLForm1.ViewGPUMouseDown(Sender: TObject; Button: TMouseButton; {$ELSE} PickRenderDepth(X,Yrev); {$ENDIF} - //LayerBox.Caption := inttostr(random(888)); exit; - end; //okra + end; end; ViewGPUMouseMove(Sender, Shift, xIn,Yin); if (ssShift in Shift) or (ssRight in Shift) then @@ -8985,12 +9050,14 @@ procedure TGLForm1.ViewGPUMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); {$IFDEF isCocoaOpenGL} var - f: single; + f: single = 1.0; {$ENDIF} begin {$IFDEF isCocoaOpenGL} gIsMouseDown := false; + {$IFDEF RETINA} f := ViewGPU1.retinaScale; + {$ENDIF} X := round(X * f); Y := round(Y * f); {$ENDIF} @@ -9023,16 +9090,15 @@ procedure TGLForm1.ViewGPUMouseMove(Sender: TObject; Shift: TShiftState; X, label 222; var - fracXYZdown, fracXYZ, diff: TVec3; + fracXYZdown, fracXYZ, diff, frac: TVec3; i, j: integer; niftiVol: TNIfTI; {$IFDEF LCLCocoa}{$IFNDEF METALAPI} - f:single; + f:single = 1.0; {$ENDIF}{$ENDIF} begin - //LayerBox.Caption := inttostr(random(888)); //On OpenGL MacOS 10.13.6 no MouseMove generated when shift is down! {$IFDEF LCLCocoa}{$IFNDEF METALAPI} - f := ViewGPU1.retinaScale; + {$IFDEF RETINA} f := ViewGPU1.retinaScale;{$ENDIF} X := round(X * f); Y := round(Y * f); {$ENDIF}{$ENDIF} @@ -9058,7 +9124,6 @@ procedure TGLForm1.ViewGPUMouseMove(Sender: TObject; Shift: TShiftState; X, if (X > gMouseLimitHi.X) then X := gMouseLimitHi.X; if (Y > gMouseLimitHi.Y) then Y := gMouseLimitHi.Y; fracXYZ := Vol1.GetSlice2DFrac(X,Y,i); - //LayerBox.Caption := format('lo %d %d hi %d %d xy %d %d', [gMouseLimitLo.X, gMouseLimitLo.Y, gMouseLimitHi.X, gMouseLimitHi.Y, X, Y]); //SliceBox.Caption := format('%.2f %.2f %.2f',[fracXYZ.x, fracXYZ.y, fracXYZ.z]); if (fracXYZ.x > 1) or (fracXYZ.x < 0) or (fracXYZ.y > 1) or (fracXYZ.y < 0) or (fracXYZ.z > 1) or (fracXYZ.z < 0) then exit; @@ -9086,8 +9151,14 @@ procedure TGLForm1.ViewGPUMouseMove(Sender: TObject; Shift: TShiftState; X, gMouse.Y := Y; exit; end; - Vol1.SetSlice2DFrac(Vol1.GetSlice2DFrac(X,Y,i)); // - if (i < 0) and (gPrefs.DisplayOrient = kAxCorSagOrient4) then goto 222; //okra + //Vol1.SetSlice2DFrac(Vol1.GetSlice2DFrac(X,Y,i)); // + frac := Vol1.GetSlice2DFrac(X,Y,i); // + if (i < 0) and (i = gAxCorSagOrient4MouseDownOrient) and (gPrefs.DisplayOrient = kAxCorSagOrient4) then goto 222; //okra + if (i <> gAxCorSagOrient4MouseDownOrient) and (gPrefs.DisplayOrient = kAxCorSagOrient4) then exit; + //SliceBox.Caption := format('%d:%d %d,%d',[i, gAxCorSagOrient4MouseDownOrient,x ,y]); + Vol1.SetSlice2DFrac(frac); // + + //if (i < 0) and (gPrefs.DisplayOrient = kAxCorSagOrient4) then goto 222; //okra if (Vol1.Slices.distanceLineOrient < 0) then begin Vol1.Slices.distanceLineOrient:= i; Vol1.Slices.distanceLineStart := Vol1.Slices.SliceFrac; @@ -9191,9 +9262,11 @@ procedure TGLForm1.ViewGPUMouseWheel(Sender: TObject; Shift: TShiftState; isUp: boolean; ss: TShiftState; x,y,orient: integer; - f: single; + f: single = 1.0; begin - f := ViewGPU1.retinaScale; LayerBox.Caption := floattostr(f)+':'+inttostr(random(888)); + {$IFDEF RETINA} + f := ViewGPU1.retinaScale; + {$ENDIF} if gPrefs.DisplayOrient = kMosaicOrient then exit; if gPrefs.DisplayOrient <> kRenderOrient then begin if not vols.Layer(0,niftiVol) then exit; @@ -9215,9 +9288,9 @@ procedure TGLForm1.ViewGPUMouseWheel(Sender: TObject; Shift: TShiftState; orient := gPrefs.DisplayOrient; if (orient = kAxCorSagOrient3) or (orient = kAxCorSagOrient4) then begin f := 1; - {$IFDEF LCLCocoa}{$IFNDEF METALAPI} + {$IFDEF LCLCocoa}{$IFNDEF METALAPI} {$IFDEF RETINA} f := ViewGPU1.retinaScale; - {$ENDIF}{$ENDIF} + {$ENDIF}{$ENDIF}{$ENDIF} X := round(MousePos.X * f); Y := round(MousePos.Y * f); Vol1.GetSlice2DFrac(X,Y,orient); @@ -9381,7 +9454,11 @@ procedure TGLForm1.FormCreate(Sender: TObject); ViewGPU1.OpenGLMajorVersion:= 2; ViewGPU1.OpenGLMinorVersion:= 1; {$ENDIF} + {$IFDEF LINE3D} + ViewGPU1.DepthBits:= 24; + {$ELSE} ViewGPU1.DepthBits:= 0; + {$ENDIF} Vol1 := TGPUVolume.Create(ViewGPU1); {$ENDIF} end; @@ -9578,9 +9655,9 @@ procedure TGLForm1.FormShow(Sender: TObject); //for Metal, Must be done at FormCreate, not FormShow! Vol1 := TGPUVolume.Create(ViewGPU1); //Vol1.Slices.RadiologicalConvention := gPrefs.FlipLR_Radiological; {$IFNDEF METALAPI} - {$IFDEF LCLCocoa} + {$IFDEF LCLCocoa}{$IFDEF RETINA} ViewGPU1.setRetina(gPrefs.RetinaDisplay); - {$ENDIF} + {$ENDIF}{$ENDIF} ViewGPU1.MakeCurrent(false); {$IFDEF COREGL} if (not Load_GL_version_3_3_CORE) then begin @@ -9781,6 +9858,7 @@ procedure TGLForm1.ViewGPUPrepare(Sender: TObject); Vol1.Slices.LabelOrient := gPrefs.LabelOrient; Vol1.Quality1to5 := gPrefs.Quality1to5; Vol1.Slices.LineWidth := gPrefs.LineWidth; + Vol1.Slices.LineColor := Vec4(gPrefs.LineColor.R/255.0, gPrefs.LineColor.G/255.0, gPrefs.LineColor.B/255.0, gPrefs.LineColor.A/255.0); LineWidthEdit.Value := gPrefs.LineWidth; end; @@ -9807,7 +9885,6 @@ procedure TGLForm1.LayerAfniDropClick(Sender: TObject); v.SetDisplayVolume(i); UpdateLayerBox(false, true);// e.g. "fMRI (1/60)" -> "fMRI (2/60" UpdateTimer.Enabled := true; - //LayerBox.Caption := inttostr(random(888))+' '+inttostr(i); end; function TGLForm1.HasLabelLayer: boolean; @@ -9983,7 +10060,9 @@ procedure TGLForm1.FormDestroy(Sender: TObject); {$ENDIF} AnimateTimer.Enabled := false; UpdateTimer.Enabled := false; + {$IFDEF GRAPH} gGraph.Destroy; + {$ENDIF} vols.CloseAllLayers; vols.Free; gLandmark.Free; diff --git a/nifti_foreign.pas b/nifti_foreign.pas index a8fcc25..912de6d 100755 --- a/nifti_foreign.pas +++ b/nifti_foreign.pas @@ -5874,6 +5874,67 @@ procedure ParseStr(); mArray.Free; end; //readOSP() +function readDat (var fname: string; var nhdr: TNIFTIhdr; var swapEndian: boolean): boolean; +//https://www.wolfgang-knecht.com/computer-graphics/advanced-volume-rendering/ +//https://www.cg.tuwien.ac.at/courses/Visualisierung/Angaben/Bsp1.html#Volums%20Datensätze +Type + Tbv_header = packed record //Next: BVox Format Header structure + nx, ny, nz: UINT16; + end; // Tbv_header; +var + bhdr : Tbv_header; + lHdrFile: file; + nvox, nvoxswap, FSz : integer; +begin + result := false; + {$I-} + AssignFile(lHdrFile, fname); + FileMode := fmOpenRead; //Set file access to read only + Reset(lHdrFile, 1); + {$I+} + if ioresult <> 0 then begin + NSLog('Error in reading BVox header.'+inttostr(IOResult)); + FileMode := 2; + exit; + end; + FSz := Filesize(lHdrFile); + bhdr.nx := 0; //BlockRead should be out not var: https://fpc-pascal.freepascal.narkive.com/M2rzyAkf/blockread-and-buffers + BlockRead(lHdrFile, bhdr, sizeof(Tbv_header)); + CloseFile(lHdrFile); + swapEndian := false; + nVox := bhdr.nx * bhdr.ny * bhdr.nz * 2; //*2 as 16-bpp + if (nVox + sizeof(Tbv_header) ) <> FSz then begin + swapEndian := true; + bhdr.nx := Swap(bhdr.nx); + bhdr.ny := Swap(bhdr.ny); + bhdr.nz := Swap(bhdr.nz); + nVoxSwap := bhdr.nx * bhdr.ny * bhdr.nz * 2; //*2 as 16-bpp + if (2 * nVoxSwap + sizeof(Tbv_header) ) <> FSz then begin + NSLog(format('Not a valid DAT file: expected filesize of %d or %d bytes (%dx%dx%d)',[nVoxSwap,nVox, bhdr.nx, bhdr.ny, bhdr.nz])); + exit; + end; + + end; + nhdr.dim[0]:=3;//3D + nhdr.dim[1]:=bhdr.nx; + nhdr.dim[2]:=bhdr.ny; + nhdr.dim[3]:=bhdr.nz; + nhdr.dim[4]:=1; + nhdr.pixdim[1]:=1.0; + nhdr.pixdim[2]:=1.0; + nhdr.pixdim[3]:=1.0; + nhdr.datatype := kDT_INT16; + nhdr.vox_offset := sizeof(Tbv_header); + nhdr.sform_code := 1; + //nhdr.srow_x[0]:=nhdr.pixdim[1];nhdr.srow_x[1]:=0.0;nhdr.srow_x[2]:=0.0;nhdr.srow_x[3]:=0.0; + //nhdr.srow_y[0]:=0.0;nhdr.srow_y[1]:=nhdr.pixdim[2];nhdr.srow_y[2]:=0.0;nhdr.srow_y[3]:=0.0; + //nhdr.srow_z[0]:=0.0;nhdr.srow_z[1]:=0.0;nhdr.srow_z[2]:=-nhdr.pixdim[3];nhdr.srow_z[3]:=0.0; + SetSForm(nhdr); + convertForeignToNifti(nhdr); + nhdr.descrip := 'DAT'+kIVers; + result := true; +end; //readDAT + function readForeignHeader(var lFilename: string; var lHdr: TNIFTIhdr; var gzBytes: int64; var swapEndian, isDimPermute2341: boolean; out xDim64: int64): boolean; overload; var lExt, lExt2GZ: string; @@ -5898,6 +5959,8 @@ function readForeignHeader(var lFilename: string; var lHdr: TNIFTIhdr; var gzByt end; if (PosEx('.AIM',lExt) = 1) then result := readAim(lFilename, lHdr, gzBytes, swapEndian) + else if (lExt = '.DAT') then + result := readDat(lFilename, lHdr, swapEndian) else if (lExt = '.DV') then result := readDeltaVision(lFilename, lHdr, swapEndian) else if (lExt = '.V') then diff --git a/opts.inc b/opts.inc index b9dc9c2..a642e5e 100755 --- a/opts.inc +++ b/opts.inc @@ -10,5 +10,7 @@ //{$DEFINE PARALLEL} //for parallel Unix also edit CThreads in LPR file - no benefit if used with DYNRGBA //{$DEFINE DYNRGBA} //{$IFDEF DYNRGBA} {$DEFINE MOSAIC} -{$DEFINE DEPTHPICKER} // +{$DEFINE LINE3D} +{$DEFINE DEPTHPICKER} //use a separate shader +{$DEFINE DEPTHPICKER2} //{$DEFINE NEWPY} //It is suggested to use 2020.07.31 or earlier. This switch is for new versions https://github.com/Alexey-T/Python-for-Lazarus/issues/25 diff --git a/prefs.pas b/prefs.pas index 1d3429b..e3a72fc 100755 --- a/prefs.pas +++ b/prefs.pas @@ -19,7 +19,7 @@ TPrefs = record DebugMode, LoadSmooth, LabelOrient, RulerVisible, ColorbarVisible, Smooth2D, DarkMode, RetinaDisplay, FlipYZ, FlipLR_Radiological, SkipPrefWriting, AutoClusterizeAtlases, RenderDepthPicker: boolean; AfniDir, CustomDcm2niix, PyLib, MosaicStr, InitScript, PrevScript, PrevBackgroundImage, DicomDir: string; - ClearColor: TRGBA; + LineColor, ClearColor: TRGBA; PrevFilename: TMRU; end; @@ -103,6 +103,10 @@ procedure SetDefaultPrefs (var lPrefs: TPrefs; lEverything: boolean); MultiSample124 := 4; VolumeSaveFormat := 1; VoiSaveFormat := 3; + LineColor.R := 128; + LineColor.G := 128; + LineColor.B := 179; + LineColor.A := 255; DisplayOrient:= kAxCorSagOrient3; //kRenderOrient; //DisplayOrient:= kRenderOrient; StartupDisplayOrient := DisplayOrient; @@ -172,7 +176,43 @@ procedure IniBool(lRead: boolean; lIniFile: TIniFile; lIdent: string; var lValu lValue := Char2Bool(lStr[1]); end; //IniBool +const + kStrSep = '|'; + +function RGBAToStr (lU: tRGBA) : string; +begin + result := Inttostr(lU.r)+ kStrSep+Inttostr(lU.g)+ kStrSep+Inttostr(lU.b)+ kStrSep+Inttostr(lU.a); +end; + +function StrToRGBA(lS: string; var lU: TRGBA): boolean; +var + strlst:TStringList; +begin + result := false; + strlst:=TStringList.Create; + strlst.Delimiter:=kStrSep; + strlst.DelimitedText := lS; + if strlst.Count > 3 then begin + lU := SetRGBA( strtoint(strlst[0]), strtoint(strlst[1]), strtoint(strlst[2]), strtoint(strlst[3])) ; + result := true; + end; + strlst.free; +end; +procedure IniRGBA(lRead: boolean; lIniFile: TIniFile; lIdent: string; var lValue: TRGBA); +//read or write an integer value to the initialization file +var + lStr: string; +begin + if not lRead then begin + //lI64 := lValue.rgbred + lValue.rgbGreen shl 8 + lValue.rgbBlue shl 16 + lValue.rgbReserved shl 24; + //lIniFile.WriteString('RGBA',lIdent,InttoStr(lI64)); + lIniFile.WriteString('RGBA255',lIdent,RGBAToStr(lValue)); + exit; + end; + lStr := lIniFile.ReadString('RGBA255',lIdent, ''); + StrToRGBA(lStr,lValue); +end; //IniRGBA procedure IniStr(lRead: boolean; lIniFile: TIniFile; lIdent: string; var lValue: string); //read or write a string value to the initialization file @@ -297,6 +337,8 @@ function IniFile(lRead: boolean; var lPrefs: TPrefs): boolean; IniBool(lRead,lIniFile, 'LandmarkPanel',lPrefs.LandmarkPanel); IniBool(lRead,lIniFile, 'FlipYZ',lPrefs.FlipYZ); IniBool(lRead,lIniFile, 'FlipLR_Radiological',lPrefs.FlipLR_Radiological); + IniRGBA(lRead,lIniFile, 'LineColor',lPrefs.LineColor); + IniBool(lRead,lIniFile, 'AutoClusterizeAtlases', lPrefs.AutoClusterizeAtlases); lIniFile.Free; end; diff --git a/umat.pas b/umat.pas index d409c9a..53c26d2 100644 --- a/umat.pas +++ b/umat.pas @@ -151,6 +151,14 @@ function MinU32(a,b: uint32): uint32; end; +procedure sform2pixdim(var hdr: TNIFTIHdr); +begin //SPM does not save pixdim, so we infer it from the SForm + hdr.pixdim[1] := sqrt(sqr(hdr.srow_x[0])+sqr(hdr.srow_y[0])+sqr(hdr.srow_z[0])); + hdr.pixdim[2] := sqrt(sqr(hdr.srow_x[1])+sqr(hdr.srow_y[1])+sqr(hdr.srow_z[1])); + hdr.pixdim[3] := sqrt(sqr(hdr.srow_x[2])+sqr(hdr.srow_y[2])+sqr(hdr.srow_z[2])); + //writeln(format('%g %g %g', [hdr.pixdim[1], hdr.pixdim[2], hdr.pixdim[3] ])); +end; + function MatLoad(fnm, tagname: string; var strs: TStringList; out hdr: TNIFTIHdr; var img: TUInt8s): boolean; const miCOMPRESSED = 15; @@ -319,6 +327,7 @@ function MatLoad(fnm, tagname: string; var strs: TStringList; out hdr: TNIFTIHdr hdr.srow_y[3] := mat[13]; hdr.srow_z[3] := mat[14]; hdr.sform_code := kNIFTI_XFORM_SCANNER_ANAT; + sform2pixdim(hdr); (*showmessage(format('%g %g %g %g; %g %g %g %g; %g %g %g %g; 0 0 0 1', [lHdr.srow_x[0],lHdr.srow_x[1],lHdr.srow_x[2],lHdr.srow_x[3], lHdr.srow_y[0],lHdr.srow_y[1],lHdr.srow_y[2],lHdr.srow_y[3],