From bdfa761c39218234d9ce7419b3b323e8f25a1476 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Konstantin=20Ka=CC=88fer?= Date: Fri, 14 Mar 2014 11:33:45 +0100 Subject: [PATCH] remove code duplication between osx/glfw and linux/glfw programs --- common/map_view.cpp | 236 ++++++++++++++++++++ include/llmr/platform/platform.hpp | 3 + linux/main.cpp | 333 +++++------------------------ linux/settings.cpp | 10 +- linux/settings.hpp | 8 +- macosx/main.mm | 254 ++-------------------- 6 files changed, 325 insertions(+), 519 deletions(-) create mode 100644 common/map_view.cpp diff --git a/common/map_view.cpp b/common/map_view.cpp new file mode 100644 index 00000000000..5119b3134f6 --- /dev/null +++ b/common/map_view.cpp @@ -0,0 +1,236 @@ +#include +#include +#include + +class MapView { +public: + MapView(llmr::Settings& settings, bool fullscreen = false) : + fullscreen(fullscreen), + settings(settings), + map(settings) { + } + + void init() { + if (!glfwInit()) { + fprintf(stderr, "Failed to initialize glfw\n"); + exit(1); + } + + GLFWmonitor *monitor = nullptr; + if (fullscreen) { + monitor = glfwGetPrimaryMonitor(); + } + +#ifdef GL_ES_VERSION_2_0 + glfwWindowHint(GLFW_CLIENT_API, GLFW_OPENGL_ES_API); + glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 2); + glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 0); +#endif + + glfwWindowHint(GLFW_RED_BITS, 8); + glfwWindowHint(GLFW_GREEN_BITS, 8); + glfwWindowHint(GLFW_BLUE_BITS, 8); + glfwWindowHint(GLFW_ALPHA_BITS, 8); + glfwWindowHint(GLFW_STENCIL_BITS, 8); + glfwWindowHint(GLFW_DEPTH_BITS, 16); + + window = glfwCreateWindow(1024, 768, "llmr", monitor, NULL); + if (!window) { + glfwTerminate(); + fprintf(stderr, "Failed to initialize window\n"); + exit(1); + } + + glfwSetWindowUserPointer(window, this); + glfwMakeContextCurrent(window); + + + int width, height; + glfwGetWindowSize(window, &width, &height); + int fb_width, fb_height; + glfwGetFramebufferSize(window, &fb_width, &fb_height); + + settings.load(); + map.setup((double)fb_width / width); + + resize(window, 0, 0); + + glfwSwapInterval(1); + + map.loadSettings(); + + glfwSetCursorPosCallback(window, mousemove); + glfwSetMouseButtonCallback(window, mouseclick); + glfwSetWindowSizeCallback(window, resize); + glfwSetFramebufferSizeCallback(window, resize); + glfwSetScrollCallback(window, scroll); + glfwSetCharCallback(window, character); + glfwSetKeyCallback(window, key); + } + + + static void character(GLFWwindow *window, unsigned int codepoint) { + + } + + + static void key(GLFWwindow *window, int key, int scancode, int action, int mods) { + MapView *mapView = (MapView *)glfwGetWindowUserPointer(window); + + if (action == GLFW_RELEASE) { + switch (key) { + case GLFW_KEY_ESCAPE: + glfwSetWindowShouldClose(window, true); + break; + case GLFW_KEY_TAB: + mapView->map.toggleDebug(); + break; + case GLFW_KEY_R: + if (!mods) mapView->map.resetPosition(); + break; + case GLFW_KEY_N: + if (!mods) mapView->map.resetNorth(); + break; + } + } + } + + + static void scroll(GLFWwindow *window, double xoffset, double yoffset) { + MapView *mapView = (MapView *)glfwGetWindowUserPointer(window); + double delta = yoffset * 40; + + bool is_wheel = delta != 0 && fmod(delta, 4.000244140625) == 0; + + double absdelta = delta < 0 ? -delta : delta; + double scale = 2.0 / (1.0 + exp(-absdelta / 100.0)); + + // Make the scroll wheel a bit slower. + if (!is_wheel) { + scale = (scale - 1.0) / 2.0 + 1.0; + } + + // Zooming out. + if (delta < 0 && scale != 0) { + scale = 1.0 / scale; + } + + mapView->map.startScaling(); + mapView->map.scaleBy(scale, mapView->last_x, mapView->last_y); + } + + static void resize(GLFWwindow *window, int, int) { + MapView *mapView = (MapView *)glfwGetWindowUserPointer(window); + + int width, height; + glfwGetWindowSize(window, &width, &height); + int fb_width, fb_height; + glfwGetFramebufferSize(window, &fb_width, &fb_height); + + mapView->map.resize(width, height, fb_width, fb_height); + } + + static void mouseclick(GLFWwindow *window, int button, int action, int modifiers) { + MapView *mapView = (MapView *)glfwGetWindowUserPointer(window); + + if (button == GLFW_MOUSE_BUTTON_RIGHT || (button == GLFW_MOUSE_BUTTON_LEFT && modifiers & GLFW_MOD_CONTROL)) { + mapView->rotating = action == GLFW_PRESS; + if (mapView->rotating) { + mapView->start_x = mapView->last_x; + mapView->start_y = mapView->last_y; + } else { + mapView->map.stopRotating(); + } + } else if (button == GLFW_MOUSE_BUTTON_LEFT) { + mapView->tracking = action == GLFW_PRESS; + + if (action == GLFW_RELEASE) { + mapView->map.stopPanning(); + double now = glfwGetTime(); + if (now - mapView->last_click < 0.4) { + mapView->map.scaleBy(2.0, mapView->last_x, mapView->last_y); + } + mapView->last_click = now; + } + } + } + + static void mousemove(GLFWwindow *window, double x, double y) { + MapView *mapView = (MapView *)glfwGetWindowUserPointer(window); + if (mapView->tracking) { + double dx = x - mapView->last_x; + double dy = y - mapView->last_y; + if (dx || dy) { + mapView->map.startPanning(); + mapView->map.moveBy(dx, dy); + } + } else if (mapView->rotating) { + mapView->map.startRotating(); + mapView->map.rotateBy(mapView->start_x, mapView->start_y, mapView->last_x, mapView->last_y, x, y); + } + mapView->last_x = x; + mapView->last_y = y; + } + + int run() { + while (!glfwWindowShouldClose(window)) { + llmr::platform::cleanup(); + + if (dirty) { + try { + dirty = render(); + } catch (std::exception& ex) { + fprintf(stderr, "exception: %s\n", ex.what()); + } + glfwSwapBuffers(window); + fps(); + } + + if (dirty) { + glfwPollEvents(); + } else { + glfwWaitEvents(); + } + } + + return 0; + } + + bool render() { + return map.render(); + } + + void fps() { + static int frames = 0; + static double time_elapsed = 0; + + frames++; + double current_time = glfwGetTime(); + + if (current_time - time_elapsed >= 1) { + fprintf(stderr, "FPS: %4.2f\n", frames / (current_time - time_elapsed)); + time_elapsed = current_time; + frames = 0; + } + } + + ~MapView() { + glfwTerminate(); + } + +public: + bool fullscreen = false; + + bool dirty = true; + double last_x = 0, last_y = 0; + bool tracking = false; + + double start_x = 0, start_y = 0; + bool rotating = false; + + double last_click = -1; + + GLFWwindow *window = nullptr; + llmr::Settings& settings; + llmr::Map map; +}; diff --git a/include/llmr/platform/platform.hpp b/include/llmr/platform/platform.hpp index f46da3c1908..806c69f8d20 100644 --- a/include/llmr/platform/platform.hpp +++ b/include/llmr/platform/platform.hpp @@ -31,6 +31,9 @@ void cancel_request_http(Request *request); // Returns a relative timestamp in seconds. This value must be monotonic. double time(); +// Performs routine cleanup operation and is called on every loop iteration. +void cleanup(); + } } diff --git a/linux/main.cpp b/linux/main.cpp index ade6c5e52f1..9e2c2400183 100644 --- a/linux/main.cpp +++ b/linux/main.cpp @@ -1,266 +1,95 @@ #include -#include #include #include #include +#include "../common/map_view.cpp" #include "settings.hpp" #include "request.hpp" -std::forward_list requests; - -static int fullscreen_flag = 0; - -class MapView { -public: - MapView() : - dirty(true), - tracking(false), - rotating(false), - last_click(-1), - settings(), - map(settings) { - } - - void init() { - if (!glfwInit()) { - fprintf(stderr, "Failed to initialize glfw\n"); - exit(1); - } - - GLFWmonitor *monitor = nullptr; - -#ifdef GL_ES_VERSION_2_0 - if (fullscreen_flag) { - monitor = glfwGetPrimaryMonitor(); - } - glfwWindowHint(GLFW_CLIENT_API, GLFW_OPENGL_ES_API); - glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 2); - glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 0); -#endif - - glfwWindowHint(GLFW_RED_BITS, 8); - glfwWindowHint(GLFW_GREEN_BITS, 8); - glfwWindowHint(GLFW_BLUE_BITS, 8); - glfwWindowHint(GLFW_ALPHA_BITS, 8); - glfwWindowHint(GLFW_STENCIL_BITS, 8); - glfwWindowHint(GLFW_DEPTH_BITS, 16); - - window = glfwCreateWindow(1024, 768, "llmr", monitor, NULL); - if (!window) { - glfwTerminate(); - fprintf(stderr, "Failed to initialize window\n"); - exit(1); - } - - glfwSetWindowUserPointer(window, this); - glfwMakeContextCurrent(window); - - int width, height; - glfwGetWindowSize(window, &width, &height); - int fb_width, fb_height; - glfwGetFramebufferSize(window, &fb_width, &fb_height); - - settings.load(); - map.setup((double)fb_width / width); - - resize(window, 0, 0); - - map.loadSettings(); - - glfwSetCursorPosCallback(window, mousemove); - glfwSetMouseButtonCallback(window, mouseclick); - glfwSetWindowSizeCallback(window, resize); - glfwSetFramebufferSizeCallback(window, resize); - glfwSetScrollCallback(window, scroll); - glfwSetCharCallback(window, character); - glfwSetKeyCallback(window, key); - } - - static void character(GLFWwindow *window, unsigned int codepoint) { - - } - - - static void key(GLFWwindow *window, int key, int scancode, int action, int mods) { - MapView *mapView = (MapView *)glfwGetWindowUserPointer(window); - - if (action == GLFW_RELEASE) { - switch (key) { - case GLFW_KEY_ESCAPE: - glfwSetWindowShouldClose(window, true); - break; - case GLFW_KEY_TAB: - mapView->map.toggleDebug(); - break; - case GLFW_KEY_R: - if (!mods) mapView->map.resetPosition(); - break; - case GLFW_KEY_N: - if (!mods) mapView->map.resetNorth(); - break; - } - } - } - - - static void scroll(GLFWwindow *window, double xoffset, double yoffset) { - MapView *mapView = (MapView *)glfwGetWindowUserPointer(window); - double delta = yoffset * 40; +MapView *mapView = nullptr; +std::forward_list requests; - bool is_wheel = delta != 0 && fmod(delta, 4.000244140625) == 0; - double absdelta = delta < 0 ? -delta : delta; - double scale = 2.0 / (1.0 + exp(-absdelta / 100.0)); - // Make the scroll wheel a bit slower. - if (!is_wheel) { - scale = (scale - 1.0) / 2.0 + 1.0; - } - // Zooming out. - if (delta < 0 && scale != 0) { - scale = 1.0 / scale; - } - - mapView->map.startScaling(); - mapView->map.scaleBy(scale, mapView->last_x, mapView->last_y); +void quit_handler(int s) { + if (mapView) { + fprintf(stderr, "waiting for quit...\n"); + glfwSetWindowShouldClose(mapView->window, true); + llmr::platform::restart(); + } else { + exit(0); } +} - static void resize(GLFWwindow *window, int, int) { - MapView *mapView = (MapView *)glfwGetWindowUserPointer(window); - - int width, height; - glfwGetWindowSize(window, &width, &height); - int fb_width, fb_height; - glfwGetFramebufferSize(window, &fb_width, &fb_height); - fprintf(stderr, "window size: %d/%d\n", width, height); - mapView->map.resize(width, height, fb_width, fb_height); - } - static void mouseclick(GLFWwindow *window, int button, int action, int modifiers) { - MapView *mapView = (MapView *)glfwGetWindowUserPointer(window); - - if (button == GLFW_MOUSE_BUTTON_RIGHT || (button == GLFW_MOUSE_BUTTON_LEFT && modifiers & GLFW_MOD_CONTROL)) { - mapView->rotating = action == GLFW_PRESS; - if (mapView->rotating) { - mapView->start_x = mapView->last_x; - mapView->start_y = mapView->last_y; - } else { - mapView->map.stopRotating(); - } - } else if (button == GLFW_MOUSE_BUTTON_LEFT) { - mapView->tracking = action == GLFW_PRESS; - - if (action == GLFW_RELEASE) { - mapView->map.stopPanning(); - double now = glfwGetTime(); - if (now - mapView->last_click < 0.4) { - mapView->map.scaleBy(2.0, mapView->last_x, mapView->last_y); - } - mapView->last_click = now; - } - } - } - static void mousemove(GLFWwindow *window, double x, double y) { - MapView *mapView = (MapView *)glfwGetWindowUserPointer(window); - if (mapView->tracking) { - double dx = x - mapView->last_x; - double dy = y - mapView->last_y; - if (dx || dy) { - mapView->map.startPanning(); - mapView->map.moveBy(dx, dy); - } - } else if (mapView->rotating) { - mapView->map.startRotating(); - mapView->map.rotateBy(mapView->start_x, mapView->start_y, mapView->last_x, mapView->last_y, x, y); - } - mapView->last_x = x; - mapView->last_y = y; - } +int main(int argc, char *argv[]) { + int fullscreen_flag = 0; - int run() { - while (!glfwWindowShouldClose(window)) { - bool& dirty = this->dirty; - requests.remove_if([&dirty](llmr::platform::Request * req) { - if (req->done) { - req->foreground_callback(); - delete req; - dirty = true; - return true; - } else { - return false; - } - }); - - if (dirty) { - try { - dirty = render(); - } catch (std::exception& ex) { - fprintf(stderr, "exception: %s\n", ex.what()); - } - glfwSwapBuffers(window); - fps(); - } - - if (!requests.empty() || dirty) { - glfwPollEvents(); - } else { - glfwWaitEvents(); - } - } + const struct option long_options[] = { + {"fullscreen", no_argument, &fullscreen_flag, 1}, + {0, 0, 0, 0} + }; - return 0; - } - - bool render() { - return map.render(); + while (true) { + int option_index = 0; + int c = getopt_long(argc, argv, "f", long_options, &option_index); + if (c == -1) break; } - void fps() { - static int frames = 0; - static double time_elapsed = 0; + // sigint handling + struct sigaction sigIntHandler; + sigIntHandler.sa_handler = quit_handler; + sigemptyset(&sigIntHandler.sa_mask); + sigIntHandler.sa_flags = 0; + sigaction(SIGINT, &sigIntHandler, NULL); - frames++; - double current_time = glfwGetTime(); - if (current_time - time_elapsed >= 1) { - fprintf(stderr, "FPS: %4.2f\n", frames / (current_time - time_elapsed)); - time_elapsed = current_time; - frames = 0; - } - } + // curl init + curl_global_init(CURL_GLOBAL_ALL); - ~MapView() { - glfwTerminate(); - } + llmr::platform::Request::initialize(); -public: - bool dirty; - double last_x, last_y; - bool tracking; - double start_x, start_y; - bool rotating; + // main loop + llmr::Settings_JSON settings; + mapView = new MapView(settings, fullscreen_flag); + mapView->init(); + int ret = mapView->run(); + mapView->settings.sync(); + delete mapView; - double last_click; - GLFWwindow *window; - llmr::Settings_MacOSX settings; - llmr::Map map; -}; + llmr::platform::Request::finish(); -MapView *mapView = nullptr; + curl_global_cleanup(); + return ret; +} namespace llmr { namespace platform { +void cleanup() { + bool& dirty = mapView->dirty; + requests.remove_if([&dirty](llmr::platform::Request * req) { + if (req->done) { + req->foreground_callback(); + delete req; + dirty = true; + return true; + } else { + return false; + } + }); +} + void restart() { if (mapView) { mapView->dirty = true; @@ -287,55 +116,3 @@ double time() { } } - -void quit_handler(int s) { - if (mapView) { - fprintf(stderr, "waiting for quit...\n"); - glfwSetWindowShouldClose(mapView->window, true); - llmr::platform::restart(); - } else { - exit(0); - } -} - - - -static struct option long_options[] = { - {"fullscreen", no_argument, &fullscreen_flag, 1}, - {0, 0, 0, 0} -}; - -int main(int argc, char *argv[]) { - while (true) { - int option_index = 0; - int c = getopt_long(argc, argv, "f", long_options, &option_index); - if (c == -1) break; - } - - // sigint handling - struct sigaction sigIntHandler; - sigIntHandler.sa_handler = quit_handler; - sigemptyset(&sigIntHandler.sa_mask); - sigIntHandler.sa_flags = 0; - sigaction(SIGINT, &sigIntHandler, NULL); - - - // curl init - curl_global_init(CURL_GLOBAL_ALL); - - llmr::platform::Request::initialize(); - - - // main loop - mapView = new MapView(); - mapView->init(); - int ret = mapView->run(); - mapView->settings.sync(); - delete mapView; - - - llmr::platform::Request::finish(); - - curl_global_cleanup(); - return ret; -} diff --git a/linux/settings.cpp b/linux/settings.cpp index 1b4d8a73674..73df446f6aa 100644 --- a/linux/settings.cpp +++ b/linux/settings.cpp @@ -6,11 +6,11 @@ using namespace llmr; -Settings_MacOSX::Settings_MacOSX() +Settings_JSON::Settings_JSON() { } -void Settings_MacOSX::load() +void Settings_JSON::load() { FILE *settingsFile = fopen("/tmp/llmr-native.json", "r"); if (settingsFile != NULL) { @@ -27,11 +27,11 @@ void Settings_MacOSX::load() } } -void Settings_MacOSX::persist() +void Settings_JSON::persist() { } -void Settings_MacOSX::sync() +void Settings_JSON::sync() { rapidjson::FileStream s(fopen("/tmp/llmr-native.json", "w")); @@ -45,7 +45,7 @@ void Settings_MacOSX::sync() writer.EndArray(); } -void Settings_MacOSX::clear() +void Settings_JSON::clear() { longitude = 0; latitude = 0; diff --git a/linux/settings.hpp b/linux/settings.hpp index e507c6bd172..a171e8ab8fe 100644 --- a/linux/settings.hpp +++ b/linux/settings.hpp @@ -1,13 +1,13 @@ -#ifndef LLMR_MACOSX_SETTINGS -#define LLMR_MACOSX_SETTINGS +#ifndef LLMR_JSON_SETTINGS +#define LLMR_JSON_SETTINGS #include namespace llmr { -class Settings_MacOSX : public Settings { +class Settings_JSON : public Settings { public: - Settings_MacOSX(); + Settings_JSON(); virtual void load(); virtual void persist(); virtual void sync(); diff --git a/macosx/main.mm b/macosx/main.mm index 8e9ec099a24..48d8aee638d 100644 --- a/macosx/main.mm +++ b/macosx/main.mm @@ -1,242 +1,41 @@ -#include -#include #import #import -#include -#include + #include "settings.hpp" +#include "../common/map_view.cpp" #include #include -class MapView { -public: - MapView() : - dirty(true), - tracking(false), - rotating(false), - last_click(-1), - settings(), - map(settings) { - } - - void init() { - if (!glfwInit()) { - fprintf(stderr, "Failed to initialize glfw\n"); - exit(1); - } - - glfwWindowHint(GLFW_STENCIL_BITS, 8); - glfwWindowHint(GLFW_DEPTH_BITS, 16); - - window = glfwCreateWindow(1024, 768, "llmr", NULL, NULL); - if (!window) { - glfwTerminate(); - fprintf(stderr, "Failed to initialize window\n"); - exit(1); - } - - glfwSetWindowUserPointer(window, this); - glfwMakeContextCurrent(window); - - - int width, height; - glfwGetWindowSize(window, &width, &height); - int fb_width, fb_height; - glfwGetFramebufferSize(window, &fb_width, &fb_height); - - settings.load(); - map.setup((double)fb_width / width); - - resize(window, 0, 0); - - glfwSwapInterval(1); - - map.loadSettings(); - - glfwSetCursorPosCallback(window, mousemove); - glfwSetMouseButtonCallback(window, mouseclick); - glfwSetWindowSizeCallback(window, resize); - glfwSetFramebufferSizeCallback(window, resize); - glfwSetScrollCallback(window, scroll); - glfwSetCharCallback(window, character); - glfwSetKeyCallback(window, key); - } - - - static void character(GLFWwindow *window, unsigned int codepoint) { - - } - - - static void key(GLFWwindow *window, int key, int scancode, int action, int mods) { - MapView *mapView = (MapView *)glfwGetWindowUserPointer(window); - - if (action == GLFW_RELEASE) { - switch (key) { - case GLFW_KEY_ESCAPE: - glfwSetWindowShouldClose(window, true); - break; - case GLFW_KEY_TAB: - mapView->map.toggleDebug(); - break; - case GLFW_KEY_R: - if (!mods) mapView->map.resetPosition(); - break; - case GLFW_KEY_N: - if (!mods) mapView->map.resetNorth(); - break; - } - } - } - - - static void scroll(GLFWwindow *window, double xoffset, double yoffset) { - MapView *mapView = (MapView *)glfwGetWindowUserPointer(window); - double delta = yoffset * 40; - - bool is_wheel = delta != 0 && fmod(delta, 4.000244140625) == 0; - - double absdelta = delta < 0 ? -delta : delta; - double scale = 2.0 / (1.0 + exp(-absdelta / 100.0)); - - // Make the scroll wheel a bit slower. - if (!is_wheel) { - scale = (scale - 1.0) / 2.0 + 1.0; - } - - // Zooming out. - if (delta < 0 && scale != 0) { - scale = 1.0 / scale; - } - - mapView->map.startScaling(); - mapView->map.scaleBy(scale, mapView->last_x, mapView->last_y); - } - - static void resize(GLFWwindow *window, int, int) { - MapView *mapView = (MapView *)glfwGetWindowUserPointer(window); - - int width, height; - glfwGetWindowSize(window, &width, &height); - int fb_width, fb_height; - glfwGetFramebufferSize(window, &fb_width, &fb_height); - - mapView->map.resize(width, height, fb_width, fb_height); - } - - static void mouseclick(GLFWwindow *window, int button, int action, int modifiers) { - MapView *mapView = (MapView *)glfwGetWindowUserPointer(window); - - if (button == GLFW_MOUSE_BUTTON_RIGHT || (button == GLFW_MOUSE_BUTTON_LEFT && modifiers & GLFW_MOD_CONTROL)) { - mapView->rotating = action == GLFW_PRESS; - if (mapView->rotating) { - mapView->start_x = mapView->last_x; - mapView->start_y = mapView->last_y; - } else { - mapView->map.stopRotating(); - } - } else if (button == GLFW_MOUSE_BUTTON_LEFT) { - mapView->tracking = action == GLFW_PRESS; - - if (action == GLFW_RELEASE) { - mapView->map.stopPanning(); - double now = glfwGetTime(); - if (now - mapView->last_click < 0.4) { - mapView->map.scaleBy(2.0, mapView->last_x, mapView->last_y); - } - mapView->last_click = now; - } - } - } - - static void mousemove(GLFWwindow *window, double x, double y) { - MapView *mapView = (MapView *)glfwGetWindowUserPointer(window); - if (mapView->tracking) { - double dx = x - mapView->last_x; - double dy = y - mapView->last_y; - if (dx || dy) { - mapView->map.startPanning(); - mapView->map.moveBy(dx, dy); - } - } else if (mapView->rotating) { - mapView->map.startRotating(); - mapView->map.rotateBy(mapView->start_x, mapView->start_y, mapView->last_x, mapView->last_y, x, y); - } - mapView->last_x = x; - mapView->last_y = y; - } - - int run() { - while (!glfwWindowShouldClose(window)) { - if (dirty) { - try { - dirty = render(); - } catch (std::exception& ex) { - fprintf(stderr, "exception: %s\n", ex.what()); - } - glfwSwapBuffers(window); - fps(); - } - - if (dirty) { - glfwPollEvents(); - } else { - glfwWaitEvents(); - } - } - - return 0; - } - - bool render() { - return map.render(); - } - - void fps() { - static int frames = 0; - static double time_elapsed = 0; - - frames++; - double current_time = glfwGetTime(); - - if (current_time - time_elapsed >= 1) { - fprintf(stderr, "FPS: %4.2f\n", frames / (current_time - time_elapsed)); - time_elapsed = current_time; - frames = 0; - } - } - - ~MapView() { - glfwTerminate(); - } - -public: - bool dirty; - double last_x, last_y; - bool tracking; - - double start_x, start_y; - bool rotating; +MapView *mapView = nullptr; - double last_click; - - GLFWwindow *window; +int main() { llmr::Settings_MacOSX settings; - llmr::Map map; -}; + mapView = new MapView(settings); + mapView->init(); + int ret = mapView->run(); + mapView->settings.sync(); + delete mapView; + return ret; +} + -MapView *mapView; namespace llmr { namespace platform { +void cleanup() { + // noop +} + void restart() { - mapView->dirty = true; - CGEventRef event = CGEventCreate(NULL); - CGEventSetType(event, kCGEventMouseMoved); - [[NSApplication sharedApplication] postEvent: [NSEvent eventWithCGEvent:event] atStart:NO]; + if (mapView) { + mapView->dirty = true; + CGEventRef event = CGEventCreate(NULL); + CGEventSetType(event, kCGEventMouseMoved); + [[NSApplication sharedApplication] postEvent: [NSEvent eventWithCGEvent:event] atStart:NO]; + } } class Request { @@ -291,12 +90,3 @@ void cancel_request_http(Request *request) } } - -int main() { - mapView = new MapView(); - mapView->init(); - int ret = mapView->run(); - mapView->settings.sync(); - delete mapView; - return ret; -}