X-Git-Url: http://git.mutantstargoat.com/user/nuclear/?p=laserbrain_demo;a=blobdiff_plain;f=src%2Fapp.cc;h=07ecdecaf0a43a3630f4f56e6ce65ea57a0852d2;hp=91de3f4518eabadd3abfc1894613d7cd1db85bf6;hb=5c69b226e45df981db338dd859ef1d95e9be8f96;hpb=c48096383ed398a518e69070bfc9373537ab00bb diff --git a/src/app.cc b/src/app.cc index 91de3f4..07ecdec 100644 --- a/src/app.cc +++ b/src/app.cc @@ -180,6 +180,10 @@ bool app_init(int argc, char **argv) return false; } exui_setnode(&exslot_left.node); + if(have_handtracking) { + exui_scale(2); + exui_rotation(Vec3(-deg_to_rad(35), 0, 0)); + } if(!fb_srgb) { sdr_post_gamma = create_program_load("sdr/post_gamma.v.glsl", "sdr/post_gamma.p.glsl"); @@ -278,7 +282,6 @@ static void update(float dt) mscn->update(dt); exman->update(dt); - exui_update(dt); // use goatvr sticks for joystick input int num_vr_sticks = goatvr_num_sticks(); @@ -308,8 +311,8 @@ static void update(float dt) jmove_lensq -= jdeadsq; float mag = len * len; - dir.x += mag * joy_move.x / len * 2.0 * speed; - dir.z += mag * joy_move.y / len * 2.0 * speed; + dir.x += mag * joy_move.x / len * speed; + dir.z += mag * joy_move.y / len * speed; } if(jlook_lensq > jdeadsq) { float len = sqrt(jlook_lensq); @@ -342,11 +345,8 @@ static void update(float dt) avatar.pos.y -= speed; } - float theta = M_PI * avatar.body_rot / 180.0f; - Vec3 newpos; - newpos.x = avatar.pos.x + cos(theta) * dir.x - sin(theta) * dir.z; - newpos.y = avatar.pos.y; - newpos.z = avatar.pos.z + sin(theta) * dir.x + cos(theta) * dir.z; + Vec3 walk_dir = avatar.calc_walk_dir(dir.z, dir.x); + Vec3 newpos = avatar.pos + walk_dir; if(noclip) { avatar.pos = newpos; @@ -399,7 +399,7 @@ static void update(float dt) for(int i=0; i<2; i++) { if(vrhand[i].valid) { exslot[i]->node.set_position(vrhand[i].pos); - exslot[i]->node.set_rotation(vrhand[i].rot * exslot[i]->rotation); + exslot[i]->node.set_rotation(vrhand[i].rot * exslot[i]->grab_rot); bool act_grab = goatvr_action(i, GOATVR_ACTION_GRAB) != 0; @@ -411,9 +411,9 @@ static void update(float dt) if(act_grab) { // grab an exhibit *exsel_grab[i] = sel; - exslot[i]->rotation = sel.ex->node->get_rotation(); - debug_log("Grabbing with rot: %f %f %f %f\n", exslot[i]->rotation.x, - exslot[i]->rotation.y, exslot[i]->rotation.z, exslot[i]->rotation.w); + //SceneNode *objnode = sel.ex->node->find_object_node(); + //exslot[i]->rotation = normalize(sel.ex->node->get_rotation()); + exslot[i]->grab_rot = inverse(vrhand[i].rot); exslot[i]->attach_exhibit(sel.ex, EXSLOT_ATTACH_TRANSIENT); if(exsel_active) { exsel_active = ExSelection::null; // cancel active on grab @@ -439,7 +439,8 @@ static void update(float dt) } if(slot) { - ex->node->set_rotation(exslot[i]->node.get_rotation()); + Quat rot = normalize(exslot[i]->node.get_rotation()); + ex->node->set_rotation(rot); slot->attach_exhibit(ex); } else { // nowhere to put it, stash it for later @@ -448,6 +449,7 @@ static void update(float dt) } *exsel_grab[i] = ExSelection::null; + exslot[i]->grab_rot = Quat::identity; } } } @@ -459,7 +461,7 @@ static void update(float dt) Ray ray; ray.origin = vrhand[1].pos; ray.dir = rotate(Vec3(0, 0, -1), vrhand[1].rot); - //exsel_active = exman->select(ray); + exsel_active = exman->select(ray); pointing = true; } else { exsel_active = ExSelection::null; @@ -478,11 +480,17 @@ static void update(float dt) // set the position of the left hand at a suitable position for the exhibit UI dir = rotate(Vec3(-0.46, -0.1, -1), Vec3(0, 1, 0), deg_to_rad(-avatar.body_rot)); exslot_left.node.set_position(avatar.pos + dir * 30); // magic: distance in front + Quat rot; + rot.set_rotation(Vec3(0, 1, 0), deg_to_rad(-avatar.body_rot)); + exslot_left.node.set_rotation(rot); } if(!exslot_right.empty()) exslot_right.node.update(dt); // always update the left slot, because it's the anchor point of the exhibit ui exslot_left.node.update(dt); + + // need to call this *after* we have updated the active exhibit (if any) + exui_update(dt); } void app_display() @@ -531,9 +539,11 @@ void app_display() glLoadMatrixf(view_matrix[0]); draw_scene(); + /* if(have_handtracking) { draw_vrhands(); } + */ if(debug_gui) { ImGui::Render(); @@ -595,15 +605,18 @@ static void draw_scene() glDisable(GL_LIGHTING); glBegin(GL_LINES); for(int i=0; i<2; i++) { + // skip drawing the left hand when we're showing the exhibit gui + if(exsel_active && i == 0) continue; + if(vrhand[i].valid) { glColor3f(i, 1 - i, i); } else { glColor3f(0.5, 0.5, 0.5); } Vec3 v = vrhand[i].pos; - Vec3 dir = rotate(Vec3(0, 0, -1), vrhand[i].rot) * 20.0f; - Vec3 up = rotate(Vec3(0, 1, 0), vrhand[i].rot) * 10.0f; - Vec3 right = rotate(Vec3(1, 0, 0), vrhand[i].rot) * 10.0f; + Vec3 dir = rotate(Vec3(0, 0, -1), vrhand[i].rot) * 10.0f; + Vec3 up = rotate(Vec3(0, 1, 0), vrhand[i].rot) * 5.0f; + Vec3 right = rotate(Vec3(1, 0, 0), vrhand[i].rot) * 5.0f; if(i == 1 && pointing) { dir *= 1000.0f; @@ -764,6 +777,24 @@ void app_keyboard(int key, bool pressed) exui_change_tab(1); break; + case '\t': + if(exsel_grab_mouse) { + Exhibit *ex = exsel_grab_mouse.ex; + exslot_mouse.detach_exhibit(); + exman->stash_exhibit(ex); + exsel_grab_mouse = ExSelection::null; + } else { + Exhibit *ex = exman->unstash_exhibit(); + if(ex) { + exslot_mouse.attach_exhibit(ex, EXSLOT_ATTACH_TRANSIENT); + exsel_grab_mouse = ex; + + Vec3 fwd = avatar.get_body_fwd(); + exslot_mouse.node.set_position(avatar.pos + fwd * 100); + } + } + break; + case KEY_F5: case KEY_F6: case KEY_F7: @@ -821,7 +852,7 @@ void app_mouse_button(int bn, bool pressed, int x, int y) exslot_mouse.detach_exhibit(); - ExhibitSlot *slot = exman->nearest_empty_slot(pos, 100); + ExhibitSlot *slot = exman->nearest_empty_slot(pos, 300); if(!slot) { debug_log("no empty slot nearby\n"); if(ex->prev_slot && ex->prev_slot->empty()) { @@ -859,7 +890,7 @@ void app_mouse_button(int bn, bool pressed, int x, int y) static inline void mouse_look(float dx, float dy) { float scrsz = (float)win_height; - avatar.body_rot += dx * 512.0 / scrsz; + avatar.set_body_rotation(avatar.body_rot + dx * 512.0 / scrsz); avatar.head_alt += dy * 512.0 / scrsz; if(avatar.head_alt < -90) avatar.head_alt = -90;