diff --git a/src/app.cpp b/src/app.cpp index 93cc016..3f8e005 100644 --- a/src/app.cpp +++ b/src/app.cpp @@ -1,13 +1,11 @@ #include "app.h" #include "panel.h" -#include "util.h" #include #include App::App() { _tracking_origin = vr::TrackingUniverseStanding; - // _hidden = false; InitOVR(); InitX11(); @@ -24,6 +22,7 @@ App::App() float pixels_per_meter = 1920; float x_min = -(monitor_info[0].x + monitor_info[0].width / 2.0f); + // float x_min = _root_width / -2.0f; for (int i = 0; i < monitor_count; i++) { diff --git a/src/app.h b/src/app.h index 09ac9e2..32cc25e 100644 --- a/src/app.h +++ b/src/app.h @@ -1,4 +1,6 @@ +#pragma once #define GL_GLEXT_PROTOTYPES + #include "util.h" #include #include diff --git a/src/grab_component.cpp b/src/grab_component.cpp new file mode 100644 index 0000000..fe1ab5b --- /dev/null +++ b/src/grab_component.cpp @@ -0,0 +1,94 @@ +#include "grab_component.h" + +GrabComponent::GrabComponent(App *app) +{ + _app = app; + _is_held = false; + _active_hand = 0; +} + +void GrabComponent::Update(OverlayID id, float *meters) +{ + _id = id; + + if (!_is_held) + { + for (auto controller : _app->GetControllers()) + { + if (_app->IsInputJustPressed(controller, _app->_input_handles.grab)) + { + vr::HmdMatrix34_t overlay_pose; + vr::ETrackingUniverseOrigin tracking_universe; + _app->vr_overlay->GetOverlayTransformAbsolute(id, &tracking_universe, &overlay_pose); + + auto controller_pos = GetPos(_app->GetTrackerPose(controller)); + + auto local_pos = glm::inverse(ConvertMat(overlay_pose)) * glm::vec4(controller_pos - GetPos(overlay_pose), 0); + + float grab_area_thickness = 0.3f; + bool close_enough = glm::abs(local_pos.z) < grab_area_thickness; + close_enough &= glm::abs(local_pos.x) < *meters / 2.0f; + close_enough &= glm::abs(local_pos.y) < *meters / 2.0f; + + if (close_enough) + { + ControllerGrab(controller); + } + } + } + } + else + { + if (!_app->GetControllerInputDigital(_active_hand, _app->_input_handles.grab).bState) + { + ControllerRelease(); + } + } +} + +bool GrabComponent::IsHeld() +{ + return _is_held; +} + +TrackerID GrabComponent::ActiveHand() +{ + return _active_hand; +} + +void GrabComponent::ControllerGrab(TrackerID controller) +{ + _is_held = true; + _active_hand = controller; + + _app->vr_overlay->SetOverlayColor(_id, 0.6f, 0.8f, 0.8f); + + vr::HmdMatrix34_t abs_pose; + vr::ETrackingUniverseOrigin tracking_universe; + _app->vr_overlay->GetOverlayTransformAbsolute(_id, &tracking_universe, &abs_pose); + + auto abs_mat = ConvertMat(abs_pose); + auto controller_mat = _app->GetTrackerPose(controller); + + vr::HmdMatrix34_t relative_pose = ConvertMat(glm::inverse(controller_mat) * (abs_mat)); + + _app->vr_overlay->SetOverlayTransformTrackedDeviceRelative(_id, controller, &relative_pose); +} + +void GrabComponent::ControllerRelease() +{ + _is_held = false; + _active_hand = -1; + + _app->vr_overlay->SetOverlayColor(_id, 1.0f, 1.0f, 1.0f); + + vr::HmdMatrix34_t relative_pose; + _app->vr_overlay->GetOverlayTransformTrackedDeviceRelative(_id, &_active_hand, &relative_pose); + auto relative_mat = ConvertMat(relative_pose); + + auto controller_mat = _app->GetTrackerPose(_active_hand); + + vr::HmdMatrix34_t new_pose = ConvertMat(controller_mat * relative_mat); + + _app->vr_overlay->SetOverlayTransformAbsolute(_id, _app->_tracking_origin, &new_pose); +} \ No newline at end of file diff --git a/src/grab_component.h b/src/grab_component.h new file mode 100644 index 0000000..d746450 --- /dev/null +++ b/src/grab_component.h @@ -0,0 +1,23 @@ +#pragma once + +#include "app.h" +#include "util.h" + +class GrabComponent +{ + public: + GrabComponent(App *app); + bool IsHeld(); + TrackerID ActiveHand(); + void Update(OverlayID id, float *meters); + + private: + void ControllerRelease(); + void ControllerGrab(TrackerID controller); + + App *_app; + OverlayID _id; + + bool _is_held; + TrackerID _active_hand; +}; \ No newline at end of file diff --git a/src/panel.cpp b/src/panel.cpp index 1835e34..ceba71d 100644 --- a/src/panel.cpp +++ b/src/panel.cpp @@ -1,10 +1,4 @@ #include "panel.h" -#include "app.h" -#include "util.h" - -#include -#include -#include Panel::Panel(App *app, vr::HmdMatrix34_t start_pose, int index, int x, int y, int width, int height) : _app(app), @@ -12,12 +6,13 @@ Panel::Panel(App *app, vr::HmdMatrix34_t start_pose, int index, int x, int y, in _x(x), _y(y), _width(width), - _height(height) + _height(height), + _grab_component(app) { _name = "screen_view_" + std::to_string(index); _alpha = 1.0f; _meters = 1.0f; - _active_hand = -1; + glGenTextures(1, &_gl_texture); glBindTexture(GL_TEXTURE_2D, _gl_texture); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); @@ -51,48 +46,7 @@ void Panel::Update() Render(); UpdateCursor(); - if (!_is_held) - { - for (auto controller : _app->GetControllers()) - { - if (_app->IsInputJustPressed(controller, _app->_input_handles.grab)) - { - vr::HmdMatrix34_t overlay_pose; - vr::ETrackingUniverseOrigin tracking_universe; - _app->vr_overlay->GetOverlayTransformAbsolute(_id, &tracking_universe, &overlay_pose); - - auto controller_pos = GetPos(_app->GetTrackerPose(controller)); - - auto local_pos = glm::inverse(ConvertMat(overlay_pose)) * glm::vec4(controller_pos - GetPos(overlay_pose), 0); - - float grab_area_thickness = 0.3f; - bool close_enough = glm::abs(local_pos.z) < grab_area_thickness; - close_enough &= glm::abs(local_pos.x) < _meters / 2.0f; - close_enough &= glm::abs(local_pos.y) < _meters / 2.0f; - - if (close_enough) - { - ControllerGrab(controller); - } - } - } - } - else - { - if (!_app->GetControllerInputDigital(_active_hand, _app->_input_handles.grab).bState) - { - ControllerRelease(); - } - // auto state = _app->GetControllerState(_active_hand); - // auto touchpad = state.rAxis[0]; - // if (touchpad.x != 0.0f) - // { - // // TODO take into account the current framerate - // _alpha += touchpad.x * 0.05; - // _alpha = glm::clamp(_alpha, 0.1f, 1.0f); - // _app->vr_overlay->SetOverlayAlpha(_id, _alpha); - // } - } + _grab_component.Update(_id, &_meters); } void Panel::Render() @@ -136,42 +90,3 @@ void Panel::UpdateCursor() auto pos = vr::HmdVector2_t{x, y}; _app->vr_overlay->SetOverlayCursorPositionOverride(_id, &pos); } - -void Panel::ControllerGrab(TrackerID controller) -{ - // printf("Grabbed panel %d\n", _index); - _is_held = true; - _active_hand = controller; - - _app->vr_overlay->SetOverlayColor(_id, 0.6f, 1.0f, 1.0f); - - vr::HmdMatrix34_t abs_pose; - vr::ETrackingUniverseOrigin tracking_universe; - - _app->vr_overlay->GetOverlayTransformAbsolute(_id, &tracking_universe, &abs_pose); - auto abs_mat = ConvertMat(abs_pose); - - auto controller_mat = _app->GetTrackerPose(controller); - - vr::HmdMatrix34_t relative_pose = ConvertMat(glm::inverse(controller_mat) * (abs_mat)); - - _app->vr_overlay->SetOverlayTransformTrackedDeviceRelative(_id, controller, &relative_pose); -} - -void Panel::ControllerRelease() -{ - // printf("Released panel %d\n", _index); - _is_held = false; - - _app->vr_overlay->SetOverlayColor(_id, 1.0f, 1.0f, 1.0f); - - vr::HmdMatrix34_t relative_pose; - _app->vr_overlay->GetOverlayTransformTrackedDeviceRelative(_id, &_active_hand, &relative_pose); - auto relative_mat = ConvertMat(relative_pose); - - auto controller_mat = _app->GetTrackerPose(_active_hand); - - vr::HmdMatrix34_t new_pose = ConvertMat(controller_mat * relative_mat); - - _app->vr_overlay->SetOverlayTransformAbsolute(_id, _app->_tracking_origin, &new_pose); -} \ No newline at end of file diff --git a/src/panel.h b/src/panel.h index 9e2fad9..43d0b42 100644 --- a/src/panel.h +++ b/src/panel.h @@ -1,7 +1,9 @@ +#pragma once #define GL_GLEXT_PROTOTYPES + +#include "grab_component.h" #include "util.h" #include -#include const vr::HmdMatrix34_t DEFAULT_POSE = {{{1, 0, 0, 0}, {0, 1, 0, 1}, {0, 0, 1, 0}}}; @@ -18,23 +20,20 @@ class Panel private: void Render(); void UpdateCursor(); - void ControllerGrab(TrackerID); - void ControllerRelease(); App *_app; OverlayID _id; int _index; std::string _name; - TrackerID _active_hand; - bool _is_held; - int _x, _y; int _width, _height; float _meters; float _alpha; bool _hidden; + GrabComponent _grab_component; + vr::Texture_t _texture; GLuint _gl_texture; }; \ No newline at end of file