mirror of
https://github.com/CrispyPin/sinpin-vr.git
synced 2024-11-22 10:00:25 +01:00
add scrolling
This commit is contained in:
parent
858da78820
commit
035d9e7296
8 changed files with 95 additions and 30 deletions
2
Makefile
2
Makefile
|
@ -1,4 +1,4 @@
|
||||||
VERSION=v0.2.0
|
VERSION=v0.2.1
|
||||||
# CC := g++
|
# CC := g++
|
||||||
CC := clang++
|
CC := clang++
|
||||||
LFLAGS := -lX11 -lXrandr -lXtst -lglfw -lGL
|
LFLAGS := -lX11 -lXrandr -lXtst -lglfw -lGL
|
||||||
|
|
|
@ -45,6 +45,16 @@
|
||||||
"name": "/actions/cursor/in/mouse_right",
|
"name": "/actions/cursor/in/mouse_right",
|
||||||
"requirement": "suggested",
|
"requirement": "suggested",
|
||||||
"type": "boolean"
|
"type": "boolean"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "/actions/cursor/in/mouse_middle",
|
||||||
|
"requirement": "optional",
|
||||||
|
"type": "boolean"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "/actions/cursor/in/scroll",
|
||||||
|
"requirement": "suggested",
|
||||||
|
"type": "vector2"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"action_sets": [
|
"action_sets": [
|
||||||
|
@ -70,8 +80,10 @@
|
||||||
"/actions/edit/in/grab": "grab panel",
|
"/actions/edit/in/grab": "grab panel",
|
||||||
"/actions/edit/in/distance": "push/pull overlay",
|
"/actions/edit/in/distance": "push/pull overlay",
|
||||||
"/actions/cursor/in/activate_cursor": "activate cursor",
|
"/actions/cursor/in/activate_cursor": "activate cursor",
|
||||||
"/actions/cursor/in/mouse_left": "mouse left",
|
"/actions/cursor/in/mouse_left": "left mouse button",
|
||||||
"/actions/cursor/in/mouse_right": "mouse right"
|
"/actions/cursor/in/mouse_right": "right mouse button",
|
||||||
|
"/actions/cursor/in/mouse_middle": "middle mouse button",
|
||||||
|
"/actions/cursor/in/scroll": "scroll"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
|
@ -195,6 +195,24 @@
|
||||||
},
|
},
|
||||||
"mode" : "button",
|
"mode" : "button",
|
||||||
"path" : "/user/hand/right/input/trackpad"
|
"path" : "/user/hand/right/input/trackpad"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"inputs" : {
|
||||||
|
"position" : {
|
||||||
|
"output" : "/actions/cursor/in/scroll"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"mode" : "joystick",
|
||||||
|
"path" : "/user/hand/left/input/thumbstick"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"inputs" : {
|
||||||
|
"position" : {
|
||||||
|
"output" : "/actions/cursor/in/scroll"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"mode" : "joystick",
|
||||||
|
"path" : "/user/hand/right/input/thumbstick"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
|
18
src/app.cpp
18
src/app.cpp
|
@ -9,6 +9,8 @@
|
||||||
|
|
||||||
const VRMat root_start_pose = {{{1, 0, 0, 0}, {0, 1, 0, 0.8f}, {0, 0, 1, 0}}}; // 0.8m above origin
|
const VRMat root_start_pose = {{{1, 0, 0, 0}, {0, 1, 0, 0.8f}, {0, 0, 1, 0}}}; // 0.8m above origin
|
||||||
|
|
||||||
|
const int FRAME_INTERVAL = 4; // number of update loops until the frame buffer is updated
|
||||||
|
|
||||||
App::App()
|
App::App()
|
||||||
{
|
{
|
||||||
_tracking_origin = vr::TrackingUniverseStanding;
|
_tracking_origin = vr::TrackingUniverseStanding;
|
||||||
|
@ -69,6 +71,10 @@ App::App()
|
||||||
assert(action_err == 0);
|
assert(action_err == 0);
|
||||||
action_err = vr_input->GetActionHandle("/actions/cursor/in/mouse_right", &_input_handles.cursor.mouse_right);
|
action_err = vr_input->GetActionHandle("/actions/cursor/in/mouse_right", &_input_handles.cursor.mouse_right);
|
||||||
assert(action_err == 0);
|
assert(action_err == 0);
|
||||||
|
action_err = vr_input->GetActionHandle("/actions/cursor/in/mouse_middle", &_input_handles.cursor.mouse_middle);
|
||||||
|
assert(action_err == 0);
|
||||||
|
action_err = vr_input->GetActionHandle("/actions/cursor/in/scroll", &_input_handles.cursor.scroll);
|
||||||
|
assert(action_err == 0);
|
||||||
action_err = vr_input->GetActionSetHandle("/actions/main", &_input_handles.main_set);
|
action_err = vr_input->GetActionSetHandle("/actions/main", &_input_handles.main_set);
|
||||||
assert(action_err == 0);
|
assert(action_err == 0);
|
||||||
action_err = vr_input->GetActionSetHandle("/actions/edit", &_input_handles.edit_set);
|
action_err = vr_input->GetActionSetHandle("/actions/edit", &_input_handles.edit_set);
|
||||||
|
@ -138,9 +144,9 @@ void App::InitRootOverlay()
|
||||||
_root_overlay.SetTextureToColor(110, 30, 190);
|
_root_overlay.SetTextureToColor(110, 30, 190);
|
||||||
}
|
}
|
||||||
|
|
||||||
void App::Update()
|
void App::Update(float dtime)
|
||||||
{
|
{
|
||||||
UpdateInput();
|
UpdateInput(dtime);
|
||||||
if (!_hidden)
|
if (!_hidden)
|
||||||
{
|
{
|
||||||
_root_overlay.Update();
|
_root_overlay.Update();
|
||||||
|
@ -153,7 +159,7 @@ void App::Update()
|
||||||
_frames_since_framebuffer += 1;
|
_frames_since_framebuffer += 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
void App::UpdateInput()
|
void App::UpdateInput(float dtime)
|
||||||
{
|
{
|
||||||
vr::VRActiveActionSet_t active_sets[2];
|
vr::VRActiveActionSet_t active_sets[2];
|
||||||
active_sets[0].ulActionSet = _input_handles.main_set;
|
active_sets[0].ulActionSet = _input_handles.main_set;
|
||||||
|
@ -206,8 +212,8 @@ void App::UpdateInput()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
_controllers[0]->Update();
|
_controllers[0]->Update(dtime);
|
||||||
_controllers[1]->Update();
|
_controllers[1]->Update(dtime);
|
||||||
}
|
}
|
||||||
|
|
||||||
void App::UpdateUIVisibility()
|
void App::UpdateUIVisibility()
|
||||||
|
@ -218,7 +224,7 @@ void App::UpdateUIVisibility()
|
||||||
|
|
||||||
void App::UpdateFramebuffer()
|
void App::UpdateFramebuffer()
|
||||||
{
|
{
|
||||||
if (_frames_since_framebuffer < 2)
|
if (_frames_since_framebuffer < FRAME_INTERVAL)
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
|
@ -30,6 +30,8 @@ struct InputHandles
|
||||||
vr::VRActionHandle_t activate;
|
vr::VRActionHandle_t activate;
|
||||||
vr::VRActionHandle_t mouse_left;
|
vr::VRActionHandle_t mouse_left;
|
||||||
vr::VRActionHandle_t mouse_right;
|
vr::VRActionHandle_t mouse_right;
|
||||||
|
vr::VRActionHandle_t mouse_middle;
|
||||||
|
vr::VRActionHandle_t scroll;
|
||||||
} cursor;
|
} cursor;
|
||||||
vr::VRActionSetHandle_t cursor_set;
|
vr::VRActionSetHandle_t cursor_set;
|
||||||
struct
|
struct
|
||||||
|
@ -45,7 +47,7 @@ class App
|
||||||
public:
|
public:
|
||||||
App();
|
App();
|
||||||
~App();
|
~App();
|
||||||
void Update();
|
void Update(float dtime);
|
||||||
|
|
||||||
std::vector<TrackerID> GetControllers();
|
std::vector<TrackerID> GetControllers();
|
||||||
glm::mat4 GetTrackerPose(TrackerID tracker);
|
glm::mat4 GetTrackerPose(TrackerID tracker);
|
||||||
|
@ -94,6 +96,6 @@ class App
|
||||||
void InitRootOverlay();
|
void InitRootOverlay();
|
||||||
|
|
||||||
void UpdateFramebuffer();
|
void UpdateFramebuffer();
|
||||||
void UpdateInput();
|
void UpdateInput(float dtime);
|
||||||
void UpdateUIVisibility();
|
void UpdateUIVisibility();
|
||||||
};
|
};
|
|
@ -4,9 +4,10 @@
|
||||||
#include "util.h"
|
#include "util.h"
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
const float laser_width = 0.004f;
|
const float LASER_WIDTH = 0.004f;
|
||||||
const Color edit_col{1, 0.6f, 1};
|
const Color EDIT_COLOR{1, 0.6f, 1};
|
||||||
const Color cursor_col{0.3f, 1, 1};
|
const Color CURSOR_COLOR{0.3f, 1, 1};
|
||||||
|
const float SCROLL_SPEED = 48.0f;
|
||||||
|
|
||||||
Controller::Controller(App *app, ControllerSide side)
|
Controller::Controller(App *app, ControllerSide side)
|
||||||
{
|
{
|
||||||
|
@ -16,6 +17,7 @@ Controller::Controller(App *app, ControllerSide side)
|
||||||
_is_connected = false;
|
_is_connected = false;
|
||||||
_side = side;
|
_side = side;
|
||||||
_cursor_active = false;
|
_cursor_active = false;
|
||||||
|
_last_sent_scroll = 0;
|
||||||
|
|
||||||
std::string laser_name = "controller_laser_";
|
std::string laser_name = "controller_laser_";
|
||||||
if (side == ControllerSide::Left)
|
if (side == ControllerSide::Left)
|
||||||
|
@ -70,7 +72,7 @@ glm::vec3 Controller::GetLastRot()
|
||||||
return _last_rotation;
|
return _last_rotation;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Controller::Update()
|
void Controller::Update(float dtime)
|
||||||
{
|
{
|
||||||
UpdateStatus();
|
UpdateStatus();
|
||||||
if (!_is_connected)
|
if (!_is_connected)
|
||||||
|
@ -80,7 +82,7 @@ void Controller::Update()
|
||||||
|
|
||||||
if (_app->_edit_mode)
|
if (_app->_edit_mode)
|
||||||
{
|
{
|
||||||
_laser.SetColor(edit_col);
|
_laser.SetColor(EDIT_COLOR);
|
||||||
if (_last_ray.overlay != nullptr)
|
if (_last_ray.overlay != nullptr)
|
||||||
{
|
{
|
||||||
auto ray = _last_ray;
|
auto ray = _last_ray;
|
||||||
|
@ -100,7 +102,7 @@ void Controller::Update()
|
||||||
|
|
||||||
if (_grabbed_overlay != nullptr)
|
if (_grabbed_overlay != nullptr)
|
||||||
{
|
{
|
||||||
float move = _app->GetInputAnalog(_app->_input_handles.edit.distance, _input_handle).y * 0.1; // TODO use frame time
|
float move = _app->GetInputAnalog(_app->_input_handles.edit.distance, _input_handle).y * dtime * 8;
|
||||||
if (move != 0.0f)
|
if (move != 0.0f)
|
||||||
{
|
{
|
||||||
auto transform = _grabbed_overlay->GetTarget()->transform;
|
auto transform = _grabbed_overlay->GetTarget()->transform;
|
||||||
|
@ -120,7 +122,7 @@ void Controller::Update()
|
||||||
}
|
}
|
||||||
_cursor_active = !_cursor_active;
|
_cursor_active = !_cursor_active;
|
||||||
_app->_active_cursor = this;
|
_app->_active_cursor = this;
|
||||||
_laser.SetColor(cursor_col);
|
_laser.SetColor(CURSOR_COLOR);
|
||||||
}
|
}
|
||||||
if (_cursor_active)
|
if (_cursor_active)
|
||||||
{
|
{
|
||||||
|
@ -139,20 +141,41 @@ void Controller::Update()
|
||||||
pos *= _last_ray.hit_panel->Width();
|
pos *= _last_ray.hit_panel->Width();
|
||||||
_last_ray.hit_panel->SetCursor(pos.x, pos.y);
|
_last_ray.hit_panel->SetCursor(pos.x, pos.y);
|
||||||
}
|
}
|
||||||
auto mouse_left = _app->GetInputDigital(_app->_input_handles.cursor.mouse_left, _input_handle);
|
UpdateMouseButton(_app->_input_handles.cursor.mouse_left, 1);
|
||||||
if (mouse_left.bChanged)
|
UpdateMouseButton(_app->_input_handles.cursor.mouse_middle, 2);
|
||||||
|
UpdateMouseButton(_app->_input_handles.cursor.mouse_right, 3);
|
||||||
|
auto scroll_state = _app->GetInputAnalog(_app->_input_handles.cursor.scroll, _input_handle);
|
||||||
|
if (scroll_state.y != 0)
|
||||||
{
|
{
|
||||||
_app->SendMouseInput(1, mouse_left.bState);
|
_last_sent_scroll += dtime * glm::abs(scroll_state.y) * SCROLL_SPEED;
|
||||||
}
|
if (_last_sent_scroll > 1)
|
||||||
auto mouse_right = _app->GetInputDigital(_app->_input_handles.cursor.mouse_right, _input_handle);
|
{
|
||||||
if (mouse_right.bChanged)
|
_last_sent_scroll = 0;
|
||||||
{
|
if (scroll_state.y > 0)
|
||||||
_app->SendMouseInput(3, mouse_right.bState);
|
{
|
||||||
|
_app->SendMouseInput(4, true);
|
||||||
|
_app->SendMouseInput(4, false);
|
||||||
|
}
|
||||||
|
else if (scroll_state.y < 0)
|
||||||
|
{
|
||||||
|
_app->SendMouseInput(5, true);
|
||||||
|
_app->SendMouseInput(5, false);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Controller::UpdateMouseButton(vr::VRActionHandle_t binding, unsigned int button)
|
||||||
|
{
|
||||||
|
auto state = _app->GetInputDigital(binding, _input_handle);
|
||||||
|
if (state.bChanged)
|
||||||
|
{
|
||||||
|
_app->SendMouseInput(button, state.bState);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void Controller::UpdateLaser()
|
void Controller::UpdateLaser()
|
||||||
{
|
{
|
||||||
auto controller_pose = _app->GetTrackerPose(_device_index);
|
auto controller_pose = _app->GetTrackerPose(_device_index);
|
||||||
|
@ -170,7 +193,7 @@ void Controller::UpdateLaser()
|
||||||
hmd_local_pos.z = 0;
|
hmd_local_pos.z = 0;
|
||||||
auto hmd_dir = glm::normalize(hmd_local_pos);
|
auto hmd_dir = glm::normalize(hmd_local_pos);
|
||||||
|
|
||||||
VRMat transform = {{{laser_width * hmd_dir.y, 0, laser_width * hmd_dir.x, 0}, {laser_width * -hmd_dir.x, 0, laser_width * hmd_dir.y, 0}, {0, len, 0, len * -0.5f}}};
|
VRMat transform = {{{LASER_WIDTH * hmd_dir.y, 0, LASER_WIDTH * hmd_dir.x, 0}, {LASER_WIDTH * -hmd_dir.x, 0, LASER_WIDTH * hmd_dir.y, 0}, {0, len, 0, len * -0.5f}}};
|
||||||
_laser.SetTransformTracker(_device_index, &transform);
|
_laser.SetTransformTracker(_device_index, &transform);
|
||||||
_laser.SetHidden(!_is_connected || _app->_hidden || (!_app->_edit_mode && !_cursor_active));
|
_laser.SetHidden(!_is_connected || _app->_hidden || (!_app->_edit_mode && !_cursor_active));
|
||||||
}
|
}
|
||||||
|
|
|
@ -26,7 +26,7 @@ class Controller
|
||||||
|
|
||||||
void ReleaseOverlay();
|
void ReleaseOverlay();
|
||||||
|
|
||||||
void Update();
|
void Update(float dtime);
|
||||||
|
|
||||||
bool _cursor_active;
|
bool _cursor_active;
|
||||||
|
|
||||||
|
@ -34,6 +34,8 @@ class Controller
|
||||||
void UpdateStatus();
|
void UpdateStatus();
|
||||||
void UpdateLaser();
|
void UpdateLaser();
|
||||||
|
|
||||||
|
void UpdateMouseButton(vr::VRActionHandle_t binding, unsigned int button);
|
||||||
|
|
||||||
App *_app;
|
App *_app;
|
||||||
Overlay _laser;
|
Overlay _laser;
|
||||||
ControllerSide _side;
|
ControllerSide _side;
|
||||||
|
@ -47,4 +49,6 @@ class Controller
|
||||||
Ray _last_ray;
|
Ray _last_ray;
|
||||||
glm::vec3 _last_rotation;
|
glm::vec3 _last_rotation;
|
||||||
glm::vec3 _last_pos;
|
glm::vec3 _last_pos;
|
||||||
|
|
||||||
|
float _last_sent_scroll;
|
||||||
};
|
};
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
#include "app.h"
|
#include "app.h"
|
||||||
#include <signal.h>
|
#include <signal.h>
|
||||||
|
|
||||||
#define UPDATE_RATE 60
|
#define UPDATE_RATE 120
|
||||||
|
|
||||||
bool should_exit = false;
|
bool should_exit = false;
|
||||||
|
|
||||||
|
@ -18,8 +18,8 @@ int main()
|
||||||
|
|
||||||
while (!should_exit)
|
while (!should_exit)
|
||||||
{
|
{
|
||||||
app.Update();
|
|
||||||
usleep(1000000 / UPDATE_RATE);
|
usleep(1000000 / UPDATE_RATE);
|
||||||
|
app.Update(1.0 / UPDATE_RATE);
|
||||||
}
|
}
|
||||||
printf("\nShutting down\n");
|
printf("\nShutting down\n");
|
||||||
return 0;
|
return 0;
|
||||||
|
|
Loading…
Reference in a new issue