4#ifndef vtkVolumeShaderComposer_h 
    5#define vtkVolumeShaderComposer_h 
   26  for (
auto& item : inputs)
 
   39  for (
auto& item : inputs)
 
   42    const bool lighting = volProp->
GetShade() == 1;
 
   51  for (
auto& item : inputs)
 
   55    if (useClippedVoxelIntensity)
 
   63inline std::string ArrayBaseName(
const std::string& arrayName)
 
   65  return arrayName.substr(0, arrayName.length() - 3);
 
   77VTK_ABI_NAMESPACE_BEGIN
 
   83    "  //Transform vertex (data coordinates) to clip coordinates\n" 
   84    "  // p_clip = T_ProjViewModel * T_dataToWorld * p_data\n" 
   85    "  vec4 pos = in_projectionMatrix * in_modelViewMatrix * in_volumeMatrix[0] *\n" 
   86    "    vec4(in_vertexPos.xyz, 1.0);\n" 
   87    "  gl_Position = pos;\n");
 
   95    "  // Transform vertex (data coordinates) to texture coordinates.\n" 
   96    "  // p_texture = T_dataToTex * p_data\n" 
   97    "  vec3 uvx = sign(in_cellSpacing[0]) * (in_inverseTextureDatasetMatrix[0] *\n" 
   98    "  vec4(in_vertexPos, 1.0)).xyz;\n" 
  100    "  // For point dataset, we offset the texture coordinate\n" 
  101    "  // to account for OpenGL treating voxel at the center of the cell.\n" 
  102    "  // Transform cell tex-coordinates to point tex-coordinates (cellToPoint\n" 
  103    "  // is an identity matrix in the case of cell data).\n" 
  104    "  ip_textureCoords = (in_cellToPoint[0] * vec4(uvx, 1.0)).xyz;\n" 
  105    "  ip_inverseTextureDataAdjusted = in_cellToPoint[0] * in_inverseTextureDatasetMatrix[0];\n");
 
  110  vtkVolume* vtkNotUsed(vol), 
bool multipleInputs)
 
  113  const int numInputs = gpuMapper->GetInputCount();
 
  115  std::ostringstream ss;
 
  116  ss << 
"uniform vec3 in_cellSpacing[" << numInputs
 
  118        "uniform mat4 in_modelViewMatrix;\n" 
  119        "uniform mat4 in_projectionMatrix;\n";
 
  121  const int numTransf = multipleInputs ? numInputs + 1 : 1;
 
  122  ss << 
"uniform mat4 in_volumeMatrix[" << numTransf
 
  124        "uniform mat4 in_inverseTextureDatasetMatrix[" 
  127        "uniform mat4 in_cellToPoint[" 
  131        "//This variable could be 'invariant varying' but it is declared\n" 
  132        "//as 'varying' to avoid compiler compatibility issues.\n" 
  133        "out mat4 ip_inverseTextureDataAdjusted;\n";
 
  141  int numberPositionalLights, 
bool defaultLighting, 
int noOfComponents, 
int independentComponents)
 
  143  const int numInputs = 
static_cast<int>(inputs.size());
 
  145  std::ostringstream toShaderStr;
 
  146  toShaderStr << 
"uniform sampler3D in_volume[" << numInputs << 
"];\n";
 
  148  toShaderStr << 
"uniform vec4 in_volume_scale[" << numInputs
 
  150                 "uniform vec4 in_volume_bias[" 
  151              << numInputs << 
"];\n";
 
  155    toShaderStr << 
"uniform sampler1D in_coordTexs;\n";
 
  156    toShaderStr << 
"uniform vec3 in_coordTexSizes;\n";
 
  157    toShaderStr << 
"uniform vec3 in_coordsScale;\n";
 
  158    toShaderStr << 
"uniform vec3 in_coordsBias;\n";
 
  163    toShaderStr << 
"uniform sampler3D in_blanking;\n";
 
  166  toShaderStr << 
"uniform int in_noOfComponents;\n" 
  168                 "uniform sampler2D in_depthSampler;\n" 
  170                 "// Camera position\n" 
  171                 "uniform vec3 in_cameraPos;\n";
 
  176    toShaderStr << 
"uniform sampler2D in_noiseSampler;\n";
 
  181  const int numTransf = (numInputs > 1) ? numInputs + 1 : 1;
 
  182  toShaderStr << 
"uniform mat4 in_volumeMatrix[" << numTransf
 
  184                 "uniform mat4 in_inverseVolumeMatrix[" 
  187                 "uniform mat4 in_textureDatasetMatrix[" 
  190                 "uniform mat4 in_inverseTextureDatasetMatrix[" 
  193                 "uniform mat4 in_textureToEye[" 
  196                 "uniform vec3 in_texMin[" 
  199                 "uniform vec3 in_texMax[" 
  202                 "uniform mat4 in_cellToPoint[" 
  203              << numTransf << 
"];\n";
 
  205  toShaderStr << 
"// view and model matrices\n" 
  206                 "uniform mat4 in_projectionMatrix;\n" 
  207                 "uniform mat4 in_inverseProjectionMatrix;\n" 
  208                 "uniform mat4 in_modelViewMatrix;\n" 
  209                 "uniform mat4 in_inverseModelViewMatrix;\n" 
  210                 "in mat4 ip_inverseTextureDataAdjusted;\n" 
  213                 "uniform vec3 in_cellStep[" 
  214              << numInputs << 
"];\n";
 
  219    toShaderStr << 
"mat4 g_eyeToTexture = in_inverseTextureDatasetMatrix[0] *" 
  220                   " in_inverseVolumeMatrix[0] * in_inverseModelViewMatrix;\n";
 
  223  if (inputs[0].Volume->GetProperty() && inputs[0].Volume->GetProperty()->GetShade() &&
 
  224    !defaultLighting && totalNumberOfLights > 0)
 
  226    toShaderStr << 
"mat4 g_texToView = in_modelViewMatrix * in_volumeMatrix[0] *" 
  227                   "in_textureDatasetMatrix[0];\n";
 
  230  toShaderStr << 
"uniform vec2 in_scalarsRange[" << numInputs * 4
 
  232                 "uniform vec3 in_cellSpacing[" 
  236                 "// Sample distance\n" 
  237                 "uniform float in_sampleDistance;\n" 
  240                 "uniform vec2 in_windowLowerLeftCorner;\n" 
  241                 "uniform vec2 in_inverseOriginalWindowSize;\n" 
  242                 "uniform vec2 in_inverseWindowSize;\n" 
  243                 "uniform vec3 in_textureExtentsMax;\n" 
  244                 "uniform vec3 in_textureExtentsMin;\n" 
  246                 "// Material and lighting\n" 
  247                 "uniform vec3 in_diffuse[4];\n" 
  248                 "uniform vec3 in_ambient[4];\n" 
  249                 "uniform vec3 in_specular[4];\n" 
  250                 "uniform float in_shininess[4];\n" 
  253                 "vec3 g_rayJitter = vec3(0.0);\n" 
  255                 "uniform vec2 in_averageIPRange;\n";
 
  257  toShaderStr << 
"vec4 g_eyePosObjs[" << numInputs << 
"];\n";
 
  259  const bool hasGradientOpacity = HasGradientOpacity(inputs);
 
  260  if (totalNumberOfLights > 0 || hasGradientOpacity)
 
  262    toShaderStr << 
"uniform bool in_twoSidedLighting;\n";
 
  267    toShaderStr << R
"***( 
  268uniform float in_giReach; 
  269uniform float in_anisotropy; 
  270uniform float in_volumetricScatteringBlending; 
  275  if (totalNumberOfLights > 0)
 
  277    std::string totalLights = std::to_string(totalNumberOfLights);
 
  278    std::string positionalLights = std::to_string(numberPositionalLights);
 
  280    if (!defaultLighting)
 
  282      toShaderStr << 
"#define TOTAL_NUMBER_LIGHTS " << totalLights
 
  284                     "#define NUMBER_POS_LIGHTS " 
  287                     "vec4 g_fragWorldPos;\n" 
  288                     "uniform vec3 in_lightAmbientColor[TOTAL_NUMBER_LIGHTS];\n" 
  289                     "uniform vec3 in_lightDiffuseColor[TOTAL_NUMBER_LIGHTS];\n" 
  290                     "uniform vec3 in_lightSpecularColor[TOTAL_NUMBER_LIGHTS];\n" 
  291                     "uniform vec3 in_lightDirection[TOTAL_NUMBER_LIGHTS];\n";
 
  292      if (numberPositionalLights > 0)
 
  294        toShaderStr << 
"uniform vec3 in_lightPosition[NUMBER_POS_LIGHTS];\n" 
  295                       "uniform vec3 in_lightAttenuation[NUMBER_POS_LIGHTS];\n" 
  296                       "uniform float in_lightConeAngle[NUMBER_POS_LIGHTS];\n" 
  297                       "uniform float in_lightExponent[NUMBER_POS_LIGHTS];\n";
 
  302        toShaderStr << 
"vec3 g_lightDirectionTex[TOTAL_NUMBER_LIGHTS];\n";
 
  304        if (numberPositionalLights > 0)
 
  306          toShaderStr << 
"vec3 g_lightPositionTex[NUMBER_POS_LIGHTS];\n";
 
  312      toShaderStr << 
"uniform vec3 in_lightAmbientColor[1];\n" 
  313                     "uniform vec3 in_lightDiffuseColor[1];\n" 
  314                     "uniform vec3 in_lightSpecularColor[1];\n" 
  315                     "vec4 g_lightPosObj[" 
  325                  << numInputs << 
"];\n";
 
  329  if (noOfComponents > 1 && independentComponents)
 
  331    toShaderStr << 
"uniform vec4 in_componentWeight;\n";
 
  337    toShaderStr << 
"uniform sampler2D in_depthPassSampler;\n";
 
  342    toShaderStr << 
"#if NUMBER_OF_CONTOURS\n" 
  343                   "uniform float in_isosurfacesValues[NUMBER_OF_CONTOURS];\n" 
  345                   "int findIsoSurfaceIndex(float scalar, float array[NUMBER_OF_CONTOURS+2])\n" 
  347                   "  int index = NUMBER_OF_CONTOURS >> 1;\n" 
  348                   "  while (scalar > array[index]) ++index;\n" 
  349                   "  while (scalar < array[index]) --index;\n" 
  356    vtkVolume* vol = inputs.begin()->second.Volume;
 
  359    if (func && func->
IsA(
"vtkPlane"))
 
  362        << 
"uniform vec3 in_slicePlaneOrigin;\n" 
  363           "uniform vec3 in_slicePlaneNormal;\n" 
  364           "vec3 g_intersection;\n" 
  366           "float intersectRayPlane(vec3 rayOrigin, vec3 rayDir)\n" 
  368           "  vec4 planeNormal = in_inverseVolumeMatrix[0] * vec4(in_slicePlaneNormal, 0.0);\n" 
  369           "  float denom = dot(planeNormal.xyz, rayDir);\n" 
  370           "  if (abs(denom) > 1e-6)\n" 
  372           "    vec4 planeOrigin = in_inverseVolumeMatrix[0] * vec4(in_slicePlaneOrigin, 1.0);\n" 
  373           "    return dot(planeOrigin.xyz - rayOrigin, planeNormal.xyz) / denom;\n" 
  380  return toShaderStr.str();
 
  388  vtkVolume* vol = inputs.begin()->second.Volume;
 
  389  const int numInputs = 
static_cast<int>(inputs.size());
 
  391  std::ostringstream shaderStr;
 
  397        \n  vec2 fragTexCoord2 = (gl_FragCoord.xy - in_windowLowerLeftCorner) *\ 
  398        \n                        in_inverseWindowSize;\ 
  399        \n  vec4 depthValue = texture2D(in_depthPassSampler, fragTexCoord2);\ 
  400        \n  vec4 rayOrigin = WindowToNDC(gl_FragCoord.x, gl_FragCoord.y, depthValue.x);\ 
  402        \n  // From normalized device coordinates to eye coordinates.\ 
  403        \n  // in_projectionMatrix is inversed because of way VT\ 
  404        \n  // From eye coordinates to texture coordinates\ 
  405        \n  rayOrigin = in_inverseTextureDatasetMatrix[0] *\ 
  406        \n              in_inverseVolumeMatrix[0] *\ 
  407        \n              in_inverseModelViewMatrix *\ 
  408        \n              in_inverseProjectionMatrix *\ 
  410        \n  rayOrigin /= rayOrigin.w;\ 
  411        \n  g_rayOrigin = rayOrigin.xyz;";
 
  416        \n  // Get the 3D texture coordinates for lookup into the in_volume dataset\ 
  417        \n  g_rayOrigin = ip_textureCoords.xyz;";
 
  422      \n  // Eye position in dataset space\ 
  423      \n  g_eyePosObj = in_inverseVolumeMatrix[0] * vec4(in_cameraPos, 1.0);";
 
  424  for (
int i = 0; i < numInputs; ++i)
 
  429              << i << 
"] = in_inverseVolumeMatrix[" << (numInputs > 1 ? i + 1 : i)
 
  430              << 
"] * vec4(in_cameraPos, 1.0);";
 
  433      \n  // Getting the ray marching direction (in dataset space)\ 
  434      \n  vec3 rayDir = computeRayDirection();\ 
  436      \n  // 2D Texture fragment coordinates [0,1] from fragment coordinates.\ 
  437      \n  // The frame buffer texture has the size of the plain buffer but \ 
  438      \n  // we use a fraction of it. The texture coordinate is less than 1 if\ 
  439      \n  // the reduction factor is less than 1.\ 
  440      \n  // Device coordinates are between -1 and 1. We need texture\ 
  441      \n  // coordinates between 0 and 1. The in_depthSampler\ 
  442      \n  // buffer has the original size buffer.\ 
  443      \n  vec2 fragTexCoord = (gl_FragCoord.xy - in_windowLowerLeftCorner) *\ 
  444      \n                      in_inverseWindowSize;\ 
  446      \n  // Multiply the raymarching direction with the step size to get the\ 
  447      \n  // sub-step size we need to take at each raymarching step\ 
  448      \n  g_dirStep = (ip_inverseTextureDataAdjusted *\ 
  449      \n              vec4(rayDir, 0.0)).xyz * in_sampleDistance;\ 
  450      \n  g_lengthStep = length(g_dirStep);\ 
  454          \n float jitterValue = 0.0;\ 
  463          \n    jitterValue = texture2D(in_noiseSampler, gl_FragCoord.xy /\ 
  464                                              vec2(textureSize(in_noiseSampler, 0))).x;\ 
  465          \n    g_rayJitter = g_dirStep * jitterValue;\ 
  471        \n    g_rayJitter = g_dirStep;\ 
  475        \n  g_rayOrigin += g_rayJitter;\ 
  480      \n  // Flag to determine if voxel should be considered for the rendering\ 
  486        \n  // Light position in dataset space";
 
  487    for (
int i = 0; i < numInputs; ++i)
 
  492                << i << 
"] = (in_inverseVolumeMatrix[" << (numInputs > 1 ? i + 1 : i) << 
"] *\ 
  493        \n                      vec4(in_cameraPos, 1.0));\ 
  495                << i << 
"] = normalize(g_lightPosObj[" << i << 
"].xyz - ip_vertexPos);\ 
  497                << i << 
"] = normalize(g_eyePosObjs[" << i << 
"].xyz - ip_vertexPos);\ 
  499                << i << 
