void key(unsigned char key, int mouse_x, int mouse_y) { using namespace std; using namespace igl; switch(key) { // ESC case char(27): rebar.save(REBAR_NAME); // ^C case char(3): exit(0); case ' ': { static double pause_start,pause_stop; paused = !paused; if(paused) { pause_start = get_seconds(); }else { pause_stop = get_seconds(); pause_time += (pause_stop-pause_start); } break; } default: if(!TwEventKeyboardGLUT(key,mouse_x,mouse_y)) { cout<<"Unknown key command: "<<key<<" "<<int(key)<<endl; } } glutPostRedisplay(); }
void key(unsigned char key, int mouse_x, int mouse_y) { using namespace std; switch(key) { // ESC case char(27): rebar.save(REBAR_NAME); // ^C case char(3): exit(0); default: if(!TwEventKeyboardGLUT(key,mouse_x,mouse_y)) { cout<<"Unknown key command: "<<key<<" "<<int(key)<<endl; } } }
void key(unsigned char key, int mouse_x, int mouse_y) { using namespace std; using namespace igl; using namespace Eigen; int mod = glutGetModifiers(); const bool command_down = GLUT_ACTIVE_COMMAND & mod; const bool shift_down = GLUT_ACTIVE_SHIFT & mod; switch(key) { // ESC case char(27): rebar.save(REBAR_NAME); // ^C case char(3): exit(0); case 'z': case 'Z': if(command_down) { if(shift_down) { redo(); }else { undo(); } break; }else { push_undo(); Quaterniond q; snap_to_canonical_view_quat(s.camera.m_rotation_conj,1.0,q); s.camera.orbit(q.conjugate()); } default: if(!TwEventKeyboardGLUT(key,mouse_x,mouse_y)) { cout<<"Unknown key command: "<<key<<" "<<int(key)<<endl; } } }
void key(unsigned char key, int mouse_x, int mouse_y) { using namespace std; using namespace igl; using namespace Eigen; int mod = glutGetModifiers(); const bool command_down = GLUT_ACTIVE_COMMAND & mod; const bool shift_down = GLUT_ACTIVE_SHIFT & mod; switch(key) { // ESC case char(27): rebar.save(REBAR_NAME); // ^C case char(3): exit(0); case char(127): { push_undo(); // delete MatrixXi new_BE(s.BE.rows(),s.BE.cols()); int count = 0; for(int b=0;b<s.BE.rows();b++) { bool selected = false; for(int si=0;si<s.sel.size();si++) { if(s.BE(b,0) == s.sel(si) || s.BE(b,1) == s.sel(si)) { selected = true; break; } } if(!selected) { new_BE.row(count) = s.BE.row(b); count++; } } new_BE.conservativeResize(count,new_BE.cols()); const auto old_C = s.C; VectorXi I; remove_unreferenced(old_C,new_BE,s.C,s.BE,I); s.sel.resize(0,1); break; } case 'A': case 'a': { push_undo(); s.sel = colon<int>(0,s.C.rows()-1); break; } case 'C': case 'c': { push_undo(); // snap close vertices SparseMatrix<double> A; adjacency_matrix(s.BE,A); VectorXi J = colon<int>(0,s.C.rows()-1); // stupid O(n²) version for(int c = 0;c<s.C.rows();c++) { for(int d = c+1;d<s.C.rows();d++) { if( A.coeff(c,d) == 0 && // no edge (s.C.row(c)-s.C.row(d)).norm() < 0.02*bbd //close ) { // c < d J(d) = c; } } } for(int e = 0;e<s.BE.rows();e++) { s.BE(e,0) = J(s.BE(e,0)); s.BE(e,1) = J(s.BE(e,1)); } const auto old_BE = s.BE; const auto old_C = s.C; VectorXi I; remove_unreferenced(old_C,old_BE,s.C,s.BE,I); for(int i = 0;i<s.sel.size();i++) { s.sel(i) = J(s.sel(i)); } VectorXi _; igl::unique(s.sel,s.sel,_,_); break; } case 'D': case 'd': { push_undo(); s.sel.resize(0,1); break; } case 'P': case 'p': { // add bone to parents (should really only be one) push_undo(); vector<int> new_sel; const int old_nbe = s.BE.rows(); for(int si=0;si<s.sel.size();si++) { for(int b=0;b<old_nbe;b++) { if(s.BE(b,1) == s.sel(si)) { // one new node s.C.conservativeResize(s.C.rows()+1,3); const int nc = s.C.rows(); s.C.row(nc-1) = 0.5*(s.C.row(s.BE(b,1)) + s.C.row(s.BE(b,0))); // one new bone s.BE.conservativeResize(s.BE.rows()+1,2); s.BE.row(s.BE.rows()-1) = RowVector2i(nc-1,s.BE(b,1)); s.BE(b,1) = nc-1; // select last node new_sel.push_back(nc-1); } } } list_to_matrix(new_sel,s.sel); break; } case 'R': case 'r': { // re-root try at first selected if(s.sel.size() > 0) { push_undo(); // only use first s.sel.conservativeResize(1,1); // Ideally this should only effect the connected component of s.sel(0) const auto & C = s.C; auto & BE = s.BE; vector<bool> seen(C.rows(),false); // adjacency list vector<vector< int> > A; adjacency_list(BE,A,false); int e = 0; queue<int> Q; Q.push(s.sel(0)); seen[s.sel(0)] = true; while(!Q.empty()) { const int c = Q.front(); Q.pop(); for(const auto & d : A[c]) { if(!seen[d]) { BE(e,0) = c; BE(e,1) = d; e++; Q.push(d); seen[d] = true; } } } // only keep tree BE.conservativeResize(e,BE.cols()); } break; } case 'S': case 's': { save(); break; } case 'U': case 'u': { push_scene(); push_object(); for(int c = 0;c<s.C.rows();c++) { Vector3d P = project((Vector3d)s.C.row(c)); Vector3d obj; int nhits = unproject_in_mesh(P(0),P(1),ei,obj); if(nhits > 0) { s.C.row(c) = obj; } } pop_object(); pop_scene(); break; } case 'Y': case 'y': { symmetrize(); break; } case 'z': case 'Z': is_rotating = false; is_dragging = false; if(command_down) { if(shift_down) { redo(); }else { undo(); } break; }else { push_undo(); Quaterniond q; snap_to_canonical_view_quat(camera.m_rotation_conj,1.0,q); camera.orbit(q.conjugate()); } break; default: if(!TwEventKeyboardGLUT(key,mouse_x,mouse_y)) { cout<<"Unknown key command: "<<key<<" "<<int(key)<<endl; } } glutPostRedisplay(); }
void key(unsigned char key, int mouse_x, int mouse_y) { using namespace std; using namespace Eigen; using namespace igl; int mod = glutGetModifiers(); switch(key) { // ESC case char(27): rebar.save(REBAR_NAME); // ^C case char(3): exit(0); case 'I': case 'i': { push_undo(); s.N *= -1.0; F = F.rowwise().reverse().eval(); break; } case 'z': case 'Z': if(mod & GLUT_ACTIVE_COMMAND) { if(mod & GLUT_ACTIVE_SHIFT) { redo(); }else { undo(); } }else { push_undo(); Quaterniond q; snap_to_canonical_view_quat(s.camera.m_rotation_conj,1.0,q); switch(center_type) { default: case CENTER_TYPE_ORBIT: s.camera.orbit(q.conjugate()); break; case CENTER_TYPE_FPS: s.camera.turn_eye(q.conjugate()); break; } } break; case 'u': mouse_wheel(0, 1,mouse_x,mouse_y); break; case 'j': mouse_wheel(0,-1,mouse_x,mouse_y); break; case 'n': cc_selected = (cc_selected + 1) % (CC.maxCoeff() + 2); cout << "selected cc: " << cc_selected << endl; glutPostRedisplay(); break; default: if(!TwEventKeyboardGLUT(key,mouse_x,mouse_y)) { cout<<"Unknown key command: "<<key<<" "<<int(key)<<endl; } } }