Loading services/vr/vr_window_manager/aidl/android/service/vr/IVrWindowManager.aidl +1 −0 Original line number Diff line number Diff line Loading @@ -25,5 +25,6 @@ interface IVrWindowManager { void exitVrMode() = 3; void setDebugMode(int mode) = 4; void set2DMode(int mode) = 5; void setRotation(int angle) = 6; } services/vr/vr_window_manager/display_view.cpp +16 −8 Original line number Diff line number Diff line Loading @@ -146,16 +146,18 @@ ViewMode CalculateVisibilityFromLayerConfig(const HwcCallback::Frame& frame, DisplayView::DisplayView(uint32_t id, int touchpad_id) : id_(id), touchpad_id_(touchpad_id) { translate_ = Eigen::Translation3f(0, 0, -2.5f); translate_ = Eigen::Translation3f(0, 0, -5.0f); ime_translate_ = mat4(Eigen::Translation3f(0.0f, -0.5f, 0.25f)); ime_top_left_ = vec2(0, 0); ime_size_ = vec2(0, 0); rotation_ = mat4::Identity(); } DisplayView::~DisplayView() {} void DisplayView::Recenter(const mat4& initial) { initial_head_matrix_ = initial; initial_head_matrix_ = initial * Eigen::AngleAxisf(M_PI * 0.5f, vec3::UnitZ()); } void DisplayView::SetPrograms(ShaderProgram* program, Loading Loading @@ -248,7 +250,7 @@ base::unique_fd DisplayView::OnFrame(std::unique_ptr<HwcCallback::Frame> frame, bool DisplayView::IsHit(const vec3& view_location, const vec3& view_direction, vec3* hit_location, vec2* hit_location_in_window_coord, bool test_ime) { mat4 m = initial_head_matrix_ * translate_; mat4 m = GetStandardTransform(); if (test_ime) m = m * ime_translate_; mat4 inverse = (m * scale_).inverse(); Loading Loading @@ -314,8 +316,7 @@ void DisplayView::DrawOverlays(const mat4& perspective, const mat4& eye_matrix, mat4 layer_transform = GetLayerTransform(texture_layer, size_.x(), size_.y()); mat4 transform = initial_head_matrix_ * translate_ * scale_ * layer_transform; mat4 transform = GetStandardTransform() * scale_ * layer_transform; DrawWithTransform(transform, *program_); glDisable(GL_BLEND); Loading Loading @@ -351,14 +352,21 @@ void DisplayView::UpdateReleaseFence() { } } mat4 DisplayView::GetStandardTransform() { mat4 m = initial_head_matrix_ * rotation_ * translate_; if (current_frame_.visibility == ViewMode::App) m *= Eigen::AngleAxisf(M_PI * -0.5f, vec3::UnitZ()); return m; } void DisplayView::DrawIme() { program_->Use(); glBindTexture(GL_TEXTURE_2D, ime_texture_.texture->id()); mat4 layer_transform = GetLayerTransform(ime_texture_, size_.x(), size_.y()); mat4 transform = initial_head_matrix_ * translate_ * ime_translate_ * scale_ * layer_transform; mat4 transform = GetStandardTransform() * ime_translate_ * scale_ * layer_transform; DrawWithTransform(transform, *program_); } Loading @@ -377,7 +385,7 @@ void DisplayView::DrawDimOverlay(const mat4& mvp, const TextureLayer& layer, glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); mat4 layer_transform = GetLayerTransform(layer, size_.x(), size_.y()); mat4 transform = initial_head_matrix_ * translate_ * scale_ * layer_transform; mat4 transform = GetStandardTransform() * scale_ * layer_transform; DrawWithTransform(transform, *overlay_program_); glDisable(GL_BLEND); } Loading services/vr/vr_window_manager/display_view.h +6 −0 Original line number Diff line number Diff line Loading @@ -47,6 +47,8 @@ class DisplayView { void set_2dmode(bool mode) { use_2dmode_ = mode; } void set_always_2d(bool mode) { always_2d_ = mode; } void set_rotation(const mat4& rotation) { rotation_ = rotation; } private: bool IsHit(const vec3& view_location, const vec3& view_direction, vec3* hit_location, vec2* hit_location_in_window_coord, Loading @@ -60,6 +62,9 @@ class DisplayView { const vec2& top_left, const vec2& bottom_right); void DrawWithTransform(const mat4& transform, const ShaderProgram& program); // This is the rotated, translated but unscaled transform to apply everywhere. mat4 GetStandardTransform(); uint32_t id_; int touchpad_id_; Loading @@ -72,6 +77,7 @@ class DisplayView { mat4 scale_; mat4 translate_; mat4 ime_translate_; mat4 rotation_; vec2 size_; std::vector<TextureLayer> textures_; Loading services/vr/vr_window_manager/shell_view.cpp +14 −6 Original line number Diff line number Diff line Loading @@ -205,6 +205,12 @@ void ShellView::Set2DMode(bool mode) { displays_[0]->set_2dmode(mode); } void ShellView::SetRotation(int angle) { mat4 m(Eigen::AngleAxisf(M_PI * -0.5f * angle, vec3::UnitZ())); for (auto& d: displays_) d->set_rotation(m); } void ShellView::OnDrawFrame() { bool visible = false; Loading Loading @@ -323,10 +329,6 @@ void ShellView::DrawEye(EyeType eye, const mat4& perspective, size_ = vec2(surface_flinger_view_->width(), surface_flinger_view_->height()); // TODO(alexst): Replicate controller rendering from VR Home. // Current approach in the function below is a quick visualization. DrawController(perspective, eye_matrix, head_matrix); for (auto& display : displays_) { if (display->visible()) { display->DrawEye(eye, perspective, eye_matrix, head_matrix, size_, Loading @@ -334,6 +336,10 @@ void ShellView::DrawEye(EyeType eye, const mat4& perspective, } } // TODO(alexst): Replicate controller rendering from VR Home. // Current approach in the function below is a quick visualization. DrawController(perspective, eye_matrix, head_matrix); DrawReticle(perspective, eye_matrix, head_matrix); } Loading Loading @@ -476,12 +482,14 @@ void ShellView::Touch() { const vec2& hit_location = active_display_->hit_location(); float x = hit_location.x() / size_.x(); float y = hit_location.y() / size_.y(); // Device is portrait, but in landscape when in VR. // Rotate touch input appropriately. const android::status_t status = dvrVirtualTouchpadTouch( virtual_touchpad_.get(), active_display_->touchpad_id(), 1.0f - hit_location.y() / size_.y(), hit_location.x() / size_.x(), is_touching_ ? 1.0f : 0.0f); x, y, is_touching_ ? 1.0f : 0.0f); if (status != OK) { ALOGE("touch failed: %d", status); } Loading services/vr/vr_window_manager/shell_view.h +1 −0 Original line number Diff line number Diff line Loading @@ -34,6 +34,7 @@ class ShellView : public Application, void VrMode(bool mode) override; void dumpInternal(String8& result) override; void Set2DMode(bool mode) override; void SetRotation(int angle) override; protected: Loading Loading
services/vr/vr_window_manager/aidl/android/service/vr/IVrWindowManager.aidl +1 −0 Original line number Diff line number Diff line Loading @@ -25,5 +25,6 @@ interface IVrWindowManager { void exitVrMode() = 3; void setDebugMode(int mode) = 4; void set2DMode(int mode) = 5; void setRotation(int angle) = 6; }
services/vr/vr_window_manager/display_view.cpp +16 −8 Original line number Diff line number Diff line Loading @@ -146,16 +146,18 @@ ViewMode CalculateVisibilityFromLayerConfig(const HwcCallback::Frame& frame, DisplayView::DisplayView(uint32_t id, int touchpad_id) : id_(id), touchpad_id_(touchpad_id) { translate_ = Eigen::Translation3f(0, 0, -2.5f); translate_ = Eigen::Translation3f(0, 0, -5.0f); ime_translate_ = mat4(Eigen::Translation3f(0.0f, -0.5f, 0.25f)); ime_top_left_ = vec2(0, 0); ime_size_ = vec2(0, 0); rotation_ = mat4::Identity(); } DisplayView::~DisplayView() {} void DisplayView::Recenter(const mat4& initial) { initial_head_matrix_ = initial; initial_head_matrix_ = initial * Eigen::AngleAxisf(M_PI * 0.5f, vec3::UnitZ()); } void DisplayView::SetPrograms(ShaderProgram* program, Loading Loading @@ -248,7 +250,7 @@ base::unique_fd DisplayView::OnFrame(std::unique_ptr<HwcCallback::Frame> frame, bool DisplayView::IsHit(const vec3& view_location, const vec3& view_direction, vec3* hit_location, vec2* hit_location_in_window_coord, bool test_ime) { mat4 m = initial_head_matrix_ * translate_; mat4 m = GetStandardTransform(); if (test_ime) m = m * ime_translate_; mat4 inverse = (m * scale_).inverse(); Loading Loading @@ -314,8 +316,7 @@ void DisplayView::DrawOverlays(const mat4& perspective, const mat4& eye_matrix, mat4 layer_transform = GetLayerTransform(texture_layer, size_.x(), size_.y()); mat4 transform = initial_head_matrix_ * translate_ * scale_ * layer_transform; mat4 transform = GetStandardTransform() * scale_ * layer_transform; DrawWithTransform(transform, *program_); glDisable(GL_BLEND); Loading Loading @@ -351,14 +352,21 @@ void DisplayView::UpdateReleaseFence() { } } mat4 DisplayView::GetStandardTransform() { mat4 m = initial_head_matrix_ * rotation_ * translate_; if (current_frame_.visibility == ViewMode::App) m *= Eigen::AngleAxisf(M_PI * -0.5f, vec3::UnitZ()); return m; } void DisplayView::DrawIme() { program_->Use(); glBindTexture(GL_TEXTURE_2D, ime_texture_.texture->id()); mat4 layer_transform = GetLayerTransform(ime_texture_, size_.x(), size_.y()); mat4 transform = initial_head_matrix_ * translate_ * ime_translate_ * scale_ * layer_transform; mat4 transform = GetStandardTransform() * ime_translate_ * scale_ * layer_transform; DrawWithTransform(transform, *program_); } Loading @@ -377,7 +385,7 @@ void DisplayView::DrawDimOverlay(const mat4& mvp, const TextureLayer& layer, glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); mat4 layer_transform = GetLayerTransform(layer, size_.x(), size_.y()); mat4 transform = initial_head_matrix_ * translate_ * scale_ * layer_transform; mat4 transform = GetStandardTransform() * scale_ * layer_transform; DrawWithTransform(transform, *overlay_program_); glDisable(GL_BLEND); } Loading
services/vr/vr_window_manager/display_view.h +6 −0 Original line number Diff line number Diff line Loading @@ -47,6 +47,8 @@ class DisplayView { void set_2dmode(bool mode) { use_2dmode_ = mode; } void set_always_2d(bool mode) { always_2d_ = mode; } void set_rotation(const mat4& rotation) { rotation_ = rotation; } private: bool IsHit(const vec3& view_location, const vec3& view_direction, vec3* hit_location, vec2* hit_location_in_window_coord, Loading @@ -60,6 +62,9 @@ class DisplayView { const vec2& top_left, const vec2& bottom_right); void DrawWithTransform(const mat4& transform, const ShaderProgram& program); // This is the rotated, translated but unscaled transform to apply everywhere. mat4 GetStandardTransform(); uint32_t id_; int touchpad_id_; Loading @@ -72,6 +77,7 @@ class DisplayView { mat4 scale_; mat4 translate_; mat4 ime_translate_; mat4 rotation_; vec2 size_; std::vector<TextureLayer> textures_; Loading
services/vr/vr_window_manager/shell_view.cpp +14 −6 Original line number Diff line number Diff line Loading @@ -205,6 +205,12 @@ void ShellView::Set2DMode(bool mode) { displays_[0]->set_2dmode(mode); } void ShellView::SetRotation(int angle) { mat4 m(Eigen::AngleAxisf(M_PI * -0.5f * angle, vec3::UnitZ())); for (auto& d: displays_) d->set_rotation(m); } void ShellView::OnDrawFrame() { bool visible = false; Loading Loading @@ -323,10 +329,6 @@ void ShellView::DrawEye(EyeType eye, const mat4& perspective, size_ = vec2(surface_flinger_view_->width(), surface_flinger_view_->height()); // TODO(alexst): Replicate controller rendering from VR Home. // Current approach in the function below is a quick visualization. DrawController(perspective, eye_matrix, head_matrix); for (auto& display : displays_) { if (display->visible()) { display->DrawEye(eye, perspective, eye_matrix, head_matrix, size_, Loading @@ -334,6 +336,10 @@ void ShellView::DrawEye(EyeType eye, const mat4& perspective, } } // TODO(alexst): Replicate controller rendering from VR Home. // Current approach in the function below is a quick visualization. DrawController(perspective, eye_matrix, head_matrix); DrawReticle(perspective, eye_matrix, head_matrix); } Loading Loading @@ -476,12 +482,14 @@ void ShellView::Touch() { const vec2& hit_location = active_display_->hit_location(); float x = hit_location.x() / size_.x(); float y = hit_location.y() / size_.y(); // Device is portrait, but in landscape when in VR. // Rotate touch input appropriately. const android::status_t status = dvrVirtualTouchpadTouch( virtual_touchpad_.get(), active_display_->touchpad_id(), 1.0f - hit_location.y() / size_.y(), hit_location.x() / size_.x(), is_touching_ ? 1.0f : 0.0f); x, y, is_touching_ ? 1.0f : 0.0f); if (status != OK) { ALOGE("touch failed: %d", status); } Loading
services/vr/vr_window_manager/shell_view.h +1 −0 Original line number Diff line number Diff line Loading @@ -34,6 +34,7 @@ class ShellView : public Application, void VrMode(bool mode) override; void dumpInternal(String8& result) override; void Set2DMode(bool mode) override; void SetRotation(int angle) override; protected: Loading