1 /*---------------------------------------------------------------------------*
2   Project:  Horizon
3   File:     gr_Texture.h
4 
5   Copyright (C)2010 Nintendo Co., Ltd.  All rights reserved.
6 
7   These coded instructions, statements, and computer programs contain
8   proprietary information of Nintendo of America Inc. and/or Nintendo
9   Company Ltd., and are protected by Federal copyright law.  They may
10   not be disclosed to third parties or copied or duplicated in any form,
11   in whole or in part, without the prior written consent of Nintendo.
12 
13   $Rev: 28648 $
14  *---------------------------------------------------------------------------*/
15 
16 #ifndef NN_GR_TEXTURE_H_
17 #define NN_GR_TEXTURE_H_
18 
19 #include <nn/gr/CTR/gr_Prefix.h>
20 
21 namespace nn
22 {
23     namespace gr
24     {
25         namespace CTR
26         {
27 
28             /*!
29                 @brief テクスチャ設定のためのクラスです。
30              */
31             class Texture
32             {
33             public :
34 
35                 /*!
36                     @brief 各テクスチャユニットの共通設定のためのクラスです。
37                  */
38                 class UnitBase
39                 {
40                 public :
41                     /*!
42                         @brief テクスチャの物理アドレスの設定です。型は uptr です。
43                      */
44                     uptr physicalAddr;
45 
46 
47                     /*!
48                         @brief テクスチャの幅の設定です。型は u16 です。
49                      */
50                     u16 width;
51 
52 
53                     /*!
54                         @brief テクスチャの高さの設定です。型は u16 です。
55                      */
56                     u16 height;
57 
58                     /*!
59                         @brief テクスチャのフォーマットの設定です。
60                                型は @ref PicaDataTextureFormat です。
61                     */
62                     /*
63                         値は、
64                         PICA_DATA_TEXTURE_FORMAT_RGBA_UNSIGNED_BYTE
65                         PICA_DATA_TEXTURE_FORMAT_RGB_UNSIGNED_BYTE
66                         PICA_DATA_TEXTURE_FORMAT_RGBA_UNSIGNED_SHORT_5_5_5_1
67                         PICA_DATA_TEXTURE_FORMAT_RGB_UNSIGNED_SHORT_5_6_5
68                         PICA_DATA_TEXTURE_FORMAT_RGBA_UNSIGNED_SHORT_4_4_4_4
69                         PICA_DATA_TEXTURE_FORMAT_LUMINANCE_ALPHA_UNSIGNED_BYTE
70                         PICA_DATA_TEXTURE_FORMAT_HILO8_DMP_UNSIGNED_BYTE
71                         PICA_DATA_TEXTURE_FORMAT_LUMINANCE_UNSIGNED_BYTE
72                         PICA_DATA_TEXTURE_FORMAT_ALPHA_UNSIGNED_BYTE
73                         PICA_DATA_TEXTURE_FORMAT_LUMINANCE_ALPHA_UNSIGNED_BYTE_4_4_DMP
74                         PICA_DATA_TEXTURE_FORMAT_LUMINANCE_UNSIGNED_4BITS_DMP
75                         PICA_DATA_TEXTURE_FORMAT_ALPHA_UNSIGNED_4BITS_DMP
76                         PICA_DATA_TEXTURE_FORMAT_ETC1_RGB8_NATIVE_DMP
77                         PICA_DATA_TEXTURE_FORMAT_ETC1_ALPHA_RGB8_A4_NATIVE_DMP
78                         のいずれかを設定します。
79                     */
80                     PicaDataTextureFormat format;
81 
82                     /*!
83                         @brief テクスチャ座標 s の設定です。
84                                型は @ref PicaDataTextureWrap です。
85                                初期値はPICA_DATA_TEXTURE_WRAP_REPEATです。
86                      */
87                     /*
88                         PICA_DATA_TEXTURE_WRAP_CLAMP_TO_EDGE
89                         PICA_DATA_TEXTURE_WRAP_CLAMP_TO_BORDER
90                         PICA_DATA_TEXTURE_WRAP_REPEAT
91                         PICA_DATA_TEXTURE_WRAP_MIRRORED_REPEAT
92                         のいずれかを設定します。
93                     */
94                     PicaDataTextureWrap wrapT;
95 
96                     /*!
97                         @brief テクスチャ座標 s の設定です。
98                                型は @ref PicaDataTextureWrap です。
99                                初期値はPICA_DATA_TEXTURE_WRAP_REPEATです。
100                     */
101                     /*
102                         PICA_DATA_TEXTURE_WRAP_CLAMP_TO_EDGE
103                         PICA_DATA_TEXTURE_WRAP_CLAMP_TO_BORDER
104                         PICA_DATA_TEXTURE_WRAP_REPEAT
105                         PICA_DATA_TEXTURE_WRAP_MIRRORED_REPEAT
106                         のいずれかを設定します。
107                     */
108                     PicaDataTextureWrap wrapS;
109 
110                     /*!
111                         @brief テクスチャ拡大フィルタの設定です。
112                                型は @ref PicaDataTextureMagFilter です。
113                                初期値はPICA_DATA_TEXTURE_MAG_FILTER_NEARESTです。
114                     */
115                     /*
116                         PICA_DATA_TEXTURE_MAG_FILTER_NEAREST
117                         PICA_DATA_TEXTURE_MAG_FILTER_LINEAR
118                         のいずれかを設定します。
119                     */
120                     PicaDataTextureMagFilter magFilter;
121 
122 
123                     /*!
124                         @brief テクスチャ縮小フィルタの設定です。
125                                型は @ref PicaDataTextureMinFilter です。
126                                初期値は PICA_DATA_TEXTURE_MIN_FILTER_NEAREST です。
127                     */
128                     /*
129                         値は、
130                         PICA_DATA_TEXTURE_MIN_FILTER_NEAREST
131                         PICA_DATA_TEXTURE_MIN_FILTER_NEAREST_MIPMAP_NEAREST
132                         PICA_DATA_TEXTURE_MIN_FILTER_NEAREST_MIPMAP_LINEAR
133                         PICA_DATA_TEXTURE_MIN_FILTER_LINEAR
134                         PICA_DATA_TEXTURE_MIN_FILTER_LINEAR_MIPMAP_NEAREST
135                         PICA_DATA_TEXTURE_MIN_FILTER_LINEAR_MIPMAP_LINEAR
136                         のいずれかを設定します。
137                         MipMapを有効にしたい場合は
138                         PICA_DATA_TEXTURE_MIN_FILTER_LINEAR_MIPMAP_LINEAR
139                         PICA_DATA_TEXTURE_MIN_FILTER_LINEAR_MIPMAP_NEAREST
140                         PICA_DATA_TEXTURE_MIN_FILTER_NEAREST_MIPMAP_LINEAR
141                         PICA_DATA_TEXTURE_MIN_FILTER_NEAREST_MIPMAP_NEAREST
142                         のいずれかを設定してください。
143                     */
144                     PicaDataTextureMinFilter minFilter;
145                     NN_PADDING3;
146 
147                     /*!
148                         @brief LODバイアスの設定です。
149                                型は f32 です。
150                                初期値は0.fです。
151                                [-16.f : 16.f]の範囲で設定してください。
152                         @see IsEnableMipMap()
153                     */
154                     /*
155                         コマンド生成時には13bit固定小数(fraction8)に変換されます。
156                         MipMapが有効でないときは、無視されます。
157                     */
158                     f32 lodBias;
159 
160                     /*!
161                         @brief 最小LODレベルを設定します。値は u8 です。
162                                初期値は0です。
163                                0以上の値で設定します。
164                         @see IsEnableMipMap()
165                      */
166                     /*
167                         MipMapが有効でないときは、無視されます。
168                     */
169                     u8 minLodLevel;
170 
171 
172                     /*!
173                         @brief 最大LODレベルを設定します。値は u8 です。
174                                初期値は0です。
175                         @see IsEnableMipMap()
176                     */
177                     /*
178                         ロードしたMipMapの段数-1を設定してください。
179                         MipMapが有効でないときは、無視されます。
180                     */
181                     u8 maxLodLevel;
182 
183 
184                     /*!
185                         @brief ボーダーカラーの赤成分です。
186                                値は u8 です。
187                                初期値は0です。
188                      */
189                     u8 borderColorR;
190 
191                     /*!
192                         @brief ボーダーカラーの緑成分です。
193                                値は u8 です。
194                                初期値は0です。
195                      */
196                     u8 borderColorG;
197 
198 
199                     /*!
200                         @brief ボーダーカラーの青成分です。
201                                値は u8 です。
202                                初期値は0です。
203                      */
204                     u8 borderColorB;
205 
206 
207                     /*!
208                         @brief ボーダーカラーのアルファ成分です。
209                                値は u8 です。
210                                初期値は0です。
211                      */
212                     u8 borderColorA;
213 
214                     NN_PADDING2;
215 
216                 protected :
217                     /*!
218                         @brief MipMapが有効かどうかを判定します。
219                     */
220                     /*
221                      MipMapを有効にしたい場合は、minFilterに
222                      PICA_DATA_TEXTURE_MIN_FILTER_LINEAR_MIPMAP_LINEAR
223                      PICA_DATA_TEXTURE_MIN_FILTER_LINEAR_MIPMAP_NEAREST
224                      PICA_DATA_TEXTURE_MIN_FILTER_NEAREST_MIPMAP_LINEAR
225                      PICA_DATA_TEXTURE_MIN_FILTER_NEAREST_MIPMAP_NEAREST
226                      のいずれかを設定してください。
227                      */
IsEnableMipMap()228                     bool IsEnableMipMap() const
229                     {
230                         if ( minFilter == PICA_DATA_TEXTURE_MIN_FILTER_LINEAR  ) return false;
231                         if ( minFilter == PICA_DATA_TEXTURE_MIN_FILTER_NEAREST ) return false;
232                         return true;
233                     }
234 
235                     /*!
236                         @brief 初期値を設定します。
237                      */
238                     UnitBase();
239                 };
240 
241             public :
242 
243                 /*!
244                     @brief テクスチャユニット0の設定のためのクラスです。
245                  */
246                 class Unit0 : public UnitBase
247                 {
248                 public :
249                      /*!
250                         @brief テクスチャユニット0のサンプラータイプの設定です。
251                                型は @ref PicaDataTexture0SamplerType です。
252                                初期値はPICA_DATA_TEXTURE0_SAMPLER_TYPE_TEXTURE_FALSEです。
253                      */
254 
255                     /*
256                      PICA_DATA_TEXTURE0_SAMPLER_TYPE_TEXTURE_2D
257                      PICA_DATA_TEXTURE0_SAMPLER_TYPE_TEXTURE_CUBE_MAP
258                      PICA_DATA_TEXTURE0_SAMPLER_TYPE_TEXTURE_SHADOW_2D_DMP
259                      PICA_DATA_TEXTURE0_SAMPLER_TYPE_TEXTURE_PROJECTION_DMP
260                      PICA_DATA_TEXTURE0_SAMPLER_TYPE_TEXTURE_SHADOW_CUBE_DMP
261                      PICA_DATA_TEXTURE0_SAMPLER_TYPE_TEXTURE_FALSE
262                      のいずれかを設定します。
263                      */
264                     PicaDataTexture0SamplerType texType;
265                     NN_PADDING3;
266 
267                     /*!
268                         @brief キューブマップ[ +x ]テクスチャの物理アドレスの設定です。
269                                型は uptr です。
270                     */
271                     uptr cubeMapAddrPosX;
272 
273                     /*!
274                         @brief キューブマップ[ -x ]テクスチャの物理アドレスの設定です。
275                                型は uptr です。
276                     */
277                     uptr cubeMapAddrNegX;
278 
279                     /*!
280                         @brief キューブマップ[ +y ]テクスチャの物理アドレスの設定です。
281                                型は uptr です。
282                     */
283                     uptr cubeMapAddrPosY;
284 
285                     /*!
286                         @brief キューブマップ[ -Y ]テクスチャの物理アドレスの設定です。
287                                型は uptr です。
288                     */
289                     uptr cubeMapAddrNegY;
290 
291                     /*!
292                         @brief キューブマップ[ +Z ]テクスチャの物理アドレスの設定です。
293                                型は uptr です。
294                     */
295                     uptr cubeMapAddrPosZ;
296 
297                     /*!
298                         @brief キューブマップ[ -Z ]テクスチャの物理アドレスの設定です。
299                                型は uptr です。
300                     */
301                     uptr cubeMapAddrNegZ;
302 
303                 public :
304                     /*!
305                         @brief 設定された情報をもとに、テクスチャユニット0の設定コマンドを生成します。
306 
307                         @param[in] command                描画コマンドの書き込み先の先頭アドレスです。
308                         @param[in] is_update_texture_func サンプラータイプなどの設定を変えた場合はtrueを設定します。
309 
310                         @return    書き込まれた描画コマンドの終端の次のアドレスを返します。
311                      */
312                     bit32* MakeCommand( bit32* command, bool is_update_texture_func = true ) const;
313 
314                     /*!
315                         @brief 初期値を設定します。
316 
317                         @param[in] texture_ テクスチャです。
318                      */
319                     explicit Unit0( const Texture& texture_ );
320 
321                 private :
322                     const Texture& m_Texture;
323                 };
324 
325                 /*!
326                     @brief テクスチャユニット1の設定のためのクラスです。
327                  */
328                 class Unit1 : public UnitBase
329                 {
330                 public :
331                     /*!
332                         @brief テクスチャユニット1のサンプラータイプの設定です。
333                                型は @ref PicaDataTexture1SamplerType です。
334                                初期値はPICA_DATA_TEXTURE1_SAMPLER_TYPE_FALSEです。
335                      */
336                     /*
337                      PICA_DATA_TEXTURE1_SAMPLER_TYPE_TEXTURE_2D
338                      PICA_DATA_TEXTURE1_SAMPLER_TYPE_FALSE
339                      のいずれかを設定します。
340                      */
341                     PicaDataTexture1SamplerType texType;
342                     NN_PADDING3;
343 
344                 public :
345                     /*!
346                         @brief 設定された情報をもとに、テクスチャユニット1の設定コマンドを生成します。
347 
348                         @param[in] command                描画コマンドの書き込み先の先頭アドレスです。
349                         @param[in] is_update_texture_func サンプラータイプなどの設定を変えた場合はtrueを設定します。
350 
351                         @return    書き込まれた描画コマンドの終端の次のアドレスを返します。
352                      */
353                     bit32* MakeCommand( bit32* command, bool is_update_texture_func = true ) const;
354 
355                     /*!
356                         @brief 初期値を設定します。
357 
358                         @param[in] texture_ テクスチャです。
359                      */
360                     explicit Unit1( const Texture& texture_ );
361 
362                 private :
363                     const Texture& m_Texture;
364                 };
365 
366                 /*!
367                     @brief テクスチャユニット2の設定のためのクラスです。
368                  */
369                 class Unit2 : public UnitBase
370                 {
371                 public :
372                     /*!
373                         @brief テクスチャユニット2のサンプラータイプの設定です。
374                                型は @ref PicaDataTexture2SamplerType です。
375                      */
376                     /*
377                         値は、
378                         PICA_DATA_TEXTURE2_SAMPLER_TYPE_TEXTURE_2D
379                         PICA_DATA_TEXTURE2_SAMPLER_TYPE_FALSE
380                         のいずれかを設定します。
381                      */
382                     PicaDataTexture2SamplerType texType;
383 
384                     /*
385                         @brief テクスチャユニット2のテクスチャ座標選択の設定です。
386                                型は @ref PicaDataTexture2TexCoord です。
387                                初期値は PICA_DATA_TEXTURE2_TEXCOORD_TEXTURE2 です。
388                      */
389                     /*
390                         値は、
391                         PICA_DATA_TEXTURE2_TEXCOORD_TEXTURE1
392                         PICA_DATA_TEXTURE2_TEXCOORD_TEXTURE2
393                         のいずれかを設定します。
394                      */
395                     PicaDataTexture2TexCoord    texCoord;
396 
397                     NN_PADDING2;
398 
399                 public :
400                     /*!
401                         @brief 設定された情報をもとに、テクスチャユニット2の設定コマンドを生成します。
402 
403                         @param[in] command                描画コマンドの書き込み先の先頭アドレスです。
404                         @param[in] is_update_texture_func サンプラータイプなどの設定を変えた場合はtrueを設定します。
405 
406                         @return    書き込まれた描画コマンドの終端の次のアドレスを返します。
407                      */
408                      bit32* MakeCommand( bit32* command, bool is_update_texture_func = true ) const;
409 
410                     /*!
411                         @brief 初期値を設定します。
412 
413                         @param[in] texture_ テクスチャです。
414                      */
415                     explicit Unit2( const Texture& texture_ );
416 
417                 private :
418                     const Texture& m_Texture;
419                 };
420 
421                 /*!
422                     @brief テクスチャユニット3の設定のためのクラスです。
423                  */
424                 class Unit3 : private UnitBase
425                 {
426                 public :
427                     /*!
428                         @brief テクスチャユニット3のサンプラータイプの設定です。
429                                型は @ref PicaDataTexture3SamplerType です。
430                                初期値は PICA_DATA_TEXTURE3_SAMPLER_TYPE_FALSE です。
431                      */
432                     /*
433                         値は、
434                         PICA_DATA_TEXTURE3_SAMPLER_TYPE_TEXTURE_PROCEDURAL_DMP
435                         PICA_DATA_TEXTURE3_SAMPLER_TYPE_FALSE
436                         のいずれかを設定します。
437                      */
438                     PicaDataTexture3SamplerType texType;
439 
440                      /*!
441                         @brief テクスチャユニット3のテクスチャ座標選択の設定です。
442                                型は @ref PicaDataTexture3TexCoord です。
443                                初期値はPICA_DATA_TEXTURE3_TEXCOORD_TEXTURE0です。
444                      */
445                     /*
446                         値は、
447                         PICA_DATA_TEXTURE3_TEXCOORD_TEXTURE0
448                         PICA_DATA_TEXTURE3_TEXCOORD_TEXTURE1
449                         PICA_DATA_TEXTURE3_TEXCOORD_TEXTURE2
450                         のいずれかを設定します。
451                      */
452                     PicaDataTexture3TexCoord    texCoord;
453 
454                     NN_PADDING2;
455 
456                 public :
457                     /*!
458                         @brief 設定された情報をもとに、テクスチャユニット3の設定コマンドを生成します。
459 
460                         @param[in] command                描画コマンドの書き込み先の先頭アドレスです。
461                         @param[in] is_update_texture_func サンプラータイプなどの設定を変えた場合はtrueを設定します。
462 
463                         @return    書き込まれた描画コマンドの終端の次のアドレスを返します。
464                      */
465                     bit32* MakeCommand( bit32* command, bool is_update_texture_func = true ) const;
466 
467                     /*!
468                         @brief 初期値を設定します。
469 
470                         @param[in] texture_ テクスチャです。
471                      */
472                     explicit Unit3( const Texture& texture_ );
473 
474                 private :
475                     const Texture& m_Texture;
476                 };
477 
478             public :
479                 /*!
480                     @brief テクスチャユニット0についての設定です。
481                            型は nn::gr::CTR::Texture::Unit0 です。
482                 */
483                 Unit0 unit0;
484 
485                 /*!
486                     @brief テクスチャユニット1についての設定です。
487                            型は nn::gr::CTR::Texture::Unit1 です。
488                 */
489                 Unit1 unit1;
490 
491                 /*!
492                     @brief テクスチャユニット2についての設定です。
493                            型は nn::gr::CTR::Texture::Unit2 です。
494                 */
495                 Unit2 unit2;
496 
497                 /*!
498                     @brief テクスチャユニット3についての設定です。
499                            型は nn::gr::CTR::Texture::Unit3 です。
500                 */
501                 Unit3 unit3;
502 
503             public :
504                 /*!
505                     @brief 各設定の初期値を設定します。
506                 */
507                 Texture();
508 
509                 /*!
510                     @brief 設定された情報をもとに、すべてのテクスチャの設定コマンドを生成します。
511 
512                     @param[in] command 描画コマンドの書き込み先の先頭アドレスです。
513                     @param[in] isAddDummyCommand 0x80 へのダミー書き込みコマンドを 3回 生成します。
514 
515                     @return    書き込まれた描画コマンドの終端の次のアドレスを返します。
516                  */
517                 bit32* MakeCommand( bit32* command, bool isAddDummyCommand = true ) const;
518 
519                 /*!
520                     @brief 設定された情報をもとに、テクスチャユニットの有効/無効コマンドなどを生成します。
521 
522                     @param[in] command 描画コマンドの書き込み先の先頭アドレスです。
523                     @param[in] isAddDummyCommand 0x80 へのダミー書き込みコマンドを 3回 生成します。
524 
525                     @return    書き込まれた描画コマンドの終端の次のアドレスを返します。
526                  */
527                 bit32* MakeFuncCommand( bit32* command, bool isAddDummyCommand = true ) const;
528             };
529 
530         } // namespace CTR
531     } // namespace gr
532 } // namespace nn
533 
534 #endif // NN_GR_TEXTURE_H_
535