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