ACloudViewer  3.9.4
A Modern Library for 3D Data Processing
SceneWidget.h
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 
8 #pragma once
9 
10 #include <map>
11 
15 
16 class ccBBox;
17 class ccHObject;
18 namespace cloudViewer {
19 
20 namespace camera {
21 class PinholeCameraIntrinsic;
22 } // namespace camera
23 
24 namespace t {
25 namespace geometry {
26 class Geometry;
27 } // namespace geometry
28 } // namespace t
29 
30 namespace visualization {
31 namespace rendering {
32 class Camera;
33 class CameraManipulator;
34 class MatrixInteractorLogic;
35 class CloudViewerScene;
36 class View;
37 } // namespace rendering
38 } // namespace visualization
39 
40 namespace visualization {
41 namespace gui {
42 
43 class Label3D;
44 class Color;
45 
46 class SceneWidget : public Widget {
47  using Super = Widget;
48 
49 public:
51  public:
52  virtual ~MouseInteractor() = default;
53 
55  virtual void Mouse(const MouseEvent& e) = 0;
56  virtual void Key(const KeyEvent& e) = 0;
57  virtual bool Tick(const TickEvent& e) { return false; }
58  };
59 
60 public:
61  explicit SceneWidget();
62  ~SceneWidget() override;
63 
64  void SetFrame(const Rect& f) override;
65 
66  enum Controls {
69  FLY,
74  };
75  void SetViewControls(Controls mode);
76 
77  void SetupCamera(float verticalFoV,
78  const ccBBox& scene_bounds,
79  const Eigen::Vector3f& center_of_rotation);
80  void SetupCamera(const camera::PinholeCameraIntrinsic& intrinsic,
81  const Eigen::Matrix4d& extrinsic,
82  const ccBBox& scene_bounds);
83  void SetupCamera(const Eigen::Matrix3d& intrinsic,
84  const Eigen::Matrix4d& extrinsic,
85  int intrinsic_width_px,
86  int intrinsic_height_px,
87  const ccBBox& scene_bounds);
88  void LookAt(const Eigen::Vector3f& center,
89  const Eigen::Vector3f& eye,
90  const Eigen::Vector3f& up);
91 
92  void SetOnCameraChanged(
93  std::function<void(visualization::rendering::Camera*)>
94  on_cam_changed);
95 
96  Eigen::Vector3f GetCenterOfRotation() const;
97  void SetCenterOfRotation(const Eigen::Vector3f& center);
98 
103  std::function<void(const Eigen::Vector3f&)> on_dir_changed);
104 
105  void SetScene(std::shared_ptr<rendering::CloudViewerScene> scene);
106  std::shared_ptr<rendering::CloudViewerScene> GetScene() const;
107 
108  rendering::View* GetRenderView() const; // is nullptr if no scene
109 
112  void EnableSceneCaching(bool enable);
113 
116  void ForceRedraw();
117  enum class Quality { FAST, BEST };
118  void SetRenderQuality(Quality level);
119  Quality GetRenderQuality() const;
120 
121  enum class CameraPreset {
122  PLUS_X, // at (X, 0, 0), looking (-1, 0, 0)
123  PLUS_Y, // at (0, Y, 0), looking (0, -1, 0)
124  PLUS_Z // at (0, 0, Z), looking (0, 0, 1) [default OpenGL camera]
125  };
126  void GoToCameraPreset(CameraPreset preset);
127 
129  std::string name;
130  const ccHObject* geometry = nullptr;
132 
133  PickableGeometry(const std::string& n, const ccHObject* g)
134  : name(n), geometry(g) {}
135 
136  PickableGeometry(const std::string& n, const t::geometry::Geometry* t)
137  : name(n), tgeometry(t) {}
138 
142  PickableGeometry(const std::string& n,
143  const ccHObject* g,
144  const t::geometry::Geometry* t)
145  : name(n), geometry(g), tgeometry(t) {}
146  };
147 
148  void SetSunInteractorEnabled(bool enable);
149 
150  void SetPickableGeometry(const std::vector<PickableGeometry>& geometry);
151  void SetPickablePointSize(int px);
152  void SetOnPointsPicked(
153  std::function<void(
154  const std::map<
155  std::string,
156  std::vector<std::pair<size_t, Eigen::Vector3d>>>&,
157  int)> on_picked);
158  void SetOnStartedPolygonPicking(std::function<void()> on_poly_pick);
159  enum class PolygonPickAction { CANCEL = 0, SELECT };
160  void DoPolygonPick(PolygonPickAction action);
161 
162  // 3D Labels
163  std::shared_ptr<Label3D> AddLabel(const Eigen::Vector3f& pos,
164  const char* text);
165  void RemoveLabel(std::shared_ptr<Label3D> label);
166  void ClearLabels();
167 
168  Widget::DrawResult Draw(const DrawContext& context) override;
169 
170  Widget::EventResult Mouse(const MouseEvent& e) override;
171  Widget::EventResult Key(const KeyEvent& e) override;
172  Widget::DrawResult Tick(const TickEvent& e) override;
173 
174 private:
175  visualization::rendering::Camera* GetCamera() const;
176 
177 private:
178  struct Impl;
179  std::unique_ptr<Impl> impl_;
180 };
181 
182 } // namespace gui
183 } // namespace visualization
184 } // namespace cloudViewer
Bounding box structure.
Definition: ecvBBox.h:25
Hierarchical CLOUDVIEWER Object.
Definition: ecvHObject.h:25
Contains the pinhole camera intrinsic parameters.
The base geometry class.
Definition: Geometry.h:23
virtual rendering::MatrixInteractorLogic & GetMatrixInteractor()=0
void SetOnSunDirectionChanged(std::function< void(const Eigen::Vector3f &)> on_dir_changed)
std::shared_ptr< Label3D > AddLabel(const Eigen::Vector3f &pos, const char *text)
std::shared_ptr< rendering::CloudViewerScene > GetScene() const
Widget::EventResult Mouse(const MouseEvent &e) override
void SetOnPointsPicked(std::function< void(const std::map< std::string, std::vector< std::pair< size_t, Eigen::Vector3d >>> &, int)> on_picked)
void SetOnCameraChanged(std::function< void(visualization::rendering::Camera *)> on_cam_changed)
void SetCenterOfRotation(const Eigen::Vector3f &center)
Widget::DrawResult Draw(const DrawContext &context) override
void SetScene(std::shared_ptr< rendering::CloudViewerScene > scene)
void DoPolygonPick(PolygonPickAction action)
void SetFrame(const Rect &f) override
void SetPickableGeometry(const std::vector< PickableGeometry > &geometry)
void RemoveLabel(std::shared_ptr< Label3D > label)
Widget::DrawResult Tick(const TickEvent &e) override
void SetOnStartedPolygonPicking(std::function< void()> on_poly_pick)
void SetupCamera(float verticalFoV, const ccBBox &scene_bounds, const Eigen::Vector3f &center_of_rotation)
void LookAt(const Eigen::Vector3f &center, const Eigen::Vector3f &eye, const Eigen::Vector3f &up)
Widget::EventResult Key(const KeyEvent &e) override
ImGuiContext * context
Definition: Window.cpp:76
::ccHObject Geometry
Definition: Geometry.h:18
Generic file read and write utility for python interface.
PickableGeometry(const std::string &n, const ccHObject *g)
Definition: SceneWidget.h:133
PickableGeometry(const std::string &n, const ccHObject *g, const t::geometry::Geometry *t)
Definition: SceneWidget.h:142
PickableGeometry(const std::string &n, const t::geometry::Geometry *t)
Definition: SceneWidget.h:136