Commit 883cb5b8 authored by David E. DeMarle's avatar David E. DeMarle

Merge commit '2140f97b' into release

parents 46f9a75d 2140f97b
...@@ -2035,6 +2035,19 @@ void vtkTextureObject::CopyFromFrameBuffer(int srcXmin, ...@@ -2035,6 +2035,19 @@ void vtkTextureObject::CopyFromFrameBuffer(int srcXmin,
vtkOpenGLCheckErrorMacro("failed at glCopyTexImage2D " << this->Format); vtkOpenGLCheckErrorMacro("failed at glCopyTexImage2D " << this->Format);
} }
//----------------------------------------------------------------------------
int vtkTextureObject::GetMaximumTextureSize(vtkOpenGLRenderWindow* context)
{
int maxSize = -1;
if (context && context->IsCurrent())
{
glGetIntegerv(GL_MAX_TEXTURE_SIZE, &maxSize);
}
return maxSize;
}
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
void vtkTextureObject::PrintSelf(ostream& os, vtkIndent indent) void vtkTextureObject::PrintSelf(ostream& os, vtkIndent indent)
{ {
......
...@@ -528,6 +528,16 @@ public: ...@@ -528,6 +528,16 @@ public:
vtkGetMacro(GenerateMipmap,bool); vtkGetMacro(GenerateMipmap,bool);
vtkSetMacro(GenerateMipmap,bool); vtkSetMacro(GenerateMipmap,bool);
// Description:
// Query and return maximum texture size (dimension) supported by the
// OpenGL driver for a particular context. It should be noted that this
// size does not consider the internal format of the texture and therefore
// there is no guarentee that a texture of this size will be allocated by
// the driver. Also, the method does not make the context current so
// if the passed context is not valid or current, a value of -1 will
// be returned.
static int GetMaximumTextureSize(vtkOpenGLRenderWindow* context);
// Description: // Description:
// Returns if the context supports the required extensions. If flags // Returns if the context supports the required extensions. If flags
// for optional extenisons are set then the test fails when support // for optional extenisons are set then the test fails when support
...@@ -590,8 +600,6 @@ public: ...@@ -590,8 +600,6 @@ public:
int width, int width,
int height); int height);
protected: protected:
vtkTextureObject(); vtkTextureObject();
~vtkTextureObject(); ~vtkTextureObject();
......
...@@ -54,6 +54,7 @@ endif() ...@@ -54,6 +54,7 @@ endif()
set (VolumeOpenGL2CxxTests set (VolumeOpenGL2CxxTests
TestGPURayCastCameraInside.cxx TestGPURayCastCameraInside.cxx
TestGPURayCastCameraInsideSmallSpacing.cxx TestGPURayCastCameraInsideSmallSpacing.cxx
TestGPURayCastCellData.cxx
TestGPURayCastClipping.cxx TestGPURayCastClipping.cxx
TestGPURayCastGradientOpacity.cxx TestGPURayCastGradientOpacity.cxx
TestGPURayCastPositionalLights.cxx TestGPURayCastPositionalLights.cxx
...@@ -63,6 +64,7 @@ set (VolumeOpenGL2CxxTests ...@@ -63,6 +64,7 @@ set (VolumeOpenGL2CxxTests
TestGPURayCastRenderToTexture.cxx TestGPURayCastRenderToTexture.cxx
TestGPURayCastThreeComponentsIndependent.cxx TestGPURayCastThreeComponentsIndependent.cxx
TestGPURayCastTwoComponentsDependent.cxx TestGPURayCastTwoComponentsDependent.cxx
TestGPURayCastTwoComponentsGradient.cxx
TestGPURayCastTwoComponentsIndependent.cxx TestGPURayCastTwoComponentsIndependent.cxx
TestGPURayCastVolumeLightKit.cxx TestGPURayCastVolumeLightKit.cxx
TestGPURayCastVolumePolyData.cxx TestGPURayCastVolumePolyData.cxx
......
/*=========================================================================
Program: Visualization Toolkit
Module: TestGPURayCastVolumeUpdate.cxx
Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
All rights reserved.
See Copyright.txt or http://www.kitware.com/Copyright.htm for details.
This software is distributed WITHOUT ANY WARRANTY; without even
the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
PURPOSE. See the above copyright notice for more information.
=========================================================================*/
// This test volume tests whether updating the volume MTime updates the ,
// geometry in the volume mapper.
#include <vtkColorTransferFunction.h>
#include <vtkDataArray.h>
#include <vtkGPUVolumeRayCastMapper.h>
#include <vtkImageData.h>
#include <vtkInteractorStyleTrackballCamera.h>
#include <vtkNew.h>
#include <vtkOutlineFilter.h>
#include <vtkPiecewiseFunction.h>
#include <vtkPointDataToCellData.h>
#include <vtkPolyDataMapper.h>
#include <vtkRegressionTestImage.h>
#include <vtkRenderer.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkRTAnalyticSource.h>
#include <vtkSmartPointer.h>
#include <vtkTesting.h>
#include <vtkTestUtilities.h>
#include <vtkVolumeProperty.h>
#include <vtkXMLImageDataReader.h>
int TestGPURayCastCellData(int argc, char *argv[])
{
cout << "CTEST_FULL_OUTPUT (Avoid ctest truncation of output)" << endl;
double scalarRange[2];
vtkNew<vtkActor> outlineActor;
vtkNew<vtkPolyDataMapper> outlineMapper;
vtkNew<vtkGPUVolumeRayCastMapper> volumeMapper;
vtkNew<vtkXMLImageDataReader> reader;
char* volumeFile = vtkTestUtilities::ExpandDataFileName(
argc, argv, "Data/vase_1comp.vti");
reader->SetFileName(volumeFile);
delete[] volumeFile;
vtkNew<vtkPointDataToCellData> pointToCell;
pointToCell->SetInputConnection(reader->GetOutputPort());
volumeMapper->SetInputConnection(pointToCell->GetOutputPort());
// Add outline filter
vtkNew<vtkOutlineFilter> outlineFilter;
outlineFilter->SetInputConnection(pointToCell->GetOutputPort());
outlineMapper->SetInputConnection(outlineFilter->GetOutputPort());
outlineActor->SetMapper(outlineMapper.GetPointer());
volumeMapper->GetInput()->GetScalarRange(scalarRange);
volumeMapper->SetSampleDistance(0.1);
volumeMapper->SetAutoAdjustSampleDistances(0);
volumeMapper->SetBlendModeToComposite();
vtkNew<vtkRenderWindow> renWin;
renWin->SetMultiSamples(0);
renWin->SetSize(400, 400);
vtkNew<vtkRenderWindowInteractor> iren;
iren->SetRenderWindow(renWin.GetPointer());
vtkNew<vtkInteractorStyleTrackballCamera> style;
iren->SetInteractorStyle(style.GetPointer());
renWin->Render(); // make sure we have an OpenGL context.
vtkNew<vtkRenderer> ren;
ren->SetBackground(0.2, 0.2, 0.5);
renWin->AddRenderer(ren.GetPointer());
vtkNew<vtkPiecewiseFunction> scalarOpacity;
scalarOpacity->AddPoint(50, 0.0);
scalarOpacity->AddPoint(75, 1.0);
vtkNew<vtkVolumeProperty> volumeProperty;
volumeProperty->ShadeOn();
volumeProperty->SetInterpolationType(VTK_LINEAR_INTERPOLATION);
volumeProperty->SetScalarOpacity(scalarOpacity.GetPointer());
vtkNew<vtkColorTransferFunction> colorTransferFunction;
colorTransferFunction->RemoveAllPoints();
colorTransferFunction->AddRGBPoint(scalarRange[0], 0.6, 0.4, 0.1);
volumeProperty->SetColor(colorTransferFunction.GetPointer());
vtkNew<vtkVolume> volume;
volume->SetMapper(volumeMapper.GetPointer());
volume->SetProperty(volumeProperty.GetPointer());
ren->AddVolume(volume.GetPointer());
ren->AddActor(outlineActor.GetPointer());
ren->ResetCamera();
renWin->Render();
ren->ResetCamera();
iren->Initialize();
int retVal = vtkRegressionTestImage( renWin.GetPointer() );
if( retVal == vtkRegressionTester::DO_INTERACTOR)
{
iren->Start();
}
return !retVal;
}
...@@ -81,7 +81,8 @@ int TestGPURayCastClipping(int argc, char *argv[]) ...@@ -81,7 +81,8 @@ int TestGPURayCastClipping(int argc, char *argv[])
clipPlane1->SetNormal(0.8, 0.0, 0.0); clipPlane1->SetNormal(0.8, 0.0, 0.0);
vtkNew<vtkPlane> clipPlane2; vtkNew<vtkPlane> clipPlane2;
clipPlane2->SetOrigin(0.0, 0.35 * (bounds[2] + bounds[3]), 0.0); clipPlane2->SetOrigin(0.45 * (bounds[0] + bounds[1]),
0.35 * (bounds[2] + bounds[3]), 0.0);
clipPlane2->SetNormal(0.2, -0.2, 0.0); clipPlane2->SetNormal(0.2, -0.2, 0.0);
vtkNew<vtkPlaneCollection> clipPlaneCollection; vtkNew<vtkPlaneCollection> clipPlaneCollection;
......
#include <vtkSmartPointer.h>
#include <vtkPlanes.h>
#include <vtkCamera.h>
#include <vtkSphereSource.h>
#include <vtkPolyDataMapper.h>
#include <vtkActor.h>
#include <vtkRenderWindow.h>
#include <vtkRenderer.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkPolyData.h>
#include <vtkPointData.h>
/*=========================================================================
Program: Visualization Toolkit
Module: TestGPURayCastTwoComponentsIndependent.cxx
Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
All rights reserved.
See Copyright.txt or http://www.kitware.com/Copyright.htm for details.
This software is distributed WITHOUT ANY WARRANTY; without even
the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
PURPOSE. See the above copyright notice for more information.
=========================================================================*/
// Description
// This test creates a vtkImageData with two components.
// The data is volume rendered considering the two components as independent.
#include "vtkCamera.h"
#include "vtkColorTransferFunction.h"
#include "vtkGPUVolumeRayCastMapper.h"
#include "vtkImageData.h"
#include "vtkNew.h"
#include "vtkPiecewiseFunction.h"
#include "vtkRegressionTestImage.h"
#include "vtkRenderer.h"
#include "vtkRenderWindow.h"
#include "vtkRenderWindowInteractor.h"
#include "vtkTesting.h"
#include "vtkTestUtilities.h"
#include "vtkVolume.h"
#include "vtkVolumeProperty.h"
#include "vtkUnsignedShortArray.h"
int TestGPURayCastTwoComponentsGradient(int argc, char *argv[])
{
cout << "CTEST_FULL_OUTPUT (Avoid ctest truncation of output)" << endl;
int dims[3] = { 35, 35, 35 };
// Create a vtkImageData with two components
vtkNew<vtkImageData> image;
image->SetDimensions(dims[0], dims[1], dims[2]);
image->AllocateScalars(VTK_DOUBLE, 2);
// Fill the first half rectangular parallelopiped along X with the
// first component values and the second half with second component values
double * ptr = static_cast<double *> (image->GetScalarPointer(0, 0, 0));
for (int z = 0; z < dims[2]; ++z)
{
for (int y = 0; y < dims[1]; ++y)
{
for (int x = 0; x < dims[0]; ++x)
{
if (x < dims[0] / 2)
{
*ptr++ = 0.0;
*ptr++ = 0.0;
}
else
{
*ptr++ = 1.0;
*ptr++ = 1.0;
}
}
}
}
vtkNew<vtkRenderWindow> renWin;
renWin->SetSize(301, 300); // Intentional NPOT size
renWin->SetMultiSamples(0);
vtkNew<vtkRenderer> ren;
renWin->AddRenderer(ren.GetPointer());
vtkNew<vtkRenderWindowInteractor> iren;
iren->SetRenderWindow(renWin.GetPointer());
renWin->Render();
// Volume render the dataset
vtkNew<vtkGPUVolumeRayCastMapper> mapper;
mapper->AutoAdjustSampleDistancesOff();
mapper->SetSampleDistance(0.9);
mapper->SetInputData(image.GetPointer());
// Color transfer function
vtkNew<vtkColorTransferFunction> ctf1;
ctf1->AddRGBPoint(0.0, 0.0, 0.0, 0.0);
ctf1->AddRGBPoint(1.0, 1.0, 0.0, 0.0);
vtkNew<vtkColorTransferFunction> ctf2;
ctf2->AddRGBPoint(0.0, 0.0, 0.0, 0.0);
ctf2->AddRGBPoint(1.0, 0.0, 0.0, 1.0);
// Opacity functions
vtkNew<vtkPiecewiseFunction> pf1;
pf1->AddPoint(0.0, 0.0);
pf1->AddPoint(1.0, 1.0);
vtkNew<vtkPiecewiseFunction> pf2;
pf2->AddPoint(0.0, 0.0);
pf2->AddPoint(1.0, 1.0);
// Gradient Opacity function
vtkNew<vtkPiecewiseFunction> pf3;
pf3->AddPoint(0.0, 0.0);
pf3->AddPoint(1.0, 1.0);
vtkNew<vtkPiecewiseFunction> pf4;
pf4->AddPoint(0.0, 0.0);
pf4->AddPoint(1.0, 1.0);
// Volume property with independent components ON
vtkNew<vtkVolumeProperty> property;
property->IndependentComponentsOn();
// Set color and opacity functions
property->SetColor(0, ctf1.GetPointer());
property->SetColor(1, ctf2.GetPointer());
property->SetScalarOpacity(0, pf1.GetPointer());
property->SetScalarOpacity(1, pf2.GetPointer());
property->SetGradientOpacity(0, pf3.GetPointer());
property->SetGradientOpacity(1, pf4.GetPointer());
vtkNew<vtkVolume> volume;
volume->SetMapper(mapper.GetPointer());
volume->SetProperty(property.GetPointer());
ren->AddVolume(volume.GetPointer());
ren->ResetCamera();
renWin->Render();
iren->Initialize();
int retVal = vtkRegressionTestImage( renWin.GetPointer() );
if( retVal == vtkRegressionTester::DO_INTERACTOR)
{
iren->Start();
}
return !retVal;
}
8a9b985a6e629a234bc8d8d343b2c8a2 54622bc7c096d584f32fdf60b4d6495f
...@@ -45,6 +45,7 @@ vtkGPUVolumeRayCastMapper::vtkGPUVolumeRayCastMapper() ...@@ -45,6 +45,7 @@ vtkGPUVolumeRayCastMapper::vtkGPUVolumeRayCastMapper()
this->MinimumImageSampleDistance = 1.0; this->MinimumImageSampleDistance = 1.0;
this->MaximumImageSampleDistance = 10.0; this->MaximumImageSampleDistance = 10.0;
this->RenderToImage = 0; this->RenderToImage = 0;
this->UseJittering = 1;
this->SampleDistance = 1.0; this->SampleDistance = 1.0;
this->SmallVolumeRender = 0; this->SmallVolumeRender = 0;
this->BigTimeToDraw = 0.0; this->BigTimeToDraw = 0.0;
......
...@@ -46,6 +46,14 @@ public: ...@@ -46,6 +46,14 @@ public:
vtkGetMacro( AutoAdjustSampleDistances, int ); vtkGetMacro( AutoAdjustSampleDistances, int );
vtkBooleanMacro( AutoAdjustSampleDistances, int ); vtkBooleanMacro( AutoAdjustSampleDistances, int );
// Description:
// If UseJittering is on, each ray traversal direction will be
// perturbed slightly using a noise-texture to get rid of wood-grain
// effect.
vtkSetClampMacro( UseJittering, int, 0, 1 );
vtkGetMacro( UseJittering, int );
vtkBooleanMacro( UseJittering, int );
// Description: // Description:
// Set/Get the distance between samples used for rendering // Set/Get the distance between samples used for rendering
// when AutoAdjustSampleDistances is off, or when this mapper // when AutoAdjustSampleDistances is off, or when this mapper
...@@ -276,6 +284,9 @@ protected: ...@@ -276,6 +284,9 @@ protected:
// Render to texture mode flag // Render to texture mode flag
int RenderToImage; int RenderToImage;
// Enable / disable stochasting jittering
int UseJittering;
// The distance between sample points along the ray // The distance between sample points along the ray
float SampleDistance; float SampleDistance;
......
...@@ -42,6 +42,7 @@ vec3 g_dataPos; ...@@ -42,6 +42,7 @@ vec3 g_dataPos;
vec3 g_dirStep; vec3 g_dirStep;
vec4 g_srcColor; vec4 g_srcColor;
vec4 g_eyePosObj; vec4 g_eyePosObj;
bool g_exit;
uniform vec4 in_volume_scale; uniform vec4 in_volume_scale;
uniform vec4 in_volume_bias; uniform vec4 in_volume_bias;
...@@ -88,6 +89,7 @@ void main() ...@@ -88,6 +89,7 @@ void main()
g_fragColor = vec4(0.0); g_fragColor = vec4(0.0);
g_dirStep = vec3(0.0); g_dirStep = vec3(0.0);
g_srcColor = vec4(0.0); g_srcColor = vec4(0.0);
g_exit = false;
//VTK::Base::Init //VTK::Base::Init
...@@ -102,7 +104,7 @@ void main() ...@@ -102,7 +104,7 @@ void main()
//VTK::RenderToImage::Depth::Init //VTK::RenderToImage::Depth::Init
/// For all samples along the ray /// For all samples along the ray
while (true) while (!g_exit)
{ {
//VTK::Base::Impl //VTK::Base::Impl
......
...@@ -112,6 +112,11 @@ public: ...@@ -112,6 +112,11 @@ public:
this->TextureSize[0] = this->TextureSize[1] = this->TextureSize[2] = -1; this->TextureSize[0] = this->TextureSize[1] = this->TextureSize[2] = -1;
this->WindowLowerLeft[0] = this->WindowLowerLeft[1] = 0; this->WindowLowerLeft[0] = this->WindowLowerLeft[1] = 0;
this->WindowSize[0] = this->WindowSize[1] = 0; this->WindowSize[0] = this->WindowSize[1] = 0;
this->ScalarsRange[0][0] = this->ScalarsRange[0][1] = 0.0;
this->ScalarsRange[1][0] = this->ScalarsRange[1][1] = 0.0;
this->ScalarsRange[2][0] = this->ScalarsRange[2][1] = 0.0;
this->ScalarsRange[3][0] = this->ScalarsRange[3][1] = 0.0;
this->CellScale[0] = this->CellScale[1] = this->CellScale[2] = 0.0; this->CellScale[0] = this->CellScale[1] = this->CellScale[2] = 0.0;
this->NoiseTextureData = 0; this->NoiseTextureData = 0;
...@@ -128,7 +133,6 @@ public: ...@@ -128,7 +133,6 @@ public:
this->MaskTextures = new vtkMapMaskTextureId; this->MaskTextures = new vtkMapMaskTextureId;
this->ScalarsRange.clear();
this->Scale.clear(); this->Scale.clear();
this->Bias.clear(); this->Bias.clear();
...@@ -181,7 +185,6 @@ public: ...@@ -181,7 +185,6 @@ public:
delete this->MaskTextures; delete this->MaskTextures;
this->ScalarsRange.clear();
this->Scale.clear(); this->Scale.clear();
this->Bias.clear(); this->Bias.clear();
} }
...@@ -201,6 +204,8 @@ public: ...@@ -201,6 +204,8 @@ public:
static void ToFloat(T (&in)[2], float (&out)[2]); static void ToFloat(T (&in)[2], float (&out)[2]);
template<typename T> template<typename T>
static void ToFloat(T& in, float& out); static void ToFloat(T& in, float& out);
template<typename T>
static void ToFloat(T (&in)[4][2], float (&out)[4][2]);
void Initialize(vtkRenderer* ren, vtkVolume* vol, void Initialize(vtkRenderer* ren, vtkVolume* vol,
int noOfComponents, int independentComponents); int noOfComponents, int independentComponents);
...@@ -316,9 +321,8 @@ public: ...@@ -316,9 +321,8 @@ public:
int TextureSize[3]; int TextureSize[3];
int WindowLowerLeft[2]; int WindowLowerLeft[2];
int WindowSize[2]; int WindowSize[2];
int LastWindowSize[2];
std::vector< std::vector<double> > ScalarsRange; double ScalarsRange[4][2];
double LoadedBounds[6]; double LoadedBounds[6];
int Extents[6]; int Extents[6];
double DatasetStepSize[3]; double DatasetStepSize[3];
...@@ -432,6 +436,21 @@ void vtkOpenGLGPUVolumeRayCastMapper::vtkInternal::ToFloat( ...@@ -432,6 +436,21 @@ void vtkOpenGLGPUVolumeRayCastMapper::vtkInternal::ToFloat(
out = static_cast<float>(in); out = static_cast<float>(in);
} }
//----------------------------------------------------------------------------
template<typename T>
void vtkOpenGLGPUVolumeRayCastMapper::vtkInternal::ToFloat(
T (&in)[4][2], float (&out)[4][2])
{
out[0][0] = static_cast<float>(in[0][0]);
out[0][1] = static_cast<float>(in[0][1]);
out[1][0] = static_cast<float>(in[1][0]);
out[1][1] = static_cast<float>(in[1][1]);
out[2][0] = static_cast<float>(in[2][0]);
out[2][1] = static_cast<float>(in[2][1]);
out[3][0] = static_cast<float>(in[3][0]);
out[3][1] = static_cast<float>(in[3][1]);
}
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
void vtkOpenGLGPUVolumeRayCastMapper::vtkInternal::Initialize( void vtkOpenGLGPUVolumeRayCastMapper::vtkInternal::Initialize(
vtkRenderer* vtkNotUsed(ren), vtkVolume* vol, int vtkRenderer* vtkNotUsed(ren), vtkVolume* vol, int
...@@ -699,8 +718,8 @@ bool vtkOpenGLGPUVolumeRayCastMapper::vtkInternal::LoadVolume( ...@@ -699,8 +718,8 @@ bool vtkOpenGLGPUVolumeRayCastMapper::vtkInternal::LoadVolume(
for (int n = 0; n < noOfComponents; ++n) for (int n = 0; n < noOfComponents; ++n)
{ {
double oglA = this->ScalarsRange[n][0]*oglScale + oglBias; double oglA = this->ScalarsRange[n][0] * oglScale + oglBias;
double oglB = this->ScalarsRange[n][1]*oglScale + oglBias; double oglB = this->ScalarsRange[n][1] * oglScale + oglBias;
scale[n] = 1.0/ (oglB - oglA); scale[n] = 1.0/ (oglB - oglA);
bias[n] = 0.0 - oglA*scale[n]; bias[n] = 0.0 - oglA*scale[n];
} }
...@@ -712,6 +731,16 @@ bool vtkOpenGLGPUVolumeRayCastMapper::vtkInternal::LoadVolume( ...@@ -712,6 +731,16 @@ bool vtkOpenGLGPUVolumeRayCastMapper::vtkInternal::LoadVolume(
// Update texture size // Update texture size
imageData->GetExtent(this->Extents); imageData->GetExtent(this->Extents);
if (this->Parent->CellFlag)
{
int i = 1;
while (i < 6)
{
this->Extents[i]--;
i += 2;
}
}
int i = 0; int i = 0;
while(i < 3) while(i < 3)
{ {
...@@ -910,6 +939,17 @@ void vtkOpenGLGPUVolumeRayCastMapper::vtkInternal::ComputeBounds( ...@@ -910,6 +939,17 @@ void vtkOpenGLGPUVolumeRayCastMapper::vtkInternal::ComputeBounds(
input->GetOrigin(origin); input->GetOrigin(origin);
input->GetExtent(this->Extents); input->GetExtent(this->Extents);
if (this->Parent->CellFlag)
{
int i = 1;
while (i < 6)
{
this->Extents[i]--;
i += 2;
}
}
int swapBounds[3]; int swapBounds[3];
swapBounds[0] = (this->CellSpacing[0] < 0); swapBounds[0] = (this->CellSpacing[0] < 0);
swapBounds[1] = (this->CellSpacing[1] < 0); swapBounds[1] = (this->CellSpacing[1] < 0);
...@@ -1771,7 +1811,7 @@ void vtkOpenGLGPUVolumeRayCastMapper::vtkInternal::UpdateCropping( ...@@ -1771,7 +1811,7 @@ void vtkOpenGLGPUVolumeRayCastMapper::vtkInternal::UpdateCropping(
static_cast<float>(croppingRegionPlanes[4]), static_cast<float>(croppingRegionPlanes[4]),
static_cast<float>(croppingRegionPlanes[5]) }; static_cast<float>(croppingRegionPlanes[5]) };
this->ShaderProgram->SetUniform1fv("cropping_planes", 6, cropPlanes); this->ShaderProgram->SetUniform1fv("in_croppingPlanes", 6, cropPlanes);
const int numberOfRegions = 32; const int numberOfRegions = 32;
int cropFlagsArray[numberOfRegions]; int cropFlagsArray[numberOfRegions];
cropFlagsArray[0] = 0; cropFlagsArray[0] = 0;
...@@ -1787,7 +1827,7 @@ void vtkOpenGLGPUVolumeRayCastMapper::vtkInternal::UpdateCropping( ...@@ -1787,7 +1827,7 @@ void vtkOpenGLGPUVolumeRayCastMapper::vtkInternal::UpdateCropping(
cropFlagsArray[i] = 0; cropFlagsArray[i] = 0;
} }
this->ShaderProgram->SetUniform1iv("cropping_flags", this->ShaderProgram->SetUniform1iv("in_croppingFlags",
numberOfRegions, numberOfRegions,
cropFlagsArray); cropFlagsArray);
} }
...@@ -1820,11 +1860,8 @@ void vtkOpenGLGPUVolumeRayCastMapper::vtkInternal::UpdateClipping( ...@@ -1820,11 +1860,8 @@ void vtkOpenGLGPUVolumeRayCastMapper::vtkInternal::UpdateClipping(
clippingPlanes.push_back(planeNormal[2]); clippingPlanes.push_back(planeNormal[2]);
} }
double croppingRegionPlanes[6]; clippingPlanes[0] = clippingPlanes.size() > 1 ?
this->Parent->GetCroppingRegionPlanes(croppingRegionPlanes); static_cast<int>(clippingPlanes.size() - 1): 0;
clippingPlanes[0] = clippingPlanes.size() > 0 ?
(clippingPlanes.size() - 1) : 0;
this->ShaderProgram->SetUniform1fv("in_clippingPlanes", this->ShaderProgram->SetUniform1fv("in_clippingPlanes",
static_cast<int>(clippingPlanes.size()), static_cast<int>(clippingPlanes.size()),
...@@ -2252,8 +2289,9 @@ void vtkOpenGLGPUVolumeRayCastMapper::BuildShader(vtkRenderer* ren, ...@@ -2252,8 +2289,9 @@ void vtkOpenGLGPUVolumeRayCastMapper::BuildShader(vtkRenderer* ren,
fragmentShader, fragmentShader,
"//VTK::Base::Dec", "//VTK::Base::Dec",
vtkvolume::BaseDeclarationFragment(ren, this, vol, this->Impl->NumberOfLights, vtkvolume::BaseDeclarationFragment(ren, this, vol, this->Impl->NumberOfLights,
this->Impl->LightComplexity, noOfComponents, this->Impl->LightComplexity,
independentComponents), vol->GetProperty()->HasGradientOpacity(),
noOfComponents, independentComponents),
true); true);
fragmentShader = vtkvolume::replace( fragmentShader = vtkvolume::replace(
...@@ -2390,7 +2428,6 @@ void vtkOpenGLGPUVolumeRayCastMapper::BuildShader(vtkRenderer* ren, ...@@ -2390,7 +2428,6 @@ void vtkOpenGLGPUVolumeRayCastMapper::BuildShader(vtkRenderer* ren,
"//VTK::Cropping::Dec", "//VTK::Cropping::Dec",
vtkvolume::CroppingDeclarationVertex(ren, this, vol), vtkvolume::CroppingDeclarationVertex(ren, this, vol),
true); true);
fragmentShader = vtkvolume::replace( fragmentShader = vtkvolume::replace(
fragmentShader,