Control pause and speed with keyboard
Keys: space for toggle pause, < and > for speed control, 0 to reset speed
This commit is contained in:
parent
0db091f76e
commit
0db274b099
5 changed files with 54 additions and 1 deletions
|
@ -21,6 +21,7 @@ int main(int argc, char** argv) {
|
||||||
render.add_surface(ball.get_surface(), bbox);
|
render.add_surface(ball.get_surface(), bbox);
|
||||||
|
|
||||||
render.set_idle_func(periodic_update);
|
render.set_idle_func(periodic_update);
|
||||||
|
render.add_kb_handler(periodic_kb_handler);
|
||||||
init_periodic_static(&ball);
|
init_periodic_static(&ball);
|
||||||
render.run();
|
render.run();
|
||||||
|
|
||||||
|
|
|
@ -8,6 +8,9 @@ static Ball* _ball = nullptr;
|
||||||
static std::chrono::time_point<std::chrono::steady_clock>
|
static std::chrono::time_point<std::chrono::steady_clock>
|
||||||
_last_time, _init_clocks;
|
_last_time, _init_clocks;
|
||||||
|
|
||||||
|
static bool is_paused = false;
|
||||||
|
static double speed_factor = 1.;
|
||||||
|
|
||||||
void init_periodic_static(Ball* ball) {
|
void init_periodic_static(Ball* ball) {
|
||||||
_last_time = std::chrono::steady_clock::now();
|
_last_time = std::chrono::steady_clock::now();
|
||||||
_init_clocks = std::chrono::steady_clock::now();
|
_init_clocks = std::chrono::steady_clock::now();
|
||||||
|
@ -23,9 +26,32 @@ double ellapsed_double(
|
||||||
}
|
}
|
||||||
|
|
||||||
void periodic_update() {
|
void periodic_update() {
|
||||||
|
if(is_paused)
|
||||||
|
return;
|
||||||
|
|
||||||
|
printf("%lf\n", speed_factor);
|
||||||
auto now = std::chrono::steady_clock::now();
|
auto now = std::chrono::steady_clock::now();
|
||||||
_ball->update_pos(ellapsed_double(_last_time, now));
|
_ball->update_pos(speed_factor * ellapsed_double(_last_time, now));
|
||||||
|
|
||||||
_last_time = now;
|
_last_time = now;
|
||||||
glutPostRedisplay();
|
glutPostRedisplay();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void periodic_kb_handler(unsigned char key, int, int) {
|
||||||
|
if(key == ' ') {
|
||||||
|
if(is_paused)
|
||||||
|
_last_time = std::chrono::steady_clock::now();
|
||||||
|
is_paused = !is_paused;
|
||||||
|
}
|
||||||
|
else if(key == '<') {
|
||||||
|
speed_factor -= .1;
|
||||||
|
if(speed_factor <= 0.05)
|
||||||
|
speed_factor = .1;
|
||||||
|
}
|
||||||
|
else if(key == '>') {
|
||||||
|
speed_factor += .1;
|
||||||
|
}
|
||||||
|
else if(key == '0') {
|
||||||
|
speed_factor = 1.;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -4,3 +4,5 @@
|
||||||
|
|
||||||
void init_periodic_static(Ball* ball);
|
void init_periodic_static(Ball* ball);
|
||||||
void periodic_update();
|
void periodic_update();
|
||||||
|
|
||||||
|
void periodic_kb_handler(unsigned char key, int, int);
|
||||||
|
|
|
@ -29,6 +29,7 @@ void GlutRender::init(int* argc, char** argv,
|
||||||
// ==== Callbacks ====
|
// ==== Callbacks ====
|
||||||
glutDisplayFunc(display_handle);
|
glutDisplayFunc(display_handle);
|
||||||
glutReshapeFunc(reshape_handle);
|
glutReshapeFunc(reshape_handle);
|
||||||
|
glutKeyboardFunc(kb_evt_handle);
|
||||||
|
|
||||||
// ==== Lighting ====
|
// ==== Lighting ====
|
||||||
GLfloat light0_pos[] = {10., 15., 10.};
|
GLfloat light0_pos[] = {10., 15., 10.};
|
||||||
|
@ -89,6 +90,10 @@ void GlutRender::set_idle_func(void (*func)(void)) {
|
||||||
glutIdleFunc(func);
|
glutIdleFunc(func);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void GlutRender::add_kb_handler(GlutRender::kb_handler_t handler) {
|
||||||
|
kb_handlers.push_back(handler);
|
||||||
|
}
|
||||||
|
|
||||||
void GlutRender::reshape(int wid, int hei) {
|
void GlutRender::reshape(int wid, int hei) {
|
||||||
if (hei == 0)
|
if (hei == 0)
|
||||||
hei = 1;
|
hei = 1;
|
||||||
|
@ -191,9 +196,18 @@ void GlutRender::display() {
|
||||||
glutSwapBuffers();
|
glutSwapBuffers();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void GlutRender::on_kb_evt(unsigned char key, int x, int y) {
|
||||||
|
for(auto& handler: kb_handlers) {
|
||||||
|
handler(key, x, y);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void GlutRender::reshape_handle(int wid, int hei) {
|
void GlutRender::reshape_handle(int wid, int hei) {
|
||||||
get_instance().reshape(wid, hei);
|
get_instance().reshape(wid, hei);
|
||||||
}
|
}
|
||||||
void GlutRender::display_handle() {
|
void GlutRender::display_handle() {
|
||||||
get_instance().display();
|
get_instance().display();
|
||||||
}
|
}
|
||||||
|
void GlutRender::kb_evt_handle(unsigned char key, int x, int y) {
|
||||||
|
get_instance().on_kb_evt(key, x, y);
|
||||||
|
}
|
||||||
|
|
|
@ -5,9 +5,12 @@
|
||||||
#include "../Mesh.hpp"
|
#include "../Mesh.hpp"
|
||||||
#include "../Implicit.hpp"
|
#include "../Implicit.hpp"
|
||||||
#include <set>
|
#include <set>
|
||||||
|
#include <functional>
|
||||||
|
|
||||||
class GlutRender {
|
class GlutRender {
|
||||||
public:
|
public:
|
||||||
|
typedef std::function<void(unsigned char, int, int)> kb_handler_t;
|
||||||
|
|
||||||
static GlutRender& get_instance();
|
static GlutRender& get_instance();
|
||||||
|
|
||||||
GlutRender(GlutRender const&) = delete;
|
GlutRender(GlutRender const&) = delete;
|
||||||
|
@ -24,6 +27,8 @@ class GlutRender {
|
||||||
|
|
||||||
void set_idle_func(void (*func)(void));
|
void set_idle_func(void (*func)(void));
|
||||||
|
|
||||||
|
void add_kb_handler(kb_handler_t handler);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
struct SurfaceDetails {
|
struct SurfaceDetails {
|
||||||
SurfaceDetails(ImplicitSurface* surf, const Cuboid& box):
|
SurfaceDetails(ImplicitSurface* surf, const Cuboid& box):
|
||||||
|
@ -46,13 +51,18 @@ class GlutRender {
|
||||||
protected:
|
protected:
|
||||||
void reshape(int wid, int hei);
|
void reshape(int wid, int hei);
|
||||||
void display();
|
void display();
|
||||||
|
void on_kb_evt(unsigned char key, int x, int y);
|
||||||
|
|
||||||
static void reshape_handle(int wid, int hei);
|
static void reshape_handle(int wid, int hei);
|
||||||
static void display_handle();
|
static void display_handle();
|
||||||
|
|
||||||
|
static void kb_evt_handle(unsigned char key, int x, int y);
|
||||||
|
|
||||||
private: //attr
|
private: //attr
|
||||||
std::function<double()> rand_color;
|
std::function<double()> rand_color;
|
||||||
|
|
||||||
std::set<Mesh*> meshes;
|
std::set<Mesh*> meshes;
|
||||||
std::set<SurfaceDetails> surfaces;
|
std::set<SurfaceDetails> surfaces;
|
||||||
|
|
||||||
|
std::vector<kb_handler_t> kb_handlers;
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in a new issue