Sint32 njGetTexSurface( texmemlist, pvrh ) NJS_TEXMEMLIST *texmemlist NJS_PVRHEADERDATA *pvrh
texmemlist | テクスチャメモリリストアドレス |
pvrh | NJS_PVRHEADERDATA構造体PVRヘッダデータの入力 |
成功 | 1 |
失敗 | -1 |
テクスチャメモリリストアドレスを指定する引数の 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; }