00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #include "vtkMitkVolumeTextureMapper3D.h"
00019 #include "mitkCommon.h"
00020
00021 #define GPU_INFO MITK_INFO("mapper.vr")
00022 #define GPU_WARN MITK_WARN("mapper.vr")
00023
00024 #include "vtkCamera.h"
00025 #include "vtkColorTransferFunction.h"
00026 #include "vtkDataArray.h"
00027 #include "vtkImageData.h"
00028 #include "vtkMath.h"
00029 #include "vtkMatrix4x4.h"
00030 #include "vtkPiecewiseFunction.h"
00031 #include "vtkPointData.h"
00032 #include "vtkRenderer.h"
00033 #include "vtkVolume.h"
00034 #include "vtkVolumeProperty.h"
00035 #include "vtkVolumeRenderingFactory.h"
00036
00037 vtkCxxRevisionMacro(vtkMitkVolumeTextureMapper3D, "$Revision: 1.16 $");
00038
00039
00040
00041 vtkInstantiatorNewMacro(vtkMitkVolumeTextureMapper3D);
00042
00043
00044
00045 vtkMitkVolumeTextureMapper3D::vtkMitkVolumeTextureMapper3D()
00046 {
00047
00048
00049 this->PolygonBuffer = NULL;
00050 this->IntersectionBuffer = NULL;
00051 this->NumberOfPolygons = 0;
00052 this->BufferSize = 0;
00053
00054
00055 this->SavedTextureInput = NULL;
00056
00057
00058 this->SavedParametersInput = NULL;
00059
00060 this->SavedRGBFunction = NULL;
00061 this->SavedGrayFunction = NULL;
00062 this->SavedScalarOpacityFunction = NULL;
00063 this->SavedGradientOpacityFunction = NULL;
00064 this->SavedColorChannels = 0;
00065 this->SavedSampleDistance = 0;
00066 this->SavedScalarOpacityDistance = 0;
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078 this->VolumeSpacing[0] = this->VolumeSpacing[1] = this->VolumeSpacing[2] = 0;
00079 this->VolumeDimensions[0]=0;
00080 this->VolumeDimensions[1]=0;
00081 this->VolumeDimensions[2]=0;
00082
00083 this->SampleDistance = 1.0;
00084 this->ActualSampleDistance = 1.0;
00085
00086 this->UseCompressedTexture = false;
00087 this->SupportsNonPowerOfTwoTextures = false;
00088
00089
00090 }
00091
00092
00093 vtkMitkVolumeTextureMapper3D::~vtkMitkVolumeTextureMapper3D()
00094 {
00095
00096
00097 delete [] this->PolygonBuffer;
00098 delete [] this->IntersectionBuffer;
00099
00100
00101
00102
00103
00104 }
00105
00106
00107
00108 vtkMitkVolumeTextureMapper3D *vtkMitkVolumeTextureMapper3D::New()
00109 {
00110
00111
00112
00113 vtkObject* ret =
00114 vtkVolumeRenderingFactory::CreateInstance("vtkMitkVolumeTextureMapper3D");
00115 return static_cast<vtkMitkVolumeTextureMapper3D *>(ret);
00116 }
00117
00118
00119 void vtkMitkVolumeTextureMapper3D::ComputePolygons( vtkRenderer *ren,
00120 vtkVolume *vol,
00121 double inBounds[6] )
00122 {
00123
00124
00125
00126 double focalPoint[4], position[4];
00127 double plane[4];
00128 vtkCamera *camera = ren->GetActiveCamera();
00129
00130 camera->GetPosition( position );
00131 camera->GetFocalPoint( focalPoint );
00132
00133 position[3] = 1.0;
00134 focalPoint[3] = 1.0;
00135
00136
00137
00138
00139
00140
00141
00142
00143 vtkMatrix4x4 *matrix = vtkMatrix4x4::New();
00144 vol->GetMatrix( matrix );
00145 matrix->Invert();
00146 matrix->MultiplyPoint( position, position );
00147 matrix->MultiplyPoint( focalPoint, focalPoint );
00148 matrix->Delete();
00149
00150 if ( position[3] )
00151 {
00152 position[0] /= position[3];
00153 position[1] /= position[3];
00154 position[2] /= position[3];
00155 }
00156
00157 if ( focalPoint[3] )
00158 {
00159 focalPoint[0] /= focalPoint[3];
00160 focalPoint[1] /= focalPoint[3];
00161 focalPoint[2] /= focalPoint[3];
00162 }
00163
00164
00165 plane[0] = focalPoint[0] - position[0];
00166 plane[1] = focalPoint[1] - position[1];
00167 plane[2] = focalPoint[2] - position[2];
00168
00169 vtkMath::Normalize( plane );
00170
00171 plane[3] = -(plane[0] * position[0] + plane[1] * position[1] +
00172 plane[2] * position[2]);
00173
00174
00175 double minDistance = VTK_DOUBLE_MAX;
00176 double maxDistance = VTK_DOUBLE_MIN;
00177
00178
00179
00180
00181 double volBounds[6];
00182 this->GetInput()->GetBounds( volBounds );
00183
00184 double bounds[6];
00185 bounds[0] = (inBounds[0]>volBounds[0])?(inBounds[0]):(volBounds[0]);
00186 bounds[1] = (inBounds[1]<volBounds[1])?(inBounds[1]):(volBounds[1]);
00187 bounds[2] = (inBounds[2]>volBounds[2])?(inBounds[2]):(volBounds[2]);
00188 bounds[3] = (inBounds[3]<volBounds[3])?(inBounds[3]):(volBounds[3]);
00189 bounds[4] = (inBounds[4]>volBounds[4])?(inBounds[4]):(volBounds[4]);
00190 bounds[5] = (inBounds[5]<volBounds[5])?(inBounds[5]):(volBounds[5]);
00191
00192
00193 int i, j, k;
00194 double vertices[8][3];
00195
00196 int idx = 0;
00197
00198 for ( k = 0; k < 2; k++ )
00199 {
00200 for ( j = 0; j < 2; j++ )
00201 {
00202 for ( i = 0; i < 2; i++ )
00203 {
00204 vertices[idx][2] = bounds[4+k];
00205 vertices[idx][1] = bounds[2+j];
00206 vertices[idx][0] = bounds[i];
00207
00208 double d =
00209 plane[0] * vertices[idx][0] +
00210 plane[1] * vertices[idx][1] +
00211 plane[2] * vertices[idx][2] +
00212 plane[3];
00213
00214 idx++;
00215
00216
00217 minDistance = (d<minDistance)?(d):(minDistance);
00218 maxDistance = (d>maxDistance)?(d):(maxDistance);
00219
00220 }
00221 }
00222 }
00223
00224 int dim[6];
00225 this->GetVolumeDimensions(dim);
00226
00227 float tCoordOffset[3], tCoordScale[3];
00228
00229 tCoordOffset[0] = 0.5 / dim[0];
00230 tCoordOffset[1] = 0.5 / dim[1];
00231 tCoordOffset[2] = 0.5 / dim[2];
00232
00233 tCoordScale[0] = (dim[0]-1) / static_cast<float>(dim[0]);
00234 tCoordScale[1] = (dim[1]-1) / static_cast<float>(dim[1]);
00235 tCoordScale[2] = (dim[2]-1) / static_cast<float>(dim[2]);
00236
00237 float spacing[3];
00238 this->GetVolumeSpacing( spacing );
00239
00240 double offset =
00241 0.333 * 0.5 * (spacing[0] + spacing[1] + spacing[2]);
00242
00243 minDistance += 0.1*offset;
00244 maxDistance -= 0.1*offset;
00245
00246 minDistance = (minDistance < offset)?(offset):(minDistance);
00247
00248 double stepSize = this->ActualSampleDistance;
00249
00250
00251 int numPolys = static_cast<int>(
00252 (maxDistance - minDistance)/static_cast<double>(stepSize));
00253
00254
00255 if ( this->BufferSize < numPolys )
00256 {
00257 delete [] this->PolygonBuffer;
00258 delete [] this->IntersectionBuffer;
00259
00260 this->BufferSize = numPolys;
00261
00262 this->PolygonBuffer = new float [36*this->BufferSize];
00263 this->IntersectionBuffer = new float [12*this->BufferSize];
00264 }
00265
00266 this->NumberOfPolygons = numPolys;
00267
00268
00269 int lines[12][2] = { {0,1}, {1,3}, {2,3}, {0,2},
00270 {4,5}, {5,7}, {6,7}, {4,6},
00271 {0,4}, {1,5}, {3,7}, {2,6} };
00272
00273 float *iptr, *pptr;
00274
00275 for ( i = 0; i < 12; i++ )
00276 {
00277 double line[3];
00278
00279 line[0] = vertices[lines[i][1]][0] - vertices[lines[i][0]][0];
00280 line[1] = vertices[lines[i][1]][1] - vertices[lines[i][0]][1];
00281 line[2] = vertices[lines[i][1]][2] - vertices[lines[i][0]][2];
00282
00283 double d = maxDistance;
00284
00285 iptr = this->IntersectionBuffer + i;
00286
00287 double planeDotLineOrigin = vtkMath::Dot( plane, vertices[lines[i][0]] );
00288 double planeDotLine = vtkMath::Dot( plane, line );
00289
00290 double t, increment;
00291
00292 if ( planeDotLine != 0.0 )
00293 {
00294 t = (d - planeDotLineOrigin - plane[3] ) / planeDotLine;
00295 increment = -stepSize / planeDotLine;
00296 }
00297 else
00298 {
00299 t = -1.0;
00300 increment = 0.0;
00301 }
00302
00303 for ( j = 0; j < numPolys; j++ )
00304 {
00305 *iptr = (t > 0.0 && t < 1.0)?(t):(-1.0);
00306
00307 t += increment;
00308 iptr += 12;
00309 }
00310 }
00311
00312
00313 int neighborLines[12][6] =
00314 { { 1, 2, 3, 4, 8, 9}, { 0, 2, 3, 5, 9, 10},
00315 { 0, 1, 3, 6, 10, 11}, { 0, 1, 2, 7, 8, 11},
00316 { 0, 5, 6, 7, 8, 9}, { 1, 4, 6, 7, 9, 10},
00317 { 2, 4, 5, 7, 10, 11}, { 3, 4, 5, 6, 8, 11},
00318 { 0, 3, 4, 7, 9, 11}, { 0, 1, 4, 5, 8, 10},
00319 { 1, 2, 5, 6, 9, 11}, { 2, 3, 6, 7, 8, 10} };
00320
00321 float tCoord[12][4] =
00322 {{0,0,0,0}, {1,0,0,1}, {0,1,0,0}, {0,0,0,1},
00323 {0,0,1,0}, {1,0,1,1}, {0,1,1,0}, {0,0,1,1},
00324 {0,0,0,2}, {1,0,0,2}, {1,1,0,2}, {0,1,0,2}};
00325
00326 double low[3];
00327 double high[3];
00328
00329 low[0] = (bounds[0] - volBounds[0]) / (volBounds[1] - volBounds[0]);
00330 high[0] = (bounds[1] - volBounds[0]) / (volBounds[1] - volBounds[0]);
00331 low[1] = (bounds[2] - volBounds[2]) / (volBounds[3] - volBounds[2]);
00332 high[1] = (bounds[3] - volBounds[2]) / (volBounds[3] - volBounds[2]);
00333 low[2] = (bounds[4] - volBounds[4]) / (volBounds[5] - volBounds[4]);
00334 high[2] = (bounds[5] - volBounds[4]) / (volBounds[5] - volBounds[4]);
00335
00336 for ( i = 0; i < 12; i++ )
00337 {
00338 tCoord[i][0] = (tCoord[i][0])?(high[0]):(low[0]);
00339 tCoord[i][1] = (tCoord[i][1])?(high[1]):(low[1]);
00340 tCoord[i][2] = (tCoord[i][2])?(high[2]):(low[2]);
00341 }
00342
00343 iptr = this->IntersectionBuffer;
00344 pptr = this->PolygonBuffer;
00345
00346 for ( i = 0; i < numPolys; i++ )
00347 {
00348
00349 int start = 0;
00350
00351 while ( start < 12 && iptr[start] == -1.0 )
00352 {
00353 start++;
00354 }
00355
00356 if ( start == 12 )
00357 {
00358 pptr[0] = -1.0;
00359 }
00360 else
00361 {
00362 int current = start;
00363 int previous = -1;
00364 int errFlag = 0;
00365
00366 idx = 0;
00367
00368 while ( idx < 6 && !errFlag && ( idx == 0 || current != start) )
00369 {
00370 double t = iptr[current];
00371
00372 *(pptr + idx*6) =
00373 tCoord[current][0] * tCoordScale[0] + tCoordOffset[0];
00374 *(pptr + idx*6 + 1) =
00375 tCoord[current][1] * tCoordScale[1] + tCoordOffset[1];
00376 *(pptr + idx*6 + 2) =
00377 tCoord[current][2] * tCoordScale[2] + tCoordOffset[2];
00378
00379 int coord = static_cast<int>(tCoord[current][3]);
00380 *(pptr + idx*6 + coord) =
00381 (low[coord] + t*(high[coord]-low[coord]))*tCoordScale[coord] + tCoordOffset[coord];
00382
00383 *(pptr + idx*6 + 3) = static_cast<float>(
00384 vertices[lines[current][0]][0] +
00385 t*(vertices[lines[current][1]][0] - vertices[lines[current][0]][0]));
00386
00387 *(pptr + idx*6 + 4) = static_cast<float>(
00388 vertices[lines[current][0]][1] +
00389 t*(vertices[lines[current][1]][1] - vertices[lines[current][0]][1]));
00390
00391 *(pptr + idx*6 + 5) = static_cast<float>(
00392 vertices[lines[current][0]][2] +
00393 t*(vertices[lines[current][1]][2] - vertices[lines[current][0]][2]));
00394
00395 idx++;
00396
00397 j = 0;
00398
00399 while ( j < 6 &&
00400 (*(this->IntersectionBuffer + i*12 +
00401 neighborLines[current][j]) < 0 ||
00402 neighborLines[current][j] == previous) )
00403 {
00404 j++;
00405 }
00406
00407 if ( j >= 6 )
00408 {
00409 errFlag = 1;
00410 }
00411 else
00412 {
00413 previous = current;
00414 current = neighborLines[current][j];
00415 }
00416 }
00417
00418 if ( idx < 6 )
00419 {
00420 *(pptr + idx*6) = -1;
00421 }
00422 }
00423
00424 iptr += 12;
00425 pptr += 36;
00426 }
00427 }
00428
00429 void vtkMitkVolumeTextureMapper3D::UpdateMTime()
00430 {
00431 this->SavedTextureMTime.Modified();
00432 }
00433
00434
00435
00436
00437
00438 int vtkMitkVolumeTextureMapper3D::UpdateColorLookup( vtkVolume *vol )
00439 {
00440
00441
00442 int needToUpdate = 0;
00443
00444
00445 vtkImageData *input = this->GetInput();
00446 input->Update();
00447
00448
00449 if ( this->SavedParametersInput != input ||
00450 this->SavedParametersMTime.GetMTime() < input->GetMTime() )
00451 {
00452 needToUpdate = 1;
00453 }
00454
00455
00456
00457
00458
00459 this->ActualSampleDistance = this->SampleDistance;
00460 if ( vol->GetAllocatedRenderTime() < 1.0 )
00461 {
00462 float spacing[3];
00463 this->GetVolumeSpacing(spacing);
00464 this->ActualSampleDistance =
00465 0.333 * (static_cast<double>(spacing[0]) + static_cast<double>(spacing[1]) + static_cast<double>(spacing[2]));
00466 }
00467
00468
00469 int components = input->GetNumberOfScalarComponents();
00470
00471
00472 if ( this->SavedSampleDistance != this->ActualSampleDistance )
00473 {
00474 needToUpdate = 1;
00475 }
00476
00477 vtkColorTransferFunction *rgbFunc = NULL;
00478 vtkPiecewiseFunction *grayFunc = NULL;
00479
00480
00481 int colorChannels = vol->GetProperty()->GetColorChannels(0);
00482
00483 if ( components < 3 )
00484 {
00485
00486 if ( this->SavedColorChannels != colorChannels )
00487 {
00488 needToUpdate = 1;
00489 }
00490
00491
00492
00493 if ( colorChannels == 3 )
00494 {
00495 rgbFunc = vol->GetProperty()->GetRGBTransferFunction(0);
00496 if ( this->SavedRGBFunction != rgbFunc ||
00497 this->SavedParametersMTime.GetMTime() < rgbFunc->GetMTime() )
00498 {
00499 needToUpdate = 1;
00500 }
00501 }
00502
00503
00504
00505 if ( colorChannels == 1 )
00506 {
00507 grayFunc = vol->GetProperty()->GetGrayTransferFunction(0);
00508 if ( this->SavedGrayFunction != grayFunc ||
00509 this->SavedParametersMTime.GetMTime() < grayFunc->GetMTime() )
00510 {
00511 needToUpdate = 1;
00512 }
00513 }
00514 }
00515
00516
00517 vtkPiecewiseFunction *scalarOpacityFunc =
00518 vol->GetProperty()->GetScalarOpacity(0);
00519 if ( this->SavedScalarOpacityFunction != scalarOpacityFunc ||
00520 this->SavedParametersMTime.GetMTime() <
00521 scalarOpacityFunc->GetMTime() )
00522 {
00523 needToUpdate = 1;
00524 }
00525
00526
00527 vtkPiecewiseFunction *gradientOpacityFunc =
00528 vol->GetProperty()->GetGradientOpacity(0);
00529 if ( this->SavedGradientOpacityFunction != gradientOpacityFunc ||
00530 this->SavedParametersMTime.GetMTime() <
00531 gradientOpacityFunc->GetMTime() )
00532 {
00533 needToUpdate = 1;
00534 }
00535
00536
00537 double scalarOpacityDistance =
00538 vol->GetProperty()->GetScalarOpacityUnitDistance(0);
00539 if ( this->SavedScalarOpacityDistance != scalarOpacityDistance )
00540 {
00541 needToUpdate = 1;
00542 }
00543
00544
00545 if ( !needToUpdate )
00546 {
00547 return 0;
00548 }
00549
00550 this->SavedRGBFunction = rgbFunc;
00551 this->SavedGrayFunction = grayFunc;
00552 this->SavedScalarOpacityFunction = scalarOpacityFunc;
00553 this->SavedGradientOpacityFunction = gradientOpacityFunc;
00554 this->SavedColorChannels = colorChannels;
00555 this->SavedSampleDistance = this->ActualSampleDistance;
00556 this->SavedScalarOpacityDistance = scalarOpacityDistance;
00557 this->SavedParametersInput = input;
00558
00559 this->SavedParametersMTime.Modified();
00560
00561
00562 double scalarRange[2];
00563 input->GetPointData()->GetScalars()->GetRange(scalarRange, components-1);
00564
00565 int arraySizeNeeded = this->ColorTableSize;
00566
00567 if ( components < 3 )
00568 {
00569
00570 if ( colorChannels == 1 )
00571 {
00572 grayFunc->GetTable( scalarRange[0], scalarRange[1],
00573 arraySizeNeeded, this->TempArray1 );
00574 }
00575 else
00576 {
00577 rgbFunc->GetTable( scalarRange[0], scalarRange[1],
00578 arraySizeNeeded, this->TempArray1 );
00579 }
00580 }
00581
00582 scalarOpacityFunc->GetTable( scalarRange[0], scalarRange[1],
00583 arraySizeNeeded, this->TempArray2 );
00584
00585 float goArray[256];
00586 gradientOpacityFunc->GetTable( 0, (scalarRange[1] - scalarRange[0])*0.25,
00587 256, goArray );
00588
00589
00590 int i;
00591
00592 float *fptr2 = this->TempArray2;
00593 double factor = this->ActualSampleDistance / scalarOpacityDistance;
00594 for ( i = 0; i < arraySizeNeeded; i++ )
00595 {
00596 if ( *fptr2 > 0.0001 )
00597 {
00598 *fptr2 = 1.0-pow(static_cast<double>(1.0-(*fptr2)),factor);
00599 }
00600 fptr2++;
00601 }
00602
00603 int goLoop;
00604 unsigned char *ptr, *rgbptr, *aptr;
00605 float *fptr1;
00606
00607 switch (components)
00608 {
00609 case 1:
00610
00611 ptr = this->ColorLookup;
00612 for ( goLoop = 0; goLoop < 256; goLoop++ )
00613 {
00614 fptr1 = this->TempArray1;
00615 fptr2 = this->TempArray2;
00616 if ( colorChannels == 1 )
00617 {
00618 for ( i = 0; i < arraySizeNeeded; i++ )
00619 {
00620 *(ptr++) = static_cast<unsigned char>(*(fptr1)*255.0 + 0.5);
00621 *(ptr++) = static_cast<unsigned char>(*(fptr1)*255.0 + 0.5);
00622 *(ptr++) = static_cast<unsigned char>(*(fptr1++)*255.0 + 0.5);
00623 *(ptr++) = static_cast<unsigned char>(*(fptr2++)*goArray[goLoop]*255.0 + 0.5);
00624 }
00625 }
00626 else
00627 {
00628 for ( i = 0; i < arraySizeNeeded; i++ )
00629 {
00630 *(ptr++) = static_cast<unsigned char>(*(fptr1++)*255.0 + 0.5);
00631 *(ptr++) = static_cast<unsigned char>(*(fptr1++)*255.0 + 0.5);
00632 *(ptr++) = static_cast<unsigned char>(*(fptr1++)*255.0 + 0.5);
00633 *(ptr++) = static_cast<unsigned char>(*(fptr2++)*goArray[goLoop]*255.0 + 0.5);
00634 }
00635 }
00636
00637 for ( ; i < 256; i++ )
00638 {
00639 *(ptr++) = 0;
00640 *(ptr++) = 0;
00641 *(ptr++) = 0;
00642 *(ptr++) = 0;
00643 }
00644 }
00645 break;
00646
00647 case 2:
00648
00649
00650 rgbptr = this->ColorLookup;
00651 aptr = this->AlphaLookup;
00652
00653 if ( colorChannels == 1 )
00654 {
00655 for ( i = 0; i < arraySizeNeeded; i++ )
00656 {
00657 fptr1 = this->TempArray1;
00658 fptr2 = this->TempArray2;
00659 for ( goLoop = 0; goLoop < 256; goLoop++ )
00660 {
00661 *(rgbptr++) = static_cast<unsigned char>(*(fptr1)*255.0 + 0.5);
00662 *(rgbptr++) = static_cast<unsigned char>(*(fptr1)*255.0 + 0.5);
00663 *(rgbptr++) = static_cast<unsigned char>(*(fptr1++)*255.0 + 0.5);
00664 *(aptr++) = static_cast<unsigned char>(*(fptr2++)*goArray[goLoop]*255.0 + 0.5);
00665 }
00666 }
00667 }
00668 else
00669 {
00670 fptr1 = this->TempArray1;
00671 fptr2 = this->TempArray2;
00672 for ( i = 0; i < arraySizeNeeded; i++ )
00673 {
00674 for ( goLoop = 0; goLoop < 256; goLoop++ )
00675 {
00676 *(rgbptr++) = static_cast<unsigned char>(*(fptr1)*255.0 + 0.5);
00677 *(rgbptr++) = static_cast<unsigned char>(*(fptr1+1)*255.0 + 0.5);
00678 *(rgbptr++) = static_cast<unsigned char>(*(fptr1+2)*255.0 + 0.5);
00679 *(aptr++) = static_cast<unsigned char>(*(fptr2)*goArray[goLoop]*255.0 + 0.5);
00680 }
00681 fptr1+=3;
00682 fptr2++;
00683 }
00684 }
00685
00686 for ( ; i < 256; i++ )
00687 {
00688 for ( goLoop = 0; goLoop < 256; goLoop++ )
00689 {
00690 *(rgbptr++) = 0;
00691 *(rgbptr++) = 0;
00692 *(rgbptr++) = 0;
00693 *(aptr++) = 0;
00694 }
00695 }
00696 break;
00697
00698 case 3:
00699 case 4:
00700
00701 aptr = this->AlphaLookup;
00702
00703 for ( goLoop = 0; goLoop < 256; goLoop++ )
00704 {
00705 fptr2 = this->TempArray2;
00706 for ( i = 0; i < arraySizeNeeded; i++ )
00707 {
00708 *(aptr++) = static_cast<unsigned char>(*(fptr2++)*goArray[goLoop]*255.0 + 0.5);
00709 }
00710 for ( ; i < 256; i++ )
00711 {
00712 *(aptr++) = 0;
00713 }
00714 }
00715
00716 break;
00717 }
00718 return 1;
00719 }
00720
00721
00722
00723
00724 void vtkMitkVolumeTextureMapper3D::PrintSelf(ostream& os, vtkIndent indent)
00725 {
00726 this->Superclass::PrintSelf(os,indent);
00727
00728 os << indent << "Sample Distance: " << this->SampleDistance << endl;
00729 os << indent << "NumberOfPolygons: " << this->NumberOfPolygons << endl;
00730 os << indent << "ActualSampleDistance: "
00731 << this->ActualSampleDistance << endl;
00732 os << indent << "VolumeDimensions: " << this->VolumeDimensions[0] << " "
00733 << this->VolumeDimensions[1] << " " << this->VolumeDimensions[2] << endl;
00734 os << indent << "VolumeSpacing: " << this->VolumeSpacing[0] << " "
00735 << this->VolumeSpacing[1] << " " << this->VolumeSpacing[2] << endl;
00736
00737 os << indent << "UseCompressedTexture: " << this->UseCompressedTexture
00738 << endl;
00739 }
00740
00741
00742