From: John Tsiombikas Date: Sat, 16 Sep 2017 06:55:20 +0000 (+0300) Subject: Merge branch 'master' of goat:git/laserbrain_demo X-Git-Url: http://git.mutantstargoat.com/user/nuclear/?p=laserbrain_demo;a=commitdiff_plain;h=05fbfb6f2570953f8e98d99e58c7c763a0279c21;hp=-c Merge branch 'master' of goat:git/laserbrain_demo --- 05fbfb6f2570953f8e98d99e58c7c763a0279c21 diff --combined src/app.cc index 2927ce8,24658ee..17ab2fd --- a/src/app.cc +++ b/src/app.cc @@@ -14,7 -14,6 +14,7 @@@ #include "opt.h" #include "post.h" #include "renderer.h" +#include "vrinput.h" #include "exman.h" #include "blob_exhibit.h" @@@ -46,7 -45,14 +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_handtracking; - -static struct { - Vec3 pos; - Quat rot; - bool valid; -} hand[2]; +static bool have_headtracking, have_handtracking, should_swap; static int prev_mx, prev_my; static bool bnstate[8]; @@@ -113,10 -119,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; @@@ -174,7 -176,6 +174,7 @@@ void app_cleanup( if(opt.vr) { goatvr_shutdown(); } + destroy_vrhands(); delete rend; @@@ -297,9 -298,16 +297,9 @@@ 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) { - 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; - } - } + update_vrhands(); } } @@@ -320,13 -328,13 +320,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); @@@ -340,7 -348,6 +340,9 @@@ glLoadMatrixf(view_matrix[0]); draw_scene(); - draw_vrhands(); ++ if(have_handtracking) { ++ draw_vrhands(); ++ } } goatvr_draw_done(); @@@ -351,6 -358,8 +353,8 @@@ } 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]); @@@ -386,6 -395,36 +390,38 @@@ 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); diff --combined src/avatar.h index 0000000,0000000..6c3521e new file mode 100644 --- /dev/null +++ b/src/avatar.h @@@ -1,0 -1,0 +1,24 @@@ ++#ifndef AVATAR_H_ ++#define AVATAR_H_ ++ ++#include ++ ++/* when head-tracking is available, head_tilt is ignored, and the ++ * body_rot (controlled by mouse/gamepad) is independent of head_rot. ++ * ++ * without head-tracking, head_rot is derived from body_rot and head_tilt ++ */ ++class Avatar { ++public: ++ Vec3 pos; ++ float body_rot; ++ Quat head_rot; // used when head-tracking ++ float head_tilt; // used for mouselook ++ ++ Avatar(); ++ ~Avatar(); ++ ++ void draw() const; ++}; ++ ++#endif // AVATAR_H_