| // Copyright 2018 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef CHROME_BROWSER_VR_ELEMENTS_REPOSITIONER_H_ |
| #define CHROME_BROWSER_VR_ELEMENTS_REPOSITIONER_H_ |
| |
| #include <sstream> |
| |
| #include "base/macros.h" |
| #include "chrome/browser/vr/elements/ui_element.h" |
| #include "chrome/browser/vr/vr_ui_export.h" |
| #include "ui/gfx/transform.h" |
| |
| namespace vr { |
| |
| // A repositioner adjusts the position of its children by rotation. The |
| // reposition is driven by controller. It maintains a transform and updates it |
| // when enabled as either the head or the controller move. In a nutshell, it |
| // rotates the elements per the angular change in the controller orientation, |
| // adjusting the up vector of the content so that it aligns with the head's up |
| // vector. As the window is being repositioned, we rotate it so that it remains |
| // pointing upward. |
| class VR_UI_EXPORT Repositioner : public UiElement { |
| public: |
| Repositioner(); |
| ~Repositioner() override; |
| |
| void set_laser_direction(const gfx::Vector3dF& laser_direction) { |
| laser_direction_ = laser_direction; |
| } |
| |
| void SetEnabled(bool enabled); |
| void Reset(); |
| |
| // This method returns true if the user has repositioned far enough that we |
| // should consider it an intentional drag (and the UI may want to respond |
| // different if this has happened). |
| bool HasMovedBeyondThreshold() const { return has_moved_beyond_threshold_; } |
| |
| bool ShouldUpdateWorldSpaceTransform( |
| bool parent_transform_changed) const override; |
| |
| private: |
| gfx::Transform LocalTransform() const override; |
| gfx::Transform GetTargetLocalTransform() const override; |
| void UpdateTransform(const gfx::Transform& head_pose); |
| bool OnBeginFrame(const gfx::Transform& head_pose) override; |
| #ifndef NDEBUG |
| void DumpGeometry(std::ostringstream* os) const override; |
| #endif |
| |
| bool enabled_ = false; |
| bool has_moved_beyond_threshold_ = false; |
| bool reset_yaw_ = false; |
| gfx::Transform transform_; |
| gfx::Vector3dF laser_direction_; |
| |
| gfx::Transform initial_transform_; |
| gfx::Vector3dF initial_laser_direction_; |
| |
| DISALLOW_COPY_AND_ASSIGN(Repositioner); |
| }; |
| |
| } // namespace vr |
| |
| #endif // CHROME_BROWSER_VR_ELEMENTS_REPOSITIONER_H_ |