Пример #1
0
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();
}
Пример #2
0
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);
}
Пример #3
0
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;
}