##### 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