From e53a934212f0065a608fd488cf48c4851b0b725c Mon Sep 17 00:00:00 2001 From: djairoh Date: Thu, 23 May 2024 22:45:11 +0200 Subject: [PATCH] added new option to modulate brightness for LGlyphLayer --- .../src/layers/LColLayer.cpp | 0 .../src/layers/LColLayer.h | 0 .../src/layers/LGlyphLayer.cpp | 55 ++++++++++++++++--- .../src/layers/LGlyphLayer.h | 6 ++ particle-track-and-trace/src/main.cpp | 3 +- particle-track-and-trace/src/technique.cpp | 0 particle-track-and-trace/src/technique.h | 25 +++++++++ 7 files changed, 80 insertions(+), 9 deletions(-) create mode 100644 particle-track-and-trace/src/layers/LColLayer.cpp create mode 100644 particle-track-and-trace/src/layers/LColLayer.h create mode 100644 particle-track-and-trace/src/technique.cpp create mode 100644 particle-track-and-trace/src/technique.h diff --git a/particle-track-and-trace/src/layers/LColLayer.cpp b/particle-track-and-trace/src/layers/LColLayer.cpp new file mode 100644 index 0000000..e69de29 diff --git a/particle-track-and-trace/src/layers/LColLayer.h b/particle-track-and-trace/src/layers/LColLayer.h new file mode 100644 index 0000000..e69de29 diff --git a/particle-track-and-trace/src/layers/LGlyphLayer.cpp b/particle-track-and-trace/src/layers/LGlyphLayer.cpp index 5dbd57b..311a2f7 100644 --- a/particle-track-and-trace/src/layers/LGlyphLayer.cpp +++ b/particle-track-and-trace/src/layers/LGlyphLayer.cpp @@ -33,12 +33,36 @@ 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. +/** + * Build and returns a vtkLookupTable for the given number of colours in grayscale. + * @param n : number of colours to add to the SetTableRange + * @return : a vtkLookupTable with grayscale colours from [1,1,1,1] to [0.25, 0.25, 0.25, 1] in n steps. + */ +vtkSmartPointer buildLutBrightness(int n) { + vtkNew lut; + lut->SetNumberOfColors(n); + lut->SetTableRange(0, n); + lut->SetScaleToLinear(); + lut->Build(); + for (int i=0; i < n; i++) { + lut->SetTableValue(i, 1-(0.75*i/(n-1)), 1-(0.75*i/(n-1)), 1-(0.75*i/(n-1)), 1); + } + lut->UseAboveRangeColorOn(); + lut->SetAboveRangeColor(0.2, 0.2, 0.2, 1); + + // We cheat a little here: any particle with an age of -1 is out of bounds, and thus set invisible. + lut->UseBelowRangeColorOn(); + lut->SetBelowRangeColor(1,1,1,0); + + return lut; +} + /** * Build and returns a vtkLookupTable for the given number of colours in grayscale. * @param n : number of colours to add to the SetTableRange * @return : a vtkLookupTable with grayscale colours from [1,1,1,1] to [1,1,1,0.25] in n steps. */ -vtkSmartPointer buildLut(int n) { +vtkSmartPointer buildLutOpacity(int n) { vtkNew lut; lut->SetNumberOfColors(n); lut->SetTableRange(0, n); @@ -58,6 +82,9 @@ vtkSmartPointer buildLut(int n) { } LGlyphLayer::LGlyphLayer(std::shared_ptr uvGrid, std::unique_ptr advectionKernel) { + this->luts.push(buildLutOpacity(512)); + this->luts.push(buildLutBrightness(512)); + this->ren = vtkSmartPointer::New(); this->ren->SetLayer(2); @@ -94,15 +121,20 @@ LGlyphLayer::LGlyphLayer(std::shared_ptr uvGrid, std::unique_ptrSetScaleModeToDataScalingOff(); glyph2D->Update(); - vtkNew mapper; - mapper->SetInputConnection(glyph2D->GetOutputPort()); - mapper->SetColorModeToMapScalars(); - mapper->SetLookupTable(buildLut(512)); - mapper->UseLookupTableScalarRangeOn(); - mapper->Update(); + this->mapper = vtkSmartPointer::New(); + this->mapper->SetInputConnection(glyph2D->GetOutputPort()); + this->mapper->SetColorModeToMapScalars(); + + auto lut = this->luts.front(); + mapper->SetLookupTable(lut); + this->luts.pop(); + this->luts.push(lut); + + this->mapper->UseLookupTableScalarRangeOn(); + this->mapper->Update(); vtkNew actor; - actor->SetMapper(mapper); + actor->SetMapper(this->mapper); this->ren->AddActor(actor); } @@ -174,6 +206,13 @@ void LGlyphLayer::addObservers(vtkSmartPointer intera } +void LGlyphLayer::cycleGlyphStyle() { + auto lut = this->luts.front(); + this->mapper->SetLookupTable(lut); + this->luts.pop(); + this->luts.push(lut); +} + void LGlyphLayer::setDt(int dt) { this->dt = dt; } diff --git a/particle-track-and-trace/src/layers/LGlyphLayer.h b/particle-track-and-trace/src/layers/LGlyphLayer.h index 8cec151..e15d0f1 100644 --- a/particle-track-and-trace/src/layers/LGlyphLayer.h +++ b/particle-track-and-trace/src/layers/LGlyphLayer.h @@ -4,6 +4,7 @@ #include "Layer.h" #include "../advection/kernel/AdvectionKernel.h" #include "../commands/SpawnPointCallback.h" +#include #include #include @@ -16,10 +17,12 @@ private: vtkSmartPointer data; vtkSmartPointer particlesBeached; vtkSmartPointer particlesAge; + vtkSmartPointer mapper; std::unique_ptr advector; std::shared_ptr uvGrid; int dt = 3600; int beachedAtNumberOfTimes = 20; + std::queue> luts; public: /** Constructor. @@ -41,6 +44,9 @@ public: void addObservers(vtkSmartPointer interactor) override; + /** This function cycles which lut is used for the layer, according to the lookuptables in the luts attribute. + */ + void cycleGlyphStyle(); /** * Sets a custom DT value, needed for advect calls to the simulation logic. diff --git a/particle-track-and-trace/src/main.cpp b/particle-track-and-trace/src/main.cpp index 6997c65..aa69646 100644 --- a/particle-track-and-trace/src/main.cpp +++ b/particle-track-and-trace/src/main.cpp @@ -33,9 +33,10 @@ int main() { auto l = new LGlyphLayer(uvGrid, std::move(kernelRK4BoundaryChecked)); l->spoofPoints(); l->setDt(DT); + l->cycleGlyphStyle(); unique_ptr program = make_unique(DT); - program->addLayer(new BackgroundImage(dataPath + "/map_661-661.png")); + program->addLayer(new BackgroundImage(dataPath + "/map_qgis.png")); // program->addLayer(new EGlyphLayer(uvGrid)); program->addLayer(new EColLayer(uvGrid)); program->addLayer(l); diff --git a/particle-track-and-trace/src/technique.cpp b/particle-track-and-trace/src/technique.cpp new file mode 100644 index 0000000..e69de29 diff --git a/particle-track-and-trace/src/technique.h b/particle-track-and-trace/src/technique.h new file mode 100644 index 0000000..e43888a --- /dev/null +++ b/particle-track-and-trace/src/technique.h @@ -0,0 +1,25 @@ +#ifndef TECHNIQUE_H +#define TECHNIQUE_H + +#include "layers/Layer.h" +#include +class Technique { +private: + std::vector layers; + vtkSmartPointer points; + vtkSmartPointer data; + + void setupInteractions(); + +public: + Technique(); + void addLayer(Layer *l); + void removeLayer(Layer *l); + void updateData(int t); + int numberOfLayers(); + +}; + + + +#endif