diff UnitTestsSources/VolumeRenderingTests.cpp @ 1782:f053c80ea411

ImageBuffer3D::CommitSagittalSlice()
author Sebastien Jodogne <s.jodogne@gmail.com>
date Fri, 14 May 2021 16:30:54 +0200
parents bf4b15b059ea
children 75d3e2ab1fe1
line wrap: on
line diff
--- a/UnitTestsSources/VolumeRenderingTests.cpp	Fri May 14 15:35:24 2021 +0200
+++ b/UnitTestsSources/VolumeRenderingTests.cpp	Fri May 14 16:30:54 2021 +0200
@@ -188,10 +188,17 @@
 // Render the scene using the identity viewpoint (default)
 static Orthanc::ImageAccessor* Render(OrthancStone::ISceneLayer* layer,
                                       unsigned int width,
-                                      unsigned int height)
+                                      unsigned int height,
+                                      bool fitScene)
 {
   OrthancStone::Scene2D scene;
   scene.SetLayer(0, layer);
+
+  if (fitScene)
+  {
+    scene.FitContent(width, height);
+  }
+  
   return Render(scene, width, height);
 }
 
@@ -244,19 +251,38 @@
 }
 
 
-static OrthancStone::TextureBaseSceneLayer* Slice3x3x1Pattern(const OrthancStone::CoordinateSystem3D& volumeCoordinates,
+static OrthancStone::TextureBaseSceneLayer* Slice3x3x1Pattern(OrthancStone::VolumeProjection projection,
+                                                              const OrthancStone::CoordinateSystem3D& volumeCoordinates,
                                                               const OrthancStone::CoordinateSystem3D& cuttingPlane,
                                                               SlicerType type)
 {
   OrthancStone::VolumeImageGeometry geometry;
-  geometry.SetSizeInVoxels(3, 3, 1);
+
+  switch (projection)
+  {
+    case OrthancStone::VolumeProjection_Axial:
+      geometry.SetSizeInVoxels(3, 3, 1);
+      break;
+
+    case OrthancStone::VolumeProjection_Sagittal:
+      geometry.SetSizeInVoxels(1, 3, 3);
+      break;
+
+    case OrthancStone::VolumeProjection_Coronal:
+      geometry.SetSizeInVoxels(3, 1, 3);
+      break;
+
+    default:
+      throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError);
+  }
+  
   geometry.SetAxialGeometry(volumeCoordinates);
 
   boost::shared_ptr<OrthancStone::DicomVolumeImage> volume(new OrthancStone::DicomVolumeImage);
   volume->Initialize(geometry, Orthanc::PixelFormat_Grayscale8, false);
 
   {
-    OrthancStone::ImageBuffer3D::SliceWriter writer(volume->GetPixelData(), OrthancStone::VolumeProjection_Axial, 0);
+    OrthancStone::ImageBuffer3D::SliceWriter writer(volume->GetPixelData(), projection, 0);
     Assign3x3Pattern(writer.GetAccessor());
   }
 
@@ -282,7 +308,8 @@
   {
     OrthancStone::CoordinateSystem3D cuttingPlane;
     
-    std::unique_ptr<OrthancStone::TextureBaseSceneLayer> layer(Slice3x3x1Pattern(axial, cuttingPlane, static_cast<SlicerType>(mode)));
+    std::unique_ptr<OrthancStone::TextureBaseSceneLayer> layer(
+      Slice3x3x1Pattern(OrthancStone::VolumeProjection_Axial, axial, cuttingPlane, static_cast<SlicerType>(mode)));
 
     ASSERT_TRUE(layer.get() != NULL);
     ASSERT_EQ(OrthancStone::ISceneLayer::Type_FloatTexture, layer->GetType());
@@ -309,7 +336,7 @@
       ASSERT_FLOAT_EQ(200, GetPixelValue(texture, 2, 2));
     }
 
-    std::unique_ptr<Orthanc::ImageAccessor> rendered(Render(layer.release(), 5, 5));
+    std::unique_ptr<Orthanc::ImageAccessor> rendered(Render(layer.release(), 5, 5, false));
     ASSERT_EQ(5u, rendered->GetWidth());
     ASSERT_EQ(5u, rendered->GetHeight());
     ASSERT_FLOAT_EQ(0, GetPixelValue(*rendered, 0, 0));
@@ -354,7 +381,7 @@
     std::unique_ptr<OrthancStone::ColorTextureSceneLayer> layer(new OrthancStone::ColorTextureSceneLayer(pixel));
     layer->SetOrigin(0, 0);
 
-    std::unique_ptr<Orthanc::ImageAccessor> rendered(Render(layer.release(), 2, 2));
+    std::unique_ptr<Orthanc::ImageAccessor> rendered(Render(layer.release(), 2, 2, false));
     ASSERT_EQ(2u, rendered->GetWidth());
     ASSERT_EQ(2u, rendered->GetHeight());  
     ASSERT_FLOAT_EQ(0, GetPixelValue(*rendered, 0, 0));
@@ -367,7 +394,7 @@
     std::unique_ptr<OrthancStone::ColorTextureSceneLayer> layer(new OrthancStone::ColorTextureSceneLayer(pixel));
     layer->SetOrigin(-0.01, 0);
 
-    std::unique_ptr<Orthanc::ImageAccessor> rendered(Render(layer.release(), 2, 2));
+    std::unique_ptr<Orthanc::ImageAccessor> rendered(Render(layer.release(), 2, 2, false));
     ASSERT_FLOAT_EQ(0, GetPixelValue(*rendered, 0, 0));
     ASSERT_FLOAT_EQ(0, GetPixelValue(*rendered, 1, 0));
     ASSERT_FLOAT_EQ(255, GetPixelValue(*rendered, 0, 1));
@@ -378,7 +405,7 @@
     std::unique_ptr<OrthancStone::ColorTextureSceneLayer> layer(new OrthancStone::ColorTextureSceneLayer(pixel));
     layer->SetOrigin(-0.01, -0.01);
 
-    std::unique_ptr<Orthanc::ImageAccessor> rendered(Render(layer.release(), 2, 2));
+    std::unique_ptr<Orthanc::ImageAccessor> rendered(Render(layer.release(), 2, 2, false));
     ASSERT_FLOAT_EQ(255, GetPixelValue(*rendered, 0, 0));
     ASSERT_FLOAT_EQ(0, GetPixelValue(*rendered, 1, 0));
     ASSERT_FLOAT_EQ(0, GetPixelValue(*rendered, 0, 1));
@@ -389,7 +416,7 @@
     std::unique_ptr<OrthancStone::ColorTextureSceneLayer> layer(new OrthancStone::ColorTextureSceneLayer(pixel));
     layer->SetOrigin(0, -0.01);
 
-    std::unique_ptr<Orthanc::ImageAccessor> rendered(Render(layer.release(), 2, 2));
+    std::unique_ptr<Orthanc::ImageAccessor> rendered(Render(layer.release(), 2, 2, false));
     ASSERT_FLOAT_EQ(0, GetPixelValue(*rendered, 0, 0));
     ASSERT_FLOAT_EQ(255, GetPixelValue(*rendered, 1, 0));
     ASSERT_FLOAT_EQ(0, GetPixelValue(*rendered, 0, 1));
@@ -482,6 +509,7 @@
 }
 
 
