| OLD | NEW |
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/browser/android/vr_shell/vr_shell.h" | 5 #include "chrome/browser/android/vr_shell/vr_shell.h" |
| 6 | 6 |
| 7 #include <thread> | 7 #include <thread> |
| 8 | 8 |
| 9 #include "chrome/browser/android/vr_shell/vr_compositor.h" | 9 #include "chrome/browser/android/vr_shell/vr_compositor.h" |
| 10 #include "chrome/browser/android/vr_shell/vr_gl_util.h" | 10 #include "chrome/browser/android/vr_shell/vr_gl_util.h" |
| 11 #include "chrome/browser/android/vr_shell/vr_math.h" | 11 #include "chrome/browser/android/vr_shell/vr_math.h" |
| 12 #include "chrome/browser/android/vr_shell/vr_shell_renderer.h" | 12 #include "chrome/browser/android/vr_shell/vr_shell_renderer.h" |
| 13 #include "content/public/browser/android/content_view_core.h" | 13 #include "content/public/browser/android/content_view_core.h" |
| 14 #include "content/public/browser/navigation_controller.h" |
| 14 #include "content/public/browser/render_widget_host.h" | 15 #include "content/public/browser/render_widget_host.h" |
| 15 #include "content/public/browser/render_widget_host_view.h" | 16 #include "content/public/browser/render_widget_host_view.h" |
| 16 #include "content/public/browser/web_contents.h" | 17 #include "content/public/browser/web_contents.h" |
| 18 #include "content/public/common/referrer.h" |
| 17 #include "jni/VrShell_jni.h" | 19 #include "jni/VrShell_jni.h" |
| 18 #include "ui/android/view_android.h" | 20 #include "ui/android/view_android.h" |
| 19 #include "ui/android/window_android.h" | 21 #include "ui/android/window_android.h" |
| 22 #include "ui/base/page_transition_types.h" |
| 20 #include "ui/gl/gl_bindings.h" | 23 #include "ui/gl/gl_bindings.h" |
| 21 #include "ui/gl/init/gl_factory.h" | 24 #include "ui/gl/init/gl_factory.h" |
| 22 | 25 |
| 23 using base::android::JavaParamRef; | 26 using base::android::JavaParamRef; |
| 24 | 27 |
| 25 namespace { | 28 namespace { |
| 26 // Constant taken from treasure_hunt demo. | 29 // Constant taken from treasure_hunt demo. |
| 27 static constexpr long kPredictionTimeWithoutVsyncNanos = 50000000; | 30 static constexpr long kPredictionTimeWithoutVsyncNanos = 50000000; |
| 28 | 31 |
| 29 static constexpr float kZNear = 0.1f; | 32 static constexpr float kZNear = 0.1f; |
| (...skipping 18 matching lines...) Expand all Loading... |
| 48 // controller orientation is reset. This should match the yaw angle | 51 // controller orientation is reset. This should match the yaw angle |
| 49 // where the main screen is placed. | 52 // where the main screen is placed. |
| 50 static constexpr gvr::Vec3f kNeutralPose = {0.0f, 0.0f, -1.0f}; | 53 static constexpr gvr::Vec3f kNeutralPose = {0.0f, 0.0f, -1.0f}; |
| 51 | 54 |
| 52 // In lieu of an elbow model, we assume a position for the user's hand. | 55 // In lieu of an elbow model, we assume a position for the user's hand. |
| 53 // TODO(mthiesse): Handedness options. | 56 // TODO(mthiesse): Handedness options. |
| 54 static constexpr gvr::Vec3f kHandPosition = {0.2f, -0.5f, -0.2f}; | 57 static constexpr gvr::Vec3f kHandPosition = {0.2f, -0.5f, -0.2f}; |
| 55 | 58 |
| 56 static constexpr float kReticleZOffset = 0.01f; | 59 static constexpr float kReticleZOffset = 0.01f; |
| 57 | 60 |
| 61 static const char kVrShellUIURL[] = "chrome://vr-shell-ui"; |
| 62 |
| 58 } // namespace | 63 } // namespace |
| 59 | 64 |
| 60 namespace vr_shell { | 65 namespace vr_shell { |
| 61 | 66 |
| 62 VrShell::VrShell(JNIEnv* env, jobject obj, | 67 VrShell::VrShell(JNIEnv* env, |
| 63 content::ContentViewCore* content_core, | 68 jobject obj, |
| 64 ui::WindowAndroid* content_window) | 69 content::ContentViewCore* content_cvc, |
| 70 ui::WindowAndroid* content_window, |
| 71 content::ContentViewCore* ui_cvc, |
| 72 ui::WindowAndroid* ui_window) |
| 65 : desktop_screen_tilt_(kDesktopScreenTiltDefault), | 73 : desktop_screen_tilt_(kDesktopScreenTiltDefault), |
| 66 desktop_height_(kDesktopHeightDefault), | 74 desktop_height_(kDesktopHeightDefault), |
| 67 desktop_position_(kDesktopPositionDefault), | 75 desktop_position_(kDesktopPositionDefault), |
| 68 content_cvc_(content_core) { | 76 content_cvc_(content_cvc), |
| 77 ui_cvc_(ui_cvc) { |
| 69 j_vr_shell_.Reset(env, obj); | 78 j_vr_shell_.Reset(env, obj); |
| 70 content_compositor_view_.reset(new VrCompositor(content_window)); | 79 content_compositor_.reset(new VrCompositor(content_window)); |
| 80 ui_compositor_.reset(new VrCompositor(ui_window)); |
| 81 |
| 71 ui_rects_.emplace_back(new ContentRectangle()); | 82 ui_rects_.emplace_back(new ContentRectangle()); |
| 72 desktop_plane_ = ui_rects_.back().get(); | 83 desktop_plane_ = ui_rects_.back().get(); |
| 73 desktop_plane_->id = 0; | 84 desktop_plane_->id = 0; |
| 74 desktop_plane_->copy_rect = {0.0f, 0.0f, 1.0f, 1.0f}; | 85 desktop_plane_->copy_rect = {0.0f, 0.0f, 1.0f, 1.0f}; |
| 75 // TODO(cjgrant): If we use the native path for content clicks, fix this. | 86 // TODO(cjgrant): If we use the native path for content clicks, fix this. |
| 76 desktop_plane_->window_rect = {0, 0, 0, 0}; | 87 desktop_plane_->window_rect = {0, 0, 0, 0}; |
| 77 desktop_plane_->translation = {0.0f, 0.0f, 0.0f}; | 88 desktop_plane_->translation = {0.0f, 0.0f, 0.0f}; |
| 78 desktop_plane_->x_anchoring = XNONE; | 89 desktop_plane_->x_anchoring = XNONE; |
| 79 desktop_plane_->y_anchoring = YNONE; | 90 desktop_plane_->y_anchoring = YNONE; |
| 80 desktop_plane_->anchor_z = false; | 91 desktop_plane_->anchor_z = false; |
| 81 desktop_plane_->orientation_axis_angle = {{1.0f, 0.0f, 0.0f, 0.0f}}; | 92 desktop_plane_->orientation_axis_angle = {{1.0f, 0.0f, 0.0f, 0.0f}}; |
| 82 desktop_plane_->rotation_axis_angle = {{0.0f, 0.0f, 0.0f, 0.0f}}; | 93 desktop_plane_->rotation_axis_angle = {{0.0f, 0.0f, 0.0f, 0.0f}}; |
| 83 content_cvc_->GetWebContents()->GetRenderWidgetHostView() | 94 |
| 84 ->GetRenderWidgetHost()->WasResized(); | 95 LoadUIContent(); |
| 85 } | 96 } |
| 86 | 97 |
| 87 void VrShell::UpdateCompositorLayers(JNIEnv* env, | 98 void VrShell::UpdateCompositorLayers(JNIEnv* env, |
| 88 const JavaParamRef<jobject>& obj) { | 99 const JavaParamRef<jobject>& obj) { |
| 89 content_compositor_view_->SetLayer(content_cvc_); | 100 content_compositor_->SetLayer(content_cvc_); |
| 101 ui_compositor_->SetLayer(ui_cvc_); |
| 90 } | 102 } |
| 91 | 103 |
| 92 void VrShell::Destroy(JNIEnv* env, const JavaParamRef<jobject>& obj) { | 104 void VrShell::Destroy(JNIEnv* env, const JavaParamRef<jobject>& obj) { |
| 93 delete this; | 105 delete this; |
| 94 gl::init::ClearGLBindings(); | 106 gl::init::ClearGLBindings(); |
| 95 } | 107 } |
| 96 | 108 |
| 109 void VrShell::LoadUIContent() { |
| 110 GURL url(kVrShellUIURL); |
| 111 ui_cvc_->GetWebContents()->GetController().LoadURL( |
| 112 url, content::Referrer(), |
| 113 ui::PageTransition::PAGE_TRANSITION_AUTO_TOPLEVEL, std::string("")); |
| 114 } |
| 115 |
| 97 bool RegisterVrShell(JNIEnv* env) { | 116 bool RegisterVrShell(JNIEnv* env) { |
| 98 return RegisterNativesImpl(env); | 117 return RegisterNativesImpl(env); |
| 99 } | 118 } |
| 100 | 119 |
| 101 VrShell::~VrShell() { | 120 VrShell::~VrShell() { |
| 102 device::GvrDelegateManager::GetInstance()->Shutdown(); | 121 device::GvrDelegateManager::GetInstance()->Shutdown(); |
| 103 } | 122 } |
| 104 | 123 |
| 105 void VrShell::GvrInit(JNIEnv* env, | 124 void VrShell::GvrInit(JNIEnv* env, |
| 106 const JavaParamRef<jobject>& obj, | 125 const JavaParamRef<jobject>& obj, |
| 107 jlong native_gvr_api) { | 126 jlong native_gvr_api) { |
| 108 gvr_api_ = | 127 gvr_api_ = |
| 109 gvr::GvrApi::WrapNonOwned(reinterpret_cast<gvr_context*>(native_gvr_api)); | 128 gvr::GvrApi::WrapNonOwned(reinterpret_cast<gvr_context*>(native_gvr_api)); |
| 110 | 129 |
| 111 device::GvrDelegateManager::GetInstance()->Initialize(this); | 130 device::GvrDelegateManager::GetInstance()->Initialize(this); |
| 112 } | 131 } |
| 113 | 132 |
| 114 void VrShell::InitializeGl(JNIEnv* env, | 133 void VrShell::InitializeGl(JNIEnv* env, |
| 115 const JavaParamRef<jobject>& obj, | 134 const JavaParamRef<jobject>& obj, |
| 116 jint texture_data_handle) { | 135 jint content_texture_handle, |
| 136 jint ui_texture_handle) { |
| 117 CHECK(gl::GetGLImplementation() != gl::kGLImplementationNone || | 137 CHECK(gl::GetGLImplementation() != gl::kGLImplementationNone || |
| 118 gl::init::InitializeGLOneOff()); | 138 gl::init::InitializeGLOneOff()); |
| 119 | 139 |
| 120 content_texture_id_ = texture_data_handle; | 140 content_texture_id_ = content_texture_handle; |
| 141 ui_texture_id_ = ui_texture_handle; |
| 142 |
| 121 gvr_api_->InitializeGl(); | 143 gvr_api_->InitializeGl(); |
| 122 std::vector<gvr::BufferSpec> specs; | 144 std::vector<gvr::BufferSpec> specs; |
| 123 specs.push_back(gvr_api_->CreateBufferSpec()); | 145 specs.push_back(gvr_api_->CreateBufferSpec()); |
| 124 render_size_ = specs[0].GetSize(); | 146 render_size_ = specs[0].GetSize(); |
| 125 swap_chain_.reset(new gvr::SwapChain(gvr_api_->CreateSwapchain(specs))); | 147 swap_chain_.reset(new gvr::SwapChain(gvr_api_->CreateSwapchain(specs))); |
| 126 | 148 |
| 127 desktop_plane_->content_texture_handle = content_texture_id_; | 149 desktop_plane_->content_texture_handle = content_texture_id_; |
| 128 | 150 |
| 129 vr_shell_renderer_.reset(new VrShellRenderer()); | 151 vr_shell_renderer_.reset(new VrShellRenderer()); |
| 130 buffer_viewport_list_.reset( | 152 buffer_viewport_list_.reset( |
| (...skipping 265 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 396 void VrShell::UpdateWebVRTextureBounds( | 418 void VrShell::UpdateWebVRTextureBounds( |
| 397 int eye, float left, float top, float width, float height) { | 419 int eye, float left, float top, float width, float height) { |
| 398 gvr::Rectf bounds = { left, top, width, height }; | 420 gvr::Rectf bounds = { left, top, width, height }; |
| 399 vr_shell_renderer_->GetWebVrRenderer()->UpdateTextureBounds(eye, bounds); | 421 vr_shell_renderer_->GetWebVrRenderer()->UpdateTextureBounds(eye, bounds); |
| 400 } | 422 } |
| 401 | 423 |
| 402 gvr::GvrApi* VrShell::gvr_api() { | 424 gvr::GvrApi* VrShell::gvr_api() { |
| 403 return gvr_api_.get(); | 425 return gvr_api_.get(); |
| 404 } | 426 } |
| 405 | 427 |
| 406 void VrShell::ContentSurfaceDestroyed(JNIEnv* env, | |
| 407 const JavaParamRef<jobject>& object) { | |
| 408 content_compositor_view_->SurfaceDestroyed(); | |
| 409 } | |
| 410 | |
| 411 void VrShell::ContentSurfaceChanged(JNIEnv* env, | 428 void VrShell::ContentSurfaceChanged(JNIEnv* env, |
| 412 const JavaParamRef<jobject>& object, | 429 const JavaParamRef<jobject>& object, |
| 413 jint width, | 430 jint width, |
| 414 jint height, | 431 jint height, |
| 415 const JavaParamRef<jobject>& surface) { | 432 const JavaParamRef<jobject>& surface) { |
| 416 content_compositor_view_->SurfaceChanged((int)width, (int)height, surface); | 433 content_compositor_->SurfaceChanged((int)width, (int)height, surface); |
| 434 } |
| 435 |
| 436 void VrShell::UiSurfaceChanged(JNIEnv* env, |
| 437 const JavaParamRef<jobject>& object, |
| 438 jint width, |
| 439 jint height, |
| 440 const JavaParamRef<jobject>& surface) { |
| 441 ui_compositor_->SurfaceChanged((int)width, (int)height, surface); |
| 417 } | 442 } |
| 418 | 443 |
| 419 void VrShell::UpdateTransforms(float screen_width_meters, | 444 void VrShell::UpdateTransforms(float screen_width_meters, |
| 420 float screen_height_meters, | 445 float screen_height_meters, |
| 421 float screen_tilt) { | 446 float screen_tilt) { |
| 422 for (std::unique_ptr<ContentRectangle>& rect : ui_rects_) { | 447 for (std::unique_ptr<ContentRectangle>& rect : ui_rects_) { |
| 423 rect->transform.MakeIdentity(); | 448 rect->transform.MakeIdentity(); |
| 424 rect->transform.Scale(rect->size.x, rect->size.y, rect->size.z); | 449 rect->transform.Scale(rect->size.x, rect->size.y, rect->size.z); |
| 425 float x_anchor_translate; | 450 float x_anchor_translate; |
| 426 switch (rect->x_anchoring) { | 451 switch (rect->x_anchoring) { |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 462 } | 487 } |
| 463 } | 488 } |
| 464 | 489 |
| 465 // ---------------------------------------------------------------------------- | 490 // ---------------------------------------------------------------------------- |
| 466 // Native JNI methods | 491 // Native JNI methods |
| 467 // ---------------------------------------------------------------------------- | 492 // ---------------------------------------------------------------------------- |
| 468 | 493 |
| 469 jlong Init(JNIEnv* env, | 494 jlong Init(JNIEnv* env, |
| 470 const JavaParamRef<jobject>& obj, | 495 const JavaParamRef<jobject>& obj, |
| 471 const JavaParamRef<jobject>& content_web_contents, | 496 const JavaParamRef<jobject>& content_web_contents, |
| 472 jlong content_window_android) { | 497 jlong content_window_android, |
| 498 const JavaParamRef<jobject>& ui_web_contents, |
| 499 jlong ui_window_android) { |
| 473 content::ContentViewCore* c_core = content::ContentViewCore::FromWebContents( | 500 content::ContentViewCore* c_core = content::ContentViewCore::FromWebContents( |
| 474 content::WebContents::FromJavaWebContents(content_web_contents)); | 501 content::WebContents::FromJavaWebContents(content_web_contents)); |
| 502 content::ContentViewCore* ui_core = content::ContentViewCore::FromWebContents( |
| 503 content::WebContents::FromJavaWebContents(ui_web_contents)); |
| 475 return reinterpret_cast<intptr_t>(new VrShell( | 504 return reinterpret_cast<intptr_t>(new VrShell( |
| 476 env, obj, c_core, | 505 env, obj, c_core, |
| 477 reinterpret_cast<ui::WindowAndroid*>(content_window_android))); | 506 reinterpret_cast<ui::WindowAndroid*>(content_window_android), ui_core, |
| 507 reinterpret_cast<ui::WindowAndroid*>(ui_window_android))); |
| 478 } | 508 } |
| 479 | 509 |
| 480 } // namespace vr_shell | 510 } // namespace vr_shell |
| OLD | NEW |