Principal | Gráficos 3D | Gráficos 2D | Fractales | Math | Códigos | Tutoriales | Links
| Volver |


Modulo: asc.h

#ifndef _ASC_H
#define _ASC_H

#include <string.h>
#include "objeto.h"

void CargarObjeto(char *archivo_asc, Object3D &object);

#endif

Modulo: asc.cpp

#include "asc.h"

void CargarObjeto(char *archivo_asc, Object3D &object)
{
 FILE *archivo;
 int numvertices, numfaces;
 int count, vertexnum, tempA, tempB, tempC, smoothingnum;
 float tempX, tempY, tempZ, tempU=0.0, tempV=0.0;
 char tempChar, cptr[1]="";

 char *tempString = new char [80];

 if((archivo = fopen(archivo_asc, "rt"))==NULL) 
	{
	printf("Error al abrir el archivo: %s\n", archivo_asc);
	exit(1);
	}

 //busco la cadena "Tri-mesh,"
 while(strncmp(tempString, "Tri-mesh,",9)) 
	{
	fscanf(archivo, "%s", tempString);
	if (feof(archivo)) {
		printf("La cadena \"Tri-mesh,\" no existe en el archivo...\n");
		exit(1);
		}
	}
 
 //lee el numero de vertices que hay en el objeto
 while(strncmp(tempString, "Vertices",8)) {
	fscanf(archivo, "%s", tempString);
	if (feof(archivo)) {
		printf("String \"Vertices\" no existe en el archivo...\n");
		exit(1);
		}
	}
 fgetc(archivo);				//Get ':'
 fscanf(archivo, "%d", &numvertices);
 object.nVertices=numvertices;
 object.pVertices = new Point3f[object.nVertices];

 //lee el numero de caras en el objeto
 while(strncmp(tempString, "Faces", 5)) 
	{
	fscanf(archivo, "%s", tempString);
	if (feof(archivo)) 
		{
		printf("String \"Faces\" no existe en el archivo...\n");
		exit(1);
		}
	}
 fgetc(archivo);				//Get ':'
 fscanf(archivo, "%d", &numfaces);

 object.nFaces=numfaces;
 object.pFaces = new Face[object.nFaces];

 // me fijo si esta "Vertex list"
 while(strncmp(tempString, "Vertex",6)) {
	fscanf(archivo, "%s", tempString);
	if (feof(archivo)) {
		printf("String \"Vertex\" no existe en el archivo...\n");
		exit(1);
		}
	}
 while(strncmp(tempString,"list:",5)) {
	fscanf(archivo, "%s", tempString);
	if (feof(archivo)) {
		printf("String \"list\" no existe en el archivo...\n");
		exit(1);
		}
	}

 //empiezo a cargar los vertices
 for (count=0; count<numvertices; count++) 
	{
	while(strncmp(tempString,"Vertex",6)) 
		{
		fscanf(archivo, "%s", tempString);
		if(feof(archivo)) 
			{
			printf("String \"Vertex\" no existe en el archivo...\n");
			exit(1);
			}
		}
	fscanf(archivo, "%d", &vertexnum);
	fscanf(archivo, "%s", tempString);      //get ':   '
	fscanf(archivo, "%[^:]", tempString);   //get '     X'
	fgetc(archivo);                      	//get ':'
	fscanf(archivo, "%f", &tempX);
	fscanf(archivo, "%[^:]", tempString);
	fgetc(archivo);
	fscanf(archivo, "%f", &tempY);
	fscanf(archivo, "%[^:]", tempString);
	fgetc(archivo);
	fscanf(archivo, "%f", &tempZ);
	fscanf(archivo, "%[^:]", tempString);
	fgetc(archivo);
	fscanf(archivo, "%f", &tempU);
	fscanf(archivo, "%[^:]", tempString);
	fgetc(archivo);
	fscanf(archivo, "%f", &tempV);
	object.pVertices[count].x=tempX;
	object.pVertices[count].y=tempY;
	object.pVertices[count].z=tempZ;
	object.pVertices[count].u=tempU;
	object.pVertices[count].v=tempV;
	}

 //me fijo si esta "Face list"
 while(strncmp(tempString,"Face",4)) 
	{
	fscanf(archivo, "%s", tempString);
	if (feof(archivo))
		{
		printf("String \"Face\" no existe en el archivo...\n");
		exit(1);
		}
	}
 while(strncmp(tempString,"list",4)) 
	{
	fscanf(archivo, "%s", tempString);
	if (feof(archivo)) {
		printf("String \"list\" no existe en el archivo...\n");
		exit(1);
		}
	}
 //Comienzo a leer las caras
 for (count=0; count<numfaces; count++) 
	{
	while(strncmp(tempString,"Face",4)) 
		{
		fscanf(archivo, "%s", tempString);
		if (feof(archivo)) {
			printf("String \"Face\" no existe en el archivo...\n");
			exit(1);
			}
		}
	while (fgetc(archivo) != 'A');
		fgetc(archivo);                  // get the ':' character
	fscanf(archivo, "%d", &tempA);   // get value for vertex A
	while (fgetc(archivo) != 'B');
		fgetc(archivo);
	fscanf(archivo, "%d", &tempB);
	while (fgetc(archivo) != 'C');
		fgetc(archivo);
	fscanf(archivo, "%d", &tempC);

    object.pFaces[count].vertexIndices[0]=tempA;
	object.pFaces[count].vertexIndices[1]=tempB;
	object.pFaces[count].vertexIndices[2]=tempC;

	//lee el resto de la linea "AB: BC: CA:" 
	fgets(tempString,80,archivo);
	while((tempChar=fgetc(archivo)) !='"')
		{
		if (feof(archivo))
			{
			printf("Starting \" not found for material in file.Exitting...\n");
			exit(1);
			}
		}
	char texture_name[80]="";
	while((tempChar=fgetc(archivo)) !='"')
		{
		if (feof(archivo))
			{
			printf("Ending \" not found for material in file.Exitting...\n");
			exit(1);
			}
		cptr[0]=tempChar;
		strncat(texture_name,cptr,1);
		}


	//lee el grupo de soomthing
	while(strncmp(tempString, "Smoothing",9)) {
		fscanf(archivo, "%s", tempString);
		if (feof(archivo)) {
			printf("String \"Smoothing\" no existe en el archivo...\n");
			exit(1);
			}
		}
	fgetc(archivo);				//Get ':'
	fscanf(archivo, "%d", &smoothingnum);

	object.pFaces[count].smoothingGroup=smoothingnum;
	}
 fclose(archivo);
}



valcoey@hotmail.com

Ramiro
Buenos Aires, Argentina, 2002

Principal | Gráficos 3D | Gráficos 2D | Fractales | Math | Códigos | Tutoriales | Links
| Volver |