Esempio n. 1
0
int
main(int argc, char **argv)
{
	/*const char *fake_argv[3] ;
	fake_argv[0] = "ac3dto3ds" ;
	fake_argv[1] = "converter" ;
	fake_argv[2] = NULL ;
	*/

	init_args(argc, argv);
	extern int loadACo( char * inputFilename, char * outputFilename, int saveIn);
	extern int loadAC( char * inputFilename, char * outputFilename, int saveIn);

	if (typeConvertion==_AC3DTO3DS) {
		loadAC( InputFileName, OutputFileName,0);
	} else if (typeConvertion==_AC3DTOAC3D) {
		loadACo( InputFileName, OutputFileName,0);
	} else  if (typeConvertion==_AC3DTOOBJ) {
		loadAC( InputFileName, OutputFileName,1);
	} else  if (typeConvertion==_AC3DTOAC3DM) {
		loadAC( InputFileName, OutputFileName,2);
	} else  if (typeConvertion==_AC3DTOAC3DS) {
		loadAC( InputFileName, OutputFileName,3);
	} else if (typeConvertion==_AC3DTOAC3DGROUP) {
		loadAndGroup( OutputFileName);
	}


	return 0;
}
Esempio n. 2
0
void loadAndGroup( char *OutputFileName)
{
	ob_t *ob0=NULL;
	ob_t *ob1=NULL;
	ob_t *ob2=NULL;
	ob_t *ob3=NULL;
	ob_t *tmpob=NULL;
	ob_t *tmpob2=NULL;
	mat_t *tmat=NULL;
	//int requiredExtraGroup=0;
	extern FILE *ofile;
	int num_tkmn=0;
	ob_groups_t *array_groups;
	int good_group=0;
	int i=0;
	double dist=0;

	if (fileL0) {
		fprintf(stderr,"\nloading file %s\n",fileL0);
		loadAC(fileL0,NULL,-1);
		ob0=root_ob;
		root_ob=NULL;
	}
	if (fileL1) {
		fprintf(stderr,"\nloading file %s\n",fileL1);
		loadAC(fileL1,NULL,-1);
		ob1=root_ob;
		root_ob=NULL;
	}
	if (fileL2) {
		fprintf(stderr,"\nloading file %s\n",fileL2);
		loadAC(fileL2,NULL,-1);
		ob2=root_ob;
		root_ob=NULL;
	}
	if (fileL3) {
		fprintf(stderr,"\nloading file %s\n",fileL3);
		loadAC(fileL3,NULL,-1);
		ob3=root_ob;
		root_ob=NULL;
	}
	/* now collapse the texture and texture  arrays of 1 2 3 in 0 */

	smoothTriNorm(ob0);

	printf("collapsing textures \n");
	fprintf(stderr,"\ncollapsing textures\n");
	tmpob=ob0;
	while (tmpob!=NULL) {
		if (tmpob->name==NULL)  {
			tmpob=tmpob->next;
			continue;
		}
		if (!strcmp(tmpob->name, "root"))  {
			tmpob=tmpob->next;
			continue;
		}
		if (!strcmp(tmpob->name, "world")) {
			tmpob=tmpob->next;
			continue;
		}
		if (tmpob->type!=NULL) {
			if (!strcmp(tmpob->type,"group")) {
				tmpob=tmpob->next;
				continue;
			}
		}

		assignArrays(tmpob, ob1, &tmpob->textarray1, &tmpob->vertexarray1, &tmpob->texture1);
		assignArrays(tmpob, ob2, &tmpob->textarray2, &tmpob->vertexarray2, &tmpob->texture2);
		assignArrays(tmpob, ob3, &tmpob->textarray3, &tmpob->vertexarray3, &tmpob->texture3);
		
		tmpob=tmpob->next;
	}
	/* now make groups from ob0 */


	fprintf(stderr,"making groups\n");
	tmpob=ob0;
	num_tkmn=0;
	while (tmpob!=NULL) {
		if (tmpob->name==NULL)  {
			tmpob=tmpob->next;
			continue;
		}
		if (!strcmp(tmpob->name, "root"))  {
			tmpob=tmpob->next;
			continue;
		}
		if (!strcmp(tmpob->name, "world")) {
			tmpob=tmpob->next;
			continue;
		}
		if (tmpob->type != NULL && !strnicmp(tmpob->name, "tkmn",4) && strcmp(tmpob->type,"group")) {
			tmpob=tmpob->next;
			num_tkmn++;
			continue;
		}

		tmpob=tmpob->next;
	}

	printf("found %d tkmn\n",num_tkmn);
	if (num_tkmn==0) {
		fprintf(stderr,"\nERROR: cannot find any object tkmn for grouping\nAborting\n");
		exit (-1);
	}

	i=0;
	tmpob=ob0;
	array_groups=(ob_groups_t *) malloc(sizeof(ob_groups_t)*num_tkmn);
	while (tmpob!=NULL) {
		if (tmpob->name==NULL)  {
			tmpob=tmpob->next;
			continue;
		}
		if (!strcmp(tmpob->name, "root"))  {
			tmpob=tmpob->next;
			continue;
		}
		if (!strcmp(tmpob->name, "world")) {
			tmpob=tmpob->next;
			continue;
		}
		if (tmpob->type != NULL && !strnicmp(tmpob->name, "tkmn",4) && strcmp(tmpob->type,"group")) {
			array_groups[i].tkmn=tmpob;
			array_groups[i].numkids=1;
			array_groups[i].name=tmpob->name;
			array_groups[i].tkmnlabel=atoi(tmpob->name+4);
			array_groups[i].kids=NULL;
			array_groups[i].kids0=NULL;
			array_groups[i].kids1=NULL;
			array_groups[i].kids2=NULL;
			array_groups[i].kids3=NULL;
			array_groups[i].numkids0=0;
			array_groups[i].numkids1=0;
			array_groups[i].numkids2=0;
			array_groups[i].numkids3=0;
			tmpob=tmpob->next;
			i++;
			continue;
		}
		tmpob=tmpob->next;
	}

	fprintf(stderr,"dispatching objects in groups\n");
	tmpob=ob0;
	while (tmpob!=NULL) {
		if (tmpob->name==NULL)  {
			tmpob=tmpob->next;
			continue;
		}
		if (!strcmp(tmpob->name, "root"))  {
			tmpob=tmpob->next;
			continue;
		}
		if (!strcmp(tmpob->name, "world")) {
			tmpob=tmpob->next;
			continue;
		}
		if (!strnicmp(tmpob->name, "tkmn",4)) {
			tmpob=tmpob->next;
			continue;
		}

		good_group=-1;
		tmpob->dist_min=1000000;
		for (i=0; i<num_tkmn; i++) {
			dist=findDistmin( array_groups[i].tkmn, tmpob);
			if (dist<tmpob->dist_min) {
				tmpob->dist_min=dist;
				good_group=i;
			}
			if (    !strnicmp(tmpob->name, "t0RB",4)
			        || !strnicmp(tmpob->name, "t1RB",4)
			        || !strnicmp(tmpob->name, "t2RB",4)
			        || !strnicmp(tmpob->name, "tkRS",4)
			        || !strnicmp(tmpob->name, "t0LB",4)
			        || !strnicmp(tmpob->name, "t1LB",4)
			        || !strnicmp(tmpob->name, "t2LB",4)
			        || !strnicmp(tmpob->name, "tkLS",4)
			        || !strnicmp(tmpob->name, "BOLt",4)
			        || !strnicmp(tmpob->name, "BORt",4)
			   ) {
				if (atoi(tmpob->name+4)==array_groups[i].tkmnlabel) {
					printf( "object %s is forced in group %d \n",tmpob->name,array_groups[i].tkmnlabel);
					good_group=i;
					break;
				}
			}
		}
		if (good_group==-1) {
			printf("an object in no group %s \n",tmpob->name);
			tmpob=tmpob->next;
			continue;
		}
		printf("object %s is going to group %s  at dist=%f\n",tmpob->name,
		       array_groups[good_group].name,sqrt(tmpob->dist_min));
		if (array_groups[good_group].kids==NULL) {
			array_groups[good_group].kids=tmpob;
			tmpob=tmpob->next;
			array_groups[good_group].numkids++;
			array_groups[good_group].kids->next=NULL;
		} else {
			tmpob2=array_groups[good_group].kids;
			array_groups[good_group].kids=tmpob;
			tmpob=tmpob->next;
			array_groups[good_group].kids->next=tmpob2;
			array_groups[good_group].numkids++;
		}

		/*tmpob=tmpob->next;*/
	}
	/* now each tkmn group contains the list of its kids */

	/* for all tkmn groups the kids are dispatched in the different group levels */

#define INSERTINGROUP(kids,ob)   {\
     ob->next=kids;\
     kids=ob;\
   }

	for (i=0; i<num_tkmn; i++) {
		ob_t *tmpobnext;
		tmpob=array_groups[i].kids;
		printf("grouping level for %s\n", array_groups[i].name);
		while (tmpob!=NULL) {
			tmpobnext=tmpob->next;
			if (tmpob->name==NULL)  {
				tmpob=tmpobnext;
				continue;
			}
			if (!strnicmp(tmpob->name, "tkrb",4)) {
				array_groups[i].numkids--;
				array_groups[i].numkids0++;
				INSERTINGROUP(array_groups[i].kids0,tmpob);
				printf("inserting %s in group 0 of %s\n",tmpob->name, array_groups[i].name);
				tmpob=tmpobnext;
				continue;
			}
			if (!strnicmp(tmpob->name, "tklb",4)) {
				array_groups[i].numkids--;
				array_groups[i].numkids0++;
				INSERTINGROUP(array_groups[i].kids0,tmpob);
				printf("inserting %s in group 0 of %s\n",tmpob->name, array_groups[i].name);
				tmpob=tmpobnext;
				continue;
			}
			if (!strnicmp(tmpob->name, "tkrs",4)) {
				array_groups[i].numkids--;
				array_groups[i].numkids0++;
				INSERTINGROUP(array_groups[i].kids0,tmpob);
				printf("inserting %s in group 0 of %s\n",tmpob->name, array_groups[i].name);
				tmpob=tmpobnext;
				continue;
			}
			if (!strnicmp(tmpob->name, "tkls",4)) {
				array_groups[i].numkids--;
				array_groups[i].numkids0++;
				INSERTINGROUP(array_groups[i].kids0,tmpob);
				printf("inserting %s in group 0 of %s\n",tmpob->name, array_groups[i].name);
				tmpob=tmpobnext;
				continue;
			}

			if (tmpob->dist_min<d1*d1) {
				array_groups[i].numkids--;
				array_groups[i].numkids1++;
				INSERTINGROUP(array_groups[i].kids1,tmpob);
				printf("inserting %s in group 1 of %s\n",tmpob->name, array_groups[i].name);
			} else if (tmpob->dist_min<d2*d1) {
				array_groups[i].numkids--;
				array_groups[i].numkids2++;
				INSERTINGROUP(array_groups[i].kids2,tmpob);
				printf("inserting %s in group 2 of %s\n",tmpob->name, array_groups[i].name);
			} else if (tmpob->dist_min<d3*d3) {
				array_groups[i].numkids--;
				array_groups[i].numkids3++;
				INSERTINGROUP(array_groups[i].kids3,tmpob);
				printf("inserting %s in group 3 of %s\n",tmpob->name, array_groups[i].name);
			} else {
				printf("cannot insert object %s in group %s\n",tmpob->name,array_groups[i].name);
				//requiredExtraGroup=1;
			}
			/*if (!strnicmp(tmpob->name, "tk",2)){
			  tmpob2=tmpob;
			  tmpob=tmpob->next;
			  continue;
			  }*/

			tmpob=tmpobnext;
		}
		if (array_groups[i].numkids==0)
			array_groups[i].kids=NULL;
		printf("in group %s\n",array_groups[i].name);
		printf("    found in l0  %d\n",array_groups[i].numkids0);
		printf("    found in l1  %d\n",array_groups[i].numkids1);
		printf("    found in l2  %d\n",array_groups[i].numkids2);
		printf("    found in l3  %d\n",array_groups[i].numkids3);
		printf("    staying kids  %d\n",array_groups[i].numkids-1); /* because of the tkmn not moved */


	}

	/*#ifdef NEWSRC*/
	for (i=0; i<num_tkmn; i++) {
		int red=0;
		if (array_groups[i].numkids3>0) {
			red=mergeSplitted(&(array_groups[i].kids3));
			array_groups[i].numkids3-=red;
		}
		if (array_groups[i].numkids2>0) {
			red=mergeSplitted(&(array_groups[i].kids2));
			array_groups[i].numkids2-=red;
		}
		if (array_groups[i].numkids1>0) {
			red=mergeSplitted(&(array_groups[i].kids1));
			array_groups[i].numkids1-=red;
		}
	}
	/*#endif*/


	fprintf(stderr,"writing destination file %s\n",OutputFileName);



	if ((ofile=fopen (OutputFileName,"w"))==NULL) {
		fprintf(stderr,"failed to open %s\n", OutputFileName);
		return ;
	}
	fprintf(ofile,"AC3Db\n");
	tmat=root_material;
	while (tmat!=NULL) {
		if (strcmp (tmat->name, "root") == 0) {
			tmat = tmat->next;
			continue;
		}
		fprintf(ofile, "MATERIAL %s rgb %1.2f %1.2f %1.2f amb %1.2f %1.2f %1.2f emis %1.2f %1.2f %1.2f spec %1.2f %1.2f %1.2f shi %3d trans 0 \n",
		        tmat->name,
		        tmat->rgb.r,
		        tmat->rgb.g,
		        tmat->rgb.b,
		        tmat->amb.r,
		        tmat->amb.g,
		        tmat->amb.b,
		        tmat->emis.r,
		        tmat->emis.g,
		        tmat->emis.b,
		        tmat->spec.r,
		        tmat->spec.g,
		        tmat->spec.b,
		        (int)tmat->shi);
		/*(int)tmat->trans);*/
		tmat=tmat->next;
	}

	fprintf(ofile,"OBJECT world\n");
	fprintf(ofile,"kids %d\n",num_tkmn);

	for (i=0; i<num_tkmn; i++) {
		int numg=0;
		fprintf(ofile,"OBJECT group\n");
		fprintf(ofile,"name \"%s_g\"\n",array_groups[i].tkmn->name);
		numg=(array_groups[i].kids3==0?0:1)+(array_groups[i].kids2==0?0:1)+(array_groups[i].kids1==0?0:1)+1;
		fprintf(ofile,"kids %d\n",numg);
		/*printOb(array_groups[i].tkmn);*/


		if (array_groups[i].numkids3>0) {
			fprintf(ofile,"OBJECT group\n");
			fprintf(ofile,"name \"___%s_gl3\"\n",array_groups[i].tkmn->name);
			fprintf(ofile,"kids %d\n",array_groups[i].numkids3);
			printf("writting group: ___%s_gl3\n",array_groups[i].tkmn->name);
			tmpob=array_groups[i].kids3;
			while (tmpob!=NULL) {

				printOb(tmpob);
				printf("%s\n",tmpob->name);
				tmpob=tmpob->next;
			}
		}

		if (array_groups[i].numkids2>0) {
			fprintf(ofile,"OBJECT group\n");
			fprintf(ofile,"name \"%%___%s_gl2\"\n",array_groups[i].tkmn->name);
			fprintf(ofile,"kids %d\n",array_groups[i].numkids2);
			printf("writting group: ___%s_gl2\n",array_groups[i].tkmn->name);
			tmpob=array_groups[i].kids2;
			while (tmpob!=NULL) {
				printOb(tmpob);
				printf("%s\n",tmpob->name);
				tmpob=tmpob->next;
			}
		}
		if (array_groups[i].numkids1>0) {
			fprintf(ofile,"OBJECT group\n");
			fprintf(ofile,"name \"___%s_gl1\"\n",array_groups[i].tkmn->name);
			fprintf(ofile,"kids %d\n",array_groups[i].numkids1);
			printf("writting group: ___%s_gl1\n",array_groups[i].tkmn->name);
			tmpob=array_groups[i].kids1;
			while (tmpob!=NULL) {
				printOb(tmpob);
				printf("%s\n",tmpob->name);
				tmpob=tmpob->next;
			}
		}

		/* there is always a group 0 with the tkmn at leat */
		fprintf(ofile,"OBJECT group\n");
		fprintf(ofile,"name \"___%s_gl0\"\n",array_groups[i].tkmn->name);
		fprintf(ofile,"kids %d\n",array_groups[i].numkids0+1);
		printf("writting group: ___%s_gl0\n",array_groups[i].tkmn->name);
		tmpob=array_groups[i].kids0;
		while (tmpob!=NULL) {
			printOb(tmpob);
			printf("%s\n",tmpob->name);
			tmpob=tmpob->next;
		}
		printOb(array_groups[i].tkmn);
	}



	return ;
}