| Index: chrome/browser/android/vr_shell/vr_shell_gl.cc
|
| diff --git a/chrome/browser/android/vr_shell/vr_shell_gl.cc b/chrome/browser/android/vr_shell/vr_shell_gl.cc
|
| index 6c9d72865e77953b7db6ab2fe0170ac3e7ba5409..bed8809c04409b5929dcb705c27c0dc7a67c3d45 100644
|
| --- a/chrome/browser/android/vr_shell/vr_shell_gl.cc
|
| +++ b/chrome/browser/android/vr_shell/vr_shell_gl.cc
|
| @@ -108,6 +108,40 @@ vr::Quatf GetRotationFromZAxis(gfx::Vector3dF vec) {
|
| return quat;
|
| }
|
|
|
| +gvr::Mat4f PerspectiveMatrixFromView(const gvr::Rectf& fov,
|
| + float z_near,
|
| + float z_far) {
|
| + gvr::Mat4f result;
|
| + const float x_left = -std::tan(fov.left * M_PI / 180.0f) * z_near;
|
| + const float x_right = std::tan(fov.right * M_PI / 180.0f) * z_near;
|
| + const float y_bottom = -std::tan(fov.bottom * M_PI / 180.0f) * z_near;
|
| + const float y_top = std::tan(fov.top * M_PI / 180.0f) * z_near;
|
| +
|
| + DCHECK(x_left < x_right && y_bottom < y_top && z_near < z_far &&
|
| + z_near > 0.0f && z_far > 0.0f);
|
| + const float X = (2 * z_near) / (x_right - x_left);
|
| + const float Y = (2 * z_near) / (y_top - y_bottom);
|
| + const float A = (x_right + x_left) / (x_right - x_left);
|
| + const float B = (y_top + y_bottom) / (y_top - y_bottom);
|
| + const float C = (z_near + z_far) / (z_near - z_far);
|
| + const float D = (2 * z_near * z_far) / (z_near - z_far);
|
| +
|
| + for (int i = 0; i < 4; ++i) {
|
| + for (int j = 0; j < 4; ++j) {
|
| + result.m[i][j] = 0.0f;
|
| + }
|
| + }
|
| + result.m[0][0] = X;
|
| + result.m[0][2] = A;
|
| + result.m[1][1] = Y;
|
| + result.m[1][2] = B;
|
| + result.m[2][2] = C;
|
| + result.m[2][3] = D;
|
| + result.m[3][2] = -1;
|
| +
|
| + return result;
|
| +}
|
| +
|
| std::unique_ptr<blink::WebMouseEvent> MakeMouseEvent(WebInputEvent::Type type,
|
| double timestamp,
|
| float x,
|
| @@ -150,13 +184,13 @@ void GvrMatToMatf(const gvr::Mat4f& in, vr::Mat4f* out) {
|
| *out = *reinterpret_cast<vr::Mat4f*>(const_cast<gvr::Mat4f*>(&in));
|
| }
|
|
|
| -gvr::Rectf GvrRectFromGfxRect(gfx::RectF rect) {
|
| - // gvr::Rectf bottom/top are reverse of gfx::RectF bottom/top.
|
| - return {rect.x(), rect.x() + rect.width(), rect.y(), rect.bottom()};
|
| +gvr::Rectf UVFromGfxRect(gfx::RectF rect) {
|
| + return {rect.x(), rect.x() + rect.width(), 1.0f - rect.bottom(),
|
| + 1.0f - rect.y()};
|
| }
|
|
|
| -gfx::RectF GfxRectFromGvrRect(gvr::Rectf rect) {
|
| - return gfx::RectF(rect.left, rect.bottom, rect.right - rect.left,
|
| +gfx::RectF GfxRectFromUV(gvr::Rectf rect) {
|
| + return gfx::RectF(rect.left, 1.0 - rect.top, rect.right - rect.left,
|
| rect.top - rect.bottom);
|
| }
|
|
|
| @@ -785,9 +819,8 @@ void VrShellGl::DrawFrame(int16_t frame_index) {
|
| break;
|
|
|
| const WebVrBounds& bounds = pending_bounds_.front().second;
|
| - webvr_left_viewport_->SetSourceUv(GvrRectFromGfxRect(bounds.left_bounds));
|
| - webvr_right_viewport_->SetSourceUv(
|
| - GvrRectFromGfxRect(bounds.right_bounds));
|
| + webvr_left_viewport_->SetSourceUv(UVFromGfxRect(bounds.left_bounds));
|
| + webvr_right_viewport_->SetSourceUv(UVFromGfxRect(bounds.right_bounds));
|
| DVLOG(1) << __FUNCTION__ << ": resize from pending_bounds to "
|
| << bounds.source_size.width() << "x"
|
| << bounds.source_size.height();
|
| @@ -889,7 +922,7 @@ void VrShellGl::DrawFrame(int16_t frame_index) {
|
| // After saving the timestamp, fps will be available via GetFPS().
|
| // TODO(vollick): enable rendering of this framerate in a HUD.
|
| fps_meter_->AddFrame(current_time);
|
| - LOG(ERROR) << "fps: " << fps_meter_->GetFPS();
|
| + DVLOG(1) << "fps: " << fps_meter_->GetFPS();
|
| #endif
|
| }
|
|
|
| @@ -958,17 +991,17 @@ void VrShellGl::DrawUiView(const vr::Mat4f& head_pose,
|
| GvrMatToMatf(gvr_api_->GetEyeFromHeadMatrix(eye), &eye_matrix);
|
| vr::MatrixMul(eye_matrix, head_pose, &eye_view_matrix);
|
|
|
| - const gfx::RectF& rect =
|
| - GfxRectFromGvrRect(buffer_viewport_->GetSourceUv());
|
| + const gfx::RectF& rect = GfxRectFromUV(buffer_viewport_->GetSourceUv());
|
| const gfx::Rect& pixel_rect = CalculatePixelSpaceRect(render_size, rect);
|
| glViewport(pixel_rect.x(), pixel_rect.y(), pixel_rect.width(),
|
| pixel_rect.height());
|
|
|
| vr::Mat4f render_matrix;
|
| vr::Mat4f perspective_matrix;
|
| - vr::PerspectiveMatrixFromView(
|
| - GfxRectFromGvrRect(buffer_viewport_->GetSourceFov()), kZNear, kZFar,
|
| - &perspective_matrix);
|
| + GvrMatToMatf(PerspectiveMatrixFromView(buffer_viewport_->GetSourceFov(),
|
| + kZNear, kZFar),
|
| + &perspective_matrix);
|
| +
|
| vr::MatrixMul(perspective_matrix, eye_view_matrix, &render_matrix);
|
|
|
| DrawElements(render_matrix, elementsInDrawOrder);
|
| @@ -1207,8 +1240,8 @@ void VrShellGl::UpdateWebVRTextureBounds(int16_t frame_index,
|
| const gfx::RectF& right_bounds,
|
| const gfx::Size& source_size) {
|
| if (frame_index < 0) {
|
| - webvr_left_viewport_->SetSourceUv(GvrRectFromGfxRect(left_bounds));
|
| - webvr_right_viewport_->SetSourceUv(GvrRectFromGfxRect(right_bounds));
|
| + webvr_left_viewport_->SetSourceUv(UVFromGfxRect(left_bounds));
|
| + webvr_right_viewport_->SetSourceUv(UVFromGfxRect(right_bounds));
|
| CreateOrResizeWebVRSurface(source_size);
|
| } else {
|
| pending_bounds_.emplace(
|
|
|