Uint32 *njLoadPvrHeader( pvrh, globalIndex, pTexture ) NJS_PVRHEADERDATA *pvrh Uint32 *globalIndex Uint32 *pTexture
pvrh | NJS_PVRHEADERDATA構造体PVRヘッダデータの出力 |
globalIndex | ファイルからロードしたグローバルインデックス |
pTexture | テクスチャの先頭ポインタ |
PVRヘッダがあった場合 | データの先頭アドレス |
PVRヘッダがない場合 | NULL |
グローバルインデックスがない場合引数 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; }