diff --git a/vtk/src/CMakeLists.txt b/vtk/src/CMakeLists.txt index 7af562f..669a5cc 100644 --- a/vtk/src/CMakeLists.txt +++ b/vtk/src/CMakeLists.txt @@ -29,7 +29,18 @@ endif() # netcdf setup find_package(netCDF REQUIRED) -add_executable(VtkBase MACOSX_BUNDLE main.cpp ) +add_executable(VtkBase MACOSX_BUNDLE main.cpp + helperClasses/BackgroundImage.cpp + helperClasses/BackgroundImage.h + helperClasses/EGlyphLayer.cpp + helperClasses/EGlyphLayer.h + helperClasses/Layer.cpp + helperClasses/Layer.h + helperClasses/LGlyphLayer.cpp + helperClasses/LGlyphLayer.h + helperClasses/Program.cpp + helperClasses/Program.h +) execute_process( COMMAND nc-config --includedir diff --git a/vtk/src/helperClasses/BackgroundImage.cpp b/vtk/src/helperClasses/BackgroundImage.cpp new file mode 100644 index 0000000..780eaae --- /dev/null +++ b/vtk/src/helperClasses/BackgroundImage.cpp @@ -0,0 +1,62 @@ +#include "BackgroundImage.h" +#include +#include +#include +#include + +using std::string; + +BackgroundImage::BackgroundImage(string imagePath) : imagePath(imagePath) { + this->ren = vtkSmartPointer::New(); + this->ren->SetLayer(0); + this->ren->InteractiveOff(); + updateImage(); +} + + +void BackgroundImage::updateImage() { + vtkSmartPointer imageData; + + vtkSmartPointer imageReader; + + imageReader.TakeReference(this->readerFactory->CreateImageReader2(this->imagePath.c_str())); + imageReader->SetFileName(this->imagePath.c_str()); + imageReader->Update(); + imageData = imageReader->GetOutput(); + + vtkNew imageActor; + imageActor->SetInputData(imageData); + + this->ren->AddActor(imageActor); + + + // camera stuff + // essentially sets the camera to the middle of the background, and points it at the background + // TODO: extract this to its own function, separate from the background class. + double origin[3], spacing[3]; + int extent[6]; + imageData->GetOrigin(origin); + imageData->GetSpacing(spacing); + imageData->GetExtent(extent); + + vtkCamera *camera = this->ren->GetActiveCamera(); + camera->ParallelProjectionOn(); + + double xc = origin[0] + 0.5 * (extent[0] + extent[1]) * spacing[0]; + double yc = origin[1] + 0.5 * (extent[2] + extent[3]) * spacing[1]; + double yd = (extent[3] - extent[2] + 1) * spacing[1]; + double d = camera->GetDistance(); + camera->SetParallelScale(0.5 * yd); + camera->SetFocalPoint(xc, yc, 0.0); + camera->SetPosition(xc, yc, d); +} + + +string BackgroundImage::getImagePath() { + return this->imagePath; +} + +void BackgroundImage::setImagePath(string imagePath) { + this->imagePath = imagePath; + updateImage(); +} diff --git a/vtk/src/helperClasses/BackgroundImage.h b/vtk/src/helperClasses/BackgroundImage.h new file mode 100644 index 0000000..7026993 --- /dev/null +++ b/vtk/src/helperClasses/BackgroundImage.h @@ -0,0 +1,22 @@ +#ifndef BACKGROUND_H +#define BACKGROUND_H + +#include "Layer.h" +#include + +class BackgroundImage : public Layer { +private: + std::string imagePath; + vtkSmartPointer readerFactory; + + void updateImage(); + + +public: + BackgroundImage(std::string imagePath); + + std::string getImagePath(); + void setImagePath(std::string imagePath); +}; + +#endif diff --git a/vtk/src/helperClasses/EGlyphLayer.cpp b/vtk/src/helperClasses/EGlyphLayer.cpp new file mode 100644 index 0000000..9421b92 --- /dev/null +++ b/vtk/src/helperClasses/EGlyphLayer.cpp @@ -0,0 +1,8 @@ +#include "EGlyphLayer.h" + + +EGlyphLayer::EGlyphLayer() { + this->ren = vtkSmartPointer::New(); + this->ren->SetLayer(1); + this->ren->InteractiveOff(); +} diff --git a/vtk/src/helperClasses/EGlyphLayer.h b/vtk/src/helperClasses/EGlyphLayer.h new file mode 100644 index 0000000..18f96ab --- /dev/null +++ b/vtk/src/helperClasses/EGlyphLayer.h @@ -0,0 +1,15 @@ +#ifndef EGLYPHLAYER_H +#define EGLYPHLAYER_H + +#include "Layer.h" + + + +class EGlyphLayer : public Layer { +public: + EGlyphLayer(); + +}; + + +#endif diff --git a/vtk/src/helperClasses/LGlyphLayer.cpp b/vtk/src/helperClasses/LGlyphLayer.cpp new file mode 100644 index 0000000..ac5930d --- /dev/null +++ b/vtk/src/helperClasses/LGlyphLayer.cpp @@ -0,0 +1,7 @@ +#include "LGlyphLayer.h" + + +LGlyphLayer::LGlyphLayer() { + this->ren = vtkSmartPointer::New(); + this->ren->SetLayer(2); +} diff --git a/vtk/src/helperClasses/LGlyphLayer.h b/vtk/src/helperClasses/LGlyphLayer.h new file mode 100644 index 0000000..8c61bb0 --- /dev/null +++ b/vtk/src/helperClasses/LGlyphLayer.h @@ -0,0 +1,12 @@ +#ifndef LGLYPHLAYER_H +#define LGLYPHLAYER_H + +#include "Layer.h" + +class LGlyphLayer : public Layer { +public: + LGlyphLayer(); + +}; + +#endif diff --git a/vtk/src/helperClasses/Layer.cpp b/vtk/src/helperClasses/Layer.cpp new file mode 100644 index 0000000..8691804 --- /dev/null +++ b/vtk/src/helperClasses/Layer.cpp @@ -0,0 +1,7 @@ +#include "Layer.h" + +using std::string; + +vtkSmartPointer Layer::getLayer() { + return this->ren; +} diff --git a/vtk/src/helperClasses/Layer.h b/vtk/src/helperClasses/Layer.h new file mode 100644 index 0000000..753f6bf --- /dev/null +++ b/vtk/src/helperClasses/Layer.h @@ -0,0 +1,17 @@ +#ifndef LAYER_H +#define LAYER_H + +#include + +/** This class represents one abstract layer to be rendered to VTK. + * It exists to manage multiple different layers under the Program class. + */ +class Layer { +protected: + vtkSmartPointer ren; + +public: + virtual vtkSmartPointer getLayer(); +}; + +#endif diff --git a/vtk/src/helperClasses/Program.cpp b/vtk/src/helperClasses/Program.cpp new file mode 100644 index 0000000..b0c52d8 --- /dev/null +++ b/vtk/src/helperClasses/Program.cpp @@ -0,0 +1,57 @@ +#include +#include + +#include "Program.h" + + +void Program::setWinProperties() { + this->win->SetWindowName("Simulation"); + this->win->SetSize(661, 661); + + this->interact->SetRenderWindow(this->win); +} + +// Program::Program() : background(), euler(), lagrange(), win(), interact() { +// setWinProperties(); +// } + +Program::Program(Layer bg, Layer e, Layer l) : background(bg), euler(e), lagrange(l), win(), interact() { + this->win = vtkSmartPointer::New(); + this->interact = vtkSmartPointer::New(); + + this->win->SetNumberOfLayers(3); + this->win->AddRenderer(bg.getLayer()); + this->win->AddRenderer(e.getLayer()); + this->win->AddRenderer(l.getLayer()); + setWinProperties(); +} + + +void Program::setBackground(Layer bg) { + this->win->RemoveRenderer(this->background.getLayer()); + this->background = bg; + this->win->AddRenderer(bg.getLayer()); + +} + + +void Program::setEuler(Layer e) { + this->win->RemoveRenderer(this->euler.getLayer()); + this->euler = e; + this->win->AddRenderer(e.getLayer()); +} + + +void Program::setLagrange(Layer l) { + this->win->RemoveRenderer(this->lagrange.getLayer()); + this->lagrange = l; + this->win->AddRenderer(l.getLayer()); +} + +// void Program::addInteractionStyle(vtkInteractorStyle style); + + +void Program::render() { + this->win->Render(); + this->interact->Start(); +} diff --git a/vtk/src/helperClasses/Program.h b/vtk/src/helperClasses/Program.h new file mode 100644 index 0000000..f086bdf --- /dev/null +++ b/vtk/src/helperClasses/Program.h @@ -0,0 +1,35 @@ +#ifndef PROGRAM_H +#define PROGRAM_H + +#include +#include +#include + +#include "Layer.h" + +class Program { +private: + Layer background; + Layer euler; + Layer lagrange; + vtkSmartPointer win; + vtkSmartPointer interact; + + void setWinProperties(); + + +public: + // Program(); + Program(Layer bg, Layer e, Layer l); + + void setBackground(Layer bg); + void setEuler(Layer e); + void setLagrange(Layer l); + + + // void addInteractionStyle(vtkInteractorStyle style); + + void render(); +}; + +#endif diff --git a/vtk/src/main.cpp b/vtk/src/main.cpp index d317840..b7a806a 100644 --- a/vtk/src/main.cpp +++ b/vtk/src/main.cpp @@ -1,31 +1,17 @@ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - #include +#include +#include +#include +#include +#include +#include +#include +#include #include -#define NLATS 67 -#define NLONS 116 +#include "helperClasses/BackgroundImage.h" +#include "helperClasses/EGlyphLayer.h" +#include "helperClasses/Program.h" using namespace std; using namespace netCDF; @@ -71,6 +57,7 @@ void renderCoordinates(vtkRenderer *ren, vtkNamedColors *colors) { vtkNew polydata; polydata->SetPoints(points); + vtkNew glyphFilter; glyphFilter->SetInputData(polydata); glyphFilter->Update(); @@ -87,73 +74,21 @@ void renderCoordinates(vtkRenderer *ren, vtkNamedColors *colors) { ren->AddActor(actor); } -void renderBackground(vtkRenderer *background) { - vtkSmartPointer imageData; - - vtkNew readerFactory; - vtkSmartPointer imageReader; - - imageReader.TakeReference(readerFactory->CreateImageReader2("../../../../data/map_661-661.png")); - imageReader->SetFileName("../../../../data/map_661-661.png"); - imageReader->Update(); - imageData = imageReader->GetOutput(); - - vtkNew imageActor; - imageActor->SetInputData(imageData); - - background->AddActor(imageActor); - - - // camera stuff - // essentially sets the camera to the middle of the background, and points it at the background - double origin[3], spacing[3]; - int extent[6]; - imageData->GetOrigin(origin); - imageData->GetSpacing(spacing); - imageData->GetExtent(extent); - - vtkCamera *camera = background->GetActiveCamera(); - camera->ParallelProjectionOn(); - - double xc = origin[0] + 0.5 * (extent[0] + extent[1]) * spacing[0]; - double yc = origin[1] + 0.5 * (extent[2] + extent[3]) * spacing[1]; - double yd = (extent[3] - extent[2] + 1) * spacing[1]; - double d = camera->GetDistance(); - camera->SetParallelScale(0.5 * yd); - camera->SetFocalPoint(xc, yc, 0.0); - camera->SetPosition(xc, yc, d); -} int main() { - vtkNew colors; - vtkNew Euler, Background, Lagrange; - Euler->SetBackground(colors->GetColor3d("DarkSlateGray").GetData()); + auto bg = new BackgroundImage("../../../../data/map_661-661.png"); + auto e = new EGlyphLayer(); + auto l = new EGlyphLayer(); + auto program = new Program(*bg, *e, *l); + program->render(); - Background->SetLayer(0); - Background->InteractiveOff(); - Euler->SetLayer(1); - Euler->InteractiveOff(); - Lagrange->SetLayer(2); + // vtkNew colors; + // vtkNew Euler, Background, Lagrange; + // Euler->SetBackground(colors->GetColor3d("DarkSlateGray").GetData()); - renderCoordinates(Euler, colors); - renderBackground(Background); - - vtkNew renWin; - renWin->SetNumberOfLayers(3); - // renWin->SetNumberOfLayers(2); - renWin->AddRenderer(Background); - renWin->AddRenderer(Euler); - renWin->AddRenderer(Lagrange); - renWin->SetWindowName("Simulation"); - renWin->SetSize(661, 661); - - vtkNew iren; - iren->SetRenderWindow(renWin); - - renWin->Render(); - iren->Start(); + // renderCoordinates(Euler, colors); return EXIT_SUCCESS; }