Exemple #1
0
/*******************************************************************************
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() ; 
	}
}
Exemple #2
0
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;
}