"] = normalize(g_ldir[" << i << 
"] + g_vdir[" << i << 
"]);";
 
  503  return shaderStr.str();
 
  513      \n    g_skip = false;");
 
  517  bool blankCells = (dataSet->GetCellGhostArray() != 
nullptr);
 
  518  bool blankPoints = (dataSet->GetPointGhostArray() != 
nullptr);
 
  519  if (blankPoints || blankCells)
 
  521    str += std::string(
"\ 
  522        \n     // Check whether the neighboring points/cells are blank.\ 
  523        \n     // Note the half cellStep because texels are point centered.\ 
  524        \n     vec3 xvec = vec3(in_cellStep[0].x/2.0, 0.0, 0.0);\ 
  525        \n     vec3 yvec = vec3(0.0, in_cellStep[0].y/2.0, 0.0);\ 
  526        \n     vec3 zvec = vec3(0.0, 0.0, in_cellStep[0].z/2.0);\ 
  527        \n     vec3 texPosPVec[3];\ 
  528        \n     texPosPVec[0] = g_dataPos + xvec;\ 
  529        \n     texPosPVec[1] = g_dataPos + yvec;\ 
  530        \n     texPosPVec[2] = g_dataPos + zvec;\ 
  531        \n     vec3 texPosNVec[3];\ 
  532        \n     texPosNVec[0] = g_dataPos - xvec;\ 
  533        \n     texPosNVec[1] = g_dataPos - yvec;\ 
  534        \n     texPosNVec[2] = g_dataPos - zvec;\ 
  535        \n     vec4 blankValue = texture3D(in_blanking, g_dataPos);\ 
  536        \n     vec4 blankValueXP = texture3D(in_blanking, texPosPVec[0]);\ 
  537        \n     vec4 blankValueYP = texture3D(in_blanking, texPosPVec[1]);\ 
  538        \n     vec4 blankValueZP = texture3D(in_blanking, texPosPVec[2]);\ 
  539        \n     vec4 blankValueXN = texture3D(in_blanking, texPosNVec[0]);\ 
  540        \n     vec4 blankValueYN = texture3D(in_blanking, texPosNVec[1]);\ 
  541        \n     vec4 blankValueZN = texture3D(in_blanking, texPosNVec[2]);\ 
  542        \n     vec3 blankValuePx;\ 
  543        \n     blankValuePx[0] = blankValueXP.x;\ 
  544        \n     blankValuePx[1] = blankValueYP.x;\ 
  545        \n     blankValuePx[2] = blankValueZP.x;\ 
  546        \n     vec3 blankValuePy;\ 
  547        \n     blankValuePy[0] = blankValueXP.y;\ 
  548        \n     blankValuePy[1] = blankValueYP.y;\ 
  549        \n     blankValuePy[2] = blankValueZP.y;\ 
  550        \n     vec3 blankValueNx;\ 
  551        \n     blankValueNx[0] = blankValueXN.x;\ 
  552        \n     blankValueNx[1] = blankValueYN.x;\ 
  553        \n     blankValueNx[2] = blankValueZN.x;\ 
  554        \n     vec3 blankValueNy;\ 
  555        \n     blankValueNy[0] = blankValueXN.y;\ 
  556        \n     blankValueNy[1] = blankValueYN.y;\ 
  557        \n     blankValueNy[2] = blankValueZN.y;\ 
  561      str += std::string(
"\ 
  562          \n    // If the current or neighboring points\ 
  563          \n    // (that belong to cells that share this texel) are blanked,\ 
  564          \n    // skip the texel. In other words, if point 1 were blank,\ 
  565          \n    // texels 0, 1 and 2 would have to be skipped.\ 
  566          \n    if (blankValue.x > 0.0 ||\ 
  567          \n        any(greaterThan(blankValueNx, vec3(0.0))) ||\ 
  568          \n        any(greaterThan(blankValuePx, vec3(0.0))))\ 
  570          \n      // skip this texel\ 
  576        str += std::string(
"\ 
  577            \n    // If the current or previous cells (that share this texel)\ 
  578            \n    // are blanked, skip the texel. In other words, if cell 1\ 
  579            \n    // is blanked, texels 1 and 2 would have to be skipped.\ 
  580            \n    else if (blankValue.y > 0.0 ||\ 
  581            \n             any(greaterThan(blankValuePy, vec3(0.0))) ||\ 
  582            \n             any(greaterThan(blankValueNy, vec3(0.0))))\ 
  584            \n      // skip this texel\ 
  592      str += std::string(
"\ 
  593          \n    // If the current or previous cells (that share this texel)\ 
  594          \n    // are blanked, skip the texel. In other words, if cell 1\ 
  595          \n    // is blanked, texels 1 and 2 would have to be skipped.\ 
  596          \n    if (blankValue.x > 0.0 ||\ 
  597          \n        any(greaterThan(blankValueNx, vec3(0.0))) ||\ 
  598          \n        any(greaterThan(blankValuePx, vec3(0.0))))\ 
  600          \n      // skip this texel\ 
  609    str += std::string(
"\ 
  610        \n    g_dataPos = g_intersection;\ 
  621  return std::string();
 
  626  int independentComponents, std::map<int, std::string> gradientTableMap)
 
  629  std::ostringstream ss;
 
  630  if (volProperty->HasGradientOpacity())
 
  632    ss << 
"uniform sampler2D " << ArrayBaseName(gradientTableMap[0]) << 
"[" << noOfComponents
 
  635  bool useLabelGradientOpacity =
 
  636    (volProperty->HasLabelGradientOpacity() && (noOfComponents == 1 || !independentComponents));
 
  637  if (useLabelGradientOpacity)
 
  639    ss << 
"uniform sampler2D in_labelMapGradientOpacity;\n";
 
  642  std::string shaderStr = ss.str();
 
  644  if (volProperty->HasGradientOpacity() && noOfComponents > 0)
 
  646    if (noOfComponents == 1 || !independentComponents)
 
  648      shaderStr += std::string(
"\ 
  649          \nfloat computeGradientOpacity(vec4 grad)\ 
  651          \n  return texture2D(" +
 
  652        gradientTableMap[0] + 
", vec2(grad.w, 0.0)).r;\ 
  657      shaderStr += std::string(
"\ 
  658        \nfloat computeGradientOpacity(vec4 grad, int component)\ 
  661      for (
int i = 0; i < noOfComponents; ++i)
 
  663        std::ostringstream toString;
 
  665        shaderStr += std::string(
"\ 
  666            \n  if (component == " +
 
  667          toString.str() + 
")");
 
  669        shaderStr += std::string(
"\ 
  671            \n    return texture2D(" +
 
  672          gradientTableMap[i] + 
", vec2(grad.w, 0.0)).r;\ 
  676      shaderStr += std::string(
"\ 
  681  if (useLabelGradientOpacity)
 
  683    shaderStr += std::string(
"\ 
  684        \nfloat computeGradientOpacityForLabel(vec4 grad, float label)\ 
  686        \n  return texture2D(in_labelMapGradientOpacity, vec2(grad.w, label)).r;\ 
  697  const bool hasLighting = HasLighting(inputs);
 
  698  const bool hasGradientOp = HasGradientOpacity(inputs);
 
  700  std::string shaderStr;
 
  701  if (hasLighting || hasGradientOp)
 
  703    shaderStr += std::string(
 
  704      "// c is short for component\n" 
  705      "vec4 computeGradient(in vec3 texPos, in int c, in sampler3D volume,in int index)\n" 
  707      "  // Approximate Nabla(F) derivatives with central differences.\n" 
  708      "  vec3 g1; // F_front\n" 
  709      "  vec3 g2; // F_back\n" 
  710      "  vec3 xvec = vec3(in_cellStep[index].x, 0.0, 0.0);\n" 
  711      "  vec3 yvec = vec3(0.0, in_cellStep[index].y, 0.0);\n" 
  712      "  vec3 zvec = vec3(0.0, 0.0, in_cellStep[index].z);\n" 
  713      "  vec3 texPosPvec[3];\n" 
  714      "  texPosPvec[0] = texPos + xvec;\n" 
  715      "  texPosPvec[1] = texPos + yvec;\n" 
  716      "  texPosPvec[2] = texPos + zvec;\n" 
  717      "  vec3 texPosNvec[3];\n" 
  718      "  texPosNvec[0] = texPos - xvec;\n" 
  719      "  texPosNvec[1] = texPos - yvec;\n" 
  720      "  texPosNvec[2] = texPos - zvec;\n" 
  721      "  g1.x = texture3D(volume, vec3(texPosPvec[0]))[c];\n" 
  722      "  g1.y = texture3D(volume, vec3(texPosPvec[1]))[c];\n" 
  723      "  g1.z = texture3D(volume, vec3(texPosPvec[2]))[c];\n" 
  724      "  g2.x = texture3D(volume, vec3(texPosNvec[0]))[c];\n" 
  725      "  g2.y = texture3D(volume, vec3(texPosNvec[1]))[c];\n" 
  726      "  g2.z = texture3D(volume, vec3(texPosNvec[2]))[c];\n" 
  731        std::string(
"  vec4 g1ObjDataPos[3], g2ObjDataPos[3];\n" 
  732                    "  for (int i = 0; i < 3; ++i)\n" 
  734                    "    g1ObjDataPos[i] = clip_texToObjMat * vec4(texPosPvec[i], 1.0);\n" 
  735                    "    if (g1ObjDataPos[i].w != 0.0)\n" 
  737                    "      g1ObjDataPos[i] /= g1ObjDataPos[i].w;\n" 
  739                    "    g2ObjDataPos[i] = clip_texToObjMat * vec4(texPosNvec[i], 1.0);\n" 
  740                    "    if (g2ObjDataPos[i].w != 0.0)\n" 
  742                    "      g2ObjDataPos[i] /= g2ObjDataPos[i].w;\n" 
  746                    "  for (int i = 0; i < clip_numPlanes && !g_skip; i = i + 6)\n" 
  748                    "    vec3 planeOrigin = vec3(in_clippingPlanes[i + 1],\n" 
  749                    "                            in_clippingPlanes[i + 2],\n" 
  750                    "                            in_clippingPlanes[i + 3]);\n" 
  751                    "    vec3 planeNormal = normalize(vec3(in_clippingPlanes[i + 4],\n" 
  752                    "                                      in_clippingPlanes[i + 5],\n" 
  753                    "                                      in_clippingPlanes[i + 6]));\n" 
  754                    "    for (int j = 0; j < 3; ++j)\n" 
  756                    "      if (dot(vec3(planeOrigin - g1ObjDataPos[j].xyz), planeNormal) > 0)\n" 
  758                    "        g1[j] = in_clippedVoxelIntensity;\n" 
  760                    "      if (dot(vec3(planeOrigin - g2ObjDataPos[j].xyz), planeNormal) > 0)\n" 
  762                    "        g2[j] = in_clippedVoxelIntensity;\n" 
  768    shaderStr += std::string(
"  // Apply scale and bias to the fetched values.\n" 
  769                             "  g1 = g1 * in_volume_scale[index][c] + in_volume_bias[index][c];\n" 
  770                             "  g2 = g2 * in_volume_scale[index][c] + in_volume_bias[index][c];\n" 
  775        std::string(
"  // Central differences: (F_front - F_back) / 2h\n" 
  776                    "  // This version of computeGradient() is only used for lighting\n" 
  777                    "  // calculations (only direction matters), hence the difference is\n" 
  778                    "  // not scaled by 2h and a dummy gradient mag is returned (-1.).\n" 
  779                    "  return vec4((g1 - g2) / in_cellSpacing[index], -1.0);\n" 
  784      shaderStr += std::string(
 
  785        "  // Scale values the actual scalar range.\n" 
  786        "  float range = in_scalarsRange[4*index+c][1] - in_scalarsRange[4*index+c][0];\n" 
  787        "  g1 = in_scalarsRange[4*index+c][0] + range * g1;\n" 
  788        "  g2 = in_scalarsRange[4*index+c][0] + range * g2;\n" 
  790        "  // Central differences: (F_front - F_back) / 2h\n" 
  793        "  float avgSpacing = (in_cellSpacing[index].x +\n" 
  794        "   in_cellSpacing[index].y + in_cellSpacing[index].z) / 3.0;\n" 
  795        "  vec3 aspect = in_cellSpacing[index] * 2.0 / avgSpacing;\n" 
  797        "  float grad_mag = length(g2);\n" 
  799        "  // Handle normalizing with grad_mag == 0.0\n" 
  800        "  g2 = grad_mag > 0.0 ? normalize(g2) : vec3(0.0);\n" 
  802        "  // Since the actual range of the gradient magnitude is unknown,\n" 
  803        "  // assume it is in the range [0, 0.25 * dataRange].\n" 
  804        "  range = range != 0 ? range : 1.0;\n" 
  805        "  grad_mag = grad_mag / (0.25 * range);\n" 
  806        "  grad_mag = clamp(grad_mag, 0.0, 1.0);\n" 
  808        "  return vec4(g2.xyz, grad_mag);\n" 
  814    shaderStr += std::string(
 
  815      "vec4 computeGradient(in vec3 texPos, in int c, in sampler3D volume, in int index)\n" 
  817      "  return vec4(0.0);\n" 
  830  for(int i=0; i<TOTAL_NUMBER_LIGHTS; i++) 
  832    g_lightDirectionTex[i] = (g_eyeToTexture * vec4(-in_lightDirection[i], 0.0)).xyz; 
  836  if (numberPositionalLights > 0)
 
  839  for(int i=0; i<NUMBER_POS_LIGHTS; i++) 
  841    g_lightPositionTex[i] = (g_eyeToTexture * vec4(in_lightPosition[i], 1.0)).xyz; 
  851  int independentComponents, std::map<int, std::string> opacityTableMap, 
int useGradient)
 
  854  std::string functionBody;
 
  855  bool severalIndpt = noOfComponents > 1 && independentComponents;
 
  856  std::string functionSignature = severalIndpt
 
  857    ? 
"vec4 computeRGBAWithGrad(vec4 scalar, vec4 grad, int component)\n" 
  858    : 
"vec4 computeRGBAWithGrad(vec4 scalar, vec4 grad)\n";
 
  867        "vec4 yscalar = texture3D(in_transfer2DYAxis, g_dataPos);\n" 
  868        "for (int i = 0; i < 4; ++i)\n" 
  870        "  yscalar[i] = yscalar[i] * in_transfer2DYAxis_scale[i] + in_transfer2DYAxis_bias[i];\n" 
  874    for (
int i = 0; i < noOfComponents; ++i)
 
  876      std::string secondAxis(useGradient
 
  882      functionBody += 
"  if(component == " + std::to_string(i) +
 
  885        "    return texture2D(" +
 
  886        opacityTableMap[i] + 
",\n" + 
"    vec2(scalar[" + std::to_string(i) + 
"], " + secondAxis +
 
  891  else if (noOfComponents == 2 && !independentComponents)
 
  893    std::string secondAxis(useGradient ? 
"grad.w" : 
"yscalar.y");
 
  895    functionBody += 
"  return texture2D(" + opacityTableMap[0] +
 
  898      secondAxis + 
"));\n";
 
  906      functionBody += 
"  return texture2D(" + opacityTableMap[0] +
 
  908        "    vec2(scalar.a, grad.w));\n";
 
  914        "  vec4 yscalar = texture3D(in_transfer2DYAxis, g_dataPos);\n" 
  915        "  yscalar.r = yscalar.r * in_transfer2DYAxis_scale.r + in_transfer2DYAxis_bias.r;\n" 
  916        "  yscalar = vec4(yscalar.r);\n" 
  917        "  return texture2D(" +
 
  920        "    vec2(scalar.a, yscalar.w));\n";
 
  924  resStr = functionSignature + 
"{\n" + functionBody + 
"}\n";
 
  932  int independentComponents, 
int useGradYAxis, std::string position, 
bool requestColor = 
false)
 
  938  if (inputs.size() > 1)
 
  941    const bool hasGradOp = ::HasGradientOpacity(inputs);
 
  942    resStr += 
"  opacity = computeOpacity(vec4(scalar), opacityTF);\n";
 
  947      resStr += std::string(
"  gradient = computeGradient(") + position + 
", c, volume, index);\n";
 
  948      resStr += 
"  opacity *= computeGradientOpacity(gradient, gradTF);\n";
 
  954      vtkGenericWarningMacro(<< 
"ComputeOpacityEvaluationCall was called with requestColor, but " 
  955                                "MultiVolume does not support this option yet.");
 
  968    bool indpComps = (noOfComponents > 1 && independentComponents);
 
  969    std::string compArgument = (indpComps) ? std::string(
", c") : std::string();
 
  976      std::string compWeights = indpComps ? std::string(
" * in_componentWeight[c]") : 
std::
string();
 
  978      resStr += std::string(
"  opacity = computeOpacity(vec4(scalar)") + compArgument +
 
  979        std::string(
")") + compWeights + 
";\n";
 
  981      if (hasGradOp || useLabelGradientOpacity)
 
  983        resStr += std::string(
"  gradient = computeGradient(") + 
position +
 
  984          std::string(
", c, volume, index);\n" 
  985                      "  if(gradient.w >= 0.0) {\n") +
 
  986          (hasGradOp ? (std::string(
"    opacity *= computeGradientOpacity(gradient") +
 
  987                         compArgument + 
")" + compWeights + 
";\n")
 
  990          + (useLabelGradientOpacity
 
  991                ? (
std::
string(
"    opacity *= computeGradientOpacityForLabel(gradient, label);\n"))
 
 1000          "    color = texture2D(" + inputs[0].RGBTablesMap[0] + 
", vec2(scalar, 0.0)).xyz;\n";
 
 1009          std::string(
"  gradient = computeGradient(") + 
position + 
", c, volume, index);\n";
 
 1011      resStr += std::string(
"  vec4 lutRes = computeRGBAWithGrad(vec4(scalar), gradient") +
 
 1012        compArgument + std::string(
");\n");
 
 1014      resStr += 
"    opacity = lutRes.a;\n";
 
 1018        resStr += 
"    color = lutRes.xyz;\n";
 
 1029  int independentComponents, 
int useGradYAxis)
 
 1031  const bool hasLighting = ::HasLighting(inputs);
 
 1032  const bool hasGradientOp = ::HasGradientOpacity(inputs);
 
 1034  std::string functionSignature;
 
 1036  if (inputs.size() > 1)
 
 1040      functionSignature = std::string(
 
 1041        "vec4 computeDensityGradient(in vec3 texPos, in int c, in sampler3D volume, " 
 1042        "const in sampler2D opacityTF, const in sampler2D gradTF, in int index, float label)\n");
 
 1047        std::string(
"vec4 computeDensityGradient(in vec3 texPos, in int c, in sampler3D volume, " 
 1048                    "const in sampler2D opacityTF, in int index, float label)\n");
 
 1053    functionSignature = std::string(
"vec4 computeDensityGradient(in vec3 texPos, in int c, in " 
 1054                                    "sampler3D volume, in int index, float label)\n");
 
 1057  std::string shaderStr;
 
 1058  if (hasLighting || hasGradientOp)
 
 1061    std::string opacityTFcall;
 
 1062    std::string gradComput;
 
 1064    static const std::array<std::pair<const char*, const char*>, 6> results_texPos = { {
 
 1065      { 
"  g1.x", 
"texPosPvec[0]" },
 
 1066      { 
"  g1.y", 
"texPosPvec[1]" },
 
 1067      { 
"  g1.z", 
"texPosPvec[2]" },
 
 1068      { 
"  g2.x", 
"texPosNvec[0]" },
 
 1069      { 
"  g2.y", 
"texPosNvec[1]" },
 
 1070      { 
"  g2.z", 
"texPosNvec[2]" },
 
 1073    shaderStr += std::string(
"// c is short for component\n") + functionSignature +
 
 1075                  "  // Approximate Nabla(F) derivatives with central differences.\n" 
 1076                  "  vec3 g1; // F_front\n" 
 1077                  "  vec3 g2; // F_back\n" 
 1078                  "  vec3 xvec = vec3(in_cellStep[index].x, 0.0, 0.0);\n" 
 1079                  "  vec3 yvec = vec3(0.0, in_cellStep[index].y, 0.0);\n" 
 1080                  "  vec3 zvec = vec3(0.0, 0.0, in_cellStep[index].z);\n" 
 1081                  "  vec3 texPosPvec[3];\n" 
 1082                  "  texPosPvec[0] = texPos + xvec;\n" 
 1083                  "  texPosPvec[1] = texPos + yvec;\n" 
 1084                  "  texPosPvec[2] = texPos + zvec;\n" 
 1085                  "  vec3 texPosNvec[3];\n" 
 1086                  "  texPosNvec[0] = texPos - xvec;\n" 
 1087                  "  texPosNvec[1] = texPos - yvec;\n" 
 1088                  "  texPosNvec[2] = texPos - zvec;\n" 
 1094    for (
auto& gradComp : results_texPos)
 
 1098        mapper, inputs, noOfComponents, independentComponents, useGradYAxis, gradComp.second);
 
 1099      shaderStr += std::string(
"  scalar = texture3D(volume,") + gradComp.second +
 
 1100        std::string(
")[c];\n" 
 1101                    "  scalar = scalar * in_volume_scale[index][c] + in_volume_bias[index][c];\n") +
 
 1102        opacityTFcall + gradComp.first + 
" = opacity;\n";
 
 1108        std::string(
"  vec4 g1ObjDataPos[3], g2ObjDataPos[3];\n" 
 1109                    "  for (int i = 0; i < 3; ++i)\n" 
 1111                    "    g1ObjDataPos[i] = clip_texToObjMat * vec4(texPosPvec[i], 1.0);\n" 
 1112                    "    if (g1ObjDataPos[i].w != 0.0)\n" 
 1114                    "      g1ObjDataPos[i] /= g1ObjDataPos[i].w;\n" 
 1116                    "    g2ObjDataPos[i] = clip_texToObjMat * vec4(texPosNvec[i], 1.0);\n" 
 1117                    "    if (g2ObjDataPos[i].w != 0.0)\n" 
 1119                    "      g2ObjDataPos[i] /= g2ObjDataPos[i].w;\n" 
 1123                    "  for (int i = 0; i < clip_numPlanes && !g_skip; i = i + 6)\n" 
 1125                    "    vec3 planeOrigin = vec3(in_clippingPlanes[i + 1],\n" 
 1126                    "                            in_clippingPlanes[i + 2],\n" 
 1127                    "                            in_clippingPlanes[i + 3]);\n" 
 1128                    "    vec3 planeNormal = normalize(vec3(in_clippingPlanes[i + 4],\n" 
 1129                    "                                      in_clippingPlanes[i + 5],\n" 
 1130                    "                                      in_clippingPlanes[i + 6]));\n" 
 1131                    "    for (int j = 0; j < 3; ++j)\n" 
 1133                    "      if (dot(vec3(planeOrigin - g1ObjDataPos[j].xyz), planeNormal) > 0)\n" 
 1135                    "        g1[j] = in_clippedVoxelIntensity;\n" 
 1137                    "      if (dot(vec3(planeOrigin - g2ObjDataPos[j].xyz), planeNormal) > 0)\n" 
 1139                    "        g2[j] = in_clippedVoxelIntensity;\n" 
 1149        std::string(
"  // Central differences: (F_front - F_back) / 2h\n" 
 1150                    "  // This version of computeGradient() is only used for lighting\n" 
 1151                    "  // calculations (only direction matters), hence the difference is\n" 
 1152                    "  // not scaled by 2h and a dummy gradient mag is returned (-1.).\n" 
 1153                    "  return vec4((g1 - g2) / in_cellSpacing[index], -1.0);\n" 
 1158      shaderStr += std::string(
 
 1159        "  // Scale values the actual scalar range.\n" 
 1160        "  float range = in_scalarsRange[4*index+c][1] - in_scalarsRange[4*index+c][0];\n" 
 1161        "  g1 = in_scalarsRange[4*index+c][0] + range * g1;\n" 
 1162        "  g2 = in_scalarsRange[4*index+c][0] + range * g2;\n" 
 1164        "  // Central differences: (F_front - F_back) / 2h\n" 
 1167        "  float avgSpacing = (in_cellSpacing[index].x +\n" 
 1168        "   in_cellSpacing[index].y + in_cellSpacing[index].z) / 3.0;\n" 
 1169        "  vec3 aspect = in_cellSpacing[index] * 2.0 / avgSpacing;\n" 
 1171        "  float grad_mag = length(g2);\n" 
 1173        "  // Handle normalizing with grad_mag == 0.0\n" 
 1174        "  g2 = grad_mag > 0.0 ? normalize(g2) : vec3(0.0);\n" 
 1176        "  // Since the actual range of the gradient magnitude is unknown,\n" 
 1177        "  // assume it is in the range [0, 0.25 * dataRange].\n" 
 1178        "  range = range != 0 ? range : 1.0;\n" 
 1179        "  grad_mag = grad_mag / (0.25 * range);\n" 
 1180        "  grad_mag = clamp(grad_mag, 0.0, 1.0);\n" 
 1182        "  return vec4(g2.xyz, grad_mag);\n" 
 1188    shaderStr += functionSignature +
 
 1190                  "  return vec4(0.0);\n" 
 1207float phase_function(float cos_angle) 
 1216float g_anisotropy2 = in_anisotropy * in_anisotropy; 
 1218float phase_function(float cos_angle) 
 1220  float d = 1.0 + g_anisotropy2 - 2.0 * in_anisotropy * cos_angle; 
 1221  return (1.0 - g_anisotropy2) / (d * sqrt(d)); 
 1231  vtkVolume* vol, 
int noOfComponents, 
int independentComponents, 
int totalNumberOfLights,
 
 1232  int numberPositionalLights, 
bool defaultLighting)
 
 1236  std::string shaderStr = std::string(
"\ 
 1237      \nvec4 computeLighting(vec4 color, int component, float label)\ 
 1239      \n  vec4 finalColor = vec4(0.0);\n");
 
 1242  int const shadeReqd = volProperty->
GetShade() &&
 
 1250  std::string volumetricCall = volumetricShadow
 
 1251    ? 
"\n   vol_shadow = volumeShadow(g_dataPos, tex_light.xyz, 0.0, component, in_volume[0], " 
 1254  std::string volumetricDeclarations =
 
 1255    volumetricShadow ? 
"\n  float vol_shadow = 1.0;\n  vec4 tex_light = vec4(0.0);\n" : 
"\n";
 
 1264        std::string(
"  vec4 shading_gradient = computeDensityGradient(g_dataPos, component, " 
 1265                    "in_volume[0], 0, label);\n");
 
 1270      shaderStr += std::string(
 
 1271        "  vec4 shading_gradient = computeGradient(g_dataPos, component, in_volume[0], 0);\n");
 
 1282        std::string(
"  vec4 gradient = computeGradient(g_dataPos, component, in_volume[0], 0);\n");
 
 1287      shaderStr += std::string(
"  vec4 gradient = shading_gradient;\n");
 
 1293    if (defaultLighting)
 
 1296  vec3 diffuse = vec3(0.0); 
 1297  vec3 specular = vec3(0.0); 
 1298  vec3 normal = shading_gradient.xyz; 
 1299  float normalLength = length(normal); 
 1300  if (normalLength > 0.0) 
 1302    normal = normalize(normal); 
 1306    normal = vec3(0.0, 0.0, 0.0); 
 1308  // XXX: normal is oriented inside the volume, so we take -g_ldir/-g_vdir 
 1309  float nDotL = dot(normal, -g_ldir[0]); 
 1310  vec3 r = normalize(2.0 * nDotL * normal + g_ldir[0]); 
 1311  float vDotR = dot(r, -g_vdir[0]); 
 1312  if (nDotL < 0.0 && in_twoSidedLighting) 
 1318    diffuse = nDotL * in_diffuse[component] * 
 1319    in_lightDiffuseColor[0] * color.rgb; 
 1320    vDotR = max(vDotR, 0.0); 
 1321    specular = pow(vDotR, in_shininess[component]) * 
 1322                 in_specular[component] * 
 1323                 in_lightSpecularColor[0]; 
 1325  // For the headlight, ignore the light's ambient color 
 1326  // for now as it is causing the old mapper tests to fail 
 1327  finalColor.xyz = in_ambient[component] * color.rgb + 
 1332    else if (totalNumberOfLights > 0)
 
 1335  g_fragWorldPos = g_texToView * vec4(g_dataPos, 1.0); 
 1336  if (g_fragWorldPos.w != 0.0) 
 1338  g_fragWorldPos /= g_fragWorldPos.w; 
 1340  vec3 viewDirection = normalize(-g_fragWorldPos.xyz); 
 1341  vec3 ambient = vec3(0,0,0); 
 1342  vec3 diffuse = vec3(0,0,0); 
 1343  vec3 specular = vec3(0,0,0); 
 1344  vec3 vertLightDirection; 
 1345  vec3 normal = normalize((in_textureToEye[0] * vec4(shading_gradient.xyz, 0.0)).xyz); 
 1349      if (numberPositionalLights > 0)
 
 1352  for (int posNum = 0; posNum < NUMBER_POS_LIGHTS; posNum++) 
 1354    float attenuation = 1.0; 
 1355    lightDir = in_lightDirection[posNum]; 
 1356    vertLightDirection = (g_fragWorldPos.xyz - in_lightPosition[posNum]); 
 1357    float distance = length(vertLightDirection); 
 1358    vertLightDirection = normalize(vertLightDirection); 
 1360                  (in_lightAttenuation[posNum].x 
 1361                  + in_lightAttenuation[posNum].y * distance 
 1362                  + in_lightAttenuation[posNum].z * distance * distance); 
 1363    // per OpenGL standard cone angle is 90 or less for a spot light 
 1364    if (in_lightConeAngle[posNum] <= 90.0) 
 1366      float coneDot = dot(vertLightDirection, lightDir); 
 1367      // if inside the cone 
 1368      if (coneDot >= cos(radians(in_lightConeAngle[posNum]))) 
 1370        attenuation = attenuation * pow(coneDot, in_lightExponent[posNum]); 
 1378    float nDotL = dot(normal, vertLightDirection); 
 1379    if (nDotL < 0.0 && in_twoSidedLighting) 
 1385      float df = max(0.0, attenuation * nDotL); 
 1386      diffuse += (df * in_lightDiffuseColor[posNum]); 
 1387      vec3 r = normalize(2.0 * nDotL * normal - vertLightDirection); 
 1388      float rDotV = dot(-viewDirection, r); 
 1389      if (rDotV < 0.0 && in_twoSidedLighting) 
 1395        float sf = attenuation * pow(rDotV, in_shininess[component]); 
 1396        specular += (sf * in_lightSpecularColor[posNum]); 
 1399    ambient += in_lightAmbientColor[posNum]; 
 1405  for (int dirNum = NUMBER_POS_LIGHTS; dirNum < TOTAL_NUMBER_LIGHTS; dirNum++) 
 1407    vertLightDirection = in_lightDirection[dirNum]; 
 1408    float nDotL = dot(normal, vertLightDirection); 
 1409    if (nDotL < 0.0 && in_twoSidedLighting) 
 1415      float df = max(0.0, nDotL); 
 1416      diffuse += (df * in_lightDiffuseColor[dirNum]); 
 1417      vec3 r = normalize(2.0 * nDotL * normal - vertLightDirection); 
 1418      float rDotV = dot(-viewDirection, r); 
 1421        float sf = pow(rDotV, in_shininess[component]); 
 1422        specular += (sf * in_lightSpecularColor[dirNum]); 
 1425    ambient += in_lightAmbientColor[dirNum]; 
 1427  finalColor.xyz = in_ambient[component] * ambient + 
 1428                   in_diffuse[component] * diffuse * color.rgb + 
 1429                   in_specular[component] * specular; 
 1436    shaderStr += std::string(
"\n  finalColor = vec4(color.rgb, 0.0);");
 
 1443    std::string blendingFormula = std::string(
"  float vol_coef = ") +
 
 1444      (vsBlend < 1.0 ? 
"2.0 * in_volumetricScatteringBlending * exp( - 2.0 * " 
 1445                       "in_volumetricScatteringBlending * shading_gradient.w * color.a)" 
 1446                     : 
"2.0 * (1.0 - in_volumetricScatteringBlending) * exp( - 2.0 * " 
 1447                       "in_volumetricScatteringBlending * shading_gradient.w * color.a) + 2.0 * " 
 1448                       "in_volumetricScatteringBlending - 1.0") +
 
 1455              "vec3 view_tdir = normalize((g_eyeToTexture * vec4(viewDirection, 0.0)).xyz);\n")) +
 
 1457  vec3 secondary_contrib = vec3(0.0); 
 1458  vec3 tex_light = vec3(0.0); 
 1459  shading_gradient.w = length(shading_gradient.xyz); 
 1460  vec3 diffuse_light = vec3(0.0); 
 1461  float attenuation = 0.0; 
 1462  float vol_shadow = 0.0; 
 1466    if (defaultLighting)
 
 1469  tex_light = (in_inverseTextureDatasetMatrix[0] * in_inverseVolumeMatrix[0] * vec4(in_cameraPos, 1.0)).xyz; 
 1470  phase = phase_function(-1); // always angle of pi 
 1471  vol_shadow = volumeShadow(g_dataPos, tex_light, 1.0, component, in_volume[0], 0, label); 
 1472  secondary_contrib += vol_shadow * phase * color.rgb * in_diffuse[component] * in_lightDiffuseColor[0]; 
 1473  secondary_contrib += in_ambient[component] * in_lightAmbientColor[0]; 
 1478      if (numberPositionalLights > 0)
 
 1481  float dist_light = 0.0; 
 1482  for(int posNum = 0; posNum < NUMBER_POS_LIGHTS; posNum++) 
 1484    tex_light = g_lightPositionTex[posNum]; 
 1485    vec3 light_vert = g_fragWorldPos.xyz - in_lightPosition[posNum]; 
 1486    dist_light = length(light_vert); 
 1487    float light_angle = dot(normalize(light_vert), normalize(in_lightDirection[posNum])); 
 1488    phase = phase_function(dot(normalize(g_dataPos - tex_light), view_tdir)); 
 1490                  (in_lightAttenuation[posNum].x 
 1491                  + in_lightAttenuation[posNum].y * dist_light 
 1492                  + in_lightAttenuation[posNum].z * dist_light * dist_light); 
 1493    attenuation *= max(0.0, sign(light_angle - cos(radians(in_lightConeAngle[posNum])))) 
 1494                     * pow(light_angle, in_lightExponent[posNum]); 
 1495    vol_shadow = volumeShadow(g_dataPos, tex_light, 1.0, component, in_volume[0], 0, label); 
 1496    secondary_contrib += vol_shadow * phase * attenuation * color.rgb * in_diffuse[component] * in_lightDiffuseColor[posNum]; 
 1497    secondary_contrib += in_ambient[component] * in_lightAmbientColor[posNum]; 
 1503  for(int dirNum = NUMBER_POS_LIGHTS; dirNum < TOTAL_NUMBER_LIGHTS; dirNum++) 
 1505    tex_light = g_lightDirectionTex[dirNum]; 
 1506    phase = phase_function(dot(normalize(-tex_light), view_tdir)); 
 1507    vol_shadow = volumeShadow(g_dataPos, tex_light, 0.0, component, in_volume[0], 0, label); 
 1508    secondary_contrib += vol_shadow * phase * color.rgb * in_diffuse[component] * in_lightDiffuseColor[dirNum]; 
 1509    secondary_contrib += in_ambient[component] * in_lightAmbientColor[dirNum]; 
 1514    shaderStr += blendingFormula + 
 1516  finalColor.xyz = (1.0 - vol_coef) * finalColor.xyz + vol_coef * secondary_contrib; 
 1526    if (noOfComponents == 1 || !independentComponents)
 
 1530        shaderStr += std::string(
"\ 
 1531            \n  if (gradient.w >= 0.0 && label == 0.0)\ 
 1533            \n    color.a *= computeGradientOpacity(gradient);\ 
 1538        shaderStr += std::string(
"\ 
 1539            \n  if (gradient.w >= 0.0 && label > 0.0)\ 
 1541            \n    color.a *= computeGradientOpacityForLabel(gradient, label);\ 
 1545    else if (noOfComponents > 1 && independentComponents && volProperty->
HasGradientOpacity())
 
 1547      shaderStr += std::string(
"\ 
 1548        \n  if (gradient.w >= 0.0)\ 
 1550        \n    for (int i = 0; i < in_noOfComponents; ++i)\ 
 1552        \n      color.a = color.a *\ 
 1553        \n      computeGradientOpacity(gradient, i) * in_componentWeight[i];\ 
 1559  shaderStr += std::string(
"\ 
 1560      \n  finalColor.a = color.a;\ 
 1561      \n  return finalColor;\ 
 1570  int vtkNotUsed(totalNumberOfLights), 
bool defaultLighting)
 
 1574  std::string shaderStr = std::string();
 
 1579    shaderStr += std::string(
"\ 
 1580      \nvec4 computeLighting(vec3 texPos, vec4 color, const in sampler2D gradientTF, const in sampler3D volume, const in sampler2D opacityTF, const int volIdx, int component)\ 
 1582      \n  vec4 finalColor = vec4(0.0);\n");
 
 1586    shaderStr += std::string(
"\ 
 1587      \nvec4 computeLighting(vec3 texPos, vec4 color, const in sampler3D volume, const in sampler2D opacityTF, const int volIdx, int component)\ 
 1589      \n  vec4 finalColor = vec4(0.0);\n");
 
 1593  int const shadeReqd = volProperty->
GetShade() &&
 
 1611        shaderStr += 
"  vec4 shading_gradient = computeDensityGradient(texPos, component, volume, " 
 1612                     "opacityTF, gradientTF, volIdx, 0.0);\n";
 
 1616        shaderStr += 
"  vec4 shading_gradient = computeDensityGradient(texPos, component, volume, " 
 1617                     "opacityTF, volIdx, 0.0);\n";
 
 1623        "  vec4 shading_gradient = computeGradient(texPos, component, volume, volIdx);\n";
 
 1632      shaderStr += 
"  vec4 gradient = computeGradient(texPos, component, volume, volIdx);\n";
 
 1637      shaderStr += 
"  vec4 gradient = shading_gradient;\n";
 
 1641  if (shadeReqd && defaultLighting)
 
 1643    shaderStr += std::string(
"\ 
 1644        \n  vec3 diffuse = vec3(0.0);\ 
 1645        \n  vec3 specular = vec3(0.0);\ 
 1646        \n  vec3 normal = shading_gradient.xyz;\ 
 1647        \n  float normalLength = length(normal);\ 
 1648        \n  if (normalLength > 0.0)\ 
 1650        \n    normal = normalize(normal);\ 
 1654        \n    normal = vec3(0.0, 0.0, 0.0);\ 
 1656        \n   // normal is oriented inside the volume (because normal = gradient, oriented inside the volume)\ 
 1657        \n   // thus we have to take minus everything\ 
 1658        \n   float nDotL = dot(normal, -g_ldir[volIdx]);\ 
 1659        \n   vec3 r = normalize(2.0 * nDotL * normal + g_ldir[volIdx]);\ 
 1660        \n   float vDotR = dot(r, -g_vdir[volIdx]);\ 
 1661        \n   if (nDotL < 0.0 && in_twoSidedLighting)\ 
 1665        \n   if (nDotL > 0.0)\ 
 1667        \n        diffuse = nDotL * in_diffuse[component] *\ 
 1668        \n                 in_lightDiffuseColor[0] * color.rgb;\ 
 1669        \n        vDotR = max(vDotR, 0.0);\ 
 1670        \n        specular = pow(vDotR, in_shininess[component]) *\ 
 1671        \n                   in_specular[component] *\ 
 1672        \n                   in_lightSpecularColor[0];\ 
 1674        \n  // For the headlight, ignore the light's ambient color\ 
 1675        \n  // for now as it is causing the old mapper tests to fail\ 
 1676        \n  finalColor.xyz = in_ambient[component] * color.rgb +\ 
 1677        \n                   diffuse + specular;\ 
 1682    shaderStr += std::string(
"\n  finalColor = vec4(color.rgb, 0.0);");
 
 1689    if (volProperty->
HasGradientOpacity() && (noOfComponents == 1 || !independentComponents))
 
 1691      shaderStr += std::string(
"\ 
 1692          \n  if (gradient.w >= 0.0)\ 
 1694          \n    color.a = color.a *\ 
 1695          \n              computeGradientOpacity(gradient, gradientTF);\ 
 1700  shaderStr += std::string(
"\ 
 1701      \n  finalColor.a = color.a;\ 
 1702      \n  return clamp(finalColor, 0.0, 1.0);\ 
 1714    return std::string(
"\ 
 1715        \nvec3 computeRayDirection()\ 
 1717        \n  return normalize(ip_vertexPos.xyz - g_eyePosObj.xyz);\ 
 1722    return std::string(
"\ 
 1723        \nuniform vec3 in_projectionDirection;\ 
 1724        \nvec3 computeRayDirection()\ 
 1726        \n  return normalize((in_inverseVolumeMatrix[0] *\ 
 1727        \n                   vec4(in_projectionDirection, 0.0)).xyz);\ 
 1737  if (inputs.size() > 1)
 
 1740    for (
auto& item : inputs)
 
 1742      const auto& prop = item.second.Volume->GetProperty();
 
 1746      auto& map = item.second.RGBTablesMap;
 
 1747      const auto numComp = map.size();
 
 1749        "uniform sampler2D " + ArrayBaseName(map[0]) + 
"[" + std::to_string(numComp) + 
"];\n";
 
 1757      resStr += 
"uniform sampler2D " + ArrayBaseName(inputs[0].RGBTablesMap[0]) + 
"[" +
 
 1758        std::to_string(noOfComponents) + 
"];\n";
 
 1768  int independentComponents, std::map<int, std::string> colorTableMap)
 
 1770  std::ostringstream ss;
 
 1772  std::string shaderStr = ss.str();
 
 1773  if (noOfComponents == 1)
 
 1775    shaderStr += std::string(
"\ 
 1776          \nvec4 computeColor(vec4 scalar, float opacity)\ 
 1778          \n  return clamp(computeLighting(vec4(texture2D(" +
 
 1779      colorTableMap[0] + 
",\ 
 1780          \n                         vec2(scalar.w, 0.0)).xyz, opacity), 0, 0.0), 0.0, 1.0);\ 
 1784  else if (noOfComponents > 1 && independentComponents)
 
 1786    std::ostringstream toString;
 
 1788    shaderStr += std::string(
"\ 
 1789          \nvec4 computeColor(vec4 scalar, float opacity, int component)\ 
 1792    for (
int i = 0; i < noOfComponents; ++i)
 
 1795      shaderStr += std::string(
"\ 
 1796            \n  if (component == " +
 
 1797        toString.str() + 
")");
 
 1799      shaderStr += std::string(
"\ 
 1801            \n    return clamp(computeLighting(vec4(texture2D(\ 
 1804      shaderStr += std::string(
", vec2(\ 
 1806        toString.str() + 
"],0.0)).xyz,\ 
 1808        toString.str() + 
", 0.0), 0.0, 1.0);\ 
 1816    shaderStr += std::string(
"\n  }");
 
 1819  else if (noOfComponents == 2 && !independentComponents)
 
 1821    shaderStr += std::string(
"\ 
 1822          \nvec4 computeColor(vec4 scalar, float opacity)\ 
 1824          \n  return clamp(computeLighting(vec4(texture2D(" +
 
 1825      colorTableMap[0] + 
",\ 
 1826          \n                                        vec2(scalar.x, 0.0)).xyz,\ 
 1827          \n                              opacity), 0, 0.0), 0.0, 1.0);\ 
 1833    shaderStr += std::string(
"\ 
 1834          \nvec4 computeColor(vec4 scalar, float opacity)\ 
 1836          \n  return clamp(computeLighting(vec4(scalar.xyz, opacity), 0, 0.0), 0.0, 1.0);\ 
 1846  std::ostringstream ss;
 
 1848  std::map<int, std::string> lastColorTableMap;
 
 1849  for (
auto& item : inputs)
 
 1851    auto prop = item.second.Volume->GetProperty();
 
 1854    auto& map = item.second.RGBTablesMap;
 
 1855    lastComponentMode = item.second.ComponentMode;
 
 1856    lastColorTableMap = map;
 
 1861    ss << 
"vec4 computeColor(vec4 scalar, const in sampler2D colorTF)\ 
 1863      \n  return clamp(computeLighting(vec4(texture2D(colorTF,\ 
 1864      \n                         vec2(scalar.w, 0.0)).xyz, opacity), 0), 0.0, 1.0);\ 
 1869    std::ostringstream colorDec;
 
 1870    colorDec << 
"  vec3 color = ";
 
 1874      colorDec << 
"scalar.xyz;\n";
 
 1881      colorDec << 
"texture2D(colorTF, vec2(scalar.w, 0.0)).xyz;\n";
 
 1887        << 
"vec4 computeColor(vec3 texPos, vec4 scalar, float opacity, const in sampler2D colorTF, " 
 1888           "const in sampler2D gradientTF, const in sampler3D volume, const in sampler2D " 
 1889           "opacityTF, const int volIdx)\n\n" 
 1891      ss << colorDec.str()
 
 1892         << 
"  return clamp(computeLighting(texPos, vec4(color, opacity), gradientTF, volume, " 
 1894            "volIdx, 0), 0.0, 1.0);\n" 
 1900        << 
"vec4 computeColor(vec3 texPos, vec4 scalar, float opacity, const in sampler2D colorTF, " 
 1901           "const in sampler3D volume, const in sampler2D opacityTF, const int volIdx)\n\n" 
 1903      ss << colorDec.str()
 
 1904         << 
"  return clamp(computeLighting(texPos, vec4(color, opacity), volume, opacityTF," 
 1905            "volIdx, 0), 0.0, 1.0);\n" 
 1917  std::ostringstream ss;
 
 1918  for (
auto& item : inputs)
 
 1920    auto prop = item.second.Volume->GetProperty();
 
 1924    auto& map = item.second.OpacityTablesMap;
 
 1925    const auto numComp = map.size();
 
 1926    ss << 
"uniform sampler2D " << ArrayBaseName(map[0]) << 
"[" << numComp << 
"];\n";
 
 1929  ss << 
"float computeOpacity(vec4 scalar, const in sampler2D opacityTF)\n" 
 1931        "  return texture2D(opacityTF, vec2(scalar.w, 0)).r;\n" 
 1940  std::ostringstream ss;
 
 1942  for (
auto& item : inputs)
 
 1944    auto prop = item.second.Volume->GetProperty();
 
 1948    auto& map = item.second.GradientOpacityTablesMap;
 
 1949    const auto numComp = map.size();
 
 1950    ss << 
"uniform sampler2D " << ArrayBaseName(map[0]) << 
"[" << numComp << 
"];\n";
 
 1953  ss << 
"float computeGradientOpacity(vec4 grad, const in sampler2D gradientTF)\n" 
 1955        "  return texture2D(gradientTF, vec2(grad.w, 0.0)).r;\n" 
 1963  int independentComponents, std::map<int, std::string> opacityTableMap)
 
 1965  std::ostringstream ss;
 
 1966  ss << 
"uniform sampler2D " << ArrayBaseName(opacityTableMap[0]) << 
"[" << noOfComponents
 
 1969  std::string shaderStr = ss.str();
 
 1970  if (noOfComponents > 1 && independentComponents)
 
 1972    shaderStr += std::string(
"\ 
 1973        \nfloat computeOpacity(vec4 scalar, int component)\ 
 1976    for (
int i = 0; i < noOfComponents; ++i)
 
 1978      std::ostringstream toString;
 
 1980      shaderStr += std::string(
"\ 
 1981          \n  if (component == " +
 
 1982        toString.str() + 
")");
 
 1984      shaderStr += std::string(
"\ 
 1986          \n    return texture2D(" +
 
 1987        opacityTableMap[i]);
 
 1989      shaderStr += std::string(
",vec2(scalar[" + toString.str() + 
"], 0)).r;\ 
 1993    shaderStr += std::string(
"\n}");
 
 1996  else if (noOfComponents == 2 && !independentComponents)
 
 1998    shaderStr += std::string(
"\ 
 1999        \nfloat computeOpacity(vec4 scalar)\ 
 2001        \n  return texture2D(" +
 
 2002      opacityTableMap[0] + 
", vec2(scalar.y, 0)).r;\ 
 2008    shaderStr += std::string(
"\ 
 2009        \nfloat computeOpacity(vec4 scalar)\ 
 2011        \n  return texture2D(" +
 
 2012      opacityTableMap[0] + 
", vec2(scalar.w, 0)).r;\ 
 2020  int vtkNotUsed(independentComponents), std::map<int, std::string> colorTableMap)
 
 2022  if (noOfComponents == 1)
 
 2026      "vec4 computeColor(vec4 scalar, float opacity)\n" 
 2028      "  vec4 yscalar = texture3D(in_transfer2DYAxis, g_dataPos);\n" 
 2029      "  yscalar.r = yscalar.r * in_transfer2DYAxis_scale.r + in_transfer2DYAxis_bias.r;\n" 
 2030      "  yscalar = vec4(yscalar.r);\n" 
 2031      "  vec4 color = texture2D(" +
 
 2034      "                         vec2(scalar.w, yscalar.w));\n" 
 2035      "  return computeLighting(color, 0, 0);\n" 
 2038  return std::string(
"vec4 computeColor(vec4 scalar, float opacity)\n" 
 2040                     "  return vec4(0, 0, 0, 0)\n" 
 2047  int independentComponents, std::map<int, std::string> colorTableMap, 
int useGradient)
 
 2053  if (noOfComponents == 1)
 
 2056    return std::string(
"vec4 computeColor(vec4 scalar, float opacity)\n" 
 2058                       "  vec4 color = texture2D(" +
 
 2061      "    vec2(scalar.w, g_gradients_0[0].w));\n" 
 2062      "  return computeLighting(color, 0, 0);\n" 
 2065  else if (noOfComponents > 1 && independentComponents)
 
 2068    std::string shaderStr;
 
 2069    shaderStr += std::string(
"vec4 computeColor(vec4 scalar, float opacity, int component)\n" 
 2072    for (
int i = 0; i < noOfComponents; ++i)
 
 2074      std::ostringstream toString;
 
 2076      std::string 
const num = toString.str();
 
 2077      shaderStr += std::string(
"  if (component == " + num +
 
 2080        "    vec4 color = texture2D(" +
 
 2084        num + 
"], g_gradients_0[" + num +
 
 2086        "    return computeLighting(color, " +
 
 2091    shaderStr += std::string(
"}\n");
 
 2095  else if (noOfComponents == 2 && !independentComponents)
 
 2098    return std::string(
"vec4 computeColor(vec4 scalar, float opacity)\n" 
 2100                       "  vec4 color = texture2D(" +
 
 2103      "    vec2(scalar.x, g_gradients_0[0].w));\n" 
 2104      "  return computeLighting(color, 0, 0.0);\n" 
 2109    return std::string(
"vec4 computeColor(vec4 scalar, float opacity)\n" 
 2111                       "  return computeLighting(vec4(scalar.xyz, opacity), 0, 0.0);\n" 
 2119  std::ostringstream ss;
 
 2120  for (
auto& item : inputs)
 
 2122    auto prop = item.second.Volume->GetProperty();
 
 2126    auto& map = item.second.TransferFunctions2DMap;
 
 2127    const auto numComp = map.size();
 
 2128    ss << 
"uniform sampler2D " << ArrayBaseName(map[0]) << 
"[" << numComp << 
"];\n";
 
 2131  std::string result = ss.str() +
 
 2132    std::string(
"uniform sampler3D in_transfer2DYAxis;\n" 
 2133                "uniform vec4 in_transfer2DYAxis_scale;\n" 
 2134                "uniform vec4 in_transfer2DYAxis_bias;\n");
 
 2142  int independentComponents, std::map<int, std::string> opacityTableMap, 
int useGradient)
 
 2144  std::ostringstream toString;
 
 2145  if (noOfComponents > 1 && independentComponents)
 
 2148    toString << 
"float computeOpacity(vec4 scalar, int component)\n" 
 2153        << 
"vec4 yscalar = texture3D(in_transfer2DYAxis, g_dataPos);\n" 
 2154           "for (int i = 0; i < 4; ++i)\n" 
 2156           "  yscalar[i] = yscalar[i] * in_transfer2DYAxis_scale[i] + in_transfer2DYAxis_bias[i];\n" 
 2158      if (noOfComponents == 1)
 
 2160        toString << 
"yscalar = vec4(yscalar.r);\n";
 
 2164    for (
int i = 0; i < noOfComponents; ++i)
 
 2168        toString << 
"  if (component == " << i
 
 2171                    "    return texture2D(" 
 2172                 << opacityTableMap[i]
 
 2175                 << i << 
"], g_gradients_0[" << i
 
 2181        toString << 
"  if (component == " << i
 
 2184                    "    return texture2D(" 
 2185                 << opacityTableMap[i]
 
 2188                 << i << 
"], yscalar[" << i
 
 2197  else if (noOfComponents == 2 && !independentComponents)
 
 2202      toString << 
"float computeOpacity(vec4 scalar)\n" 
 2204                  "  return texture2D(" +
 
 2205          opacityTableMap[0] +
 
 2207          "    vec2(scalar.y, g_gradients_0[0].w)).a;\n" 
 2213      toString << 
"float computeOpacity(vec4 scalar)\n" 
 2215                  "  return texture2D(" +
 
 2216          opacityTableMap[0] +
 
 2218          "    vec2(scalar.y, yscalar.y)).a;\n" 
 2228      toString << 
"float computeOpacity(vec4 scalar)\n" 
 2230                  "  return texture2D(" +
 
 2231          opacityTableMap[0] +
 
 2233          "    vec2(scalar.a, g_gradients_0[0].w)).a;\n" 
 2240        << 
"float computeOpacity(vec4 scalar)\n" 
 2242           "  vec4 yscalar = texture3D(in_transfer2DYAxis, g_dataPos);\n" 
 2243           "  yscalar.r = yscalar.r * in_transfer2DYAxis_scale.r + in_transfer2DYAxis_bias.r;\n" 
 2244           "  yscalar = vec4(yscalar.r);\n" 
 2245           "  return texture2D(" +
 
 2246          opacityTableMap[0] +
 
 2248          "    vec2(scalar.a, yscalar.w)).a;\n" 
 2252  return toString.str();
 
 2257  vtkVolume* vtkNotUsed(vol), 
int noOfComponents, 
int independentComponents,
 
 2261  std::string declarations;
 
 2262  std::string functionSignature;
 
 2263  std::string opacityEval;
 
 2264  std::string rayInit;
 
 2266  const size_t numInputs = inputs.size();
 
 2267  const bool hasGradOp = ::HasGradientOpacity(inputs);
 
 2272  functionSignature = 
"float volumeShadow(vec3 sample_position, vec3 light_pos_dir, float is_Pos, " 
 2273                      " in int c, in sampler3D volume, " +
 
 2274    (numInputs > 1 ? std::string(
"in sampler2D opacityTF, ") : std::string()) +
 
 2275    (numInputs > 1 && hasGradOp ? std::string(
"in sampler2D gradTF, ") : std::string()) +
 
 2276    "int index, float label)\n";
 
 2281  vec3 direction = vec3(0.0); 
 2282  vec3 norm_dir = vec3(0.0); 
 2283  float maxdist = 0.0; 
 2286  float opacity = 0.0; 
 2290  float sampled_dist = 0.0; 
 2291  vec3 sampled_point = vec3(0.0); 
 2296  // direction is light_pos_dir when light is directional 
 2297  // and light_pos_dir - sample_position when positional 
 2298  direction = light_pos_dir - is_Pos * sample_position; 
 2299  norm_dir = normalize(direction); 
 2300  // introduce little offset to avoid sampling shadows at the exact 
 2302  sample_position += g_lengthStep * norm_dir; 
 2303  direction = light_pos_dir - is_Pos * sample_position; 
 2304  ray.origin = sample_position; 
 2307  ray.invDir = 1.0/ray.dir; 
 2308  if(!BBoxIntersect(vec3(0.0), vec3(1.0), ray, hit)) 
 2310    // it can happen around the bounding box 
 2313  if(hit.tmax < g_lengthStep) 
 2315    // if we're too close to the bounding box 
 2318  // in case of directional light, we want direction not to be normalized but to go 
 2319  // all the way to the bbox 
 2320  direction *= pow(hit.tmax / length(direction), 1.0 - is_Pos); 
 2321  maxdist = min(hit.tmax, length(direction)); 
 2322  maxdist = min(in_giReach, maxdist); 
 2323  if(maxdist < EPSILON) return 1.0; 
 2329  opacityEval += 
"  scalar = texture3D(volume, sampled_point)[c];\n" 
 2330                 "  scalar = scalar * in_volume_scale[index][c] + in_volume_bias[index][c];\n";
 
 2332    mapper, inputs, noOfComponents, independentComponents, useGradYAxis, 
"sampled_point", 
true);
 
 2334  resStr += functionSignature + 
"{\n" + declarations + rayInit +
 
 2336  float current_dist = 0.0; 
 2337  float current_step = g_lengthStep; 
 2338  float clamped_step = 0.0; 
 2339  while(current_dist < maxdist) 
 2341    clamped_step = min(maxdist - current_dist, current_step); 
 2342    sampled_dist = current_dist + clamped_step * g_jitterValue; 
 2343    sampled_point = sample_position + sampled_dist * norm_dir; 
 2347    shadow *= 1.0 - opacity; 
 2348    current_dist += current_step; 
 2361  return std::string();
 
 2370    return std::string(
"\ 
 2371        \n bool l_firstValue;\ 
 2372        \n vec4 l_maxValue;");
 
 2376    return std::string(
"\ 
 2377        \n bool l_firstValue;\ 
 2378        \n vec4 l_minValue;");
 
 2382    return std::string(
"\ 
 2383        \n  uvec4 l_numSamples;\ 
 2384        \n  vec4 l_avgValue;");
 
 2388    return std::string(
"\ 
 2389        \n  vec4 l_sumValue;");
 
 2393    return std::string(
"\ 
 2394        \n  int l_initialIndex = 0;\ 
 2395        \n  float l_normValues[NUMBER_OF_CONTOURS + 2];");
 
 2399    return std::string();
 
 2409    return std::string(
"\ 
 2410        \n  // We get data between 0.0 - 1.0 range\ 
 2411        \n  l_firstValue = true;\ 
 2412        \n  l_maxValue = vec4(0.0);");
 
 2416    return std::string(
"\ 
 2417        \n  //We get data between 0.0 - 1.0 range\ 
 2418        \n  l_firstValue = true;\ 
 2419        \n  l_minValue = vec4(1.0);");
 
 2423    return std::string(
"\ 
 2424        \n  //We get data between 0.0 - 1.0 range\ 
 2425        \n  l_avgValue = vec4(0.0);\ 
 2426        \n  // Keep track of number of samples\ 
 2427        \n  l_numSamples = uvec4(0);");
 
 2431    return std::string(
"\ 
 2432        \n  //We get data between 0.0 - 1.0 range\ 
 2433        \n  l_sumValue = vec4(0.0);");
 
 2437    return std::string(
"\ 
 2438        \n#if NUMBER_OF_CONTOURS\ 
 2439        \n  l_normValues[0] = -1e20; //-infinity\ 
 2440        \n  l_normValues[NUMBER_OF_CONTOURS+1] = +1e20; //+infinity\ 
 2441        \n  for (int i = 0; i < NUMBER_OF_CONTOURS; i++)\ 
 2443        \n    l_normValues[i+1] = (in_isosurfacesValues[i] - in_scalarsRange[0].x) / \ 
 2444        \n                        (in_scalarsRange[0].y - in_scalarsRange[0].x);\ 
 2451    return std::string();
 
 2459  const int numInputs = 
static_cast<int>(inputs.size());
 
 2460  const int comp = numInputs == 1 ?
 
 2462    (!independentComponents ? 1 : numInputs)
 
 2467  std::ostringstream toShader;
 
 2468  for (
const auto& item : inputs)
 
 2470    auto& input = item.second;
 
 2471    if (input.Volume->GetProperty()->HasGradientOpacity())
 
 2473      toShader << 
"vec4 " << input.GradientCacheName << 
"[" << comp << 
"];\n";
 
 2477  return toShader.str();
 
 2482  int noOfComponents = 1, 
int independentComponents = 0)
 
 2484  std::ostringstream shader;
 
 2485  if (independentComponents)
 
 2487    if (noOfComponents == 1)
 
 2489      shader << 
"g_gradients_0[0] = computeGradient(g_dataPos, 0, in_volume[0], 0);\n";
 
 2494      shader << 
"for (int comp = 0; comp < in_noOfComponents; comp++)\n" 
 2496                "  g_gradients_0[comp] = computeGradient(g_dataPos, comp, in_volume[0], 0);\n" 
 2502    shader << 
"g_gradients_0[0] = computeGradient(g_dataPos, 0, in_volume[0], 0);\n";
 
 2505  return shader.str();
 
 2512  std::ostringstream toShaderStr;
 
 2513  toShaderStr << 
"    if (!g_skip)\n" 
 2523      for (
auto& item : inputs)
 
 2525        auto& input = item.second;
 
 2526        auto property = input.Volume->GetProperty();
 
 2528        const auto idx = i + 1;
 
 2533          "      texPos = (in_cellToPoint[" << idx << 
"] * in_inverseTextureDatasetMatrix[" << idx
 
 2534                    << 
"] * in_inverseVolumeMatrix[" << idx
 
 2536                       "        in_volumeMatrix[0] * in_textureDatasetMatrix[0] * " 
 2537                       "vec4(g_dataPos.xyz, 1.0)).xyz;\n" 
 2538                       "      if ((all(lessThanEqual(texPos, vec3(1.0))) &&\n" 
 2539                       "        all(greaterThanEqual(texPos, vec3(0.0)))))\n" 
 2541                       "        vec4 scalar = texture3D(in_volume[" 
 2544                       "        scalar = scalar * in_volume_scale[" 
 2545                    << i << 
"] + in_volume_bias[" << i << 
"];\n";
 
 2548        if (property->GetIndependentComponents())
 
 2550          toShaderStr << 
"        scalar = vec4(scalar.r);\n";
 
 2553        toShaderStr << 
"        g_srcColor = vec4(0.0);\n";
 
 2557          std::string gradientopacity_param = (
property->HasGradientOpacity())
 
 2558            ? input.GradientOpacityTablesMap[0] + std::string(
", ")
 
 2561          toShaderStr << 
"        g_srcColor.a = computeOpacity(scalar," 
 2562                      << input.OpacityTablesMap[0]
 
 2564                         "        if (g_srcColor.a > 0.0)\n" 
 2566                         "          g_srcColor = computeColor(texPos, scalar, g_srcColor.a, " 
 2567                      << input.RGBTablesMap[0] << 
", " << gradientopacity_param << 
"in_volume[" << i
 
 2568                      << 
"], " << input.OpacityTablesMap[0] << 
", " << i << 
");\n";
 
 2570          if (property->HasGradientOpacity())
 
 2572            const auto& grad = input.GradientCacheName;
 
 2573            toShaderStr << 
"          " << grad << 
"[0] = computeGradient(texPos, 0, " 
 2574                        << 
"in_volume[" << i << 
"], " << i
 
 2578                        << 
"[0].w >= 0.0)\n" 
 2580                           "            g_srcColor.a *= computeGradientOpacity(" 
 2581                        << grad << 
"[0], " << input.GradientOpacityTablesMap[0]
 
 2588          const auto& grad = input.GradientCacheName;
 
 2591            "        " << grad << 
"[0] = computeGradient(texPos, 0, " 
 2592                      << 
"in_volume[" << i << 
"], " << i
 
 2594                         "        g_srcColor = texture2D(" 
 2595                      << input.TransferFunctions2DMap[0] << 
", vec2(scalar.r, " 
 2596                      << input.GradientCacheName
 
 2598                         "        if (g_srcColor.a > 0.0)\n" 
 2603          << 
"          g_srcColor.rgb *= g_srcColor.a;\n" 
 2604             "          g_fragColor = (1.0f - g_fragColor.a) * g_srcColor + g_fragColor;\n" 
 2613  toShaderStr << 
"    }\n";
 
 2615  return toShaderStr.str();
 
 2621  int noOfComponents, 
int independentComponents = 0)
 
 2625  std::string shaderStr;
 
 2627  shaderStr += std::string(
"\ 
 2634    shaderStr += std::string(
"\ 
 2635      \n      // Compute IJK vertex position for current sample in the rectilinear grid\ 
 2636      \n      vec4 dataPosWorld = in_volumeMatrix[0] * in_textureDatasetMatrix[0] * vec4(g_dataPos, 1.0);\ 
 2637      \n      dataPosWorld = dataPosWorld / dataPosWorld.w;\ 
 2638      \n      dataPosWorld.w = 1.0;\ 
 2639      \n      ivec3 ijk = ivec3(0);\ 
 2640      \n      vec3 ijkTexCoord = vec3(0.0);\ 
 2641      \n      vec3 pCoords = vec3(0.0);\ 
 2642      \n      vec3 xPrev, xNext, tmp;\ 
 2643      \n      int sz = textureSize(in_coordTexs, 0);\ 
 2644      \n      vec4 dataPosWorldScaled = dataPosWorld * vec4(in_coordsScale, 1.0) +\ 
 2645      \n                                vec4(in_coordsBias, 1.0);\ 
 2646      \n      for (int j = 0; j < 3; ++j)\ 
 2648      \n        xPrev = texture1D(in_coordTexs, 0.0).xyz;\ 
 2649      \n        xNext = texture1D(in_coordTexs, (in_coordTexSizes[j] - 1) / sz).xyz;\ 
 2650      \n        if (xNext[j] < xPrev[j])\ 
 2656      \n        for (int i = 0; i < int(in_coordTexSizes[j]); i++)\ 
 2658      \n          xNext = texture1D(in_coordTexs, (i + 0.5) / sz).xyz;\ 
 2659      \n          if (dataPosWorldScaled[j] >= xPrev[j] && dataPosWorldScaled[j] < xNext[j])\ 
 2662      \n            pCoords[j] = (dataPosWorldScaled[j] - xPrev[j]) / (xNext[j] - xPrev[j]);\ 
 2665      \n          else if (dataPosWorldScaled[j] == xNext[j])\ 
 2668      \n            pCoords[j] = 1.0;\ 
 2673      \n        ijkTexCoord[j] = (ijk[j] + pCoords[j]) / in_coordTexSizes[j];\ 
 2675      \n      scalar = texture3D(in_volume[0], sign(in_cellSpacing[0]) * ijkTexCoord);\ 
 2680    shaderStr += std::string(
"\ 
 2681      \n      scalar = texture3D(in_volume[0], g_dataPos);\ 
 2686  if (noOfComponents == 1)
 
 2688    shaderStr += std::string(
"\ 
 2689        \n      scalar.r = scalar.r * in_volume_scale[0].r + in_volume_bias[0].r;\ 
 2690        \n      scalar = vec4(scalar.r);");
 
 2695    shaderStr += std::string(
"\ 
 2696        \n      scalar = scalar * in_volume_scale[0] + in_volume_bias[0];");
 
 2701    if (noOfComponents > 1)
 
 2703      if (!independentComponents)
 
 2705        shaderStr += std::string(
"\ 
 2706            \n      if (l_maxValue.w < scalar.w || l_firstValue)\ 
 2708            \n        l_maxValue = scalar;\ 
 2711            \n     if (l_firstValue)\ 
 2713            \n        l_firstValue = false;\ 
 2718        shaderStr += std::string(
"\ 
 2719           \n      for (int i = 0; i < in_noOfComponents; ++i)\ 
 2721           \n        if (l_maxValue[i] < scalar[i] || l_firstValue)\ 
 2723           \n          l_maxValue[i] = scalar[i];\ 
 2726           \n     if (l_firstValue)\ 
 2728           \n        l_firstValue = false;\ 
 2734      shaderStr += std::string(
"\ 
 2735          \n      if (l_maxValue.w < scalar.x || l_firstValue)\ 
 2737          \n        l_maxValue.w = scalar.x;\ 
 2740          \n     if (l_firstValue)\ 
 2742          \n        l_firstValue = false;\ 
 2748    if (noOfComponents > 1)
 
 2750      if (!independentComponents)
 
 2752        shaderStr += std::string(
"\ 
 2753            \n      if (l_minValue.w > scalar.w || l_firstValue)\ 
 2755            \n        l_minValue = scalar;\ 
 2758            \n     if (l_firstValue)\ 
 2760            \n        l_firstValue = false;\ 
 2765        shaderStr += std::string(
"\ 
 2766          \n      for (int i = 0; i < in_noOfComponents; ++i)\ 
 2768          \n        if (l_minValue[i] < scalar[i] || l_firstValue)\ 
 2770          \n          l_minValue[i] = scalar[i];\ 
 2773          \n     if (l_firstValue)\ 
 2775          \n        l_firstValue = false;\ 
 2781      shaderStr += std::string(
"\ 
 2782          \n      if (l_minValue.w > scalar.x || l_firstValue)\ 
 2784          \n        l_minValue.w = scalar.x;\ 
 2787          \n     if (l_firstValue)\ 
 2789          \n        l_firstValue = false;\ 
 2795    if (noOfComponents > 1 && independentComponents)
 
 2797      shaderStr += std::string(
"\ 
 2798        \n       for (int i = 0; i < in_noOfComponents; ++i)\ 
 2800        \n         // Get the intensity in volume scalar range\ 
 2801        \n         float intensity = in_scalarsRange[i][0] +\ 
 2802        \n                           (in_scalarsRange[i][1] -\ 
 2803        \n                            in_scalarsRange[i][0]) * scalar[i];\ 
 2804        \n         if (in_averageIPRange.x <= intensity &&\ 
 2805        \n             intensity <= in_averageIPRange.y)\ 
 2807        \n           l_avgValue[i] += computeOpacity(scalar, i) * scalar[i];\ 
 2808        \n           ++l_numSamples[i];\ 
 2814      shaderStr += std::string(
"\ 
 2815        \n      // Get the intensity in volume scalar range\ 
 2816        \n      float intensity = in_scalarsRange[0][0] +\ 
 2817        \n                        (in_scalarsRange[0][1] -\ 
 2818        \n                         in_scalarsRange[0][0]) * scalar.x;\ 
 2819        \n      if (in_averageIPRange.x <= intensity &&\ 
 2820        \n          intensity <= in_averageIPRange.y)\ 
 2822        \n        l_avgValue.x += computeOpacity(scalar) * scalar.x;\ 
 2823        \n        ++l_numSamples.x;\ 
 2829    if (noOfComponents > 1 && independentComponents)
 
 2831      shaderStr += std::string(
"\ 
 2832        \n       for (int i = 0; i < in_noOfComponents; ++i)\ 
 2834        \n         float opacity = computeOpacity(scalar, i);\ 
 2835        \n         l_sumValue[i] = l_sumValue[i] + opacity * scalar[i];\ 
 2840      shaderStr += std::string(
"\ 
 2841          \n      float opacity = computeOpacity(scalar);\ 
 2842          \n      l_sumValue.x = l_sumValue.x + opacity * scalar.x;");
 
 2847    shaderStr += std::string(
"\ 
 2848        \n#if NUMBER_OF_CONTOURS\ 
 2849        \n    int maxComp = 0;");
 
 2851    std::string compParamStr;
 
 2852    if (noOfComponents > 1 && independentComponents)
 
 2854      shaderStr += std::string(
"\ 
 2855          \n    for (int i = 1; i < in_noOfComponents; ++i)\ 
 2857          \n      if (in_componentWeight[i] > in_componentWeight[maxComp])\ 
 2860      compParamStr = 
", maxComp";
 
 2862    shaderStr += std::string(
"\ 
 2863        \n    if (g_currentT == 0)\ 
 2865        \n      l_initialIndex = findIsoSurfaceIndex(scalar[maxComp], l_normValues);\ 
 2870        \n      bool shade = false;\ 
 2871        \n      l_initialIndex = clamp(l_initialIndex, 0, NUMBER_OF_CONTOURS);\ 
 2872        \n      if (scalar[maxComp] < l_normValues[l_initialIndex])\ 
 2874        \n        s = l_normValues[l_initialIndex];\ 
 2875        \n        l_initialIndex--;\ 
 2878        \n      if (scalar[maxComp] > l_normValues[l_initialIndex+1])\ 
 2880        \n        s = l_normValues[l_initialIndex+1];\ 
 2881        \n        l_initialIndex++;\ 
 2884        \n      if (shade == true)\ 
 2886        \n        vec4 vs = vec4(s);\ 
 2887        \n        g_srcColor.a = computeOpacity(vs " +
 
 2889        \n        g_srcColor = computeColor(vs, g_srcColor.a " +
 
 2891        \n        g_srcColor.rgb *= g_srcColor.a;\ 
 2892        \n        g_fragColor = (1.0f - g_fragColor.a) * g_srcColor + g_fragColor;\ 
 2899    shaderStr += std::string(
"\ 
 2900        \n    // test if the intersection is inside the volume bounds\ 
 2901        \n    if (any(greaterThan(g_dataPos, vec3(1.0))) || any(lessThan(g_dataPos, vec3(0.0))))\ 
 2905        \n    float opacity = computeOpacity(scalar);\ 
 2906        \n    g_fragColor = computeColor(scalar, opacity);\ 
 2907        \n    g_fragColor.rgb *= opacity;\ 
 2908        \n    g_exit = true;");
 
 2912    if (noOfComponents > 1 && independentComponents)
 
 2914      shaderStr += std::string(
"\ 
 2915          \n      vec4 color[4]; vec4 tmp = vec4(0.0);\ 
 2916          \n      float totalAlpha = 0.0;\ 
 2917          \n      for (int i = 0; i < in_noOfComponents; ++i)\ 
 2923        shaderStr += std::string(
"\ 
 2924            \n        // Data fetching from the red channel of volume texture\ 
 2925            \n        float opacity = computeOpacity(scalar, i);\ 
 2926            \n        if (opacity > 0.0)\ 
 2928            \n          g_srcColor.a = opacity;\ 
 2934        shaderStr += std::string(
"\ 
 2935          \n        // Data fetching from the red channel of volume texture\ 
 2936          \n        color[i][3] = computeOpacity(scalar, i);\ 
 2937          \n        color[i] = computeColor(scalar, color[i][3], i);\ 
 2938          \n        totalAlpha += color[i][3] * in_componentWeight[i];\ 
 2940          \n      if (totalAlpha > 0.0)\ 
 2942          \n        for (int i = 0; i < in_noOfComponents; ++i)\ 
 2944          \n          // Only let visible components contribute to the final color\ 
 2945          \n          if (in_componentWeight[i] <= 0) continue;\ 
 2947          \n          tmp.x += color[i].x * color[i].w * in_componentWeight[i];\ 
 2948          \n          tmp.y += color[i].y * color[i].w * in_componentWeight[i];\ 
 2949          \n          tmp.z += color[i].z * color[i].w * in_componentWeight[i];\ 
 2950          \n          tmp.w += ((color[i].w * color[i].w)/totalAlpha);\ 
 2953          \n      g_fragColor = (1.0f - g_fragColor.a) * tmp + g_fragColor;");
 
 2959      shaderStr += std::string(
"\ 
 2960          \n      g_srcColor = vec4(0.0);\ 
 2961          \n      g_srcColor.a = computeOpacity(scalar);");
 
 2967        shaderStr += std::string(
"\ 
 2968             \n      g_srcColor = vec4(0.0);\ 
 2969             \n      g_srcColor.a = computeOpacity(scalar);\ 
 2970             \n      if (g_srcColor.a > 0.0)\ 
 2972             \n        g_srcColor = computeColor(scalar, g_srcColor.a);");
 
 2975      shaderStr += std::string(
"\ 
 2976           \n        // Opacity calculation using compositing:\ 
 2977           \n        // Here we use front to back compositing scheme whereby\ 
 2978           \n        // the current sample value is multiplied to the\ 
 2979           \n        // currently accumulated alpha and then this product\ 
 2980           \n        // is subtracted from the sample value to get the\ 
 2981           \n        // alpha from the previous steps. Next, this alpha is\ 
 2982           \n        // multiplied with the current sample colour\ 
 2983           \n        // and accumulated to the composited colour. The alpha\ 
 2984           \n        // value from the previous steps is then accumulated\ 
 2985           \n        // to the composited colour alpha.\ 
 2986           \n        g_srcColor.rgb *= g_srcColor.a;\ 
 2987           \n        g_fragColor = (1.0f - g_fragColor.a) * g_srcColor + g_fragColor;");
 
 2991        shaderStr += std::string(
"\ 
 2998    shaderStr += std::string();
 
 3001  shaderStr += std::string(
"\ 
 3010  return std::string(
"\ 
 3011    \n  // Special coloring mode which renders the Prop Id in fragments that\ 
 3012    \n  // have accumulated certain level of opacity. Used during the selection\ 
 3013    \n  // pass vtkHardwareSelection::ACTOR_PASS.\ 
 3014    \n  if (g_fragColor.a > 3.0/ 255.0)\ 
 3016    \n    gl_FragData[0] = vec4(in_propId, 1.0);\ 
 3020    \n    gl_FragData[0] = vec4(0.0);\ 
 3029  return std::string(
"\ 
 3030  \n  // Special coloring mode which renders the voxel index in fragments that\ 
 3031  \n  // have accumulated certain level of opacity. Used during the selection\ 
 3032  \n  // pass vtkHardwareSelection::ID_LOW24.\ 
 3033  \n  if (g_fragColor.a > 3.0/ 255.0)\ 
 3035  \n    uvec3 volumeDim = uvec3(in_textureExtentsMax - in_textureExtentsMin);\ 
 3036  \n    uvec3 voxelCoords = uvec3(volumeDim * g_dataPos);\ 
 3037  \n    // vtkHardwareSelector assumes index 0 to be empty space, so add uint(1).\ 
 3038  \n    uint idx = volumeDim.x * volumeDim.y * voxelCoords.z +\ 
 3039  \n      volumeDim.x * voxelCoords.y + voxelCoords.x + uint(1);\ 
 3040  \n    gl_FragData[0] = vec4(float(idx % uint(256)) / 255.0,\ 
 3041  \n      float((idx / uint(256)) % uint(256)) / 255.0,\ 
 3042  \n      float((idx / uint(65536)) % uint(256)) / 255.0, 1.0);\ 
 3046  \n    gl_FragData[0] = vec4(0.0);\ 
 3055  return std::string(
"\ 
 3056  \n  // Special coloring mode which renders the voxel index in fragments that\ 
 3057  \n  // have accumulated certain level of opacity. Used during the selection\ 
 3058  \n  // pass vtkHardwareSelection::ID_MID24.\ 
 3059  \n  if (g_fragColor.a > 3.0/ 255.0)\ 
 3061  \n    uvec3 volumeDim = uvec3(in_textureExtentsMax - in_textureExtentsMin);\ 
 3062  \n    uvec3 voxelCoords = uvec3(volumeDim * g_dataPos);\ 
 3063  \n    // vtkHardwareSelector assumes index 0 to be empty space, so add uint(1).\ 
 3064  \n    uint idx = volumeDim.x * volumeDim.y * voxelCoords.z +\ 
 3065  \n      volumeDim.x * voxelCoords.y + voxelCoords.x + uint(1);\ 
 3066  \n    idx = ((idx & 0xff000000) >> 24);\ 
 3067  \n    gl_FragData[0] = vec4(float(idx % uint(256)) / 255.0,\ 
 3068  \n      float((idx / uint(256)) % uint(256)) / 255.0,\ 
 3069  \n      float(idx / uint(65536)) / 255.0, 1.0);\ 
 3073  \n    gl_FragData[0] = vec4(0.0);\ 
 3080  vtkVolume* vtkNotUsed(vol), 
int noOfComponents, 
int independentComponents = 0)
 
 3088    return std::string();
 
 3092    if (noOfComponents > 1 && independentComponents)
 
 3094      return std::string(
"\ 
 3095          \n   g_srcColor = vec4(0);\ 
 3096          \n   for (int i = 0; i < in_noOfComponents; ++i)\ 
 3098          \n     vec4 tmp = computeColor(l_maxValue, computeOpacity(l_maxValue, i), i);\ 
 3099          \n     g_srcColor[0] += tmp[0] * tmp[3] * in_componentWeight[i];\ 
 3100          \n     g_srcColor[1] += tmp[1] * tmp[3] * in_componentWeight[i];\ 
 3101          \n     g_srcColor[2] += tmp[2] * tmp[3] * in_componentWeight[i];\ 
 3102          \n     g_srcColor[3] += tmp[3] * in_componentWeight[i];\ 
 3104          \n   g_fragColor = g_srcColor;");
 
 3108      return std::string(
"\ 
 3109         \n  g_srcColor = computeColor(l_maxValue,\ 
 3110         \n                            computeOpacity(l_maxValue));\ 
 3111         \n  g_fragColor.rgb = g_srcColor.rgb * g_srcColor.a;\ 
 3112         \n  g_fragColor.a = g_srcColor.a;");
 
 3117    if (noOfComponents > 1 && independentComponents)
 
 3119      return std::string(
"\ 
 3120          \n  g_srcColor = vec4(0);\ 
 3121          \n  for (int i = 0; i < in_noOfComponents; ++i)\ 
 3123          \n    vec4 tmp = computeColor(l_minValue, computeOpacity(l_minValue, i), i);\ 
 3124          \n    g_srcColor[0] += tmp[0] * tmp[3] * in_componentWeight[i];\ 
 3125          \n    g_srcColor[1] += tmp[1] * tmp[3] * in_componentWeight[i];\ 
 3126          \n    g_srcColor[2] += tmp[2] * tmp[3] * in_componentWeight[i];\ 
 3127          \n    g_srcColor[2] += tmp[3] * tmp[3] * in_componentWeight[i];\ 
 3129          \n  g_fragColor = g_srcColor;");
 
 3133      return std::string(
"\ 
 3134          \n  g_srcColor = computeColor(l_minValue,\ 
 3135          \n                            computeOpacity(l_minValue));\ 
 3136          \n  g_fragColor.rgb = g_srcColor.rgb * g_srcColor.a;\ 
 3137          \n  g_fragColor.a = g_srcColor.a;");
 
 3142    if (noOfComponents > 1 && independentComponents)
 
 3144      return std::string(
"\ 
 3145          \n  for (int i = 0; i < in_noOfComponents; ++i)\ 
 3147          \n    if (l_numSamples[i] == uint(0))\ 
 3151          \n    l_avgValue[i] = l_avgValue[i] * in_componentWeight[i] /\ 
 3152          \n                    l_numSamples[i];\ 
 3155          \n      l_avgValue[0] += l_avgValue[i];\ 
 3158          \n  l_avgValue[0] = clamp(l_avgValue[0], 0.0, 1.0);\ 
 3159          \n  g_fragColor = vec4(vec3(l_avgValue[0]), 1.0);");
 
 3163      return std::string(
"\ 
 3164         \n  if (l_numSamples.x == uint(0))\ 
 3170         \n    l_avgValue.x /= l_numSamples.x;\ 
 3171         \n    l_avgValue.x = clamp(l_avgValue.x, 0.0, 1.0);\ 
 3172         \n    g_fragColor = vec4(vec3(l_avgValue.x), 1.0);\ 
 3178    if (noOfComponents > 1 && independentComponents)
 
 3181      return std::string(
"\ 
 3182          \n  l_sumValue.x *= in_componentWeight.x;\ 
 3183          \n  for (int i = 1; i < in_noOfComponents; ++i)\ 
 3185          \n    l_sumValue.x += l_sumValue[i] * in_componentWeight[i];\ 
 3187          \n  l_sumValue.x = clamp(l_sumValue.x, 0.0, 1.0);\ 
 3188          \n  g_fragColor = vec4(vec3(l_sumValue.x), 1.0);");
 
 3192      return std::string(
"\ 
 3193          \n  l_sumValue.x = clamp(l_sumValue.x, 0.0, 1.0);\ 
 3194          \n  g_fragColor = vec4(vec3(l_sumValue.x), 1.0);");
 
 3199    return std::string();
 
 3207  return std::string();
 
 3214  return std::string(
"\ 
 3215      \n const float g_opacityThreshold = 1.0 - 1.0 / 255.0;");
 
 3222  return std::string(
"\ 
 3223      \n  uniform vec3 in_propId;");
 
 3230  std::string shaderStr;
 
 3231  shaderStr += std::string(
"\ 
 3232      \n  // Flag to indicate if the raymarch loop should terminate \ 
 3233      \n  bool stop = false;\ 
 3235      \n  g_terminatePointMax = 0.0;\ 
 3237      \n  vec4 l_depthValue = texture2D(in_depthSampler, fragTexCoord);\ 
 3239      \n  if(gl_FragCoord.z >= l_depthValue.x)\ 
 3244      \n  // color buffer or max scalar buffer have a reduced size.\ 
 3245      \n  fragTexCoord = (gl_FragCoord.xy - in_windowLowerLeftCorner) *\ 
 3246      \n                 in_inverseOriginalWindowSize;\ 
 3254      if (sliceFunc->
IsA(
"vtkPlane"))
 
 3256        shaderStr += std::string(
"\ 
 3258          \n  // Intersection with plane\ 
 3259          \n  float t = intersectRayPlane(ip_vertexPos, rayDir);\ 
 3260          \n  vec4 intersection = vec4(ip_vertexPos + t * rayDir, 1.0);\ 
 3261          \n  g_intersection = (in_inverseTextureDatasetMatrix[0] * intersection).xyz;\ 
 3262          \n  vec4 intersDC = in_projectionMatrix * in_modelViewMatrix * in_volumeMatrix[0] * intersection;\ 
 3263          \n  intersDC.xyz /= intersDC.w;\ 
 3264          \n  vec4 intersWin = NDCToWindow(intersDC.x, intersDC.y, intersDC.z);\ 
 3265          \n  if(intersWin.z >= l_depthValue.x)\ 
 3273        vtkErrorWithObjectMacro(
 
 3274          sliceFunc, 
"Implicit function type is not supported by this mapper.");
 
 3279  shaderStr += std::string(
"\ 
 3280      \n  // Compute max number of iterations it will take before we hit\ 
 3281      \n  // the termination point\ 
 3283      \n  // Abscissa of the point on the depth buffer along the ray.\ 
 3284      \n  // point in texture coordinates\ 
 3285      \n  vec4 rayTermination = WindowToNDC(gl_FragCoord.x, gl_FragCoord.y, l_depthValue.x);\ 
 3287      \n  // From normalized device coordinates to eye coordinates.\ 
 3288      \n  // in_projectionMatrix is inversed because of way VT\ 
 3289      \n  // From eye coordinates to texture coordinates\ 
 3290      \n  rayTermination = ip_inverseTextureDataAdjusted *\ 
 3291      \n                    in_inverseVolumeMatrix[0] *\ 
 3292      \n                    in_inverseModelViewMatrix *\ 
 3293      \n                    in_inverseProjectionMatrix *\ 
 3295      \n  g_rayTermination = rayTermination.xyz / rayTermination.w;\ 
 3297      \n  // Setup the current segment:\ 
 3298      \n  g_dataPos = g_rayOrigin;\ 
 3299      \n  g_terminatePos = g_rayTermination;\ 
 3301      \n  g_terminatePointMax = length(g_terminatePos.xyz - g_dataPos.xyz) /\ 
 3302      \n                        length(g_dirStep);\ 
 3303      \n  g_currentT = 0.0;");
 
 3312  return std::string(
"\ 
 3313      \n    if(any(greaterThan(max(g_dirStep, vec3(0.0))*(g_dataPos - in_texMax[0]),vec3(0.0))) ||\ 
 3314      \n      any(greaterThan(min(g_dirStep, vec3(0.0))*(g_dataPos - in_texMin[0]),vec3(0.0))))\ 
 3319      \n    // Early ray termination\ 
 3320      \n    // if the currently composited colour alpha is already fully saturated\ 
 3321      \n    // we terminated the loop or if we have hit an obstacle in the\ 
 3322      \n    // direction of they ray (using depth buffer) we terminate as well.\ 
 3323      \n    if((g_fragColor.a > g_opacityThreshold) || \ 
 3324      \n       g_currentT >= g_terminatePointMax)\ 
 3335  return std::string();
 
 3342  return std::string();
 
 3351    return std::string();
 
 3354  return std::string(
"\ 
 3355      \nuniform float in_croppingPlanes[6];\ 
 3356      \nuniform int in_croppingFlags [32];\ 
 3357      \nfloat croppingPlanesTexture[6];\ 
 3359      \n// X: axis = 0, Y: axis = 1, Z: axis = 2\ 
 3360      \n// cp Cropping plane bounds (minX, maxX, minY, maxY, minZ, maxZ)\ 
 3361      \nint computeRegionCoord(float cp[6], vec3 pos, int axis)\ 
 3363      \n  int cpmin = axis * 2;\ 
 3364      \n  int cpmax = cpmin + 1;\ 
 3366      \n  if (pos[axis] < cp[cpmin])\ 
 3370      \n  else if (pos[axis] >= cp[cpmin] &&\ 
 3371      \n           pos[axis]  < cp[cpmax])\ 
 3375      \n  else if (pos[axis] >= cp[cpmax])\ 
 3382      \nint computeRegion(float cp[6], vec3 pos)\ 
 3384      \n  return (computeRegionCoord(cp, pos, 0) +\ 
 3385      \n         (computeRegionCoord(cp, pos, 1) - 1) * 3 +\ 
 3386      \n         (computeRegionCoord(cp, pos, 2) - 1) * 9);\ 
 3396    return std::string();
 
 3399  return std::string(
"\ 
 3400      \n  // Convert cropping region to texture space\ 
 3401      \n  mat4  datasetToTextureMat = in_inverseTextureDatasetMatrix[0];\ 
 3403      \n  vec4 tempCrop = vec4(in_croppingPlanes[0], 0.0, 0.0, 1.0);\ 
 3404      \n  tempCrop = datasetToTextureMat * tempCrop;\ 
 3405      \n  if (tempCrop[3] != 0.0)\ 
 3407      \n   tempCrop[0] /= tempCrop[3];\ 
 3409      \n  croppingPlanesTexture[0] = tempCrop[0];\ 
 3411      \n  tempCrop = vec4(in_croppingPlanes[1], 0.0, 0.0, 1.0);\ 
 3412      \n  tempCrop = datasetToTextureMat * tempCrop;\ 
 3413      \n  if (tempCrop[3] != 0.0)\ 
 3415      \n   tempCrop[0] /= tempCrop[3];\ 
 3417      \n  croppingPlanesTexture[1] = tempCrop[0];\ 
 3419      \n  tempCrop = vec4(0.0, in_croppingPlanes[2], 0.0, 1.0);\ 
 3420      \n  tempCrop = datasetToTextureMat * tempCrop;\ 
 3421      \n  if (tempCrop[3] != 0.0)\ 
 3423      \n   tempCrop[1] /= tempCrop[3];\ 
 3425      \n  croppingPlanesTexture[2] = tempCrop[1];\ 
 3427      \n  tempCrop = vec4(0.0, in_croppingPlanes[3], 0.0, 1.0);\ 
 3428      \n  tempCrop = datasetToTextureMat * tempCrop;\ 
 3429      \n  if (tempCrop[3] != 0.0)\ 
 3431      \n   tempCrop[1] /= tempCrop[3];\ 
 3433      \n  croppingPlanesTexture[3] = tempCrop[1];\ 
 3435      \n  tempCrop = vec4(0.0, 0.0, in_croppingPlanes[4], 1.0);\ 
 3436      \n  tempCrop = datasetToTextureMat * tempCrop;\ 
 3437      \n  if (tempCrop[3] != 0.0)\ 
 3439      \n   tempCrop[2] /= tempCrop[3];\ 
 3441      \n  croppingPlanesTexture[4] = tempCrop[2];\ 
 3443      \n  tempCrop = vec4(0.0, 0.0, in_croppingPlanes[5], 1.0);\ 
 3444      \n  tempCrop = datasetToTextureMat * tempCrop;\ 
 3445      \n  if (tempCrop[3] != 0.0)\ 
 3447      \n   tempCrop[2] /= tempCrop[3];\ 
 3449      \n  croppingPlanesTexture[5] = tempCrop[2];");
 
 3458    return std::string();
 
 3461  return std::string(
"\ 
 3462      \n    // Determine region\ 
 3463      \n    int regionNo = computeRegion(croppingPlanesTexture, g_dataPos);\ 
 3465      \n    // Do & operation with cropping flags\ 
 3466      \n    // Pass the flag that its Ok to sample or not to sample\ 
 3467      \n    if (in_croppingFlags[regionNo] == 0)\ 
 3469      \n      // Skip this voxel\ 
 3478  return std::string();
 
 3485  return std::string();
 
 3494    return std::string();
 
 3497  return std::string(
"\ 
 3498      \n /// We support only 8 clipping planes for now\ 
 3499      \n /// The first value is the size of the data array for clipping\ 
 3500      \n /// planes (origin, normal)\ 
 3501      \n uniform float in_clippingPlanes[49];\ 
 3502      \n uniform float in_clippedVoxelIntensity;\ 
 3504      \n int clip_numPlanes;\ 
 3505      \n vec3 clip_rayDirObj;\ 
 3506      \n mat4 clip_texToObjMat;\ 
 3507      \n mat4 clip_objToTexMat;\ 
 3509      \n// Tighten the sample range as needed to account for clip planes. \ 
 3510      \n// Arguments are in texture coordinates. \ 
 3511      \n// Returns true if the range is at all valid after clipping. If not, \ 
 3512      \n// the fragment should be discarded. \ 
 3513      \nbool AdjustSampleRangeForClipping(inout vec3 startPosTex, inout vec3 stopPosTex) \ 
 3515      \n  vec4 startPosObj = vec4(0.0);\ 
 3517      \n    startPosObj = clip_texToObjMat * vec4(startPosTex - g_rayJitter, 1.0);\ 
 3518      \n    startPosObj = startPosObj / startPosObj.w;\ 
 3519      \n    startPosObj.w = 1.0;\ 
 3522      \n  vec4 stopPosObj = vec4(0.0);\ 
 3524      \n    stopPosObj = clip_texToObjMat * vec4(stopPosTex, 1.0);\ 
 3525      \n    stopPosObj = stopPosObj / stopPosObj.w;\ 
 3526      \n    stopPosObj.w = 1.0;\ 
 3529      \n  for (int i = 0; i < clip_numPlanes; i = i + 6)\ 
 3531      \n    vec3 planeOrigin = vec3(in_clippingPlanes[i + 1],\ 
 3532      \n                            in_clippingPlanes[i + 2],\ 
 3533      \n                            in_clippingPlanes[i + 3]);\ 
 3534      \n    vec3 planeNormal = normalize(vec3(in_clippingPlanes[i + 4],\ 
 3535      \n                                      in_clippingPlanes[i + 5],\ 
 3536      \n                                      in_clippingPlanes[i + 6]));\ 
 3538      \n    // Abort if the entire segment is clipped:\ 
 3539      \n    // (We can do this before adjusting the term point, since it'll \ 
 3540      \n    // only move further into the clipped area)\ 
 3541      \n    float startDistance = dot(planeNormal, planeOrigin - startPosObj.xyz);\ 
 3542      \n    float stopDistance = dot(planeNormal, planeOrigin - stopPosObj.xyz);\ 
 3543      \n    bool startClipped = startDistance > 0.0;\ 
 3544      \n    bool stopClipped = stopDistance > 0.0;\ 
 3545      \n    if (startClipped && stopClipped)\ 
 3550      \n    float rayDotNormal = dot(clip_rayDirObj, planeNormal);\ 
 3551      \n    bool frontFace = rayDotNormal > 0.0;\ 
 3553      \n    // Move the start position further from the eye if needed:\ 
 3554      \n    if (frontFace && // Observing from the clipped side (plane's front face)\ 
 3555      \n        startDistance > 0.0) // Ray-entry lies on the clipped side.\ 
 3557      \n      // Scale the point-plane distance to the ray direction and update the\ 
 3559      \n      float rayScaledDist = startDistance / rayDotNormal;\ 
 3560      \n      startPosObj = vec4(startPosObj.xyz + rayScaledDist * clip_rayDirObj, 1.0);\ 
 3561      \n      vec4 newStartPosTex = clip_objToTexMat * vec4(startPosObj.xyz, 1.0);\ 
 3562      \n      newStartPosTex /= newStartPosTex.w;\ 
 3563      \n      startPosTex = newStartPosTex.xyz;\ 
 3564      \n      startPosTex += g_rayJitter;\ 
 3567      \n    // Move the end position closer to the eye if needed:\ 
 3568      \n    if (!frontFace && // Observing from the unclipped side (plane's back face)\ 
 3569      \n        stopDistance > 0.0) // Ray-entry lies on the unclipped side.\ 
 3571      \n      // Scale the point-plane distance to the ray direction and update the\ 
 3572      \n      // termination point.\ 
 3573      \n      float rayScaledDist = stopDistance / rayDotNormal;\ 
 3574      \n      stopPosObj = vec4(stopPosObj.xyz + rayScaledDist * clip_rayDirObj, 1.0);\ 
 3575      \n      vec4 newStopPosTex = clip_objToTexMat * vec4(stopPosObj.xyz, 1.0);\ 
 3576      \n      newStopPosTex /= newStopPosTex.w;\ 
 3577      \n      stopPosTex = newStopPosTex.xyz;\ 
 3581      \n  if (any(greaterThan(startPosTex, in_texMax[0])) ||\ 
 3582      \n      any(lessThan(startPosTex, in_texMin[0])))\ 
 3598    return std::string();
 
 3601  std::string shaderStr;
 
 3604    shaderStr = std::string(
"\ 
 3605        \n  vec4 tempClip = in_volumeMatrix[0] * vec4(rayDir, 0.0);\ 
 3606        \n  if (tempClip.w != 0.0)\ 
 3608        \n    tempClip = tempClip/tempClip.w;\ 
 3609        \n    tempClip.w = 1.0;\ 
 3611        \n  clip_rayDirObj = normalize(tempClip.xyz);");
 
 3615    shaderStr = std::string(
"\ 
 3616        clip_rayDirObj = normalize(in_projectionDirection);");
 
 3619  shaderStr += std::string(
"\ 
 3620      \n  clip_numPlanes = int(in_clippingPlanes[0]);\ 
 3621      \n  clip_texToObjMat = in_volumeMatrix[0] * in_textureDatasetMatrix[0];\ 
 3622      \n  clip_objToTexMat = in_inverseTextureDatasetMatrix[0] * in_inverseVolumeMatrix[0];\ 
 3624      \n  // Adjust for clipping.\ 
 3625      \n  if (!AdjustSampleRangeForClipping(g_rayOrigin, g_rayTermination))\ 
 3626      \n  { // entire ray is clipped.\ 
 3630      \n  // Update the segment post-clip:\ 
 3631      \n  g_dataPos = g_rayOrigin;\ 
 3632      \n  g_terminatePos = g_rayTermination;\ 
 3633      \n  g_terminatePointMax = length(g_terminatePos.xyz - g_dataPos.xyz) /\ 
 3634      \n                        length(g_dirStep);\ 
 3644  return std::string();
 
 3651  return std::string();
 
 3659  if (!mask || !maskInput)
 
 3661    return std::string();
 
 3665    return std::string(
"uniform sampler3D in_mask;");
 
 3676    return std::string();
 
 3680    return std::string(
"\ 
 3681        \nvec4 maskValue = texture3D(in_mask, g_dataPos);\ 
 3682        \nif(maskValue.r <= 0.0)\ 
 3696    return std::string();
 
 3700    return std::string(
"\ 
 3701        \nuniform float in_maskBlendFactor;\ 
 3702        \nuniform sampler2D in_labelMapTransfer;\ 
 3703        \nuniform float in_mask_scale;\ 
 3704        \nuniform float in_mask_bias;\ 
 3705        \nuniform int in_labelMapNumLabels;\ 
 3717    return std::string();
 
 3721    std::string shaderStr = std::string(
"\ 
 3722        \nvec4 scalar = texture3D(in_volume[0], g_dataPos);");
 
 3725    if (noOfComponents == 1)
 
 3727      shaderStr += std::string(
"\ 
 3728          \n      scalar.r = scalar.r * in_volume_scale[0].r + in_volume_bias[0].r;\ 
 3729          \n      scalar = vec4(scalar.r);");
 
 3734      shaderStr += std::string(
"\ 
 3735          \n      scalar = scalar * in_volume_scale[0] + in_volume_bias[0];");
 
 3741    return shaderStr + std::string(
"\ 
 3742        \nif (in_maskBlendFactor == 0.0)\ 
 3744        \n  g_srcColor.a = computeOpacity(scalar);\ 
 3745        \n  if (g_srcColor.a > 0)\ 
 3747        \n    g_srcColor = computeColor(scalar, g_srcColor.a);\ 
 3752        \n  float opacity = computeOpacity(scalar);\ 
 3753        \n  // Get the mask value at this same location\ 
 3754        \n  vec4 maskValue = texture3D(in_mask, g_dataPos);\ 
 3755        \n  maskValue.r = maskValue.r * in_mask_scale + in_mask_bias;\ 
 3756        \n  // Quantize the height of the labelmap texture over number of labels\ 
 3757        \n  if (in_labelMapNumLabels > 0)\ 
 3760        \n      floor(maskValue.r * in_labelMapNumLabels) /\ 
 3761        \n      in_labelMapNumLabels;\ 
 3765        \n    maskValue.r = 0.0;\ 
 3767        \n  if(maskValue.r == 0.0)\ 
 3769        \n    g_srcColor.a = opacity;\ 
 3770        \n    if (g_srcColor.a > 0)\ 
 3772        \n      g_srcColor = computeColor(scalar, g_srcColor.a);\ 
 3777        \n    g_srcColor = texture2D(in_labelMapTransfer,\ 
 3778        \n                           vec2(scalar.r, maskValue.r));\ 
 3779        \n    if (g_srcColor.a > 0)\ 
 3781        \n      g_srcColor = computeLighting(g_srcColor, 0, maskValue.r);\ 
 3783        \n    if (in_maskBlendFactor < 1.0)\ 
 3785        \n      vec4 color = opacity > 0 ? computeColor(scalar, opacity) : vec4(0);\ 
 3786        \n      g_srcColor = (1.0 - in_maskBlendFactor) * color +\ 
 3787        \n                           in_maskBlendFactor * g_srcColor;\ 
 3798  return std::string(
"uniform bool in_clampDepthToBackface;\n" 
 3799                     "vec3 l_opaqueFragPos;\n" 
 3800                     "bool l_updateDepth;\n");
 
 3807  return std::string(
"\ 
 3808    \n  l_opaqueFragPos = vec3(-1.0);\ 
 3809    \n  if(in_clampDepthToBackface)\ 
 3811    \n    l_opaqueFragPos = g_dataPos;\ 
 3813    \n  l_updateDepth = true;");
 
 3820  return std::string(
"\ 
 3821    \n    if(!g_skip && g_srcColor.a > 0.0 && l_updateDepth)\ 
 3823    \n      l_opaqueFragPos = g_dataPos;\ 
 3824    \n      l_updateDepth = false;\ 
 3832  return std::string(
"\ 
 3833    \n  if (l_opaqueFragPos == vec3(-1.0))\ 
 3835    \n    gl_FragData[1] = vec4(1.0);\ 
 3839    \n    vec4 depthValue = in_projectionMatrix * in_modelViewMatrix *\ 
 3840    \n                      in_volumeMatrix[0] * in_textureDatasetMatrix[0] *\ 
 3841    \n                      vec4(l_opaqueFragPos, 1.0);\ 
 3842    \n    depthValue /= depthValue.w;\ 
 3843    \n    gl_FragData[1] = vec4(vec3(0.5 * (gl_DepthRange.far -\ 
 3844    \n                       gl_DepthRange.near) * depthValue.z + 0.5 *\ 
 3845    \n                      (gl_DepthRange.far + gl_DepthRange.near)), 1.0);\ 
 3853  return std::string(
"\ 
 3854    \n  vec3 l_isoPos = g_dataPos;");
 
 3861  return std::string(
"\ 
 3862    \n    if(!g_skip && g_srcColor.a > 0.0)\ 
 3864    \n      l_isoPos = g_dataPos;\ 
 3865    \n      g_exit = true; g_skip = true;\ 
 3873  return std::string(
"\ 
 3874    \n  vec4 depthValue = in_projectionMatrix * in_modelViewMatrix *\ 
 3875    \n                  in_volumeMatrix[0] * in_textureDatasetMatrix[0] *\ 
 3876    \n                  vec4(l_isoPos, 1.0);\ 
 3877    \n  gl_FragData[0] = vec4(l_isoPos, 1.0);\ 
 3878    \n  gl_FragData[1] = vec4(vec3((depthValue.z/depthValue.w) * 0.5 + 0.5),\ 
 3886  return std::string(
"\ 
 3887    \n  initializeRayCast();\ 
 3888    \n  castRay(-1.0, -1.0);\ 
 3889    \n  finalizeRayCast();");
 
 3894  const std::vector<std::string>& varNames, 
size_t usedNames)
 
 3896  std::string shader = 
"\n";
 
 3897  for (
size_t i = 0; i < usedNames; i++)
 
 3899    shader += 
"uniform sampler2D " + varNames[i] + 
";\n";
 
 3906  const std::vector<std::string>& varNames, 
size_t usedNames)
 
 3908  std::string shader = 
"\n";
 
 3909  for (
size_t i = 0; i < usedNames; i++)
 
 3911    std::stringstream ss;
 
 3913    shader += 
" gl_FragData[" + ss.str() + 
"] = texture2D(" + varNames[i] + 
", texCoord);\n";
 
 3915  shader += 
" return;\n";
 
 3918VTK_ABI_NAMESPACE_END
 
virtual vtkPlaneCollection * GetClippingPlanes()
Get/Set the vtkPlaneCollection which specifies the clipping planes.
 
virtual vtkTypeBool GetParallelProjection()
Set/Get the value of the ParallelProjection instance variable.
 
static vtkDataSet * SafeDownCast(vtkObjectBase *o)
 
vtkUnsignedCharArray * GetCellGhostArray()
Get the array that defines the ghost type of each cell.
 
vtkUnsignedCharArray * GetPointGhostArray()
Gets the array that defines the ghost type of each point.
 
virtual vtkTypeBool GetUseDepthPass()
If UseDepthPass is on, the mapper will use two passes.
 
virtual vtkTypeBool GetUseJittering()
If UseJittering is on, each ray traversal direction will be perturbed slightly using a noise-texture ...
 
static vtkGPUVolumeRayCastMapper * SafeDownCast(vtkObjectBase *o)
 
int GetInputCount()
Number of currently active ports.
 
virtual float GetVolumetricScatteringBlending()
This parameter controls the blending between surfacic approximation and volumetric multi-scattering.
 
topologically and geometrically regular array of data
 
abstract interface for implicit functions
 
virtual vtkTypeBool IsA(const char *type)
Return 1 if this class is the same type of (or a subclass of) the named class.
 
OpenGL implementation of volume rendering through ray-casting.
 
static vtkOpenGLGPUVolumeRayCastMapper * SafeDownCast(vtkObjectBase *o)
 
std::map< int, vtkVolumeInputHelper > VolumeInputMap
 
virtual int GetCurrentPass()
 
static vtkRectilinearGrid * SafeDownCast(vtkObjectBase *o)
 
abstract specification for renderers
 
vtkCamera * GetActiveCamera()
Get the current camera.
 
Hold a reference to a vtkObjectBase instance.
 
Abstract class for a volume mapper.
 
virtual bool GetComputeNormalFromOpacity()
If enabled, the volume(s) whose shading is enabled will use the gradient of opacity instead of the sc...
 
virtual vtkDataSet * GetInput()
Set/Get the input data.
 
virtual vtkTypeBool GetCropping()
Turn On/Off orthogonal cropping.
 
@ AVERAGE_INTENSITY_BLEND
 
@ MAXIMUM_INTENSITY_BLEND
 
@ MINIMUM_INTENSITY_BLEND
 
virtual int GetBlendMode()
Set/Get the blend mode.
 
represents the common properties for rendering a volume.
 
virtual int GetDisableGradientOpacity(int index)
Enable/Disable the gradient opacity function for the given component.
 
virtual float GetScatteringAnisotropy()
Get/Set the volume's scattering anisotropy.
 
bool HasLabelGradientOpacity()
 
virtual int GetUseClippedVoxelIntensity()
Set/Get whether to use a fixed intensity value for voxels in the clipped space for gradient calculati...
 
bool HasGradientOpacity(int index=0)
Check whether or not we have the gradient opacity.
 
int GetShade(int index)
Set/Get the shading of a volume.
 
virtual int GetTransferFunctionMode()
Color-opacity transfer function mode.
 
Creates and manages the volume texture rendered by vtkOpenGLGPUVolumeRayCastMapper.
 
represents a volume (data & properties) in a rendered scene
 
virtual vtkVolumeProperty * GetProperty()
Set/Get the volume property.
 
std::string ClippingDeclarationFragment(vtkRenderer *vtkNotUsed(ren), vtkVolumeMapper *mapper, vtkVolume *vtkNotUsed(vol))
 
std::string ComputeGradientOpacity1DDecl(vtkVolume *vol, int noOfComponents, int independentComponents, std::map< int, std::string > gradientTableMap)
 
std::string WorkerImplementation(vtkRenderer *vtkNotUsed(ren), vtkVolumeMapper *vtkNotUsed(mapper), vtkVolume *vtkNotUsed(vol))
 
std::string TerminationExit(vtkRenderer *vtkNotUsed(ren), vtkVolumeMapper *vtkNotUsed(mapper), vtkVolume *vtkNotUsed(vol))
 
std::string ClippingDeclarationVertex(vtkRenderer *vtkNotUsed(ren), vtkVolumeMapper *vtkNotUsed(mapper), vtkVolume *vtkNotUsed(vol))
 
std::string TerminationImplementation(vtkRenderer *vtkNotUsed(ren), vtkVolumeMapper *vtkNotUsed(mapper), vtkVolume *vtkNotUsed(vol))
 
std::string ComputeDensityGradientDeclaration(vtkOpenGLGPUVolumeRayCastMapper *mapper, vtkOpenGLGPUVolumeRayCastMapper::VolumeInputMap &inputs, int noOfComponents, int independentComponents, int useGradYAxis)
 
std::string BinaryMaskDeclaration(vtkRenderer *vtkNotUsed(ren), vtkVolumeMapper *vtkNotUsed(mapper), vtkVolume *vtkNotUsed(vol), vtkImageData *maskInput, vtkVolumeTexture *mask, int vtkNotUsed(maskType))
 
std::string PickingIdLow24PassExit(vtkRenderer *vtkNotUsed(ren), vtkVolumeMapper *vtkNotUsed(mapper), vtkVolume *vtkNotUsed(vol))
 
std::string CroppingDeclarationFragment(vtkRenderer *vtkNotUsed(ren), vtkVolumeMapper *mapper, vtkVolume *vtkNotUsed(vol))
 
std::string ComputeLightingDeclaration(vtkRenderer *vtkNotUsed(ren), vtkVolumeMapper *mapper, vtkVolume *vol, int noOfComponents, int independentComponents, int totalNumberOfLights, int numberPositionalLights, bool defaultLighting)
 
std::string PhaseFunctionDeclaration(vtkRenderer *vtkNotUsed(ren), vtkVolumeMapper *vtkNotUsed(mapper), vtkVolume *vol)
 
std::string ComputeColorDeclaration(vtkRenderer *vtkNotUsed(ren), vtkVolumeMapper *vtkNotUsed(mapper), vtkVolume *vtkNotUsed(vol), int noOfComponents, int independentComponents, std::map< int, std::string > colorTableMap)
 
std::string CroppingImplementation(vtkRenderer *vtkNotUsed(ren), vtkVolumeMapper *mapper, vtkVolume *vtkNotUsed(vol))
 
std::string ShadingExit(vtkRenderer *vtkNotUsed(ren), vtkVolumeMapper *mapper, vtkVolume *vtkNotUsed(vol), int noOfComponents, int independentComponents=0)
 
std::string BaseExit(vtkRenderer *vtkNotUsed(ren), vtkVolumeMapper *vtkNotUsed(mapper), vtkVolume *vtkNotUsed(vol))
 
std::string ComputeOpacityMultiDeclaration(vtkOpenGLGPUVolumeRayCastMapper::VolumeInputMap &inputs)
 
std::string BaseDeclarationVertex(vtkRenderer *vtkNotUsed(ren), vtkVolumeMapper *mapper, vtkVolume *vtkNotUsed(vol), bool multipleInputs)
 
std::string ComputeTextureCoordinates(vtkRenderer *vtkNotUsed(ren), vtkVolumeMapper *vtkNotUsed(mapper), vtkVolume *vtkNotUsed(vol))
 
std::string DepthPassInit(vtkRenderer *vtkNotUsed(ren), vtkVolumeMapper *vtkNotUsed(mapper), vtkVolume *vtkNotUsed(vol))
 
std::string TerminationInit(vtkRenderer *vtkNotUsed(ren), vtkVolumeMapper *mapper, vtkVolume *vol)
 
std::string ComputeMatricesInit(vtkOpenGLGPUVolumeRayCastMapper *vtkNotUsed(mapper), int numberPositionalLights)
 
std::string RenderToImageInit(vtkRenderer *vtkNotUsed(ren), vtkVolumeMapper *vtkNotUsed(mapper), vtkVolume *vtkNotUsed(vol))
 
std::string ComputeClipPositionImplementation(vtkRenderer *vtkNotUsed(ren), vtkVolumeMapper *vtkNotUsed(mapper), vtkVolume *vtkNotUsed(vol))
 
std::string RenderToImageImplementation(vtkRenderer *vtkNotUsed(ren), vtkVolumeMapper *vtkNotUsed(mapper), vtkVolume *vtkNotUsed(vol))
 
std::string ComputeOpacityDeclaration(vtkRenderer *vtkNotUsed(ren), vtkVolumeMapper *vtkNotUsed(mapper), vtkVolume *vtkNotUsed(vol), int noOfComponents, int independentComponents, std::map< int, std::string > opacityTableMap)
 
std::string PreComputeGradientsImpl(vtkRenderer *vtkNotUsed(ren), vtkVolume *vtkNotUsed(vol), int noOfComponents=1, int independentComponents=0)
 
std::string ClippingExit(vtkRenderer *vtkNotUsed(ren), vtkVolumeMapper *vtkNotUsed(mapper), vtkVolume *vtkNotUsed(vol))
 
std::string ComputeGradientDeclaration(vtkOpenGLGPUVolumeRayCastMapper *mapper, vtkOpenGLGPUVolumeRayCastMapper::VolumeInputMap &inputs)
 
std::string PickingIdHigh24PassExit(vtkRenderer *vtkNotUsed(ren), vtkVolumeMapper *vtkNotUsed(mapper), vtkVolume *vtkNotUsed(vol))
 
std::string TerminationDeclarationVertex(vtkRenderer *vtkNotUsed(ren), vtkVolumeMapper *vtkNotUsed(mapper), vtkVolume *vtkNotUsed(vol))
 
std::string PickingActorPassExit(vtkRenderer *vtkNotUsed(ren), vtkVolumeMapper *vtkNotUsed(mapper), vtkVolume *vtkNotUsed(vol))
 
std::string RenderToImageDeclarationFragment(vtkRenderer *vtkNotUsed(ren), vtkVolumeMapper *vtkNotUsed(mapper), vtkVolume *vtkNotUsed(vol))
 
std::string BaseDeclarationFragment(vtkRenderer *vtkNotUsed(ren), vtkVolumeMapper *mapper, vtkOpenGLGPUVolumeRayCastMapper::VolumeInputMap &inputs, int totalNumberOfLights, int numberPositionalLights, bool defaultLighting, int noOfComponents, int independentComponents)
 
std::string BaseImplementation(vtkRenderer *vtkNotUsed(ren), vtkVolumeMapper *mapper, vtkVolume *vtkNotUsed(vol))
 
std::string RenderToImageExit(vtkRenderer *vtkNotUsed(ren), vtkVolumeMapper *vtkNotUsed(mapper), vtkVolume *vtkNotUsed(vol))
 
std::string ShadingDeclarationVertex(vtkRenderer *vtkNotUsed(ren), vtkVolumeMapper *vtkNotUsed(mapper), vtkVolume *vtkNotUsed(vol))
 
std::string ShadingSingleInput(vtkRenderer *vtkNotUsed(ren), vtkVolumeMapper *mapper, vtkVolume *vtkNotUsed(vol), vtkImageData *maskInput, vtkVolumeTexture *mask, int maskType, int noOfComponents, int independentComponents=0)
 
std::string ShadingMultipleInputs(vtkVolumeMapper *mapper, vtkOpenGLGPUVolumeRayCastMapper::VolumeInputMap &inputs)
 
std::string CompositeMaskDeclarationFragment(vtkRenderer *vtkNotUsed(ren), vtkVolumeMapper *vtkNotUsed(mapper), vtkVolume *vtkNotUsed(vol), vtkImageData *maskInput, vtkVolumeTexture *mask, int maskType)
 
std::string ComputeColorUniforms(vtkOpenGLGPUVolumeRayCastMapper::VolumeInputMap &inputs, int noOfComponents, vtkVolumeProperty *volProp)
 
std::string ComputeRayDirectionDeclaration(vtkRenderer *ren, vtkVolumeMapper *vtkNotUsed(mapper), vtkVolume *vtkNotUsed(vol), int vtkNotUsed(noOfComponents))
 
std::string ImageSampleDeclarationFrag(const std::vector< std::string > &varNames, size_t usedNames)
 
std::string BaseInit(vtkRenderer *vtkNotUsed(ren), vtkVolumeMapper *mapper, vtkOpenGLGPUVolumeRayCastMapper::VolumeInputMap &inputs, bool defaultLighting)
 
std::string DepthPassImplementation(vtkRenderer *vtkNotUsed(ren), vtkVolumeMapper *vtkNotUsed(mapper), vtkVolume *vtkNotUsed(vol))
 
std::string GradientCacheDec(vtkRenderer *vtkNotUsed(ren), vtkVolume *vtkNotUsed(vol), vtkOpenGLGPUVolumeRayCastMapper::VolumeInputMap &inputs, int independentComponents=0)
 
std::string Transfer2DDeclaration(vtkOpenGLGPUVolumeRayCastMapper::VolumeInputMap &inputs)
 
std::string ClippingImplementation(vtkRenderer *vtkNotUsed(ren), vtkVolumeMapper *vtkNotUsed(mapper), vtkVolume *vtkNotUsed(vol))
 
std::string CroppingDeclarationVertex(vtkRenderer *vtkNotUsed(ren), vtkVolumeMapper *vtkNotUsed(mapper), vtkVolume *vtkNotUsed(vol))
 
std::string ComputeRGBA2DWithGradientDeclaration(vtkRenderer *vtkNotUsed(ren), vtkVolumeMapper *vtkNotUsed(mapper), vtkVolume *vtkNotUsed(vol), int noOfComponents, int independentComponents, std::map< int, std::string > opacityTableMap, int useGradient)
 
std::string ComputeColorMultiDeclaration(vtkOpenGLGPUVolumeRayCastMapper::VolumeInputMap &inputs, bool useGradientTF)
 
std::string ImageSampleImplementationFrag(const std::vector< std::string > &varNames, size_t usedNames)
 
std::string CroppingInit(vtkRenderer *vtkNotUsed(ren), vtkVolumeMapper *mapper, vtkVolume *vtkNotUsed(vol))
 
std::string CompositeMaskImplementation(vtkRenderer *vtkNotUsed(ren), vtkVolumeMapper *vtkNotUsed(mapper), vtkVolume *vtkNotUsed(vol), vtkImageData *maskInput, vtkVolumeTexture *mask, int maskType, int noOfComponents)
 
std::string ComputeColor2DYAxisDeclaration(int noOfComponents, int vtkNotUsed(independentComponents), std::map< int, std::string > colorTableMap)
 
std::string CroppingExit(vtkRenderer *vtkNotUsed(ren), vtkVolumeMapper *vtkNotUsed(mapper), vtkVolume *vtkNotUsed(vol))
 
std::string ClippingInit(vtkRenderer *ren, vtkVolumeMapper *mapper, vtkVolume *vtkNotUsed(vol))
 
std::string ComputeLightingMultiDeclaration(vtkRenderer *vtkNotUsed(ren), vtkVolumeMapper *mapper, vtkVolume *vol, int noOfComponents, int independentComponents, int vtkNotUsed(totalNumberOfLights), bool defaultLighting)
 
std::string TerminationDeclarationFragment(vtkRenderer *vtkNotUsed(ren), vtkVolumeMapper *vtkNotUsed(mapper), vtkVolume *vtkNotUsed(vol))
 
std::string ShadingDeclarationFragment(vtkRenderer *vtkNotUsed(ren), vtkVolumeMapper *mapper, vtkVolume *vtkNotUsed(vol))
 
std::string PickingActorPassDeclaration(vtkRenderer *vtkNotUsed(ren), vtkVolumeMapper *vtkNotUsed(mapper), vtkVolume *vtkNotUsed(vol))
 
std::string ShadingInit(vtkRenderer *vtkNotUsed(ren), vtkVolumeMapper *mapper, vtkVolume *vtkNotUsed(vol))
 
std::string BinaryMaskImplementation(vtkRenderer *vtkNotUsed(ren), vtkVolumeMapper *vtkNotUsed(mapper), vtkVolume *vtkNotUsed(vol), vtkImageData *maskInput, vtkVolumeTexture *mask, int maskType)
 
std::string DepthPassExit(vtkRenderer *vtkNotUsed(ren), vtkVolumeMapper *vtkNotUsed(mapper), vtkVolume *vtkNotUsed(vol))
 
std::string ComputeOpacity2DDeclaration(vtkRenderer *vtkNotUsed(ren), vtkVolumeMapper *vtkNotUsed(mapper), vtkVolume *vtkNotUsed(vol), int noOfComponents, int independentComponents, std::map< int, std::string > opacityTableMap, int useGradient)
 
std::string ComputeOpacityEvaluationCall(vtkOpenGLGPUVolumeRayCastMapper *vtkNotUsed(mapper), vtkOpenGLGPUVolumeRayCastMapper::VolumeInputMap &inputs, int noOfComponents, int independentComponents, int useGradYAxis, std::string position, bool requestColor=false)
 
std::string ComputeColor2DDeclaration(vtkRenderer *vtkNotUsed(ren), vtkVolumeMapper *vtkNotUsed(mapper), vtkVolume *vtkNotUsed(vol), int noOfComponents, int independentComponents, std::map< int, std::string > colorTableMap, int useGradient)
 
std::string ComputeGradientOpacityMulti1DDecl(vtkOpenGLGPUVolumeRayCastMapper::VolumeInputMap &inputs)
 
std::string ComputeVolumetricShadowDec(vtkOpenGLGPUVolumeRayCastMapper *mapper, vtkVolume *vtkNotUsed(vol), int noOfComponents, int independentComponents, vtkOpenGLGPUVolumeRayCastMapper::VolumeInputMap &inputs, int useGradYAxis)