Exemplo n.º 1
0
int main(int argc, char* argv[]) {
	Mesh* mesh = create_mesh();
	mesh_write("quad.mesh", mesh);
	mesh_destroy(mesh);

	Application app("my x11/win32 window", 600, 600, true);
	return app.run();
}
Exemplo n.º 2
0
int main ( int argc, char *argv[] )

/******************************************************************************/
/*
  Purpose:

    MAIN is the main program for TRIANGLE_TO_MEDIT.

  Discussion:

    The TRIANGLE program creates "node" and "element" files that define
    a triangular mesh.  A typical pair of such files might have the names
    "suv.node" and "suv.ele".

    This program reads this pair of files and creates a MEDIT mesh file, whose
    name might be "suv.mesh".

  Usage:

    triangle_to_medit prefix

    where 'prefix' is the common filename prefix so that:

    * prefix.node contains the coordinates of the nodes;
    * prefix.ele contains the indices of nodes forming each element.
    * prefix.mesh will be the MESH file created by the program.

  Licensing:

    This code is distributed under the GNU LGPL license.

  Modified:

    07 December 2010

  Author:

    John Burkardt
*/
{
  int dim;
  int *edge_label;
  int *edge_vertex;
  int edges;
  double *element_att;
  int element_att_num;
  char element_filename[255];
  int *element_node;
  int element_num;
  int element_order;
  int *hexahedron_label;
  int *hexahedron_vertex;
  int hexahedrons;
  int i;
  int j;
  char mesh_filename[255];
  double *node_att;
  int node_att_num;
  char node_filename[255];
  int *node_marker;
  double *node_coord;
  int node_dim;
  int node_marker_num;
  int node_num;
  char prefix[255];
  int *quadrilateral_label;
  int *quadrilateral_vertex;
  int quadrilaterals;
  int *tetrahedron_label;
  int *tetrahedron_vertex;
  int tetrahedrons;
  int *triangle_label;
  int *triangle_vertex;
  int triangles;
  double *vertex_coordinate;
  int *vertex_label;
  int vertices;

  timestamp ( );
  printf ( "\n" );
  printf ( "TRIANGLE_TO_MEDIT:\n" );
  printf ( "  C version\n" );
  printf ( "  Read a pair of NODE and ELE files created by TRIANGLE.\n" );
  printf ( "  Write a corresponding MEDIT mesh file.\n" );
/*
  Get the filename prefix.
*/
  if ( 1 <= argc )
  {
    strcpy ( prefix, argv[1] );
  }
  else
  {
    printf ( "\n" );
    printf ( "  Please enter the filename prefix:\n" );

    scanf ( "%s", prefix );
  }
/*
  Create the file names.
*/
  strcpy ( node_filename, prefix );
  strcat ( node_filename, ".node" );
  strcpy ( element_filename, prefix );
  strcat ( element_filename, ".ele" );
  strcpy ( mesh_filename, prefix );
  strcat ( mesh_filename, ".mesh" );

  printf ( "\n" );
  printf ( "  Read:\n" );
  printf ( "  * TRIANGLE node file \"%s\"\n", node_filename );
  printf ( "  * TRIANGLE element file \"%s\"\n", element_filename );
  printf ( "  Create:\n" );
  printf ( "  * MEDIT mesh file \"%s\"\n", mesh_filename );
/*
  Read the TRIANGLE NODE data.
*/
  node_size_read ( node_filename, &node_num, &node_dim, &node_att_num,
    &node_marker_num );

  node_coord = ( double * ) malloc ( 2 * node_num * sizeof ( double ) );
  node_att = ( double * ) malloc ( node_att_num * node_num * sizeof ( double ) );
  node_marker = ( int * ) malloc ( node_num * sizeof ( int ) );

  node_data_read ( node_filename, node_num, node_dim, node_att_num,
    node_marker_num, node_coord, node_att, node_marker );
/*
  Read the TRIANGLE ELE data.
*/
  element_size_read ( element_filename, &element_num, &element_order,
    &element_att_num );

  element_node = ( int * ) malloc ( element_order * element_num * sizeof ( int ) );
  element_att = ( double * ) malloc ( element_att_num * element_num * sizeof ( double ) );

  element_data_read ( element_filename, element_num, element_order,
    element_att_num, element_node, element_att );
/*
  Write the MEDIT data.
*/
  dim = 2;
  vertices = node_num;
  edges = 0;
  triangles = element_num;
  quadrilaterals = 0;
  tetrahedrons = 0;
  hexahedrons = 0;
  vertex_coordinate = ( double * ) malloc ( 2 * vertices * sizeof ( double ) );
  for ( j = 0; j < vertices; j++ )
  {
    for ( i = 0; i < 2; i++ )
    {
      vertex_coordinate[i+j*2] = node_coord[i+j*2];
    }
  }
  vertex_label = ( int * ) malloc ( vertices * sizeof ( int ) );
  for ( j = 0; j < vertices; j++ )
  {
    vertex_label[j] = node_marker[j];
  }
  edge_vertex = NULL;
  edge_label = NULL;
  triangle_vertex = ( int * ) malloc ( 3 * triangles * sizeof ( int ) );
  for ( j = 0; j < triangles; j++ )
  {
    for ( i = 0; i < 3; i++ )
    {
      triangle_vertex[i+j*3] = element_node[i+j*3];
    }
  }
  triangle_label = ( int * ) malloc ( triangles * sizeof ( int ) );
  for ( j = 0; j < triangles; j++ )
  {
    triangle_label[j] = 0;
  }
  quadrilateral_vertex = NULL;
  quadrilateral_label = NULL;
  tetrahedron_vertex = NULL;
  tetrahedron_label = NULL;
  hexahedron_vertex = NULL;
  hexahedron_label = NULL;

  mesh_write ( mesh_filename, dim, vertices, edges, triangles, quadrilaterals,
    tetrahedrons, hexahedrons, vertex_coordinate, vertex_label, edge_vertex,
    edge_label, triangle_vertex, triangle_label, quadrilateral_vertex,
    quadrilateral_label, tetrahedron_vertex, tetrahedron_label,
    hexahedron_vertex, hexahedron_label );
/*
  Free memory.
*/
  free ( element_att );
  free ( element_node );
  free ( node_att );
  free ( node_coord );
  free ( node_marker );
  free ( triangle_label );
  free ( triangle_vertex );
/*
  Terminate.
*/
  printf ( "\n" );
  printf ( "TRIANGLE_TO_MEDIT:\n" );
  printf ( "  Normal end of execution.\n" );
  printf ( "\n" );
  timestamp ( );

  return 0;
}
Exemplo n.º 3
0
void test01 ( )

