1 /*---------------------------------------------------------------------------*
2   Project:  NintendoWare
3   File:     gfx_ResFragmentShader.h
4 
5   Copyright (C)2009-2010 Nintendo Co., Ltd./HAL Laboratory, Inc.  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   $Revision: 18106 $
14  *---------------------------------------------------------------------------*/
15 
16 #ifndef NW_GFX_RESFRAGMENTSHADER_H_
17 #define NW_GFX_RESFRAGMENTSHADER_H_
18 
19 #include <GLES2/gl2.h>
20 #include <GLES2/gl2ext.h>
21 
22 #include <nw/ut/ut_ResUtil.h>
23 #include <nw/ut/ut_ResDictionary.h>
24 #include <nw/gfx/res/gfx_ResLookupTable.h>
25 #include <nw/gfx/res/gfx_ResTypeInfo.h>
26 #include <nw/gfx/gfx_CommandUtil.h>
27 
28 namespace nw {
29 namespace gfx {
30 namespace res {
31 
32 //! @details :private
33 struct ResFragmentLightingData
34 {
35     enum Flag
36     {
37         FLAG_CLAMP_HIGH_LIGHT_SHIFT,
38         FLAG_DISTRIBUTION0_ENABLED_SHIFT,
39         FLAG_DISTRIBUTION1_ENABLED_SHIFT,
40         FLAG_GEOMETRIC_FACTOR0_ENABLED_SHIFT,
41         FLAG_GEOMETRIC_FACTOR1_ENABLED_SHIFT,
42         FLAG_REFLECTION_ENABLED_SHIFT,
43 
44         FLAG_CLAMP_HIGH_LIGHT         = 0x1 << FLAG_CLAMP_HIGH_LIGHT_SHIFT,
45         FLAG_DISTRIBUTION0_ENABLED     = 0x1 << FLAG_DISTRIBUTION0_ENABLED_SHIFT,
46         FLAG_DISTRIBUTION1_ENABLED     = 0x1 << FLAG_DISTRIBUTION1_ENABLED_SHIFT,
47         FLAG_GEOMETRIC_FACTOR0_ENABLED = 0x1 << FLAG_GEOMETRIC_FACTOR0_ENABLED_SHIFT,
48         FLAG_GEOMETRIC_FACTOR1_ENABLED = 0x1 << FLAG_GEOMETRIC_FACTOR1_ENABLED_SHIFT,
49         FLAG_REFLECTION_ENABLED        = 0x1 << FLAG_REFLECTION_ENABLED_SHIFT
50     };
51 
52     nw::ut::ResU32 m_Flags;
53     nw::ut::ResU32 m_LayerConfig;
54     nw::ut::ResS32 m_FresnelConfig;
55     nw::ut::ResU32 m_BumpTextureIndex;
56     nw::ut::ResU32 m_BumpMode;
57     nw::ut::ResBool m_IsBumpRenormalize;
58     u8 _padding_0[3];
59 };
60 
61 //! @details :private
62 struct ResLightingLookupTableData
63 {
64     nw::ut::ResU32 m_Input;
65     nw::ut::ResU32 m_Scale;
66     nw::ut::Offset toSampler;
67 };
68 
69 //! @details :private
70 struct ResFragmentLightingTableData
71 {
72     nw::ut::Offset toReflectanceRSampler;
73     nw::ut::Offset toReflectanceGSampler;
74     nw::ut::Offset toReflectanceBSampler;
75     nw::ut::Offset toDistribution0Sampler;
76     nw::ut::Offset toDistribution1Sampler;
77     nw::ut::Offset toFresnelSampler;
78 };
79 
80 //! @details :private
81 struct ResAlphaTestData
82 {
83     nw::ut::ResU32 m_CommandBuffer[2];
84 };
85 
86 //! @details :private
87 struct ResTextureCombinerSourceData
88 {
89     nw::ut::ResU32 m_Sources[3];
90 };
91 
92 //! @details :private
93 struct ResTextureCombinerOperandData
94 {
95     nw::ut::ResU32 m_Operands[3];
96 };
97 
98 //! @details :private
99 struct ResTextureCombinerData
100 {
101     nw::ut::ResU32 m_Constant;
102 
103     union
104     {
105         struct
106         {
107             nw::ut::ResU32  m_CmdSource;
108             nw::ut::ResU32  m_CmdHeader;
109             nw::ut::ResU32  m_CmdOperand;
110             nw::ut::ResU32  m_CmdCombine;
111             nw::ut::ResU32  m_CmdConstant;
112             nw::ut::ResU32  m_CmdScale;
113         };
114         nw::ut::ResU32 m_CommandBuffer[6];
115     };
116 };
117 
118 //! @details :private
119 struct ResFragmentShaderData
120 {
121     nw::ut::ResFloatColor     m_BufferColor;
122     ResFragmentLightingData   m_FragmentLighting;
123     nw::ut::Offset            toFragmentLightingTable;
124     ResTextureCombinerData    m_TextureCombiners[COMBINER_COUNT];
125     ResAlphaTestData          m_AlphaTest;
126 
127     // [0] BufferColor
128     // [1] BufferColorヘッダ (0x0fd)
129     // [2] BufferInput
130     // [3] BufferInputヘッダ(0x0e0 [15:8])
131     // [4] TextureRemap
132     // [5] TextureRemapヘッダ(0x1c3 [15:8])
133     nw::ut::ResU32            m_BufferCommand[6];
134 };
135 
136 //--------------------------------------------------------------------------
137 //! @brief  フラグメントライティングを表すバイナリリソースクラスです。
138 //---------------------------------------------------------------------------
139 class ResFragmentLighting : public nw::ut::ResCommon< ResFragmentLightingData >
140 {
141 public:
142     enum LutType
143     {
144         LUT_RR_SHIFT,
145         LUT_RG_SHIFT,
146         LUT_RB_SHIFT,
147         LUT_D0_SHIFT,
148         LUT_D1_SHIFT,
149         LUT_FR_SHIFT,
150         LUT_SP_SHIFT,
151         LUT_DA_SHIFT,
152 
153         LUT_RR      = 0x1 << LUT_RR_SHIFT,
154         LUT_RG      = 0x1 << LUT_RG_SHIFT,
155         LUT_RB      = 0x1 << LUT_RB_SHIFT,
156         LUT_D0      = 0x1 << LUT_D0_SHIFT,
157         LUT_D1      = 0x1 << LUT_D1_SHIFT,
158         LUT_FR      = 0x1 << LUT_FR_SHIFT,
159         LUT_SP      = 0x1 << LUT_SP_SHIFT,
160         LUT_DA      = 0x1 << LUT_DA_SHIFT
161     };
162 
163     enum ConfigDetail
164     {
165         CONFIG_DETAIL0        = LUT_RR | LUT_D0 | LUT_SP | LUT_DA,
166         CONFIG_DETAIL1        = LUT_RR | LUT_FR | LUT_SP | LUT_DA,
167         CONFIG_DETAIL2        = LUT_RR | LUT_D0 | LUT_D1 | LUT_DA,
168         CONFIG_DETAIL3        = LUT_D0 | LUT_D1 | LUT_SP | LUT_DA,
169         CONFIG_DETAIL4        = LUT_RR | LUT_RG | LUT_RB | LUT_D0 | LUT_D1 | LUT_SP | LUT_DA,
170         CONFIG_DETAIL5        = LUT_RR | LUT_RG | LUT_RB | LUT_D0 | LUT_FR | LUT_SP | LUT_DA,
171         CONFIG_DETAIL6        = LUT_RR | LUT_D0 | LUT_D1 | LUT_FR | LUT_SP | LUT_DA,
172         CONFIG_DETAIL7        = LUT_RR | LUT_RG | LUT_RB | LUT_D0 | LUT_D1 | LUT_FR | LUT_SP | LUT_DA,
173     #ifdef NW_TARGET_CTR_GL_FINAL
174         CONFIG_DETAIL8        = LUT_RR | LUT_D1 | LUT_SP | LUT_DA,
175         CONFIG_DETAIL9        = LUT_D0 | LUT_D1 | LUT_SP | LUT_DA,
176         CONFIG_DETAIL10       = LUT_RR | LUT_RG | LUT_RB | LUT_DA
177     #else
178         CONFIG_DETAIL8        = LUT_RR | LUT_RG | LUT_RB | LUT_D0 | LUT_D1 | LUT_FR | LUT_SP | LUT_DA,
179         CONFIG_DETAIL9        = LUT_RR | LUT_RG | LUT_RB | LUT_D0 | LUT_D1 | LUT_FR | LUT_SP | LUT_DA,
180         CONFIG_DETAIL10       = LUT_RR | LUT_RG | LUT_RB | LUT_D0 | LUT_D1 | LUT_FR | LUT_SP | LUT_DA
181     #endif
182     };
183 
184     //TODO: 使用しませんをチェック。
185     //! @brief レイヤーコンフィグです。
186     enum Config
187     {
188         CONFIG_TYPE0        = 0,    //!< レイヤーコンフィグ 0 です。
189         CONFIG_TYPE1        = 1,    //!< レイヤーコンフィグ 1 です。
190         CONFIG_TYPE2        = 2,    //!< レイヤーコンフィグ 2 です。
191         CONFIG_TYPE3        = 3,    //!< レイヤーコンフィグ 3 です。
192         CONFIG_TYPE4        = 4,    //!< レイヤーコンフィグ 4 です。
193         CONFIG_TYPE5        = 5,    //!< レイヤーコンフィグ 5 です。
194         CONFIG_TYPE6        = 6,    //!< レイヤーコンフィグ 6 です。
195         CONFIG_TYPE7        = 8,    //!< レイヤーコンフィグ 7 です。
196     #if defined(NW_TARGET_CTR_GL_FINAL)
197         CONFIG_TYPE8        = 12,   //!< 使用しません。
198         CONFIG_TYPE9        = 13,   //!< 使用しません。
199         CONFIG_TYPE10       = 14    //!< 使用しません。
200     #else
201         CONFIG_TYPE8        = 8,    //!< 使用しません。
202         CONFIG_TYPE9        = 8,    //!< 使用しません。
203         CONFIG_TYPE10       = 8     //!< 使用しません。
204     #endif
205     };
206 
207     //! @brief フレネルの適用先です。
208     enum FresnelConfig
209     {
210         CONFIG_NO_FRESNEL            = 0,   //!< フレネルは使用しません。
211         CONFIG_PRI_ALPHA_FRESNEL     = 1,   //!< フレネルをプライマリに適用します。
212         CONFIG_SEC_ALPHA_FRESNEL     = 2,   //!< フレネルをセカンダリに適用します。
213         CONFIG_PRI_SEC_ALPHA_FRESNEL = 3    //!< フレネルをプライマリとセカンダリの両方に適用します。
214     };
215 
216     //! @brief バンプマッピングの使用方法です。
217     enum BumpMode
218     {
219         BUMPMODE_NOT_USED = 0,  //!< バンプテクスチャを使用しません。
220         BUMPMODE_AS_BUMP  = 1,  //!< バンプマップとして使用します。
221         BUMPMODE_AS_TANG  = 2   //!< タンジェントマップとして使用します。
222     };
223 
224     //! @brief バンプ使用テクスチャです。
225     enum BumpTexture
226     {
227         BUMP_TEXTURE0 = 0,  //!< テクスチャ 0 です。
228         BUMP_TEXTURE1 = 1,  //!< テクスチャ 1 です。
229         BUMP_TEXTURE2 = 2,  //!< テクスチャ 2 です。
230         BUMP_TEXTURE3 = 3   //!< テクスチャ 3 です。
231     };
232 
233     NW_RES_CTOR( ResFragmentLighting )
234 
235 
236     //---------------------------------------------------------------------------
237     //! @fn           void SetLayerConfig(Config value)
238     //! @brief        レイヤーコンフィグを設定します。
239     //---------------------------------------------------------------------------
240     //---------------------------------------------------------------------------
241     //! @fn           void SetFresnelConfig(FresnelConfig value)
242     //! @brief        フレネルファクタを設定します。
243     //---------------------------------------------------------------------------
244     //---------------------------------------------------------------------------
245     //! @fn           void SetFlags(u32 value)
246     //! @brief        フラグの値を設定します。
247     //!               設定されなかったフラグは無効になります。
248     //---------------------------------------------------------------------------
249     //---------------------------------------------------------------------------
250     //! @fn           void EnaleFlags(u32 value)
251     //! @brief        指定された Flag の値を有効にします。
252     //!               設定されなかったフラグは変更されません。
253     //---------------------------------------------------------------------------
254     //---------------------------------------------------------------------------
255     //! @fn           void DisableFlags(u32 value)
256     //! @brief        指定された Flag の値を無効にします。
257     //!               設定されなかったフラグは変更されません。
258     //---------------------------------------------------------------------------
259     //---------------------------------------------------------------------------
260     //! @fn           void SetBumpTextureIndex(BumpTexture value)
261     //! @brief        バンプマッピングを施すテクスチャユニットの番号を設定します。
262     //---------------------------------------------------------------------------
263     //---------------------------------------------------------------------------
264     //! @fn           void SetBumpRenormalize(bool value)
265     //! @brief        バンプベクトルのz成分の再計算の有効化フラグを設定します。
266     //---------------------------------------------------------------------------
267     //---------------------------------------------------------------------------
268     //! @fn           void SetBumpMode(BumpMode value)
269     //! @brief        バンプマッピングのモードを設定します。
270     //---------------------------------------------------------------------------
271     //---------------------------------------------------------------------------
272     //! @fn           bool IsBumpRenormalize() const
273     //! @brief        バンプベクトルのz成分の再計算の有効化フラグを取得します。
274     //---------------------------------------------------------------------------
275     //---------------------------------------------------------------------------
276     //! @fn           Config GetLayerConfig() const
277     //! @brief        レイヤーコンフィグを取得します。
278     //---------------------------------------------------------------------------
279     //---------------------------------------------------------------------------
280     //! @fn           FresnelConfig GetFresnelConfig() const
281     //! @brief        フレネルファクタを取得します。
282     //---------------------------------------------------------------------------
283     //---------------------------------------------------------------------------
284     //! @fn           u32 GetFlags() const
285     //! @brief        フラグの値を取得します。
286     //---------------------------------------------------------------------------
287     //---------------------------------------------------------------------------
288     //! @fn           BumpTexture GetBumpTextureIndex() const
289     //! @brief        バンプマッピングを施すテクスチャユニットの番号を取得します。
290     //---------------------------------------------------------------------------
291     //---------------------------------------------------------------------------
292     //! @fn           BumpMode GetBumpMode() const
293     //! @brief        バンプマッピングのモードを取得します。
294     //---------------------------------------------------------------------------
NW_RES_FIELD_FLAGS_DECL(u32,Flags)295     NW_RES_FIELD_FLAGS_DECL( u32, Flags )                           // GetFlags(), SetFlags(), EnableFlags(), DisableFlags()
296     NW_RES_FIELD_PRIMITIVE_DECL( Config, LayerConfig )              // GetLayerConfig(), SetLayerConfig()
297     NW_RES_FIELD_PRIMITIVE_DECL( FresnelConfig, FresnelConfig )     // GetFresnelConfig(), SetFresnelConfig()
298     NW_RES_FIELD_PRIMITIVE_DECL( BumpTexture, BumpTextureIndex )    // GetBumpTextureIndex(), SetBumpTextureIndex()
299     NW_RES_FIELD_PRIMITIVE_DECL( BumpMode, BumpMode )               // GetBumpMode(), SetBumpMode()
300     NW_RES_FIELD_BOOL_PRIMITIVE_DECL( BumpRenormalize )             // IsBumpRenomalize(), SetBumpRenomalize()
301 
302     //---------------------------------------------------------------------------
303     //! @brief        リフレクションファクタが有効化どうかを返します。
304     //!
305     //! @return       リフレクションファクタが有効な場合には true を返します。
306     //---------------------------------------------------------------------------
307     bool IsReflectionEnabled() const { return ut::CheckFlag(GetFlags(), ResFragmentLightingData::FLAG_REFLECTION_ENABLED); }
308 
309     //! @brief LayerConfig から参照テーブル割り当てのフラグを取得します。
310     //!
311     //! @param[in] config
312     //!
313     //! @return 参照テーブルの割り当てフラグです。
ToConfigDetail(Config config)314     static NW_INLINE ConfigDetail ToConfigDetail( Config config )
315     {
316         s32 configNumber = static_cast<s32>(config) - static_cast<s32>(CONFIG_TYPE0);
317         static const ConfigDetail configDetailTable[] =
318         {
319             CONFIG_DETAIL0,
320             CONFIG_DETAIL1,
321             CONFIG_DETAIL2,
322             CONFIG_DETAIL3,
323             CONFIG_DETAIL4,
324             CONFIG_DETAIL5,
325             CONFIG_DETAIL6,
326             CONFIG_DETAIL7,
327             CONFIG_DETAIL8,
328             CONFIG_DETAIL9,
329             CONFIG_DETAIL10
330         };
331 
332         return configDetailTable[configNumber];
333     }
334 };
335 
336 //--------------------------------------------------------------------------
337 //! @brief  ライティング用ルックアップテーブルを表すバイナリリソースクラスです。
338 //---------------------------------------------------------------------------
339 class ResLightingLookupTable : public nw::ut::ResCommon<ResLightingLookupTableData>
340 {
341 public:
342     enum { SIGNATURE = NW_RES_SIGNATURE32('LLUT') };
343 
344     //---------------------------------------------------------------------------
345     //! @brief        ルックアップテーブルの入力値の定義です。
346     //---------------------------------------------------------------------------
347     enum Input
348     {
349         INPUT_NH, //!< 法線とハーフベクトルのなす角のコサイン値。
350         INPUT_VH, //!< 視線ベクトルとハーフベクトルのなす角のコサイン値。
351         INPUT_NV, //!< 法線と視線ベクトルのなす角のコサイン値。
352         INPUT_LN, //!< ライトベクトルの法線のなす角のコサイン値。
353         INPUT_SP, //!< ライトベクトルとスポット方向ベクトルのなす角のコサイン値。
354         INPUT_CP, //!< ハーフベクトルの接平面投影ベクトルと接線ベクトルのなす角のコサイン値。
355         INPUT_NUM //!< enum の最大値。
356     };
357 
358     NW_RES_CTOR( ResLightingLookupTable )
359 
360     //---------------------------------------------------------------------------
361     //! @fn           void SetInput(Input value)
362     //! @brief        ルックアップテーブルの入力設定を設定します。
363     //---------------------------------------------------------------------------
364     //---------------------------------------------------------------------------
365     //! @fn           Input GetInput() const
366     //! @brief        ルックアップテーブルの入力設定を取得します。
367     //---------------------------------------------------------------------------
368     NW_RES_FIELD_PRIMITIVE_DECL( Input, Input ) // GetInput(), SetInput()
369 
370     //---------------------------------------------------------------------------
371     //! @brief        ルックアップテーブルのスケール値の定義です。
372     //---------------------------------------------------------------------------
373     enum Scale
374     {
375         SCALE_1 = 0,    //!< 1.0 倍。
376         SCALE_2 = 1,    //!< 2.0 倍。
377         SCALE_4 = 2,    //!< 4.0 倍。
378         SCALE_8 = 3,    //!< 8.0 倍。
379         SCALE_0_25 = 6, //!< 0.25 倍。
380         SCALE_0_5 = 7,  //!< 0.5 倍。
381         SCALE_MAX = 8   //!< enum の最大値。
382     };
383 
384     //---------------------------------------------------------------------------
385     //! @fn           void SetScale(Scale value)
386     //! @brief        ルックアップテーブルのスケール設定を設定します。
387     //---------------------------------------------------------------------------
388     //---------------------------------------------------------------------------
389     //! @fn           Scale GetScale() const
390     //! @brief        ルックアップテーブルのスケール設定を取得します。
391     //---------------------------------------------------------------------------
NW_RES_FIELD_PRIMITIVE_DECL(Scale,Scale)392     NW_RES_FIELD_PRIMITIVE_DECL( Scale, Scale )   // GetScale(), SetScale()
393 
394     //---------------------------------------------------------------------------
395     //! @brief        スケール値を float で取得します。
396     //!
397     //! @return       スケール値です。
398     //---------------------------------------------------------------------------
399     f32 GetScaleF32() const
400     {
401         const f32 TABLE[] =
402         {
403             1.0f, 2.0f, 4.0f, 8.0f, 0.0f, 0.0f, 0.25f, 0.5f
404         };
405 
406         return TABLE[ref().m_Scale];
407     }
408 
409     //---------------------------------------------------------------------------
410     //! @brief        スケール値を float で設定します。
411     //!
412     //!               scale には 1.0f, 2.0f, 4.0f, 8.0f, 0.25f, 0.5f のいずれかを指定します。
413     //!
414     //! @param[in]    scale   スケール値です。
415     //---------------------------------------------------------------------------
SetScaleF32(f32 scale)416     void SetScaleF32(f32 scale)
417     {
418         if (scale == 1.0f)       { ref().m_Scale = SCALE_1; }
419         else if (scale == 2.0f)  { ref().m_Scale = SCALE_2; }
420         else if (scale == 4.0f)  { ref().m_Scale = SCALE_4; }
421         else if (scale == 8.0f)  { ref().m_Scale = SCALE_8; }
422         else if (scale == 0.25f) { ref().m_Scale = SCALE_0_25; }
423         else if (scale == 0.5f)  { ref().m_Scale = SCALE_0_5; }
424         else { NW_FATAL_ERROR("Illegal scale value"); }
425     }
426 
427     //---------------------------------------------------------------------------
428     //! @fn           ResLookupTable GetSampler()
429     //! @brief        ルックアップテーブルを取得します。
430     //---------------------------------------------------------------------------
NW_RES_FIELD_CLASS_DECL(ResLookupTable,Sampler)431     NW_RES_FIELD_CLASS_DECL( ResLookupTable, Sampler ) // GetSampler()
432 
433     //---------------------------------------------------------------------------
434     //! @brief        参照テーブルへアクセスするための入力値の絶対値化がされているかを取得します。
435     //!
436     //! @return       入力値を絶対値として扱う場合には、true を返します。
437     //---------------------------------------------------------------------------
438     bool IsAbs() const
439     {
440         return this->GetSampler().Dereference().IsAbs();
441     }
442 
443     //---------------------------------------------------------------------------
444     //! @brief        リソースの後始末をおこないます。
445     //---------------------------------------------------------------------------
Cleanup()446     void Cleanup()
447     {
448         NW_ASSERT( IsValid() );
449         ut::SafeCleanup(this->GetSampler());
450     }
451 
452     //---------------------------------------------------------------------------
453     //! @brief        参照テーブルを設定します。
454     //!               参照先に設定しますのでリソースの解放はされません。
455     //!
456     //! @param[in]    参照テーブルです。
457     //---------------------------------------------------------------------------
SetSampler(ResLookupTable lookupTable)458     void SetSampler(ResLookupTable lookupTable)
459     {
460         NW_ASSERT(lookupTable.IsValid());
461         ResImageLookupTable resImageLookupTable = lookupTable.Dereference();
462         ResReferenceLookupTable referenceLut = ResStaticCast<ResReferenceLookupTable>(GetSampler());
463         referenceLut.ref().toTargetLut.set_ptr(resImageLookupTable.ptr());
464     }
465 };
466 
467 //--------------------------------------------------------------------------
468 //! @brief  フラグメントライティングテーブルを表すバイナリリソースクラスです。
469 //---------------------------------------------------------------------------
470 class ResFragmentLightingTable : public nw::ut::ResCommon< ResFragmentLightingTableData >
471 {
472 public:
473     NW_RES_CTOR( ResFragmentLightingTable )
474 
475     //---------------------------------------------------------------------------
476     //! @fn           ResLightingLookupTable GetReflectanceRSampler()
477     //! @brief        リフレクションのR成分の参照テーブルを取得します。
478     //---------------------------------------------------------------------------
479     //---------------------------------------------------------------------------
480     //! @fn           ResLightingLookupTable GetReflectanceGSampler()
481     //! @brief        リフレクションのG成分の参照テーブルを取得します。
482     //---------------------------------------------------------------------------
483     //---------------------------------------------------------------------------
484     //! @fn           ResLightingLookupTable GetReflectanceBSampler()
485     //! @brief        リフレクションのB成分の参照テーブルを取得します。
486     //---------------------------------------------------------------------------
487     //---------------------------------------------------------------------------
488     //! @fn           ResLightingLookupTable GetFresnelSampler()
489     //! @brief        フレネルファクタの参照テーブルを取得します。
490     //---------------------------------------------------------------------------
491     //---------------------------------------------------------------------------
492     //! @fn           ResLightingLookupTable GetDistribution1Sampler()
493     //! @brief        ディストリビューション1の参照テーブルを取得します。
494     //---------------------------------------------------------------------------
495     //---------------------------------------------------------------------------
496     //! @fn           ResLightingLookupTable GetDistribution0Sampler()
497     //! @brief        ディストリビューション0の参照テーブルを取得します。
498     //---------------------------------------------------------------------------
499     NW_RES_FIELD_CLASS_DECL( ResLightingLookupTable, ReflectanceRSampler )  // GetReflectanceRSampler()
500     NW_RES_FIELD_CLASS_DECL( ResLightingLookupTable, ReflectanceGSampler )  // GetReflectanceGSampler()
501     NW_RES_FIELD_CLASS_DECL( ResLightingLookupTable, ReflectanceBSampler )  // GetReflectanceBSampler()
502     NW_RES_FIELD_CLASS_DECL( ResLightingLookupTable, Distribution0Sampler ) // GetDistribution0Sampler()
503     NW_RES_FIELD_CLASS_DECL( ResLightingLookupTable, Distribution1Sampler ) // GetDistribution1Sampler()
504     NW_RES_FIELD_CLASS_DECL( ResLightingLookupTable, FresnelSampler )       // GetFresnelSampler()
505 
506     //---------------------------------------------------------------------------
507     //! @brief        リソースの初期化処理をおこないます。
508     //!
509     //! @param[in]    allocator アロケータです。
510     //! @param[in]    graphicsFile グラフィックスリソースです。
511     //---------------------------------------------------------------------------
512     Result Setup(os::IAllocator* allocator, ResGraphicsFile graphicsFile);
513 
514     //---------------------------------------------------------------------------
515     //! @brief        リソースの後始末をおこないます。
516     //---------------------------------------------------------------------------
517     void Cleanup();
518 };
519 
520 //--------------------------------------------------------------------------
521 //! @brief  テクスチャコンバイナのソースを表すバイナリリソースクラスです。
522 //---------------------------------------------------------------------------
523 class ResTextureCombinerSource : public nw::ut::ResCommon< ResTextureCombinerSourceData >
524 {
525 public:
526 
527     // TODO: チェック GL_PRIMARY_COLOR
528     //! @brief ソースを表します。
529     enum Kind
530     {
531         KIND_TEXTURE0                     = GL_TEXTURE0,                    //!< テクスチャ 0 です。
532         KIND_TEXTURE1                     = GL_TEXTURE1,                    //!< テクスチャ 1 です。
533         KIND_TEXTURE2                     = GL_TEXTURE2,                    //!< テクスチャ 2 です。
534         KIND_TEXTURE3                     = GL_TEXTURE3,                    //!< テクスチャ 3 です。
535         KIND_CONSTANT                     = GL_CONSTANT,                    //!< コンスタントカラーです。
536         KIND_PRIMARY_COLOR                = GL_PRIMARY_COLOR,               //!< 頂点シェーダーの出力結果です。
537         KIND_PREVIOUS                     = GL_PREVIOUS,                    //!< 前段の出力結果です。
538         KIND_FRAGMENT_PRIMARY_COLOR_DMP   = GL_FRAGMENT_PRIMARY_COLOR_DMP,  //!< プライマリカラーです。
539         KIND_FRAGMENT_SECONDARY_COLOR_DMP = GL_FRAGMENT_SECONDARY_COLOR_DMP //!< セカンダリカラーです。
540     };
541 
542     NW_RES_CTOR( ResTextureCombinerSource )
543 
544     //---------------------------------------------------------------------------
545     //! @fn           void SetSources(int idx, u32 value)
546     //! @brief        テクスチャコンバイナのソースセットのリストに要素を設定します。
547     //---------------------------------------------------------------------------
548     //---------------------------------------------------------------------------
549     //! @fn           s32 GetSourcesCount() const
550     //! @brief        テクスチャコンバイナのソースセットの要素数を取得します。
551     //---------------------------------------------------------------------------
552     //---------------------------------------------------------------------------
553     //! @fn           u32 GetSources(int idx) const
554     //! @brief        テクスチャコンバイナのソースセットを取得します。
555     //---------------------------------------------------------------------------
556     NW_RES_FIELD_PRIMITIVE_FIXED_LIST_DECL( u32, Sources )  // GetSourcesCount(), GetSources(int), GetSources(), SetSources(int,u32)
557 };
558 
559 //--------------------------------------------------------------------------
560 //! @brief  テクスチャコンバイナのオペランドを表すバイナリリソースクラスです。
561 //---------------------------------------------------------------------------
562 class ResTextureCombinerOperand : public nw::ut::ResCommon< ResTextureCombinerOperandData >
563 {
564 public:
565 
566     //! @brief オペランドです。
567     enum Kind
568     {
569         KIND_SRC_COLOR           = GL_SRC_COLOR,            //!< RGB です。
570         KIND_ONE_MINUS_SRC_COLOR = GL_ONE_MINUS_SRC_COLOR,  //!< 1 - RGB です。
571         KIND_SRC_ALPHA           = GL_SRC_ALPHA,            //!< アルファです。
572         KIND_ONE_MINUS_SRC_ALPHA = GL_ONE_MINUS_SRC_ALPHA,  //!< 1 - アルファです。
573 
574     #ifdef NW_TARGET_CTR_GL_FINAL
575         KIND_SRC_R               = GL_SRC_R_DMP,            //!< R 成分です。
576         KIND_SRC_G               = GL_SRC_G_DMP,            //!< G 成分です。
577         KIND_SRC_B               = GL_SRC_B_DMP,            //!< B 成分です。
578         KIND_ONE_MINUS_SRC_R     = GL_ONE_MINUS_SRC_R_DMP,  //!< 1 - R 成分です。
579         KIND_ONE_MINUS_SRC_G     = GL_ONE_MINUS_SRC_G_DMP,  //!< 1 - G 成分です。
580         KIND_ONE_MINUS_SRC_B     = GL_ONE_MINUS_SRC_B_DMP   //!< 1 - B 成分です。
581     #else
582         KIND_SRC_R               = GL_SRC_COLOR,
583         KIND_SRC_G               = GL_SRC_COLOR,
584         KIND_SRC_B               = GL_SRC_COLOR,
585         KIND_ONE_MINUS_SRC_R     = GL_ONE_MINUS_SRC_COLOR,
586         KIND_ONE_MINUS_SRC_G     = GL_ONE_MINUS_SRC_COLOR,
587         KIND_ONE_MINUS_SRC_B     = GL_ONE_MINUS_SRC_COLOR
588     #endif
589     };
590 
591     NW_RES_CTOR( ResTextureCombinerOperand )
592 
593     //---------------------------------------------------------------------------
594     //! @fn           void SetOperands(int idx, u32 value)
595     //! @brief        テクスチャコンバイナのオペランドセットのリストに要素を設定します。
596     //---------------------------------------------------------------------------
597     //---------------------------------------------------------------------------
598     //! @fn           s32 GetOperandsCount() const
599     //! @brief        テクスチャコンバイナのオペランドセットの要素数を取得します。
600     //---------------------------------------------------------------------------
601     //---------------------------------------------------------------------------
602     //! @fn           u32 GetOperands(int idx) const
603     //! @brief        テクスチャコンバイナのオペランドセットを取得します。
604     //---------------------------------------------------------------------------
605     NW_RES_FIELD_PRIMITIVE_FIXED_LIST_DECL( u32, Operands ) // GetOperandsCount(), GetOperands(int), GetOperands(), SetOperands(int,u32)
606 };
607 
608 
609 //--------------------------------------------------------------------------
610 //! @brief  アルファテストを表すバイナリリソースクラスです。
611 //---------------------------------------------------------------------------
612 class ResAlphaTest : public nw::ut::ResCommon< ResAlphaTestData >
613 {
614 public:
615 
616     NW_RES_CTOR( ResAlphaTest )
617 
618     //! @brief アルファテストの比較関数です。
619     enum TestFunc
620     {
621         TESTFUNC_NEVER      = 0,    //!< すべて不通過です。
622         TESTFUNC_ALWAYS     = 1,    //!< すべて通過です。
623         TESTFUNC_EQUAL      = 2,    //!< 参照値と等しければ通過します。
624         TESTFUNC_NOTEQUAL   = 3,    //!< 参照値と等しくなければ通過します。
625         TESTFUNC_LESS       = 4,    //!< 参照値より小さければ通過します。
626         TESTFUNC_LEQUAL     = 5,    //!< 参照値以下であれば通過します。
627         TESTFUNC_GREATER    = 6,    //!< 参照値より大きければ通過します。
628         TESTFUNC_GEQUAL     = 7     //!< 参照値以上であれば通過します。
629     };
630 
631     //---------------------------------------------------------------------------
632     //! @brief        アルファテストが有効化かどうかを取得します。
633     //!
634     //! @return       アルファテストが有効な場合には、true を返します。
635     //---------------------------------------------------------------------------
IsTestEnabled()636     bool IsTestEnabled() const
637     {
638         enum { CMD_SHIFT = 0, CMD_MASK = 0x1 };
639 
640         return internal::GetCmdValue( ref().m_CommandBuffer[0], CMD_MASK, CMD_SHIFT ) ? true : false;
641     }
642 
643     //---------------------------------------------------------------------------
644     //! @brief        アルファテストの有効フラグを設定します。
645     //!
646     //! @param[in]    value   アルファテストを有効にする場合は true、無効にする場合は false を設定します。
647     //---------------------------------------------------------------------------
SetTestEnabled(bool value)648     void SetTestEnabled(bool value)
649     {
650         enum { CMD_SHIFT = 0, CMD_MASK = 0x1 };
651 
652         internal::SetCmdValue( &ref().m_CommandBuffer[0], value, CMD_MASK, CMD_SHIFT );
653     }
654 
655     //---------------------------------------------------------------------------
656     //! @brief        アルファテストに用いる比較関数を取得します。
657     //!
658     //! @return       アルファテストの比較関数の設定値です。
659     //---------------------------------------------------------------------------
GetTestFunc()660     TestFunc GetTestFunc() const
661     {
662         enum { CMD_SHIFT = 4, CMD_MASK = 0x7 };
663 
664         return (TestFunc)internal::GetCmdValue( ref().m_CommandBuffer[0], CMD_MASK, CMD_SHIFT );
665     }
666 
667     //---------------------------------------------------------------------------
668     //! @brief        アルファテストに用いる比較関数を設定します。
669     //!
670     //! @param[in]    value   アルファテストの比較関数です。
671     //---------------------------------------------------------------------------
SetTestFunc(TestFunc value)672     void SetTestFunc(TestFunc value)
673     {
674         enum { CMD_SHIFT = 4, CMD_MASK = 0x7 };
675 
676         internal::SetCmdValue( &ref().m_CommandBuffer[0], value, CMD_MASK, CMD_SHIFT );
677     }
678 
679     //---------------------------------------------------------------------------
680     //! @brief        アルファテストに用いる参照値を取得します。
681     //!
682     //! @return       アルファテストに用いる参照値です。
683     //---------------------------------------------------------------------------
GetTestReference()684     f32 GetTestReference() const
685     {
686         enum { CMD_SHIFT = 8, CMD_MASK = 0xff };
687 
688         return static_cast<f32>(internal::GetCmdValue( ref().m_CommandBuffer[0], CMD_MASK, CMD_SHIFT )) / 255.0f;
689     }
690 
691     //---------------------------------------------------------------------------
692     //! @brief        アルファテストに用いる参照値を設定します。
693     //!
694     //! @param[in]    value   アルファテストに用いる参照値です。
695     //---------------------------------------------------------------------------
SetTestReference(f32 value)696     void SetTestReference(f32 value)
697     {
698         enum { CMD_SHIFT = 8, CMD_MASK = 0xff };
699 
700         internal::SetCmdValue( &ref().m_CommandBuffer[0], (0.5f + (value * 255.0f)), CMD_MASK, CMD_SHIFT );
701     }
702 
703     //---------------------------------------------------------------------------
704     //! @fn           u32 * GetCommandBuffer()
705     //! @brief        コマンドバッファへのポインタを取得します。
706     //---------------------------------------------------------------------------
707     NW_RES_FIELD_COMMAND_BUFFER()
708 };
709 
710 
711 //--------------------------------------------------------------------------
712 //! @brief  テクスチャコンバイナのソースを表すバイナリリソースクラスです。
713 //---------------------------------------------------------------------------
714 class ResTextureCombiner : public nw::ut::ResCommon< ResTextureCombinerData >
715 {
716 public:
717     //---------------------------------------------------------------------------
718     //! @brief        テクスチャコンバイナのコンスタント値の定義です。
719     //---------------------------------------------------------------------------
720     enum Constant
721     {
722         CONSTANT0, //!< コンスタント0 の設定を使用します。
723         CONSTANT1, //!< コンスタント1 の設定を使用します。
724         CONSTANT2, //!< コンスタント2 の設定を使用します。
725         CONSTANT3, //!< コンスタント3 の設定を使用します。
726         CONSTANT4, //!< コンスタント4 の設定を使用します。
727         CONSTANT5, //!< コンスタント5 の設定を使用します。
728         EMISSION,  //!< マテリアルのエミッションカラーの設定を使用します。
729         AMBIENT,   //!< マテリアルのアンビエントカラーの設定を使用します。
730         DIFFUSE,   //!< マテリアルのディフューズカラーの設定を使用します。
731         SPECULAR0, //!< マテリアルのスペキュラーカラー 0 の設定を使用します。
732         SPECULAR1  //!< マテリアルのスペキュラーカラー 1 の設定を使用します。
733     };
734 
735     NW_RES_CTOR( ResTextureCombiner )
736 
737     //---------------------------------------------------------------------------
738     //! @fn           void SetConstant(Constant value)
739     //! @brief        テクスチャコンバイナの定数設定を設定します。
740     //---------------------------------------------------------------------------
741     //---------------------------------------------------------------------------
742     //! @fn           Constant GetConstant() const
743     //! @brief        テクスチャコンバイナの定数設定を取得します。
744     //---------------------------------------------------------------------------
745     NW_RES_FIELD_PRIMITIVE_DECL( Constant, Constant ) // GetConstant(), SetConstant()
746 
747     //---------------------------------------------------------------------------
748     //! @fn           u32 * GetCommandBuffer()
749     //! @brief        コマンドバッファへのポインタを取得します。
750     //---------------------------------------------------------------------------
751     NW_RES_FIELD_COMMAND_BUFFER();
752 
753     //---------------------------------------------------------------------------
754     //! @brief        コンスタントカラーの設定コマンドを u32 の rgba 値として設定します。
755     //!
756     //! @param[in]    rgba    コンスタントカラーの RGBA 32bit 表現です。
757     //---------------------------------------------------------------------------
SetConstantCmd(u32 rgba)758     void SetConstantCmd(u32 rgba) { ref().m_CmdConstant = rgba; }
759 
760     //---------------------------------------------------------------------------
761     //! @brief        テクスチャコンバイナのソース設定の定義です。
762     //---------------------------------------------------------------------------
763     typedef enum
764     {
765         SOURCE_PRIMARY_COLOR = 0,           //!< 頂点シェーダーの出力結果です。
766         SOURCE_FRAGMENT_PRIMARY_COLOR,      //!< プライマリカラーです。
767         SOURCE_FRAGMENT_SECONDARY_COLOR,    //!< セカンダリカラーです。
768         SOURCE_TEXTURE0,                    //!< テクスチャ 0 です。
769         SOURCE_TEXTURE1,                    //!< テクスチャ 1 です。
770         SOURCE_TEXTURE2,                    //!< テクスチャ 2 です。
771         SOURCE_TEXTURE3,                    //!< テクスチャ 3 です。
772         SOURCE_CONSTANT = 0xE,              //!< コンスタントカラーです。
773         SOURCE_PREVIOUS = 0xF,              //!< 前段の出力結果です。
774         SOURCE_PREVIOUS_BUFFER = 0xD        //!< 前段のバッファです。
775     } Source;
776 
777     //---------------------------------------------------------------------------
778     //! @brief        テクスチャコンバイナの RGB オペランド設定の定義です。
779     //---------------------------------------------------------------------------
780     typedef enum
781     {
782         OPERANDRGB_SRC_COLOR = 0,               //!< RGB です。
783         OPERANDRGB_ONE_MINUS_SRC_COLOR = 0x1,   //!< 1 - RGB です。
784         OPERANDRGB_SRC_ALPHA = 0x2,             //!< アルファです。
785         OPERANDRGB_ONE_MINUS_SRC_ALPHA = 0x3,   //!< 1 - アルファです。
786 
787         OPERANDRGB_RED = 0x4,                   //!< R 成分です。
788         OPERANDRGB_ONE_MINUS_RED   = 0x5,       //!< 1 - R 成分です。
789         OPERANDRGB_GREEN = 0x8,                 //!< G 成分です。
790         OPERANDRGB_ONE_MINUS_GREEN = 0x9,       //!< 1 - G 成分です。
791         OPERANDRGB_BLUE = 0xC,                  //!< B 成分です。
792         OPERANDRGB_ONE_MINUS_BLUE  = 0xD        //!< 1 - B 成分です。
793     } OperandRgb;
794 
795     //---------------------------------------------------------------------------
796     //! @brief        テクスチャコンバイナの Alpha オペランド設定の定義です。
797     //---------------------------------------------------------------------------
798     typedef enum
799     {
800         OPERANDALPHA_SRC_ALPHA = 0,             //!< アルファです。
801         OPERANDALPHA_SRC_ONE_MINUS_ALPHA = 0x1, //!< 1 - アルファです。
802 
803         OPERANDALPHA_RED = 0x2,                 //!< R 成分です。
804         OPERANDALPHA_ONE_MINUS_RED = 0x3,       //!< 1 - R 成分です。
805         OPERANDALPHA_GREEN = 0x4,               //!< G 成分です。
806         OPERANDALPHA_ONE_MINUS_GREEN = 0x5,     //!< 1 - G 成分です。
807         OPERANDALPHA_BLUE = 0x6,                //!< B 成分です。
808         OPERANDALPHA_ONE_MINUS_BLUE = 0x7       //!< 1 - B 成分です。
809 
810     } OperandAlpha;
811 
812     //---------------------------------------------------------------------------
813     //! @brief        テクスチャコンバイナの コンバイナ関数の定義です。
814     //!
815     //!         A はソース 0 、B はソース 1 、C はソース 2 をそれぞれ表します。
816     //---------------------------------------------------------------------------
817     typedef enum
818     {
819         COMBINE_REPLACE = 0,    //!< A です
820         COMBINE_MODULATE,       //!< A * B です。
821         COMBINE_ADD,            //!< A + B です。
822         COMBINE_ADDSIGNED,      //!< A + B - 0.5 です。
823         COMBINE_INTERPOLATE,    //!< A * C + B * ( 1 - C ) です。
824         COMBINE_SUBTRACT,       //!< A - B です。
825         COMBINE_DOT3_RGB,       //!< RGB ← Dot ( A , B ) です。
826         COMBINE_DOT3_RGBA,      //!< RGBA ← Dot ( A , B ) です。
827         COMBINE_MULT_ADD,       //!< ( A * B ) + C です。
828         COMBINE_ADD_MULT        //!< ( A + B ) * C です。
829     } Combine;
830 
831     //---------------------------------------------------------------------------
832     //! @brief        テクスチャコンバイナの スケール設定の定義です。
833     //---------------------------------------------------------------------------
834     typedef enum
835     {
836         SCALE_ONE = 0, //!< 1.0 倍。
837         SCALE_TWO,     //!< 2.0 倍。
838         SCALE_FOUR     //!< 4.0 倍。
839     } Scale;
840 
841     //---------------------------------------------------------------------------
842     //! @brief        RGB 値のソースを取得します。
843     //!
844     //! @param[in]    index   取得するソースのインデクスです。
845     //!
846     //! @return       ソースの設定です。
847     //---------------------------------------------------------------------------
848     //! @brief      カラーのソースを取得します。
849     //!
850     //! @param[in]  index
851     //!
852     //! @return     ソースを返します。
GetSourceRgb(s32 index)853     Source GetSourceRgb(s32 index) const
854     {
855         NW_MINMAX_ASSERT( index, 0, 2 );
856         enum { CMD_WIDTH = 4, CMD_MASK = 0xF };
857 
858         return (Source)internal::GetCmdValue( ref().m_CmdSource, CMD_MASK, CMD_WIDTH * index );
859     }
860 
861     //---------------------------------------------------------------------------
862     //! @brief        RGB 値のソースを設定します。
863     //!
864     //! @param[in]    index   設定するソースのインデクスです。
865     //! @param[in]    value   ソースの設定値です。
866     //---------------------------------------------------------------------------
SetSourceRgb(s32 index,Source value)867     void SetSourceRgb(s32 index, Source value)
868     {
869         NW_MINMAX_ASSERT( index, 0, 2 );
870 
871         enum { CMD_WIDTH = 4, CMD_MASK = 0xF };
872 
873         internal::SetCmdValue( &ref().m_CmdSource, value, CMD_MASK, CMD_WIDTH * index );
874     }
875 
876     //---------------------------------------------------------------------------
877     //! @brief        Alpha 値のソースを取得します。
878     //!
879     //! @param[in]    index   取得するソースのインデクスです。
880     //!
881     //! @return       ソースの設定です。
882     //---------------------------------------------------------------------------
GetSourceAlpha(s32 index)883     Source GetSourceAlpha(s32 index) const
884     {
885         NW_MINMAX_ASSERT( index, 0, 2 );
886 
887         enum { CMD_SHIFT = 16, CMD_WIDTH = 4, CMD_MASK = 0xF };
888 
889         return (Source)internal::GetCmdValue( ref().m_CmdSource, CMD_MASK, CMD_WIDTH * index + CMD_SHIFT );
890     }
891 
892     //---------------------------------------------------------------------------
893     //! @brief        Alpha 値のソースを設定します。
894     //!
895     //! @param[in]    index   設定するソースのインデクスです。
896     //! @param[in]    value   ソースの設定値です。
897     //---------------------------------------------------------------------------
SetSourceAlpha(s32 index,Source value)898     void SetSourceAlpha(s32 index, Source value)
899     {
900         NW_MINMAX_ASSERT( index, 0, 2 );
901 
902         enum { CMD_SHIFT = 16, CMD_WIDTH = 4, CMD_MASK = 0xF };
903 
904         internal::SetCmdValue( &ref().m_CmdSource, value, CMD_MASK, CMD_WIDTH * index + CMD_SHIFT );
905     }
906 
907     //---------------------------------------------------------------------------
908     //! @brief        RGB 値のオペランドを取得します。
909     //!
910     //! @param[in]    index   取得するオペランドのインデクスです。
911     //!
912     //! @return       オペランドの設定です。
913     //---------------------------------------------------------------------------
914     //! @brief      カラーのオペランドを取得します。
915     //!
916     //! @param[in]  index
917     //!
918     //! @return     オペランドを返します。
GetOperandRgb(s32 index)919     OperandRgb GetOperandRgb(s32 index) const
920     {
921         NW_MINMAX_ASSERT( index, 0, 2 );
922         enum { CMD_WIDTH = 4, CMD_MASK = 0xF };
923 
924         return (OperandRgb)internal::GetCmdValue( ref().m_CmdOperand, CMD_MASK, CMD_WIDTH * index );
925     }
926 
927     //---------------------------------------------------------------------------
928     //! @brief        RGB 値のオペランドを設定します。
929     //!
930     //! @param[in]    index   設定するオペランドのインデクスです。
931     //! @param[in]    value   オペランドの設定値です。
932     //---------------------------------------------------------------------------
SetOperandRgb(s32 index,OperandRgb value)933     void SetOperandRgb(s32 index, OperandRgb value)
934     {
935         NW_MINMAX_ASSERT( index, 0, 2 );
936 
937         enum { CMD_WIDTH = 4, CMD_MASK = 0xF };
938 
939         internal::SetCmdValue( &ref().m_CmdOperand, value, CMD_MASK, CMD_WIDTH * index );
940     }
941 
942     //---------------------------------------------------------------------------
943     //! @brief        Alpha 値のオペランドを取得します。
944     //!
945     //! @param[in]    index   取得するオペランドのインデクスです。
946     //!
947     //! @return       オペランドの設定です。
948     //---------------------------------------------------------------------------
GetOperandAlpha(s32 index)949     OperandAlpha GetOperandAlpha(s32 index) const
950     {
951         NW_MINMAX_ASSERT( index, 0, 2 );
952 
953         enum { CMD_SHIFT = 12, CMD_WIDTH = 4, CMD_MASK = 0xF };
954 
955         return (OperandAlpha)internal::GetCmdValue( ref().m_CmdOperand, CMD_MASK, CMD_WIDTH * index + CMD_SHIFT );
956     }
957 
958     //---------------------------------------------------------------------------
959     //! @brief        Alpha 値のオペランドを設定します。
960     //!
961     //! @param[in]    index   設定するオペランドのインデクスです。
962     //! @param[in]    value   オペランドの設定値です。
963     //---------------------------------------------------------------------------
SetOperandAlpha(s32 index,OperandAlpha value)964     void SetOperandAlpha(s32 index, OperandAlpha value)
965     {
966         NW_MINMAX_ASSERT( index, 0, 2 );
967         enum { CMD_SHIFT = 12, CMD_WIDTH = 4, CMD_MASK = 0xF };
968         internal::SetCmdValue( &ref().m_CmdOperand, value, CMD_MASK, CMD_WIDTH * index + CMD_SHIFT );
969     }
970 
971     //---------------------------------------------------------------------------
972     //! @brief        RGB 値のコンバイナ関数を取得します。
973     //!
974     //! @return       コンバイナ関数を返します。
975     //---------------------------------------------------------------------------
976     //! @brief      カラーの計算式を取得します。
977     //!
978     //! @return     計算式を返します。
GetCombineRgb()979     Combine GetCombineRgb() const
980     {
981         enum { CMD_SHIFT = 0, CMD_MASK = 0xF };
982         return (Combine)internal::GetCmdValue( ref().m_CmdCombine, CMD_MASK, CMD_SHIFT );
983     }
984 
985     //---------------------------------------------------------------------------
986     //! @brief        RGB 値のコンバイナ関数を設定します。
987     //!
988     //! @param[in]    value   設定するコンバイナ関数の値です。
989     //---------------------------------------------------------------------------
SetCombineRgb(Combine value)990     void SetCombineRgb(Combine value)
991     {
992         enum { CMD_SHIFT = 0, CMD_MASK = 0xF };
993         internal::SetCmdValue( &ref().m_CmdCombine, value, CMD_MASK, CMD_SHIFT );
994     }
995 
996     //---------------------------------------------------------------------------
997     //! @brief        Alpha 値のコンバイナ関数を取得します。
998     //!
999     //! @return       コンバイナ関数です。
1000     //---------------------------------------------------------------------------
GetCombineAlpha()1001     Combine GetCombineAlpha() const
1002     {
1003         enum { CMD_SHIFT = 16, CMD_MASK = 0xF };
1004         return (Combine)internal::GetCmdValue( ref().m_CmdCombine, CMD_MASK, CMD_SHIFT );
1005     }
1006 
1007     //---------------------------------------------------------------------------
1008     //! @brief        Alpha 値のコンバイナ関数を設定します。
1009     //!
1010     //! @param[in]    value   設定するコンバイナ関数の値です。
1011     //---------------------------------------------------------------------------
SetCombineAlpha(Combine value)1012     void SetCombineAlpha(Combine value)
1013     {
1014         enum { CMD_SHIFT = 16, CMD_MASK = 0xF };
1015         internal::SetCmdValue( &ref().m_CmdCombine, value, CMD_MASK, CMD_SHIFT );
1016     }
1017 
1018     //---------------------------------------------------------------------------
1019     //! @brief        RGB 値のスケールを取得します。
1020     //!
1021     //! @return       スケールの値です。
1022     //---------------------------------------------------------------------------
1023     //! @brief      カラーのスケールを取得します。
1024     //!
1025     //! @return     スケールを返します。
GetScaleRgb()1026     Scale GetScaleRgb() const
1027     {
1028         enum { CMD_SHIFT = 0, CMD_MASK = 0x3 };
1029         return (Scale)internal::GetCmdValue( ref().m_CmdScale, CMD_MASK, CMD_SHIFT );
1030     }
1031 
1032     //---------------------------------------------------------------------------
1033     //! @brief        RGB 値のスケールを設定します。
1034     //!
1035     //! @param[in]    value   設定するスケールの値です。
1036     //---------------------------------------------------------------------------
SetScaleRgb(Scale value)1037     void SetScaleRgb(Scale value)
1038     {
1039         enum { CMD_SHIFT = 0, CMD_MASK = 0x3 };
1040         internal::SetCmdValue( &ref().m_CmdScale, value, CMD_MASK, CMD_SHIFT );
1041     }
1042 
1043     //---------------------------------------------------------------------------
1044     //! @brief        Alpha 値のスケールを取得します。
1045     //!
1046     //! @return       スケールの値です。
1047     //---------------------------------------------------------------------------
GetScaleAlpha()1048     Scale GetScaleAlpha() const
1049     {
1050         enum { CMD_SHIFT = 16, CMD_MASK = 0x3 };
1051         return (Scale)internal::GetCmdValue( ref().m_CmdScale, CMD_MASK, CMD_SHIFT );
1052     }
1053 
1054     //---------------------------------------------------------------------------
1055     //! @brief        Alpha 値のスケールを設定します。
1056     //!
1057     //! @param[in]    value   設定するスケールの値です。
1058     //---------------------------------------------------------------------------
SetScaleAlpha(Scale value)1059     void SetScaleAlpha(Scale value)
1060     {
1061         enum { CMD_SHIFT = 16, CMD_MASK = 0x3 };
1062         internal::SetCmdValue( &ref().m_CmdScale, value, CMD_MASK, CMD_SHIFT );
1063     }
1064 };
1065 
1066 //--------------------------------------------------------------------------
1067 //! @brief  フラグメントシェーダを表すバイナリリソースクラスです。
1068 //---------------------------------------------------------------------------
1069 class ResFragmentShader : public nw::ut::ResCommon< ResFragmentShaderData >
1070 {
1071 public:
1072     //! @brief バッファのインプットを表します。
1073     enum BufferInput
1074     {
1075         BUFFERINPUT_PREVIOUS_BUFFER  = 0,   //!< 前段のバッファです。
1076         BUFFERINPUT_PREVIOUS = 1            //!< 前段の出力結果です。
1077     };
1078 
1079     NW_RES_CTOR( ResFragmentShader )
1080 
1081     //---------------------------------------------------------------------------
1082     //! @fn           ResTextureCombinerData & GetTextureCombinersData(int idx)
1083     //! @brief        テクスチャコンバイナの設定の配列を取得します。
1084     //---------------------------------------------------------------------------
1085     //---------------------------------------------------------------------------
1086     //! @fn           s32 GetTextureCombinersCount() const
1087     //! @brief        テクスチャコンバイナの設定の要素数を取得します。
1088     //---------------------------------------------------------------------------
1089     //---------------------------------------------------------------------------
1090     //! @fn           ResTextureCombiner GetTextureCombiners(int idx)
1091     //! @brief        テクスチャコンバイナの設定を取得します。
1092     //---------------------------------------------------------------------------
1093     //---------------------------------------------------------------------------
1094     //! @fn           ResFragmentLightingTable GetFragmentLightingTable()
1095     //! @brief        フラグメントライティングテーブルを取得します。
1096     //---------------------------------------------------------------------------
1097     //---------------------------------------------------------------------------
1098     //! @fn           ResFragmentLightingData & GetFragmentLightingData()
1099     //! @brief        フラグメントライティング設定を取得します。
1100     //---------------------------------------------------------------------------
1101     //---------------------------------------------------------------------------
1102     //! @fn           ResFragmentLighting GetFragmentLighting()
1103     //! @brief        フラグメントライティング設定を取得します。
1104     //---------------------------------------------------------------------------
1105     //---------------------------------------------------------------------------
1106     //! @fn           ResAlphaTestData & GetAlphaTestData()
1107     //! @brief        アルファテストの設定を取得します。
1108     //---------------------------------------------------------------------------
1109     //---------------------------------------------------------------------------
1110     //! @fn           ResAlphaTest GetAlphaTest()
1111     //! @brief        アルファテストの設定を取得します。
1112     //---------------------------------------------------------------------------
1113     NW_RES_FIELD_RESSTRUCT_DECL( ResFragmentLighting, FragmentLighting ) // GetFragmentLighting(), GetFragmentLightingData()
1114     NW_RES_FIELD_CLASS_DECL( ResFragmentLightingTable, FragmentLightingTable ) // GetFragmentLightingTable()
1115     NW_RES_FIELD_STRUCT_FIXED_LIST_DECL( ResTextureCombiner, TextureCombiners ) // GetTextureCombinersCount(), GetTextureCombiners(idx)
1116     NW_RES_FIELD_RESSTRUCT_DECL( ResAlphaTest, AlphaTest )                   // GetAlphaTest(), GetAlphaTestData()
1117 
1118     //---------------------------------------------------------------------------
1119     //! @brief        リソースの初期化処理をおこないます。
1120     //!
1121     //! @param[in]    allocator アロケータです。
1122     //! @param[in]    graphicsFile グラフィックスリソースです。
1123     //---------------------------------------------------------------------------
1124     Result Setup(os::IAllocator* allocator, ResGraphicsFile graphicsFile);
1125 
1126     //---------------------------------------------------------------------------
1127     //! @brief        リソースの後始末をおこないます。
1128     //---------------------------------------------------------------------------
1129     void Cleanup();
1130 
1131     //! @brief フラグメントシェーダーが正しく設定されているか確認します。
1132     bool CheckFragmentShader();
1133 
1134     //! @brief バッファカラーを U32 で取得します。
1135     //!
1136     //! @return バッファカラーを U32 で返します。
GetBufferColorU32()1137     u32 GetBufferColorU32() const
1138     {
1139         return ref().m_BufferCommand[0];
1140     }
1141 
1142     //! @brief バッファカラーを設定します。
1143     //!
1144     //! @param[in]  r 設定するバッファカラーの R 成分です。
1145     //! @param[in]  g 設定するバッファカラーの G 成分です。
1146     //! @param[in]  b 設定するバッファカラーの B 成分です。
SetBufferColor(f32 r,f32 g,f32 b)1147     void SetBufferColor( f32 r, f32 g, f32 b )
1148     {
1149         ref().m_BufferColor.Set(r, g, b);
1150         ref().m_BufferCommand[0] = ref().m_BufferColor.ToPicaU32();
1151     }
1152 
1153     //! @brief バッファカラーを設定します。
1154     //!
1155     //! @param[in]  r 設定するバッファカラーの R 成分です。
1156     //! @param[in]  g 設定するバッファカラーの G 成分です。
1157     //! @param[in]  b 設定するバッファカラーの B 成分です。
1158     //! @param[in]  b 設定するバッファカラーのアルファ成分です。
SetBufferColor(f32 r,f32 g,f32 b,f32 a)1159     void SetBufferColor( f32 r, f32 g, f32 b, f32 a )
1160     {
1161         ref().m_BufferColor.Set(r, g, b, a);
1162         ref().m_BufferCommand[0] = ref().m_BufferColor.ToPicaU32();
1163     }
1164 
1165     //! @brief バッファカラーを取得します。
1166     //!
1167     //! @return バッファカラーを返します。
GetBufferColor()1168     const ut::FloatColor& GetBufferColor() const
1169     {
1170         return ref().m_BufferColor;
1171     }
1172 
1173     //! @brief バッファカラーを設定します。
1174     //!
1175     //! @param[in]  value 設定するバッファカラーです。
SetBufferColor(const ut::FloatColor & value)1176     void SetBufferColor(const ut::FloatColor& value)
1177     {
1178         ref().m_BufferColor = value;
1179         ref().m_BufferCommand[0] = ref().m_BufferColor.ToPicaU32();
1180     }
1181 
1182     //! @brief RGB のバッファインプットを取得します。
1183     //!
1184     //! @param[in]  index 取得するコンバイナのインデクスです。
GetBufferInputRgb(s32 index)1185     BufferInput GetBufferInputRgb(s32 index) const
1186     {
1187         NW_MINMAX_ASSERT(index, 1, 4);
1188 
1189         enum { CMD_SHIFT = 7, CMD_MASK = 0x1 };
1190         return static_cast<BufferInput>(internal::GetCmdValue( ref().m_BufferCommand[2], CMD_MASK, CMD_SHIFT+index ));
1191     }
1192 
1193     //! @brief RGB のバッファインプットを設定します。
1194     //!
1195     //! @param[in]  index 設定するコンバイナのインデクスです。
1196     //! @param[in]  value 設定するバッファインプットです。
SetBufferInputRgb(s32 index,BufferInput value)1197     void SetBufferInputRgb(s32 index, BufferInput value)
1198     {
1199         NW_MINMAX_ASSERT(index, 1, 4);
1200 
1201         enum { CMD_SHIFT = 7, CMD_MASK = 0x1 };
1202         internal::SetCmdValue( &ref().m_BufferCommand[2], value, CMD_MASK, CMD_SHIFT+index );
1203     }
1204 
1205     //! @brief Alpha のバッファインプットを取得します。
1206     //!
1207     //! @param[in]  index 取得するコンバイナのインデクスです。
GetBufferInputAlpha(s32 index)1208     BufferInput GetBufferInputAlpha(s32 index) const
1209     {
1210         NW_MINMAX_ASSERT(index, 1, 4);
1211 
1212         enum { CMD_SHIFT = 11, CMD_MASK = 0x1 };
1213         return static_cast<BufferInput>(internal::GetCmdValue( ref().m_BufferCommand[2], CMD_MASK, CMD_SHIFT+index ));
1214     }
1215 
1216     //! @brief Alpha のバッファインプットを設定します。
1217     //!
1218     //! @param[in]  index 設定するコンバイナのインデクスです。
1219     //! @param[in]  value 設定するバッファインプットです。
SetBufferInputAlpha(s32 index,BufferInput value)1220     void SetBufferInputAlpha(s32 index, BufferInput value)
1221     {
1222         NW_MINMAX_ASSERT(index, 1, 4);
1223 
1224         enum { CMD_SHIFT = 11, CMD_MASK = 0x1 };
1225         internal::SetCmdValue( &ref().m_BufferCommand[2], value, CMD_MASK, CMD_SHIFT+index );
1226     }
1227 };
1228 
1229 } // namespace res
1230 } // namespace gfx
1231 } // namespace nw
1232 
1233 #endif // NW_GFX_RESFRAGMENTSHADER_H_
1234