+
 TEST(VolumeRendering, FlipAxial)
 {
   double x = 2;
@@ -513,7 +541,8 @@
                                                     OrthancStone::LinearAlgebra::CreateVector(1, 0, 0),
                                                     OrthancStone::LinearAlgebra::CreateVector(0, 1, 0));
 
-      std::unique_ptr<OrthancStone::TextureBaseSceneLayer> layer(Slice3x3x1Pattern(axial, cuttingPlane, static_cast<SlicerType>(mode)));
+      std::unique_ptr<OrthancStone::TextureBaseSceneLayer> layer(
+        Slice3x3x1Pattern(OrthancStone::VolumeProjection_Axial, axial, cuttingPlane, static_cast<SlicerType>(mode)));
       ASSERT_TRUE(AreSameImages(layer->GetTexture(), pattern));
 
       OrthancStone::Extent2D extent;
@@ -523,7 +552,7 @@
       ASSERT_FLOAT_EQ(x + 2.5, extent.GetX2());
       ASSERT_FLOAT_EQ(y + 2.5, extent.GetY2());
 
-      std::unique_ptr<Orthanc::ImageAccessor> rendered(Render(layer.release(), 15, 15));
+      std::unique_ptr<Orthanc::ImageAccessor> rendered(Render(layer.release(), 15, 15, false));
       ASSERT_TRUE(IsConstImageWithExclusion(0.0f, *rendered, 9, 8, 3, 3));
 
       Orthanc::ImageAccessor p;
