From 59bd2f5a73938b356701638096e2f39bb9a4b5ad Mon Sep 17 00:00:00 2001 From: robin Date: Mon, 6 May 2024 16:45:56 +0200 Subject: [PATCH 1/2] renamed and stuff --- {vtk => particle-track-and-trace}/.gitignore | 0 {vtk => particle-track-and-trace}/README.md | 2 +- {vtk => particle-track-and-trace}/src/CMakeLists.txt | 10 +++++----- .../src/CartographicTransformation.cpp | 0 .../src/CartographicTransformation.h | 9 +++++---- {vtk => particle-track-and-trace}/src/Program.cpp | 0 {vtk => particle-track-and-trace}/src/Program.h | 0 .../src/advection/AdvectionKernel.h | 6 +++--- .../src/advection/EulerAdvectionKernel.cpp | 0 .../src/advection/EulerAdvectionKernel.h | 6 +++--- .../src/advection/RK4AdvectionKernel.cpp | 0 .../src/advection/RK4AdvectionKernel.h | 6 +++--- .../src/advection/UVGrid.cpp | 0 .../src/advection/UVGrid.h | 6 +++--- .../src/advection/Vel.cpp | 0 {vtk => particle-track-and-trace}/src/advection/Vel.h | 6 +++--- .../src/advection/interpolate.cpp | 0 .../src/advection/interpolate.h | 6 +++--- .../src/advection/readdata.cpp | 0 .../src/advection/readdata.h | 6 +++--- .../src/commands/SpawnPointCallback.cpp | 0 .../src/commands/SpawnPointCallback.h | 6 +++--- .../src/commands/TimerCallbackCommand.cpp | 0 .../src/commands/TimerCallbackCommand.h | 0 .../src/layers/BackgroundImage.cpp | 0 .../src/layers/BackgroundImage.h | 0 .../src/layers/EGlyphLayer.cpp | 0 .../src/layers/EGlyphLayer.h | 0 .../src/layers/LGlyphLayer.cpp | 1 - .../src/layers/LGlyphLayer.h | 0 {vtk => particle-track-and-trace}/src/layers/Layer.cpp | 0 {vtk => particle-track-and-trace}/src/layers/Layer.h | 0 {vtk => particle-track-and-trace}/src/main.cpp | 0 {vtk => particle-track-and-trace}/src/modules.json | 0 {vtk => particle-track-and-trace}/src/script.py | 0 35 files changed, 35 insertions(+), 35 deletions(-) rename {vtk => particle-track-and-trace}/.gitignore (100%) rename {vtk => particle-track-and-trace}/README.md (98%) rename {vtk => particle-track-and-trace}/src/CMakeLists.txt (88%) rename {vtk => particle-track-and-trace}/src/CartographicTransformation.cpp (100%) rename {vtk => particle-track-and-trace}/src/CartographicTransformation.h (83%) rename {vtk => particle-track-and-trace}/src/Program.cpp (100%) rename {vtk => particle-track-and-trace}/src/Program.h (100%) rename {vtk => particle-track-and-trace}/src/advection/AdvectionKernel.h (90%) rename {vtk => particle-track-and-trace}/src/advection/EulerAdvectionKernel.cpp (100%) rename {vtk => particle-track-and-trace}/src/advection/EulerAdvectionKernel.h (81%) rename {vtk => particle-track-and-trace}/src/advection/RK4AdvectionKernel.cpp (100%) rename {vtk => particle-track-and-trace}/src/advection/RK4AdvectionKernel.h (82%) rename {vtk => particle-track-and-trace}/src/advection/UVGrid.cpp (100%) rename {vtk => particle-track-and-trace}/src/advection/UVGrid.h (95%) rename {vtk => particle-track-and-trace}/src/advection/Vel.cpp (100%) rename {vtk => particle-track-and-trace}/src/advection/Vel.h (94%) rename {vtk => particle-track-and-trace}/src/advection/interpolate.cpp (100%) rename {vtk => particle-track-and-trace}/src/advection/interpolate.h (89%) rename {vtk => particle-track-and-trace}/src/advection/readdata.cpp (100%) rename {vtk => particle-track-and-trace}/src/advection/readdata.h (82%) rename {vtk => particle-track-and-trace}/src/commands/SpawnPointCallback.cpp (100%) rename {vtk => particle-track-and-trace}/src/commands/SpawnPointCallback.h (88%) rename {vtk => particle-track-and-trace}/src/commands/TimerCallbackCommand.cpp (100%) rename {vtk => particle-track-and-trace}/src/commands/TimerCallbackCommand.h (100%) rename {vtk => particle-track-and-trace}/src/layers/BackgroundImage.cpp (100%) rename {vtk => particle-track-and-trace}/src/layers/BackgroundImage.h (100%) rename {vtk => particle-track-and-trace}/src/layers/EGlyphLayer.cpp (100%) rename {vtk => particle-track-and-trace}/src/layers/EGlyphLayer.h (100%) rename {vtk => particle-track-and-trace}/src/layers/LGlyphLayer.cpp (99%) rename {vtk => particle-track-and-trace}/src/layers/LGlyphLayer.h (100%) rename {vtk => particle-track-and-trace}/src/layers/Layer.cpp (100%) rename {vtk => particle-track-and-trace}/src/layers/Layer.h (100%) rename {vtk => particle-track-and-trace}/src/main.cpp (100%) rename {vtk => particle-track-and-trace}/src/modules.json (100%) rename {vtk => particle-track-and-trace}/src/script.py (100%) diff --git a/vtk/.gitignore b/particle-track-and-trace/.gitignore similarity index 100% rename from vtk/.gitignore rename to particle-track-and-trace/.gitignore diff --git a/vtk/README.md b/particle-track-and-trace/README.md similarity index 98% rename from vtk/README.md rename to particle-track-and-trace/README.md index 8f87e04..188a816 100644 --- a/vtk/README.md +++ b/particle-track-and-trace/README.md @@ -19,7 +19,7 @@ data/ hydrodynamic_U.h5 hydrodynamic_V.h5 interactive-track-and-trace/ - opening-hdf5/ + particle-track-and-trace/ ... ``` diff --git a/vtk/src/CMakeLists.txt b/particle-track-and-trace/src/CMakeLists.txt similarity index 88% rename from vtk/src/CMakeLists.txt rename to particle-track-and-trace/src/CMakeLists.txt index cf0b9d3..f3a25fe 100644 --- a/vtk/src/CMakeLists.txt +++ b/particle-track-and-trace/src/CMakeLists.txt @@ -1,6 +1,6 @@ cmake_minimum_required(VERSION 3.12 FATAL_ERROR) -project(VtkBase) +project(ParticleTrackTrace) set(CMAKE_CXX_STANDARD 23) set(CMAKE_CXX_STANDARD_REQUIRED ON) @@ -34,7 +34,7 @@ endif() # netcdf setup find_package(netCDF REQUIRED) -add_executable(VtkBase MACOSX_BUNDLE main.cpp +add_executable(ParticleTrackTrace MACOSX_BUNDLE main.cpp layers/BackgroundImage.cpp layers/BackgroundImage.h layers/EGlyphLayer.cpp @@ -77,16 +77,16 @@ execute_process( OUTPUT_STRIP_TRAILING_WHITESPACE ) -target_include_directories(VtkBase PUBLIC ${netCDF_INCLUDE_DIR}) +target_include_directories(ParticleTrackTrace PUBLIC ${netCDF_INCLUDE_DIR}) find_library(NETCDF_LIB NAMES netcdf-cxx4 netcdf_c++4 PATHS ${NETCDFCXX_LIB_DIR} NO_DEFAULT_PATH) # Prevent a "command line is too long" failure in Windows. set(CMAKE_NINJA_FORCE_RESPONSE_FILE "ON" CACHE BOOL "Force Ninja to use response files.") -target_link_libraries(VtkBase ${NETCDF_LIB} ${VTK_LIBRARIES}) +target_link_libraries(ParticleTrackTrace ${NETCDF_LIB} ${VTK_LIBRARIES}) # vtk_module_autoinit is needed vtk_module_autoinit( - TARGETS VtkBase + TARGETS ParticleTrackTrace MODULES ${VTK_LIBRARIES} ) diff --git a/vtk/src/CartographicTransformation.cpp b/particle-track-and-trace/src/CartographicTransformation.cpp similarity index 100% rename from vtk/src/CartographicTransformation.cpp rename to particle-track-and-trace/src/CartographicTransformation.cpp diff --git a/vtk/src/CartographicTransformation.h b/particle-track-and-trace/src/CartographicTransformation.h similarity index 83% rename from vtk/src/CartographicTransformation.h rename to particle-track-and-trace/src/CartographicTransformation.h index e615a26..3cdd2c1 100644 --- a/vtk/src/CartographicTransformation.h +++ b/particle-track-and-trace/src/CartographicTransformation.h @@ -2,10 +2,9 @@ #include #include "advection/UVGrid.h" -#ifndef VTKBASE_NORMALISEDCARTOGRAPHICCAMERA_H -#define VTKBASE_NORMALISEDCARTOGRAPHICCAMERA_H +#ifndef NORMALISEDCARTOGRAPHICCAMERA_H +#define NORMALISEDCARTOGRAPHICCAMERA_H -#endif //VTKBASE_NORMALISEDCARTOGRAPHICCAMERA_H /** * Constructs a orthographically projected camera that looks at the square x,y in [-1, 1] with z = 0 and w = 1. @@ -27,4 +26,6 @@ vtkSmartPointer getCartographicTransformMatrix(const std::shared_p * Convenience function that converts the 4x4 projection matrix into a vtkTransformFilter * @return pointer to transform filter */ -vtkSmartPointer createCartographicTransformFilter(const std::shared_ptr uvGrid); \ No newline at end of file +vtkSmartPointer createCartographicTransformFilter(const std::shared_ptr uvGrid); + +#endif //NORMALISEDCARTOGRAPHICCAMERA_H diff --git a/vtk/src/Program.cpp b/particle-track-and-trace/src/Program.cpp similarity index 100% rename from vtk/src/Program.cpp rename to particle-track-and-trace/src/Program.cpp diff --git a/vtk/src/Program.h b/particle-track-and-trace/src/Program.h similarity index 100% rename from vtk/src/Program.h rename to particle-track-and-trace/src/Program.h diff --git a/vtk/src/advection/AdvectionKernel.h b/particle-track-and-trace/src/advection/AdvectionKernel.h similarity index 90% rename from vtk/src/advection/AdvectionKernel.h rename to particle-track-and-trace/src/advection/AdvectionKernel.h index 3515e6c..5479858 100644 --- a/vtk/src/advection/AdvectionKernel.h +++ b/particle-track-and-trace/src/advection/AdvectionKernel.h @@ -1,5 +1,5 @@ -#ifndef ADVECTION_ADVECTIONKERNEL_H -#define ADVECTION_ADVECTIONKERNEL_H +#ifndef ADVECTIONKERNEL_H +#define ADVECTIONKERNEL_H #include @@ -28,4 +28,4 @@ public: virtual ~AdvectionKernel() = default; // Apparently I need this, idk why }; -#endif //ADVECTION_ADVECTIONKERNEL_H +#endif //ADVECTIONKERNEL_H diff --git a/vtk/src/advection/EulerAdvectionKernel.cpp b/particle-track-and-trace/src/advection/EulerAdvectionKernel.cpp similarity index 100% rename from vtk/src/advection/EulerAdvectionKernel.cpp rename to particle-track-and-trace/src/advection/EulerAdvectionKernel.cpp diff --git a/vtk/src/advection/EulerAdvectionKernel.h b/particle-track-and-trace/src/advection/EulerAdvectionKernel.h similarity index 81% rename from vtk/src/advection/EulerAdvectionKernel.h rename to particle-track-and-trace/src/advection/EulerAdvectionKernel.h index 2938019..92465f2 100644 --- a/vtk/src/advection/EulerAdvectionKernel.h +++ b/particle-track-and-trace/src/advection/EulerAdvectionKernel.h @@ -1,5 +1,5 @@ -#ifndef ADVECTION_EULERADVECTIONKERNEL_H -#define ADVECTION_EULERADVECTIONKERNEL_H +#ifndef EULERADVECTIONKERNEL_H +#define EULERADVECTIONKERNEL_H #include "AdvectionKernel.h" #include "UVGrid.h" @@ -22,4 +22,4 @@ public: }; -#endif //ADVECTION_EULERADVECTIONKERNEL_H +#endif //EULERADVECTIONKERNEL_H diff --git a/vtk/src/advection/RK4AdvectionKernel.cpp b/particle-track-and-trace/src/advection/RK4AdvectionKernel.cpp similarity index 100% rename from vtk/src/advection/RK4AdvectionKernel.cpp rename to particle-track-and-trace/src/advection/RK4AdvectionKernel.cpp diff --git a/vtk/src/advection/RK4AdvectionKernel.h b/particle-track-and-trace/src/advection/RK4AdvectionKernel.h similarity index 82% rename from vtk/src/advection/RK4AdvectionKernel.h rename to particle-track-and-trace/src/advection/RK4AdvectionKernel.h index 94db490..942bec7 100644 --- a/vtk/src/advection/RK4AdvectionKernel.h +++ b/particle-track-and-trace/src/advection/RK4AdvectionKernel.h @@ -1,5 +1,5 @@ -#ifndef ADVECTION_RK4ADVECTIONKERNEL_H -#define ADVECTION_RK4ADVECTIONKERNEL_H +#ifndef RK4ADVECTIONKERNEL_H +#define RK4ADVECTIONKERNEL_H #include "AdvectionKernel.h" #include "UVGrid.h" @@ -19,4 +19,4 @@ public: }; -#endif //ADVECTION_RK4ADVECTIONKERNEL_H +#endif //RK4ADVECTIONKERNEL_H diff --git a/vtk/src/advection/UVGrid.cpp b/particle-track-and-trace/src/advection/UVGrid.cpp similarity index 100% rename from vtk/src/advection/UVGrid.cpp rename to particle-track-and-trace/src/advection/UVGrid.cpp diff --git a/vtk/src/advection/UVGrid.h b/particle-track-and-trace/src/advection/UVGrid.h similarity index 95% rename from vtk/src/advection/UVGrid.h rename to particle-track-and-trace/src/advection/UVGrid.h index f068ea9..221363f 100644 --- a/vtk/src/advection/UVGrid.h +++ b/particle-track-and-trace/src/advection/UVGrid.h @@ -1,5 +1,5 @@ -#ifndef ADVECTION_UVGRID_H -#define ADVECTION_UVGRID_H +#ifndef UVGRID_H +#define UVGRID_H #include #include "Vel.h" @@ -62,4 +62,4 @@ public: void streamSlice(std::ostream &os, size_t t); }; -#endif //ADVECTION_UVGRID_H +#endif //UVGRID_H diff --git a/vtk/src/advection/Vel.cpp b/particle-track-and-trace/src/advection/Vel.cpp similarity index 100% rename from vtk/src/advection/Vel.cpp rename to particle-track-and-trace/src/advection/Vel.cpp diff --git a/vtk/src/advection/Vel.h b/particle-track-and-trace/src/advection/Vel.h similarity index 94% rename from vtk/src/advection/Vel.h rename to particle-track-and-trace/src/advection/Vel.h index 74d62cd..2adb193 100644 --- a/vtk/src/advection/Vel.h +++ b/particle-track-and-trace/src/advection/Vel.h @@ -1,5 +1,5 @@ -#ifndef ADVECTION_VEL_H -#define ADVECTION_VEL_H +#ifndef VEL_H +#define VEL_H #include #include @@ -41,4 +41,4 @@ Vel operator*(Scalar scalar, const Vel& p) { return Vel(p.u * scalar, p.v * scalar); } -#endif //ADVECTION_VEL_H +#endif //VEL_H diff --git a/vtk/src/advection/interpolate.cpp b/particle-track-and-trace/src/advection/interpolate.cpp similarity index 100% rename from vtk/src/advection/interpolate.cpp rename to particle-track-and-trace/src/advection/interpolate.cpp diff --git a/vtk/src/advection/interpolate.h b/particle-track-and-trace/src/advection/interpolate.h similarity index 89% rename from vtk/src/advection/interpolate.h rename to particle-track-and-trace/src/advection/interpolate.h index 80176d5..6318dd8 100644 --- a/vtk/src/advection/interpolate.h +++ b/particle-track-and-trace/src/advection/interpolate.h @@ -1,5 +1,5 @@ -#ifndef ADVECTION_INTERPOLATE_H -#define ADVECTION_INTERPOLATE_H +#ifndef INTERPOLATE_H +#define INTERPOLATE_H #include @@ -25,4 +25,4 @@ Vel bilinearinterpolate(const UVGrid &uvGrid, int time, double lat, double lon); */ std::vector bilinearinterpolation(const UVGrid &uvGrid, std::vector> points); -#endif //ADVECTION_INTERPOLATE_H +#endif //INTERPOLATE_H diff --git a/vtk/src/advection/readdata.cpp b/particle-track-and-trace/src/advection/readdata.cpp similarity index 100% rename from vtk/src/advection/readdata.cpp rename to particle-track-and-trace/src/advection/readdata.cpp diff --git a/vtk/src/advection/readdata.h b/particle-track-and-trace/src/advection/readdata.h similarity index 82% rename from vtk/src/advection/readdata.h rename to particle-track-and-trace/src/advection/readdata.h index 56a3fee..fea3f99 100644 --- a/vtk/src/advection/readdata.h +++ b/particle-track-and-trace/src/advection/readdata.h @@ -1,5 +1,5 @@ -#ifndef ADVECTION_READDATA_H -#define ADVECTION_READDATA_H +#ifndef READDATA_H +#define READDATA_H /** * reads the file hydrodynamic_U.h5 @@ -19,4 +19,4 @@ std::vector readHydrodynamicV(); */ std::tuple, std::vector, std::vector> readGrid(); -#endif //ADVECTION_READDATA_H +#endif //READDATA_H diff --git a/vtk/src/commands/SpawnPointCallback.cpp b/particle-track-and-trace/src/commands/SpawnPointCallback.cpp similarity index 100% rename from vtk/src/commands/SpawnPointCallback.cpp rename to particle-track-and-trace/src/commands/SpawnPointCallback.cpp diff --git a/vtk/src/commands/SpawnPointCallback.h b/particle-track-and-trace/src/commands/SpawnPointCallback.h similarity index 88% rename from vtk/src/commands/SpawnPointCallback.h rename to particle-track-and-trace/src/commands/SpawnPointCallback.h index a4123b2..cf50a26 100644 --- a/vtk/src/commands/SpawnPointCallback.h +++ b/particle-track-and-trace/src/commands/SpawnPointCallback.h @@ -1,5 +1,5 @@ -#ifndef VTKBASE_SPAWNPOINTCALLBACK_H -#define VTKBASE_SPAWNPOINTCALLBACK_H +#ifndef SPAWNPOINTCALLBACK_H +#define SPAWNPOINTCALLBACK_H #include @@ -37,4 +37,4 @@ private: }; -#endif //VTKBASE_SPAWNPOINTCALLBACK_H +#endif //SPAWNPOINTCALLBACK_H diff --git a/vtk/src/commands/TimerCallbackCommand.cpp b/particle-track-and-trace/src/commands/TimerCallbackCommand.cpp similarity index 100% rename from vtk/src/commands/TimerCallbackCommand.cpp rename to particle-track-and-trace/src/commands/TimerCallbackCommand.cpp diff --git a/vtk/src/commands/TimerCallbackCommand.h b/particle-track-and-trace/src/commands/TimerCallbackCommand.h similarity index 100% rename from vtk/src/commands/TimerCallbackCommand.h rename to particle-track-and-trace/src/commands/TimerCallbackCommand.h diff --git a/vtk/src/layers/BackgroundImage.cpp b/particle-track-and-trace/src/layers/BackgroundImage.cpp similarity index 100% rename from vtk/src/layers/BackgroundImage.cpp rename to particle-track-and-trace/src/layers/BackgroundImage.cpp diff --git a/vtk/src/layers/BackgroundImage.h b/particle-track-and-trace/src/layers/BackgroundImage.h similarity index 100% rename from vtk/src/layers/BackgroundImage.h rename to particle-track-and-trace/src/layers/BackgroundImage.h diff --git a/vtk/src/layers/EGlyphLayer.cpp b/particle-track-and-trace/src/layers/EGlyphLayer.cpp similarity index 100% rename from vtk/src/layers/EGlyphLayer.cpp rename to particle-track-and-trace/src/layers/EGlyphLayer.cpp diff --git a/vtk/src/layers/EGlyphLayer.h b/particle-track-and-trace/src/layers/EGlyphLayer.h similarity index 100% rename from vtk/src/layers/EGlyphLayer.h rename to particle-track-and-trace/src/layers/EGlyphLayer.h diff --git a/vtk/src/layers/LGlyphLayer.cpp b/particle-track-and-trace/src/layers/LGlyphLayer.cpp similarity index 99% rename from vtk/src/layers/LGlyphLayer.cpp rename to particle-track-and-trace/src/layers/LGlyphLayer.cpp index 35acafd..73402b2 100644 --- a/vtk/src/layers/LGlyphLayer.cpp +++ b/particle-track-and-trace/src/layers/LGlyphLayer.cpp @@ -28,7 +28,6 @@ vtkSmartPointer LGlyphLayer::createSpawnPointCallback() { // Further notes; current thinking is to allow tracking a particle's age by using a scalar array in the VtkPolyData. This would be incremented for every tick/updateData function call. // Another challenge is the concept of beaching; dead particles must not be included in the advect function call (wasted computations), but they should not be outright deleted from the vtkPoints either (we still want to display them). Working Solution: have another array of ints in the vtkPolyData, which tracks for how many calls of UpdateData a given particle has not had its position changed. If this int reaches some treshold (5? 10? 3? needs some testing), exclude the particle from the advect call. -// // TODO: modelling all this in vtkClasses is workable, but ideally i would want to work with a native C++ class. See if this is doable and feasible. LGlyphLayer::LGlyphLayer(std::shared_ptr uvGrid, std::unique_ptr advectionKernel) { diff --git a/vtk/src/layers/LGlyphLayer.h b/particle-track-and-trace/src/layers/LGlyphLayer.h similarity index 100% rename from vtk/src/layers/LGlyphLayer.h rename to particle-track-and-trace/src/layers/LGlyphLayer.h diff --git a/vtk/src/layers/Layer.cpp b/particle-track-and-trace/src/layers/Layer.cpp similarity index 100% rename from vtk/src/layers/Layer.cpp rename to particle-track-and-trace/src/layers/Layer.cpp diff --git a/vtk/src/layers/Layer.h b/particle-track-and-trace/src/layers/Layer.h similarity index 100% rename from vtk/src/layers/Layer.h rename to particle-track-and-trace/src/layers/Layer.h diff --git a/vtk/src/main.cpp b/particle-track-and-trace/src/main.cpp similarity index 100% rename from vtk/src/main.cpp rename to particle-track-and-trace/src/main.cpp diff --git a/vtk/src/modules.json b/particle-track-and-trace/src/modules.json similarity index 100% rename from vtk/src/modules.json rename to particle-track-and-trace/src/modules.json diff --git a/vtk/src/script.py b/particle-track-and-trace/src/script.py similarity index 100% rename from vtk/src/script.py rename to particle-track-and-trace/src/script.py From c9a88b1a46889f4b8d9e544cfc2111a0323a6bf0 Mon Sep 17 00:00:00 2001 From: robin Date: Mon, 6 May 2024 17:08:09 +0200 Subject: [PATCH 2/2] merge conflic --- particle-track-and-trace/src/CMakeLists.txt | 8 +- .../src/CartographicTransformation.h | 8 +- particle-track-and-trace/src/Program.cpp | 16 ++- particle-track-and-trace/src/Program.h | 12 +- .../src/advection/EulerAdvectionKernel.h | 1 + .../src/advection/RK4AdvectionKernel.h | 1 + .../src/commands/CameraMoveCallback.cpp | 104 ++++++++++++++++++ .../src/commands/CameraMoveCallback.h | 56 ++++++++++ .../src/commands/SpawnPointCallback.cpp | 56 +++++----- .../src/commands/SpawnPointCallback.h | 1 + .../src/commands/TimerCallbackCommand.cpp | 21 ++-- .../src/layers/BackgroundImage.cpp | 76 +++++++++---- .../src/layers/BackgroundImage.h | 9 ++ .../src/layers/EGlyphLayer.cpp | 7 -- .../src/layers/EGlyphLayer.h | 1 + .../src/layers/LGlyphLayer.cpp | 22 ++-- particle-track-and-trace/src/layers/Layer.cpp | 5 + particle-track-and-trace/src/layers/Layer.h | 5 + particle-track-and-trace/src/main.cpp | 2 + 19 files changed, 325 insertions(+), 86 deletions(-) create mode 100644 particle-track-and-trace/src/commands/CameraMoveCallback.cpp create mode 100644 particle-track-and-trace/src/commands/CameraMoveCallback.h diff --git a/particle-track-and-trace/src/CMakeLists.txt b/particle-track-and-trace/src/CMakeLists.txt index f3a25fe..d08133f 100644 --- a/particle-track-and-trace/src/CMakeLists.txt +++ b/particle-track-and-trace/src/CMakeLists.txt @@ -17,6 +17,8 @@ find_package(VTK COMPONENTS FiltersProgrammable FiltersSources ImagingSources + ImagingGeneral + ImagingCore InteractionStyle IOImage RenderingContextOpenGL2 @@ -45,10 +47,12 @@ add_executable(ParticleTrackTrace MACOSX_BUNDLE main.cpp layers/LGlyphLayer.h Program.cpp Program.h - commands/TimerCallbackCommand.h - commands/TimerCallbackCommand.cpp + commands/TimerCallbackCommand.h + commands/TimerCallbackCommand.cpp commands/SpawnPointCallback.h commands/SpawnPointCallback.cpp + commands/CameraMoveCallback.cpp + commands/CameraMoveCallback.h CartographicTransformation.cpp advection/AdvectionKernel.h advection/EulerAdvectionKernel.cpp diff --git a/particle-track-and-trace/src/CartographicTransformation.h b/particle-track-and-trace/src/CartographicTransformation.h index 3cdd2c1..e59be8d 100644 --- a/particle-track-and-trace/src/CartographicTransformation.h +++ b/particle-track-and-trace/src/CartographicTransformation.h @@ -1,10 +1,11 @@ +#ifndef NORMALISEDCARTOGRAPHICCAMERA_H +#define NORMALISEDCARTOGRAPHICCAMERA_H + +#include #include #include #include "advection/UVGrid.h" -#ifndef NORMALISEDCARTOGRAPHICCAMERA_H -#define NORMALISEDCARTOGRAPHICCAMERA_H - /** * Constructs a orthographically projected camera that looks at the square x,y in [-1, 1] with z = 0 and w = 1. @@ -27,5 +28,4 @@ vtkSmartPointer getCartographicTransformMatrix(const std::shared_p * @return pointer to transform filter */ vtkSmartPointer createCartographicTransformFilter(const std::shared_ptr uvGrid); - #endif //NORMALISEDCARTOGRAPHICCAMERA_H diff --git a/particle-track-and-trace/src/Program.cpp b/particle-track-and-trace/src/Program.cpp index 5f1cf3c..bae7b2c 100644 --- a/particle-track-and-trace/src/Program.cpp +++ b/particle-track-and-trace/src/Program.cpp @@ -19,7 +19,8 @@ #include "Program.h" #include "commands/TimerCallbackCommand.h" -#include "commands/SpawnPointCallback.h" +#include "CartographicTransformation.h" +#include "commands/CameraMoveCallback.h" void Program::setWinProperties() { this->win->SetWindowName("Simulation"); @@ -42,17 +43,29 @@ void Program::setupTimer(int dt) { this->interact->CreateRepeatingTimer(17); // 60 fps == 1000 / 60 == 16.7 ms per frame } +void Program::setupCameraCallback() { + auto callback = vtkSmartPointer::New(this->cam); + this->interact->AddObserver(vtkCommand::MouseWheelForwardEvent, callback); + this->interact->AddObserver(vtkCommand::MouseWheelBackwardEvent, callback); + this->interact->AddObserver(vtkCommand::KeyPressEvent, callback); +} + + Program::Program(int timerDT) { this->win = vtkSmartPointer::New(); this->interact = vtkSmartPointer::New(); + this->cam = createNormalisedCamera(); this->win->SetNumberOfLayers(0); setWinProperties(); setupTimer(timerDT); + setupCameraCallback(); } void Program::addLayer(Layer *layer) { + layer->setCamera(this->cam); + this->layers.push_back(layer); this->win->AddRenderer(layer->getLayer()); this->win->SetNumberOfLayers(this->win->GetNumberOfLayers() + 1); @@ -68,6 +81,7 @@ void Program::removeLayer(Layer *layer) { } } + void Program::updateData(int t) { win->Render(); for (Layer *l: layers) { diff --git a/particle-track-and-trace/src/Program.h b/particle-track-and-trace/src/Program.h index fbe5023..5009957 100644 --- a/particle-track-and-trace/src/Program.h +++ b/particle-track-and-trace/src/Program.h @@ -6,7 +6,6 @@ #include #include "layers/Layer.h" -#include "commands/SpawnPointCallback.h" /** This class manages the upper levels of the vtk pipeline; it has attributes for the vtkrenderWindow and a vector of Layers to represent a variable number of vtkRenderers. * It can also set up a vtkTimer by connecting an instance of TimerCallbackCommand with its contained vtkRenderWindowInteractor. @@ -25,6 +24,11 @@ private: */ vtkSmartPointer interact; + + /** The camera used by all layers for this program. + */ + vtkSmartPointer cam; + /** This function sets some default properties on the vtkRenderWindow. Extracted to its' own function to keep the constructor from becoming cluttered. */ void setWinProperties(); @@ -33,8 +37,14 @@ private: */ void setupTimer(int dt); + /** This function adds all interactors of each layer to the interactor/window + */ void setupInteractions(); + /** This function sets up the camera's associated movement callbacks.. + */ + void setupCameraCallback(); + public: /** Constructor. */ diff --git a/particle-track-and-trace/src/advection/EulerAdvectionKernel.h b/particle-track-and-trace/src/advection/EulerAdvectionKernel.h index 92465f2..a098a06 100644 --- a/particle-track-and-trace/src/advection/EulerAdvectionKernel.h +++ b/particle-track-and-trace/src/advection/EulerAdvectionKernel.h @@ -3,6 +3,7 @@ #include "AdvectionKernel.h" #include "UVGrid.h" +#include /** * Implementation of AdvectionKernel. diff --git a/particle-track-and-trace/src/advection/RK4AdvectionKernel.h b/particle-track-and-trace/src/advection/RK4AdvectionKernel.h index 942bec7..94668ce 100644 --- a/particle-track-and-trace/src/advection/RK4AdvectionKernel.h +++ b/particle-track-and-trace/src/advection/RK4AdvectionKernel.h @@ -3,6 +3,7 @@ #include "AdvectionKernel.h" #include "UVGrid.h" +#include /** * Implementation of Advection kernel using RK4 integration diff --git a/particle-track-and-trace/src/commands/CameraMoveCallback.cpp b/particle-track-and-trace/src/commands/CameraMoveCallback.cpp new file mode 100644 index 0000000..57ff2b0 --- /dev/null +++ b/particle-track-and-trace/src/commands/CameraMoveCallback.cpp @@ -0,0 +1,104 @@ +#include "CameraMoveCallback.h" + +#include +#include +#include +#include +#include +#include + +using std::string; + +void CameraMoveCallback::Execute(vtkObject *caller, unsigned long evId, + void *callData) { + // Note the use of reinterpret_cast to cast the caller to the expected type. + auto intr = reinterpret_cast(caller); + + switch (evId) { + case vtkCommand::KeyPressEvent: + if (not strcmp("minus", intr->GetKeySym())) { + zoom(false); + } else if (not strcmp("equal", intr->GetKeySym())) { + zoom(true); + } else { + pan(intr->GetKeySym()); + } + break; + case vtkCommand::MouseWheelForwardEvent: + zoom(true); + break; + case vtkCommand::MouseWheelBackwardEvent: + zoom(false); + break; + default: + break; + } + + // also calls the render function when the camera's position has not actually changed. This is a negligble inefficiency. + intr->GetRenderWindow()->Render(); +} + + +void CameraMoveCallback::clampCamera(double pos[3]) { + double scale = this->cam->GetParallelScale(); + + // only check the x,y coords of the camera; we don't care about z + for (int i=0; i < 2; i++) { + //boundary cond: scale+|pos| < 1. + if (abs(pos[i])+scale > 1.01) { + if (pos[i] >= 0) { + pos[i] = 1 - scale; + } else { + pos[i] = scale - 1; + } + } + } + + this->cam->SetPosition(pos); + this->cam->SetFocalPoint(pos[0], pos[1], 0); +} + +void CameraMoveCallback::zoom(const bool in) { + double scale = this->cam->GetParallelScale(); + + if (in) { + if (scale >= 0.2) + scale -= 0.1; + } else { + if (scale <= 0.9) + scale += 0.1; + } + + this->cam->SetParallelScale(scale); + clampCamera(this->cam->GetPosition()); +} + +// we use the interactor's getKeySym instead of getKeyCode because getKeyCode is platform-dependent. +void CameraMoveCallback::pan(const string dir) { + double pos[3]; + this->cam->GetPosition(pos); + + if (dir == "Left" or dir == "h") { + pos[0] -= 0.1; + } else if (dir == "Up" or dir == "k" ) { + pos[1] += 0.1; + } else if (dir == "Right" or dir == "l" ) { + pos[0] += 0.1; + } else if (dir == "Down" or dir == "j" ) { + pos[1] -= 0.1; + } + + clampCamera(pos); +} + +CameraMoveCallback::CameraMoveCallback() : cam(nullptr) {} + +CameraMoveCallback *CameraMoveCallback::New(vtkCamera *cam) { + auto me = new CameraMoveCallback; + me->setCam(cam); + return me; +} + +void CameraMoveCallback::setCam(const vtkSmartPointer &cam) { + this->cam = cam; +} diff --git a/particle-track-and-trace/src/commands/CameraMoveCallback.h b/particle-track-and-trace/src/commands/CameraMoveCallback.h new file mode 100644 index 0000000..5a6e519 --- /dev/null +++ b/particle-track-and-trace/src/commands/CameraMoveCallback.h @@ -0,0 +1,56 @@ +#ifndef CAMERAMOVECALLBACK_H +#define CAMERAMOVECALLBACK_H + + +#include +#include +#include +#include + +class CameraMoveCallback : public vtkCallbackCommand { + +public: + /** Create new instance using the vtk New template. + */ + static CameraMoveCallback *New(vtkCamera *cam); + + /** Constructor. + */ + CameraMoveCallback(); + + /** Sets the camera to operate on. + */ + void setCam(const vtkSmartPointer &cam); + +private: + /** The camera to operate on. + */ + vtkSmartPointer cam; + + /** Event callback. Should be subscribed to keyPressEvent and MouseWheelForward/MouseWheelBackward events. + */ + void Execute(vtkObject *caller, unsigned long evId, void *callData) override; + + /** Zooms the camera in or out. + * @param in : whether to zoom in or out. + */ + void zoom(const bool in); + + /** Pans the camera in a direction, determined by the parameter. + * 'h' and 'left' : pan left + * 'j' and 'up' : pan up + * 'k' and 'down' : pan down + * 'l' and 'right' : pan right + * @param dir : string of the pressed keycode. + */ + void pan(const std::string dir); + + /** Edits the camera such that it only ever renders within the [-1,1] normalised coordinate field. + * Does so by making sure that the position of the camera (on the x,y axes), combined with the parallel scale, is never > 1. + * @param pos : pointer to new desired camera position. This will be changed if it would cause points outside [-1,1] to be displayed. + */ + void clampCamera(double *pos); +}; + + +#endif diff --git a/particle-track-and-trace/src/commands/SpawnPointCallback.cpp b/particle-track-and-trace/src/commands/SpawnPointCallback.cpp index 21a0bcb..3253e23 100644 --- a/particle-track-and-trace/src/commands/SpawnPointCallback.cpp +++ b/particle-track-and-trace/src/commands/SpawnPointCallback.cpp @@ -17,40 +17,40 @@ void convertDisplayToWorld(vtkRenderer *renderer, int x, int y, double *worldPos } void SpawnPointCallback::Execute(vtkObject *caller, unsigned long evId, void *callData) { - // Note the use of reinterpret_cast to cast the caller to the expected type. - auto interactor = reinterpret_cast(caller); + // Note the use of reinterpret_cast to cast the caller to the expected type. + auto interactor = reinterpret_cast(caller); - if (evId == vtkCommand::LeftButtonPressEvent) { - dragging = true; - } - if (evId == vtkCommand::LeftButtonReleaseEvent) { - dragging = false; - } - if (!dragging) { - return; - } + if (evId == vtkCommand::LeftButtonPressEvent) { + dragging = true; + } + if (evId == vtkCommand::LeftButtonReleaseEvent) { + dragging = false; + } + if (!dragging) { + return; + } - int x, y; - interactor->GetEventPosition(x, y); + int x, y; + interactor->GetEventPosition(x, y); - double worldPos[4] = {2, 0, 0, 0}; - double displayPos[3] = {static_cast(x), static_cast(y), 0.0}; - ren->SetDisplayPoint(displayPos); - ren->DisplayToWorld(); - ren->GetWorldPoint(worldPos); - inverseCartographicProjection->MultiplyPoint(worldPos, worldPos); - cout << "clicked on lon = " << worldPos[0] << " and lat = " << worldPos[1] << endl; + double worldPos[4] = {2, 0 ,0, 0}; + double displayPos[3] = {static_cast(x), static_cast(y), 0.0}; + ren->SetDisplayPoint(displayPos); + ren->DisplayToWorld(); + ren->GetWorldPoint(worldPos); + inverseCartographicProjection->MultiplyPoint(worldPos, worldPos); + // cout << "clicked on lon = " << worldPos[0] << " and lat = " << worldPos[1] << endl; - vtkIdType id = points->InsertNextPoint(worldPos[0], worldPos[1], 0); - data->SetPoints(points); + vtkIdType id = points->InsertNextPoint(worldPos[0], worldPos[1], 0); + data->SetPoints(points); - vtkSmartPointer vertex = vtkSmartPointer::New(); - vertex->GetPointIds()->SetId(0, id); + vtkSmartPointer vertex = vtkSmartPointer::New(); + vertex->GetPointIds()->SetId(0, id); - vtkSmartPointer vertices = vtkSmartPointer::New(); - vertices->InsertNextCell(vertex); - data->SetVerts(vertices); - ren->GetRenderWindow()->Render(); + vtkSmartPointer vertices = vtkSmartPointer::New(); + vertices->InsertNextCell(vertex); + data->SetVerts(vertices); + ren->GetRenderWindow()->Render(); } diff --git a/particle-track-and-trace/src/commands/SpawnPointCallback.h b/particle-track-and-trace/src/commands/SpawnPointCallback.h index cf50a26..b7f7682 100644 --- a/particle-track-and-trace/src/commands/SpawnPointCallback.h +++ b/particle-track-and-trace/src/commands/SpawnPointCallback.h @@ -2,6 +2,7 @@ #define SPAWNPOINTCALLBACK_H +#include #include #include #include diff --git a/particle-track-and-trace/src/commands/TimerCallbackCommand.cpp b/particle-track-and-trace/src/commands/TimerCallbackCommand.cpp index 6fad2ca..86c9c6b 100644 --- a/particle-track-and-trace/src/commands/TimerCallbackCommand.cpp +++ b/particle-track-and-trace/src/commands/TimerCallbackCommand.cpp @@ -2,12 +2,13 @@ #include "../Program.h" +// TODO: add getter/setters to attributes for customizability. TimerCallbackCommand::TimerCallbackCommand() : dt(3600), maxTime(3600*24*365), time(0) {} TimerCallbackCommand* TimerCallbackCommand::New(Program *program) { TimerCallbackCommand *cb = new TimerCallbackCommand(); cb->setProgram(program); - cb->setPaused(false); + cb->setPaused(true); return cb; } @@ -17,19 +18,17 @@ void TimerCallbackCommand::Execute(vtkObject* caller, unsigned long eventId, voi if (eventId == vtkCommand::KeyPressEvent and not strcmp("space", intr->GetKeySym())) { this->paused = ! this->paused; } else if (eventId == vtkCommand::TimerEvent and not this->paused) { - this->time += this->dt; - - if (this->time >= this->maxTime) { - return; - // TODO: how do we deal with reaching the end of the simulated dataset? Do we just stop simulating, loop back around? What about the location of the particles in this case? Just some ideas to consider, but we should iron this out pretty soon. + this->time += this->dt; + + if (this->time >= this->maxTime) { + return; + // TODO: how do we deal with reaching the end of the simulated dataset? Do we just stop simulating, loop back around? What about the location of the particles in this case? Just some ideas to consider, but we should iron this out pretty soon. + } + + this->program->updateData(this->time); } - - this->program->updateData(this->time); - } - } - void TimerCallbackCommand::setProgram(Program *program) { this->program = program; } diff --git a/particle-track-and-trace/src/layers/BackgroundImage.cpp b/particle-track-and-trace/src/layers/BackgroundImage.cpp index 780eaae..b20a14a 100644 --- a/particle-track-and-trace/src/layers/BackgroundImage.cpp +++ b/particle-track-and-trace/src/layers/BackgroundImage.cpp @@ -1,8 +1,17 @@ #include "BackgroundImage.h" +#include +#include +#include #include #include #include +#include #include +#include +#include +#include +#include +#include using std::string; @@ -14,41 +23,61 @@ BackgroundImage::BackgroundImage(string imagePath) : imagePath(imagePath) { } -void BackgroundImage::updateImage() { - vtkSmartPointer imageData; +vtkSmartPointer BackgroundImage::getMatrix(const double x0, const double y0, const int xMax, const int yMax) { + double eyeTransform[] = { + 2/(xMax-x0), 0, 0, -(xMax+x0)/(xMax-x0), + 0, 2/(yMax-y0), 0, -(yMax+y0)/(yMax-y0), + 0, 0, 1, 0, + 0, 0, 0, 1 + }; + auto matrix = vtkSmartPointer::New(); + matrix->DeepCopy(eyeTransform); + return matrix; +} + +void BackgroundImage::updateImage() { + + // read image data 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); + // translate image such that the middle is at (0,0) + vtkNew imageCenterer; + imageCenterer->SetInputConnection(imageReader->GetOutputPort()); + imageCenterer->CenterImageOn(); + imageCenterer->Update(); - 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]; + // get some info from the data we'll need in a second + vtkSmartPointer imageData = imageCenterer->GetOutput(); + double origin[3]; int extent[6]; imageData->GetOrigin(origin); - imageData->GetSpacing(spacing); imageData->GetExtent(extent); - vtkCamera *camera = this->ren->GetActiveCamera(); - camera->ParallelProjectionOn(); + // map the imageData to a vtkPolydata so we can use a vtkTransform + vtkNew imageDataGeometryFilter; + imageDataGeometryFilter->SetInputData(imageData); + imageDataGeometryFilter->Update(); - 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); + // setup the vtkTransform - this is where use the data from imageData we got earlier + vtkNew transform; + transform->SetMatrix(getMatrix(origin[0], origin[1], extent[1]+origin[0], extent[3]+origin[1])); + vtkSmartPointer transformFilter = vtkSmartPointer::New(); + transformFilter->SetTransform(transform); + transformFilter->SetInputConnection(imageDataGeometryFilter->GetOutputPort()); + transformFilter->Update(); + + // Create a mapper and actor + vtkNew mapper; + mapper->SetInputConnection(transformFilter->GetOutputPort()); + + vtkNew actor; + actor->SetMapper(mapper); + + this->ren->AddActor(actor); } @@ -60,3 +89,4 @@ void BackgroundImage::setImagePath(string imagePath) { this->imagePath = imagePath; updateImage(); } + diff --git a/particle-track-and-trace/src/layers/BackgroundImage.h b/particle-track-and-trace/src/layers/BackgroundImage.h index 1061189..71a0d1c 100644 --- a/particle-track-and-trace/src/layers/BackgroundImage.h +++ b/particle-track-and-trace/src/layers/BackgroundImage.h @@ -16,6 +16,15 @@ private: */ void updateImage(); + /** This function returns a 4x4matrix which maps the given square of [x0,w] x [y0,h] to the range [-1,1]. + * @param x0 : x coordinate of leftmost edge of image + * @param y0 : y coordinate of bottommost edge of image + * @param xMax : x coordinate of rightmost edge of image + * @param yMax : y coordinate of topmost edge of image + * @return a 4x4 matrix which transforms the image from its original geometry to the range [-1,1] + */ + vtkSmartPointer getMatrix(const double x0, const double y0, const int xMax, const int yMax); + public: /** Constructor. diff --git a/particle-track-and-trace/src/layers/EGlyphLayer.cpp b/particle-track-and-trace/src/layers/EGlyphLayer.cpp index 93db577..39970b7 100644 --- a/particle-track-and-trace/src/layers/EGlyphLayer.cpp +++ b/particle-track-and-trace/src/layers/EGlyphLayer.cpp @@ -41,9 +41,6 @@ void EGlyphLayer::readCoordinates() { this->direction->SetNumberOfTuples(numLats * numLons); points->Allocate(numLats * numLons); - auto camera = createNormalisedCamera(); - ren->SetActiveCamera(camera); - int i = 0; int latIndex = 0; for (double lat: uvGrid->lats) { @@ -77,11 +74,7 @@ void EGlyphLayer::readCoordinates() { glyph2D->SetVectorModeToUseVector(); glyph2D->Update(); -// vtkNew coordinate; -// coordinate->SetCoordinateSystemToWorld(); - vtkNew(mapper); - // mapper->SetTransformCoordinate(coordinate); mapper->SetInputConnection(glyph2D->GetOutputPort()); mapper->Update(); diff --git a/particle-track-and-trace/src/layers/EGlyphLayer.h b/particle-track-and-trace/src/layers/EGlyphLayer.h index 1dcc56a..7704af5 100644 --- a/particle-track-and-trace/src/layers/EGlyphLayer.h +++ b/particle-track-and-trace/src/layers/EGlyphLayer.h @@ -2,6 +2,7 @@ #define EGLYPHLAYER_H #include "Layer.h" +#include #include #include "../advection/UVGrid.h" diff --git a/particle-track-and-trace/src/layers/LGlyphLayer.cpp b/particle-track-and-trace/src/layers/LGlyphLayer.cpp index 73402b2..3a4077a 100644 --- a/particle-track-and-trace/src/layers/LGlyphLayer.cpp +++ b/particle-track-and-trace/src/layers/LGlyphLayer.cpp @@ -5,6 +5,7 @@ #include #include #include +#include #include #include #include @@ -41,9 +42,6 @@ LGlyphLayer::LGlyphLayer(std::shared_ptr uvGrid, std::unique_ptruvGrid = uvGrid; - auto camera = createNormalisedCamera(); - ren->SetActiveCamera(camera); - vtkSmartPointer transformFilter = createCartographicTransformFilter(uvGrid); transformFilter->SetInputData(data); @@ -61,7 +59,7 @@ LGlyphLayer::LGlyphLayer(std::shared_ptr uvGrid, std::unique_ptr mapper; mapper->SetInputConnection(glyph2D->GetOutputPort()); mapper->Update(); - + vtkNew actor; actor->SetMapper(mapper); @@ -70,11 +68,17 @@ LGlyphLayer::LGlyphLayer(std::shared_ptr uvGrid, std::unique_ptrpoints->InsertNextPoint(-4.125, 61.375, 0); - this->points->InsertNextPoint(6.532949683882039, 53.24308582564463, 0); // Coordinates of Zernike - this->points->InsertNextPoint(5.315307819255385, 60.40001057122271, 0); // Coordinates of Bergen - this->points->InsertNextPoint(6.646210231365825, 46.52346296009023, 0); // Coordinates of Lausanne - this->points->InsertNextPoint(-6.553894313570932, 62.39522131195857,0); // Coordinates of the top of the Faroe islands + this->points->InsertNextPoint(-4.125, 61.375 , 0); + // this->points->InsertNextPoint(6.532949683882039, 53.24308582564463, 0); // Coordinates of Zernike + // this->points->InsertNextPoint(5.315307819255385, 60.40001057122271, 0); // Coordinates of Bergen + // this->points->InsertNextPoint( 6.646210231365825, 46.52346296009023, 0); // Coordinates of Lausanne + // this->points->InsertNextPoint(-6.553894313570932, 62.39522131195857, 0); // Coordinates of the top of the Faroe islands + + for (int i=0; i < 330; i+=5) { + for (int j=0; j < 330; j+=5) { + this->points->InsertNextPoint(-15.875+(12.875+15.875)/330*j, 46.125+(62.625-46.125)/330*i, 0); + } + } this->points->Modified(); } diff --git a/particle-track-and-trace/src/layers/Layer.cpp b/particle-track-and-trace/src/layers/Layer.cpp index 39073b1..e7a156d 100644 --- a/particle-track-and-trace/src/layers/Layer.cpp +++ b/particle-track-and-trace/src/layers/Layer.cpp @@ -15,3 +15,8 @@ void Layer::updateData(int t) { void Layer::addObservers(vtkSmartPointer interactor) { // By default, do nothing } + + +void Layer::setCamera(vtkCamera *camera) { + this->getLayer()->SetActiveCamera(camera); +} diff --git a/particle-track-and-trace/src/layers/Layer.h b/particle-track-and-trace/src/layers/Layer.h index 5f6fc32..fd20823 100644 --- a/particle-track-and-trace/src/layers/Layer.h +++ b/particle-track-and-trace/src/layers/Layer.h @@ -27,6 +27,11 @@ public: * @param interactor : pointer to the interactor that observers can be added to. */ virtual void addObservers(vtkSmartPointer interactor); + + /** Sets the active camera for the vtkRenderer associated with this layer. + * Used to share one camera between multiple layers. + */ + virtual void setCamera(vtkCamera *camera); }; #endif diff --git a/particle-track-and-trace/src/main.cpp b/particle-track-and-trace/src/main.cpp index 1631424..49e44bb 100644 --- a/particle-track-and-trace/src/main.cpp +++ b/particle-track-and-trace/src/main.cpp @@ -21,8 +21,10 @@ using namespace std; #define DT 60 * 60 // 60 sec/min * 60 mins int main() { + cout << "reading data..." << endl; shared_ptr uvGrid = std::make_shared(); auto kernelRK4 = make_unique(uvGrid); + cout << "Starting vtk..." << endl; auto l = new LGlyphLayer(uvGrid, std::move(kernelRK4));