From 7b06a54542edcef4cb23fd809564ad03d2a0ae4e Mon Sep 17 00:00:00 2001 From: djairoh Date: Tue, 28 May 2024 19:17:39 +0200 Subject: [PATCH] feat: improved pausing simulation --- particle-track-and-trace/src/Program.cpp | 6 ++++ particle-track-and-trace/src/Program.h | 3 ++ .../src/QT/MainWindow.cpp | 34 ++++++++++++++----- particle-track-and-trace/src/QT/MainWindow.h | 5 ++- .../src/commands/TimerCallbackCommand.cpp | 4 +++ .../src/commands/TimerCallbackCommand.h | 1 + 6 files changed, 44 insertions(+), 9 deletions(-) diff --git a/particle-track-and-trace/src/Program.cpp b/particle-track-and-trace/src/Program.cpp index a0c3232..a0aaa69 100644 --- a/particle-track-and-trace/src/Program.cpp +++ b/particle-track-and-trace/src/Program.cpp @@ -1,3 +1,4 @@ +#include #include #include #include @@ -18,6 +19,7 @@ #include #include #include +#include #include "Program.h" #include "commands/TimerCallbackCommand.h" @@ -130,3 +132,7 @@ vtkSmartPointer Program::getCamera() { std::vector Program::getTechniques() { return this->techniques; } + +vtkSmartPointer Program::getInteractor() { + return this->interact; +} diff --git a/particle-track-and-trace/src/Program.h b/particle-track-and-trace/src/Program.h index fb9932a..055d045 100644 --- a/particle-track-and-trace/src/Program.h +++ b/particle-track-and-trace/src/Program.h @@ -81,6 +81,9 @@ public: std::vector getTechniques(); + + vtkSmartPointer getInteractor(); + }; #endif diff --git a/particle-track-and-trace/src/QT/MainWindow.cpp b/particle-track-and-trace/src/QT/MainWindow.cpp index ceae547..5761cee 100644 --- a/particle-track-and-trace/src/QT/MainWindow.cpp +++ b/particle-track-and-trace/src/QT/MainWindow.cpp @@ -2,24 +2,28 @@ #include "ui_mainwindow.h" #include +#include #include #include #include -#include "../layers/BackgroundImage.h" -#include "../layers/EColLayer.h" -#include "../layers/EGlyphLayer.h" -#include "../layers/LGlyphLayer.h" -#include "../layers/LColLayer.h" #include "../Program.h" #include "../advection/UVGrid.h" #include "../advection/kernel/RK4AdvectionKernel.h" #include "../advection/kernel/SnapBoundaryConditionKernel.h" +#include "../commands/TimerCallbackCommand.h" +#include "../layers/BackgroundImage.h" +#include "../layers/EColLayer.h" +#include "../layers/EGlyphLayer.h" +#include "../layers/LColLayer.h" +#include "../layers/LGlyphLayer.h" #include "../layers/enums.h" using namespace std; +#define DT 3600 + MainWindow::MainWindow(QWidget* parent) : QMainWindow(parent) , ui(new Ui::MainWindow) @@ -60,8 +64,8 @@ void MainWindow::setupTechniques() { auto kernelRK4_2 = make_unique(uvGrid); auto kernelRK4BoundaryChecked_2 = make_unique(std::move(kernelRK4_2), uvGrid); auto lCol = new LColLayer(uvGrid, std::move(kernelRK4BoundaryChecked_2)); - lGlyph->setDt(3600); - lCol->setDt(3600); + lGlyph->setDt(DT); + lCol->setDt(DT); technique1->addLayer(lGlyph); technique2->addLayer(lCol); @@ -73,10 +77,24 @@ void MainWindow::setupTechniques() { // TODO: implement feature to call this function on widget // l->spoofPoints(); - // l->cycleGlyphStyle(); + + // Setup timer + auto intr = program->getInteractor(); + this->timer = vtkSmartPointer::New(program); + this->timer->SetClientData(program); + this->timer->setDt(DT); + intr->AddObserver(vtkCommand::TimerEvent, this->timer); + intr->AddObserver(vtkCommand::KeyPressEvent, this->timer); + intr->CreateRepeatingTimer(17); // 60 fps == 1000 / 60 == 16.7 ms per frame } +void MainWindow::keyPressEvent(QKeyEvent *ev) { + if (ev->key() == Qt::Key_Space) { + this->timer->togglePaused(); + } +} + /* -------------------------------------------------------------------- * + QTWidget callbacks + * --------------------------------------------------------------------*/ diff --git a/particle-track-and-trace/src/QT/MainWindow.h b/particle-track-and-trace/src/QT/MainWindow.h index a377400..21cb135 100644 --- a/particle-track-and-trace/src/QT/MainWindow.h +++ b/particle-track-and-trace/src/QT/MainWindow.h @@ -2,7 +2,7 @@ #define MAINWINDOW_H #include -#include "../advection/UVGrid.h" +#include "../commands/TimerCallbackCommand.h" namespace Ui { class MainWindow; @@ -15,6 +15,8 @@ public: explicit MainWindow(QWidget* parent = 0); ~MainWindow(); + void keyPressEvent(QKeyEvent *ev); + private slots: void on_FirstButton_clicked(bool checked); void on_SecondButton_clicked(bool checked); @@ -33,6 +35,7 @@ private slots: private: Ui::MainWindow* ui; + vtkSmartPointer timer; void setupTechniques(); }; diff --git a/particle-track-and-trace/src/commands/TimerCallbackCommand.cpp b/particle-track-and-trace/src/commands/TimerCallbackCommand.cpp index 67ae185..8a206d0 100644 --- a/particle-track-and-trace/src/commands/TimerCallbackCommand.cpp +++ b/particle-track-and-trace/src/commands/TimerCallbackCommand.cpp @@ -28,6 +28,10 @@ void TimerCallbackCommand::Execute(vtkObject* caller, unsigned long eventId, voi } } +void TimerCallbackCommand::togglePaused() { + this->paused = !this->paused; +} + void TimerCallbackCommand::setProgram(Program *program) { this->program = program; } diff --git a/particle-track-and-trace/src/commands/TimerCallbackCommand.h b/particle-track-and-trace/src/commands/TimerCallbackCommand.h index 7123f4d..73a8e4e 100644 --- a/particle-track-and-trace/src/commands/TimerCallbackCommand.h +++ b/particle-track-and-trace/src/commands/TimerCallbackCommand.h @@ -12,6 +12,7 @@ public: void setProgram(Program *program); void setPaused(const bool val); + void togglePaused(); void setDt(int dt);