/** A callback function that will get called whenever the tracker * provides us with new data. This may be called repeatedly for each * record that we have missed if many records have been delivered * since the last call to the VRPN mainloop() function. */ static void VRPN_CALLBACK handle_tracker(void *name, vrpn_TRACKERCB t) { float fps = kuhl_getfps(&fps_state); if(fps_state.frame == 0) msg(INFO, "VRPN records per second: %.1f\n", fps); /* Some tracking systems return large values when a point gets * lost. If the tracked point seems to be lost, ignore this * update. */ float pos[3]; vec3f_set(pos, t.pos[0], t.pos[1], t.pos[2]); long microseconds = (t.msg_time.tv_sec* 1000000L) + t.msg_time.tv_usec; if(0) { printf("Current time %ld; VRPN record time: %ld\n", kuhl_microseconds(), microseconds); printf("Received position from vrpn: "); vec3f_print(pos); } if(vec3f_norm(pos) > 100) return; // Store the data in our map so that someone can use it later. std::string s = (char*)name; nameToCallbackData[s] = t; smooth(nameToCallbackData[s]); }
/** Draw a object at the location and orientation of the tracked vrpn object */ void drawObject(const int objectIndex, float viewMat[16]) { const char *vrpnObject = global_argv[objectIndex]; const float scaleFactor = .5; float pos[4], orient[16]; vrpn_get(vrpnObject, NULL, pos, orient); float modelMat[16],translate[16],scale[16]; mat4f_scale_new(scale, scaleFactor, scaleFactor, scaleFactor); mat4f_translateVec_new(translate, pos); mat4f_mult_mat4f_many(modelMat, translate, orient, scale, NULL); float modelview[16]; mat4f_mult_mat4f_new(modelview, viewMat, modelMat); // modelview = view * model /* Send the modelview matrix to the vertex program. */ glUniformMatrix4fv(kuhl_get_uniform("ModelView"), 1, // number of 4x4 float matrices 0, // transpose modelview); // value glUniform1i(kuhl_get_uniform("renderStyle"), 2); kuhl_errorcheck(); kuhl_geometry_draw(modelgeom); /* Draw the model */ kuhl_errorcheck(); /* Transparency of labels may not appear right because we aren't * sorting them by depth. */ float labelScale[16]; mat4f_scale_new(labelScale, 1, 1/labelAspectRatio[objectIndex-1], 1); mat4f_mult_mat4f_new(modelview, modelview, labelScale); glUniformMatrix4fv(kuhl_get_uniform("ModelView"), 1, 0, modelview); glUniform1i(kuhl_get_uniform("renderStyle"), 1); kuhl_geometry_texture(&quad, label[objectIndex-1], "tex", 1); kuhl_geometry_draw(&quad); #if 0 printf("%s is at\n", vrpnObject); vec3f_print(pos); mat4f_print(orient); #endif }