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

njGetTexSurface

テクスチャサーフェスの作成

書式

Sint32 njGetTexSurface( texmemlist, pvrh ) 
NJS_TEXMEMLIST *texmemlist 
NJS_PVRHEADERDATA *pvrh 

引数

texmemlist   テクスチャメモリリストアドレス
pvrh   NJS_PVRHEADERDATA構造体PVRヘッダデータの入力

戻り値

成功   1
失敗   -1

解説

テクスチャメモリリストにNJS_PVRHEADERDATA構造体に指定してあるテクスチャのサーフェスデスクを取得します。

テクスチャメモリリストアドレスを指定する引数の texmemlist->texinfo.texsurfaceメンバには、 取得したサーフェスディスクの値が返ります。

NJS_PVRHEADERDATA構造体にはテクスチャの横サイズ(nWidth)、テクスチャの縦サイズ(nHeight)、 テクスチャの種類(nTextureType)が必要です。

PVRテクスチャデータヘッダ取得には、njLoadPvrHeader関数を使用すると便利です。


用例

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

●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サンプルを参照してください。

参照

njLoadPvrHeader()
njLoadTexturePartLow()
njLoadTextureFinishDMA()
njReleaseTextureLow()

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