Exemplo n.º 1
0
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");
	}
}
Exemplo n.º 2
0
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);
}
Exemplo n.º 3
0
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 );
}
Exemplo n.º 4
0
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;
}