Commit cff46c42 by Mathias Goldau

[REMOVE] Modules: fiberStipples, isoLines as they are now developed inside module repository

parent af65ea0b
//---------------------------------------------------------------------------
//
// Project: OpenWalnut ( http://www.openwalnut.org )
//
// Copyright 2009 OpenWalnut Community, BSV@Uni-Leipzig and CNCF@MPI-CBS
// For more information see http://www.openwalnut.org/copying
//
// This file is part of OpenWalnut.
//
// OpenWalnut is free software: you can redistribute it and/or modify
// it under the terms of the GNU Lesser General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// OpenWalnut is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public License
// along with OpenWalnut. If not, see <http://www.gnu.org/licenses/>.
//
//---------------------------------------------------------------------------
#ifndef WMFIBERSTIPPLES_H
#define WMFIBERSTIPPLES_H
#include <string>
#include "core/kernel/WModule.h"
// forward declarations to reduce compile dependencies
template< class T > class WModuleInputData;
class WDataSetScalar;
class WDataSetVector;
class WGEManagedGroupNode;
/**
* Draws Fiber Stipples on slice in order to visualize probabilistic tractograms.
*
* \note For further information see http://dx.doi.org/10.1109/BioVis.2011.6094044.
*
* \ingroup modules
*/
class WMFiberStipples: public WModule
{
public:
/**
* Default constructor.
*/
WMFiberStipples();
/**
* Destructor.
*/
virtual ~WMFiberStipples();
/**
* Gives back the name of this module.
* \return the module's name.
*/
virtual const std::string getName() const;
/**
* Gives back a description of this module.
* \return description to module.
*/
virtual const std::string getDescription() const;
/**
* Due to the prototype design pattern used to build modules, this method returns a new instance of this method. NOTE: it
* should never be initialized or modified in some other way. A simple new instance is required.
*
* \return the prototype used to create every module in OpenWalnut.
*/
virtual boost::shared_ptr< WModule > factory() const;
/**
* Get the icon for this module in XPM format.
* \return The icon.
*/
virtual const char** getXPMIcon() const;
protected:
/**
* Entry point after loading the module. Runs in separate thread.
*/
virtual void moduleMain();
/**
* Initialize the connectors this module is using.
*/
virtual void connectors();
/**
* Initialize the properties for this module.
*/
virtual void properties();
private:
/**
* Initialize OSG root node for this module. All other nodes from this module should be attached to this root node.
*
* \param probTract Pointer to dataset containing the connectivity scores or probabilities. We need this for two things:
* First, determine the maxium of connectivity scores to, scale the tracts between 0.0...1.0 and secondly to determine the
* boundingbox for the scene. (Furthermore it is assumed that the vectors are also available within this BB.)
*/
void initOSG( boost::shared_ptr< WDataSetScalar > probTract );
/**
* The probabilistic tractogram input connector.
*/
boost::shared_ptr< WModuleInputData< WDataSetScalar > > m_probIC;
/**
* Input connector for the largest eigen vector dataset.
*/
boost::shared_ptr< WModuleInputData< WDataSetVector > > m_vectorIC;
/**
* The OSG root node for this module. All other geodes or OSG nodes will be attached on this single node.
*/
osg::ref_ptr< WGEManagedGroupNode > m_output;
/**
* Controls the slice position, only back and forth will be possible.
*/
WPropDouble m_Pos;
/**
* Color for the fiber stipples.
*/
WPropColor m_color;
/**
* Connectivity scores below that threshold will not be rendered.
*/
WPropDouble m_threshold;
/**
* For scale the thickness of the stipples.
*/
WPropDouble m_glyphThickness;
/**
* For initial slice positioning we need to control if the module is in intial state or not.
*/
bool m_first;
};
#endif // WMFIBERSTIPPLES_H
/* XPM */
static const char * WMFiberStipples_xpm[] = {
"32 32 310 2",
" c #FBFBFB",
". c #FCFCFC",
"+ c #C5C5C5",
"@ c #E4E4E4",
"# c #F3F3F3",
"$ c #FEFEFE",
"% c #FDFDFD",
"& c #2E2E2E",
"* c #474747",
"= c #808080",
"- c #BABABA",
"; c #FFFFFF",
"> c #F8F8F8",
", c #AFAFAF",
"' c #787878",
") c #4C4C4C",
"! c #5C5C5C",
"~ c #929292",
"{ c #D8D8D8",
"] c #E5E5E5",
"^ c #A2A2A2",
"/ c #656565",
"( c #484848",
"_ c #737373",
": c #C9C9C9",
"< c #EBEBEB",
"[ c #BEBEBE",
"} c #717171",
"| c #3E3E3E",
"1 c #4B4B4B",
"2 c #BDBDBD",
"3 c #F1F1F1",
"4 c #DCDCDC",
"5 c #9D9D9D",
"6 c #2A2A2A",
"7 c #2C2C2C",
"8 c #9F9F9F",
"9 c #FAFAFA",
"0 c #EFEFEF",
"a c #ADADAD",
"b c #363636",
"c c #0D0D0D",
"d c #FBFCFC",
"e c #FCFBFB",
"f c #DEDEDE",
"g c #0E0E0E",
"h c #585858",
"i c #C0C0C0",
"j c #FCFAFA",
"k c #FCFDFD",
"l c #757575",
"m c #222222",
"n c #A9A9A9",
"o c #F7F7F7",
"p c #FD9898",
"q c #FD9C9C",
"r c #FD9B9B",
"s c #FDB8B8",
"t c #FCF2F2",
"u c #FBFFFF",
"v c #FDFEFE",
"w c #909090",
"x c #3C3C3C",
"y c #8B8B8B",
"z c #C8C8C8",
"A c #F5F5F5",
"B c #FE3535",
"C c #FE2D2D",
"D c #FE2E2E",
"E c #FE2424",
"F c #FE2C2C",
"G c #FCD1D1",
"H c #FDA0A0",
"I c #FD8B8B",
"J c #FDB3B3",
"K c #FBFEFE",
"L c #FCD2D2",
"M c #FBC8C8",
"N c #FFFCFF",
"O c #FFFDFF",
"P c #FDFEFD",
"Q c #BBBBBB",
"R c #636363",
"S c #6A6A6A",
"T c #C1C1C1",
"U c #FCE3E3",
"V c #FCDCDC",
"W c #FCDDDD",
"X c #FCD6D6",
"Y c #FCBABA",
"Z c #FCD8D8",
"` c #FD6B6B",
" . c #FE3F3F",
".. c #FFA0A6",
"+. c #FF8990",
"@. c #90E7B2",
"#. c #C3F2D6",
"$. c #FBFDFD",
"%. c #CBCBCB",
"&. c #707070",
"*. c #4D4D4D",
"=. c #7D7D7D",
"-. c #F6F6F6",
";. c #FE2828",
">. c #FE5757",
",. c #FCE5E5",
"'. c #FCDEDE",
"). c #FCDFDF",
"!. c #FDF2F3",
"~. c #FEB0B2",
"{. c #78B06F",
"]. c #BACDAC",
"^. c #77AE6D",
"/. c #C1D7BA",
"(. c #FF464E",
"_. c #FDEAEA",
":. c #FEFFFF",
"<. c #CACACA",
"[. c #535353",
"}. c #424242",
"|. c #FE8282",
"1. c #FE5050",
"2. c #FCF7F7",
"3. c #FCD9D9",
"4. c #FE3D3D",
"5. c #FE6363",
"6. c #FDDCDD",
"7. c #FF7075",
"8. c #8BB780",
"9. c #BFC0A2",
"0. c #F30F0A",
"a. c #99E2B2",
"b. c #6F8C47",
"c. c #FBF3F3",
"d. c #E3F8EC",
"e. c #FEFCFE",
"f. c #EAEAEA",
"g. c #939393",
"h. c #1F1F1F",
"i. c #A1A1A1",
"j. c #FCF8F8",
"k. c #FCF6F6",
"l. c #FCDADA",
"m. c #FE5252",
"n. c #FD9595",
"o. c #FEFCFD",
"p. c #99E6B6",
"q. c #B7E1BF",
"r. c #F96E6C",
"s. c #FFE3E5",
"t. c #C7F1D7",
"u. c #99EBBB",
"v. c #88E5AD",
"w. c #50D783",
"x. c #FDFCFD",
"y. c #B7B7B7",
"z. c #2B2B2B",
"A. c #858585",
"B. c #FDBABA",
"C. c #FF5456",
"D. c #84AA6F",
"E. c #AAD4AD",
"F. c #FF5356",
"G. c #70C883",
"H. c #51CF7C",
"I. c #FF2B32",
"J. c #F8AEAC",
"K. c #EBFFF8",
"L. c #C8F1D8",
"M. c #D5F4E1",
"N. c #F3FAF5",
"O. c #E0E0E0",
"P. c #2D2D2D",
"Q. c #6C6C6C",
"R. c #F2F2F2",
"S. c #FCC6C6",
"T. c #FE2626",
"U. c #FF4145",
"V. c #FFB8BC",
"W. c #FFC5C6",
"X. c #DBEDDD",
"Y. c #D3BEA9",
"Z. c #F9B3B1",
"`. c #CBE4CC",
" + c #CDF4DD",
".+ c #3CD375",
"++ c #00C447",
"@+ c #2ACF69",
"#+ c #F5FAF7",
"$+ c #ECECEC",
"%+ c #555555",
"&+ c #4A4A4A",
"*+ c #FCFFFF",
"=+ c #EFFFFF",
"-+ c #E9A69C",
";+ c #FE1717",
">+ c #FFBCBE",
",+ c #F74440",
"'+ c #AD9A73",
")+ c #3CCD70",
"!+ c #C8EFD5",
"~+ c #ACEBC4",
"{+ c #9FE8BB",
"]+ c #B5ECCA",
"^+ c #EAF8EF",
"/+ c #CBF1DA",
"(+ c #FFFCFE",
"_+ c #D3D3D3",
":+ c #EEEEEE",
"<+ c #B1EDC9",
"[+ c #86EBB1",
"}+ c #CDAF98",
"|+ c #7AC586",
"1+ c #D5C9B6",
"2+ c #47B962",
"3+ c #F56A66",
"4+ c #D3DBC7",
"5+ c #3AD577",
"6+ c #ABEBC3",
"7+ c #C5F0D6",
"8+ c #47D57D",
"9+ c #FFFEFF",
"0+ c #747474",
"a+ c #727272",
"b+ c #838383",
"c+ c #B3B3B3",
"d+ c #E2E2E2",
"e+ c #D3F3E0",
"f+ c #BF6243",
"g+ c #CFBDA7",
"h+ c #67D48C",
"i+ c #FA3331",
"j+ c #C3C9AE",
"k+ c #FFA2A8",
"l+ c #F4E8E5",
"m+ c #A5EBC1",
"n+ c #B9EDCD",
"o+ c #ABEAC3",
"p+ c #E7F7ED",
"q+ c #D0F2DD",
"r+ c #DFDFDF",
"s+ c #A7A7A7",
"t+ c #676767",
"u+ c #5D5D5D",
"v+ c #AEAEAE",
"w+ c #FF999C",
"x+ c #FDD6D6",
"y+ c #E9F2E9",
"z+ c #CFAA93",
"A+ c #FFF5F8",
"B+ c #A9F2CA",
"C+ c #D0F4DF",
"D+ c #E6F7ED",
"E+ c #4CD681",
"F+ c #FAFBFB",
"G+ c #5CDA8C",
"H+ c #B3ECC9",
"I+ c #F9F9F9",
"J+ c #F0F0F0",
"K+ c #E3E3E3",
"L+ c #848484",
"M+ c #525252",
"N+ c #878787",
"O+ c #D2D3D3",
"P+ c #FFFEFE",
"Q+ c #B6F0CC",
"R+ c #09CB55",
"S+ c #58D989",
"T+ c #49D67F",
"U+ c #14CA59",
"V+ c #C2EFD3",
"W+ c #85E2A8",
"X+ c #9BE7B8",
"Y+ c #A7EAC1",
"Z+ c #D3F3DE",
"`+ c #E1E1E1",
" @ c #979797",
".@ c #333333",
"+@ c #7E7E7E",
"@@ c #D7D7D7",
"#@ c #A7EEC2",
"$@ c #A2E9BD",
"%@ c #F1F9F5",
"&@ c #C9F1D8",
"*@ c #F4FAF6",
"=@ c #8CE4AD",
"-@ c #C0EFD2",
";@ c #B0ECC7",
">@ c #12CA57",
",@ c #E7E7E7",
"'@ c #989898",
")@ c #444444",
"!@ c #555355",
"~@ c #C6C4C5",
"{@ c #5FDB8E",
"]@ c #75DF9D",
"^@ c #E5F7EC",
"/@ c #B1ECC8",
"(@ c #A4A4A4",
"_@ c #FFFDFE",
":@ c #DCF5E5",
"<@ c #595959",
"[@ c #8C8C8C",
"}@ c #B4B4B4",
"|@ c #606060",
"1@ c #EDEDED",
"2@ c #E6E6E6",
"3@ c #3F3F3F",
"4@ c #DBDBDB",
"5@ c #919191",
" . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ",
"+ @ # $ % . . . . . . . . . . . . . . . . . . . . . . . . . . ",
"& * = - @ ; ; . . . . . . . . . . . . . . . . . . . . . . . . ",
"> , ' ) ! ~ { ; ; . . . . . . . . . . . . . . . . . . . . . ",
"% ; ; ] ^ / ( _ : ; ; . . . . . . . . . . . . . . . . . . . . ",
" . $ ; < [ } | 1 2 ; ; % . . . . . . . . . . . . . . . . ",
". . . . % $ 3 4 5 6 7 8 9 ; % . . . . . . . . . . . . . . . ",
". . . . . . . . 9 0 a b c / @ ; % . . . . . . . . . . . . . ",
"d d d d d e . . . . % ; f / g h i 9 9 . . . . . . . . . . . ",
"j e e j k d e . . . . . $ ; # l m ( n @ o $ . . . . . . . . ",
"p q r p s t d u u u e e e u u v ; # w | x y z A ; . . . . . . ",
"B C D E F G u H I J K . u L M N O P ; . Q R ) S T ; $ . . . . ",
"U V W X Y Z u ` C .K K u ..+.@.#.; $.% ; ; %.&.*.=.-.; . . ",
"K u u u r ;.>.,.'.).u !.~.{.].^./.(._.:. . ; o <.[.}.+ ; . . ",
". . . u X |.1.2.3.4.5.6.7.8.9.0.a.b.c.d.e. . % f.g.h.i.$ % ",
". . . d e j.k.. l.m.n.o.p.q.r.s.t.u.v.w.o.x.. . . y.z.A.o . ",
". . . . . . . e d u B.C.D.E.F.G.H.I.J.K.L.M.N. . ; O.P.Q.R.",
". . . . . . . . . d S.T.U.V.W.X.Y.Z.`. +.+++@+#+o. . ; $+%+&+",
"; % . . . . . e e u *+=+-+;+>+,+'+)+!+~+{+]+^+/+(+. . ; 9 l ",
"_+:+; ; ; ; . . . . e O <+[+}+|+1+2+3+4+5+6+; 7+8+9+. . . % ; ",
"y 0+a+b+c+d+; ; ; ; . O e+f+g+h+i+j+k+l+m+n+o+p+q+9+ . . . . ",
"r+z y.s+~ t+) u+v+d+; ; ; w+x+y+z+A+B+C+9+D+E+F+G+H+O . . . . . ",
"% $ $ I+J+K+4 : L+M+x N+O+P+; Q+R+S+T+U+V+W+X+N Y+Z+(+. . . . . ",
". . . . . . o A `+ @1 .@+@@@#@$@%@&@*@=@-@;@>@9+. . . . . . ",
". . . . . . . . . $ ; ,@'@)@!@~@$ x.; {@]@^@/@N . . . . . . ",
". . . . . . . . . . . . % ; ; y.&+(@; _@e+:@. O . . . . . . ",
". . . . . . . . . . . . . . ; `+<@4 ; (+(+. . . . . . . . . ",
". . . . . . . . . . . . . . . . . R.[@}@; . . . . . . . . . . . ",
". . . . . . . . . . . . . . . $ _+|@1@$ . . . . . . . . . . . ",
". . . . . . . . . . . . . . ; 2@3@i ; . . . . . . . . . . . ",
". . . . . . . . . . . . ; 4@x }@; . . . . . . . . . . . . ",
". . . . . . . . . . . . . ; 5@1 ] . . . . . . . . . . . . . "};
//---------------------------------------------------------------------------
//
// Project: OpenWalnut ( http://www.openwalnut.org )
//
// Copyright 2009 OpenWalnut Community, BSV@Uni-Leipzig and CNCF@MPI-CBS
// For more information see http://www.openwalnut.org/copying
//
// This file is part of OpenWalnut.
//
// OpenWalnut is free software: you can redistribute it and/or modify
// it under the terms of the GNU Lesser General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// OpenWalnut is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public License
// along with OpenWalnut. If not, see <http://www.gnu.org/licenses/>.
//
//---------------------------------------------------------------------------
#version 120
#include "WGEUtils.glsl" // for distancePointLineSegment(...)
#include "WFiberStipples-varyings.glsl"
/**
* Color of the fiber stipples. This will be further combined with tract probability.
*/
uniform vec4 u_color;
/**
* Middle point of the quad in texture coordinates, needed for scaling the projection of the principal diffusion direction to fit inside quad.
*/
uniform vec3 middlePoint_tex = vec3( 0.5, 0.5, 0.0 );
/**
* Scale the radius of the glyphs (aka stipples).
*/
uniform float u_glyphThickness;
void main()
{
// generally the area of a line stipple is a circle with radius R (each half for the endings of the line stipple) plus
// a quad with height 2R and width length of the focalPoints v and w. hence we have this equation in R to solve:
//
// R^2*PI + 2R*length(v, w) - A = 0
//
// where A is the area to fill.
float area = 0.1; // this is arbitrarily set
float l = distance( scaledFocalPoint1, scaledFocalPoint2 );
float p2 = -l / 3.14159265;
float q = area / 3.14159265;
float r1 = p2 + sqrt( p2 * p2 + q );
float r2 = p2 - sqrt( p2 * p2 + q );
float radius = max( r1, r2 ) * u_glyphThickness;
if( distancePointLineSegment( gl_TexCoord[1].xyz, scaledFocalPoint1, scaledFocalPoint2 ) < radius )
{
gl_FragColor = u_color * probability;
}
else
{
// if( distancePointLineSegment( gl_TexCoord[1].xyz, scaledFocalPoint1, scaledFocalPoint2 ) < ( radius + 0.01 ) )
// {
// gl_FragColor = vec4( 1.0, 1.0, 1.0, gl_Color.w );
// }
discard;
// // Draw quad and inner cricle
// gl_FragColor = vec4( 1.0, 1.0, 1.0, 1.0 );
// float lp = distance( gl_TexCoord[1].xyz, middlePoint_tex );
// if( lp >= 0.5 )
// {
// gl_FragColor = vec4( 0.7, 0.7, 1.0, 1.0 ); // discard;
// }
}
// // Color debugging facilities
// if( distancePointLineSegment( gl_TexCoord[1].xyz, focalPoint1, focalPoint2 ) < 0.01 )
// {
// if( l <= 1.1 )
// {
// gl_FragColor = vec4( 0.0, 0.0, 0.0, 1.0 );
// }
// else if( l < 1.225 )
// {
// gl_FragColor = vec4( 0.0, 1.0, 0.0, 1.0 );
// }
// else
// {
// gl_FragColor = vec4( 0.0, 0.0, 1.0, 1.0 );
// }
// }
// // display middle point
// if( distance( gl_TexCoord[1].xyz, middlePoint_tex ) <= 0.01 )
// {
// gl_FragColor = vec4( 0.0, 1.0, 0.0, 1.0 ); // green
// }
// // display new focal points
// if( ( distance( gl_TexCoord[1].xyz, scaledFocalPoint1 ) < 0.01 ) )
// {
// gl_FragColor = vec4( 0.0, 1.0, 1.0, 1.0 ); // cyan
// }
// if( ( distance( gl_TexCoord[1].xyz, scaledFocalPoint2 ) < 0.01 ) )
// {
// gl_FragColor = vec4( 0.0, 0.0, 1.0, 1.0 ); // blue
// }
// // display evec end points
// if( ( distance( gl_TexCoord[1].xyz, focalPoint1 ) < 0.01 ) )
// {
// gl_FragColor = vec4( 1.0, 0.0, 0.0, 1.0 ); // red
// }
// if( ( distance( gl_TexCoord[1].xyz, focalPoint2 ) < 0.01 ) )
// {
// gl_FragColor = vec4( 1.0, 1.0, 0.0, 1.0 ); // yellow
// }
}
//---------------------------------------------------------------------------
//
// Project: OpenWalnut ( http://www.openwalnut.org )
//
// Copyright 2009 OpenWalnut Community, BSV@Uni-Leipzig and CNCF@MPI-CBS
// For more information see http://www.openwalnut.org/copying
//
// This file is part of OpenWalnut.
//
// OpenWalnut is free software: you can redistribute it and/or modify
// it under the terms of the GNU Lesser General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// OpenWalnut is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public License
// along with OpenWalnut. If not, see <http://www.gnu.org/licenses/>.
//
//---------------------------------------------------------------------------
#version 120
/**
* First focal point, which is one of the endings of the projected diffusion direction.
*/
varying vec3 focalPoint1;
/**
* Second focal point, which is one of the endings of the projected diffusion direction.
*/
varying vec3 focalPoint2;
/**
* First focal point, scaled.
*/
varying vec3 scaledFocalPoint1;
/**
* Second focal poin, scaled.
*/
varying vec3 scaledFocalPoint2;
/**
* Scaled connectivity score; now between 0.0...1.0.
*/
varying float probability;
//---------------------------------------------------------------------------
//
// Project: OpenWalnut ( http://www.openwalnut.org )
//
// Copyright 2009 OpenWalnut Community, BSV@Uni-Leipzig and CNCF@MPI-CBS
// For more information see http://www.openwalnut.org/copying
//
// This file is part of OpenWalnut.
//
// OpenWalnut is free software: you can redistribute it and/or modify
// it under the terms of the GNU Lesser General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// OpenWalnut is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public License
// along with OpenWalnut. If not, see <http://www.gnu.org/licenses/>.
//
//---------------------------------------------------------------------------
#version 120
#include "WGETextureTools.glsl"
#include "WFiberStipples-varyings.glsl"
/**
* These two uniforms are needed to transform the vectors out of their texture
* back to their original form as they are stored in RBGA (for example allowing
* only values between 0..1 for components but no negative ones).
*/
uniform float u_vectorsMin; uniform float u_vectorsScale;
/**
* The matrix describes the transformation of gl_Vertex to OpenWalnut Scene Space
*/
uniform mat4 u_WorldTransform;
/**
* Vector dataset as texture.
*/
uniform sampler3D u_vectorsSampler;
/**
* Probabilistic tract as texture.
*/
uniform sampler3D u_probTractSampler;
/**
* Number of voxels in X direction.
*/
uniform int u_probTractSizeX;
/**
* Number of voxels in Y direction.
*/
uniform int u_probTractSizeY;
/**
* Number of voxels in Z direction.
*/
uniform int u_probTractSizeZ;
// For correct transformation into texture space we also need the size of each voxel.
/**
* Voxel size in X direction.
*/
uniform float u_pixelSizeX;
/**
* Voxel size in Y direction.
*/
uniform float u_pixelSizeY;
/**
* Voxel size in Z direction.
*/
uniform float u_pixelSizeZ;
/**
* First plane vector spanning the plane of the quad.
*/
uniform vec3 u_aVec;