Open3D (C++ API)  0.15.1
Visualizer.h
Go to the documentation of this file.
1// ----------------------------------------------------------------------------
2// - Open3D: www.open3d.org -
3// ----------------------------------------------------------------------------
4// The MIT License (MIT)
5//
6// Copyright (c) 2018-2021 www.open3d.org
7//
8// Permission is hereby granted, free of charge, to any person obtaining a copy
9// of this software and associated documentation files (the "Software"), to deal
10// in the Software without restriction, including without limitation the rights
11// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
12// copies of the Software, and to permit persons to whom the Software is
13// furnished to do so, subject to the following conditions:
14//
15// The above copyright notice and this permission notice shall be included in
16// all copies or substantial portions of the Software.
17//
18// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
21// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
22// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
23// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
24// IN THE SOFTWARE.
25// ----------------------------------------------------------------------------
26
27#pragma once
28
29// Avoid warning caused by redefinition of APIENTRY macro
30// defined also in glfw3.h
31#ifdef _WIN32
32#include <windows.h>
33#endif
34
35#include <GL/glew.h>
36#include <GLFW/glfw3.h>
37
38#include <Eigen/Core>
39#include <memory>
40#include <string>
41#include <unordered_map>
42#include <unordered_set>
43
49
50namespace open3d {
51
52namespace geometry {
53class TriangleMesh;
54class Image;
55} // namespace geometry
56
57namespace visualization {
58
63public:
64 struct MouseControl {
65 public:
68 bool is_control_key_down = false;
69 bool is_shift_key_down = false;
70 bool is_alt_key_down = false;
71 bool is_super_key_down = false;
72 double mouse_position_x = 0.0;
73 double mouse_position_y = 0.0;
74 };
75
76public:
77 Visualizer();
78 virtual ~Visualizer();
79 Visualizer(Visualizer &&) = delete;
80 Visualizer(const Visualizer &) = delete;
81 Visualizer &operator=(const Visualizer &) = delete;
82
83public:
94 bool CreateVisualizerWindow(const std::string &window_name = "Open3D",
95 const int width = 640,
96 const int height = 480,
97 const int left = 50,
98 const int top = 50,
99 const bool visible = true);
100
105
112 std::function<bool(Visualizer *)> callback_func);
113
117 void Run();
118
120 void Close();
121
127 bool WaitEvents();
128
134 bool PollEvents();
135
149 virtual bool AddGeometry(
150 std::shared_ptr<const geometry::Geometry> geometry_ptr,
151 bool reset_bounding_box = true);
152
162 virtual bool RemoveGeometry(
163 std::shared_ptr<const geometry::Geometry> geometry_ptr,
164 bool reset_bounding_box = true);
165
169 virtual bool ClearGeometries();
170
177 virtual bool UpdateGeometry(
178 std::shared_ptr<const geometry::Geometry> geometry_ptr = nullptr);
179 virtual bool HasGeometry() const;
180
182 virtual void UpdateRender();
183
185 virtual void SetFullScreen(bool fullscreen);
186 virtual void ToggleFullScreen();
187 virtual bool IsFullScreen();
188
189 virtual void PrintVisualizerHelp();
190 virtual void UpdateWindowTitle();
191 virtual void BuildUtilities();
192
200 std::shared_ptr<geometry::Image> CaptureScreenFloatBuffer(
201 bool do_render = true);
206 void CaptureScreenImage(const std::string &filename = "",
207 bool do_render = true);
211 std::shared_ptr<geometry::Image> CaptureDepthFloatBuffer(
212 bool do_render = true);
218 void CaptureDepthImage(const std::string &filename = "",
219 bool do_render = true,
220 double depth_scale = 1000.0);
227 void CaptureDepthPointCloud(const std::string &filename = "",
228 bool do_render = true,
229 bool convert_to_world_coordinate = false);
230 void CaptureRenderOption(const std::string &filename = "");
232 void ResetViewPoint(bool reset_bounding_box = false);
233
234 const std::string &GetWindowName() const { return window_name_; }
235
236protected:
238 virtual bool InitOpenGL();
239
241 virtual bool InitViewControl();
242
244 virtual bool InitRenderOption();
245
249 virtual void Render(bool render_screen = false);
250
252
254
255 // callback functions
256 virtual void WindowRefreshCallback(GLFWwindow *window);
257 virtual void WindowResizeCallback(GLFWwindow *window, int w, int h);
258 virtual void MouseMoveCallback(GLFWwindow *window, double x, double y);
259 virtual void MouseScrollCallback(GLFWwindow *window, double x, double y);
260 virtual void MouseButtonCallback(GLFWwindow *window,
261 int button,
262 int action,
263 int mods);
264 virtual void KeyPressCallback(
265 GLFWwindow *window, int key, int scancode, int action, int mods);
267 virtual void WindowCloseCallback(GLFWwindow *window);
268
269protected:
270 // window
271 GLFWwindow *window_ = NULL;
272 std::string window_name_ = "Open3D";
273 Eigen::Vector2i saved_window_size_ = Eigen::Vector2i::Zero();
274 Eigen::Vector2i saved_window_pos_ = Eigen::Vector2i::Zero();
275 std::function<bool(Visualizer *)> animation_callback_func_ = nullptr;
276 // Auxiliary internal backup of the callback function.
277 // It copies animation_callback_func_ in each PollEvent() or WaitEvent()
278 // so that even if user calls RegisterAnimationCallback() within the
279 // callback function it is still safe.
281 nullptr;
282
283 // control
286 bool is_initialized_ = false;
287 GLuint vao_id_ = 0;
288
289 // render targets for "capture_screen_float_buffer" and
290 // "capture_screen_image" in offscreen render mode
291 GLuint render_fbo_ = 0;
292 GLuint render_rgb_tex_ = 0;
294
295 // view control
296 std::unique_ptr<ViewControl> view_control_ptr_;
297
298 // rendering properties
299 std::unique_ptr<RenderOption> render_option_ptr_;
300
301 // geometry to be rendered
302 std::unordered_set<std::shared_ptr<const geometry::Geometry>>
304
305 // geometry renderers
306 std::unordered_set<std::shared_ptr<glsl::GeometryRenderer>>
308
309 // utilities owned by the Visualizer
310 std::vector<std::shared_ptr<const geometry::Geometry>> utility_ptrs_;
311
312 // utility renderers
313 std::vector<std::shared_ptr<glsl::GeometryRenderer>> utility_renderer_ptrs_;
314 // map's key is the renderer for which the RenderOption applies
315 // (should be something in utility_renderer_ptrs_)
316 std::unordered_map<std::shared_ptr<glsl::GeometryRenderer>, RenderOption>
318
319 // coordinate frame
320 std::shared_ptr<geometry::TriangleMesh> coordinate_frame_mesh_ptr_;
321 std::shared_ptr<glsl::CoordinateFrameRenderer>
323
324#ifdef __APPLE__
325 // MacBook with Retina display does not have a 1:1 mapping from screen
326 // coordinates to pixels. Thus we hack it back.
327 // http://www.glfw.org/faq.html#why-is-my-output-in-the-lower-left-corner-of-the-window
328 double pixel_to_screen_coordinate_ = 1.0;
329#endif //__APPLE__
330};
331
332} // namespace visualization
333} // namespace open3d
Defines rendering options for visualizer.
Definition: RenderOption.h:39
View controller for visualizer.
Definition: ViewControl.h:41
The main Visualizer class.
Definition: Visualizer.h:62
void CaptureRenderOption(const std::string &filename="")
Definition: VisualizerRender.cpp:499
bool CreateVisualizerWindow(const std::string &window_name="Open3D", 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:90
virtual void BuildUtilities()
Definition: Visualizer.cpp:250
std::unique_ptr< RenderOption > render_option_ptr_
Definition: Visualizer.h:299
virtual void SetFullScreen(bool fullscreen)
Functions to change between fullscreen and windowed modes.
Definition: Visualizer.cpp:462
virtual bool ClearGeometries()
Definition: Visualizer.cpp:434
bool is_initialized_
Definition: Visualizer.h:286
std::unique_ptr< ViewControl > view_control_ptr_
Definition: Visualizer.h:296
GLuint vao_id_
Definition: Visualizer.h:287
GLuint render_fbo_
Definition: Visualizer.h:291
bool PollEvents()
Definition: Visualizer.cpp:302
void CaptureDepthImage(const std::string &filename="", bool do_render=true, double depth_scale=1000.0)
Definition: VisualizerRender.cpp:334
GLuint render_depth_stencil_rbo_
Definition: Visualizer.h:293
std::vector< std::shared_ptr< const geometry::Geometry > > utility_ptrs_
Definition: Visualizer.h:310
virtual void UpdateRender()
Function to inform render needed to be updated.
Definition: Visualizer.cpp:458
std::function< bool(Visualizer *)> animation_callback_func_in_loop_
Definition: Visualizer.h:280
Eigen::Vector2i saved_window_pos_
Definition: Visualizer.h:274
void CaptureDepthPointCloud(const std::string &filename="", bool do_render=true, bool convert_to_world_coordinate=false)
Function to capture and save local point cloud.
Definition: VisualizerRender.cpp:417
virtual bool InitOpenGL()
Function to initialize OpenGL.
Definition: VisualizerRender.cpp:42
virtual bool IsFullScreen()
Definition: Visualizer.cpp:490
ViewControl & GetViewControl()
Function to retrieve the associated ViewControl.
Definition: Visualizer.h:194
Visualizer(const Visualizer &)=delete
void CaptureScreenImage(const std::string &filename="", bool do_render=true)
Function to capture and save a screen image.
Definition: VisualizerRender.cpp:216
void Run()
Function to activate the window.
Definition: Visualizer.cpp:268
virtual bool UpdateGeometry(std::shared_ptr< const geometry::Geometry > geometry_ptr=nullptr)
Function to update geometry.
Definition: Visualizer.cpp:444
std::shared_ptr< glsl::CoordinateFrameRenderer > coordinate_frame_mesh_renderer_ptr_
Definition: Visualizer.h:322
virtual bool AddGeometry(std::shared_ptr< const geometry::Geometry > geometry_ptr, bool reset_bounding_box=true)
Function to add geometry to the scene and create corresponding shaders.
Definition: Visualizer.cpp:315
Visualizer(Visualizer &&)=delete
virtual void MouseMoveCallback(GLFWwindow *window, double x, double y)
Definition: VisualizerCallback.cpp:44
virtual void Render(bool render_screen=false)
Definition: VisualizerRender.cpp:72
virtual void WindowResizeCallback(GLFWwindow *window, int w, int h)
Definition: VisualizerCallback.cpp:39
std::unordered_map< std::shared_ptr< glsl::GeometryRenderer >, RenderOption > utility_renderer_opts_
Definition: Visualizer.h:317
virtual void WindowCloseCallback(GLFWwindow *window)
Function to notify the window to be closed.
Definition: VisualizerCallback.cpp:365
std::shared_ptr< geometry::Image > CaptureDepthFloatBuffer(bool do_render=true)
Definition: VisualizerRender.cpp:270
virtual bool InitViewControl()
Function to initialize ViewControl.
Definition: Visualizer.cpp:233
bool WaitEvents()
Function to process the event queue and return if the window is closed.
Definition: Visualizer.cpp:289
virtual bool InitRenderOption()
Function to initialize RenderOption.
Definition: Visualizer.cpp:239
std::unordered_set< std::shared_ptr< const geometry::Geometry > > geometry_ptrs_
Definition: Visualizer.h:303
std::string window_name_
Definition: Visualizer.h:272
virtual void MouseButtonCallback(GLFWwindow *window, int button, int action, int mods)
Definition: VisualizerCallback.cpp:87
RenderOption & GetRenderOption()
Function to retrieve the associated RenderOption.
Definition: Visualizer.h:196
Visualizer & operator=(const Visualizer &)=delete
void CopyViewStatusFromClipboard()
Definition: VisualizerRender.cpp:162
virtual ~Visualizer()
Definition: Visualizer.cpp:83
void DestroyVisualizerWindow()
Function to destroy a window.
Definition: Visualizer.cpp:222
std::vector< std::shared_ptr< glsl::GeometryRenderer > > utility_renderer_ptrs_
Definition: Visualizer.h:313
virtual bool RemoveGeometry(std::shared_ptr< const geometry::Geometry > geometry_ptr, bool reset_bounding_box=true)
Function to remove geometry from the scene.
Definition: Visualizer.cpp:410
virtual void MouseScrollCallback(GLFWwindow *window, double x, double y)
Definition: VisualizerCallback.cpp:82
const std::string & GetWindowName() const
Definition: Visualizer.h:234
GLuint render_rgb_tex_
Definition: Visualizer.h:292
virtual void UpdateWindowTitle()
Definition: Visualizer.cpp:244
void RegisterAnimationCallback(std::function< bool(Visualizer *)> callback_func)
Function to register a callback function for animation.
Definition: Visualizer.cpp:228
std::function< bool(Visualizer *)> animation_callback_func_
Definition: Visualizer.h:275
virtual void WindowRefreshCallback(GLFWwindow *window)
Definition: VisualizerCallback.cpp:32
Eigen::Vector2i saved_window_size_
Definition: Visualizer.h:273
virtual void ToggleFullScreen()
Definition: Visualizer.cpp:482
MouseControl mouse_control_
Definition: Visualizer.h:284
GLFWwindow * window_
Definition: Visualizer.h:271
virtual void PrintVisualizerHelp()
Definition: Visualizer.cpp:494
void Close()
Function to to notify the window to be closed.
Definition: Visualizer.cpp:284
std::shared_ptr< geometry::TriangleMesh > coordinate_frame_mesh_ptr_
Definition: Visualizer.h:320
std::shared_ptr< geometry::Image > CaptureScreenFloatBuffer(bool do_render=true)
Function to capture screen and store RGB in a float buffer.
Definition: VisualizerRender.cpp:179
virtual bool HasGeometry() const
Definition: Visualizer.cpp:460
bool is_redraw_required_
Definition: Visualizer.h:285
Visualizer()
Definition: Visualizer.cpp:81
virtual void KeyPressCallback(GLFWwindow *window, int key, int scancode, int action, int mods)
Definition: VisualizerCallback.cpp:121
std::unordered_set< std::shared_ptr< glsl::GeometryRenderer > > geometry_renderer_ptrs_
Definition: Visualizer.h:307
void CopyViewStatusToClipboard()
Definition: VisualizerRender.cpp:148
void ResetViewPoint(bool reset_bounding_box=false)
Function to reset view point.
Definition: VisualizerRender.cpp:129
int width
Definition: FilePCD.cpp:71
int height
Definition: FilePCD.cpp:72
Definition: PinholeCameraIntrinsic.cpp:35
double mouse_position_x
Definition: Visualizer.h:72
bool is_control_key_down
Definition: Visualizer.h:68
bool is_mouse_left_button_down
Definition: Visualizer.h:66
double mouse_position_y
Definition: Visualizer.h:73
bool is_mouse_middle_button_down
Definition: Visualizer.h:67
bool is_super_key_down
Definition: Visualizer.h:71
bool is_shift_key_down
Definition: Visualizer.h:69
bool is_alt_key_down
Definition: Visualizer.h:70