Index: chrome/browser/android/vr_shell/ui_scene_manager.cc |
diff --git a/chrome/browser/android/vr_shell/ui_scene_manager.cc b/chrome/browser/android/vr_shell/ui_scene_manager.cc |
index 29434a3931c9b8d6cd332c116915be46fc4428a8..4cbeae41985937e6e5b8f066a9e8f03afad5c1d7 100644 |
--- a/chrome/browser/android/vr_shell/ui_scene_manager.cc |
+++ b/chrome/browser/android/vr_shell/ui_scene_manager.cc |
@@ -19,16 +19,26 @@ namespace { |
static constexpr int kWarningTimeoutSeconds = 30; |
static constexpr float kWarningDistance = 0.7; |
static constexpr float kWarningAngleRadians = 16.3 * M_PI / 180.0; |
- |
static constexpr float kPermanentWarningHeight = 0.226; |
static constexpr float kPermanentWarningWidth = 0.078; |
static constexpr float kTransientWarningHeight = 0.512; |
static constexpr float kTransientWarningWidth = 0.160; |
-static constexpr float kContentHeight = 2.4; |
-static constexpr float kContentWidth = 1.6; |
+static constexpr float kContentWidth = 2.4; |
+static constexpr float kContentHeight = 1.6; |
static constexpr float kContentDistance = 2.5; |
static constexpr float kContentVerticalOffset = -0.26; |
+static constexpr float kBackplaneSize = 1000.0; |
+static constexpr float kBackgroundDistanceMultiplier = 1.414; |
+ |
+static constexpr float kSceneSize = 25.0; |
+static constexpr float kSceneHeight = 4.0; |
+static constexpr int kFloorGridlineCount = 40; |
+static constexpr vr::Colorf kBackgroundHorizonColor = {0.57, 0.57, 0.57, 1.0}; |
+static constexpr vr::Colorf kBackgroundCenterColor = {0.48, 0.48, 0.48, 1.0}; |
+ |
+// Tiny distance to offset textures that should appear in the same plane. |
+static constexpr float kTextureOffset = 0.01; |
} // namespace |
@@ -36,15 +46,20 @@ UiSceneManager::UiSceneManager(UiScene* scene) |
: scene_(scene), weak_ptr_factory_(this) { |
std::unique_ptr<UiElement> element; |
- // For now, use an ID range that does not conflict with the HTML UI. |
- int id = 1000; |
+ CreateBackground(); |
+ CreateContentQuad(); |
+ CreateSecurityWarnings(); |
+} |
+ |
+UiSceneManager::~UiSceneManager() {} |
+ |
+void UiSceneManager::CreateSecurityWarnings() { |
+ std::unique_ptr<UiElement> element; |
- // Permanent WebVR security warning. |
// TODO(mthiesse): Programatically compute the proper texture size for these |
// textured UI elements. |
element = base::MakeUnique<PermanentSecurityWarning>(512); |
- element->id = id++; |
- element->name = "Permanent security warning"; |
+ element->id = AllocateId(); |
element->fill = vr_shell::Fill::NONE; |
element->size = {kPermanentWarningWidth, kPermanentWarningHeight, 1}; |
element->scale = {kWarningDistance, kWarningDistance, 1}; |
@@ -57,10 +72,8 @@ UiSceneManager::UiSceneManager(UiScene* scene) |
permanent_security_warning_ = element.get(); |
scene_->AddUiElement(std::move(element)); |
- // Transient WebVR security warning. |
element = base::MakeUnique<TransientSecurityWarning>(1024); |
- element->id = id++; |
- element->name = "Transient security warning"; |
+ element->id = AllocateId(); |
element->fill = vr_shell::Fill::NONE; |
element->size = {kTransientWarningWidth, kTransientWarningHeight, 1}; |
element->scale = {kWarningDistance, kWarningDistance, 1}; |
@@ -70,20 +83,86 @@ UiSceneManager::UiSceneManager(UiScene* scene) |
element->lock_to_fov = true; |
transient_security_warning_ = element.get(); |
scene_->AddUiElement(std::move(element)); |
+} |
+ |
+void UiSceneManager::CreateContentQuad() { |
+ std::unique_ptr<UiElement> element; |
- // Main web content quad. |
element = base::MakeUnique<UiElement>(); |
- element->id = id++; |
- element->name = "Content"; |
+ element->id = AllocateId(); |
element->fill = vr_shell::Fill::CONTENT; |
element->size = {kContentWidth, kContentHeight, 1}; |
element->translation = {0, kContentVerticalOffset, -kContentDistance}; |
element->visible = false; |
main_content_ = element.get(); |
+ browser_ui_elements_.push_back(element.get()); |
+ scene_->AddUiElement(std::move(element)); |
+ |
+ // Place an invisible but hittable plane behind the content quad, to keep the |
+ // reticle roughly planar with the content if near content. |
+ element = base::MakeUnique<UiElement>(); |
+ element->id = AllocateId(); |
+ element->fill = vr_shell::Fill::NONE; |
+ element->size = {kBackplaneSize, kBackplaneSize, 1.0}; |
+ element->translation = {0.0, 0.0, -kTextureOffset}; |
+ element->parent_id = main_content_->id; |
+ browser_ui_elements_.push_back(element.get()); |
scene_->AddUiElement(std::move(element)); |
+ |
+ // Limit reticle distance to a sphere based on content distance. |
+ scene_->SetBackgroundDistance(main_content_->translation.z() * |
+ -kBackgroundDistanceMultiplier); |
} |
-UiSceneManager::~UiSceneManager() {} |
+void UiSceneManager::CreateBackground() { |
+ std::unique_ptr<UiElement> element; |
+ |
+ // Floor. |
+ element = base::MakeUnique<UiElement>(); |
+ element->id = AllocateId(); |
+ element->size = {kSceneSize, kSceneSize, 1.0}; |
+ element->translation = {0.0, -kSceneHeight / 2, 0.0}; |
+ element->rotation = {1.0, 0.0, 0.0, -M_PI / 2.0}; |
+ element->fill = vr_shell::Fill::OPAQUE_GRADIENT; |
+ element->edge_color = kBackgroundHorizonColor; |
+ element->center_color = kBackgroundCenterColor; |
+ element->draw_phase = 0; |
+ browser_ui_elements_.push_back(element.get()); |
+ scene_->AddUiElement(std::move(element)); |
+ |
+ // Ceiling. |
+ element = base::MakeUnique<UiElement>(); |
+ element->id = AllocateId(); |
+ element->fill = vr_shell::Fill::OPAQUE_GRADIENT; |
+ element->size = {kSceneSize, kSceneSize, 1.0}; |
+ element->translation = {0.0, kSceneHeight / 2, 0.0}; |
+ element->rotation = {1.0, 0.0, 0.0, M_PI / 2}; |
+ element->fill = vr_shell::Fill::OPAQUE_GRADIENT; |
+ element->edge_color = kBackgroundHorizonColor; |
+ element->center_color = kBackgroundCenterColor; |
+ element->draw_phase = 0; |
+ browser_ui_elements_.push_back(element.get()); |
+ scene_->AddUiElement(std::move(element)); |
+ |
+ // Floor grid. |
+ element = base::MakeUnique<UiElement>(); |
+ element->id = AllocateId(); |
+ element->fill = vr_shell::Fill::GRID_GRADIENT; |
+ element->size = {kSceneSize, kSceneSize, 1.0}; |
+ element->translation = {0.0, -kSceneHeight / 2 + kTextureOffset, 0.0}; |
+ element->rotation = {1.0, 0.0, 0.0, -M_PI / 2}; |
+ element->fill = vr_shell::Fill::GRID_GRADIENT; |
+ element->center_color = kBackgroundHorizonColor; |
+ vr::Colorf edge_color = kBackgroundHorizonColor; |
+ edge_color.a = 0.0; |
+ element->edge_color = edge_color; |
+ element->gridline_count = kFloorGridlineCount; |
+ element->draw_phase = 0; |
+ browser_ui_elements_.push_back(element.get()); |
+ scene_->AddUiElement(std::move(element)); |
+ |
+ scene_->SetBackgroundColor(kBackgroundHorizonColor); |
+} |
base::WeakPtr<UiSceneManager> UiSceneManager::GetWeakPtr() { |
return weak_ptr_factory_.GetWeakPtr(); |
@@ -91,7 +170,12 @@ base::WeakPtr<UiSceneManager> UiSceneManager::GetWeakPtr() { |
void UiSceneManager::SetWebVRMode(bool web_vr) { |
web_vr_mode_ = web_vr; |
- main_content_->visible = !web_vr_mode_; |
+ |
+ // Make all VR scene UI elements visible if not in WebVR. |
+ for (UiElement* element : browser_ui_elements_) { |
+ element->visible = !web_vr_mode_; |
+ } |
+ |
ConfigureSecurityWarnings(); |
} |
@@ -117,4 +201,8 @@ void UiSceneManager::OnSecurityWarningTimer() { |
transient_security_warning_->visible = false; |
} |
+int UiSceneManager::AllocateId() { |
+ return next_available_id_++; |
+} |
+ |
} // namespace vr_shell |