diff --git a/Core/Code/Rendering/mitkRenderingTestHelper.cpp b/Core/Code/Rendering/mitkRenderingTestHelper.cpp index cf646c1de3..50017f4df2 100644 --- a/Core/Code/Rendering/mitkRenderingTestHelper.cpp +++ b/Core/Code/Rendering/mitkRenderingTestHelper.cpp @@ -1,191 +1,237 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ //VTK #include #include #include #include //MITK #include #include #include #include #include #include #include // include gl to read out properties #include #include +//VTK Testing to compare the rendered image pixel-wise against a reference screen shot +#include "vtkTesting.h" + +mitkRenderingTestHelper::mitkRenderingTestHelper(int width, int height) + : m_AutomaticallyCloseRenderWindow(true) +{ + this->Initialize(width, height); +} + mitkRenderingTestHelper::mitkRenderingTestHelper(int width, int height, int argc, char* argv[]) + : m_AutomaticallyCloseRenderWindow(true) { - // Global interaction must(!) be initialized - mitk::GlobalInteraction::GetInstance()->Initialize("global"); + this->Initialize(width, height); + this->SetInputFileNames(argc, argv); +} + +void mitkRenderingTestHelper::Initialize(int width, int height) +{ + // Global interaction must(!) be initialized + mitk::GlobalInteraction::GetInstance()->Initialize("global"); - m_DataStorage = mitk::StandaloneDataStorage::New(); + m_RenderWindow = mitk::RenderWindow::New(); + m_DataStorage = mitk::StandaloneDataStorage::New(); - m_RenderWindow = mitk::RenderWindow::New(); - m_RenderWindow->GetRenderer()->SetDataStorage(m_DataStorage); - m_RenderWindow->GetRenderer()->SetMapperID(mitk::BaseRenderer::Standard2D); - this->GetVtkRenderWindow()->SetSize( width, height ); - m_RenderWindow->GetRenderer()->Resize( width, height); + m_RenderWindow->GetRenderer()->SetDataStorage(m_DataStorage); + this->SetMapperIDToRender2D(); + this->GetVtkRenderWindow()->SetSize( width, height ); + m_RenderWindow->GetRenderer()->Resize( width, height); - //this->GetVtkRenderWindow()->DoubleBufferOff( ); - this->SetInputFileNames(argc, argv); - // prints the glinfo after creation of the vtkrenderwindow - this->PrintGLInfo(); + //Prints the glinfo after creation of the vtkrenderwindow, we always want to do this for debugging. + this->PrintGLInfo(); } mitkRenderingTestHelper::~mitkRenderingTestHelper() { } void mitkRenderingTestHelper::PrintGLInfo() { - GLint maxTextureSize; + GLint maxTextureSize; - glGetIntegerv(GL_MAX_TEXTURE_SIZE, &maxTextureSize);; + glGetIntegerv(GL_MAX_TEXTURE_SIZE, &maxTextureSize);; - MITK_INFO << "OpenGL Render Context Information: \n" - << "- GL_VENDOR: "<< glGetString(GL_VENDOR) << "\n" - << "- GL_RENDERER: "<< glGetString(GL_RENDERER) << "\n" - << "- GL_VERSION: "<< glGetString(GL_VERSION) << "\n" - << "- GL_MAX_TEXTURE_SIZE: "<< maxTextureSize << "\n" - << "- GL_EXTENSIONS: "<< glGetString(GL_EXTENSIONS); + MITK_INFO << "OpenGL Render Context Information: \n" + << "- GL_VENDOR: "<< glGetString(GL_VENDOR) << "\n" + << "- GL_RENDERER: "<< glGetString(GL_RENDERER) << "\n" + << "- GL_VERSION: "<< glGetString(GL_VERSION) << "\n" + << "- GL_MAX_TEXTURE_SIZE: "<< maxTextureSize << "\n" + << "- GL_EXTENSIONS: "<< glGetString(GL_EXTENSIONS); } void mitkRenderingTestHelper::SetMapperID( mitk::BaseRenderer::StandardMapperSlot id) { - m_RenderWindow->GetRenderer()->SetMapperID(id); + m_RenderWindow->GetRenderer()->SetMapperID(id); +} + +void mitkRenderingTestHelper::SetMapperIDToRender3D() +{ + this->SetMapperID(mitk::BaseRenderer::Standard3D); +} + +void mitkRenderingTestHelper::SetMapperIDToRender2D() +{ + this->SetMapperID(mitk::BaseRenderer::Standard2D); } void mitkRenderingTestHelper::Render() { - //if the datastorage is initialized and at least 1 image is loaded render it - if(m_DataStorage.IsNotNull() || m_DataStorage->GetAll()->Size() >= 1 ) - { - //perform global reinit: - m_RenderWindow->GetRenderer()->PrepareRender(); - // mitk::RenderingManager::GetInstance()->RequestUpdate(m_RenderWindow->GetVtkRenderWindow()); + //if the datastorage is initialized and at least 1 image is loaded render it + if(m_DataStorage.IsNotNull() || m_DataStorage->GetAll()->Size() >= 1 ) + { + //perform global reinit: + m_RenderWindow->GetRenderer()->PrepareRender(); - //use this to actually show the iamge in a renderwindow - this->GetVtkRenderWindow()->Render(); -// this->GetVtkRenderWindow()->GetInteractor()->Start(); - } - else + //use this to actually show the iamge in a renderwindow + this->GetVtkRenderWindow()->Render(); + if(m_AutomaticallyCloseRenderWindow == false) { - MITK_ERROR << "No images loaded in data storage!"; + this->GetVtkRenderWindow()->GetInteractor()->Start(); } + } + else + { + MITK_ERROR << "No images loaded in data storage!"; + } } void mitkRenderingTestHelper::PrepareRender() { //perform global reinit: m_RenderWindow->GetRenderer()->PrepareRender(); } mitk::DataStorage::Pointer mitkRenderingTestHelper::GetDataStorage() { - return m_DataStorage; + return m_DataStorage; } void mitkRenderingTestHelper::SetInputFileNames(int argc, char* argv[]) { - // parse parameters - for (int i = 1; i < argc; ++i) + // parse parameters + for (int i = 1; i < argc; ++i) + { + //add everything to a list but -T and -V + std::string tmp = argv[i]; + if((tmp.compare("-T")) && (tmp.compare("-V"))) + { + this->AddToStorage(tmp); + } + else { - //add everything to a list but -T and -V - std::string tmp = argv[i]; - if((tmp.compare("-T")) && (tmp.compare("-V"))) - { - this->AddToStorage(tmp); - } - else - { - break; - } + break; } + } } void mitkRenderingTestHelper::SetViewDirection(mitk::SliceNavigationController::ViewDirection viewDirection) { - mitk::BaseRenderer::GetInstance(m_RenderWindow->GetVtkRenderWindow())->GetSliceNavigationController()->SetDefaultViewDirection(viewDirection); - mitk::RenderingManager::GetInstance()->InitializeViews( m_DataStorage->ComputeBoundingGeometry3D(m_DataStorage->GetAll()) ); + mitk::BaseRenderer::GetInstance(m_RenderWindow->GetVtkRenderWindow())->GetSliceNavigationController()->SetDefaultViewDirection(viewDirection); + mitk::RenderingManager::GetInstance()->InitializeViews( m_DataStorage->ComputeBoundingGeometry3D(m_DataStorage->GetAll()) ); } void mitkRenderingTestHelper::ReorientSlices(mitk::Point3D origin, mitk::Vector3D rotation) { - mitk::SliceNavigationController::Pointer sliceNavigationController = - mitk::BaseRenderer::GetInstance(m_RenderWindow->GetVtkRenderWindow())->GetSliceNavigationController(); - sliceNavigationController->ReorientSlices(origin, rotation); + mitk::SliceNavigationController::Pointer sliceNavigationController = + mitk::BaseRenderer::GetInstance(m_RenderWindow->GetVtkRenderWindow())->GetSliceNavigationController(); + sliceNavigationController->ReorientSlices(origin, rotation); } vtkRenderer* mitkRenderingTestHelper::GetVtkRenderer() { - return m_RenderWindow->GetRenderer()->GetVtkRenderer(); + return m_RenderWindow->GetRenderer()->GetVtkRenderer(); } void mitkRenderingTestHelper::SetImageProperty(const char *propertyKey, mitk::BaseProperty* property ) { - this->m_DataStorage->GetNode(mitk::NodePredicateDataType::New("Image"))->SetProperty(propertyKey, property); + this->m_DataStorage->GetNode(mitk::NodePredicateDataType::New("Image"))->SetProperty(propertyKey, property); } vtkRenderWindow* mitkRenderingTestHelper::GetVtkRenderWindow() { - return m_RenderWindow->GetVtkRenderWindow(); + return m_RenderWindow->GetVtkRenderWindow(); +} + +bool mitkRenderingTestHelper::CompareRenderWindowAgainstReference(int argc, char* argv[], double threshold) +{ + this->PrepareRender(); + + //retVal meanings: (see VTK/Rendering/vtkTesting.h) + //0 = test failed + //1 = test passed + //2 = test not run + //3 = something with vtkInteraction + if(vtkTesting::Test(argc, argv, this->GetVtkRenderWindow(), threshold) == 1) + return true; + else + return false; } //method to save a screenshot of the renderwindow (e.g. create a reference screenshot) void mitkRenderingTestHelper::SaveAsPNG(std::string fileName) { - vtkSmartPointer renderer = this->GetVtkRenderer(); - bool doubleBuffering( renderer->GetRenderWindow()->GetDoubleBuffer() ); - renderer->GetRenderWindow()->DoubleBufferOff(); + vtkSmartPointer renderer = this->GetVtkRenderer(); + bool doubleBuffering( renderer->GetRenderWindow()->GetDoubleBuffer() ); + renderer->GetRenderWindow()->DoubleBufferOff(); - vtkSmartPointer magnifier = vtkSmartPointer::New(); - magnifier->SetInput(renderer); - magnifier->SetMagnification(1); + vtkSmartPointer magnifier = vtkSmartPointer::New(); + magnifier->SetInput(renderer); + magnifier->SetMagnification(1); - vtkSmartPointer fileWriter = vtkSmartPointer::New(); - fileWriter->SetInput(magnifier->GetOutput()); - fileWriter->SetFileName(fileName.c_str()); + vtkSmartPointer fileWriter = vtkSmartPointer::New(); + fileWriter->SetInput(magnifier->GetOutput()); + fileWriter->SetFileName(fileName.c_str()); - fileWriter->Write(); - renderer->GetRenderWindow()->SetDoubleBuffer(doubleBuffering); + fileWriter->Write(); + renderer->GetRenderWindow()->SetDoubleBuffer(doubleBuffering); +} + +void mitkRenderingTestHelper::SaveReferenceScreenShot(std::string fileName) +{ + this->SaveAsPNG(fileName); } void mitkRenderingTestHelper::AddToStorage(const std::string &filename) { - try - { - mitk::DataNode::Pointer node = mitk::IOUtil::LoadDataNode(filename); - this->AddNodeToStorage(node); - } - catch ( itk::ExceptionObject & e ) - { - MITK_ERROR << "Failed loading test data '" << filename << "': " << e.what(); - } + try + { + mitk::DataNode::Pointer node = mitk::IOUtil::LoadDataNode(filename); + this->AddNodeToStorage(node); + } + catch ( itk::ExceptionObject & e ) + { + MITK_ERROR << "Failed loading test data '" << filename << "': " << e.what(); + } } void mitkRenderingTestHelper::AddNodeToStorage(mitk::DataNode::Pointer node) { - this->m_DataStorage->Add(node); - mitk::RenderingManager::GetInstance()->InitializeViews( m_DataStorage->ComputeBoundingGeometry3D(m_DataStorage->GetAll()) ); + this->m_DataStorage->Add(node); + mitk::RenderingManager::GetInstance()->InitializeViews( m_DataStorage->ComputeBoundingGeometry3D(m_DataStorage->GetAll()) ); } diff --git a/Core/Code/Rendering/mitkRenderingTestHelper.h b/Core/Code/Rendering/mitkRenderingTestHelper.h index 4b0ae508e1..9c30224e25 100644 --- a/Core/Code/Rendering/mitkRenderingTestHelper.h +++ b/Core/Code/Rendering/mitkRenderingTestHelper.h @@ -1,114 +1,159 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ #ifndef mitkRenderingTestHelper_h #define mitkRenderingTestHelper_h #include #include #include #include #include class vtkRenderWindow; class vtkRenderer; class MITK_CORE_EXPORT mitkRenderingTestHelper { public: - /** @brief Generate a rendering test helper object including a render window of the size width * height (in pixel). - @param argc Number of parameters. (here: Images) "Usage: [filename1 filenam2 -V referenceScreenshot (optional -T /directory/to/save/differenceImage)] - @param argv Given parameters. + /** @brief Generate a rendering test helper object including a render window of the size width * height (in pixel). + @param argc Number of parameters. (here: Images) "Usage: [filename1 filenam2 -V referenceScreenshot + (optional -T /directory/to/save/differenceImage)] + @param argv Given parameters. **/ - mitkRenderingTestHelper(int width, int height, int argc, char *argv[]); + mitkRenderingTestHelper(int width, int height, int argc, char *argv[]); + + /** @brief Generate a rendering test helper object including a render window of the size width * height (in pixel).*/ + mitkRenderingTestHelper(int width, int height); - ~mitkRenderingTestHelper(); + /** Default destructor */ + ~mitkRenderingTestHelper(); - /** @brief Getter for the vtkRenderer. + /** @brief Getter for the vtkRenderer. **/ - vtkRenderer* GetVtkRenderer(); + vtkRenderer* GetVtkRenderer(); - /** @brief Getter for the vtkRenderWindow which should be used to call vtkRegressionTestImage. + /** @brief Getter for the vtkRenderWindow which should be used to call vtkRegressionTestImage. **/ - vtkRenderWindow* GetVtkRenderWindow(); + vtkRenderWindow* GetVtkRenderWindow(); - /** @brief Method can be used to save a screenshot (e.g. reference screenshot as a .png file. + /** @brief Method can be used to save a screenshot (e.g. reference screenshot as a .png file. @param fileName The filename of the new screenshot (including path). **/ - void SaveAsPNG(std::string fileName); + void SaveAsPNG(std::string fileName); + + /** + * @brief SetStopRenderWindow Convenience method to make the renderwindow hold after rendering. Usefull for debugging. + * @param flag Flag indicating whether the renderwindow should automatically close (false, default) or stay open (true). Usefull for debugging. + */ + void SetAutomaticallyCloseRenderWindow(bool automaticallyCloseRenderWindow); - /** @brief This method set the property of the member datastorage + /** @brief This method set the property of the member datastorage @param property Set a property for each image in the datastorage m_DataStorage. **/ - void SetImageProperty(const char *propertyKey, mitk::BaseProperty *property); + void SetImageProperty(const char *propertyKey, mitk::BaseProperty *property); - /** @brief Set the view direction of the renderwindow (e.g. sagittal, coronal, axial) + /** @brief Set the view direction of the renderwindow (e.g. sagittal, coronal, axial) **/ - void SetViewDirection(mitk::SliceNavigationController::ViewDirection viewDirection); + void SetViewDirection(mitk::SliceNavigationController::ViewDirection viewDirection); - /** @brief Reorient the slice (e.g. rotation and translation like the swivel mode). + /** @brief Reorient the slice (e.g. rotation and translation like the swivel mode). **/ - void ReorientSlices(mitk::Point3D origin, mitk::Vector3D rotation); + void ReorientSlices(mitk::Point3D origin, mitk::Vector3D rotation); - /** @brief Render everything into an mitkRenderWindow. Call SetViewDirection() and SetProperty() before this method. + /** @brief Render everything into an mitkRenderWindow. Call SetViewDirection() and SetProperty() before this method. **/ - void Render(); - /** @brief Calls PrepareRender function of mitkRenderWindow + void Render(); + /** @brief Calls PrepareRender function of mitkRenderWindow **/ - void PrepareRender(); + void PrepareRender(); - /** @brief Returns the datastorage, in order to modify the data inside a rendering test. + /** @brief Returns the datastorage, in order to modify the data inside a rendering test. **/ - mitk::DataStorage::Pointer GetDataStorage(); + mitk::DataStorage::Pointer GetDataStorage(); - /** + /** * @brief SetMapperID Change between Standard2D and 3D mappers. * @param id Enum mitk::BaseRenderer::StandardMapperSlot which defines the mapper. */ - void SetMapperID(mitk::BaseRenderer::StandardMapperSlot id); + void SetMapperID(mitk::BaseRenderer::StandardMapperSlot id); - /** + /** * @brief AddNodeToStorage Add a node to the datastorage and perform a reinit which is necessary for rendering. * @param node The data you want to add. */ - void AddNodeToStorage(mitk::DataNode::Pointer node); + void AddNodeToStorage(mitk::DataNode::Pointer node); + + /** + * @brief SetMapperIDToRender3D Convenience method to render in a 3D renderwindow. + * @warning Does not add helper objects like the image planes to render images in 3D. + */ + void SetMapperIDToRender3D(); + + /** + * @brief SetMapperIDToRender2D Convenience method to render in a 2D renderwindow. + */ + void SetMapperIDToRender2D(); + + /** + * @brief SaveReferenceScreenShot Convenience method to save a reference screen shot. + * @param fileName Path/to/save/the/png/file. + */ + void SaveReferenceScreenShot(std::string fileName); + + /** + * @brief CompareRenderWindowAgainstReference Convenience method to compare the image rendered in the internal renderwindow against a reference screen shot + * @param argc Number of arguments. + * @param argv Arguments must(!) contain the term "-V Path/To/Valid/Image.png" + * @param threshold Allowed difference between two images. Default = 10.0 and was taken from VTK. + * @return True if the images are equal regarding the threshold. False in all other cases. + */ + bool CompareRenderWindowAgainstReference(int argc, char *argv[], double threshold = 10.0); + protected: + /** + * @brief Initialize Internal method to initialize the renderwindow and set the datastorage. + * @param width Height of renderwindow. + * @param height Width of renderwindow. + */ + void Initialize(int width, int height); - /** @brief Prints the opengl information, e.g. version, vendor and extensions, + /** @brief Prints the opengl information, e.g. version, vendor and extensions, * This function can only be called after an opengl context is active. * It only prints the context after the vtkRenderwindow is fully initialized. **/ - void PrintGLInfo(); + void PrintGLInfo(); - /** @brief This method tries to load the given file into a member datastorage, in order to render it. + /** @brief This method tries to load the given file into a member datastorage, in order to render it. @param fileName The filename of the file to be loaded (including path). **/ - void AddToStorage(const std::string& filename); + void AddToStorage(const std::string& filename); - /** @brief This method tries to parse the given argv for files (e.g. images) and load them into a member datastorage, in order to render it. + /** @brief This method tries to parse the given argv for files (e.g. images) and load them into a member datastorage, in order to render it. @param argc Number of parameters. @param argv Given parameters. **/ - void SetInputFileNames(int argc, char *argv[]); + void SetInputFileNames(int argc, char *argv[]); - mitk::RenderWindow::Pointer m_RenderWindow; //<< Contains the mitkRenderWindow into which the test renders the data - mitk::DataStorage::Pointer m_DataStorage; //<< Contains the mitkDataStorage which contains the data to be rendered + mitk::RenderWindow::Pointer m_RenderWindow; //<< Contains the mitkRenderWindow into which the test renders the data + mitk::DataStorage::Pointer m_DataStorage; //<< Contains the mitkDataStorage which contains the data to be rendered + bool m_AutomaticallyCloseRenderWindow; //<< Flag indicating whether the renderwindow should automatically close (true, default) or stay open (false). Usefull for debugging. }; #endif diff --git a/Core/Code/Testing/mitkImageVtkMapper2DColorTest.cpp b/Core/Code/Testing/mitkImageVtkMapper2DColorTest.cpp index 47cbb6e9e0..3012ae6afd 100644 --- a/Core/Code/Testing/mitkImageVtkMapper2DColorTest.cpp +++ b/Core/Code/Testing/mitkImageVtkMapper2DColorTest.cpp @@ -1,74 +1,76 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ //MITK #include "mitkTestingMacros.h" #include "mitkRenderingTestHelper.h" //VTK #include int mitkImageVtkMapper2DColorTest(int argc, char* argv[]) { // load all arguments into a datastorage, take last argument as reference rendering // setup a renderwindow of fixed size X*Y // render the datastorage // compare rendering to reference image MITK_TEST_BEGIN("mitkImageVtkMapper2DTest") // enough parameters? if ( argc < 2 ) { MITK_TEST_OUTPUT( << "Usage: " << std::string(*argv) << " [file1 file2 ...] outputfile" ) MITK_TEST_OUTPUT( << "Will render a central axial slice of all given files into outputfile" ) exit( EXIT_SUCCESS ); } mitkRenderingTestHelper renderingHelper(640, 480, argc, argv); //Set the opacity for all images renderingHelper.SetImageProperty("color", mitk::ColorProperty::New(0.0f, 0.0f, 255.0f)); //for now this test renders in sagittal view direction renderingHelper.SetViewDirection(mitk::SliceNavigationController::Sagittal); renderingHelper.Render(); - //use this to generate a reference screenshot or save the file: - bool generateReferenceScreenshot = false; - if(generateReferenceScreenshot) + //#################### + //Use this to generate a reference screenshot or save the file. + //(Only in your local version of the test!) + if(false) { - renderingHelper.SaveAsPNG("/home/kilgus/Pictures/RenderingTestData/output.png"); + renderingHelper.SaveReferenceScreenShot("/home/kilgus/Pictures/RenderingTestData/output.png"); } + //#################### //### Usage of vtkRegressionTestImage: //vtkRegressionTestImage( vtkRenderWindow ) //Set a vtkRenderWindow containing the desired scene. //vtkRegressionTestImage automatically searches in argc and argv[] //for a path a valid image with -V. If the test failed with the //first image (foo.png) check if there are images of the form //foo_N.png (where N=1,2,3...) and compare against them. - renderingHelper.PrepareRender(); - int retVal = vtkRegressionTestImage( renderingHelper.GetVtkRenderWindow() ); - - //retVal meanings: (see VTK/Rendering/vtkTesting.h) - //0 = test failed - //1 = test passed - //2 = test not run - //3 = something with vtkInteraction - MITK_TEST_CONDITION( retVal == 1, "VTK test result positive" ); +// renderingHelper.PrepareRender(); +// int retVal = vtkRegressionTestImage( renderingHelper.GetVtkRenderWindow() ); + +// //retVal meanings: (see VTK/Rendering/vtkTesting.h) +// //0 = test failed +// //1 = test passed +// //2 = test not run +// //3 = something with vtkInteraction + MITK_TEST_CONDITION( renderingHelper.CompareRenderWindowAgainstReference(argc, argv) == true, "CompareRenderWindowAgainstReference test result positive" ); MITK_TEST_END(); }