const pm_char * eeRestoreModel(uint8_t i_fileDst, char *model_name) { char *buf = reusableBuffer.modelsel.mainname; FIL restoreFile; UINT read; eeCheck(true); if (!sdMounted()) { return STR_NO_SDCARD; } strcpy(buf, STR_MODELS_PATH); buf[sizeof(MODELS_PATH)-1] = '/'; strcpy(&buf[sizeof(MODELS_PATH)], model_name); strcpy(&buf[strlen(buf)], STR_MODELS_EXT); FRESULT result = f_open(&restoreFile, buf, FA_OPEN_EXISTING | FA_READ); if (result != FR_OK) { return SDCARD_ERROR(result); } if (f_size(&restoreFile) < 8) { f_close(&restoreFile); return STR_INCOMPATIBLE; } result = f_read(&restoreFile, (uint8_t *)buf, 8, &read); if (result != FR_OK || read != 8) { f_close(&restoreFile); return SDCARD_ERROR(result); } uint8_t version = (uint8_t)buf[4]; if (*(uint32_t*)&buf[0] != O9X_FOURCC || version < FIRST_CONV_EEPROM_VER || version > EEPROM_VER || buf[5] != 'M') { f_close(&restoreFile); return STR_INCOMPATIBLE; } if (eeModelExists(i_fileDst)) { eeDeleteModel(i_fileDst); } uint16_t size = min<uint16_t>(sizeof(g_model), *(uint16_t*)&buf[6]); uint32_t address = eepromHeader.files[i_fileDst+1].zoneIndex * EEPROM_ZONE_SIZE; // erase blocks eepromEraseBlock(address); eepromEraseBlock(address+EEPROM_BLOCK_SIZE); // write header EepromFileHeader * header = (EepromFileHeader *)eepromWriteBuffer; header->fileIndex = i_fileDst+1; header->size = size; int offset = 4; // write model do { uint16_t blockSize = min<uint16_t>(size, EEPROM_BUFFER_SIZE-offset); result = f_read(&restoreFile, eepromWriteBuffer+offset, blockSize, &read); if (result != FR_OK || read != blockSize) { f_close(&g_oLogFile); return SDCARD_ERROR(result); } eepromWrite(address, eepromWriteBuffer, blockSize+offset); size -= blockSize; address += EEPROM_BUFFER_SIZE; offset = 0; } while (size > 0); // write FAT eepromHeader.files[i_fileDst+1].exists = 1; eepromIncFatAddr(); eepromWriteState = EEPROM_WRITE_NEW_FAT; eepromWriteWait(); eeLoadModelHeader(i_fileDst, &modelHeaders[i_fileDst]); #if defined(PCBSKY9X) if (version < EEPROM_VER) { ConvertModel(i_fileDst, version); loadModel(g_eeGeneral.currModel); } #endif return NULL; }
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; }