Ninjaライブラリ - テクスチャ関数

njLoadPvrHeader

PVRヘッダデータの取得

書式

Uint32 *njLoadPvrHeader( pvrh, globalIndex, pTexture ) 
NJS_PVRHEADERDATA *pvrh 
Uint32 *globalIndex 
Uint32 *pTexture 

引数

pvrh   NJS_PVRHEADERDATA構造体PVRヘッダデータの出力
globalIndex   ファイルからロードしたグローバルインデックス
pTexture   テクスチャの先頭ポインタ

戻り値

PVRヘッダがあった場合   データの先頭アドレス
PVRヘッダがない場合   NULL

解説

PVRテクスチャデータを入力することでテクスチャのサイズ、タイプ、グローバルインデックスを取得します。

グローバルインデックスがない場合引数 globalIndex には、0xFFFFFFFFが返ります。

PVRヘッダがあった場合は、返値にPVRテクスチャデータの先頭が返ります。 データの先頭とはヘッダ部分の次を示します。


用例

***** テクスチャメモリリストの説明 *****

●globalIndex
	グローバルインデックス
	ユーザが使用できる範囲は0〜0xFFFFFFEF
	テクスチャメモリを使用していない場合は0xFFFFFFFFを入れる

●bank
	パレットテクスチャの場合、バンク番号を入れる
	4bppパレットでは0〜63、8bppパレットでは0〜15を入れる
	パレットテクスチャ以外の場合は0xFFFFFFFFを入れる
●tspparambuffer
●texparambuffer
	この2つのパラメータはテクスチャのサーフェスを取得した後、
	njSetTextureParam関数を実行することで設定される
	パレットテクスチャの場合、バンク番号を入れてから
	njSetTextureParam関数を実行すると、バンク番号も反映する
	njSetPaletteBank*関数を実行することでも、
	バンク番号の設定を反映する

●texaddr
	テクスチャメモリにテクスチャをロードした場合、
	NJD_TEXMEMFLAG_TEXMEM(BIT_1) を立てる
	キャッシュテクスチャ領域にロードした場合、
	NJD_TEXMEMFLAG_CACHE(BIT_0)を立てる

●texinfo

●count
	テクスチャをテクスチャメモリにロードした(ロード要求した)
	回数カウントする通常のリリース関数ではカウントが1の場合しか、
	テクスチャはリリースしない

●dummy
	エラーの場合エラー番号を入れる

/* 簡単なロード関数の例 (メモリにヘッダ付きテクスチャがある場合)*/

Sint32 EasyLoadTexture(NJS_TEXLIST *texlist,Uint32 n,Uint32 *pTexture)
{
    NJS_TEXMEMLIST *texmemlist;
    Uint32 globalIndex;
    NJS_PVRHEADERDATA pvrh;
    Uint32 *data;
    Int i,no;
    Uint32 size;

    /*
    データにはグローバルインデックス、PVRヘッダデータがあるものとする
    */
    if((data = njLoadPvrHeader(&pvrh,&globalIndex,pTexture))  == NULL){
        /* ヘッダがなかった場合*/
        return -1;
    }

    if(globalIndex > 0xFFFFFFEF){
        return -1;
    }

    /* テクスチャメモリリストの空いている場所を探す
    _nj_texmemlist、_nj_texmemsizeはnjInitTextureで
    設定した値
    */
    no = -1;
    for(i = 0;i < _nj_texmemsize;i++){
        if(_nj_texmemlist[i].globalIndex == globalIndex){
            /* すでにロードしてある*/
            _nj_texmemlist[i].count++;
            return 1;
        } else {
            if(no == -1){
                if(_nj_texmemlist[i].globalIndex == 0xFFFFFFFF){
                    no = i;
                }
            }
        }
    }
    /* テクスチャメモリリストの空きが見つからない*/
    if(no == -1){
        return -1;
    }

    texmemlist = &_nj_texmemlist[no];
    texmemlist->globalIndex = globalIndex;

    /* サーフェスを取得する*/
    if(njGetTexSurface(texmemlist,&pvrh) == -1){
        /* 失敗*/
        FreeTexMemList(texmemlist);
    }
    /* データ先頭からサイズ分ロードする*/
    size = texmemlist->texinfo.texsurface.TextureSize;
    if(njLoadTexturePartLow(&texmemlist,data,0,size) == -1){
        /* サーフェスのリリース*/
        njReleaseTextureLow(texmemlist);
        FreeTexMemList(texmemlist);
        return -1;
    }

    /* DMA終了まで待つ*/
    while(njLoadTextureFinishDMA() != 1);

    /* テクスチャパラメータを設定する*/
    njSetTextureParam(texmemlist);

    EntryTexMemList(texmemlist);
    /* テクスチャリストとテクスチャメモリリストのリンクをはる */
    texlist->textures[n].texaddr = (Uint32)texmemlist;
    /* ロードしたテクスチャの数をカウントする
    この数分NINDOWSのテクスチャビューアで見ることができる
    */
    _nj_tex_count++;

    return 1;
}

/* テクスチャメモリリストのテクスチャロード後の設定*/
void EntryTexMemList(NJS_TEXMEMLIST *texmemlist)
{
    texmemlist->count = 1;
    texmemlist->texaddr = NJD_TEXMEMFLAG_TEXMEM;
    texmemlist->dummy = 0;
}

/* テクスチャメモリリストの開放設定*/
void FreeTexMemList(NJS_TEXMEMLIST *texmemlist)
{
    texmemlist->globalIndex = 0xFFFFFFFF;
    texmemlist->bank = 0xFFFFFFFF;
    texmemlist->tspparambuffer = 0;
    texmemlist->texparambuffer = 0;
    texmemlist->texinfo.texaddr = 0;
    texmemlist->texinfo.texsurface.Type = 0;
    texmemlist->texinfo.texsurface.BitDepth = 0;
    texmemlist->texinfo.texsurface.PixelFormat = 0;
    texmemlist->texinfo.texsurface.nWidth = 0;
    texmemlist->texinfo.texsurface.nHeight = 0;
    texmemlist->texinfo.texsurface.TextureSize = 0;
    texmemlist->texinfo.texsurface.fSurfaceFlags = 0;
    texmemlist->texinfo.texsurface.pSurface = 0;
    texmemlist->texaddr = 0;
    texmemlist->count = 0;
}

備考

詳しくは、TexLowサンプルを参照してください。

参照

njGetTexSurface()
njLoadTexturePartLow()
njLoadTextureFinishDMA()
njReleaseTextureLow()

njLoadPvrHeader
COPYRIGHT © SEGA ENTERPRISES, LTD., 1998,1999