diff --git a/offline_ray_tracer/include/poly_data_io.hpp b/offline_ray_tracer/include/poly_data_io.hpp deleted file mode 100644 index abfe8aec3632286a4c6bbb9401a8aeec7a38ef7f..0000000000000000000000000000000000000000 --- a/offline_ray_tracer/include/poly_data_io.hpp +++ /dev/null @@ -1,40 +0,0 @@ -#ifndef POLY_DATA_IO_HPP -#define POLY_DATA_IO_HPP - -#include <string> - -#include <vtkPolyData.h> -#include <vtkSmartPointer.h> -#include <vtkXMLPolyDataReader.h> -#include <vtkXMLPolyDataWriter.h> - -namespace rt -{ -class poly_data_io -{ -public: - static vtkSmartPointer<vtkPolyData> read (const std::string& filepath) - { - auto reader = vtkSmartPointer<vtkXMLPolyDataReader>::New(); - auto data = vtkSmartPointer<vtkPolyData> ::New(); - reader->SetFileName(filepath.c_str()); - reader->Update (); - data ->ShallowCopy(reader->GetOutput()); - return data; - } - static void write(const std::string& filepath, vtkPolyData* data, const bool compress = false) - { - auto writer = vtkSmartPointer<vtkXMLPolyDataWriter>::New(); - writer->SetDataModeToBinary (); - writer->SetFileName (filepath.c_str()); - writer->SetHeaderTypeToUInt64(); - writer->SetInputData (data); - compress - ? writer->SetCompressorTypeToZLib() - : writer->SetCompressorTypeToNone(); - writer->Write (); - } -}; -} - -#endif diff --git a/offline_ray_tracer/include/unstructured_grid_io.hpp b/offline_ray_tracer/include/unstructured_grid_io.hpp deleted file mode 100644 index 2c93c954afb756b13729ef11048c08b6e1875ed6..0000000000000000000000000000000000000000 --- a/offline_ray_tracer/include/unstructured_grid_io.hpp +++ /dev/null @@ -1,45 +0,0 @@ -#ifndef UNSTRUCTURED_GRID_IO_HPP -#define UNSTRUCTURED_GRID_IO_HPP - -#include <optional> -#include <string> - -#include <vtkSmartPointer.h> -#include <vtkXMLUnstructuredGridReader.h> -#include <vtkXMLUnstructuredGridWriter.h> -#include <vtkUnstructuredGrid.h> - -namespace rt -{ -class unstructured_grid_io -{ -public: - static vtkSmartPointer<vtkUnstructuredGrid> read (const std::string& filepath, std::optional<std::string> field_name) - { - auto reader = vtkSmartPointer<vtkXMLUnstructuredGridReader>::New(); - auto data = vtkSmartPointer<vtkUnstructuredGrid> ::New(); - reader->SetFileName(filepath.c_str()); - - if (field_name) - reader->SetInputArrayToProcess(0, 0, 0, vtkDataObject::FIELD_ASSOCIATION_CELLS, field_name->c_str()); - - reader->Update (); - data ->ShallowCopy(reader->GetOutput()); - return data; - } - static void write(const std::string& filepath, vtkUnstructuredGrid* data, const bool compress = false) - { - auto writer = vtkSmartPointer<vtkXMLUnstructuredGridWriter>::New(); - writer->SetDataModeToBinary (); - writer->SetFileName (filepath.c_str()); - writer->SetHeaderTypeToUInt64(); - writer->SetInputData (data); - compress - ? writer->SetCompressorTypeToZLib() - : writer->SetCompressorTypeToNone(); - writer->Write (); - } -}; -} - -#endif diff --git a/offline_ray_tracer/source/main.cpp b/offline_ray_tracer/source/main.cpp index 4eba451b3693e7b7d43228c631e8c6c71d4ceaa5..d5a9dc780132acdf49f2052a722b5b9d422de9c6 100644 --- a/offline_ray_tracer/source/main.cpp +++ b/offline_ray_tracer/source/main.cpp @@ -51,26 +51,11 @@ std::int32_t main(std::int32_t argc, char** argv) interpolator->AddCamera (key_frame.time, camera); } - std::cout << "Setting up geometry.\n"; - auto pd_mapper = vtkSmartPointer<vtkPolyDataMapper>::New(); - auto pd_actor = vtkSmartPointer<vtkActor> ::New(); - if (!settings.data_filepaths[0].geometry.empty()) - { - pd_actor->SetMapper(pd_mapper); - renderer->AddActor (pd_actor ); - } - - std::cout << "Setting up volume.\n"; - auto ug_mapper = vtkSmartPointer<vtkUnstructuredGridVolumeRayCastMapper>::New(); - auto ug_volume = vtkSmartPointer<vtkVolume> ::New(); - if (!settings.data_filepaths[0].volume.empty()) - { - auto tf = rt::transfer_function(settings.transfer_function); - ug_volume->GetProperty()->SetScalarOpacity(tf.opacity_function); - ug_volume->GetProperty()->SetColor (tf.color_function ); - ug_volume->SetMapper (ug_mapper); - renderer ->AddVolume (ug_volume); - } + std::cout << "Setting up geometry and volume.\n"; + auto pd_mapper = vtkSmartPointer<vtkPolyDataMapper> (); + auto pd_actor = vtkSmartPointer<vtkActor> (); + auto ug_mapper = vtkSmartPointer<vtkUnstructuredGridVolumeRayCastMapper>(); + auto ug_volume = vtkSmartPointer<vtkVolume> (); std::cout << "Setting up video writer.\n"; auto window_to_image = vtkSmartPointer<vtkWindowToImageFilter>::New(); @@ -89,14 +74,55 @@ std::int32_t main(std::int32_t argc, char** argv) { std::size_t slice = std::floor(current_time / settings.time_scale); slice = settings.loop ? slice % settings.data_filepaths.size() : std::min(slice, settings.data_filepaths.size() - 1); + if (last_slice != slice) { - std::cout << "Loading slice " << slice << ".\n"; last_slice = slice; + + std::cout << "Clearing previous slice.\n"; + renderer ->RemoveActor (pd_actor ); + pd_actor ->SetMapper (nullptr ); + renderer ->RemoveVolume(ug_volume); + ug_volume->SetMapper (nullptr ); + + pd_mapper = nullptr; + pd_actor = nullptr; + ug_mapper = nullptr; + ug_volume = nullptr; + + + auto reader = vtkSmartPointer<vtkXMLPolyDataReader>::New(); + auto data = vtkSmartPointer<vtkPolyData> ::New(); + reader->SetFileName(filepath.c_str()); + reader->Update (); + data ->ShallowCopy(reader->GetOutput()); + return data; + + + auto reader = vtkSmartPointer<vtkXMLUnstructuredGridReader>::New(); + auto data = vtkSmartPointer<vtkUnstructuredGrid> ::New(); + reader->SetFileName(filepath.c_str()); + + if (field_name) + reader->SetInputArrayToProcess(0, 0, 0, vtkDataObject::FIELD_ASSOCIATION_CELLS, field_name->c_str()); + + reader->Update (); + data ->ShallowCopy(reader->GetOutput()); + return data; + + std::cout << "Loading next slice (" << slice << ").\n"; if (!settings.data_filepaths[slice].geometry.empty()) pd_mapper->SetInputData(rt::poly_data_io ::read(settings.data_filepaths[slice].geometry)); if (!settings.data_filepaths[slice].volume .empty()) ug_mapper->SetInputData(rt::unstructured_grid_io::read(settings.data_filepaths[slice].volume , "Q")); + + auto tf = rt::transfer_function(settings.transfer_function); + pd_actor->SetMapper (pd_mapper); + renderer->AddActor (pd_actor ); + ug_volume->GetProperty()->SetScalarOpacity(tf.opacity_function); + ug_volume->GetProperty()->SetColor (tf.color_function ); + ug_volume->SetMapper (ug_mapper); + renderer ->AddVolume (ug_volume); } std::cout << "Rendering frame " << current_time << ".\n"; @@ -108,7 +134,8 @@ std::int32_t main(std::int32_t argc, char** argv) current_time += settings.update_rate; } - std::cout << "Finished rendering.\n"; + + std::cout << "Finished rendering. Finalizing video.\n"; video_writer->End(); return 0;