blob: 50391f82c06222468459054dc5d2ac10d6ca8f54 [file] [log] [blame]
// Copyright 2017 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.
#include "device/vr/vr_device_base.h"
#include "device/vr/vr_device_provider.h"
#include "device/vr/vr_display_impl.h"
namespace device {
unsigned int VRDeviceBase::next_id_ = 1;
VRDeviceBase::VRDeviceBase() : id_(next_id_) {
// Prevent wraparound. Devices with this ID will be treated as invalid.
if (next_id_ != VR_DEVICE_LAST_ID)
next_id_++;
}
VRDeviceBase::~VRDeviceBase() = default;
unsigned int VRDeviceBase::GetId() const {
return id_;
}
void VRDeviceBase::PauseTracking() {}
void VRDeviceBase::ResumeTracking() {}
void VRDeviceBase::Blur() {
for (VRDisplayImpl* display : displays_)
display->OnBlur();
}
void VRDeviceBase::Focus() {
for (VRDisplayImpl* display : displays_)
display->OnFocus();
}
void VRDeviceBase::OnExitPresent() {
if (!presenting_display_)
return;
auto it = displays_.find(presenting_display_);
CHECK(it != displays_.end());
(*it)->OnExitPresent();
SetPresentingDisplay(nullptr);
}
bool VRDeviceBase::IsFallbackDevice() {
return false;
};
mojom::VRDisplayInfoPtr VRDeviceBase::GetVRDisplayInfo() {
DCHECK(display_info_);
return display_info_.Clone();
}
void VRDeviceBase::RequestPresent(
VRDisplayImpl* display,
mojom::VRSubmitFrameClientPtr submit_client,
mojom::VRPresentationProviderRequest request,
mojom::VRRequestPresentOptionsPtr present_options,
mojom::VRDisplayHost::RequestPresentCallback callback) {
std::move(callback).Run(false, nullptr);
}
void VRDeviceBase::ExitPresent() {
NOTREACHED();
}
void VRDeviceBase::SetMagicWindowEnabled(bool enabled) {
magic_window_enabled_ = enabled;
}
void VRDeviceBase::GetMagicWindowPose(
mojom::VRMagicWindowProvider::GetPoseCallback callback) {
if (!magic_window_enabled_) {
std::move(callback).Run(nullptr);
return;
}
OnMagicWindowPoseRequest(std::move(callback));
}
void VRDeviceBase::AddDisplay(VRDisplayImpl* display) {
displays_.insert(display);
}
void VRDeviceBase::RemoveDisplay(VRDisplayImpl* display) {
if (CheckPresentingDisplay(display))
ExitPresent();
displays_.erase(display);
if (listening_for_activate_diplay_ == display) {
listening_for_activate_diplay_ = nullptr;
OnListeningForActivate(false);
}
if (last_listening_for_activate_diplay_ == display)
last_listening_for_activate_diplay_ = nullptr;
}
bool VRDeviceBase::IsAccessAllowed(VRDisplayImpl* display) {
return (!presenting_display_ || presenting_display_ == display);
}
bool VRDeviceBase::CheckPresentingDisplay(VRDisplayImpl* display) {
return (presenting_display_ && presenting_display_ == display);
}
void VRDeviceBase::OnListeningForActivateChanged(VRDisplayImpl* display) {
UpdateListeningForActivate(display);
}
void VRDeviceBase::OnFrameFocusChanged(VRDisplayImpl* display) {
UpdateListeningForActivate(display);
}
void VRDeviceBase::SetPresentingDisplay(VRDisplayImpl* display) {
presenting_display_ = display;
}
void VRDeviceBase::SetVRDisplayInfo(mojom::VRDisplayInfoPtr display_info) {
DCHECK(display_info);
DCHECK(display_info->index == id_);
bool initialized = !!display_info_;
display_info_ = std::move(display_info);
// Don't notify when the VRDisplayInfo is initially set.
if (!initialized)
return;
for (VRDisplayImpl* display : displays_)
display->OnChanged(display_info_.Clone());
}
void VRDeviceBase::OnActivate(mojom::VRDisplayEventReason reason,
base::Callback<void(bool)> on_handled) {
if (listening_for_activate_diplay_) {
listening_for_activate_diplay_->OnActivate(reason, std::move(on_handled));
} else if (last_listening_for_activate_diplay_ &&
last_listening_for_activate_diplay_->InFocusedFrame()) {
last_listening_for_activate_diplay_->OnActivate(reason,
std::move(on_handled));
} else {
std::move(on_handled).Run(true /* will_not_present */);
}
}
void VRDeviceBase::OnListeningForActivate(bool listening) {}
void VRDeviceBase::OnMagicWindowPoseRequest(
mojom::VRMagicWindowProvider::GetPoseCallback callback) {
std::move(callback).Run(nullptr);
}
void VRDeviceBase::UpdateListeningForActivate(VRDisplayImpl* display) {
if (display->ListeningForActivate() && display->InFocusedFrame()) {
bool was_listening = !!listening_for_activate_diplay_;
listening_for_activate_diplay_ = display;
if (!was_listening)
OnListeningForActivate(true);
} else if (listening_for_activate_diplay_ == display) {
last_listening_for_activate_diplay_ = listening_for_activate_diplay_;
listening_for_activate_diplay_ = nullptr;
OnListeningForActivate(false);
}
}
} // namespace device