// ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- // Copyright (c) 2018-2023 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- #pragma once #include #include "open3d/visualization/gui/Widget.h" #include "open3d/visualization/rendering/RendererHandle.h" #include "open3d/visualization/rendering/View.h" namespace open3d { namespace camera { class PinholeCameraIntrinsic; } // namespace camera namespace geometry { class AxisAlignedBoundingBox; class Geometry3D; } // namespace geometry namespace t { namespace geometry { class Geometry; } // namespace geometry } // namespace t namespace visualization { namespace rendering { class Camera; class CameraManipulator; class MatrixInteractorLogic; class Open3DScene; class View; } // namespace rendering } // namespace visualization namespace visualization { namespace gui { class Label3D; class Color; class SceneWidget : public Widget { using Super = Widget; public: class MouseInteractor { public: virtual ~MouseInteractor() = default; virtual rendering::MatrixInteractorLogic& GetMatrixInteractor() = 0; virtual void Mouse(const MouseEvent& e) = 0; virtual void Key(const KeyEvent& e) = 0; virtual bool Tick(const TickEvent& e) { return false; } }; public: explicit SceneWidget(); ~SceneWidget() override; void SetFrame(const Rect& f) override; enum Controls { ROTATE_CAMERA, ROTATE_CAMERA_SPHERE, FLY, ROTATE_SUN, ROTATE_IBL, ROTATE_MODEL, PICK_POINTS }; void SetViewControls(Controls mode); void SetupCamera(float verticalFoV, const geometry::AxisAlignedBoundingBox& scene_bounds, const Eigen::Vector3f& center_of_rotation); void SetupCamera(const camera::PinholeCameraIntrinsic& intrinsic, const Eigen::Matrix4d& extrinsic, const geometry::AxisAlignedBoundingBox& scene_bounds); void SetupCamera(const Eigen::Matrix3d& intrinsic, const Eigen::Matrix4d& extrinsic, int intrinsic_width_px, int intrinsic_height_px, const geometry::AxisAlignedBoundingBox& scene_bounds); void LookAt(const Eigen::Vector3f& center, const Eigen::Vector3f& eye, const Eigen::Vector3f& up); void SetOnCameraChanged( std::function on_cam_changed); Eigen::Vector3f GetCenterOfRotation() const; void SetCenterOfRotation(const Eigen::Vector3f& center); /// Enables changing the directional light with the mouse. /// SceneWidget will update the light's direction, so onDirChanged is /// only needed if other things need to be updated (like a UI). void SetOnSunDirectionChanged( std::function on_dir_changed); void SetScene(std::shared_ptr scene); std::shared_ptr GetScene() const; rendering::View* GetRenderView() const; // is nullptr if no scene /// Enable (or disable) caching of scene to improve UI responsiveness when /// dealing with large scenes (especially point clouds) void EnableSceneCaching(bool enable); /// Forces the scene to redraw regardless of Renderer caching /// settings. void ForceRedraw(); enum class Quality { FAST, BEST }; void SetRenderQuality(Quality level); Quality GetRenderQuality() const; enum class CameraPreset { PLUS_X, // at (X, 0, 0), looking (-1, 0, 0) PLUS_Y, // at (0, Y, 0), looking (0, -1, 0) PLUS_Z // at (0, 0, Z), looking (0, 0, 1) [default OpenGL camera] }; void GoToCameraPreset(CameraPreset preset); struct PickableGeometry { std::string name; const geometry::Geometry3D* geometry = nullptr; const t::geometry::Geometry* tgeometry = nullptr; PickableGeometry(const std::string& n, const geometry::Geometry3D* g) : name(n), geometry(g) {} PickableGeometry(const std::string& n, const t::geometry::Geometry* t) : name(n), tgeometry(t) {} /// This is for programmatic use when you don't want to know if you /// have a geometry or a t::geometry; exactly one of g and t should be /// non-null; the other should be nullptr. PickableGeometry(const std::string& n, const geometry::Geometry3D* g, const t::geometry::Geometry* t) : name(n), geometry(g), tgeometry(t) {} }; void SetSunInteractorEnabled(bool enable); void SetPickableGeometry(const std::vector& geometry); void SetPickablePointSize(int px); void SetOnPointsPicked( std::function>>&, int)> on_picked); void SetOnStartedPolygonPicking(std::function on_poly_pick); enum class PolygonPickAction { CANCEL = 0, SELECT }; void DoPolygonPick(PolygonPickAction action); // 3D Labels std::shared_ptr AddLabel(const Eigen::Vector3f& pos, const char* text); void RemoveLabel(std::shared_ptr label); void ClearLabels(); Widget::DrawResult Draw(const DrawContext& context) override; Widget::EventResult Mouse(const MouseEvent& e) override; Widget::EventResult Key(const KeyEvent& e) override; Widget::DrawResult Tick(const TickEvent& e) override; private: visualization::rendering::Camera* GetCamera() const; private: struct Impl; std::unique_ptr impl_; }; } // namespace gui } // namespace visualization } // namespace open3d