Init VolumeRenderingViewer.

This commit is contained in:
Krad
2022-08-15 16:44:03 +08:00
parent 1f36fc6436
commit c51a0632eb
2 changed files with 267 additions and 0 deletions

View File

@@ -0,0 +1,172 @@
//
// Created by Krad on 2022/8/9.
//
#include "VolumeRenderingViewer.h"
#include <vtkObjectFactory.h>
#include <vtkRenderer.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkInteractorStyleTrackballCamera.h>
#include <vtkCamera.h>
#include <vtkVolume.h>
#include <vtkSmartVolumeMapper.h>
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;
}

View File

@@ -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