From 6efc7db89cc1b0f7717a7c000f74cdd28214d3ca Mon Sep 17 00:00:00 2001
From: Andrew Maclean <andrew.amaclean@gmail.com>
Date: Thu, 22 Oct 2020 13:20:16 +1100
Subject: [PATCH] Modernising the code, improving images

---
 src/Cxx/Utilities/ShareCamera.cxx             | 132 +++++++++++++-----
 src/CxxHowTo.md                               |   2 +
 .../Cxx/Utilities/TestShareCamera.png         |   4 +-
 3 files changed, 101 insertions(+), 37 deletions(-)

diff --git a/src/Cxx/Utilities/ShareCamera.cxx b/src/Cxx/Utilities/ShareCamera.cxx
index e9e2b4380e5..a33254da0ed 100644
--- a/src/Cxx/Utilities/ShareCamera.cxx
+++ b/src/Cxx/Utilities/ShareCamera.cxx
@@ -1,66 +1,128 @@
-#include <vtkSphereSource.h>
-#include <vtkProperty.h>
+#include <vtkActor.h>
+#include <vtkCamera.h>
+#include <vtkColorSeries.h>
+#include <vtkConeSource.h>
+#include <vtkCubeSource.h>
+#include <vtkCylinderSource.h>
+#include <vtkNamedColors.h>
+#include <vtkNew.h>
 #include <vtkPolyData.h>
-#include <vtkSmartPointer.h>
+#include <vtkPolyDataAlgorithm.h>
 #include <vtkPolyDataMapper.h>
-#include <vtkActor.h>
+#include <vtkProperty.h>
 #include <vtkRenderWindow.h>
-#include <vtkRenderer.h>
 #include <vtkRenderWindowInteractor.h>
+#include <vtkRenderer.h>
+#include <vtkSmartPointer.h>
+#include <vtkSphereSource.h>
 
