Chromium Code Reviews| Index: chrome/browser/android/vr_shell/vr_shell.cc |
| diff --git a/chrome/browser/android/vr_shell/vr_shell.cc b/chrome/browser/android/vr_shell/vr_shell.cc |
| index 32158015a068d07bcf02384653c7bd00cd4199e7..0ef3c920444976b2768ba2e819eb809e3f97a30b 100644 |
| --- a/chrome/browser/android/vr_shell/vr_shell.cc |
| +++ b/chrome/browser/android/vr_shell/vr_shell.cc |
| @@ -73,23 +73,6 @@ static constexpr float kReticleDistanceMultiplier = 1.5f; |
| // UI element 0 is the browser content rectangle. |
| static constexpr int kBrowserUiElementId = 0; |
| -// Positions and sizes of statically placed UI elements in the UI texture. |
| -// TODO(klausw): replace the hardcoded positions with JS position/offset |
| -// retrieval once the infrastructure for that is hooked up. |
| -// |
| -// UI is designed with 1 pixel = 1mm at 1m distance. It's rescaled to |
| -// maintain the same angular resolution if placed closer or further. |
| -// The warning overlays should be fairly close since they cut holes |
| -// into geometry (they ignore the Z buffer), leading to odd effects |
| -// if they are far away. |
| -static constexpr vr_shell::Recti kWebVrWarningTransientRect = { |
| - 0, 128, 512, 256}; |
| -static constexpr vr_shell::Recti kWebVrWarningPermanentRect = {0, 0, 512, 128}; |
| -static constexpr float kWebVrWarningDistance = 0.7f; // meters |
| -static constexpr float kWebVrWarningPermanentAngle = 16.3f; // degrees up |
| -// How long the transient warning needs to be displayed. |
| -static constexpr int64_t kWebVrWarningSeconds = 30; |
| - |
| vr_shell::VrShell* g_instance; |
| static const char kVrShellUIURL[] = "chrome://vr-shell-ui"; |
| @@ -421,12 +404,14 @@ void VrShell::DrawFrame(JNIEnv* env, const JavaParamRef<jobject>& obj) { |
| // Bind back to the default framebuffer. |
| frame.BindBuffer(0); |
| + HandleQueuedTasks(); |
| + |
| + // Update the render position of all UI elements (including desktop). |
| + float screen_tilt = desktop_screen_tilt_ * M_PI / 180.0f; |
| + scene_->UpdateTransforms(screen_tilt, UiScene::TimeInMicroseconds()); |
| + |
| if (webvr_mode_) { |
| DrawWebVr(); |
| - if (!webvr_secure_origin_) { |
| - DrawWebVrOverlay(target_time.monotonic_system_time_nanos); |
| - } |
| - |
| // When using async reprojection, we need to know which pose was used in |
| // the WebVR app for drawing this frame. Due to unknown amounts of |
| // buffering in the compositor and SurfaceTexture, we read the pose number |
| @@ -439,31 +424,23 @@ void VrShell::DrawFrame(JNIEnv* env, const JavaParamRef<jobject>& obj) { |
| head_pose = webvr_head_pose_[webvr_pose_frame % kPoseRingBufferSize]; |
| } |
| } else { |
| - DrawVrShell(head_pose); |
| + UpdateController(GetForwardVector(head_pose)); |
| } |
| + DrawVrShell(head_pose); |
| + |
| frame.Unbind(); |
| frame.Submit(*buffer_viewport_list_, head_pose); |
| } |
| void VrShell::DrawVrShell(const gvr::Mat4f& head_pose) { |
| - float screen_tilt = desktop_screen_tilt_ * M_PI / 180.0f; |
| - |
| - HandleQueuedTasks(); |
| - |
| - // Update the render position of all UI elements (including desktop). |
| - scene_->UpdateTransforms(screen_tilt, UiScene::TimeInMicroseconds()); |
| - |
| - UpdateController(GetForwardVector(head_pose)); |
| - |
| - // Use culling to remove back faces. |
| - glEnable(GL_CULL_FACE); |
| - |
| - // Enable depth testing. |
| - glEnable(GL_DEPTH_TEST); |
| - glEnable(GL_SCISSOR_TEST); |
| - |
| - glClearColor(0.1f, 0.1f, 0.1f, 1.0f); |
| + if (!webvr_mode_) { |
| + glEnable(GL_CULL_FACE); |
| + glEnable(GL_DEPTH_TEST); |
| + glEnable(GL_SCISSOR_TEST); |
| + glClearColor(0.1f, 0.1f, 0.1f, 1.0f); |
| + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); |
| + } |
| buffer_viewport_list_->GetBufferViewport(GVR_LEFT_EYE, |
| buffer_viewport_.get()); |
| @@ -499,20 +476,9 @@ void VrShell::DrawEye(gvr::Eye eye, |
| // TODO(mthiesse): Draw order for transparency. |
| DrawUI(world_render_matrix, fov_render_matrix); |
| - DrawCursor(world_render_matrix); |
| -} |
| - |
| -bool VrShell::IsUiTextureReady() { |
| - return ui_tex_width_ > 0 && ui_tex_height_ > 0; |
| -} |
| - |
| -Rectf VrShell::MakeUiGlCopyRect(Recti pixel_rect) { |
| - CHECK(IsUiTextureReady()); |
| - return Rectf({ |
| - static_cast<float>(pixel_rect.x) / ui_tex_width_, |
| - static_cast<float>(pixel_rect.y) / ui_tex_height_, |
| - static_cast<float>(pixel_rect.width) / ui_tex_width_, |
| - static_cast<float>(pixel_rect.height) / ui_tex_height_}); |
| + if (!webvr_mode_) { |
| + DrawCursor(world_render_matrix); |
| + } |
| } |
| void VrShell::DrawUI(const gvr::Mat4f& world_matrix, |
| @@ -521,6 +487,9 @@ void VrShell::DrawUI(const gvr::Mat4f& world_matrix, |
| if (!rect->visible) { |
| continue; |
| } |
| + if (webvr_mode_ && rect->id == kBrowserUiElementId) { |
|
mthiesse
2016/10/21 14:14:50
Technically we could still control this through ja
cjgrant
2016/10/24 20:00:18
This decoupling is a bit involved, and hence is up
|
| + continue; |
| + } |
| Rectf copy_rect; |
| jint texture_handle; |
| @@ -635,86 +604,6 @@ void VrShell::DrawWebVr() { |
| vr_shell_renderer_->GetWebVrRenderer()->Draw(content_texture_id_); |
| } |
| -void VrShell::DrawWebVrOverlay(int64_t present_time_nanos) { |
| - // Draw WebVR security warning overlays for each eye. This uses the |
| - // eye-from-head matrices but not the pose, goal is to place the icons in an |
| - // eye-relative position so that they follow along with head rotations. |
| - |
| - gvr::Mat4f left_eye_view_matrix = |
| - gvr_api_->GetEyeFromHeadMatrix(GVR_LEFT_EYE); |
| - gvr::Mat4f right_eye_view_matrix = |
| - gvr_api_->GetEyeFromHeadMatrix(GVR_RIGHT_EYE); |
| - |
| - buffer_viewport_list_->GetBufferViewport(GVR_LEFT_EYE, |
| - buffer_viewport_.get()); |
| - DrawWebVrEye(left_eye_view_matrix, *buffer_viewport_, present_time_nanos); |
| - buffer_viewport_list_->GetBufferViewport(GVR_RIGHT_EYE, |
| - buffer_viewport_.get()); |
| - DrawWebVrEye(right_eye_view_matrix, *buffer_viewport_, present_time_nanos); |
| -} |
| - |
| -void VrShell::DrawWebVrEye(const gvr::Mat4f& view_matrix, |
| - const gvr::BufferViewport& params, |
| - int64_t present_time_nanos) { |
| - gvr::Recti pixel_rect = |
| - CalculatePixelSpaceRect(render_size_, params.GetSourceUv()); |
| - glViewport(pixel_rect.left, pixel_rect.bottom, |
| - pixel_rect.right - pixel_rect.left, |
| - pixel_rect.top - pixel_rect.bottom); |
| - glScissor(pixel_rect.left, pixel_rect.bottom, |
| - pixel_rect.right - pixel_rect.left, |
| - pixel_rect.top - pixel_rect.bottom); |
| - |
| - gvr::Mat4f projection_matrix = |
| - PerspectiveMatrixFromView(params.GetSourceFov(), kZNear, kZFar); |
| - |
| - if (!IsUiTextureReady()) { |
| - // If the UI texture hasn't been initialized yet, we can't draw the overlay. |
| - return; |
| - } |
| - |
| - // Show IDS_WEBSITE_SETTINGS_INSECURE_WEBVR_CONTENT_PERMANENT text. |
| - gvr::Mat4f icon_pos; |
| - SetIdentityM(icon_pos); |
| - // The UI is designed in pixels with the assumption that 1px = 1mm at 1m |
| - // distance. Scale mm-to-m and adjust to keep the same angular size if the |
| - // distance changes. |
| - const float small_icon_width = |
| - kWebVrWarningPermanentRect.width / 1000.f * kWebVrWarningDistance; |
| - const float small_icon_height = |
| - kWebVrWarningPermanentRect.height / 1000.f * kWebVrWarningDistance; |
| - const float small_icon_angle = |
| - kWebVrWarningPermanentAngle * M_PI / 180.f; // Degrees to radians. |
| - ScaleM(icon_pos, icon_pos, small_icon_width, small_icon_height, 1.0f); |
| - TranslateM(icon_pos, icon_pos, 0.0f, 0.0f, -kWebVrWarningDistance); |
| - icon_pos = MatrixMul( |
| - QuatToMatrix(QuatFromAxisAngle({1.f, 0.f, 0.f}, small_icon_angle)), |
| - icon_pos); |
| - gvr::Mat4f combined = MatrixMul(projection_matrix, |
| - MatrixMul(view_matrix, icon_pos)); |
| - vr_shell_renderer_->GetTexturedQuadRenderer()->Draw( |
| - ui_texture_id_, combined, MakeUiGlCopyRect(kWebVrWarningPermanentRect)); |
| - |
| - // Check if we also need to show the transient warning. |
| - if (present_time_nanos > webvr_warning_end_nanos_) { |
| - return; |
| - } |
| - |
| - // Show IDS_WEBSITE_SETTINGS_INSECURE_WEBVR_CONTENT_TRANSIENT text. |
| - SetIdentityM(icon_pos); |
| - const float large_icon_width = |
| - kWebVrWarningTransientRect.width / 1000.f * kWebVrWarningDistance; |
| - const float large_icon_height = |
| - kWebVrWarningTransientRect.height / 1000.f * kWebVrWarningDistance; |
| - ScaleM(icon_pos, icon_pos, large_icon_width, large_icon_height, 1.0f); |
| - TranslateM(icon_pos, icon_pos, 0.0f, 0.0f, -kWebVrWarningDistance); |
| - combined = MatrixMul(projection_matrix, |
| - MatrixMul(view_matrix, icon_pos)); |
| - vr_shell_renderer_->GetTexturedQuadRenderer()->Draw( |
| - ui_texture_id_, combined, MakeUiGlCopyRect(kWebVrWarningTransientRect)); |
| - |
| -} |
| - |
| void VrShell::OnTriggerEvent(JNIEnv* env, const JavaParamRef<jobject>& obj) { |
| // Set a flag to handle this on the render thread at the next frame. |
| touch_pending_ = true; |
| @@ -774,7 +663,7 @@ void VrShell::SetWebVrMode(JNIEnv* env, |
| } |
| void VrShell::SetWebVRSecureOrigin(bool secure_origin) { |
| - webvr_secure_origin_ = secure_origin; |
| + html_interface_->SetSecureOrigin(secure_origin); |
| } |
| void VrShell::SubmitWebVRFrame() { |