@@ -536,7 +565,8 @@
                                                     OrthancStone::LinearAlgebra::CreateVector(-1, 0, 0),
                                                     OrthancStone::LinearAlgebra::CreateVector(0, 1, 0));
 
-      std::unique_ptr<OrthancStone::TextureBaseSceneLayer> layer(Slice3x3x1Pattern(axial, cuttingPlane, static_cast<SlicerType>(mode)));
+      std::unique_ptr<OrthancStone::TextureBaseSceneLayer> layer(
+        Slice3x3x1Pattern(OrthancStone::VolumeProjection_Axial, axial, cuttingPlane, static_cast<SlicerType>(mode)));
       if (mode == 1)
       {
         // Reslicer directly flips the pixels of the texture
@@ -555,7 +585,7 @@
       ASSERT_FLOAT_EQ(-(x - 0.5), extent.GetX2());
       ASSERT_FLOAT_EQ(y + 2.5, extent.GetY2());
 
-      std::unique_ptr<Orthanc::ImageAccessor> rendered(Render(layer.release(), 15, 15));
+      std::unique_ptr<Orthanc::ImageAccessor> rendered(Render(layer.release(), 15, 15, false));
       ASSERT_TRUE(IsConstImageWithExclusion(0.0f, *rendered, 3, 8, 3, 3));
 
       Orthanc::ImageAccessor p;
@@ -568,7 +598,8 @@
                                                     OrthancStone::LinearAlgebra::CreateVector(1, 0, 0),
                                                     OrthancStone::LinearAlgebra::CreateVector(0, -1, 0));
 
-      std::unique_ptr<OrthancStone::TextureBaseSceneLayer> layer(Slice3x3x1Pattern(axial, cuttingPlane, static_cast<SlicerType>(mode)));
+      std::unique_ptr<OrthancStone::TextureBaseSceneLayer> layer(
+        Slice3x3x1Pattern(OrthancStone::VolumeProjection_Axial, axial, cuttingPlane, static_cast<SlicerType>(mode)));
       if (mode == 1)
       {
         ASSERT_TRUE(AreSameImages(layer->GetTexture(), patternY));
@@ -585,7 +616,7 @@
       ASSERT_FLOAT_EQ(x + 2.5, extent.GetX2());
       ASSERT_FLOAT_EQ(-(y - 0.5), extent.GetY2());
 
-      std::unique_ptr<Orthanc::ImageAccessor> rendered(Render(layer.release(), 15, 15));
+      std::unique_ptr<Orthanc::ImageAccessor> rendered(Render(layer.release(), 15, 15, false));
       ASSERT_TRUE(IsConstImageWithExclusion(0.0f, *rendered, 9, 4, 3, 3));
 
       Orthanc::ImageAccessor p;
@@ -598,7 +629,8 @@
                                                     OrthancStone::LinearAlgebra::CreateVector(-1, 0, 0),
                                                     OrthancStone::LinearAlgebra::CreateVector(0, -1, 0));
 
-      std::unique_ptr<OrthancStone::TextureBaseSceneLayer> layer(Slice3x3x1Pattern(axial, cuttingPlane, static_cast<SlicerType>(mode)));
+      std::unique_ptr<OrthancStone::TextureBaseSceneLayer> layer(
+        Slice3x3x1Pattern(OrthancStone::VolumeProjection_Axial, axial, cuttingPlane, static_cast<SlicerType>(mode)));
       if (mode == 1)
       {
         ASSERT_TRUE(AreSameImages(layer->GetTexture(), patternXY));
@@ -615,7 +647,7 @@
       ASSERT_FLOAT_EQ(-(x - 0.5), extent.GetX2());
       ASSERT_FLOAT_EQ(-(y - 0.5), extent.GetY2());
 
-      std::unique_ptr<Orthanc::ImageAccessor> rendered(Render(layer.release(), 15, 15));
+      std::unique_ptr<Orthanc::ImageAccessor> rendered(Render(layer.release(), 15, 15, false));
       ASSERT_TRUE(IsConstImageWithExclusion(0.0f, *rendered, 3, 4, 3, 3));
 
       Orthanc::ImageAccessor p;