From: John Tsiombikas Date: Wed, 13 Sep 2017 15:10:35 +0000 (+0300) Subject: added hand markers X-Git-Url: http://git.mutantstargoat.com/user/nuclear/?p=laserbrain_demo;a=commitdiff_plain;h=5b259c6064e9443d84f7a1154f8e02da444fb1c8 added hand markers --- diff --git a/src/app.cc b/src/app.cc index 6eb019a..24658ee 100644 --- a/src/app.cc +++ b/src/app.cc @@ -46,6 +46,13 @@ static float mouse_speed = 0.5f; static bool show_walk_mesh, noclip = false; static bool have_headtracking, should_swap; +static bool have_handtracking; + +static struct { + Vec3 pos; + Quat rot; + bool valid; +} hand[2]; static int prev_mx, prev_my; static bool bnstate[8]; @@ -88,6 +95,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(); } @@ -289,6 +297,18 @@ 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); + + if(have_handtracking) { + for(int i=0; i<2; i++) { + if(goatvr_hand_active(i)) { + goatvr_hand_position(i, &hand[i].pos.x); + goatvr_hand_orientation(i, &hand[i].rot.x); + hand[i].valid = true; + } else { + hand[i].valid = false; + } + } + } } static void set_light(int idx, const Vec3 &pos, const Vec3 &color) @@ -308,13 +328,13 @@ void app_display() float dt = (float)(time_msec - prev_msec) / 1000.0f; prev_msec = time_msec; - update(dt); - if(opt.vr) { // VR mode goatvr_draw_start(); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + update(dt); + for(int i=0; i<2; i++) { // for each eye goatvr_draw_eye(i); @@ -338,6 +358,8 @@ void app_display() } else { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + update(dt); + proj_matrix.perspective(deg_to_rad(50.0), win_aspect, NEAR_CLIP, FAR_CLIP); glMatrixMode(GL_PROJECTION); glLoadMatrixf(proj_matrix[0]); @@ -373,6 +395,36 @@ static void draw_scene() blobs->draw(); } + if(have_handtracking) { + Mat4 head_xform = inverse(mouse_view_matrix);//goatvr_head_matrix(); + Mat4 head_dir_xform = head_xform.upper3x3(); + + glUseProgram(0); + glPushAttrib(GL_ENABLE_BIT); + glDisable(GL_LIGHTING); + glBegin(GL_LINES); + for(int i=0; i<2; i++) { + if(hand[i].valid) { + glColor3f(i, 1 - i, i); + } else { + glColor3f(0.5, 0.5, 0.5); + } + Vec3 v = head_xform * hand[i].pos; + Vec3 dir = head_dir_xform * rotate(Vec3(0, 0, -1), hand[i].rot) * 20.0f; + Vec3 up = head_dir_xform * rotate(Vec3(0, 1, 0), hand[i].rot) * 10.0f; + Vec3 right = head_dir_xform * rotate(Vec3(1, 0, 0), hand[i].rot) * 10.0f; + + glVertex3f(v.x, v.y, v.z); + glVertex3f(v.x + dir.x, v.y + dir.y, v.z + dir.z); + glVertex3f(v.x - right.x, v.y - right.y, v.z - right.z); + glVertex3f(v.x + right.x, v.y + right.y, v.z + right.z); + glVertex3f(v.x - up.x, v.y - up.y, v.z - up.z); + glVertex3f(v.x + up.x, v.y + up.y, v.z + up.z); + } + glEnd(); + glPopAttrib(); + } + if(show_walk_mesh && mscn->walk_mesh) { glPushAttrib(GL_ENABLE_BIT); glEnable(GL_BLEND);