Mesh::Mesh(const char *filename){ // Check whether the provided file exists. ifstream ifile(filename); if(!ifile){ std::cerr << "File " << filename << " does not exist." << std::endl; exit(EXIT_FAILURE); } vtkXMLUnstructuredGridReader *reader = vtkXMLUnstructuredGridReader::New(); reader->SetFileName(filename); reader->Update(); vtkUnstructuredGrid *ug = reader->GetOutput(); NNodes = ug->GetNumberOfPoints(); NElements = ug->GetNumberOfCells(); // Get the coordinates of each mesh vertex. There is no z coordinate in 2D, // but VTK treats 2D and 3D meshes uniformly, so we have to provide memory // for z as well (r[2] will always be zero and we ignore it). for(size_t i=0;i<NNodes;i++){ double r[3]; ug->GetPoints()->GetPoint(i, r); coords.push_back(r[0]); coords.push_back(r[1]); } assert(coords.size() == 2*NNodes); // Get the metric at each vertex. for(size_t i=0;i<NNodes;i++){ double *tensor = ug->GetPointData()->GetArray("Metric")->GetTuple4(i); metric.push_back(tensor[0]); metric.push_back(tensor[1]); assert(tensor[1] == tensor[2]); metric.push_back(tensor[3]); } assert(metric.size() == 3*NNodes); // Get the 3 vertices comprising each element. for(size_t i=0;i<NElements;i++){ vtkCell *cell = ug->GetCell(i); for(int j=0;j<3;j++){ ENList.push_back(cell->GetPointId(j)); } } assert(ENList.size() == 3*NElements); reader->Delete(); create_adjacency(); find_surface(); set_orientation(); precompute_surfaceNodes(); precompute_cornerNodes(); }
void skinnedmesh_load_skin(skinnedmesh_t *sm,char *name) { FILE *file; int num_surface = 0; int surface[MAX_SURFACES]; char c,buffer[256],*ptr = buffer; file = fopen(name,"r"); if(!file) { fprintf(stderr,"error open skin file %s\n",name); return; } while(fread(&c,1,1,file) == 1) if(c != ' ' && c != '\t' && c != '\r') { if(c == ',') { int i; *ptr = '\0'; ptr = buffer; i = find_surface(sm,buffer); if(i >= 0) surface[num_surface++] = i; } else if(c == '\n') { int i,width,height,id = 0; unsigned char *data = NULL; *ptr = '\0'; ptr = buffer; if(strstr(buffer,".jpg")) { data = LoadJPEG(buffer,&width,&height); } else if(strstr(buffer,".tga")) { data = LoadTGA(buffer,&width,&height); } if(data) { glGenTextures(1,&id); glBindTexture(GL_TEXTURE_2D,id); glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER, GL_LINEAR_MIPMAP_LINEAR); glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); gluBuild2DMipmaps(GL_TEXTURE_2D,4,width,height,GL_RGBA, GL_UNSIGNED_BYTE,data); free(data); } for(i = 0; i < num_surface; i++) sm->surface[surface[i]]->textureid = id; num_surface = 0; } else *ptr++ = c; } fclose(file); }
void SPHSystem::animation() { if(sys_running == 0) { return; } build_table(); if(sys_render == 1) { interp_scalar(); } if(enable_split == 1 && tick == 0 || enable_merge == 1 && tick == 1) { comp_scalar(); find_surface(); comp_dist(); //comp_energy(); } comp_dens_pres(); comp_force_adv(); if(enable_split == 1 && tick == 0) { comp_split(); } if(enable_merge == 1 && tick == 1) { comp_merge(); } advection(); tick=1-tick; }