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