From b6285d483c8b55a52b6965271a3d3163b2e2f8fa Mon Sep 17 00:00:00 2001 From: John Tsiombikas Date: Fri, 15 Sep 2017 18:02:12 +0300 Subject: [PATCH] vr input --- src/app.cc | 15 ++++++++++++++- src/vrinput.cc | 41 +++++++++++++++++++++++++++++++++++++++++ src/vrinput.h | 23 +++++++++++++++++++++++ 3 files changed, 78 insertions(+), 1 deletion(-) create mode 100644 src/vrinput.cc create mode 100644 src/vrinput.h diff --git a/src/app.cc b/src/app.cc index 6eb019a..2927ce8 100644 --- a/src/app.cc +++ b/src/app.cc @@ -14,6 +14,7 @@ #include "opt.h" #include "post.h" #include "renderer.h" +#include "vrinput.h" #include "exman.h" #include "blob_exhibit.h" @@ -45,7 +46,7 @@ static float walk_speed = 300.0f; static float mouse_speed = 0.5f; static bool show_walk_mesh, noclip = false; -static bool have_headtracking, should_swap; +static bool have_headtracking, have_handtracking, should_swap; static int prev_mx, prev_my; static bool bnstate[8]; @@ -88,6 +89,7 @@ bool app_init(int argc, char **argv) should_swap = goatvr_should_swap() != 0; user_eye_height = goatvr_get_eye_height(); have_headtracking = goatvr_have_headtracking(); + have_handtracking = goatvr_have_handtracking(); goatvr_recenter(); } @@ -111,6 +113,10 @@ bool app_init(int argc, char **argv) glClearColor(1, 1, 1, 1); + if(!init_vrhands()) { + return false; + } + mscn = new MetaScene; if(!mscn->load(opt.scenefile ? opt.scenefile : "data/museum.scene")) { return false; @@ -168,6 +174,7 @@ void app_cleanup() if(opt.vr) { goatvr_shutdown(); } + destroy_vrhands(); delete rend; @@ -289,6 +296,11 @@ static void update(float dt) } mouse_view_matrix.pre_rotate_y(deg_to_rad(cam_theta)); mouse_view_matrix.pre_translate(-cam_pos.x, -cam_pos.y, -cam_pos.z); + + // update hand-tracking + if(have_handtracking) { + update_vrhands(); + } } static void set_light(int idx, const Vec3 &pos, const Vec3 &color) @@ -328,6 +340,7 @@ void app_display() glLoadMatrixf(view_matrix[0]); draw_scene(); + draw_vrhands(); } goatvr_draw_done(); diff --git a/src/vrinput.cc b/src/vrinput.cc new file mode 100644 index 0000000..e488c74 --- /dev/null +++ b/src/vrinput.cc @@ -0,0 +1,41 @@ +#include +#include "vrinput.h" +#include "scene.h" + +VRHand vrhand[2]; + +static Scene *scn; + +bool init_vrhands() +{ + scn = new Scene; + if(!(scn->load("data/vrhands.obj"))) { + return false; + } + return true; +} + +void destroy_vrhands() +{ + delete scn; + scn = 0; +} + +void update_vrhands() +{ + for(int i=0; i<2; i++) { + if(!(vrhand[i].src = goatvr_get_hand_tracker(i))) { + vrhand[i].valid = false; + continue; + } + goatvr_source_position(vrhand[i].src, &vrhand[i].pos.x); + goatvr_source_orientation(vrhand[i].src, &vrhand[i].rot.x); + float *mat = goatvr_source_matrix(vrhand[i].src); + memcpy(vrhand[i].xform[0], mat, 16 * sizeof(float)); + vrhand[i].valid = true; + } +} + +void draw_vrhands() +{ +} diff --git a/src/vrinput.h b/src/vrinput.h new file mode 100644 index 0000000..1ab89a1 --- /dev/null +++ b/src/vrinput.h @@ -0,0 +1,23 @@ +#ifndef VRINPUT_H_ +#define VRINPUT_H_ + +#include +#include + +struct VRHand { + bool valid; + Vec3 pos; + Quat rot; + Mat4 xform; /* combination of the above */ + goatvr_source *src; +}; + +extern VRHand vrhand[2]; + +bool init_vrhands(); +void destroy_vrhands(); + +void update_vrhands(); +void draw_vrhands(); + +#endif /* VRINPUT_H_ */ -- 1.7.10.4