Ninja Library - テクスチャ関数

njLoadTexturePartManageNum

テクスチャマネージメント番号による即時復帰型テクスチャの分割ロード

書式

Sint32 njLoadTexturePartManageNum( texmng_no, pTexture, offset, size )
Sint32 texmng_no
Sint8* pTexture
Uint32 offset
Uint32 size

引数

texmng_no   テクスチャマネージメント番号
pTexture   メモリテクスチャのアドレス
offset   テクスチャデータ先頭からのオフセット(バイト)
size   ロードサイズ(バイト)

戻り値

 1   成功
−1   失敗

解説

テクスチャマネージメント番号texmng_noにテクスチャデータの先頭アドレス+offsetバイトの 位置からsizeバイトのロード要求を行います。テクスチャサイズ以上のロード要求があっても そのサイズ以上ロードすることはありません。 pTextureのアドレスが32バイトアラインメントかつoffsetが32の倍数のときsizeの32の倍数分は 即時復帰し、残りを完了復帰します。ロードの完了はnjLoadTextureFinishDMA()関数で確認してください。 ロードする前にテクスチャ管理領域、テクスチャサーフェスが取得されている 必要があります。njEntryTextureManageNum関数などで取得してください。

用例

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;
}


njLoadTexturePartManageNum
COPYRIGHT © SEGA ENTERPRISES, LTD., 1998-2000