void Tracker::update() { for (int i = 0; i < m_count; i++) { while (psmove_poll(m_moves[i])) ; float x, y, z; psmove_fusion_get_position(m_fusion, m_moves[i], &x, &y, &z); int buttons = psmove_get_buttons(m_moves[i]); if (buttons & Btn_MOVE) { psmove_reset_orientation(m_moves[i]); } else if (buttons & Btn_PS) { exit(0); } else if (buttons & Btn_SELECT) { m_rotation += 2.; } else if (buttons & Btn_CROSS) { m_trace.push_back(Point3D(x, y, z)); } if (buttons & Btn_START) { if (m_has_last_offset) { m_offset = Point3D(m_offset.x + x - m_last_offset.x, m_offset.y + y - m_last_offset.y, m_offset.z + z - m_last_offset.z); } else { m_has_last_offset = true; } m_last_offset = Point3D(x, y, z); } else { m_has_last_offset = false; } unsigned int pressed, released; psmove_get_button_events(m_moves[i], &pressed, &released); if (pressed & Btn_SQUARE) { m_items[i] -= 1; if (m_items[i] < 0) m_items[i] = ITEM_MAX - 1; } else if (pressed & Btn_TRIANGLE) { m_items[i] += 1; if (m_items[i] == ITEM_MAX) m_items[i] = 0; } else if (pressed & Btn_CIRCLE) { m_trace.clear(); m_rotation = 0.; m_offset = Point3D(0., 0., 0.); } } psmove_tracker_update_image(m_tracker); psmove_tracker_update(m_tracker, NULL); }
float * psmove_fusion_get_modelview_matrix(PSMoveFusion *fusion, PSMove *move) { psmove_return_val_if_fail(fusion != NULL, NULL); psmove_return_val_if_fail(move != NULL, NULL); float q0, q1, q2, q3; psmove_get_orientation(move, &q0, &q1, &q2, &q3); if (psmove_tracker_get_mirror(fusion->tracker)) { /* Need to invert these two axes if mirroring is enabled */ q3 *= -1.; q2 *= -1.; } glm::quat quaternion(q3, q2, q1, q0); float x, y, z; psmove_fusion_get_position(fusion, move, &x, &y, &z); fusion->modelview = glm::translate(glm::mat4(), glm::vec3(x, y, z)) * glm::mat4_cast(quaternion); return glm::value_ptr(fusion->modelview); }