X-Git-Url: http://git.mutantstargoat.com/user/nuclear/?p=laserbrain_demo;a=blobdiff_plain;f=src%2Fapp.cc;h=17ab2fd80473e2f206a28301c11446d237d449b7;hp=d2f947662cf33f43ca29123095559635b4f737e0;hb=05fbfb6f2570953f8e98d99e58c7c763a0279c21;hpb=ba339e843c1680b799b7bb9eaf8ec17fc56c8ea6 diff --git a/src/app.cc b/src/app.cc index d2f9476..17ab2fd 100644 --- a/src/app.cc +++ b/src/app.cc @@ -13,6 +13,9 @@ #include "ui.h" #include "opt.h" #include "post.h" +#include "renderer.h" +#include "vrinput.h" +#include "exman.h" #include "blob_exhibit.h" #define NEAR_CLIP 5.0 @@ -43,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]; @@ -60,9 +63,12 @@ static unsigned int sdr_post_gamma; static long prev_msec; +static ExhibitManager *exman; static BlobExhibit *blobs; static bool show_blobs; +static Renderer *rend; + bool app_init(int argc, char **argv) { @@ -83,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(); } @@ -106,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; @@ -116,6 +127,11 @@ bool app_init(int argc, char **argv) dir.y = 0; cam_theta = rad_to_deg(acos(dot(dir, Vec3(0, 0, 1)))); + exman = new ExhibitManager; + if(!exman->load(mscn, "data/exhibits")) { + //return false; + } + blobs = new BlobExhibit; blobs->node = new SceneNode; blobs->init(); @@ -123,6 +139,8 @@ bool app_init(int argc, char **argv) blobs->node->set_scaling(Vec3(28, 28, 28)); blobs->node->update(0); + exman->add(blobs); + if(!(sdr_ltmap_notex = create_program_load("sdr/lightmap.v.glsl", "sdr/lightmap-notex.p.glsl"))) { return false; } @@ -139,6 +157,9 @@ bool app_init(int argc, char **argv) sdr_post_gamma = create_program_load("sdr/post_gamma.v.glsl", "sdr/post_gamma.p.glsl"); } + rend = new Renderer; + rend->set_scene(mscn); + glUseProgram(0); if(opt.vr || opt.fullscreen) { @@ -153,10 +174,11 @@ void app_cleanup() if(opt.vr) { goatvr_shutdown(); } + destroy_vrhands(); + + delete rend; - blobs->destroy(); - delete blobs->node; - delete blobs; + delete exman; texman.clear(); sceneman.clear(); @@ -186,9 +208,7 @@ static void update(float dt) sceneman.update(); mscn->update(dt); - if(show_blobs) { - blobs->update(dt); - } + exman->update(dt); float speed = walk_speed * dt; Vec3 dir; @@ -276,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) @@ -295,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); @@ -315,6 +340,9 @@ void app_display() glLoadMatrixf(view_matrix[0]); draw_scene(); + if(have_handtracking) { + draw_vrhands(); + } } goatvr_draw_done(); @@ -325,6 +353,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]); @@ -354,11 +384,44 @@ static void draw_scene() set_light(1, lpos[1], Vec3(0.6, 0.7, 1.0) * 0.6); set_light(2, lpos[2], Vec3(0.8, 1.0, 0.8) * 0.3); - mscn->draw(); + rend->draw(); + if(show_blobs) { 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);