ACloudViewer  3.9.4
A Modern Library for 3D Data Processing
Visualizer.cpp
Go to the documentation of this file.
1 // ----------------------------------------------------------------------------
2 // - CloudViewer: www.cloudViewer.org -
3 // ----------------------------------------------------------------------------
4 // Copyright (c) 2018-2024 www.cloudViewer.org
5 // SPDX-License-Identifier: MIT
6 // ----------------------------------------------------------------------------
7 
9 
10 #include <Logging.h>
11 #include <ecvMesh.h>
12 
13 #include <memory>
14 
15 #if defined(__APPLE__) && defined(BUILD_GUI)
16 namespace bluegl {
17 int bind();
18 void unbind();
19 } // namespace bluegl
20 #endif
21 
22 namespace cloudViewer {
23 
24 namespace visualization {
25 
27 class GLFWContext {
28 private:
29  GLFWContext() {
30  utility::LogDebug("GLFW init.");
31 
32 #if defined(__APPLE__)
33  // On macOS, GLFW changes the directory to the resource directory,
34  // which will cause an unexpected change of directory if using a
35  // framework build version of Python.
36  glfwInitHint(GLFW_COCOA_CHDIR_RESOURCES, GLFW_FALSE);
37 #endif
38  init_status_ = glfwInit();
39  if (init_status_ != GLFW_TRUE) {
40  glfwInitHint(GLFW_PLATFORM, GLFW_PLATFORM_NULL);
41  init_status_ = glfwInit();
42  }
43  if (init_status_ == GLFW_TRUE) init_status_ = glfwGetPlatform();
44  if (init_status_ == GLFW_PLATFORM_NULL) {
45  utility::LogWarning("GLFW initialized for headless rendering.");
46  }
47  }
48 
49  GLFWContext(const GLFWContext &) = delete;
50  GLFWContext &operator=(const GLFWContext &) = delete;
51 
52 public:
54  if (init_status_ != GLFW_FALSE) {
55  glfwTerminate();
56  init_status_ = GLFW_FALSE;
57  utility::LogDebug("GLFW destruct.");
58  }
59  }
60 
62  inline int InitStatus() const { return init_status_; }
63 
65  static std::shared_ptr<GLFWContext> GetInstance() {
66  static std::weak_ptr<GLFWContext> singleton;
67 
68  auto res = singleton.lock();
69  if (res == nullptr) {
70  res = std::shared_ptr<GLFWContext>(new GLFWContext());
71  singleton = res;
72  }
73  return res;
74  }
75 
76  static void GLFWErrorCallback(int error, const char *description) {
77  utility::LogWarning("GLFW Error: {}", description);
78  }
79 
80 private:
82  int init_status_ = GLFW_FALSE;
83 };
84 
86 
89 
90 #if defined(__APPLE__) && defined(BUILD_GUI)
91  bluegl::unbind();
92 #endif
93 }
94 
96  const std::string &window_name /* = "CloudViewer"*/,
97  const int width /* = 640*/,
98  const int height /* = 480*/,
99  const int left /* = 50*/,
100  const int top /* = 50*/,
101  const bool visible /* = true*/) {
102  window_name_ = window_name;
103  if (window_) { // window already created
104  utility::LogDebug("[Visualizer] Reusing window.");
106  glfwSetWindowPos(window_, left, top);
107  glfwSetWindowSize(window_, width, height);
108 #ifdef __APPLE__
109  glfwSetWindowSize(window_,
110  std::round(width * pixel_to_screen_coordinate_),
111  std::round(height * pixel_to_screen_coordinate_));
112  glfwSetWindowPos(window_,
113  std::round(left * pixel_to_screen_coordinate_),
114  std::round(top * pixel_to_screen_coordinate_));
115 #endif //__APPLE__
116  return true;
117  }
118 
119  utility::LogDebug("[Visualizer] Creating window.");
120  glfwSetErrorCallback(GLFWContext::GLFWErrorCallback);
122  if (glfw_context_->InitStatus() == GLFW_FALSE) {
123  utility::LogWarning("Failed to initialize GLFW");
124  return false;
125  }
126 
127  glfwWindowHint(GLFW_SAMPLES, 4);
128  glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
129  glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
130  glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
131  int visible_hint = visible ? 1 : 0;
132  if (glfw_context_->InitStatus() == GLFW_PLATFORM_NULL) {
133  glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_FALSE);
134  visible_hint = 0; // NULL platform does not support visible window
135  } else {
136  glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
137  }
138  glfwWindowHint(GLFW_VISIBLE, visible_hint);
139 
140  window_ = glfwCreateWindow(width, height, window_name_.c_str(), nullptr,
141  nullptr);
142  if (!window_) {
143  utility::LogWarning("Failed to create window");
144  return false;
145  }
146  glfwSetWindowPos(window_, left, top);
147  glfwSetWindowUserPointer(window_, this);
148 
149 #ifdef __APPLE__
150  // Some hacks to get pixel_to_screen_coordinate_
151  glfwSetWindowSize(window_, 100, 100);
152  glfwSetWindowPos(window_, 100, 100);
153  int pixel_width_in_osx, pixel_height_in_osx;
154  glfwGetFramebufferSize(window_, &pixel_width_in_osx, &pixel_height_in_osx);
155  if (pixel_width_in_osx > 0) {
156  pixel_to_screen_coordinate_ = 100.0 / (double)pixel_width_in_osx;
157  } else {
158  pixel_to_screen_coordinate_ = 1.0;
159  }
160  glfwSetWindowSize(window_, std::round(width * pixel_to_screen_coordinate_),
161  std::round(height * pixel_to_screen_coordinate_));
162  glfwSetWindowPos(window_, std::round(left * pixel_to_screen_coordinate_),
163  std::round(top * pixel_to_screen_coordinate_));
164 #endif //__APPLE__
165 
166  auto window_refresh_callback = [](GLFWwindow *window) {
167  static_cast<Visualizer *>(glfwGetWindowUserPointer(window))
168  ->WindowRefreshCallback(window);
169  };
170  glfwSetWindowRefreshCallback(window_, window_refresh_callback);
171 
172  auto window_resize_callback = [](GLFWwindow *window, int w, int h) {
173  static_cast<Visualizer *>(glfwGetWindowUserPointer(window))
174  ->WindowResizeCallback(window, w, h);
175  };
176  glfwSetFramebufferSizeCallback(window_, window_resize_callback);
177 
178  auto mouse_move_callback = [](GLFWwindow *window, double x, double y) {
179  static_cast<Visualizer *>(glfwGetWindowUserPointer(window))
180  ->MouseMoveCallback(window, x, y);
181  };
182  glfwSetCursorPosCallback(window_, mouse_move_callback);
183 
184  auto mouse_scroll_callback = [](GLFWwindow *window, double x, double y) {
185  static_cast<Visualizer *>(glfwGetWindowUserPointer(window))
186  ->MouseScrollCallback(window, x, y);
187  };
188  glfwSetScrollCallback(window_, mouse_scroll_callback);
189 
190  auto mouse_button_callback = [](GLFWwindow *window, int button, int action,
191  int mods) {
192  static_cast<Visualizer *>(glfwGetWindowUserPointer(window))
193  ->MouseButtonCallback(window, button, action, mods);
194  };
195  glfwSetMouseButtonCallback(window_, mouse_button_callback);
196 
197  auto key_press_callback = [](GLFWwindow *window, int key, int scancode,
198  int action, int mods) {
199  static_cast<Visualizer *>(glfwGetWindowUserPointer(window))
200  ->KeyPressCallback(window, key, scancode, action, mods);
201  };
202  glfwSetKeyCallback(window_, key_press_callback);
203 
204  auto window_close_callback = [](GLFWwindow *window) {
205  static_cast<Visualizer *>(glfwGetWindowUserPointer(window))
206  ->WindowCloseCallback(window);
207  };
208  glfwSetWindowCloseCallback(window_, window_close_callback);
209 
210  glfwMakeContextCurrent(window_);
211  glfwSwapInterval(1);
212 
213  if (!InitOpenGL()) {
214  return false;
215  }
216 
217  if (!InitViewControl()) {
218  return false;
219  }
220 
221  if (!InitRenderOption()) {
222  return false;
223  }
224 
225  int window_width, window_height;
226  glfwGetFramebufferSize(window_, &window_width, &window_height);
227  WindowResizeCallback(window_, window_width, window_height);
228 
230 
231  is_initialized_ = true;
232  return true;
233 }
234 
236  if (!is_initialized_) {
237  return;
238  }
239 
240  utility::LogDebug("[Visualizer] Destroying window.");
241  is_initialized_ = false;
242  glDeleteVertexArrays(1, &vao_id_);
243  vao_id_ = 0;
244  glfwDestroyWindow(window_);
245  window_ = nullptr;
246  glfw_context_.reset();
247 }
248 
250  std::function<bool(Visualizer *)> callback_func) {
251  animation_callback_func_ = callback_func;
252 }
253 
255  view_control_ptr_ = std::unique_ptr<ViewControl>(new ViewControl);
256  ResetViewPoint();
257  return true;
258 }
259 
261  render_option_ptr_ = std::unique_ptr<RenderOption>(new RenderOption);
262  return true;
263 }
264 
266  if (window_) {
267  glfwSetWindowTitle(window_, window_name_.c_str());
268  }
269 }
270 
272  glfwMakeContextCurrent(window_);
273 
274  // 0. Build coordinate frame
275  const auto boundingbox = GetViewControl().GetBoundingBox();
276  double extent = std::max(0.01, boundingbox.GetMaxExtent() * 0.2);
278  ccMesh::CreateCoordinateFrame(extent, boundingbox.GetMinBound());
280  std::make_shared<glsl::CoordinateFrameRenderer>();
281  if (!coordinate_frame_mesh_renderer_ptr_->AddGeometry(
283  return;
284  }
287 }
288 
290  BuildUtilities();
292  while (bool(animation_callback_func_) ? PollEvents() : WaitEvents()) {
295  UpdateGeometry();
296  }
297  // Set render flag as dirty anyways, because when we use
298  // callback functions, we assume something has been changed in
299  // the callback and the redraw event should be triggered.
300  UpdateRender();
301  }
302  }
303 }
304 
306  glfwSetWindowShouldClose(window_, GL_TRUE);
307  utility::LogDebug("[Visualizer] Window closing.");
308 }
309 
311  if (!is_initialized_) {
312  return false;
313  }
314  glfwMakeContextCurrent(window_);
315  if (is_redraw_required_) {
317  }
319  glfwWaitEvents();
320  return !glfwWindowShouldClose(window_);
321 }
322 
324  if (!is_initialized_) {
325  return false;
326  }
327  glfwMakeContextCurrent(window_);
328  if (is_redraw_required_) {
330  }
332  glfwPollEvents();
333  return !glfwWindowShouldClose(window_);
334 }
335 
336 bool Visualizer::AddGeometry(std::shared_ptr<const ccHObject> geometry_ptr,
337  bool reset_bounding_box) {
338  if (!is_initialized_) {
339  return false;
340  }
341 
342  if (!geometry_ptr.get()) {
344  "[AddGeometry] Invalid pointer. Possibly a null pointer or "
345  "None was passed in.");
346  return false;
347  }
348 
349  glfwMakeContextCurrent(window_);
350  std::shared_ptr<glsl::GeometryRenderer> renderer_ptr;
351  if (geometry_ptr->isKindOf(CV_TYPES::CUSTOM_H_OBJECT)) {
352  return false;
353  } else if (geometry_ptr->isKindOf(CV_TYPES::POINT_CLOUD)) {
354  renderer_ptr = std::make_shared<glsl::PointCloudRenderer>();
355  if (!renderer_ptr->AddGeometry(geometry_ptr)) {
356  return false;
357  }
358  } else if (geometry_ptr->isKindOf(CV_TYPES::VOXEL_GRID)) {
359  renderer_ptr = std::make_shared<glsl::VoxelGridRenderer>();
360  if (!renderer_ptr->AddGeometry(geometry_ptr)) {
361  return false;
362  }
363  } else if (geometry_ptr->isKindOf(CV_TYPES::POINT_OCTREE2)) {
364  renderer_ptr = std::make_shared<glsl::OctreeRenderer>();
365  if (!renderer_ptr->AddGeometry(geometry_ptr)) {
366  return false;
367  }
368  } else if (geometry_ptr->isKindOf(CV_TYPES::LINESET)) {
369  renderer_ptr = std::make_shared<glsl::LineSetRenderer>();
370  if (!renderer_ptr->AddGeometry(geometry_ptr)) {
371  return false;
372  }
373  } else if (geometry_ptr->isKindOf(CV_TYPES::POLY_LINE)) {
374  renderer_ptr = std::make_shared<glsl::PolylineRenderer>();
375  if (!renderer_ptr->AddGeometry(geometry_ptr)) {
376  return false;
377  }
378  } else if (geometry_ptr->isKindOf(CV_TYPES::FACET)) {
379  renderer_ptr = std::make_shared<glsl::FacetRenderer>();
380  if (!renderer_ptr->AddGeometry(geometry_ptr)) {
381  return false;
382  }
383  } else if (geometry_ptr->isKindOf(CV_TYPES::MESH)) {
384  renderer_ptr = std::make_shared<glsl::TriangleMeshRenderer>();
385  if (!renderer_ptr->AddGeometry(geometry_ptr)) {
386  return false;
387  }
388  } else if (geometry_ptr->isKindOf(CV_TYPES::HALF_EDGE_MESH)) {
389  renderer_ptr = std::make_shared<glsl::HalfEdgeMeshRenderer>();
390  if (!renderer_ptr->AddGeometry(geometry_ptr)) {
391  return false;
392  }
393  } else if (geometry_ptr->isKindOf(CV_TYPES::IMAGE2)) {
394  renderer_ptr = std::make_shared<glsl::ImageRenderer>();
395  if (!renderer_ptr->AddGeometry(geometry_ptr)) {
396  return false;
397  }
398  } else if (geometry_ptr->isKindOf(CV_TYPES::RGBD_IMAGE)) {
399  renderer_ptr = std::make_shared<glsl::RGBDImageRenderer>();
400  if (!renderer_ptr->AddGeometry(geometry_ptr)) {
401  return false;
402  }
403  } else if (geometry_ptr->isKindOf(CV_TYPES::TETRA_MESH)) {
404  renderer_ptr = std::make_shared<glsl::TetraMeshRenderer>();
405  if (!renderer_ptr->AddGeometry(geometry_ptr)) {
406  return false;
407  }
408  } else if (geometry_ptr->isKindOf(CV_TYPES::ORIENTED_BBOX)) {
409  renderer_ptr = std::make_shared<glsl::OrientedBoundingBoxRenderer>();
410  if (!renderer_ptr->AddGeometry(geometry_ptr)) {
411  return false;
412  }
413  } else if (geometry_ptr->isKindOf(CV_TYPES::BBOX)) {
414  renderer_ptr = std::make_shared<glsl::AxisAlignedBoundingBoxRenderer>();
415  if (!renderer_ptr->AddGeometry(geometry_ptr)) {
416  return false;
417  }
418  } else {
419  return false;
420  }
421  geometry_renderer_ptrs_.insert(renderer_ptr);
422  geometry_ptrs_.insert(geometry_ptr);
423  if (reset_bounding_box) {
424  view_control_ptr_->FitInGeometry(*geometry_ptr);
425  ResetViewPoint();
426  }
428  "Add geometry and update bounding box to {}",
429  view_control_ptr_->GetBoundingBox().GetPrintInfo().c_str());
430  return UpdateGeometry(geometry_ptr);
431 }
432 
433 bool Visualizer::RemoveGeometry(std::shared_ptr<const ccHObject> geometry_ptr,
434  bool reset_bounding_box) {
435  if (!is_initialized_) {
436  return false;
437  }
438  glfwMakeContextCurrent(window_);
439  std::shared_ptr<glsl::GeometryRenderer> geometry_renderer_delete = nullptr;
440  for (auto &geometry_renderer_ptr : geometry_renderer_ptrs_) {
441  if (geometry_renderer_ptr->GetGeometry() == geometry_ptr)
442  geometry_renderer_delete = geometry_renderer_ptr;
443  }
444  if (!geometry_renderer_delete) return false;
445  geometry_renderer_ptrs_.erase(geometry_renderer_delete);
446  geometry_ptrs_.erase(geometry_ptr);
447  if (reset_bounding_box) {
448  ResetViewPoint(true);
449  }
451  "Remove geometry and update bounding box to {}",
452  view_control_ptr_->GetBoundingBox().GetPrintInfo().c_str());
453  return UpdateGeometry(geometry_ptr);
454 }
455 
457  if (!is_initialized_) {
458  return false;
459  }
460  glfwMakeContextCurrent(window_);
461  geometry_renderer_ptrs_.clear();
462  geometry_ptrs_.clear();
463  return UpdateGeometry();
464 }
465 
466 bool Visualizer::UpdateGeometry(std::shared_ptr<const ccHObject> geometry_ptr) {
467  glfwMakeContextCurrent(window_);
468  bool success = true;
469  for (const auto &renderer_ptr : geometry_renderer_ptrs_) {
470  if (geometry_ptr == nullptr ||
471  renderer_ptr->HasGeometry(geometry_ptr)) {
472  success = (success && renderer_ptr->UpdateGeometry());
473  }
474  }
475  UpdateRender();
476  return success;
477 }
478 
480 
481 bool Visualizer::HasGeometry() const { return !geometry_ptrs_.empty(); }
482 
483 void Visualizer::SetFullScreen(bool fullscreen) {
484  if (!fullscreen) {
485  glfwSetWindowMonitor(window_, NULL, saved_window_pos_(0),
487  saved_window_size_(1), GLFW_DONT_CARE);
488  } else {
489  glfwGetWindowSize(window_, &saved_window_size_(0),
490  &saved_window_size_(1));
491  glfwGetWindowPos(window_, &saved_window_pos_(0), &saved_window_pos_(1));
492  GLFWmonitor *monitor = glfwGetPrimaryMonitor();
493  if (const GLFWvidmode *mode = glfwGetVideoMode(monitor)) {
494  glfwSetWindowMonitor(window_, monitor, 0, 0, mode->width,
495  mode->height, mode->refreshRate);
496  } else {
498  "Internal error: glfwGetVideoMode returns nullptr.");
499  }
500  }
501 }
502 
504  if (IsFullScreen()) {
505  SetFullScreen(false);
506  } else {
507  SetFullScreen(true);
508  }
509 }
510 
512  return glfwGetWindowMonitor(window_) != nullptr;
513 }
514 
516  // clang-format off
517  utility::LogInfo(" -- Mouse view control --");
518  utility::LogInfo(" Left button + drag : Rotate.");
519  utility::LogInfo(" Ctrl + left button + drag : Translate.");
520  utility::LogInfo(" Wheel button + drag : Translate.");
521  utility::LogInfo(" Shift + left button + drag : Roll.");
522  utility::LogInfo(" Wheel : Zoom in/out.");
523  utility::LogInfo("");
524  utility::LogInfo(" -- Keyboard view control --");
525  utility::LogInfo(" [/] : Increase/decrease field of view.");
526  utility::LogInfo(" R : Reset view point.");
527  utility::LogInfo(" Ctrl/Cmd + C : Copy current view status into the clipboard.");
528  utility::LogInfo(" Ctrl/Cmd + V : Paste view status from clipboard.");
529  utility::LogInfo("");
530  utility::LogInfo(" -- General control --");
531  utility::LogInfo(" Q, Esc : Exit window.");
532  utility::LogInfo(" H : Print help message.");
533  utility::LogInfo(" P, PrtScn : Take a screen capture.");
534  utility::LogInfo(" D : Take a depth capture.");
535  utility::LogInfo(" O : Take a capture of current rendering settings.");
536  utility::LogInfo(" Alt + Enter : Toggle between full screen and windowed mode.");
537  utility::LogInfo("");
538  utility::LogInfo(" -- Render mode control --");
539  utility::LogInfo(" L : Turn on/off lighting.");
540  utility::LogInfo(" +/- : Increase/decrease point size.");
541  utility::LogInfo(" Ctrl + +/- : Increase/decrease width of geometry::LineSet.");
542  utility::LogInfo(" N : Turn on/off point cloud normal rendering.");
543  utility::LogInfo(" S : Toggle between mesh flat shading and smooth shading.");
544  utility::LogInfo(" W : Turn on/off mesh wireframe.");
545  utility::LogInfo(" B : Turn on/off back face rendering.");
546  utility::LogInfo(" I : Turn on/off image zoom in interpolation.");
547  utility::LogInfo(" T : Toggle among image render:");
548  utility::LogInfo(" no stretch / keep ratio / freely stretch.");
549  utility::LogInfo("");
550  utility::LogInfo(" -- Color control --");
551  utility::LogInfo(" 0..4,9 : Set point cloud color option.");
552  utility::LogInfo(" 0 - Default behavior, render point color.");
553  utility::LogInfo(" 1 - Render point color.");
554  utility::LogInfo(" 2 - x coordinate as color.");
555  utility::LogInfo(" 3 - y coordinate as color.");
556  utility::LogInfo(" 4 - z coordinate as color.");
557  utility::LogInfo(" 9 - normal as color.");
558  utility::LogInfo(" Ctrl + 0..4,9: Set mesh color option.");
559  utility::LogInfo(" 0 - Default behavior, render uniform gray color.");
560  utility::LogInfo(" 1 - Render point color.");
561  utility::LogInfo(" 2 - x coordinate as color.");
562  utility::LogInfo(" 3 - y coordinate as color.");
563  utility::LogInfo(" 4 - z coordinate as color.");
564  utility::LogInfo(" 9 - normal as color.");
565  utility::LogInfo(" Shift + 0..4 : Color map options.");
566  utility::LogInfo(" 0 - Gray scale color.");
567  utility::LogInfo(" 1 - JET color map.");
568  utility::LogInfo(" 2 - SUMMER color map.");
569  utility::LogInfo(" 3 - WINTER color map.");
570  utility::LogInfo(" 4 - HOT color map.");
571  utility::LogInfo("");
572  // clang-format on
573 }
574 } // namespace visualization
575 } // namespace cloudViewer
int width
int height
#define NULL
static std::shared_ptr< ccMesh > CreateCoordinateFrame(double size=1.0, const Eigen::Vector3d &origin=Eigen::Vector3d(0.0, 0.0, 0.0))
GLFW context, handled as a singleton.
Definition: Visualizer.cpp:27
int InitStatus() const
Get the glfwInit status / GLFW_PLATFORM initialized.
Definition: Visualizer.cpp:62
static std::shared_ptr< GLFWContext > GetInstance()
Get a shared instance of the GLFW context.
Definition: Visualizer.cpp:65
static void GLFWErrorCallback(int error, const char *description)
Definition: Visualizer.cpp:76
Defines rendering options for visualizer.
Definition: RenderOption.h:20
View controller for visualizer.
Definition: ViewControl.h:25
const ccBBox & GetBoundingBox() const
Definition: ViewControl.h:131
The main Visualizer class.
Definition: Visualizer.h:45
virtual bool UpdateGeometry(std::shared_ptr< const ccHObject > geometry_ptr=nullptr)
Function to update geometry.
Definition: Visualizer.cpp:466
virtual bool InitRenderOption()
Function to initialize RenderOption.
Definition: Visualizer.cpp:260
virtual void KeyPressCallback(GLFWwindow *window, int key, int scancode, int action, int mods)
std::function< bool(Visualizer *)> animation_callback_func_
Definition: Visualizer.h:260
std::vector< std::shared_ptr< glsl::GeometryRenderer > > utility_renderer_ptrs_
Definition: Visualizer.h:297
bool WaitEvents()
Function to process the event queue and return if the window is closed.
Definition: Visualizer.cpp:310
virtual bool InitViewControl()
Function to initialize ViewControl.
Definition: Visualizer.cpp:254
virtual void WindowRefreshCallback(GLFWwindow *window)
virtual bool InitOpenGL()
Function to initialize OpenGL.
std::shared_ptr< ccMesh > coordinate_frame_mesh_ptr_
Definition: Visualizer.h:304
virtual bool RemoveGeometry(std::shared_ptr< const ccHObject > geometry_ptr, bool reset_bounding_box=true)
Function to remove geometry from the scene.
Definition: Visualizer.cpp:433
virtual void UpdateRender()
Function to inform render needed to be updated.
Definition: Visualizer.cpp:479
virtual void MouseScrollCallback(GLFWwindow *window, double x, double y)
std::unordered_set< std::shared_ptr< const ccHObject > > geometry_ptrs_
Definition: Visualizer.h:287
virtual void MouseButtonCallback(GLFWwindow *window, int button, int action, int mods)
std::unique_ptr< RenderOption > render_option_ptr_
Definition: Visualizer.h:284
virtual void MouseMoveCallback(GLFWwindow *window, double x, double y)
void ResetViewPoint(bool reset_bounding_box=false)
Function to reset view point.
virtual bool AddGeometry(std::shared_ptr< const ccHObject > geometry_ptr, bool reset_bounding_box=true)
Function to add geometry to the scene and create corresponding shaders.
Definition: Visualizer.cpp:336
void DestroyVisualizerWindow()
Function to destroy a window.
Definition: Visualizer.cpp:235
void Run()
Function to activate the window.
Definition: Visualizer.cpp:289
virtual void SetFullScreen(bool fullscreen)
Functions to change between fullscreen and windowed modes.
Definition: Visualizer.cpp:483
void Close()
Function to to notify the window to be closed.
Definition: Visualizer.cpp:305
std::function< bool(Visualizer *)> animation_callback_func_in_loop_
Definition: Visualizer.h:265
void RegisterAnimationCallback(std::function< bool(Visualizer *)> callback_func)
Function to register a callback function for animation.
Definition: Visualizer.cpp:249
bool CreateVisualizerWindow(const std::string &window_name="CloudViewer", const int width=640, const int height=480, const int left=50, const int top=50, const bool visible=true)
Function to create a window and initialize GLFW.
Definition: Visualizer.cpp:95
std::shared_ptr< GLFWContext > glfw_context_
Shared GLFW context.
Definition: Visualizer.h:256
std::unordered_set< std::shared_ptr< glsl::GeometryRenderer > > geometry_renderer_ptrs_
Definition: Visualizer.h:291
std::unique_ptr< ViewControl > view_control_ptr_
Definition: Visualizer.h:281
ViewControl & GetViewControl()
Function to retrieve the associated ViewControl.
Definition: Visualizer.h:175
virtual void WindowResizeCallback(GLFWwindow *window, int w, int h)
std::vector< std::shared_ptr< const ccHObject > > utility_ptrs_
Definition: Visualizer.h:294
virtual void WindowCloseCallback(GLFWwindow *window)
Function to notify the window to be closed.
std::shared_ptr< glsl::CoordinateFrameRenderer > coordinate_frame_mesh_renderer_ptr_
Definition: Visualizer.h:306
#define LogWarning(...)
Definition: Logging.h:72
#define LogInfo(...)
Definition: Logging.h:81
#define LogError(...)
Definition: Logging.h:60
#define LogDebug(...)
Definition: Logging.h:90
int max(int a, int b)
Definition: cutil_math.h:48
static void error(char *msg)
Definition: lsd.c:159
@ CUSTOM_H_OBJECT
Definition: CVTypes.h:179
@ HALF_EDGE_MESH
Definition: CVTypes.h:150
@ MESH
Definition: CVTypes.h:105
@ TETRA_MESH
Definition: CVTypes.h:149
@ POINT_CLOUD
Definition: CVTypes.h:104
@ VOXEL_GRID
Definition: CVTypes.h:151
@ POLY_LINE
Definition: CVTypes.h:112
@ FACET
Definition: CVTypes.h:109
@ LINESET
Definition: CVTypes.h:152
@ RGBD_IMAGE
Definition: CVTypes.h:158
@ IMAGE2
Definition: CVTypes.h:156
@ POINT_OCTREE2
Definition: CVTypes.h:157
@ BBOX
Definition: CVTypes.h:154
@ ORIENTED_BBOX
Definition: CVTypes.h:155
Generic file read and write utility for python interface.