int WriteASEFile(char *filename) { int i, j, s, modelNum; FILE *f; dshader_t *shader; dmodel_t *dm; drawSurface_t *ds; entity_t *e; vec3_t origin; const char *key; char name[1024], base[1024]; Sys_Printf("writing %s\n", filename); f = fopen(filename, "wb"); if(!f) Error("Can't write %s\b", filename); // print header fprintf(f, "*3DSMAX_ASCIIEXPORT\t200\r\n"); fprintf(f, "*COMMENT\t\"Generated by XMap (XreaL) -bsp2ase\"\r\n"); fprintf(f, "*SCENE\t{\r\n"); fprintf(f, "\t*SCENE_FILENAME\t\"%s\"\r\n", base); fprintf(f, "\t*SCENE_FIRSTFRAME\t0\r\n"); fprintf(f, "\t*SCENE_LASTFRAME\t100\r\n"); fprintf(f, "\t*SCENE_FRAMESPEED\t30\r\n"); fprintf(f, "\t*SCENE_TICKSPERFRAME\t160\r\n"); fprintf(f, "\t*SCENE_BACKGROUND_STATIC\t0.0000\t0.0000\t0.0000\r\n"); fprintf(f, "\t*SCENE_AMBIENT_STATIC\t0.0000\t0.0000\t0.0000\r\n"); fprintf(f, "}\r\n"); // print materials fprintf(f, "*MATERIAL_LIST\t{\r\n"); fprintf(f, "\t*MATERIAL_COUNT\t%d\r\n", numShaders); for(i = 0; i < numShaders; i++) { shader = &dshaders[i]; ConvertShader(f, shader, i); } fprintf(f, "}\r\n"); // walk entity list for(i = 0; i < numEntities; i++) { // get entity and model e = &entities[i]; if(i == 0) { modelNum = 0; } else { key = ValueForKey(e, "model"); if(key[0] != '*') { continue; } modelNum = atoi(key + 1); } dm = &dmodels[modelNum]; // get entity origin key = ValueForKey(e, "origin"); if(key[0] == '\0') VectorClear(origin); else GetVectorForKey(e, "origin", origin); // convert model for(j = 0; j < dm->numSurfaces; j++) { s = j + dm->firstSurface; ds = &drawSurfaces[s]; ConvertSurface(f, dm, modelNum, ds, s, origin); } } // close the file fclose(f); // return to sender return 0; }
int ConvertBSPToASE( char *bspName ) { int i, modelNum; FILE *f; bspShader_t *shader; bspModel_t *model; entity_t *e; vec3_t origin; const char *key; char name[ 1024 ], base[ 1024 ]; /* note it */ Sys_Printf( "--- Convert BSP to ASE ---\n" ); /* create the ase filename from the bsp name */ strcpy( name, bspName ); StripExtension( name ); strcat( name, ".ase" ); Sys_Printf( "writing %s\n", name ); ExtractFileBase( bspName, base ); strcat( base, ".bsp" ); /* open it */ f = fopen( name, "wb" ); if( f == NULL ) Error( "Open failed on %s\n", name ); /* print header */ fprintf( f, "*3DSMAX_ASCIIEXPORT\t200\r\n" ); fprintf( f, "*COMMENT\t\"Generated by Q3Map2 (ydnar) -convert -format ase\"\r\n" ); fprintf( f, "*SCENE\t{\r\n" ); fprintf( f, "\t*SCENE_FILENAME\t\"%s\"\r\n", base ); fprintf( f, "\t*SCENE_FIRSTFRAME\t0\r\n" ); fprintf( f, "\t*SCENE_LASTFRAME\t100\r\n" ); fprintf( f, "\t*SCENE_FRAMESPEED\t30\r\n" ); fprintf( f, "\t*SCENE_TICKSPERFRAME\t160\r\n" ); fprintf( f, "\t*SCENE_BACKGROUND_STATIC\t0.0000\t0.0000\t0.0000\r\n" ); fprintf( f, "\t*SCENE_AMBIENT_STATIC\t0.0000\t0.0000\t0.0000\r\n" ); fprintf( f, "}\r\n" ); /* print materials */ fprintf( f, "*MATERIAL_LIST\t{\r\n" ); fprintf( f, "\t*MATERIAL_COUNT\t%d\r\n", numBSPShaders ); for( i = 0; i < numBSPShaders; i++ ) { shader = &bspShaders[ i ]; ConvertShader( f, shader, i ); } fprintf( f, "}\r\n" ); /* walk entity list */ for( i = 0; i < numEntities; i++ ) { /* get entity and model */ e = &entities[ i ]; if( i == 0 ) modelNum = 0; else { key = ValueForKey( e, "model" ); if( key[ 0 ] != '*' ) continue; modelNum = atoi( key + 1 ); } model = &bspModels[ modelNum ]; /* get entity origin */ key = ValueForKey( e, "origin" ); if( key[ 0 ] == '\0' ) VectorClear( origin ); else GetVectorForKey( e, "origin", origin ); /* convert model */ ConvertModel( f, model, modelNum, origin ); } /* close the file and return */ fclose( f ); /* return to sender */ return 0; }