28 #include "vtkCamera.h" 29 #include "vtkCellData.h" 30 #include "vtkCommand.h" 31 #include "vtkDataArray.h" 32 #include "vtkGPUInfo.h" 33 #include "vtkGPUInfoList.h" 34 #include "vtkImageData.h" 35 #include "vtkImageResample.h" 36 #include "vtkMultiThreader.h" 37 #include "vtkPointData.h" 38 #include "vtkRenderWindow.h" 39 #include "vtkRenderer.h" 40 #include "vtkRendererCollection.h" 41 #include "vtkTimerLog.h" 42 #include "vtkVolume.h" 43 #include "vtkVolumeProperty.h" 76 vtkGPUInfoList *l = vtkGPUInfoList::New();
78 if (l->GetNumberOfGPUs() > 0)
80 vtkGPUInfo *
info = l->GetGPUInfo(0);
133 this->InvokeEvent(vtkCommand::VolumeMapperRenderStartEvent,
nullptr);
136 vtkTimerLog *timer = vtkTimerLog::New();
149 double t = timer->GetElapsedTime();
153 this->TimeToDraw = t;
156 if (vol->GetAllocatedRenderTime() < 1.0)
166 this->InvokeEvent(vtkCommand::VolumeMapperRenderEndEvent,
nullptr);
201 vtkErrorMacro(
"Renderer cannot be null.");
205 if (goodSoFar && !vol)
208 vtkErrorMacro(
"Volume cannot be null.");
223 if (goodSoFar && vol->GetProperty()->GetColorChannels() != 3)
234 if (goodSoFar && this->Cropping && (this->CroppingRegionPlanes[0] >= this->CroppingRegionPlanes[1] ||
235 this->CroppingRegionPlanes[2] >= this->CroppingRegionPlanes[3] ||
236 this->CroppingRegionPlanes[4] >= this->CroppingRegionPlanes[5]))
243 vtkImageData *input = this->GetInput();
253 clone = vtkImageData::New();
262 clone->ShallowCopy(input);
270 int extents[6], real_extents[6];
271 clone->GetExtent(extents);
272 clone->GetExtent(real_extents);
275 double origin[3], spacing[3];
276 clone->GetOrigin(origin);
277 clone->GetSpacing(spacing);
279 for (
int cc = 0; cc < 3; cc++)
282 origin[cc] = origin[cc] + extents[2 * cc] * spacing[cc];
283 extents[2 * cc + 1] -= extents[2 * cc];
284 extents[2 * cc] -= extents[2 * cc];
287 clone->SetOrigin(origin);
288 clone->SetExtent(extents);
293 vtkErrorMacro(
"Input is nullptr but is required");
300 vtkDataArray *scalars =
nullptr;
309 scalars = this->GetScalars(
315 vtkErrorMacro(
"No scalars found on input.");
321 vtkErrorMacro(
"Only point or cell scalar support - found field scalars instead.");
330 switch (scalars->GetDataType())
333 vtkErrorMacro(<<
"scalar of type VTK_CHAR is not supported " 334 <<
"because this type is platform dependent. " 335 <<
"Use VTK_SIGNED_CHAR or VTK_UNSIGNED_CHAR instead.");
339 vtkErrorMacro(
"scalar of type VTK_BIT is not supported by this mapper.");
343 vtkErrorMacro(
"scalar of type VTK_ID_TYPE is not supported by this mapper.");
347 vtkErrorMacro(
"scalar of type VTK_STRING is not supported by this mapper.");
359 if (this->BlendMode != vtkVolumeMapper::COMPOSITE_BLEND &&
360 this->BlendMode != vtkVolumeMapper::MAXIMUM_INTENSITY_BLEND &&
361 this->BlendMode != vtkVolumeMapper::MINIMUM_INTENSITY_BLEND)
364 vtkErrorMacro(<<
"Selected blend mode not supported. " 365 <<
"Only Composite and MIP and MinIP modes " 366 <<
"are supported by the current implementation.");
372 int numberOfComponents = 0;
375 numberOfComponents = scalars->GetNumberOfComponents();
376 if (!(numberOfComponents == 1 || (numberOfComponents == 4 && vol->GetProperty()->GetIndependentComponents() == 0)))
379 vtkErrorMacro(<<
"Only one component scalars, or four " 380 <<
"component with non-independent components, " 381 <<
"are supported by this mapper.");
386 if (goodSoFar && numberOfComponents == 4 && scalars->GetDataType() != VTK_UNSIGNED_CHAR)
389 vtkErrorMacro(
"Only unsigned char is supported for 4-component scalars!");
410 int vtkNotUsed(blend_mode),
411 double viewDirection[3],
415 int oldSwap = ren->GetRenderWindow()->GetSwapBuffers();
416 ren->GetRenderWindow()->SwapBuffersOff();
419 image->GetDimensions(dim);
420 int *size = ren->GetRenderWindow()->GetSize();
422 vtkImageData *bigImage = vtkImageData::New();
423 bigImage->SetDimensions(size[0], size[1], 1);
424 bigImage->AllocateScalars(VTK_UNSIGNED_CHAR, 3);
429 scale[0] = dim[0] /
static_cast<double>(size[0]);
430 scale[1] = dim[1] /
static_cast<double>(size[1]);
434 vtkRendererCollection *renderers = ren->GetRenderWindow()->GetRenderers();
435 int numberOfRenderers = renderers->GetNumberOfItems();
437 auto rendererVisibilities =
new bool[numberOfRenderers];
438 renderers->InitTraversal();
440 while (i < numberOfRenderers)
442 vtkRenderer *r = renderers->GetNextItem();
443 rendererVisibilities[i] = r->GetDraw() == 1;
454 vtkPropCollection *props = ren->GetViewProps();
455 int numberOfProps = props->GetNumberOfItems();
457 auto propVisibilities =
new bool[numberOfProps];
458 props->InitTraversal();
460 while (i < numberOfProps)
462 vtkProp *p = props->GetNextProp();
463 propVisibilities[i] = p->GetVisibility() == 1;
466 p->SetVisibility(
false);
471 vtkCamera *savedCamera = ren->GetActiveCamera();
472 savedCamera->Modified();
473 vtkCamera *canonicalViewCamera = vtkCamera::New();
476 double *center = volume->GetCenter();
478 volume->GetBounds(bounds);
480 sqrt((bounds[1] - bounds[0]) * (bounds[1] - bounds[0]) + (bounds[3] - bounds[2]) * (bounds[3] - bounds[2]) +
481 (bounds[5] - bounds[4]) * (bounds[5] - bounds[4]));
484 d = bounds[1] - bounds[0];
487 canonicalViewCamera->SetFocalPoint(center);
488 canonicalViewCamera->ParallelProjectionOn();
489 canonicalViewCamera->SetPosition(
490 center[0] - d * viewDirection[0], center[1] - d * viewDirection[1], center[2] - d * viewDirection[2]);
491 canonicalViewCamera->SetViewUp(viewUp);
492 canonicalViewCamera->SetParallelScale(d / 2);
494 ren->SetActiveCamera(canonicalViewCamera);
495 ren->GetRenderWindow()->Render();
497 ren->SetActiveCamera(savedCamera);
498 canonicalViewCamera->Delete();
501 vtkImageResample *resample = vtkImageResample::New();
502 resample->SetInputData(bigImage);
503 resample->SetAxisMagnificationFactor(0, scale[0]);
504 resample->SetAxisMagnificationFactor(1, scale[1]);
505 resample->SetAxisMagnificationFactor(2, 1);
506 resample->UpdateWholeExtent();
509 image->DeepCopy(resample->GetOutput());
515 props->InitTraversal();
517 while (i < numberOfProps)
519 vtkProp *p = props->GetNextProp();
520 p->SetVisibility(propVisibilities[i]);
524 delete[] propVisibilities;
527 renderers->InitTraversal();
529 while (i < numberOfRenderers)
531 vtkRenderer *r = renderers->GetNextItem();
532 r->SetDraw(rendererVisibilities[i]);
536 delete[] rendererVisibilities;
538 ren->GetRenderWindow()->SetSwapBuffers(oldSwap);
547 this->Superclass::PrintSelf(os, indent);
553 os << indent <<
"SampleDistance: " << this->
SampleDistance << endl;
556 os << indent <<
"MaskInput: " << this->
MaskInput << endl;
560 os << indent <<
"ReportProgress: " << this->
ReportProgress << endl;
577 assert(
"pre: volume_exists" && this->GetInput() !=
nullptr);
578 assert(
"pre: valid_cropping" && this->Cropping && this->CroppingRegionPlanes[0] < this->CroppingRegionPlanes[1] &&
579 this->CroppingRegionPlanes[2] < this->CroppingRegionPlanes[3] &&
580 this->CroppingRegionPlanes[4] < this->CroppingRegionPlanes[5]);
592 this->GetInput()->GetBounds(volBounds);
598 if (this->CroppingRegionPlanes[i] < volBounds[i])
608 if (this->CroppingRegionPlanes[i] > volBounds[i])
vtkImageData * TransformedInput
vtkIdType MaxMemoryInBytes
virtual void GPURender(vtkRenderer *, vtkVolume *)
void CanonicalViewRender(vtkRenderer *, vtkVolume *)
vtkMitkGPUVolumeRayCastMapper()
double ClippedCroppingRegionPlanes[6]
float MinimumImageSampleDistance
static void info(const char *fmt,...)
float MaximumImageSampleDistance
void PrintSelf(ostream &os, vtkIndent indent) override
vtkCxxSetObjectMacro(vtkMitkGPUVolumeRayCastMapper, MaskInput, vtkImageData)
static void clone(T *&dst, S *src, int n)
void Render(vtkRenderer *, vtkVolume *) override
int AutoAdjustSampleDistances
int GeneratingCanonicalView
mitk::Image::Pointer image
void CreateCanonicalView(vtkRenderer *ren, vtkVolume *volume, vtkImageData *image, int blend_mode, double viewDirection[3], double viewUp[3])
virtual void ClipCroppingRegionPlanes()
float ImageSampleDistance
void SetTransformedInput(vtkImageData *)
void SetCellFlag(int cellFlag)
void SetMaskInput(vtkImageData *mask)
~vtkMitkGPUVolumeRayCastMapper() override
int ValidateRender(vtkRenderer *, vtkVolume *)
vtkImageData * CanonicalViewImageData