Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(527)

Side by Side Diff: chrome/browser/android/vr_shell/vr_shell.cc

Issue 2442873002: Control the VrShell content quad via the HTML UI. (Closed)
Patch Set: Rebase; address nits and bug. Created 4 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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 "base/metrics/histogram_macros.h" 7 #include "base/metrics/histogram_macros.h"
8 #include "chrome/browser/android/vr_shell/ui_elements.h" 8 #include "chrome/browser/android/vr_shell/ui_elements.h"
9 #include "chrome/browser/android/vr_shell/ui_interface.h" 9 #include "chrome/browser/android/vr_shell/ui_interface.h"
10 #include "chrome/browser/android/vr_shell/ui_scene.h" 10 #include "chrome/browser/android/vr_shell/ui_scene.h"
(...skipping 20 matching lines...) Expand all
31 31
32 using base::android::JavaParamRef; 32 using base::android::JavaParamRef;
33 33
34 namespace { 34 namespace {
35 // Constant taken from treasure_hunt demo. 35 // Constant taken from treasure_hunt demo.
36 static constexpr long kPredictionTimeWithoutVsyncNanos = 50000000; 36 static constexpr long kPredictionTimeWithoutVsyncNanos = 50000000;
37 37
38 static constexpr float kZNear = 0.1f; 38 static constexpr float kZNear = 0.1f;
39 static constexpr float kZFar = 1000.0f; 39 static constexpr float kZFar = 1000.0f;
40 40
41 static constexpr gvr::Vec3f kDesktopPositionDefault = {0.0f, 0.0f, -2.0f};
42 static constexpr float kDesktopHeightDefault = 1.6f;
43
44 // Screen angle in degrees. 0 = vertical, positive = top closer. 41 // Screen angle in degrees. 0 = vertical, positive = top closer.
45 static constexpr float kDesktopScreenTiltDefault = 0; 42 static constexpr float kDesktopScreenTiltDefault = 0;
46 43
47 static constexpr float kScreenHeightRatio = 1.0f;
48 static constexpr float kScreenWidthRatio = 16.0f / 9.0f;
49
50 static constexpr float kReticleWidth = 0.025f; 44 static constexpr float kReticleWidth = 0.025f;
51 static constexpr float kReticleHeight = 0.025f; 45 static constexpr float kReticleHeight = 0.025f;
52 46
53 static constexpr float kLaserWidth = 0.01f; 47 static constexpr float kLaserWidth = 0.01f;
54 48
55 // Angle (radians) the beam down from the controller axis, for wrist comfort. 49 // Angle (radians) the beam down from the controller axis, for wrist comfort.
56 static constexpr float kErgoAngleOffset = 0.26f; 50 static constexpr float kErgoAngleOffset = 0.26f;
57 51
58 static constexpr gvr::Vec3f kOrigin = {0.0f, 0.0f, 0.0f}; 52 static constexpr gvr::Vec3f kOrigin = {0.0f, 0.0f, 0.0f};
59 53
60 // In lieu of an elbow model, we assume a position for the user's hand. 54 // In lieu of an elbow model, we assume a position for the user's hand.
61 // TODO(mthiesse): Handedness options. 55 // TODO(mthiesse): Handedness options.
62 static constexpr gvr::Vec3f kHandPosition = {0.2f, -0.5f, -0.2f}; 56 static constexpr gvr::Vec3f kHandPosition = {0.2f, -0.5f, -0.2f};
63 57
58 // If there is no content quad, and the reticle isn't hitting another element,
59 // draw the reticle at this distance.
60 static constexpr float kDefaultReticleDistance = 2.0f;
61
64 // Fraction of the distance to the object the cursor is drawn at to avoid 62 // Fraction of the distance to the object the cursor is drawn at to avoid
65 // rounding errors drawing the cursor behind the object. 63 // rounding errors drawing the cursor behind the object.
66 static constexpr float kReticleOffset = 0.99f; 64 static constexpr float kReticleOffset = 0.99f;
67 65
68 // Limit the rendering distance of the reticle to the distance to a corner of 66 // Limit the rendering distance of the reticle to the distance to a corner of
69 // the content quad, times this value. This lets the rendering distance 67 // the content quad, times this value. This lets the rendering distance
70 // adjust according to content quad placement. 68 // adjust according to content quad placement.
71 static constexpr float kReticleDistanceMultiplier = 1.5f; 69 static constexpr float kReticleDistanceMultiplier = 1.5f;
72 70
73 // UI element 0 is the browser content rectangle.
74 static constexpr int kBrowserUiElementId = 0;
75
76 static constexpr int kFramePrimaryBuffer = 0; 71 static constexpr int kFramePrimaryBuffer = 0;
77 static constexpr int kFrameHeadlockedBuffer = 1; 72 static constexpr int kFrameHeadlockedBuffer = 1;
78 73
79 vr_shell::VrShell* g_instance; 74 vr_shell::VrShell* g_instance;
80 75
81 static const char kVrShellUIURL[] = "chrome://vr-shell-ui"; 76 static const char kVrShellUIURL[] = "chrome://vr-shell-ui";
82 77
83 float Distance(const gvr::Vec3f& vec1, const gvr::Vec3f& vec2) { 78 float Distance(const gvr::Vec3f& vec1, const gvr::Vec3f& vec2) {
84 float xdiff = (vec1.x - vec2.x); 79 float xdiff = (vec1.x - vec2.x);
85 float ydiff = (vec1.y - vec2.y); 80 float ydiff = (vec1.y - vec2.y);
(...skipping 27 matching lines...) Expand all
113 108
114 } // namespace 109 } // namespace
115 110
116 namespace vr_shell { 111 namespace vr_shell {
117 112
118 VrShell::VrShell(JNIEnv* env, jobject obj, 113 VrShell::VrShell(JNIEnv* env, jobject obj,
119 content::WebContents* main_contents, 114 content::WebContents* main_contents,
120 ui::WindowAndroid* content_window, 115 ui::WindowAndroid* content_window,
121 content::WebContents* ui_contents, 116 content::WebContents* ui_contents,
122 ui::WindowAndroid* ui_window) 117 ui::WindowAndroid* ui_window)
123 : desktop_screen_tilt_(kDesktopScreenTiltDefault), 118 : main_contents_(main_contents),
124 desktop_height_(kDesktopHeightDefault),
125 main_contents_(main_contents),
126 ui_contents_(ui_contents), 119 ui_contents_(ui_contents),
127 weak_ptr_factory_(this) { 120 weak_ptr_factory_(this) {
128 DCHECK(g_instance == nullptr); 121 DCHECK(g_instance == nullptr);
129 g_instance = this; 122 g_instance = this;
130 j_vr_shell_.Reset(env, obj); 123 j_vr_shell_.Reset(env, obj);
131 scene_.reset(new UiScene); 124 scene_.reset(new UiScene);
132 html_interface_.reset(new UiInterface); 125 html_interface_.reset(new UiInterface);
133 content_compositor_.reset(new VrCompositor(content_window, false)); 126 content_compositor_.reset(new VrCompositor(content_window, false));
134 ui_compositor_.reset(new VrCompositor(ui_window, true)); 127 ui_compositor_.reset(new VrCompositor(ui_window, true));
135 128
136 float screen_width = kScreenWidthRatio * desktop_height_;
137 float screen_height = kScreenHeightRatio * desktop_height_;
138 std::unique_ptr<ContentRectangle> rect(new ContentRectangle());
139 rect->id = kBrowserUiElementId;
140 rect->size = {screen_width, screen_height, 1.0f};
141 rect->translation = kDesktopPositionDefault;
142 scene_->AddUiElement(rect);
143
144 LoadUIContent(); 129 LoadUIContent();
145 130
146 gvr::Mat4f identity; 131 gvr::Mat4f identity;
147 SetIdentityM(identity); 132 SetIdentityM(identity);
148 webvr_head_pose_.resize(kPoseRingBufferSize, identity); 133 webvr_head_pose_.resize(kPoseRingBufferSize, identity);
149 } 134 }
150 135
151 void VrShell::UpdateCompositorLayers(JNIEnv* env, 136 void VrShell::UpdateCompositorLayers(JNIEnv* env,
152 const JavaParamRef<jobject>& obj) { 137 const JavaParamRef<jobject>& obj) {
153 content_compositor_->SetLayer(main_contents_); 138 content_compositor_->SetLayer(main_contents_);
(...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after
282 controller_quat_ = GetRotationFromZAxis(forward_vector); 267 controller_quat_ = GetRotationFromZAxis(forward_vector);
283 } else { 268 } else {
284 ergo_neutral_pose = {0.0f, -sin(kErgoAngleOffset), -cos(kErgoAngleOffset)}; 269 ergo_neutral_pose = {0.0f, -sin(kErgoAngleOffset), -cos(kErgoAngleOffset)};
285 controller_quat_ = controller_->Orientation(); 270 controller_quat_ = controller_->Orientation();
286 } 271 }
287 272
288 gvr::Mat4f mat = QuatToMatrix(controller_quat_); 273 gvr::Mat4f mat = QuatToMatrix(controller_quat_);
289 gvr::Vec3f forward = MatrixVectorMul(mat, ergo_neutral_pose); 274 gvr::Vec3f forward = MatrixVectorMul(mat, ergo_neutral_pose);
290 gvr::Vec3f origin = kHandPosition; 275 gvr::Vec3f origin = kHandPosition;
291 276
292 target_element_ = nullptr;
293
294 ContentRectangle* content_plane =
295 scene_->GetUiElementById(kBrowserUiElementId);
296
297 float distance = content_plane->GetRayDistance(origin, forward);
298
299 // If we place the reticle based on elements intersecting the controller beam, 277 // If we place the reticle based on elements intersecting the controller beam,
300 // we can end up with the reticle hiding behind elements, or jumping laterally 278 // we can end up with the reticle hiding behind elements, or jumping laterally
301 // in the field of view. This is physically correct, but hard to use. For 279 // in the field of view. This is physically correct, but hard to use. For
302 // usability, do the following instead: 280 // usability, do the following instead:
303 // 281 //
304 // - Project the controller laser onto an outer surface, which is the 282 // - Project the controller laser onto an outer surface, which is the
305 // closer of the desktop plane, or a distance-limiting sphere. 283 // closer of the desktop plane, or a distance-limiting sphere.
306 // - Create a vector between the eyes and the outer surface point. 284 // - Create a vector between the eyes and the outer surface point.
307 // - If any UI elements intersect this vector, choose the closest to the eyes, 285 // - If any UI elements intersect this vector, choose the closest to the eyes,
308 // and place the reticle at the intersection point. 286 // and place the reticle at the intersection point.
309 287
310 // Find distance to a corner of the content quad, and limit the cursor 288 // Find distance to a corner of the content quad, and limit the cursor
311 // distance to a multiple of that distance. This lets us keep the reticle on 289 // distance to a multiple of that distance. This lets us keep the reticle on
312 // the content plane near the content window, and on the surface of a sphere 290 // the content plane near the content window, and on the surface of a sphere
313 // in other directions. Note that this approach uses distance from controller, 291 // in other directions. Note that this approach uses distance from controller,
314 // rather than eye, for simplicity. This will make the sphere slightly 292 // rather than eye, for simplicity. This will make the sphere slightly
315 // off-center. 293 // off-center.
316 gvr::Vec3f corner = {0.5f, 0.5f, 0.0f}; 294 float distance = kDefaultReticleDistance;
317 corner = MatrixVectorMul(content_plane->transform.to_world, corner); 295 ContentRectangle* content_plane = scene_->GetContentQuad();
318 float max_distance = Distance(origin, corner) * kReticleDistanceMultiplier; 296 if (content_plane) {
319 if (distance > max_distance || distance <= 0.0f) { 297 distance = content_plane->GetRayDistance(origin, forward);
320 distance = max_distance; 298 gvr::Vec3f corner = {0.5f, 0.5f, 0.0f};
299 corner = MatrixVectorMul(content_plane->transform.to_world, corner);
300 float max_distance = Distance(origin, corner) * kReticleDistanceMultiplier;
301 if (distance > max_distance || distance <= 0.0f) {
302 distance = max_distance;
303 }
321 } 304 }
305
322 target_point_ = GetRayPoint(origin, forward, distance); 306 target_point_ = GetRayPoint(origin, forward, distance);
323 gvr::Vec3f eye_to_target = target_point_; 307 gvr::Vec3f eye_to_target = target_point_;
324 NormalizeVector(eye_to_target); 308 NormalizeVector(eye_to_target);
325 309
326 // Determine which UI element (if any) intersects the line between the eyes 310 // Determine which UI element (if any) intersects the line between the eyes
327 // and the controller target position. 311 // and the controller target position.
328 float closest_element_distance = std::numeric_limits<float>::infinity(); 312 float closest_element_distance = std::numeric_limits<float>::infinity();
329 int pixel_x = 0; 313 int pixel_x = 0;
330 int pixel_y = 0; 314 int pixel_y = 0;
315 target_element_ = nullptr;
331 VrInputManager* input_target = nullptr; 316 VrInputManager* input_target = nullptr;
332 317
333 for (std::size_t i = 0; i < scene_->GetUiElements().size(); ++i) { 318 for (std::size_t i = 0; i < scene_->GetUiElements().size(); ++i) {
334 const ContentRectangle* plane = scene_->GetUiElements()[i].get(); 319 const ContentRectangle* plane = scene_->GetUiElements()[i].get();
335 if (!plane->visible || !plane->hit_testable) { 320 if (!plane->visible || !plane->hit_testable) {
336 continue; 321 continue;
337 } 322 }
338 float distance_to_plane = plane->GetRayDistance(kOrigin, eye_to_target); 323 float distance_to_plane = plane->GetRayDistance(kOrigin, eye_to_target);
339 gvr::Vec3f plane_intersection_point = 324 gvr::Vec3f plane_intersection_point =
340 GetRayPoint(kOrigin, eye_to_target, distance_to_plane); 325 GetRayPoint(kOrigin, eye_to_target, distance_to_plane);
341 326
342 gvr::Vec3f rect_2d_point = 327 gvr::Vec3f rect_2d_point =
343 MatrixVectorMul(plane->transform.from_world, plane_intersection_point); 328 MatrixVectorMul(plane->transform.from_world, plane_intersection_point);
344 if (distance_to_plane > 0 && distance_to_plane < closest_element_distance) { 329 if (distance_to_plane > 0 && distance_to_plane < closest_element_distance) {
345 float x = rect_2d_point.x + 0.5f; 330 float x = rect_2d_point.x + 0.5f;
346 float y = 0.5f - rect_2d_point.y; 331 float y = 0.5f - rect_2d_point.y;
347 bool is_inside = x >= 0.0f && x < 1.0f && y >= 0.0f && y < 1.0f; 332 bool is_inside = x >= 0.0f && x < 1.0f && y >= 0.0f && y < 1.0f;
348 if (is_inside) { 333 if (is_inside) {
349 closest_element_distance = distance_to_plane; 334 closest_element_distance = distance_to_plane;
350 pixel_x = 335 pixel_x =
351 static_cast<int>(plane->copy_rect.width * x + plane->copy_rect.x); 336 static_cast<int>(plane->copy_rect.width * x + plane->copy_rect.x);
352 pixel_y = 337 pixel_y =
353 static_cast<int>(plane->copy_rect.height * y + plane->copy_rect.y); 338 static_cast<int>(plane->copy_rect.height * y + plane->copy_rect.y);
354 339
355 target_point_ = plane_intersection_point; 340 target_point_ = plane_intersection_point;
356 target_element_ = plane; 341 target_element_ = plane;
357 input_target = (plane->id == kBrowserUiElementId) 342 input_target = plane->content_quad ? content_input_manager_.get() :
358 ? content_input_manager_.get() : ui_input_manager_.get(); 343 ui_input_manager_.get();
359 } 344 }
360 } 345 }
361 } 346 }
362 bool new_target = input_target != current_input_target_; 347 bool new_target = input_target != current_input_target_;
363 if (new_target && current_input_target_ != nullptr) { 348 if (new_target && current_input_target_ != nullptr) {
364 // Send a move event indicating that the pointer moved off of an element. 349 // Send a move event indicating that the pointer moved off of an element.
365 gesture->type = WebInputEvent::MouseLeave; 350 gesture->type = WebInputEvent::MouseLeave;
366 gesture->details.move.delta.x = 0; 351 gesture->details.move.delta.x = 0;
367 gesture->details.move.delta.y = 0; 352 gesture->details.move.delta.y = 0;
368 current_input_target_->ProcessUpdatedGesture(*gesture.get()); 353 current_input_target_->ProcessUpdatedGesture(*gesture.get());
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
423 // it. For now, removing it seems working fine. 408 // it. For now, removing it seems working fine.
424 gvr_api_->ApplyNeckModel(head_pose, 1.0f); 409 gvr_api_->ApplyNeckModel(head_pose, 1.0f);
425 } 410 }
426 411
427 // Bind the primary framebuffer. 412 // Bind the primary framebuffer.
428 frame.BindBuffer(kFramePrimaryBuffer); 413 frame.BindBuffer(kFramePrimaryBuffer);
429 414
430 HandleQueuedTasks(); 415 HandleQueuedTasks();
431 416
432 // Update the render position of all UI elements (including desktop). 417 // Update the render position of all UI elements (including desktop).
433 float screen_tilt = desktop_screen_tilt_ * M_PI / 180.0f; 418 const float screen_tilt = kDesktopScreenTiltDefault * M_PI / 180.0f;
434 scene_->UpdateTransforms(screen_tilt, UiScene::TimeInMicroseconds()); 419 scene_->UpdateTransforms(screen_tilt, UiScene::TimeInMicroseconds());
435 420
436 UpdateController(GetForwardVector(head_pose)); 421 UpdateController(GetForwardVector(head_pose));
437 422
438 if (webvr_mode_) { 423 if (webvr_mode_) {
439 DrawWebVr(); 424 DrawWebVr();
440 425
441 // When using async reprojection, we need to know which pose was used in 426 // When using async reprojection, we need to know which pose was used in
442 // the WebVR app for drawing this frame. Due to unknown amounts of 427 // the WebVR app for drawing this frame. Due to unknown amounts of
443 // buffering in the compositor and SurfaceTexture, we read the pose number 428 // buffering in the compositor and SurfaceTexture, we read the pose number
(...skipping 14 matching lines...) Expand all
458 } 443 }
459 444
460 void VrShell::DrawVrShell(const gvr::Mat4f& head_pose, 445 void VrShell::DrawVrShell(const gvr::Mat4f& head_pose,
461 gvr::Frame &frame) { 446 gvr::Frame &frame) {
462 std::vector<const ContentRectangle*> head_locked_elements; 447 std::vector<const ContentRectangle*> head_locked_elements;
463 std::vector<const ContentRectangle*> world_elements; 448 std::vector<const ContentRectangle*> world_elements;
464 for (const auto& rect : scene_->GetUiElements()) { 449 for (const auto& rect : scene_->GetUiElements()) {
465 if (!rect->visible) { 450 if (!rect->visible) {
466 continue; 451 continue;
467 } 452 }
468 if (webvr_mode_ && rect->id == kBrowserUiElementId) {
469 continue;
470 }
471 if (rect->lock_to_fov) { 453 if (rect->lock_to_fov) {
472 head_locked_elements.push_back(rect.get()); 454 head_locked_elements.push_back(rect.get());
473 } else { 455 } else {
474 world_elements.push_back(rect.get()); 456 world_elements.push_back(rect.get());
475 } 457 }
476 } 458 }
477 459
478 if (!webvr_mode_) { 460 if (!webvr_mode_) {
479 glEnable(GL_CULL_FACE); 461 glEnable(GL_CULL_FACE);
480 glEnable(GL_DEPTH_TEST); 462 glEnable(GL_DEPTH_TEST);
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
536 } 518 }
537 } 519 }
538 } 520 }
539 521
540 void VrShell::DrawElements( 522 void VrShell::DrawElements(
541 const gvr::Mat4f& render_matrix, 523 const gvr::Mat4f& render_matrix,
542 const std::vector<const ContentRectangle*>& elements) { 524 const std::vector<const ContentRectangle*>& elements) {
543 for (const auto& rect : elements) { 525 for (const auto& rect : elements) {
544 Rectf copy_rect; 526 Rectf copy_rect;
545 jint texture_handle; 527 jint texture_handle;
546 if (rect->id == kBrowserUiElementId) { 528 if (rect->content_quad) {
547 copy_rect = {0, 0, 1, 1}; 529 copy_rect = {0, 0, 1, 1};
548 texture_handle = content_texture_id_; 530 texture_handle = content_texture_id_;
549 } else { 531 } else {
550 copy_rect.x = static_cast<float>(rect->copy_rect.x) / ui_tex_width_; 532 copy_rect.x = static_cast<float>(rect->copy_rect.x) / ui_tex_width_;
551 copy_rect.y = static_cast<float>(rect->copy_rect.y) / ui_tex_height_; 533 copy_rect.y = static_cast<float>(rect->copy_rect.y) / ui_tex_height_;
552 copy_rect.width = static_cast<float>(rect->copy_rect.width) / 534 copy_rect.width = static_cast<float>(rect->copy_rect.width) /
553 ui_tex_width_; 535 ui_tex_width_;
554 copy_rect.height = static_cast<float>(rect->copy_rect.height) / 536 copy_rect.height = static_cast<float>(rect->copy_rect.height) /
555 ui_tex_height_; 537 ui_tex_height_;
556 texture_handle = ui_texture_id_; 538 texture_handle = ui_texture_id_;
(...skipping 165 matching lines...) Expand 10 before | Expand all | Expand 10 after
722 gvr::GvrApi* VrShell::gvr_api() { 704 gvr::GvrApi* VrShell::gvr_api() {
723 return gvr_api_.get(); 705 return gvr_api_.get();
724 } 706 }
725 707
726 void VrShell::ContentSurfaceChanged(JNIEnv* env, 708 void VrShell::ContentSurfaceChanged(JNIEnv* env,
727 const JavaParamRef<jobject>& object, 709 const JavaParamRef<jobject>& object,
728 jint width, 710 jint width,
729 jint height, 711 jint height,
730 const JavaParamRef<jobject>& surface) { 712 const JavaParamRef<jobject>& surface) {
731 content_compositor_->SurfaceChanged((int)width, (int)height, surface); 713 content_compositor_->SurfaceChanged((int)width, (int)height, surface);
732 content::ScreenInfo result;
733 main_contents_->GetRenderWidgetHostView()->GetRenderWidgetHost()->
734 GetScreenInfo(&result);
735 float dpr = result.device_scale_factor;
736 scene_->GetUiElementById(kBrowserUiElementId)->copy_rect =
737 { 0, 0, width / dpr, height / dpr };
738 } 714 }
739 715
740 void VrShell::UiSurfaceChanged(JNIEnv* env, 716 void VrShell::UiSurfaceChanged(JNIEnv* env,
741 const JavaParamRef<jobject>& object, 717 const JavaParamRef<jobject>& object,
742 jint width, 718 jint width,
743 jint height, 719 jint height,
744 const JavaParamRef<jobject>& surface) { 720 const JavaParamRef<jobject>& surface) {
745 ui_compositor_->SurfaceChanged((int)width, (int)height, surface); 721 ui_compositor_->SurfaceChanged((int)width, (int)height, surface);
746 content::ScreenInfo result; 722 content::ScreenInfo result;
747 ui_contents_->GetRenderWidgetHostView()->GetRenderWidgetHost()->GetScreenInfo( 723 ui_contents_->GetRenderWidgetHostView()->GetRenderWidgetHost()->GetScreenInfo(
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after
813 const JavaParamRef<jobject>& ui_web_contents, 789 const JavaParamRef<jobject>& ui_web_contents,
814 jlong ui_window_android) { 790 jlong ui_window_android) {
815 return reinterpret_cast<intptr_t>(new VrShell( 791 return reinterpret_cast<intptr_t>(new VrShell(
816 env, obj, content::WebContents::FromJavaWebContents(content_web_contents), 792 env, obj, content::WebContents::FromJavaWebContents(content_web_contents),
817 reinterpret_cast<ui::WindowAndroid*>(content_window_android), 793 reinterpret_cast<ui::WindowAndroid*>(content_window_android),
818 content::WebContents::FromJavaWebContents(ui_web_contents), 794 content::WebContents::FromJavaWebContents(ui_web_contents),
819 reinterpret_cast<ui::WindowAndroid*>(ui_window_android))); 795 reinterpret_cast<ui::WindowAndroid*>(ui_window_android)));
820 } 796 }
821 797
822 } // namespace vr_shell 798 } // namespace vr_shell
OLDNEW
« no previous file with comments | « chrome/browser/android/vr_shell/vr_shell.h ('k') | chrome/browser/resources/vr_shell/vr_shell_ui.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698