Sint32 nuLoadFileTexture(NJS_TEXLIST *texlist,Uint32 n)
{
Sint32 ret;
GDFS fp;
Sint32 file_sect_size;
Sint32 buffer_sect_size;
Sint32 read_sect_size;
Uint32 globalIndex;
Uint32 globalIndex0;
Uint32 bank;
NJS_PVRHEADERDATA pvrh;
Sint8 * tex_start;
Sint8 filename2[32];
Sint32 texmng_no;
Uint32 size,offset;
Sint8 *texbuf;
Int texbuf_size;
njInitTextureErrStat();
/*
NJD_TEXATTR_TEXCONTINUE,
NJD_TEXATTR_GLOBALINDEX,
NJD_TEXATTR_PALGLOBALINDEXの処理
*/
ret = njCheckAttrGlobalIndex(texlist,n,&globalIndex0,&bank);
if(ret){
/* 0以外の場合 */
/* 1: NJD_TEXATTR_TEXCONTINUE*/
/* -1: エラー */
return ret;
}
/* ファイル名の変更 */
njCheckFileName(filename2,texlist->textures[n].filename,".PVR");
if((fp = gdFsOpen(filename2,NULL)) == NULL){
/* ファイルオープンエラー */
_nj_texerr_.texerr = NJD_TEXERR_FILEOPEN;
return -1;
}
/* ファイルのセクタサイズの計算 */
gdFsGetFileSctSize(fp,&file_sect_size);
/* テクスチャバッファ情報の取得 */
nuGetTextureBuffer(&texbuf,&texbuf_size);
buffer_sect_size = texbuf_size/NJD_GD_SECT_SIZE;
/* リードするセクタを計算する */
if(buffer_sect_size >= file_sect_size){
/* バッファの方が大きい場合 */
/* When a sector of a buffer is bigger than a sector loading it. */
read_sect_size = file_sect_size;
}
else{
/* バッファの方が小さい場合 */
/* When a sector of a buffer is smaller than a sector loading it.*/
read_sect_size = buffer_sect_size;
}
if((ret = gdFsRead(fp,read_sect_size,texbuf)) != GDD_ERR_OK){
/* ファイルロードエラー */
gdFsClose(fp);
NUM_FREAD_ERR(fp,NJD_TEXERR_FILELOAD)
return -1;
}
if((tex_start = njLoadPvrHeader(&pvrh,&globalIndex,texbuf)) == NULL){
/* ヘッダデータがない */
gdFsClose(fp);
return -1;
}
if(globalIndex0 != NJD_GLOBAXINDEX_FIRST_VAL){
globalIndex = globalIndex0;
}
ret = njEntryTextureManageNum(texlist,n,globalIndex,bank,&pvrh,&texmng_no);
if(ret){
gdFsClose(fp);
return ret;
}
offset = 0;
size = read_sect_size*NJD_GD_SECT_SIZE - ((Uint32)tex_start - (Uint32)texbuf);
do{
if(njLoadTexturePartManageNum(texmng_no,tex_start,offset,size)== -1){
njReleaseTextureManageNum(texmng_no);
/* テクスチャロードエラー */
gdFsClose(fp);
_nj_texerr_.texerr = NJD_TEXERR_TEXMEMLOAD;
return -1;
}
offset += size;
file_sect_size -= read_sect_size;
if(buffer_sect_size >= file_sect_size){
/* バッファの方が大きい場合 */
read_sect_size = file_sect_size;
}
else{
/* バッファの方が小さい場合 */
read_sect_size = buffer_sect_size;
}
if((ret = gdFsRead(fp,read_sect_size,texbuf)) != GDD_ERR_OK){
njReleaseTextureManageNum(texmng_no);
NUM_FREAD_ERR(fp,NJD_TEXERR_FILELOAD)
/* ファイルロードエラー */
gdFsClose(fp);
return -1;
}
tex_start = texbuf;
size = read_sect_size*NJD_GD_SECT_SIZE;
while(njLoadTextureFinishDMA() != 1);
}while(file_sect_size > 0);
gdFsClose(fp);
return 1;
}