-int main(int, char *[])
+#include <map>
+#include <vector>
+
+int main(int, char*[])
 {
-  vtkSmartPointer<vtkRenderWindow> renderWindow =
-    vtkSmartPointer<vtkRenderWindow>::New();
+  vtkNew<vtkNamedColors> colors;
+
+  // We store background colors in a vector. Then we extract the red, green and
+  // blue components later when coloring the reneder background.
+  std::vector<vtkColor3ub> rendererColors;
+  vtkNew<vtkColorSeries> colorSeries;
+  colorSeries->SetColorSchemeByName("Brewer Qualitative Pastel2");
+  rendererColors.push_back(colorSeries->GetColor(0));
+  rendererColors.push_back(colorSeries->GetColor(1));
+  rendererColors.push_back(colorSeries->GetColor(2));
+  rendererColors.push_back(colorSeries->GetColor(3));
 
-  vtkSmartPointer<vtkRenderWindowInteractor> renderWindowInteractor =
-    vtkSmartPointer<vtkRenderWindowInteractor>::New();
+  vtkNew<vtkRenderWindow> renderWindow;
+
+  vtkNew<vtkRenderWindowInteractor> renderWindowInteractor;
 
   renderWindowInteractor->SetRenderWindow(renderWindow);
 
   // Define viewport ranges
-  double xmins[4] = {0,.5,0,.5};
-  double xmaxs[4] = {0.5,1,0.5,1};
-  double ymins[4] = {0,0,.5,.5};
-  double ymaxs[4]= {0.5,0.5,1,1};
+  double xmins[4] = {0, 0.5, 0, 0.5};
+  double xmaxs[4] = {0.5, 1, 0.5, 1};
+  double ymins[4] = {0, 0, 0.5, 0.5};
+  double ymaxs[4] = {0.5, 0.5, 1, 1};
 
   vtkCamera* camera = nullptr;
 
-  for(unsigned i = 0; i < 4; i++)
+  // Using the superclass for the sources
+  std::vector<vtkSmartPointer<vtkPolyDataAlgorithm>> sources;
+
+  for (unsigned i = 0; i < 4; i++)
   {
-    vtkSmartPointer<vtkRenderer> renderer = vtkSmartPointer<vtkRenderer>::New();
+    switch (i)
+    {
+    case 0: {
+      // Create a sphere
+      vtkNew<vtkSphereSource> sphereSource;
+      sphereSource->SetCenter(0.0, 0.0, 0.0);
+      sphereSource->Update();
+      sources.push_back(sphereSource);
+      break;
+    }
+    case 1: {
+      // Create a cone
+      vtkNew<vtkConeSource> coneSource;
+      coneSource->SetCenter(0.0, 0.0, 0.0);
+      coneSource->Update();
+      sources.push_back(coneSource);
+      break;
+    }
+    case 2: {
+      // Create a cube
+      vtkNew<vtkCubeSource> cubeSource;
+      cubeSource->SetCenter(0.0, 0.0, 0.0);
+      cubeSource->Update();
+      sources.push_back(cubeSource);
+      break;
+    }
+    default:
+    case 3: {
+      // Create a cylinder
+      vtkNew<vtkCylinderSource> cylinderSource;
+      cylinderSource->SetCenter(0.0, 0.0, 0.0);
+      cylinderSource->Update();
+      sources.push_back(cylinderSource);
+    }
+    };
+
+    vtkNew<vtkPolyDataMapper> mapper;
+    mapper->SetInputConnection(sources[i]->GetOutputPort());
+
+    vtkNew<vtkActor> actor;
+    actor->SetMapper(mapper);
+    actor->GetProperty()->SetColor(colors->GetColor3d("Tomato").GetData());
+
+    vtkNew<vtkRenderer> renderer;
+    renderer->AddActor(actor);
+    double r, g, b;
+    r = rendererColors[i].GetRed() / 255.0;
+    g = rendererColors[i].GetGreen() / 255.0;
+    b = rendererColors[i].GetBlue() / 255.0;
+    renderer->SetBackground(r, g, b);
 
     renderWindow->AddRenderer(renderer);
 
-    if(i == 0)
+    if (i == 0)
     {
       camera = renderer->GetActiveCamera();
+      camera->Azimuth(30);
+      camera->Elevation(30);
     }
     else
     {
       renderer->SetActiveCamera(camera);
     }
-    renderer->SetViewport(xmins[i],ymins[i],xmaxs[i],ymaxs[i]);
-
-    // Create a sphere
-    vtkSmartPointer<vtkSphereSource> sphereSource = vtkSmartPointer<vtkSphereSource>::New();
-    sphereSource->SetCenter(0.0, 0.0, 0.0);
-    sphereSource->SetRadius(5);
-    sphereSource->Update();
-
-    // Create a mapper and actor
-    vtkSmartPointer<vtkPolyDataMapper> mapper = vtkSmartPointer<vtkPolyDataMapper>::New();
-    mapper->SetInputConnection(sphereSource->GetOutputPort());
-    vtkSmartPointer<vtkActor> actor = vtkSmartPointer<vtkActor>::New();
-    actor->SetMapper(mapper);
-    renderer->AddActor(actor);
-    renderer->ResetCamera();
-
-    renderWindow->Render();
-    renderWindow->SetWindowName("Multiple ViewPorts");
+    renderer->SetViewport(xmins[i], ymins[i], xmaxs[i], ymaxs[i]);
 
+    renderer->ResetCamera();
   }
 
+  renderWindow->Render();
+  renderWindow->SetWindowName("ShareCamera");
+
   renderWindowInteractor->Start();
 
   return EXIT_SUCCESS;
diff --git a/src/CxxHowTo.md b/src/CxxHowTo.md
index d6e0a1e9513..27e1293157e 100644
--- a/src/CxxHowTo.md
+++ b/src/CxxHowTo.md
@@ -20,12 +20,14 @@ Here are some snippets or examples that highlight interesting features that may
 
 | Example Name | Comments | Image |
 | -------------- | ---------------------- | ------- |
+[ShareCamera](/Cxx/Utilities/ShareCamera) | Use the same camera for all renderers.
 [MergeSelections](/Cxx/PolyData/MergeSelections) | Use the same camera for all renderers.
 
 ## Coloring
 
 | Example Name | Comments | Image |
 | -------------- | ---------------------- | ------- |
+[ShareCamera](/Cxx/Utilities/ShareCamera) | Store background colors in a vector for later extraction of the red, green and blue components.
 [KochanekSplineDemo](/Cxx/PolyData/KochanekSplineDemo) | How to color the slider components.
 [MergeSelections](/Cxx/PolyData/MergeSelections) | A nifty way to get a "harmonious" set of window colors, using vtkNamedColors and vtkColorSeries.
 
diff --git a/src/Testing/Baseline/Cxx/Utilities/TestShareCamera.png b/src/Testing/Baseline/Cxx/Utilities/TestShareCamera.png
index 9c5ee1c1f2c..572728d6a73 100644
--- a/src/Testing/Baseline/Cxx/Utilities/TestShareCamera.png
+++ b/src/Testing/Baseline/Cxx/Utilities/TestShareCamera.png
@@ -1,3 +1,3 @@
 version https://git-lfs.github.com/spec/v1
-oid sha256:edf2f7943988be68e40e2a21b7fcef1aac90ad61ff0da11b43fcad33ae6abd4c
-size 6926
+oid sha256:301bbe51287a813a7894f9eaa320d07a07e809c749d65c770331b2adc5b1a86e
+size 15174
-- 
GitLab