rs-rosbag-inspector.cpp
Go to the documentation of this file.
1 // License: Apache 2.0. See LICENSE file in root directory.
2 // Copyright(c) 2017 Intel Corporation. All Rights Reserved.
3 
4 #include <iostream>
5 #include <fstream>
6 #include <vector>
7 #include <set>
8 #include <map>
9 #include <string>
10 #include <sstream>
11 #include <iomanip>
12 #include <chrono>
13 #include <mutex>
14 #include <regex>
15 #include <thread>
16 
17 #include <os.h>
18 
19 #define GLFW_INCLUDE_GLU
20 #include <GLFW/glfw3.h>
21 #include <imgui.h>
22 #include <imgui_impl_glfw.h>
23 #include <imgui_internal.h>
24 #ifdef _MSC_VER
25 #ifndef NOMINMAX
26 #define NOMINMAX
27 #endif
28 #endif
29 
30 #include "print_helpers.h"
31 #include "rosbag_content.h"
32 #include "files_container.h"
33 
34 using namespace rosbag_inspector;
35 
36 files_container files; // Container of loaded files
37 std::map<std::string, uint64_t> num_topics_to_show;
38 
40 {
41 public:
43  _window(glfwCreateWindow(width, height, title.c_str(), nullptr, nullptr)),
44  _first_frame(true),
45  _w(0), _h(0)
46  {
47  if (!_window)
48  throw std::runtime_error("Could not open OpenGL window, please check your graphic drivers");
49  init_window();
50  }
51  operator bool()
52  {
53  int display_w, display_h;
54  glfwGetFramebufferSize(_window, &display_w, &display_h);
55  glViewport(0, 0, display_w, display_h);
56  glClearColor(0, 0, 0, 1);
58  if (!_first_frame)
59  {
60  ImGui::Render();
61  glfwSwapBuffers(_window);
62  }
63  bool res = !glfwWindowShouldClose(_window);
64 
66  glfwGetWindowSize(_window, &_w, &_h);
70  _first_frame = false;
71  return res;
72  }
73  int width() const
74  {
75  return _w;
76  }
77  int height() const
78  {
79  return _h;
80  }
81 private:
82  void init_window()
83  {
84  glfwMakeContextCurrent(_window);
86  glfwSetWindowUserPointer(_window, &files);
87 
88  glfwSetDropCallback(_window, [](GLFWwindow* w, int count, const char** paths)
89  {
90  auto f = reinterpret_cast<files_container*>(glfwGetWindowUserPointer(w));
91 
92  if (count <= 0)
93  return;
94 
95  f->AddFiles(std::vector<std::string>(paths, paths + count));
96  });
97 
98  ImGui_ImplGlfw_Init(_window, true);
99 
100  glfwSetScrollCallback(_window, [](GLFWwindow * w, double xoffset, double yoffset)
101  {
102  ImGuiIO& io = ImGui::GetIO();
103  io.MouseWheel += yoffset;
104  });
105 
106  }
107 
109  int _w, _h;
111 };
112 
113 ImVec4 from_rgba(uint8_t r, uint8_t g, uint8_t b, uint8_t a, bool consistent_color = false)
114 {
115  auto res = ImVec4(r / (float)255, g / (float)255, b / (float)255, a / (float)255);
116  return res;
117 }
118 static const ImVec4 light_blue = from_rgba(0, 174, 239, 255, true); // Light blue color for selected elements such as play button glyph when paused
119 static const ImVec4 regular_blue = from_rgba(0, 115, 200, 255, true); // Checkbox mark, slider grabber
120 static const ImVec4 light_grey = from_rgba(0xc3, 0xd5, 0xe5, 0xff, true); // Text
121 static const ImVec4 dark_window_background = from_rgba(9, 11, 13, 255);
122 static const ImVec4 almost_white_bg = from_rgba(230, 230, 230, 255, true);
123 static const ImVec4 black = from_rgba(0, 0, 0, 255, true);
124 static const ImVec4 transparent = from_rgba(0, 0, 0, 0, true);
125 static const ImVec4 white = from_rgba(0xff, 0xff, 0xff, 0xff, true);
126 static const ImVec4 scrollbar_bg = from_rgba(14, 17, 20, 255);
127 static const ImVec4 scrollbar_grab = from_rgba(54, 66, 67, 255);
128 static const ImVec4 grey{ 0.5f,0.5f,0.5f,1.f };
129 static const ImVec4 dark_grey = from_rgba(30, 30, 30, 255);
130 static const ImVec4 sensor_header_light_blue = from_rgba(80, 99, 115, 0xff);
131 static const ImVec4 sensor_bg = from_rgba(36, 44, 51, 0xff);
132 static const ImVec4 redish = from_rgba(255, 46, 54, 255, true);
133 static const ImVec4 dark_red = from_rgba(200, 46, 54, 255, true);
134 static const ImVec4 button_color = from_rgba(62, 77, 89, 0xff);
135 static const ImVec4 header_window_bg = from_rgba(36, 44, 54, 0xff);
136 static const ImVec4 header_color = from_rgba(62, 77, 89, 255);
137 static const ImVec4 title_color = from_rgba(27, 33, 38, 255);
138 static const ImVec4 device_info_color = from_rgba(33, 40, 46, 255);
139 static const ImVec4 yellow = from_rgba(229, 195, 101, 255, true);
140 static const ImVec4 green = from_rgba(0x20, 0xe0, 0x20, 0xff, true);
141 
143 {
144  if (ImGui::BeginMenuBar())
145  {
146  if (ImGui::BeginMenu("File"))
147  {
148  if (ImGui::MenuItem("Load File..."))
149  {
150  auto ret = file_dialog_open(rs2::file_dialog_mode::open_file, "ROS-bag\0*.bag\0", NULL, NULL);
151  if (ret)
152  {
153  files.AddFiles({ ret });
154  }
155  }
156  ImGui::EndMenu();
157  }
159  }
160 }
161 
163 {
164  ImGui::BeginChild("Loaded Files", ImVec2(150, 0), true, flags);
165  static int selected = 0;
166 
167  for (int i = 0; i < files.size(); i++)
168  {
173  if (ImGui::Selectable(files[i].file_name.c_str(), selected == i, 0, ImVec2(100, 0)))
174  {
175  selected = i;
176  num_topics_to_show.clear();
177  }
179  if (ImGui::IsItemHovered())
180  {
183  ImGui::TextUnformatted("Right click for more options");
186  }
187  std::string label = tmpstringstream() << "file operations " << files[i].file_name.c_str();
188  if (ImGui::BeginPopupContextItem(label.c_str()))
189  {
190  ImGui::Text("Choose operation");
192  if (ImGui::BeginMenu("Sort by"))
193  {
194  if (ImGui::MenuItem("Hardware Timestamp"))
195  {
196 
197  }
198  if (ImGui::MenuItem("Arrival Timestamp"))
199  {
200 
201  }
202  if (ImGui::MenuItem("System Timestamp"))
203  {
204 
205  }
206  if (ImGui::MenuItem("Capture Timestamp"))
207  {
208 
209  }
210  ImGui::EndMenu();
211  }
212  ImGui::EndPopup();
213  }
214  label = "x##" + files[i].file_name;
215  ImGui::SameLine();
217  if (ImGui::SmallButton(label.c_str()))
218  {
219  int next = files.remove_file(i);
220  if (selected >= i)
221  selected = std::max(0, selected - 1);
222  i = next - 1; //since we will "i++" next
223  }
224  }
225  ImGui::EndChild();
226 
227  return selected;
228 }
230 {
231  ImGui::BeginChild("Bag Content", ImVec2(0, 0), false, flags);
233  std::ostringstream oss;
234  ImGui::Text("\t%s", std::string(tmpstringstream() << std::left << std::setw(20) << "Path: " << bag.path).c_str());
235  ImGui::Text("\t%s", std::string(tmpstringstream() << std::left << std::setw(20) << "Bag Version: " << bag.version).c_str());
236  ImGui::Text("\t%s", std::string(tmpstringstream() << std::left << std::setw(20) << "Duration: " << pretty_time(bag.file_duration)).c_str());
237  ImGui::Text("\t%s", std::string(tmpstringstream() << std::left << std::setw(20) << "Size: " << bag.size << " MB").c_str());
238  ImGui::Text("\t%s", std::string(tmpstringstream() << std::left << std::setw(20) << "Compression: " << bag.compression_info.compression_type).c_str());
239  ImGui::Text("\t%s", std::string(tmpstringstream() << std::left << std::setw(20) << "uncompressed: " << bag.compression_info.uncompressed).c_str());
240  ImGui::Text("\t%s", std::string(tmpstringstream() << std::left << std::setw(20) << "compressed: " << bag.compression_info.compressed).c_str());
241  if (ImGui::CollapsingHeader("Topics"))
242  {
243  for (auto&& topic_to_message_type : bag.topics_to_message_types)
244  {
245  std::string topic = topic_to_message_type.first;
246  std::vector<std::string> messages_types = topic_to_message_type.second;
247  std::ostringstream oss;
248  int max_topic_len = 100;
249  oss << std::left << std::setw(max_topic_len) << topic
250  << " " << std::left << std::setw(10) << messages_types.size() << std::setw(6) << std::string(" msg") + (messages_types.size() > 1 ? "s" : "")
251  << ": " << std::left << std::setw(40) << messages_types.front() << std::endl;
252  std::string line = oss.str();
253  auto pos = ImGui::GetCursorPos();
254  ImGui::SetCursorPos({ pos.x + 20, pos.y });
255  if (ImGui::CollapsingHeader(line.c_str()))
256  {
257  rosbag::View messages(bag.bag, rosbag::TopicQuery(topic));
258  uint64_t count = 0;
259  constexpr uint64_t num_next_items_to_show = 10;
260  num_topics_to_show[topic] = std::max(num_topics_to_show[topic], num_next_items_to_show);
261  uint64_t max = num_topics_to_show[topic];
262  auto win_pos = ImGui::GetWindowPos();
263  ImGui::SetWindowPos({ win_pos.x + 20, win_pos.y });
264  for (auto&& m : messages)
265  {
266  count++;
267  ImGui::Columns(2, "Message", true);
269  ImGui::Text("Timestamp"); ImGui::NextColumn();
270  ImGui::Text("Content"); ImGui::NextColumn();
272  ImGui::Text("%s", pretty_time(std::chrono::nanoseconds(m.getTime().toNSec())).c_str()); ImGui::NextColumn();
273  ImGui::Text("%s", bag.instanciate_and_cache(m, count).c_str());
274  ImGui::Columns(1);
276  if (count >= max)
277  {
278  int left = messages.size() - max;
279  if (left > 0)
280  {
281  ImGui::Text("... %d more messages", left);
282  ImGui::SameLine();
283  std::string label = tmpstringstream() << "Show More ##" << topic;
284  if (ImGui::Button(label.c_str()))
285  {
286  num_topics_to_show[topic] += 10;
287  }
288  else
289  {
290  break;
291  }
292  }
293  }
294  }
295  ImGui::SetWindowPos(win_pos);
296  }
297 
298  if (ImGui::IsItemHovered())
299  {
300  if (topic.size() > max_topic_len)
301  {
304  ImGui::Text("%s", topic.c_str());
307  }
308  }
309 
310  }
311  }
313 
314  ImGui::EndChild();
315 
316 }
318 {
319  if (files.has_errors())
320  {
323  ImGui::OpenPopup("Error");
325  {
326  std::string msg = tmpstringstream() << "Error: " << files.get_last_error();
327  ImGui::TextWrapped("%s", msg.c_str());
329 
330  if (ImGui::Button("OK", ImVec2(120, 0)))
331  {
333  files.clear_errors();
334  }
335  ImGui::EndPopup();
337  }
338  }
339 }
340 
342 {
347 };
348 
349 inline void sort(sort_type m_sort_type, const std::string& in, const std::string& out)
350 {
351  //TODO: Save sort type to file
352  rosbag::Bag bag_in(in);
353  rosbag::Bag bag_out(out);
354 
355  rosbag::View entire_bag_view(bag_in);
356  for (auto&& m : entire_bag_view)
357  {
358  // 1. Write frame with new timestamp
359  // 2. Get all metadata of this frame and write it
360 
361  if (m.isType<sensor_msgs::Image>())
362  {
363 
364  }
365  if (m.isType<sensor_msgs::Imu>())
366  {
367 
368  }
369  if (m.isType<geometry_msgs::Transform>())
370  {
371 
372  }
373  if (m.isType<geometry_msgs::Twist>() || m.isType<geometry_msgs::Accel>())
374  {
375 
376  }
377  if (m.getTime() == rs2rosinternal::TIME_MIN)
378  {
379  bag_out.write(m.getTopic(), m.getTime(), m);
380  continue;
381  }
382 
383  if (m.getTopic().find("/option/") != std::string::npos)
384  {
385 
386  }
387  }
388 }
389 
390 int main(int argc, const char** argv)
391 {
392  if (!glfwInit())
393  {
394  return 1;
395  }
396  gui_window window("RealSense Rosbag Inspector", 1280, 720);
397 
398  while (window)
399  {
405  ImGui::PushStyleColor(ImGuiCol_Header, from_rgba(0, 115, 210, 255));
409  ImGui::PushStyleColor(ImGuiCol_PopupBg, almost_white_bg);
410  ImGuiStyle& style = ImGui::GetStyle();
411  style.FramePadding.x = 10;
412  style.FramePadding.y = 5;
414 
415  static bool open = true;
416  ImGui::SetNextWindowSize({ float(window.width()), float(window.height()) }, flags | ImGuiSetCond_FirstUseEver);
417  if (ImGui::Begin("Rosbag Inspector", nullptr, flags | ImGuiWindowFlags_MenuBar))
418  {
419  draw_menu_bar();
420  int selected = draw_files_left_panel(flags);
421 
422  ImGui::SameLine();
423  if (files.size() > 0)
424  {
425  draw_bag_content(files[selected], flags);
426  }
427 
429  }
430  ImGui::End();
432  std::this_thread::sleep_for(std::chrono::milliseconds(10));
433  }
434 
436  glfwTerminate();
437  return 0;
438 }
439 
440 #ifdef WIN32
441 int CALLBACK WinMain(
442  _In_ HINSTANCE hInstance,
443  _In_ HINSTANCE hPrevInstance,
444  _In_ LPSTR lpCmdLine,
445  _In_ int nCmdShow
446 
447 ) {
448  main(0, nullptr);
449 }
450 #endif
void draw_menu_bar()
gui_window(const std::string &title, uint32_t width, uint32_t height)
int main(int argc, const char **argv)
GLboolean GLboolean GLboolean b
GLboolean GLboolean g
IMGUI_API ImVec2 GetCursorPos()
Definition: imgui.cpp:5076
GLFWAPI void glfwGetWindowSize(GLFWwindow *window, int *width, int *height)
Retrieves the size of the client area of the specified window.
Definition: window.c:544
int width() const
IMGUI_API bool BeginPopupContextItem(const char *str_id, int mouse_button=1)
Definition: imgui.cpp:3507
std::map< std::string, uint64_t > num_topics_to_show
The header of the GLFW 3 API.
GLFWAPI GLFWglproc glfwGetProcAddress(const char *procname)
Returns the address of the specified function for the current context.
Definition: context.c:741
GLfloat green
void AddFiles(std::vector< std::string > const &files)
IMGUI_API void SetCursorPos(const ImVec2 &local_pos)
Definition: imgui.cpp:5094
const GLfloat * m
Definition: glext.h:6814
void *(* GLADloadproc)(const char *name)
static const ImVec4 scrollbar_grab
static GLFWwindow * window
Definition: joysticks.c:55
Definition: imgui.h:88
static const ImVec4 almost_white_bg
IMGUI_API void SetWindowPos(const ImVec2 &pos, ImGuiSetCond cond=0)
Definition: imgui.cpp:4815
IMGUI_API void PopTextWrapPos()
Definition: imgui.cpp:4592
void draw_bag_content(rosbag_content &bag, int flags)
std::chrono::nanoseconds file_duration
#define GL_PROJECTION
GLFWAPI void * glfwGetWindowUserPointer(GLFWwindow *window)
Returns the user pointer of the specified window.
Definition: window.c:964
static const ImVec4 redish
GLsizei const GLuint * paths
Definition: glext.h:10532
void draw_error_modal()
IMGUI_API void EndTooltip()
Definition: imgui.cpp:3310
void ImGui_ImplGlfw_Shutdown()
static const ImVec4 black
IMGUI_API bool SmallButton(const char *label)
Definition: imgui.cpp:5579
IMGUI_API bool BeginChild(const char *str_id, const ImVec2 &size=ImVec2(0, 0), bool border=false, ImGuiWindowFlags extra_flags=0)
Definition: imgui.cpp:3531
IMGUI_API void BeginTooltip()
Definition: imgui.cpp:3304
rosbag_inspector::compression_info compression_info
GLdouble GLdouble GLdouble w
GLsizei const GLchar *const * string
IMGUI_API void PushTextWrapPos(float wrap_pos_x=0.0f)
Definition: imgui.cpp:4585
ImVec4 from_rgba(uint8_t r, uint8_t g, uint8_t b, uint8_t a, bool consistent_color=false)
#define glLoadIdentity
static const ImVec4 scrollbar_bg
static const ImVec4 sensor_header_light_blue
unsigned char uint8_t
Definition: stdint.h:78
static const ImVec4 button_color
void sort(sort_type m_sort_type, const std::string &in, const std::string &out)
static const ImVec4 device_info_color
IMGUI_API bool BeginMenuBar()
Definition: imgui.cpp:8796
GLboolean GLboolean GLboolean GLboolean a
static const ImVec4 light_blue
static const ImVec4 header_window_bg
IMGUI_API void SameLine(float pos_x=0.0f, float spacing_w=-1.0f)
Definition: imgui.cpp:9246
GLFWAPI int glfwInit(void)
Initializes the GLFW library.
Definition: init.c:198
GLdouble f
int draw_files_left_panel(int flags)
GLFWAPI void glfwSetWindowUserPointer(GLFWwindow *window, void *pointer)
Sets the user pointer of the specified window.
Definition: window.c:955
IMGUI_API bool Begin(const char *name, bool *p_open=NULL, ImGuiWindowFlags flags=0)
Definition: imgui.cpp:3772
IMGUI_API bool CollapsingHeader(const char *label, ImGuiTreeNodeFlags flags=0)
Definition: imgui.cpp:5961
#define GL_COLOR_BUFFER_BIT
static const ImVec4 grey
GLdouble GLdouble r
IMGUI_API void TextUnformatted(const char *text, const char *text_end=NULL)
Definition: imgui.cpp:5276
unsigned int uint32_t
Definition: stdint.h:80
bool ImGui_ImplGlfw_Init(GLFWwindow *window, bool install_callbacks)
#define glClear
IMGUI_API ImGuiIO & GetIO()
Definition: imgui.cpp:2014
files_container files
static const ImVec4 white
GLint GLsizei GLsizei height
IMGUI_API void SetNextWindowSize(const ImVec2 &size, ImGuiSetCond cond=0)
Definition: imgui.cpp:4937
GLFWAPI void glfwSwapBuffers(GLFWwindow *window)
Swaps the front and back buffers of the specified window.
Definition: context.c:641
GLFWAPI void glfwMakeContextCurrent(GLFWwindow *window)
Makes the context of the specified window current for the calling thread.
Definition: context.c:611
static const ImVec4 regular_blue
void write(std::string const &topic, rs2rosinternal::MessageEvent< T > const &event)
Write a message into the bag file.
Definition: bag.h:324
GLbitfield flags
unsigned __int64 uint64_t
Definition: stdint.h:90
IMGUI_API void SetCursorPosX(float x)
Definition: imgui.cpp:5101
IMGUI_API void Text(const char *fmt,...) IM_PRINTFARGS(1)
Definition: imgui.cpp:5223
GLint left
Definition: glext.h:1963
IMGUI_API bool Button(const char *label, const ImVec2 &size=ImVec2(0, 0))
Definition: imgui.cpp:5573
const char * file_dialog_open(file_dialog_mode flags, const char *filters, const char *default_path, const char *default_name)
Definition: os.cpp:169
IMGUI_API void Separator()
Definition: imgui.cpp:9127
IMGUI_API void End()
Definition: imgui.cpp:4330
int CALLBACK WinMain(_In_ HINSTANCE hInstance, _In_ HINSTANCE hPrevInstance, _In_ LPSTR lpCmdLine, _In_ int nCmdShow)
Definition: imgui.h:98
static const ImVec4 header_color
static const ImVec4 dark_red
IMGUI_API void EndPopup()
Definition: imgui.cpp:3489
GLAPI int gladLoadGLLoader(GLADloadproc)
Definition: glad/glad.c:1697
#define glViewport
IMGUI_API void NextColumn()
Definition: imgui.cpp:9280
IMGUI_API void PushStyleColor(ImGuiCol idx, const ImVec4 &col)
Definition: imgui.cpp:4599
std::chrono::duration< uint64_t, std::nano > nanoseconds
static const ImVec4 yellow
float y
Definition: imgui.h:90
IMGUI_API void EndChild()
Definition: imgui.cpp:3573
ImVec2 FramePadding
Definition: imgui.h:757
IMGUI_API bool BeginMenu(const char *label, bool enabled=true)
Definition: imgui.cpp:8833
GLFWAPI GLFWwindow * glfwCreateWindow(int width, int height, const char *title, GLFWmonitor *monitor, GLFWwindow *share)
Creates a window and its associated context.
Definition: window.c:151
void next(auto_any_t cur, type2type< T, C > *)
Definition: foreach.hpp:757
void ImGui_ImplGlfw_NewFrame(float scale_factor)
GLint GLint GLint yoffset
ROSTIME_DECL const Time TIME_MIN
GLuint in
Definition: glext.h:8859
GLuint GLsizei const GLchar * label
GLFWAPI GLFWscrollfun glfwSetScrollCallback(GLFWwindow *window, GLFWscrollfun cbfun)
Sets the scroll callback.
Definition: input.c:854
GLFWAPI GLFWdropfun glfwSetDropCallback(GLFWwindow *window, GLFWdropfun cbfun)
Sets the file drop callback.
Definition: input.c:865
GLFWAPI void glfwGetFramebufferSize(GLFWwindow *window, int *width, int *height)
Retrieves the size of the framebuffer of the specified window.
Definition: window.c:647
IMGUI_API bool MenuItem(const char *label, const char *shortcut=NULL, bool selected=false, bool enabled=true)
Definition: imgui.cpp:8733
GLint GLsizei count
GLFWAPI void glfwTerminate(void)
Terminates the GLFW library.
Definition: init.c:243
static const ImVec4 transparent
IMGUI_API bool BeginPopupModal(const char *name, bool *p_open=NULL, ImGuiWindowFlags extra_flags=0)
Definition: imgui.cpp:3465
std::string pretty_time(std::chrono::nanoseconds d)
Definition: print_helpers.h:37
IMGUI_API bool Selectable(const char *label, bool selected=false, ImGuiSelectableFlags flags=0, const ImVec2 &size=ImVec2(0, 0))
Definition: imgui.cpp:8550
Definition: imgui.h:780
static const ImVec4 dark_window_background
#define glClearColor
float rs2_vector::* pos
GLFWAPI void glfwPollEvents(void)
Processes all pending events.
Definition: window.c:1072
std::map< std::string, std::vector< std::string > > topics_to_message_types
static const ImVec4 light_grey
IMGUI_API void EndMenuBar()
Definition: imgui.cpp:8816
GLFWwindow * _window
float MouseWheel
Definition: imgui.h:842
#define NULL
Definition: tinycthread.c:47
int i
GLuint res
Definition: glext.h:8856
static const ImVec4 sensor_bg
IMGUI_API ImVec2 GetWindowPos()
Definition: imgui.cpp:4785
IMGUI_API ImGuiStyle & GetStyle()
Definition: imgui.cpp:2019
IMGUI_API void CloseCurrentPopup()
Definition: imgui.cpp:3408
static const ImVec4 dark_grey
IMGUI_API void OpenPopup(const char *str_id)
Definition: imgui.cpp:3343
static const ImVec4 title_color
int height() const
IMGUI_API void TextWrapped(const char *fmt,...) IM_PRINTFARGS(1)
Definition: imgui.cpp:5268
IMGUI_API void Columns(int count=1, const char *id=NULL, bool border=true)
Definition: imgui.cpp:9398
GLint GLint xoffset
IMGUI_API void EndMenu()
Definition: imgui.cpp:8937
IMGUI_API bool IsItemHovered()
Definition: imgui.cpp:3200
#define glMatrixMode
struct GLFWwindow GLFWwindow
GLint GLsizei width
IMGUI_API void Render()
Definition: imgui.cpp:2619
std::string instanciate_and_cache(const rosbag::MessageInstance &m, uint64_t count)
float x
Definition: imgui.h:90
IMGUI_API void PopStyleColor(int count=1)
Definition: imgui.cpp:4609
GLFWAPI int glfwWindowShouldClose(GLFWwindow *window)
Checks the close flag of the specified window.
Definition: window.c:477


librealsense2
Author(s): Sergey Dorodnicov , Doron Hirshberg , Mark Horn , Reagan Lopez , Itay Carpis
autogenerated on Mon May 3 2021 02:47:40