/******************************************************************************* Function that hanles the idle time of the OpenGL main loop. *******************************************************************************/ void idleCB(void) { if( g_animate == 1 ) { //if( g_recording == 0 ) // g_time = g_timer.GetElapsedTime() ; //else // g_time += 0.033 ; // save at 30 frames per second. simulationLoop(); //Execute simulation. simulationTime += simulationStep; //cout << "Current time: " << simulationTime << endl; glutPostRedisplay() ; } }
int main(int argc, char**argv){ std::vector<double> vertices, BBmin, BBmax; std::vector<unsigned> triangles; if(!readObj(argv[1], vertices, triangles, BBmin, BBmax)){ std::cout << "couldn't read OBJ" << std::endl; exit(1); } std::cout << "bbmin: " << BBmin[0] << " " << BBmin[1] << " " << BBmin[2] << std::endl; std::cout << "bbmax: " << BBmax[0] << " " << BBmax[1] << " " << BBmax[2] << std::endl; for(auto i : range(vertices.size()/3)){ vertices[3*i + 1] += 5; } std::cout << "vertices size: " << vertices.size() << std::endl; std::set<Edge> edgesSet; for(auto i : range(triangles.size()/3)){ auto t = 3*i; for( auto j : range(3)){ auto e1 = triangles[t + j]; auto e2 = triangles[t + ((j +1)%3)]; if( e2 < e1){ std::swap(e1, e2); } auto e = Edge(e1, e2, triangles[t + ((j + 2)%3)]); auto it = edgesSet.find(e); if(it == edgesSet.end()){ edgesSet.insert(it, e); } else { e.t2 = it->t1; edgesSet.erase(it); edgesSet.insert(e); } } } std::vector<Edge> edges(edgesSet.begin(), edgesSet.end()); // for(const auto& e : edges){ // std::cout << "e1: " << e.e1 << " e2: " << e.e2 << " t1 " << e.t1 << " t2 : " << e.t2 << " e length " << e.edgeLength << " d length : " << e.dihedralLength << std::endl; // } std::cout << "about to set edge lengths" << std::endl; for(auto& e : edges){ e.edgeLength = l2Norm(vertices.begin() + 3*e.e1, vertices.begin() + 3*e.e2); if(e.t1 < vertices.size() && e.t2 < vertices.size()){ e.dihedralLength = l2Norm(vertices.begin() + 3*e.t1, vertices.begin() + 3*e.t2); } } //for(auto i : range (vertices.size()/3)){ // std::cout << "vertex: " << i << " " << vertices[i*3] << " " << vertices[i*3 + 1] << " " << vertices[i*3 + 2] << std::endl; // } //for(const auto& e : edges){ // std::cout << "e1: " << e.e1 << " e2: " << e.e2 << " t1 " << e.t1 << " t2 : " << e.t2 << " e length " << e.edgeLength << " d length : " << e.dihedralLength << std::endl; //} std::cout << "computed edge rest lengths" << std::endl; if(SDL_Init(SDL_INIT_EVERYTHING) < 0) { std::cout << "couldn't init SDL" << std::endl; exit(1); } if((surface = SDL_CreateWindow("3.2", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 800, 600, SDL_WINDOW_OPENGL | SDL_WINDOW_SHOWN)) == NULL){ std::cout << "couldn't create SDL surface" << std::endl; exit(1); } SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1); auto* context = SDL_GL_CreateContext(surface); double dt = atof(argv[2]); std::cout << "about to loop" << std::endl; simulationLoop(vertices, edges, dt); return 0; }