static void ReadPolysetGeometry( triangle_t *tripool, FILE *input, int count, triangle_t *ptri ) { tf_triangle tri; int i; for (i = 0; i < count; ++i) { int j; fread( &tri, sizeof(tf_triangle), 1, input ); ByteSwapTri (&tri); for (j=0 ; j<3 ; j++) { int k; for (k=0 ; k<3 ; k++) { ptri->verts[j][k] = tri.pt[j].p.v[k]; ptri->normals[j][k] = tri.pt[j].n.v[k]; // ptri->colors[j][k] = tri.pt[j].c.v[k]; } ptri->texcoords[j][0] = tri.pt[j].u; ptri->texcoords[j][1] = tri.pt[j].v; } ptri++; if ((ptri - tripool ) >= POLYSET_MAXTRIANGLES) Error ("Error: too many triangles; increase POLYSET_MAXTRIANGLES\n"); } }
void LoadTriangleList (char *filename, triangle_t **pptri, int *numtriangles) { QFile *input; char name[256], tex[256]; float start, exitpattern, t; int count, iLevel, magic, i; tf_triangle tri; triangle_t *ptri; t = -FLOAT_START; *((unsigned char *) &exitpattern + 0) = *((unsigned char *) &t + 3); *((unsigned char *) &exitpattern + 1) = *((unsigned char *) &t + 2); *((unsigned char *) &exitpattern + 2) = *((unsigned char *) &t + 1); *((unsigned char *) &exitpattern + 3) = *((unsigned char *) &t + 0); if ((input = Qopen(filename, "rb")) == 0) { fprintf (stderr,"reader: could not open file '%s'\n", filename); exit (0); } iLevel = 0; Qread(input, &magic, sizeof(int)); if (BigLong (magic) != MAGIC) { fprintf (stderr,"File is not a Alias object separated triangle file, " "magic number is wrong.\n"); exit (0); } ptri = malloc (MAXTRIANGLES * sizeof (triangle_t)); *pptri = ptri; while (Qeof(input) == 0) { Qread(input, &start, sizeof (float)); start = BigFloat (start); if (start != exitpattern) { if (start == FLOAT_START) { // Start of an object or group of objects. i = -1; do { // There are probably better ways to read a string from // a file, but this does allow you to do error checking // (which I'm not doing) on a per character basis. i++; Qread(input, &(name[i]), sizeof (char)); } while (name[i] != '\0'); // indent (); // fprintf(stdout,"OBJECT START: %s\n",name); Qread (input, &count, sizeof (int)); count = BigLong (count); ++iLevel; if (count != 0) { // indent(); // fprintf (stdout, "NUMBER OF TRIANGLES: %d\n", count); i = -1; do { i++; Qread (input, &(tex[i]), sizeof (char)); } while (tex[i] != '\0'); // indent(); // fprintf(stdout," Object texture name: '%s'\n",tex); } /* Else (count == 0) this is the start of a group, and */ /* no texture name is present. */ } else if (start == FLOAT_END) { /* End of an object or group. Yes, the name should be */ /* obvious from context, but it is in here just to be */ /* safe and to provide a little extra information for */ /* those who do not wish to write a recursive reader. */ /* Mia culpa. */ iLevel--; i = -1; do { i++; Qread (input, &(name[i]), sizeof (char)); } while (name[i] != '\0'); // indent(); // fprintf(stdout,"OBJECT END: %s\n",name); continue; } } // read the triangles for (i = 0; i < count; ++i) { int j; Qread (input, &tri, sizeof (tf_triangle)); ByteSwapTri (&tri); for (j = 0; j < 3; j++) { int k; for (k = 0; k < 3; k++) { ptri->verts[j][k] = tri.pt[j].p.v[k]; } } ptri++; if ((ptri - *pptri) >= MAXTRIANGLES) Sys_Error ("Error: too many triangles; increase MAXTRIANGLES\n"); } } *numtriangles = ptri - *pptri; Qclose (input); }
void LoadTRI( char *filename, triangle_t **pptri, int *numtriangles, mesh_node_t **nodesList, int *num_mesh_nodes ){ FILE *input; float start; char name[256], tex[256]; int i, count, magic; tf_triangle tri; triangle_t *ptri; int iLevel; int exitpattern; float t; if ( nodesList ) { *num_mesh_nodes = 0; *nodesList = (mesh_node_t *) SafeMalloc( MAX_FM_MESH_NODES * sizeof( mesh_node_t ), "Mesh Node List" ); } t = -FLOAT_START; *( (unsigned char *)&exitpattern + 0 ) = *( (unsigned char *)&t + 3 ); *( (unsigned char *)&exitpattern + 1 ) = *( (unsigned char *)&t + 2 ); *( (unsigned char *)&exitpattern + 2 ) = *( (unsigned char *)&t + 1 ); *( (unsigned char *)&exitpattern + 3 ) = *( (unsigned char *)&t + 0 ); if ( ( input = fopen( filename, "rb" ) ) == 0 ) { Error( "reader: could not open file '%s'", filename ); } iLevel = 0; fread( &magic, sizeof( int ), 1, input ); if ( BigLong( magic ) != MAGIC ) { Error( "%s is not a Alias object separated triangle file, magic number is wrong.", filename ); } ptri = malloc( MAXTRIANGLES * sizeof( triangle_t ) ); *pptri = ptri; while ( feof( input ) == 0 ) { if ( fread( &start, sizeof( float ), 1, input ) < 1 ) { break; } *(int *)&start = BigLong( *(int *)&start ); if ( *(int *)&start != exitpattern ) { if ( start == FLOAT_START ) { /* Start of an object or group of objects. */ i = -1; do { /* There are probably better ways to read a string from */ /* a file, but this does allow you to do error checking */ /* (which I'm not doing) on a per character basis. */ ++i; fread( &( name[i] ), sizeof( char ), 1, input ); } while ( name[i] != '\0' ); // indent(); // fprintf(stdout,"OBJECT START: %s\n",name); fread( &count, sizeof( int ), 1, input ); count = BigLong( count ); ++iLevel; if ( count != 0 ) { // indent(); // fprintf(stdout,"NUMBER OF TRIANGLES: %d\n",count); i = -1; do { ++i; fread( &( tex[i] ), sizeof( char ), 1, input ); } while ( tex[i] != '\0' ); // indent(); // fprintf(stdout," Object texture name: '%s'\n",tex); } /* Else (count == 0) this is the start of a group, and */ /* no texture name is present. */ } else if ( start == FLOAT_END ) { /* End of an object or group. Yes, the name should be */ /* obvious from context, but it is in here just to be */ /* safe and to provide a little extra information for */ /* those who do not wish to write a recursive reader. */ /* Mia culpa. */ --iLevel; i = -1; do { ++i; fread( &( name[i] ), sizeof( char ), 1, input ); } while ( name[i] != '\0' ); // indent(); // fprintf(stdout,"OBJECT END: %s\n",name); continue; } } // // read the triangles // for ( i = 0; i < count; ++i ) { int j; fread( &tri, sizeof( tf_triangle ), 1, input ); ByteSwapTri( &tri ); for ( j = 0 ; j < 3 ; j++ ) { int k; for ( k = 0 ; k < 3 ; k++ ) { ptri->verts[j][k] = tri.pt[j].p.v[k]; } } ptri++; if ( ( ptri - *pptri ) >= MAXTRIANGLES ) { Error( "Error: too many triangles; increase MAXTRIANGLES\n" ); } } } *numtriangles = ptri - *pptri; fclose( input ); DefaultNodesList( nodesList,num_mesh_nodes,numtriangles ); }
static void LoadTRI(FILE *input, triangle_t **triList, int *triangleCount) { int i, j, k; char text[256]; int count; int magic; tf_triangle tri; triangle_t *ptri; int exitpattern; float t; union { float _f; int _i; } start; t = -FLOAT_START; *((unsigned char *)&exitpattern + 0) = *((unsigned char *)&t + 3); *((unsigned char *)&exitpattern + 1) = *((unsigned char *)&t + 2); *((unsigned char *)&exitpattern + 2) = *((unsigned char *)&t + 1); *((unsigned char *)&exitpattern + 3) = *((unsigned char *)&t + 0); fread(&magic, sizeof(int), 1, input); if (BigLong(magic) != TRI_MAGIC) { COM_Error("Bad .TRI file: %s\n", InputFileName); } ptri = (triangle_t *) SafeMalloc(MAXTRIANGLES * sizeof(triangle_t)); *triList = ptri; count = 0; // make static analyzers happy while (feof(input) == 0) { fread(&start._f, sizeof(float), 1, input); start._i = BigLong(start._i); if (start._i != exitpattern) { if (start._f == FLOAT_START) { // Start of an object or group of objects i = -1; do { ++i; fread(&(text[i]), sizeof(char), 1, input); } while (text[i] != '\0'); //fprintf(stdout,"OBJECT START: %s\n", text); fread(&count, sizeof(int), 1, input); count = BigLong(count); if (count != 0) { //fprintf(stdout,"NUMBER OF TRIANGLES: %d\n", count); i = -1; do { ++i; fread(&(text[i]), sizeof( char ), 1, input); } while (text[i] != '\0'); //fprintf(stdout," Object texture name: '%s'\n", text); } } else if (start._f == FLOAT_END) { i = -1; do { ++i; fread(&(text[i]), sizeof(char), 1, input); } while (text[i] != '\0'); //fprintf(stdout,"OBJECT END: %s\n", text); continue; } } // Read the triangles for (i = 0; i < count; ++i) { fread(&tri, sizeof(tf_triangle), 1, input); ByteSwapTri(&tri); for (j = 0; j < 3; j++) { for (k = 0; k < 3; k++) { ptri->verts[j][k] = tri.pt[j].p.v[k]; } } /* printf("Face %i:\n v0: %f, %f, %f\n v1: %f, %f, %f\n" " v2: %f, %f, %f\n", i, ptri->verts[0][0], ptri->verts[0][1], ptri->verts[0][2], ptri->verts[1][0], ptri->verts[1][1], ptri->verts[1][2], ptri->verts[2][0], ptri->verts[2][1], ptri->verts[2][2]); */ ptri++; if ((ptri - *triList) >= MAXTRIANGLES) { COM_Error("Error: too many triangles; increase MAXTRIANGLES\n"); } } } *triangleCount = ptri - *triList; }