/******************************************************************************/
/*
  Purpose:

    TEST01 creates a MESH dataset and writes it to a file.

  Licensing:

    This code is distributed under the GNU LGPL license.

  Modified:

    22 November 2010

  Author:

    John Burkardt
*/
{
  int dim;
  int *edge_label;
  int *edge_vertex;
  int edges;
  char filename[255];
  int *hexahedron_label;
  int *hexahedron_vertex;
  int hexahedrons;
  int *quadrilateral_label;
  int *quadrilateral_vertex;
  int quadrilaterals;
  int *tetrahedron_label;
  int *tetrahedron_vertex;
  int tetrahedrons;
  int *triangle_label;
  int *triangle_vertex;
  int triangles;
  double *vertex_coordinate;
  int *vertex_label;
  int vertices;

  printf ( "\n" );
  printf ( "TEST01:\n" );
  printf ( "  Create a hexahedral mesh and write it to a file.\n" );
/*
  Get sizes.
*/
  hexahexa_2x2x2_size ( &dim, &vertices, &edges, &triangles, &quadrilaterals, 
    &tetrahedrons, &hexahedrons );
/*
  Allocate memory.
*/
  edge_label = ( int * ) malloc ( edges * sizeof ( int ) );
  edge_vertex = ( int * ) malloc ( 2 * edges * sizeof ( int ) );
  hexahedron_label = ( int * ) malloc ( hexahedrons * sizeof ( int ) );
  hexahedron_vertex = ( int * ) malloc ( 8 * hexahedrons * sizeof ( int ) );
  quadrilateral_label = ( int * ) malloc ( quadrilaterals * sizeof ( int ) );
  quadrilateral_vertex = ( int * ) malloc ( 4 * quadrilaterals * sizeof ( int ) );
  tetrahedron_label = ( int * ) malloc ( tetrahedrons * sizeof ( int ) );
  tetrahedron_vertex = ( int * ) malloc ( 4 * tetrahedrons * sizeof ( int ) );
  triangle_label = ( int * ) malloc ( triangles * sizeof ( int ) );
  triangle_vertex = ( int * ) malloc ( 3 * triangles * sizeof ( int ) );
  vertex_coordinate = ( double * ) malloc ( dim * vertices * sizeof ( double ) );
  vertex_label = ( int * ) malloc ( vertices * sizeof ( int ) );
/*
  Get the data.
*/
  hexahexa_2x2x2_data ( dim, vertices, edges, triangles, 
    quadrilaterals, tetrahedrons, hexahedrons, vertex_coordinate, vertex_label, 
    edge_vertex, edge_label, triangle_vertex, triangle_label, 
    quadrilateral_vertex, quadrilateral_label, tetrahedron_vertex, 
    tetrahedron_label, hexahedron_vertex, hexahedron_label );
/*
  Write the data.
*/
  strcpy ( filename, "hexahexa_2x2x2.mesh" );

  mesh_write ( filename, dim, vertices, edges, triangles, 
    quadrilaterals, tetrahedrons, hexahedrons, vertex_coordinate, 
    vertex_label, edge_vertex, edge_label, triangle_vertex, triangle_label, 
    quadrilateral_vertex, quadrilateral_label, tetrahedron_vertex, 
    tetrahedron_label, hexahedron_vertex, hexahedron_label );

  printf ( "\n" );
  printf ( "  Created the file \"%s\".\n", filename );
/*
  Deallocate memory.
*/
  free ( edge_label );
  free ( edge_vertex );
  free ( hexahedron_label );
  free ( hexahedron_vertex );
  free ( quadrilateral_label );
  free ( quadrilateral_vertex );
  free ( tetrahedron_label );
  free ( tetrahedron_vertex );
  free ( triangle_label );
  free ( triangle_vertex );
  free ( vertex_coordinate );
  free ( vertex_label );

  return;
}
Exemplo n.º 4
0
void CreateGeometry::save_mesh() {
	int32_t attributeOffsets[Mesh::MaxAttributes];

	for(int i = 0; i < Mesh::MaxAttributes; i++)
		attributeOffsets[i] = -1;

	size_t offset = indices.size() * sizeof(uint16_t);

	attributeOffsets[Mesh::Vertex] = offset;
	offset += position.size() * Mesh::get_stride(Mesh::Vertex);

	if(!normal.empty()) {
		attributeOffsets[Mesh::Normal] = offset;
		offset += position.size() * Mesh::get_stride(Mesh::Normal);
	}

	if(!sTangent.empty() && !tTangent.empty()) {
		attributeOffsets[Mesh::STangent] = offset;
		offset += position.size() * Mesh::get_stride(Mesh::STangent);

		attributeOffsets[Mesh::TTangent] = offset;
		offset += position.size() * Mesh::get_stride(Mesh::TTangent);
	}

	if(!color.empty()) {
		attributeOffsets[Mesh::Color] = offset;
		offset += position.size() * Mesh::get_stride(Mesh::Color);
	}

	if(!texCoord.empty()) {
		attributeOffsets[Mesh::TexCoord] = offset;
		offset += position.size() * Mesh::get_stride(Mesh::TexCoord);
	}

	if(!boneIds.empty() && !weights.empty()) {
		attributeOffsets[Mesh::BoneIds] = offset;
		offset += position.size() * Mesh::get_stride(Mesh::BoneIds);

		attributeOffsets[Mesh::Weigths] = offset;
		offset += position.size() * Mesh::get_stride(Mesh::Weigths);
	}

	int32_t batch_offset = offset;
	offset += batches.size() * sizeof(Batch);

	Mesh* mesh = (Mesh*)malloc(sizeof(Mesh) + offset);

	mesh->batch_offset = batch_offset;
	mesh->batch_count = (uint16_t)batches.size();
	mesh->vertex_count = (uint16_t)position.size();
	mesh->index_count = (uint16_t)indices.size();

	memcpy(mesh->offsets, attributeOffsets, sizeof(attributeOffsets));
	memcpy(mesh->index_pointer(), indices.data(), mesh->index_count*sizeof(uint16_t));
	memcpy(mesh->batches_pointer(), batches.data(), mesh->batch_count*sizeof(Batch));
	memcpy(mesh->get_pointer(Mesh::Vertex), position.data(), mesh->vertex_count*Mesh::get_stride(Mesh::Vertex));

	if(mesh->offsets[Mesh::Normal] != -1)
		memcpy(mesh->get_pointer(Mesh::Normal), normal.data(), mesh->vertex_count*Mesh::get_stride(Mesh::Normal));

	if(mesh->offsets[Mesh::STangent] != -1)
		memcpy(mesh->get_pointer(Mesh::STangent), sTangent.data(), mesh->vertex_count*Mesh::get_stride(Mesh::STangent));

	if(mesh->offsets[Mesh::TTangent] != -1)
		memcpy(mesh->get_pointer(Mesh::TTangent), tTangent.data(), mesh->vertex_count*Mesh::get_stride(Mesh::TTangent));

	if(mesh->offsets[Mesh::Color] != -1)
		memcpy(mesh->get_pointer(Mesh::Color), color.data(), mesh->vertex_count*Mesh::get_stride(Mesh::Color));

	if(mesh->offsets[Mesh::TexCoord] != -1)
		memcpy(mesh->get_pointer(Mesh::TexCoord), texCoord.data(), mesh->vertex_count*Mesh::get_stride(Mesh::TexCoord));

	if(mesh->offsets[Mesh::BoneIds] != -1)
		memcpy(mesh->get_pointer(Mesh::BoneIds), boneIds.data(), mesh->vertex_count*Mesh::get_stride(Mesh::BoneIds));

	if(mesh->offsets[Mesh::Weigths] != -1)
		memcpy(mesh->get_pointer(Mesh::Weigths), weights.data(), mesh->vertex_count*Mesh::get_stride(Mesh::Weigths));

	mesh_write(output.c_str(), mesh);
	mesh_destroy(mesh);
}