Converts a triangular surface given in Wavefront .obj format into F5.
#include <stdio.h>
#include <string.h>
#include <assert.h>
#include <hdf5.h>
#include <math.h>
#include <stdlib.h>
#include <jpeglib.h>
char mtl[2048] = "";
void store_image(hid_t File_id, double Time,
const char*gridname,
size_t width, size_t height, int components, unsigned char *image_buffer)
{
gridname,
2,
NULL);
hsize_t imgdims[2];
imgdims[0] = width ;
imgdims[1] = height;
}
if (components == 3)
strcpy(mtl, gridname);
}
void loadJpgTexture(hid_t file_id, double time, const char*jpg_filename )
{
struct jpeg_decompress_struct cinfo;
struct jpeg_error_mgr jerr;
FILE *infile;
int row_stride;
if ((infile = fopen( jpg_filename, "rb")) == NULL)
{
fprintf(stderr, "can't open %s\n", jpg_filename );
return;
}
cinfo.err = jpeg_std_error(&jerr);
jpeg_create_decompress(&cinfo);
jpeg_stdio_src(&cinfo, infile);
jpeg_read_header(&cinfo, TRUE);
jpeg_start_decompress(&cinfo);
if (cinfo.out_color_space == JCS_RGB)
printf("Texture image [%s] is RGB %dx%d \n", jpg_filename, cinfo.output_width, cinfo.output_height );
else
printf("Texture image [%s] is not RGB, %dx%d\n", jpg_filename, cinfo.output_width, cinfo.output_height );
row_stride = cinfo.output_width * cinfo.output_components;
{
unsigned long image_size = row_stride * cinfo.output_height;
unsigned char *image_buffer = (unsigned char *)malloc(image_size);
if (image_buffer == NULL)
{
fprintf(stderr, "Memory allocation failed\n");
return;
}
while (cinfo.output_scanline < cinfo.output_height)
{
unsigned char *buffer_array[1];
buffer_array[0] = image_buffer + (cinfo.output_scanline) * row_stride;
jpeg_read_scanlines(&cinfo, buffer_array, 1);
}
store_image(file_id, time,
jpg_filename, cinfo.output_width, cinfo.output_height,
cinfo.output_components,
image_buffer);
}
jpeg_finish_decompress(&cinfo);
jpeg_destroy_decompress(&cinfo);
fclose(infile);
return;
}
#define MAX_VERTICES 49325149
#define MAX_TRIANGLES 1000000
F5_triangle_t Triangles[MAX_TRIANGLES], TriangleTextureIndices[MAX_TRIANGLES];
void handle_material_lib_file(hid_t file_id, double time, const char*mtllib_filename )
{
FILE* mtllib = fopen( mtllib_filename, "rt" );
char newmtl[1024] = "";
char buf[1024];
while( fgets(buf, sizeof(buf), mtllib) )
{
char map_Kd[1024] = "";
if (sscanf(buf, "newmtl %s\n", newmtl) == 1)
{
printf("newmtl: %s\n", newmtl);
continue;
}
if (sscanf(buf, "map_Kd %s\n", map_Kd) == 1)
{
loadJpgTexture( file_id, time, map_Kd );
continue;
}
}
fclose(mtllib);
}
int main(int argc, char*argv[])
{
hid_t fileID;
char gridname[1024];
char buf[1024];
FILE*what;
if (argc<2)
{
printf("##########################################################################\n");
printf(" Convert .OBJ to .F5 \n");
printf(" Usage: \n");
printf(" ObjtoF5 <inputfile.obj>\n");
puts (" ObjtoF5 <fileprefix_> <DeltaT> <#files> <out.f5> ");
puts (" whereby DeltaT specifies a floating point factor for mapping file numbers to physical time,");
puts (" and #file the number of files. The entire sequence will be placed into one time-dependent .f5 file.\n");
printf(" FilePrefix must fit input filenames: fileprefix_000000.obj fileprefix_000001.obj ... \n");
printf("##########################################################################\n");
printf(" \n");
return 1;
}
printf("\n");
unsigned k=0;
for (k=0; k < argc ; k++)
printf("argv is: %s at position %d \n", argv[k],k);
printf("\n");
unsigned file_number = 0;
double delta_t = 0;
if(argc > 2)
{
printf("time series is used: delta t: %s and file numbers: %s\n",
argv[2],argv[3] );
delta_t = atof(argv[2]);
file_number = atoi(argv[3]);
printf("delta t %f", delta_t );
printf("number of files %d", file_number );
}
else
{
file_number = 1;
}
printf("\n");
if (argc == 5)
strcpy(buf, argv[4]);
else
strcpy(buf, argv[1]);
char* c = strrchr(buf, '.');
if (c)
{
*c = 0;
char*n = strrchr(buf,'/');
if( n != NULL )
{
strcpy(gridname, n+1);
}
else
{
strcpy(gridname, buf);
}
strcat(c, ".f5");
fileID = H5Fcreate(buf,
H5F_ACC_TRUNC,
H5P_DEFAULT,
H5P_DEFAULT);
printf("F5 file with single obj is: %s\n",buf);
}
else
{
char*n = strrchr(buf,'/');
if( n != NULL )
{
strcpy(gridname, n+1);
}
else
{
strcpy(gridname, buf);
}
strcat(buf, ".f5");
printf("right4 %s\n",buf);
fileID = H5Fcreate(buf,
H5F_ACC_TRUNC,
H5P_DEFAULT,
H5P_DEFAULT);
printf("F5 file with multiple obj is: %s\n",buf);
}
unsigned which_file = 0;
for (which_file=0; which_file < file_number; which_file++)
{
printf("Processing file # %d\n", which_file);
int nCoords = 0,
nVertexNormals = 0,
nImageTextureCoordinates = 0,
nTriangles = 0,
nTriangleTextures = 0;
double time = which_file*delta_t;
char fname[1024];
sprintf(fname,"%s%06d.obj", argv[1],which_file);
if(argc < 3)
sprintf(fname,"%s", argv[1]);
what = fopen(fname, "rt");
if (!what)
{
printf("Cannot open '%s'. That's not good.\n", fname );
return 2;
}
while( fgets(buf, sizeof(buf), what) )
{
double x,y,z;
switch(*buf)
{
case 'm':
{
char mtllib[2048] = "";
if (sscanf(buf, "mtllib %s\n", mtllib) != 1)
continue;
printf("Handle material lib file %s\n", mtllib );
handle_material_lib_file( fileID, time, mtllib );
}
continue;
case 'v':
switch(buf[1])
{
case 't':
if (sscanf(buf, "vt %lg %lg %lg\n", &x, &y, &z) != 2)
continue;
TextureImageCoordinates[nImageTextureCoordinates].
u = x;
TextureImageCoordinates[nImageTextureCoordinates].
v = y;
nImageTextureCoordinates++;
continue;
case 'n':
if (sscanf(buf, "vn %lg %lg %lg\n", &x, &y, &z) != 3)
continue;
VertexNormals[nVertexNormals].
x = x;
VertexNormals[nVertexNormals].
y = y;
VertexNormals[nVertexNormals].
z = z;
nVertexNormals++;
continue;
default:
if (sscanf(buf, "v %lg %lg %lg\n", &x, &y, &z) != 3)
continue;
nCoords++;
continue;
}
case 'f':
{
int v0=0, vt0=0, vn0=0, v1=0, vt1=0, vn1=0, v2=0, vt2=0, vn2=0;
if (sscanf(buf, "f %d/%d/%d %d/%d/%d %d/%d/%d\n",
&v0, &vt0, &vn0, &v1, &vt1, &vn1, &v2, &vt2, &vn2) != 9)
{
if (sscanf(buf, "f %d %d %d\n",
&v0, &v1, &v2 ) != 3)
if(sscanf(buf, "f %d/%d %d/%d %d/%d\n",
&v0, &vt0, &v1, &vt1, &v2, &vt2) != 6)
if(sscanf(buf, "f %d//%d %d//%d %d//%d\n",
&v0, &vn0, &v1, &vn1, &v2, &vn2) != 6)
v0 = v0;
}
else
{
TriangleTextureIndices[ nTriangleTextures ].
i = vt0;
TriangleTextureIndices[ nTriangleTextures ].
j = vt0;
TriangleTextureIndices[ nTriangleTextures ].
k = vt0;
nTriangleTextures++;
}
Triangles[nTriangles].
i = v0-1;
Triangles[nTriangles].
j = v1-1;
Triangles[nTriangles].
k = v2-1;
nTriangles++;
continue;
}
}
}
if (!nCoords)
{
H5Fclose(fileID);
return 0;
}
printf("Triangular surface: %d vertices, %d normals, %d texture coordinates, %d triangles, %d triangle texture coordinates\n",
nCoords, nVertexNormals, nImageTextureCoordinates, nTriangles, nTriangleTextures);
if (nCoords == nVertexNormals)
{
puts("Writing surface normal vectors...");
hsize_t dims[] = { nVertexNormals, 1 };
VertexNormals, H5P_DEFAULT);
}
if (nTriangles == nTriangleTextures)
{
puts("Writing surface texture coordinates...");
char *TextureFieldName = "TextureCoordinates";
if (*mtl)
TextureFieldName = mtl;
TriangleTextureIndices, H5P_DEFAULT);
if (err)
printf("ERROR writing texture coordinates because %s\n",
if (1)
{
char timename[128];
char TextureRepresentation[2048];
snprintf(TextureRepresentation, sizeof(TextureRepresentation),
"/%s/%s/Faces/Points/%s",
gridname, TextureFieldName);
H5Glink(Texture_Representation_hid, H5G_LINK_SOFT, TextureRepresentation, "Positions");
{
float
*u_i = (float*)malloc( sizeof(float)*nTriangles ),
*u_j = (float*)malloc( sizeof(float)*nTriangles ),
*u_k = (float*)malloc( sizeof(float)*nTriangles ),
*v_i = (float*)malloc( sizeof(float)*nTriangles ),
*v_j = (float*)malloc( sizeof(float)*nTriangles ),
*v_k = (float*)malloc( sizeof(float)*nTriangles );
for(size_t tri = 0; tri<nTriangles; tri++)
{
size_t i = TriangleTextureIndices[ tri ].
i;
assert( i < nTriangles );
u_i[tri] = TextureImageCoordinates[ i ].
u;
}
F5Fwrite_1D(myFields.
Cells,
"u_ii", nTriangles, H5T_NATIVE_FLOAT,H5T_NATIVE_FLOAT, u_i, H5P_DEFAULT);
F5Fwrite_1D(myFields.
Cells,
"u_ij", nTriangles, H5T_NATIVE_FLOAT,H5T_NATIVE_FLOAT, u_j, H5P_DEFAULT);
F5Fwrite_1D(myFields.
Cells,
"u_jj", nTriangles, H5T_NATIVE_FLOAT,H5T_NATIVE_FLOAT, u_k, H5P_DEFAULT);
F5Fwrite_1D(myFields.
Cells,
"v_ii", nTriangles, H5T_NATIVE_FLOAT,H5T_NATIVE_FLOAT, v_i, H5P_DEFAULT);
F5Fwrite_1D(myFields.
Cells,
"v_ij", nTriangles, H5T_NATIVE_FLOAT,H5T_NATIVE_FLOAT, v_j, H5P_DEFAULT);
F5Fwrite_1D(myFields.
Cells,
"v_jj", nTriangles, H5T_NATIVE_FLOAT,H5T_NATIVE_FLOAT, v_k, H5P_DEFAULT);
}
}
{
int IndexDepth = 1,
SkeletonDimensionality = 1,
Dimensionality = 1;
TextureFieldName,
TextureChart2D, NULL,
gridname,
"VertexSubset",
IndexDepth, SkeletonDimensionality,
Dimensionality,
NULL);
F5Fwrite_1D(TextureRep,
"Positions", nImageTextureCoordinates,
TextureImageCoordinates, H5P_DEFAULT);
}
}
puts("ERROR in writing surface...");
}
H5Fclose(fileID);
puts(" **** Done ****");
return 0;
}
F5_API F5ErrorCode F5Fwrite_1D(F5Path *fpath, const char *fieldname, hsize_t nElements, hid_t fieldtype, hid_t memtype, const void *dataPtr, hid_t property_id)
enum F5ErrorCode_type F5ErrorCode
ChartDomain_IDs * F5B_standard_texture_chart2D()
F5_triangle32_t F5_triangle_t
F5_point3f_t F5_vec3_point_t
#define FIBER_HDF5_POSITIONS_STRING
#define F5_IMAGE_RGB_FLOAT_INTENSITY
F5Vertices_and_Connectivity_t F5write_triangular_surface_vc(hid_t file_id, double time, const char *name, const F5_vec3_point_t *Coords, int nCoords, const F5_triangle_t *Triangles, int nTriangles)
F5_API int F5Fwrite_linear(F5Path *fpath, const char *fieldname, int rank, hsize_t *dims, hid_t fieldtype, const void *base, const void *delta)
const char * F5Fwhatsup(F5ErrorCode EC)
F5ErrorCode F5Fwrite(F5Path *fpath, const char *fieldname, int rank, hsize_t *dims, hid_t fieldtype, hid_t memtype, const void *dataPtr, hid_t property_id)
F5Path * F5LTcreate(hid_t File_id, const double *time, const char *gridname, ChartDomain_IDs *ChartDomain, ChartDomain_IDs *coord_creator(), const char *coordinate_system, const char *TopologyName, int IndexDepth, int SkeletonDimensionality, int Dimensionality, const hsize_t *refinement)
F5Path * F5Rcreate_cartesian_nD(hid_t File_id, double time, const char *gridname, int Dims, const char *coordinate_system)
F5_API char * F5I_timegroup(const double *time, char *destbuf, size_t len)
hid_t F5Gappend(hid_t loc_id, const char *name)
struct F5Vertices_and_Connectivity F5Vertices_and_Connectivity_t
void F5closeVC(F5Vertices_and_Connectivity_t *VC)
F5_ChartPrecisionTypes SinglePrecision