// ************************************ // * // * rntviewer // * // * A graphical RNTuple visualizer // * // * @author silverweed, 2024 // * // *********************************** // #include // #include // #include #include #include #include // for std::forward #include #ifdef DEBUG #include #endif #include #include #include #include #define GLFW_INCLUDE_NONE #include #include "root/root_inc.h" #include "root/RMicroFileReader.hxx" #include "types.h" #include "defer.hpp" #include "prof.hpp" #include "mem.h" #include "str.h" #include "rntuple.h" #include "window.h" #include "render.h" #include "app_state.h" // @Platform #include "platform_linux.h" namespace chr = std::chrono; #include "mem.cpp" #include "str.cpp" #include "rntuple.cpp" #include "render.cpp" #include "mainloop.cpp" internal b8 init_imgui(GLFWwindow* window) { IMGUI_CHECKVERSION(); ImGui::CreateContext(); ImGuiIO& io = ImGui::GetIO(); (void) io; io.ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard; ImGui::StyleColorsDark(); ImGui_ImplGlfw_InitForOpenGL(window, true); ImGui_ImplOpenGL3_Init("#version 400"); return true; } internal void app_cleanup(App_State &app) { os_stop_file_watch(app); os_unmap_file(app.inspected_file.mem, app.inspected_file.size); if (app.inspected_file.stream) fclose(app.inspected_file.stream); } int main(int argc, char **argv) { Thread_Ctx tctx; tctx_init(tctx); defer { tctx_release(); }; if (argc > 1 && argv[1][0] == '-') { fprintf(stderr, "Usage: %s \n", argv[0]); return 1; } // Collect arguments const char *ntpl_name = argc > 1 ? argv[1] : nullptr; const char *fname = argc > 2 ? argv[2] : nullptr; // Allocate program memory Arena *arena = arena_alloc(); if (!arena) { fprintf(stderr, "Failed to allocate memory\n"); return 1; } defer { arena_release(arena); }; // Init imgui and GLFW GLFWwindow *window = init_glfw(800, 600); if (!window) { fprintf(stderr, "Failed to init GLFW\n"); return 1; } defer { glfwTerminate(); }; if (!init_imgui(window)) { fprintf(stderr, "Failed to init Imgui\n"); return 1; } App_State app {}; defer { app_cleanup(app); }; // Open and map the file if (fname) { if (!os_open_and_map_file(fname, app)) return 1; // Watch file for changes (to adapt the displayed file size - otherwise // we may try to access invalid memory when the file gets shrunk) os_start_file_watch(fname, app); } app.ntpl_name = ntpl_name; app.rndata = get_rntuple_data(arena, fname, ntpl_name); make_viewer(app); // Start main loop run_main_loop(window, arena, app); return 0; }