diff --git a/src/src/Rendering/Viewer/VolumeRenderingViewer.cpp b/src/src/Rendering/Viewer/VolumeRenderingViewer.cpp new file mode 100644 index 0000000..c0e5e82 --- /dev/null +++ b/src/src/Rendering/Viewer/VolumeRenderingViewer.cpp @@ -0,0 +1,172 @@ +// +// Created by Krad on 2022/8/9. +// + +#include "VolumeRenderingViewer.h" + +#include +#include +#include +#include +#include +#include +#include +#include + +vtkStandardNewMacro(VolumeRenderingViewer); + +VolumeRenderingViewer::VolumeRenderingViewer() +: vtkObject() +, RenderWindow(nullptr) +, Renderer(nullptr) +, VolumeActor(vtkVolume::New()) +, VolumeMapper(vtkSmartVolumeMapper::New()){ + this->VolumeActor->SetMapper(this->VolumeMapper); +} + +VolumeRenderingViewer::~VolumeRenderingViewer() { + if (this->VolumeMapper) { + vtkImageData* imageData_nullptr = nullptr; + this->VolumeMapper->SetInputData(imageData_nullptr); + this->VolumeMapper->Delete(); + this->VolumeMapper = nullptr; + } + if (this->VolumeActor) { + this->VolumeActor->Delete(); + this->VolumeActor = nullptr; + } + + if (this->Renderer) { + this->Renderer->Delete(); + this->Renderer = nullptr; + } + + if (this->RenderWindow) { + this->RenderWindow->Delete(); + this->RenderWindow = nullptr; + } + + if (this->Interactor) { + this->Interactor->Delete(); + this->Interactor = nullptr; + } + + if (this->InteractorStyle) { + this->InteractorStyle->Delete(); + this->InteractorStyle = nullptr; + } +} + +void VolumeRenderingViewer::InstallPipeline() { + if (this->RenderWindow && this->Renderer) { + this->RenderWindow->AddRenderer(this->Renderer); + } + + if (this->Interactor) { + if (!this->InteractorStyle) { + this->InteractorStyle = vtkInteractorStyleTrackballCamera::New(); + } + + this->Interactor->SetInteractorStyle(this->InteractorStyle); + this->Interactor->SetRenderWindow(this->RenderWindow); + } + + if (this->Renderer && this->VolumeActor) { + this->Renderer->AddViewProp(this->VolumeActor); + this->Renderer->GetActiveCamera()->SetParallelProjection(1); + this->Renderer->SetBackground(0.0, 0.0, 0.0); + } + //TODO: annotation for orientation +} + +void VolumeRenderingViewer::UnInstallPipeline() { + + if (this->Renderer && this->VolumeActor) { + this->Renderer->RemoveViewProp(this->VolumeActor); + } + + if (this->RenderWindow && this->Renderer) { + this->RenderWindow->RemoveRenderer(this->Renderer); + } + + if (this->Interactor) { + this->Interactor->SetInteractorStyle(nullptr); + this->Interactor->SetRenderWindow(nullptr); + } +} + +void VolumeRenderingViewer::SetupInteractor(vtkRenderWindowInteractor * arg) { + if (this->Interactor == arg) { + return; + } + + this->UnInstallPipeline(); + + if (this->Interactor) { + this->Interactor->UnRegister(this); + } + + this->Interactor = arg; + + if (this->Interactor) { + this->Interactor->Register(this); + } + + this->InstallPipeline(); + + if (this->Renderer) { + this->Renderer->GetActiveCamera()->ParallelProjectionOn(); + } +} + +void VolumeRenderingViewer::SetRenderWindow(vtkRenderWindow *arg) { + if (this->RenderWindow == arg) { + return; + } + + this->UnInstallPipeline(); + + if (this->RenderWindow) { + this->RenderWindow->UnRegister(this); + } + + this->RenderWindow = arg; + + if (this->RenderWindow) { + this->RenderWindow->Register(this); + } + //add legend to render + this->InstallPipeline(); +} + +void VolumeRenderingViewer::SetRenderer(vtkRenderer *arg) { + if (this->Renderer == arg) { + return; + } + + this->UnInstallPipeline(); + + if (this->Renderer) { + this->Renderer->UnRegister(this); + } + + this->Renderer = arg; + + if (this->Renderer) { + this->Renderer->Register(this); + } + + this->InstallPipeline(); +} + +void VolumeRenderingViewer::Render() { + +} + +void VolumeRenderingViewer::SetInputData(vtkImageData *in) { + +} + +vtkImageData *VolumeRenderingViewer::GetInput() { + return nullptr; +} diff --git a/src/src/Rendering/Viewer/VolumeRenderingViewer.h b/src/src/Rendering/Viewer/VolumeRenderingViewer.h new file mode 100644 index 0000000..d5a2442 --- /dev/null +++ b/src/src/Rendering/Viewer/VolumeRenderingViewer.h @@ -0,0 +1,95 @@ +// +// Created by Krad on 2022/8/9. +// + +#ifndef OMEGAV_VOLUMERENDERINGVIEWER_H +#define OMEGAV_VOLUMERENDERINGVIEWER_H + +#include "vtkObject.h" +class vtkAlgorithm; + +class vtkImageData; + +class vtkInformation; + + +class vtkRenderWindow; + +class vtkRenderer; + +class vtkRenderWindowInteractor; + +class vtkInteractorStyle; + +class vtkVolume; + +class vtkSmartVolumeMapper; + +class VolumeRenderingViewer:public vtkObject { + + static VolumeRenderingViewer *New(); + + vtkTypeMacro(VolumeRenderingViewer, vtkObject); + + virtual void Render(); + + //@{ + /** + * Set/Get the input image to the viewer. + */ + virtual void SetInputData(vtkImageData *in); + + virtual vtkImageData *GetInput(); + + //@{ + /** + * Get the internal render window, renderer, image actor, and + * image map instances. + */ + vtkGetObjectMacro(RenderWindow, vtkRenderWindow); + + vtkGetObjectMacro(Renderer, vtkRenderer); + + //@} + + //@{ + /** + * Set your own renderwindow and renderer + */ + virtual void SetRenderWindow(vtkRenderWindow *arg); + + virtual void SetRenderer(vtkRenderer *arg); + //@} + + /** + * Attach an interactor for the internal render window. + */ + virtual void SetupInteractor(vtkRenderWindowInteractor *); + +protected: + VolumeRenderingViewer(); + + ~VolumeRenderingViewer() override; + +// vtkAlgorithm *GetInputAlgorithm(); +// +// vtkInformation *GetInputInformation(); + + virtual void InstallPipeline(); + + virtual void UnInstallPipeline(); +private: + VolumeRenderingViewer(const VolumeRenderingViewer &) = delete; + + void operator=(const VolumeRenderingViewer &) = delete; + + vtkRenderWindow *RenderWindow; + vtkRenderer *Renderer; + vtkVolume * VolumeActor; + vtkSmartVolumeMapper *VolumeMapper; + vtkInteractorStyle *InteractorStyle; + vtkRenderWindowInteractor *Interactor; +}; + + +#endif //OMEGAV_VOLUMERENDERINGVIEWER_H