1 /*---------------------------------------------------------------------------*
2   Project:  NintendoWare
3   File:     gfx_ResMaterial.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_RESMATERIAL_H_
19 #define NW_GFX_RESMATERIAL_H_
20 
21 #include <GLES2/gl2.h>
22 #include <GLES2/gl2ext.h>
23 
24 #include <nw/types.h>
25 #include <nw/ut/ut_Flag.h>
26 #include <nw/ut/ut_Color.h>
27 #include <nw/ut/ut_ResUtil.h>
28 #include <nw/ut/ut_ResDictionary.h>
29 #include <nw/gfx/res/gfx_ResRevision.h>
30 #include <nw/gfx/res/gfx_ResTextureMapper.h>
31 #include <nw/gfx/res/gfx_ResTexture.h>
32 #include <nw/gfx/res/gfx_ResShader.h>
33 #include <nw/gfx/res/gfx_ResFragmentShader.h>
34 #include <nw/gfx/res/gfx_ResTypeInfo.h>
35 #include <nw/gfx/gfx_CommandUtil.h>
36 
37 namespace nw {
38 namespace gfx {
39 namespace res {
40 
41 class ResGraphicsFile;
42 
43 //! @details :private
44 struct ResMaterialColorData
45 {
46     nw::ut::ResFloatColor m_Emission;
47     nw::ut::ResFloatColor m_AmbientAndVertexColorScale;
48     nw::ut::ResFloatColor m_Diffuse;
49     nw::ut::ResFloatColor m_Specular0;
50     nw::ut::ResFloatColor m_Specular1;
51     nw::ut::ResFloatColor m_Constant0;
52     nw::ut::ResFloatColor m_Constant1;
53     nw::ut::ResFloatColor m_Constant2;
54     nw::ut::ResFloatColor m_Constant3;
55     nw::ut::ResFloatColor m_Constant4;
56     nw::ut::ResFloatColor m_Constant5;
57     nw::ut::ResU32 m_EmissionU32;
58     nw::ut::ResU32 m_AmbientU32;
59     nw::ut::ResU32 m_DiffuseU32;
60     nw::ut::ResU32 m_Specular0U32;
61     nw::ut::ResU32 m_Specular1U32;
62     nw::ut::ResU32 m_Constant0U32;
63     nw::ut::ResU32 m_Constant1U32;
64     nw::ut::ResU32 m_Constant2U32;
65     nw::ut::ResU32 m_Constant3U32;
66     nw::ut::ResU32 m_Constant4U32;
67     nw::ut::ResU32 m_Constant5U32;
68 
69     void* m_CommandCache;
70 };
71 
72 // ResRasterizationData::m_CommandBuffer のフォーマットは次の形式になっています。
73 //
74 // [0] 0x040のデータ
75 // [1] 0x040へのヘッダ(BE:1)
76 //! @details :private
77 struct ResRasterizationData
78 {
79     enum Flag
80     {
81         FLAG_POLYGON_OFFSET_ENABLED = 0x1 << 0
82     };
83 
84     nw::ut::ResU32 m_Flags;
85     nw::ut::ResU32 m_CullingMode;
86     nw::ut::ResF32 m_PolygonOffsetUnit;
87 
88     nw::ut::ResU32 m_CommandBuffer[2];
89 };
90 
91 // ResBlendOperationData::m_CommandBuffer のフォーマットは次の形式になっています。
92 //
93 // [0] 0x100のデータ
94 // [1] 0x100へのヘッダ(BE:0xf)
95 // [2] 0x101のデータ
96 // [3] 0x102のデータ
97 // [4] 0x103のデータ
98 // [5] padding
99 //! @details :private
100 struct ResBlendOperationData
101 {
102     nw::ut::ResS32          m_Mode;
103     nw::ut::ResFloatColor   m_BlendColor;
104 
105     nw::ut::ResU32 m_CommandBuffer[6];
106 };
107 
108 // ResDepthOperationData::m_CommandBuffer のフォーマットは次の形式になっています。
109 //
110 // [0] 0x107の[7:0]
111 // [1] 0x107へのヘッダ(BE:1)
112 // [2] 0x126の[31:24]
113 // [3] 0x126へのヘッダ(BE:8)
114 //! @details :private
115 struct ResDepthOperationData
116 {
117     enum Flag
118     {
119         FLAG_TEST_ENABLED = 0x1 << 0,
120         FLAG_MASK_ENABLED = 0x1 << 1
121     };
122 
123     nw::ut::ResU32 m_Flags;
124 
125     nw::ut::ResU32 m_CommandBuffer[4];
126 };
127 
128 // ResStencilOperationData::m_CommandBuffer のフォーマットは次の形式になっています。
129 //
130 // [0] 0x105のデータ
131 // [1] 0x105へのヘッダ(BE:0xd)
132 // [2] 0x106のデータ
133 // [3] 0x106へのヘッダ(BE:0xf)
134 //! @details :private
135 struct ResStencilOperationData
136 {
137     nw::ut::ResU32 m_CommandBuffer[4];
138 };
139 
140 //! @details :private
141 struct ResFragmentOperationData
142 {
143     ResDepthOperationData     m_DepthOperation;
144     ResBlendOperationData     m_BlendOperation;
145     ResStencilOperationData   m_StencilOperation;
146 };
147 
148 //! @details :private
149 struct ResTextureCoordinatorData
150 {
151     nw::ut::ResS32    m_SourceCoordinate;
152     nw::ut::ResS32    m_MappingMethod;
153     nw::ut::ResS32    m_ReferenceCamera;
154     nw::ut::ResS32    m_MatrixMode;
155     nw::ut::ResVec2   m_Scale;
156     nw::ut::ResF32    m_Rotate;
157     nw::ut::ResVec2   m_Translate;
158     nw::ut::ResBool   m_IsDirty;
159     nw::ut::ResBool   m_IsEnabled;
160     u8 _padding_0[2];
161     nw::ut::ResMtx34  m_TextureMatrix;
162 };
163 
164 
165 //! @details :private
166 struct ResMaterialData : public ResSceneObjectData
167 {
168     enum Flag
169     {
170         FLAG_FRAGMENTLIGHT_ENABLED = 0x1 << 0,
171         FLAG_VERTEXLIGHT_ENABLED   = 0x1 << 1,
172         FLAG_HEMISPHERELIGHT_ENABLED   = 0x1 << 2,
173         FLAG_HEMISPHERE_OCCLUSION_ENABLED = 0x1 << 3,
174         FLAG_FOG_ENABLED = 0x1 << 4,
175         FLAG_PARTICLE_MATERIAL_ENABLED = 0x1 << 5,
176         FLAG_HAS_BEEN_SETUP = 0x1 << 6,
177         FLAG_HAS_BEEN_SETUP_SHADER = 0x1 << 7,
178         FLAG_HAS_BEEN_SETUP_TEXTURE = 0x1 << 8,
179         FLAG_HAS_BEEN_SETUP_FRAGMENTSHADER = 0x1 << 9
180     };
181 
182     nw::ut::ResU32 m_Flags;
183     nw::ut::ResS32 m_TextureCoordinateConfig;
184     nw::ut::ResS32 m_TranslucencyKind;
185     ResMaterialColorData m_MaterialColor;
186     ResRasterizationData m_Rasterization;
187     ResFragmentOperationData m_FragmentOperation;
188     nw::ut::ResS32 m_ActiveTextureCoordinatorsCount;
189     ResTextureCoordinatorData m_TextureCoordinators[3];
190     nw::ut::Offset toTextureMappers[3];
191     nw::ut::Offset toProceduralTextureMapper;
192     nw::ut::Offset toShader;
193     nw::ut::Offset toFragmentShader;
194     nw::ut::ResS32 m_ShaderProgramDescriptionIndex;
195     nw::ut::ResS32 m_ShaderParametersTableCount;
196     nw::ut::Offset toShaderParametersTable;
197     nw::ut::ResS32 m_LightSetIndex;
198     nw::ut::ResS32 m_FogIndex;
199     nw::ut::ResU32 m_ShadingParameterHash;
200     nw::ut::ResU32 m_ShaderParametersHash;
201     nw::ut::ResU32 m_TextureCoordinatorsHash;
202     nw::ut::ResU32 m_TextureSamplersHash;
203     nw::ut::ResU32 m_TextureMappersHash;
204     nw::ut::ResU32 m_MaterialColorHash;
205     nw::ut::ResU32 m_RasterizationHash;
206     nw::ut::ResU32 m_FragmentLightingHash;
207     nw::ut::ResU32 m_FragmentLightingTableHash;
208     nw::ut::ResU32 m_FragmentLightingTableParametersHash;
209     nw::ut::ResU32 m_TextureCombinersHash;
210     nw::ut::ResU32 m_AlphaTestHash;
211     nw::ut::ResU32 m_FragmentOperationHash;
212     nw::ut::ResU32 m_MaterialId;
213 };
214 
215 
216 //--------------------------------------------------------------------------
217 //! @brief  マテリアルを表すバイナリリソースクラスです。
218 //---------------------------------------------------------------------------
219 class ResMaterialColor : public nw::ut::ResCommon< ResMaterialColorData >
220 {
221 public:
NW_RES_CTOR(ResMaterialColor)222     NW_RES_CTOR( ResMaterialColor )
223 
224     //----------------------------------------
225     //! @name 取得/設定
226     //@{
227 
228     //---------------------------------------------------------------------------
229     //!  @brief    アンビエントカラーを取得します。
230     //!
231     //!  @return   α値に VertexColorScale が格納されたアンビエントカラーです。
232     //---------------------------------------------------------------------------
233     const nw::ut::FloatColor& GetAmbient() const { return ref().m_AmbientAndVertexColorScale; }
234 
235     //---------------------------------------------------------------------------
236     //!  @brief    頂点カラーのスケール値を取得します。
237     //!
238     //!  @return   頂点カラーのスケール値を返します。
239     //---------------------------------------------------------------------------
GetVertexColorScale()240     f32 GetVertexColorScale() const { return ref().m_AmbientAndVertexColorScale.a; }
241 
242     //---------------------------------------------------------------------------
243     //!  @brief        頂点カラーのスケール値を設定します。
244     //!
245     //!  @param[in]    scale   頂点カラーの設定値です。
246     //---------------------------------------------------------------------------
SetVertexColorScale(f32 scale)247     void SetVertexColorScale(f32 scale) { ref().m_AmbientAndVertexColorScale.a = scale; }
248 
249     //---------------------------------------------------------------------------
250     //! @brief      アンビエントカラーを RGBA8 フォーマットで取得します。
251     //!
252     //! @return     アンビエントカラーを RGBA8 フォーマットで返します。
253     //---------------------------------------------------------------------------
GetAmbientU32()254     u32 GetAmbientU32() const { return ref().m_AmbientU32; }
255 
256     //---------------------------------------------------------------------------
257     //! @brief      アンビエントカラーを設定します。
258     //!
259     //! @param[in]  r 設定するアンビエントカラーの R 成分です。
260     //! @param[in]  g 設定するアンビエントカラーの G 成分です。
261     //! @param[in]  b 設定するアンビエントカラーの B 成分です。
262     //---------------------------------------------------------------------------
SetAmbient(f32 r,f32 g,f32 b)263     void SetAmbient( f32 r, f32 g, f32 b )
264     {
265         ref().m_AmbientAndVertexColorScale.SetColor(r, g, b);
266         ref().m_AmbientU32 = ref().m_AmbientAndVertexColorScale.ToPicaU32();
267     }
268 
269     //---------------------------------------------------------------------------
270     //! @brief      アンビエントカラーを設定します。
271     //!
272     //! @param[in]  value 設定するアンビエントカラーです。
273     //---------------------------------------------------------------------------
SetAmbient(const nw::ut::FloatColor & value)274     void SetAmbient( const nw::ut::FloatColor& value )
275     {
276         this->SetAmbient(value.r, value.g, value.b);
277     }
278 
279     //---------------------------------------------------------------------------
280     //! @fn           u32 GetEmissionU32() const
281     //! @brief        エミッションカラーを RGBA8 の32bitフォーマットで取得します。
282     //---------------------------------------------------------------------------
283     //---------------------------------------------------------------------------
284     //! @fn           const nw::ut::FloatColor & GetEmission() const
285     //! @brief        エミッションカラーを取得します。
286     //---------------------------------------------------------------------------
287     //---------------------------------------------------------------------------
288     //! @fn           void SetEmission(f32 r, f32 g, f32 b)
289     //! @brief        エミッションカラーを設定します。
290     //---------------------------------------------------------------------------
291     NW_RES_FIELD_FLOAT_U32_COLOR_DECL( nw::ut::FloatColor, Emission )  // GetEmission()
292 
293     //---------------------------------------------------------------------------
294     //! @fn           u32 GetDiffuseU32() const
295     //! @brief        ディフューズカラーを RGBA8 の32bitフォーマットで取得します。
296     //---------------------------------------------------------------------------
297     //---------------------------------------------------------------------------
298     //! @fn           const nw::ut::FloatColor & GetDiffuse() const
299     //! @brief        ディフューズカラーを取得します。
300     //---------------------------------------------------------------------------
301     //---------------------------------------------------------------------------
302     //! @fn           void SetDiffuse(f32 r, f32 g, f32 b)
303     //! @brief        ディフューズカラーを設定します。
304     //---------------------------------------------------------------------------
305     NW_RES_FIELD_FLOAT_U32_COLOR_DECL( nw::ut::FloatColor, Diffuse )   // GetDiffuse(), SetDiffuse(r,g,b), SetDiffuse(r,g,b,a), SetDiffuse(FloatColor)
306 
307     //---------------------------------------------------------------------------
308     //! @fn           u32 GetSpecular0U32() const
309     //! @brief        スペキュラカラー0を RGBA8 の32bitフォーマットで取得します。
310     //---------------------------------------------------------------------------
311     //---------------------------------------------------------------------------
312     //! @fn           const nw::ut::FloatColor & GetSpecular0() const
313     //! @brief        スペキュラカラー0を取得します。
314     //---------------------------------------------------------------------------
315     //---------------------------------------------------------------------------
316     //! @fn           void SetSpecular0(f32 r, f32 g, f32 b)
317     //! @brief        スペキュラカラー0を設定します。
318     //---------------------------------------------------------------------------
319     NW_RES_FIELD_FLOAT_U32_COLOR_DECL( nw::ut::FloatColor, Specular0 ) // GetSpecular0(), SetSpecular0(r,g,b), SetSpecular0(r,g,b,a), SetSpecular0(FloatColor)
320 
321     //---------------------------------------------------------------------------
322     //! @fn           u32 GetSpecular1U32() const
323     //! @brief        スペキュラカラー1を RGBA8 の32bitフォーマットで取得します。
324     //---------------------------------------------------------------------------
325     //---------------------------------------------------------------------------
326     //! @fn           const nw::ut::FloatColor & GetSpecular1() const
327     //! @brief        スペキュラカラー1を取得します。
328     //---------------------------------------------------------------------------
329     //---------------------------------------------------------------------------
330     //! @fn           void SetSpecular1(f32 r, f32 g, f32 b)
331     //! @brief        スペキュラカラー1を設定します。
332     //---------------------------------------------------------------------------
333     NW_RES_FIELD_FLOAT_U32_COLOR_DECL( nw::ut::FloatColor, Specular1 ) // GetSpecular1(), SetSpecular1(r,g,b), SetSpecular1(r,g,b,a), SetSpecular1(FloatColor)
334 
335     //---------------------------------------------------------------------------
336     //! @fn           u32 GetConstant0U32() const
337     //! @brief        コンスタントカラー0を RGBA8 の32bitフォーマットで取得します。
338     //---------------------------------------------------------------------------
339     //---------------------------------------------------------------------------
340     //! @fn           const nw::ut::FloatColor & GetConstant0() const
341     //! @brief        コンスタントカラー0を取得します。
342     //---------------------------------------------------------------------------
343     //---------------------------------------------------------------------------
344     //! @fn           void SetConstant0(f32 r, f32 g, f32 b)
345     //! @brief        コンスタントカラー0を設定します。
346     //---------------------------------------------------------------------------
347     NW_RES_FIELD_FLOAT_U32_COLOR_DECL( nw::ut::FloatColor, Constant0 ) // GetConstant0(), SetConstant0(r,g,b), SetConstant0(r,g,b,a), SetConstant0(FloatColor)
348 
349     //---------------------------------------------------------------------------
350     //! @fn           u32 GetConstant1U32() const
351     //! @brief        コンスタントカラー1を RGBA8 の32bitフォーマットで取得します。
352     //---------------------------------------------------------------------------
353     //---------------------------------------------------------------------------
354     //! @fn           const nw::ut::FloatColor & GetConstant1() const
355     //! @brief        コンスタントカラー1を取得します。
356     //---------------------------------------------------------------------------
357     //---------------------------------------------------------------------------
358     //! @fn           void SetConstant1(f32 r, f32 g, f32 b)
359     //! @brief        コンスタントカラー1を設定します。
360     //---------------------------------------------------------------------------
361     NW_RES_FIELD_FLOAT_U32_COLOR_DECL( nw::ut::FloatColor, Constant1 ) // GetConstant1(), SetConstant1(r,g,b), SetConstant1(r,g,b,a), SetConstant1(FloatColor)
362 
363     //---------------------------------------------------------------------------
364     //! @fn           u32 GetConstant2U32() const
365     //! @brief        コンスタントカラー2を RGBA8 の32bitフォーマットで取得します。
366     //---------------------------------------------------------------------------
367     //---------------------------------------------------------------------------
368     //! @fn           const nw::ut::FloatColor & GetConstant2() const
369     //! @brief        コンスタントカラー2を取得します。
370     //---------------------------------------------------------------------------
371     //---------------------------------------------------------------------------
372     //! @fn           void SetConstant2(f32 r, f32 g, f32 b)
373     //! @brief        コンスタントカラー2を設定します。
374     //---------------------------------------------------------------------------
375     NW_RES_FIELD_FLOAT_U32_COLOR_DECL( nw::ut::FloatColor, Constant2 ) // GetConstant2(), SetConstant2(r,g,b), SetConstant2(r,g,b,a), SetConstant2(FloatColor)
376 
377     //---------------------------------------------------------------------------
378     //! @fn           u32 GetConstant3U32() const
379     //! @brief        コンスタントカラー3を RGBA8 の32bitフォーマットで取得します。
380     //---------------------------------------------------------------------------
381     //---------------------------------------------------------------------------
382     //! @fn           const nw::ut::FloatColor & GetConstant3() const
383     //! @brief        コンスタントカラー3を取得します。
384     //---------------------------------------------------------------------------
385     //---------------------------------------------------------------------------
386     //! @fn           void SetConstant3(f32 r, f32 g, f32 b)
387     //! @brief        コンスタントカラー3を設定します。
388     //---------------------------------------------------------------------------
389     NW_RES_FIELD_FLOAT_U32_COLOR_DECL( nw::ut::FloatColor, Constant3 ) // GetConstant3(), SetConstant3(r,g,b), SetConstant3(r,g,b,a), SetConstant3(FloatColor)
390 
391     //---------------------------------------------------------------------------
392     //! @fn           u32 GetConstant4U32() const
393     //! @brief        コンスタントカラー4を RGBA8 の32bitフォーマットで取得します。
394     //---------------------------------------------------------------------------
395     //---------------------------------------------------------------------------
396     //! @fn           const nw::ut::FloatColor & GetConstant4() const
397     //! @brief        コンスタントカラー4を取得します。
398     //---------------------------------------------------------------------------
399     //---------------------------------------------------------------------------
400     //! @fn           void SetConstant4(f32 r, f32 g, f32 b)
401     //! @brief        コンスタントカラー4を設定します。
402     //---------------------------------------------------------------------------
403     NW_RES_FIELD_FLOAT_U32_COLOR_DECL( nw::ut::FloatColor, Constant4 ) // GetConstant4(), SetConstant4(r,g,b), SetConstant4(r,g,b,a), SetConstant4(FloatColor)
404 
405     //---------------------------------------------------------------------------
406     //! @fn           u32 GetConstant5U32() const
407     //! @brief        コンスタントカラー5を RGBA8 の32bitフォーマットで取得します。
408     //---------------------------------------------------------------------------
409     //---------------------------------------------------------------------------
410     //! @fn           const nw::ut::FloatColor & GetConstant5() const
411     //! @brief        コンスタントカラー5を取得します。
412     //---------------------------------------------------------------------------
413     //---------------------------------------------------------------------------
414     //! @fn           void SetConstant5(f32 r, f32 g, f32 b)
415     //! @brief        コンスタントカラー5を設定します。
416     //---------------------------------------------------------------------------
417     NW_RES_FIELD_FLOAT_U32_COLOR_DECL( nw::ut::FloatColor, Constant5 ) // GetConstant5(), SetConstant5(r,g,b), SetConstant5(r,g,b,a), SetConstant5(FloatColor)
418 
419     //@}
420 };
421 
422 //--------------------------------------------------------------------------
423 //! @brief  ポリゴンのラスタライゼーション方法を管理するバイナリリソースクラスです。
424 //---------------------------------------------------------------------------
425 class ResRasterization : public nw::ut::ResCommon< ResRasterizationData >
426 {
427 public:
428 
429     //! カリングモードです。
430     enum CullingMode
431     {
432         CULLINGMODE_FRONT = 0,  //!< 表面カリングです。
433         CULLINGMODE_BACK  = 1,  //!< 裏面カリングです。
434         CULLINGMODE_NONE  = 3   //!< 両面表示です。
435     };
436 
437     NW_RES_CTOR( ResRasterization )
438 
439     //---------------------------------------------------------------------------
440     //! @fn           void SetFlags(u32 value)
441     //! @brief        フラグの値を設定します。
442     //!               設定されなかったフラグは無効になります。
443     //---------------------------------------------------------------------------
444     //---------------------------------------------------------------------------
445     //! @fn           void EnableFlags(u32 value)
446     //! @brief        指定された Flag の値を有効にします。
447     //!               設定されなかったフラグは変更されません。
448     //---------------------------------------------------------------------------
449     //---------------------------------------------------------------------------
450     //! @fn           void DisableFlags(u32 value)
451     //! @brief        指定された Flag の値を無効にします。
452     //!               設定されなかったフラグは変更されません。
453     //---------------------------------------------------------------------------
454     //---------------------------------------------------------------------------
455     //! @fn           u32 GetFlags() const
456     //! @brief        フラグの値を取得します。
457     //---------------------------------------------------------------------------
NW_RES_FIELD_FLAGS_DECL(u32,Flags)458     NW_RES_FIELD_FLAGS_DECL( u32, Flags )               // GetFlags(), SetFlags(), EnableFlags(), DisableFlags()
459 
460     //---------------------------------------------------------------------------
461     //! @fn           f32 GetPolygonOffsetUnit() const
462     //! @brief        ポリゴンオフセットのユニット要素を取得します。
463     //---------------------------------------------------------------------------
464     //---------------------------------------------------------------------------
465     //! @fn           void SetPolygonOffsetUnit(f32 value)
466     //! @brief        ポリゴンオフセットのユニット要素を設定します。
467     //---------------------------------------------------------------------------
468     NW_RES_FIELD_PRIMITIVE_DECL( f32, PolygonOffsetUnit )   // GetPolygonOffsetUnit(), SetPolygonOffsetUnit()
469 
470     //---------------------------------------------------------------------------
471     //! @fn           u32 * GetCommandBuffer()
472     //! @brief        コマンドバッファへのポインタを取得します。
473     //---------------------------------------------------------------------------
474     NW_RES_FIELD_COMMAND_BUFFER() // GetCommandBuffer()
475 
476     //---------------------------------------------------------------------------
477     //! @brief カリングモードを取得します。
478     //!
479     //! @return カリングモードを返します。
480     //---------------------------------------------------------------------------
481     CullingMode GetCullingMode() const
482     {
483         return static_cast<CullingMode>(this->ref().m_CullingMode);
484     }
485 
486     //---------------------------------------------------------------------------
487     //! @brief カリングモードを設定します。
488     //!
489     //! @param[in] value 設定するカリングモードです。
490     //---------------------------------------------------------------------------
SetCullingMode(CullingMode value)491     void SetCullingMode(CullingMode value)
492     {
493         enum { CMD_SHIFT = 0, CMD_MASK = 0x3, CMD_CULLING_MODE_NONE = 0, CMD_CULLING_MODE_OTHER = 1, CMD_CULLING_MODE_BACK = 2 };
494 
495         this->ref().m_CullingMode = static_cast<u32>(value);
496 
497         static const u32 table[] =
498         {
499             CMD_CULLING_MODE_OTHER,
500             CMD_CULLING_MODE_BACK,
501             CMD_CULLING_MODE_OTHER,
502             CMD_CULLING_MODE_NONE
503         };
504 
505         internal::SetCmdValue( &ref().m_CommandBuffer[0], table[value], CMD_MASK, CMD_SHIFT );
506     }
507 };
508 
509 //--------------------------------------------------------------------------
510 //! @brief  ブレンダーを表すバイナリリソースクラスです。
511 //---------------------------------------------------------------------------
512 class ResBlendOperation : public nw::ut::ResCommon< ResBlendOperationData >
513 {
514 public:
515 
516     //! @brief      ブレンドモードの定義です。
517     enum Mode
518     {
519         MODE_NOT_USE,           //!< 使用しません。
520         MODE_BLEND,             //!< ブレンド処理です。
521         MODE_SEPARATE_BLEND,    //!< セパレートブレンド処理です。
522         MODE_LOGIC              //!< 論理演算です。
523     };
524 
525     //! @brief      論理演算の演算方法の定義です。
526     enum LogicOp
527     {
528         LOGICOP_CLEAR           = 0,    //!< すべてのビット値を 0 にします。
529         LOGICOP_AND             = 1,    //!< ソースカラーとディスティネーションカラーの論理積をとります。
530         LOGICOP_AND_REVERSE     = 2,    //!< ソースカラーとディスティネーションカラーの反転ビット値の論理積をとります。
531         LOGICOP_COPY            = 3,    //!< ソースカラーのビット値をとります。
532         LOGICOP_SET             = 4,    //!< すべてのビット値を 1 にします。
533         LOGICOP_COPY_INVERTED   = 5,    //!< ソースカラーの反転ビット値をとります。
534         LOGICOP_NOOP            = 6,    //!< ディスティネーションカラーのビット値をとります。
535         LOGICOP_INVERT          = 7,    //!< ディスティネーションカラーの反転ビット値をとります。
536         LOGICOP_NAND            = 8,    //!< ソースカラーとディスティネーションカラーの論理積の反転ビット値をとります。
537         LOGICOP_OR              = 9,    //!< ソースカラーとディスティネーションカラーの論理和をとります。
538         LOGICOP_NOR             = 10,   //!< ソースカラーとディスティネーションカラーの論理和の反転ビット値をとります。
539         LOGICOP_XOR             = 11,   //!< ソースカラーとディスティネーションカラーの排他的論理和をとります。
540         LOGICOP_EQUIV           = 12,   //!< ソースカラーとディスティネーションカラーの排他的論理和の反転ビット値をとります。
541         LOGICOP_AND_INVERTED    = 13,   //!< ソースカラーの反転ビット値と、ディスティネーションカラーの論理積をとります。
542         LOGICOP_OR_REVERSE      = 14,   //!< ソースカラーとディスティネーションカラーの反転ビット値の論理和をとります。
543         LOGICOP_OR_INVERTED     = 15    //!< ソースカラーの反転ビット値と、ディスティネーションカラーの論理和をとります。
544     };
545 
546     //! @brief      入出力の要素の定義です。
547     //!
548     //!             MIN(a,b) は a と b の小さい方を表します。
549     enum BlendFactor
550     {
551         BLENDFACTOR_ZERO                     = 0,   //!< 指定の成分に「 0 」を利用します。
552         BLENDFACTOR_ONE                      = 1,   //!< 指定の成分に「 1 」を利用します。
553         BLENDFACTOR_SRC_COLOR                = 2,   //!< 指定の成分に「ソースカラー」を利用します。
554         BLENDFACTOR_ONE_MINUS_SRC_COLOR      = 3,   //!< 指定の成分に「1 - ソースカラー」 を利用します。
555         BLENDFACTOR_DST_COLOR                = 4,   //!< 指定の成分に「デスティネーションカラー」を利用します。
556         BLENDFACTOR_ONE_MINUS_DST_COLOR      = 5,   //!< 指定の成分に「 1 - デスティネーションカラー」を利用します。
557         BLENDFACTOR_SRC_ALPHA                = 6,   //!< 指定の成分に「ソースアルファ」を利用します。
558         BLENDFACTOR_ONE_MINUS_SRC_ALPHA      = 7,   //!< 指定の成分に「 1 - ソースアルファ」 を利用します。
559         BLENDFACTOR_DST_ALPHA                = 8,   //!< 指定の成分に「デスティネーションアルファ」を利用します。
560         BLENDFACTOR_ONE_MINUS_DST_ALPHA      = 9,   //!< 指定の成分に「 1 - デスティネーションアルファ」を利用します。
561         BLENDFACTOR_CONSTANT_COLOR           = 10,  //!< 指定の成分に「コンスタントカラー(ブレンドカラー)」を利用します。
562         BLENDFACTOR_ONE_MINUS_CONSTANT_COLOR = 11,  //!< 指定の成分に「 1 - コンスタントカラー」を利用します。
563         BLENDFACTOR_CONSTANT_ALPHA           = 12,  //!< 指定の成分に「コンスタントアルファ(ブレンドアルファ)」を利用します。
564         BLENDFACTOR_ONE_MINUS_CONSTANT_ALPHA = 13,  //!< 指定の成分に「 1 - コンスタントアルファ」を利用します。
565         BLENDFACTOR_SRC_ALPHA_SATURATE       = 14   //!< 指定の成分に「 MIN( ソースアルファ , 1 - デスティネーションアルファ ) 」を利用します。
566     };
567 
568     //! @brief      ブレンド式の定義です。
569     enum BlendEquation
570     {
571         BLENDEQ_FUNC_ADD              = 0,  //!< ソースとデスティネーションを加算します。
572         BLENDEQ_FUNC_SUBTRACT         = 1,  //!< ソースからデスティネーションを減算します。
573         BLENDEQ_FUNC_REVERSE_SUBTRACT = 2,  //!< デスティネーションからソースを減算します。
574         BLENDEQ_MIN                   = 3,  //!< ソースとデスティネーションのより小さい方です。
575         BLENDEQ_MAX                   = 4   //!< ソースとデスティネーションのより大きい方です。
576     };
577 
NW_RES_CTOR(ResBlendOperation)578     NW_RES_CTOR( ResBlendOperation )
579 
580     //---------------------------------------------------------------------------
581     //! @brief      ブレンドモードを取得します。
582     //!
583     //! @return     ブレンドモードを返します。
584     //---------------------------------------------------------------------------
585     Mode GetMode() const
586     {
587         return static_cast<Mode>(ref().m_Mode);
588     }
589 
590     //---------------------------------------------------------------------------
591     //! @brief      ブレンドモードを設定します。
592     //!
593     //! @param[in]  value 設定するブレンドモードです。
594     //---------------------------------------------------------------------------
SetMode(Mode value)595     void SetMode(Mode value)
596     {
597         enum { CMD_SHIFT = 8, CMD_MASK = 0x1, CMD_BLEND_MODE_LOGIC = 0, CMD_BLEND_MODE_OTHER = 1 };
598 
599         ref().m_Mode = value;
600 
601         const u32 table[] =
602         {
603             CMD_BLEND_MODE_OTHER,
604             CMD_BLEND_MODE_OTHER,
605             CMD_BLEND_MODE_OTHER,
606             CMD_BLEND_MODE_LOGIC
607         };
608 
609         internal::SetCmdValue( &ref().m_CommandBuffer[0], table[value], CMD_MASK, CMD_SHIFT );
610     }
611 
612     //---------------------------------------------------------------------------
613     //! @brief      ブレンドカラーを設定します。
614     //!
615     //! @param[in]  r 設定するブレンドカラーの R 成分です。
616     //! @param[in]  g 設定するブレンドカラーの G 成分です。
617     //! @param[in]  b 設定するブレンドカラーの B 成分です。
618     //---------------------------------------------------------------------------
SetBlendColor(f32 r,f32 g,f32 b)619     void SetBlendColor( f32 r, f32 g, f32 b )
620     {
621         enum { CMD_SHIFT = 0, CMD_MASK = 0xffffffff };
622 
623         ref().m_BlendColor.Set(r, g, b);
624         u32 colorByte = ref().m_BlendColor.ToPicaU32();
625         internal::SetCmdValue( &ref().m_CommandBuffer[4], colorByte, CMD_MASK, CMD_SHIFT );
626     }
627 
628     //---------------------------------------------------------------------------
629     //! @brief      ブレンドカラーを設定します。
630     //!
631     //! @param[in]  r 設定するブレンドカラーの R 成分です。
632     //! @param[in]  g 設定するブレンドカラーの G 成分です。
633     //! @param[in]  b 設定するブレンドカラーの B 成分です。
634     //! @param[in]  a 設定するブレンドカラーのアルファ成分です。
635     //---------------------------------------------------------------------------
SetBlendColor(f32 r,f32 g,f32 b,f32 a)636     void SetBlendColor( f32 r, f32 g, f32 b, f32 a )
637     {
638         enum { CMD_SHIFT = 0, CMD_MASK = 0xffffffff };
639 
640         ref().m_BlendColor.Set(r, g, b, a);
641         u32 colorByte = ref().m_BlendColor.ToPicaU32();
642         internal::SetCmdValue( &ref().m_CommandBuffer[4], colorByte, CMD_MASK, CMD_SHIFT );
643     }
644 
645     //---------------------------------------------------------------------------
646     //! @brief      ブレンドカラーを取得します。
647     //!
648     //! @return     ブレンドカラーを返します。
649     //---------------------------------------------------------------------------
GetBlendColor()650     const nw::ut::FloatColor& GetBlendColor() const
651     {
652         return ref().m_BlendColor;
653     }
654 
655     //---------------------------------------------------------------------------
656     //! @brief      ブレンドカラーを設定します。
657     //!
658     //! @param[in]  value 設定するブレンドカラーです。
659     //---------------------------------------------------------------------------
SetBlendColor(const nw::ut::FloatColor & value)660     void SetBlendColor(const nw::ut::FloatColor& value)
661     {
662         enum { CMD_SHIFT = 0, CMD_MASK = 0xffffffff };
663 
664         ref().m_BlendColor = value;
665         u32 colorByte = ref().m_BlendColor.ToPicaU32();
666         internal::SetCmdValue( &ref().m_CommandBuffer[4], colorByte, CMD_MASK, CMD_SHIFT );
667     }
668 
669     //---------------------------------------------------------------------------
670     //! @brief      論理演算の演算方法を取得します。
671     //!
672     //! @return     演算方法を返します。
673     //---------------------------------------------------------------------------
GetLogicOperation()674     LogicOp GetLogicOperation() const
675     {
676         enum { CMD_SHIFT = 0, CMD_MASK = 0xf };
677 
678         return static_cast<LogicOp>(internal::GetCmdValue( ref().m_CommandBuffer[3], CMD_MASK, CMD_SHIFT ));
679     }
680 
681     //---------------------------------------------------------------------------
682     //! @brief      論理演算の演算方法を設定します。
683     //!
684     //! @param[in]  value 設定する演算方法です。
685     //---------------------------------------------------------------------------
SetLogicOperation(LogicOp value)686     void SetLogicOperation(LogicOp value)
687     {
688         enum { CMD_SHIFT = 0, CMD_MASK = 0xf };
689 
690         internal::SetCmdValue( &ref().m_CommandBuffer[3], value, CMD_MASK, CMD_SHIFT );
691     }
692 
693     //------------------------------------------------------------
694     //! @brief      カラーブレンド式の入力要素を取得します。
695     //!
696     //! @return     入力要素を返します。
697     //---------------------------------------------------------------------------
GetBlendFuncSrcRgb()698     BlendFactor GetBlendFuncSrcRgb() const
699     {
700         enum { CMD_SHIFT = 16, CMD_MASK = 0xf };
701 
702         return static_cast<BlendFactor>(internal::GetCmdValue( ref().m_CommandBuffer[2], CMD_MASK, CMD_SHIFT ));
703     }
704 
705     //---------------------------------------------------------------------------
706     //! @brief      カラーブレンド式の入力要素を設定します。
707     //!
708     //! @param[in]  value 設定する入力要素です。
709     //---------------------------------------------------------------------------
SetBlendFuncSrcRgb(BlendFactor value)710     void SetBlendFuncSrcRgb(BlendFactor value)
711     {
712         enum { CMD_SHIFT = 16, CMD_MASK = 0xf };
713 
714         internal::SetCmdValue( &ref().m_CommandBuffer[2], value, CMD_MASK, CMD_SHIFT );
715     }
716 
717     //------------------------------------------------------------
718     //! @brief      アルファブレンド式の入力要素を取得します。
719     //!
720     //! @return     入力要素を返します。
721     //---------------------------------------------------------------------------
GetBlendFuncSrcAlpha()722     BlendFactor GetBlendFuncSrcAlpha() const
723     {
724         enum { CMD_SHIFT = 24, CMD_MASK = 0xf };
725 
726         return static_cast<BlendFactor>(internal::GetCmdValue( ref().m_CommandBuffer[2], CMD_MASK, CMD_SHIFT ));
727     }
728 
729     //---------------------------------------------------------------------------
730     //! @brief      アルファブレンド式の入力要素を設定します。
731     //!
732     //! @param[in]  value 設定する入力要素です。
733     //---------------------------------------------------------------------------
SetBlendFuncSrcAlpha(BlendFactor value)734     void SetBlendFuncSrcAlpha(BlendFactor value)
735     {
736         enum { CMD_SHIFT = 24, CMD_MASK = 0xf };
737 
738         internal::SetCmdValue( &ref().m_CommandBuffer[2], value, CMD_MASK, CMD_SHIFT );
739     }
740 
741     //------------------------------------------------------------
742     //! @brief      カラーブレンド式の出力要素を取得します。
743     //!
744     //! @return     出力要素を返します。
745     //---------------------------------------------------------------------------
GetBlendFuncDstRgb()746     BlendFactor GetBlendFuncDstRgb() const
747     {
748         enum { CMD_SHIFT = 20, CMD_MASK = 0xf };
749 
750         return static_cast<BlendFactor>(internal::GetCmdValue( ref().m_CommandBuffer[2], CMD_MASK, CMD_SHIFT ));
751     }
752 
753     //---------------------------------------------------------------------------
754     //! @brief      カラーブレンド式の出力要素を設定します。
755     //!
756     //! @param[in]  value 設定する出力要素です。
757     //---------------------------------------------------------------------------
SetBlendFuncDstRgb(BlendFactor value)758     void SetBlendFuncDstRgb(BlendFactor value)
759     {
760         enum { CMD_SHIFT = 20, CMD_MASK = 0xf };
761 
762         internal::SetCmdValue( &ref().m_CommandBuffer[2], value, CMD_MASK, CMD_SHIFT );
763     }
764 
765     //---------------------------------------------------------------------------
766     //! @brief      アルファブレンド式の出力要素を取得します。
767     //!
768     //! @return     出力要素を返します。
769     //---------------------------------------------------------------------------
GetBlendFuncDstAlpha()770     BlendFactor GetBlendFuncDstAlpha() const
771     {
772         enum { CMD_SHIFT = 28, CMD_MASK = 0xf };
773 
774         return static_cast<BlendFactor>(internal::GetCmdValue( ref().m_CommandBuffer[2], CMD_MASK, CMD_SHIFT ));
775     }
776 
777     //---------------------------------------------------------------------------
778     //! @brief      アルファブレンド式の出力要素を設定します。
779     //!
780     //! @param[in]  value 設定する出力要素です。
781     //---------------------------------------------------------------------------
SetBlendFuncDstAlpha(BlendFactor value)782     void SetBlendFuncDstAlpha(BlendFactor value)
783     {
784         enum { CMD_SHIFT = 28, CMD_MASK = 0xf };
785 
786         internal::SetCmdValue( &ref().m_CommandBuffer[2], value, CMD_MASK, CMD_SHIFT );
787     }
788 
789     //------------------------------------------------------------
790     //! @brief      カラーブレンド式を取得します。
791     //!
792     //! @return     カラーブレンド式を返します。
793     //---------------------------------------------------------------------------
GetBlendEquationRgb()794     BlendEquation GetBlendEquationRgb() const
795     {
796         enum { CMD_SHIFT = 0, CMD_MASK = 0x7 };
797 
798         return static_cast<BlendEquation>(internal::GetCmdValue( ref().m_CommandBuffer[2], CMD_MASK, CMD_SHIFT ));
799     }
800 
801     //---------------------------------------------------------------------------
802     //! @brief      カラーブレンド式を設定します、。
803     //!
804     //! @param[in]  value 設定するカラーブレンド式です。
805     //---------------------------------------------------------------------------
SetBlendEquationRgb(BlendEquation value)806     void SetBlendEquationRgb(BlendEquation value)
807     {
808         enum { CMD_SHIFT = 0, CMD_MASK = 0x7 };
809 
810         internal::SetCmdValue( &ref().m_CommandBuffer[2], value, CMD_MASK, CMD_SHIFT );
811     }
812 
813     //---------------------------------------------------------------------------
814     //! @brief      アルファブレンド式を取得します。
815     //!
816     //! @return     アルファブレンド式を返します。
817     //---------------------------------------------------------------------------
GetBlendEquationAlpha()818     BlendEquation GetBlendEquationAlpha() const
819     {
820         enum { CMD_SHIFT = 8, CMD_MASK = 0x7 };
821 
822         return static_cast<BlendEquation>(internal::GetCmdValue( ref().m_CommandBuffer[2], CMD_MASK, CMD_SHIFT ));
823     }
824 
825     //---------------------------------------------------------------------------
826     //! @brief      アルファブレンド式を設定します。
827     //!
828     //! @param[in]  value 設定するアルファブレンド式です。
829     //---------------------------------------------------------------------------
SetBlendEquationAlpha(BlendEquation value)830     void SetBlendEquationAlpha(BlendEquation value)
831     {
832         enum { CMD_SHIFT = 8, CMD_MASK = 0x7 };
833 
834         internal::SetCmdValue( &ref().m_CommandBuffer[2], value, CMD_MASK, CMD_SHIFT );
835     }
836 
837     //---------------------------------------------------------------------------
838     //! @fn           u32 * GetCommandBuffer()
839     //! @brief        コマンドバッファへのポインタを取得します。
840     //---------------------------------------------------------------------------
841     NW_RES_FIELD_COMMAND_BUFFER();
842 };
843 
844 //--------------------------------------------------------------------------
845 //! @brief デプステストを表すバイナリリソースクラスです。
846 //---------------------------------------------------------------------------
847 class ResDepthOperation : public nw::ut::ResCommon< ResDepthOperationData >
848 {
849 public:
850 
851     //! @brief      デプステスト方法です。
852     enum TestFunc
853     {
854         TESTFUNC_NEVER      = 0,    //!< すべて不通過です。
855         TESTFUNC_ALWAYS     = 1,    //!< すべて通過です。
856         TESTFUNC_EQUAL      = 2,    //!< デプスバッファの値と等しければ通過します。
857         TESTFUNC_NOTEQUAL   = 3,    //!< デプスバッファの値と等しくなければ通過します。
858         TESTFUNC_LESS       = 4,    //!< デプスバッファの値より小さければ通過します。
859         TESTFUNC_LEQUAL     = 5,    //!< デプスバッファの値以下であれば通過します。
860         TESTFUNC_GREATER    = 6,    //!< デプスバッファの値より大きければ通過します。
861         TESTFUNC_GEQUAL     = 7     //!< デプスバッファの値以上であれば通過します。
862     };
863 
NW_RES_CTOR(ResDepthOperation)864     NW_RES_CTOR( ResDepthOperation )
865 
866     //---------------------------------------------------------------------------
867     //! @brief        フラグ値を取得します。
868     //!
869     //! @return       フラグの値です。
870     //---------------------------------------------------------------------------
871     u32 GetFlags() const
872     {
873         return static_cast<u32>(ref().m_Flags);
874     }
875 
876     //---------------------------------------------------------------------------
877     //! @brief        フラグ値を設定します。
878     //!
879     //! @return       設定するフラグの値です。
880     //---------------------------------------------------------------------------
SetFlags(u32 value)881     void SetFlags(u32 value)
882     {
883         ref().m_Flags = value;
884 
885         enum { CMD_SHIFT = 0, CMD_MASK = 0x1 };
886 
887         // ここでは DepthTestEnabled のみ設定します。
888         // DepthMask に関しては実行時にフラグの値から設定します。
889         internal::SetCmdValue( &ref().m_CommandBuffer[0], value, CMD_MASK, CMD_SHIFT );
890     }
891 
892     //---------------------------------------------------------------------------
893     //! @brief      テスト方法を取得します。
894     //!
895     //! @return     テスト方法を返します。
896     //---------------------------------------------------------------------------
GetTestFunc()897     TestFunc GetTestFunc() const
898     {
899         enum { CMD_SHIFT = 4, CMD_MASK = 0x7 };
900 
901         return static_cast<TestFunc>(internal::GetCmdValue( ref().m_CommandBuffer[0], CMD_MASK, CMD_SHIFT ));
902     }
903 
904     //---------------------------------------------------------------------------
905     //! @brief      テスト方法を設定します。
906     //!
907     //! @param[in]  value 設定するテスト方法です。
908     //---------------------------------------------------------------------------
SetTestFunc(TestFunc value)909     void SetTestFunc(TestFunc value)
910     {
911         enum { CMD_SHIFT = 4, CMD_MASK = 0x7 };
912         enum { CMD_SHIFT126 = 24, CMD_MASK126 = 0x3, CMD_NEVER = 0, CMD_ALWAYS = 1, CMD_GEATERORGEQUAL = 2, CMD_OTHERS = 3 };
913 
914         internal::SetCmdValue( &ref().m_CommandBuffer[0], value, CMD_MASK, CMD_SHIFT );
915 
916         static const uint table[] =
917         {
918             CMD_NEVER,
919             CMD_ALWAYS,
920             CMD_OTHERS,
921             CMD_OTHERS,
922             CMD_OTHERS,
923             CMD_OTHERS,
924             CMD_GEATERORGEQUAL,
925             CMD_GEATERORGEQUAL
926         };
927 
928         internal::SetCmdValue( &ref().m_CommandBuffer[2], table[value], CMD_MASK126, CMD_SHIFT126 );
929     }
930 
931     //---------------------------------------------------------------------------
932     //! @fn           u32 * GetCommandBuffer()
933     //! @brief        コマンドバッファへのポインタを取得します。
934     //---------------------------------------------------------------------------
935     NW_RES_FIELD_COMMAND_BUFFER() // GetCommandBuffer()
936 };
937 
938 //--------------------------------------------------------------------------
939 //! @brief  ステンシルテストを表すバイナリリソースクラスです。
940 //---------------------------------------------------------------------------
941 class ResStencilOperation : public nw::ut::ResCommon< ResStencilOperationData >
942 {
943 public:
944 
945     //! @brief      ステンシルテスト関数です。
946     enum TestFunc
947     {
948         TESTFUNC_NEVER,     //!< すべて不通過です。
949         TESTFUNC_ALWAYS,    //!< すべて通過です。
950         TESTFUNC_EQUAL,     //!< 参照値と等しければ通過します。
951         TESTFUNC_NOTEQUAL,  //!< 参照値と等しくなければ通過します。
952         TESTFUNC_LESS,      //!< 参照値より小さければ通過します。
953         TESTFUNC_LEQUAL,    //!< 参照値以下であれば通過します。
954         TESTFUNC_GREATER,   //!< 参照値より大きければ通過します。
955         TESTFUNC_GEQUAL     //!< 参照値以上であれば通過します。
956     };
957 
958     //! @brief      テスト後の処理です。
959     enum StencilOp
960     {
961         STENCILOP_KEEP,             //!< 現在の値を保持します。
962         STENCILOP_ZERO,             //!< 0 に置換します。
963         STENCILOP_REPLACE,          //!< 参照値に置換します。
964         STENCILOP_INCREASE,         //!< 増加させます。極値処理はクランプです。
965         STENCILOP_DECREASE,         //!< 減少させます。極値処理はクランプです。
966         STENCILOP_INVERT,           //!< ビット単位で反転させます。
967         STENCILOP_INCREASE_WRAP,    //!< 増加させます。極値処理は回り込みです。
968         STENCILOP_DECREASE_WRAP     //!< 減少させます。極値処理は回り込みです。
969     };
970 
971     NW_RES_CTOR( ResStencilOperation )
972 
973     //---------------------------------------------------------------------------
974     //! @fn           u32 * GetCommandBuffer()
975     //! @brief        コマンドバッファへのポインタを取得します。
976     //---------------------------------------------------------------------------
977     NW_RES_FIELD_COMMAND_BUFFER();
978 
979     //! @brief ステンシルテストが有効であるかどうかを取得します。
IsTestEnabled()980     bool IsTestEnabled() const
981     {
982         enum { CMD_SHIFT = 0, CMD_MASK = 0x1 };
983 
984         return (internal::GetCmdValue( ref().m_CommandBuffer[0], CMD_MASK, CMD_SHIFT )) ? true : false;
985     }
986 
987     //! @brief ステンシルテストが有効であるかどうかを設定します。
SetTestEnabled(bool value)988     void SetTestEnabled(bool value)
989     {
990         enum { CMD_SHIFT = 0, CMD_MASK = 0x1 };
991 
992         internal::SetCmdValue( &ref().m_CommandBuffer[0], value, CMD_MASK, CMD_SHIFT );
993     }
994 
995     //! @brief テスト関数を取得します。
GetTestFunction()996     TestFunc GetTestFunction() const
997     {
998         enum { CMD_SHIFT = 4, CMD_MASK = 0x7 };
999 
1000         return static_cast<TestFunc>(internal::GetCmdValue( ref().m_CommandBuffer[0], CMD_MASK, CMD_SHIFT ));
1001     }
1002 
1003     //! @brief テスト関数を設定します。
SetTestFunction(TestFunc value)1004     void SetTestFunction(TestFunc value)
1005     {
1006         enum { CMD_SHIFT = 4, CMD_MASK = 0x7 };
1007 
1008         internal::SetCmdValue( &ref().m_CommandBuffer[0], value, CMD_MASK, CMD_SHIFT );
1009     }
1010 
1011     //! @brief 参照値を取得します。
GetTestReference()1012     s32 GetTestReference() const
1013     {
1014         enum { CMD_SHIFT = 16, CMD_MASK = 0xff };
1015 
1016         return static_cast<s32>(internal::GetCmdValue( ref().m_CommandBuffer[0], CMD_MASK, CMD_SHIFT ));
1017     }
1018 
1019     //! @brief 参照値を設定します。
SetTestReference(s32 value)1020     void SetTestReference(s32 value)
1021     {
1022         enum { CMD_SHIFT = 16, CMD_MASK = 0xff };
1023 
1024         internal::SetCmdValue( &ref().m_CommandBuffer[0], value, CMD_MASK, CMD_SHIFT );
1025     }
1026 
1027     //! @brief テストマスクを取得します。
GetTestMask()1028     u32 GetTestMask() const
1029     {
1030         enum { CMD_SHIFT = 24, CMD_MASK = 0xff };
1031 
1032         return static_cast<u32>(internal::GetCmdValue( ref().m_CommandBuffer[0], CMD_MASK, CMD_SHIFT ));
1033     }
1034 
1035     //! @brief テストマスクを設定します。
SetTestMask(u32 value)1036     void SetTestMask(u32 value)
1037     {
1038         enum { CMD_SHIFT = 24, CMD_MASK = 0xff };
1039 
1040         internal::SetCmdValue( &ref().m_CommandBuffer[0], value, CMD_MASK, CMD_SHIFT );
1041     }
1042 
1043     //! @brief ステンシルテストを通過できなかったフラグメントへの処理を取得します。
GetFailOperation()1044     StencilOp GetFailOperation() const
1045     {
1046         enum { CMD_SHIFT = 0, CMD_MASK = 0x7 };
1047 
1048         return static_cast<StencilOp>(internal::GetCmdValue( ref().m_CommandBuffer[2], CMD_MASK, CMD_SHIFT ));
1049     }
1050 
1051     //! @brief ステンシルテストを通過できなかったフラグメントへの処理を設定します。
SetFailOperation(StencilOp value)1052     void SetFailOperation(StencilOp value)
1053     {
1054         enum { CMD_SHIFT = 0, CMD_MASK = 0x7 };
1055 
1056         internal::SetCmdValue( &ref().m_CommandBuffer[2], value, CMD_MASK, CMD_SHIFT );
1057     }
1058 
1059      //! @brief ステンシルテストを通過し、デプステストを通過できなかったフラグメントへの処理を取得します。
GetZFailOperation()1060     StencilOp GetZFailOperation() const
1061     {
1062         enum { CMD_SHIFT = 4, CMD_MASK = 0x7 };
1063 
1064         return static_cast<StencilOp>(internal::GetCmdValue( ref().m_CommandBuffer[2], CMD_MASK, CMD_SHIFT ));
1065     }
1066 
1067      //! @brief ステンシルテストを通過し、デプステストを通過できなかったフラグメントへの処理を設定します。
SetZFailOperation(StencilOp value)1068     void SetZFailOperation(StencilOp value)
1069     {
1070         enum { CMD_SHIFT = 4, CMD_MASK = 0x7 };
1071 
1072         internal::SetCmdValue( &ref().m_CommandBuffer[2], value, CMD_MASK, CMD_SHIFT );
1073     }
1074 
1075     //! @brief ステンシルテストを通過し、デプステストを通過または非実施のフラグメントへの処理を取得します。
GetPassOperation()1076     StencilOp GetPassOperation() const
1077     {
1078         enum { CMD_SHIFT = 8, CMD_MASK = 0x7 };
1079 
1080         return static_cast<StencilOp>(internal::GetCmdValue( ref().m_CommandBuffer[2], CMD_MASK, CMD_SHIFT ));
1081     }
1082 
1083     //! @brief ステンシルテストを通過し、デプステストを通過または非実施のフラグメントへの処理を設定します。
SetPassOperation(StencilOp value)1084     void SetPassOperation(StencilOp value)
1085     {
1086         enum { CMD_SHIFT = 8, CMD_MASK = 0x7 };
1087 
1088         internal::SetCmdValue( &ref().m_CommandBuffer[2], value, CMD_MASK, CMD_SHIFT );
1089     }
1090 };
1091 
1092 //--------------------------------------------------------------------------
1093 //! @brief  フラグメントオペレーションを表すバイナリリソースクラスです。
1094 //---------------------------------------------------------------------------
1095 class ResFragmentOperation : public nw::ut::ResCommon< ResFragmentOperationData >
1096 {
1097 public:
1098     NW_RES_CTOR( ResFragmentOperation )
1099 
1100     //! @brief フラグメントオペレーションモードです。
1101     enum FragmentOperationMode
1102     {
1103         FRAGMENT_OPERATION_MODE_GL = 0,
1104         FRAGMENT_OPERATION_MODE_GAS = 1,
1105         FRAGMENT_OPERATION_MODE_SHADOW = 3
1106     };
1107 
1108     //! @brief フラグメントオペレーションモードを設定します。
SetFragmentOperationMode(FragmentOperationMode value)1109     void SetFragmentOperationMode(FragmentOperationMode value)
1110     {
1111         enum { CMD_SHIFT = 0, CMD_MASK = 0x3 };
1112 
1113         ResBlendOperation blendOperation = GetBlendOperation();
1114         NW_ASSERT(blendOperation.IsValid());
1115 
1116         internal::SetCmdValue( &blendOperation.ref().m_CommandBuffer[0], value, CMD_MASK, CMD_SHIFT );
1117     }
1118 
1119     //! @brief フラグメントオペレーションモードを取得します。
GetFragmentOperationMode()1120     FragmentOperationMode GetFragmentOperationMode() const
1121     {
1122         enum { CMD_SHIFT = 0, CMD_MASK = 0x3 };
1123 
1124         ResBlendOperation blendOperation = GetBlendOperation();
1125         NW_ASSERT(blendOperation.IsValid());
1126 
1127         return static_cast<FragmentOperationMode>(internal::GetCmdValue( blendOperation.ref().m_CommandBuffer[0], CMD_MASK, CMD_SHIFT ));
1128     }
1129 
1130     //---------------------------------------------------------------------------
1131     //! @fn           ResDepthOperationData & GetDepthOperationData()
1132     //! @brief        デプスオペレーションのデータを取得します。
1133     //---------------------------------------------------------------------------
1134     //---------------------------------------------------------------------------
1135     //! @fn           ResDepthOperation GetDepthOperation()
1136     //! @brief        デプスオペレーションのデータを取得します。
1137     //---------------------------------------------------------------------------
1138     NW_RES_FIELD_RESSTRUCT_DECL( ResDepthOperation, DepthOperation )         // GetDepthOperation(), GetDepthOperationData()
1139 
1140     //---------------------------------------------------------------------------
1141     //! @fn           ResBlendOperationData & GetBlendOperationData()
1142     //! @brief        ブレンドオペレーションのデータを取得します。
1143     //---------------------------------------------------------------------------
1144     //---------------------------------------------------------------------------
1145     //! @fn           ResBlendOperation GetBlendOperation()
1146     //! @brief        ブレンドオペレーションのデータを取得します。
1147     //---------------------------------------------------------------------------
1148     NW_RES_FIELD_RESSTRUCT_DECL( ResBlendOperation, BlendOperation )         // GetBlendOperation(), GetBlendOperationData()
1149 
1150     //---------------------------------------------------------------------------
1151     //! @fn           ResStencilOperationData & GetStencilOperationData()
1152     //! @brief        ステンシルオペレーションのデータを取得します。
1153     //---------------------------------------------------------------------------
1154     //---------------------------------------------------------------------------
1155     //! @fn           ResStencilOperation GetStencilOperation()
1156     //! @brief        ステンシルオペレーションのデータを取得します。
1157     //---------------------------------------------------------------------------
1158     NW_RES_FIELD_RESSTRUCT_DECL( ResStencilOperation, StencilOperation )     // GetStencilOperation(), GetStencilOperationData()
1159 };
1160 
1161 //--------------------------------------------------------------------------
1162 //! @brief  テクスチャ座標の設定や変換情報を表すバイナリリソースクラスです。
1163 //---------------------------------------------------------------------------
1164 class ResTextureCoordinator : public nw::ut::ResCommon< ResTextureCoordinatorData >
1165 {
1166 public:
1167 
1168     //! @brief      テクスチャマッピングの方法です。
1169     enum MappingMethod
1170     {
1171         MAPPINGMETHOD_UV_COORDINATE,        //!< テクスチャ座標です。
1172         MAPPINGMETHOD_CAMERA_CUBE_ENV,      //!< カメラキューブ座標です。
1173         MAPPINGMETHOD_CAMERA_SPHERE_ENV,    //!< カメラスフィア座標です。
1174         MAPPINGMETHOD_PROJECTION,           //!< 投影します。
1175         MAPPINGMETHOD_SHADOW,               //!< シャドウ用の投影です。
1176         MAPPINGMETHOD_SHADOW_CUBE           //!< シャドウキューブ用の投影です。
1177     };
1178 
1179     //! @brief      テクスチャ座標の計算方法です。
1180     enum MappingMatrixMode
1181     {
1182         MAPPINGMATRIXMODE_MAYA,             //!< Maya 方式です。
1183         MAPPINGMATRIXMODE_SOFTIMAGE,        //!< Softimage 方式です。
1184         MAPPINGMATRIXMODE_3DSMAX            //!< 3ds max 方式です。
1185     };
1186 
NW_RES_CTOR(ResTextureCoordinator)1187     NW_RES_CTOR( ResTextureCoordinator )
1188 
1189     //! @brief テクスチャのスケールを取得します。
1190     const nw::math::VEC2& GetScale() const
1191     {
1192         return this->ref().m_Scale;
1193     }
1194 
1195     //! @brief テクスチャのスケールを設定します。
1196     //!        TextureMatrix を再計算する Dirty フラグを立てます。
SetScale(const nw::math::VEC2 & scale)1197     void SetScale(const nw::math::VEC2& scale)
1198     {
1199         if (this->ref().m_Scale != scale)
1200         {
1201             this->ref().m_Scale.Set(scale.x, scale.y);
1202             this->SetDirty(true);
1203         }
1204     }
1205 
1206     //! @brief テクスチャの回転を取得します。
GetRotate()1207     f32 GetRotate()
1208     {
1209         return this->ref().m_Rotate;
1210     }
1211 
1212     //! @brief テクスチャの回転を設定します。
1213     //!        TextureMatrix を再計算する Dirty フラグを立てます。
SetRotate(f32 rotate)1214     void SetRotate(f32 rotate)
1215     {
1216         if (this->ref().m_Rotate != rotate)
1217         {
1218             this->ref().m_Rotate = rotate;
1219             this->SetDirty(true);
1220         }
1221     }
1222 
1223     //! @brief テクスチャの平行移動を取得します。
GetTranslate()1224     const nw::math::VEC2& GetTranslate() const
1225     {
1226         return this->ref().m_Translate;
1227     }
1228 
1229     //! @brief テクスチャの平行移動を設定します。
1230     //!        TextureMatrix を再計算する Dirty フラグを立てます。
SetTranslate(const nw::math::VEC2 & translate)1231     void SetTranslate(const nw::math::VEC2& translate)
1232     {
1233         if (this->ref().m_Translate != translate)
1234         {
1235             this->ref().m_Translate.Set(translate.x, translate.y);
1236             this->SetDirty(true);
1237         }
1238     }
1239 
1240     //---------------------------------------------------------------------------
1241     //! @fn           s32 GetSourceCoordinate() const
1242     //! @brief        ソースとなるテクスチャ座標の番号を取得します。
1243     //---------------------------------------------------------------------------
1244     //---------------------------------------------------------------------------
1245     //! @fn           void SetSourceCoordinate(s32 value)
1246     //! @brief        ソースとなるテクスチャ座標の番号を設定します。
1247     //---------------------------------------------------------------------------
1248     NW_RES_FIELD_PRIMITIVE_DECL( s32, SourceCoordinate )         // GetSourceCoordinate(), SetSourceCoordinate()
1249 
1250     //---------------------------------------------------------------------------
1251     //! @fn           MappingMethod GetMappingMethod() const
1252     //! @brief        テクスチャマッピングの方法を取得します。
1253     //---------------------------------------------------------------------------
1254     //---------------------------------------------------------------------------
1255     //! @fn           void SetMappingMethod(MappingMethod value)
1256     //! @brief        テクスチャマッピングの方法を設定します。
1257     //!               テクスチャマッピングの方法を変更した場合は ResTextureSampler::SetSamplerType() を用いてサンプラータイプを変更してください。
1258     //---------------------------------------------------------------------------
1259     NW_RES_FIELD_PRIMITIVE_DECL( MappingMethod, MappingMethod )  // GetMappingMethod(), SetMappingMethod()
1260 
1261     //---------------------------------------------------------------------------
1262     //! @fn           s32 GetReferenceCamera() const
1263     //! @brief        参照するカメラの番号を取得します。
1264     //---------------------------------------------------------------------------
1265     //---------------------------------------------------------------------------
1266     //! @fn           void SetReferenceCamera(s32 value)
1267     //! @brief        参照するカメラの番号を設定します。
1268     //---------------------------------------------------------------------------
1269     NW_RES_FIELD_PRIMITIVE_DECL( s32, ReferenceCamera )          // GetReferenceCamera(), SetReferenceCamera()
1270 
1271     //---------------------------------------------------------------------------
1272     //! @fn           MappingMatrixMode GetMatrixMode() const
1273     //! @brief        テクスチャ座標計算の方法を取得します。
1274     //---------------------------------------------------------------------------
1275     //---------------------------------------------------------------------------
1276     //! @fn           void SetMatrixMode(MappingMatrixMode value)
1277     //! @brief        テクスチャ座標計算の方法を設定します。
1278     //---------------------------------------------------------------------------
1279     NW_RES_FIELD_PRIMITIVE_DECL( MappingMatrixMode, MatrixMode ) // GetMatrixMode(), SetMatrixMode()
1280 
1281     //---------------------------------------------------------------------------
1282     //! @fn           bool IsDirty() const
1283     //! @brief        ダーティフラグを取得します。
1284     //---------------------------------------------------------------------------
1285     //---------------------------------------------------------------------------
1286     //! @fn           void SetDirty(bool value)
1287     //! @brief        ダーティフラグを設定します。
1288     //---------------------------------------------------------------------------
1289     NW_RES_FIELD_BOOL_PRIMITIVE_DECL( Dirty )                    // IsDirty(), SetDirty()
1290 
1291     //---------------------------------------------------------------------------
1292     //! @fn           bool IsEnabled() const
1293     //! @brief        有効・無効フラグを取得します。
1294     //---------------------------------------------------------------------------
1295     //---------------------------------------------------------------------------
1296     //! @fn           void SetEnabled(bool value)
1297     //! @brief        有効・無効フラグを設定します。
1298     //---------------------------------------------------------------------------
1299     NW_RES_FIELD_BOOL_PRIMITIVE_DECL( Enabled )                  // IsEnabled(), SetEnabled()
1300 
1301     //---------------------------------------------------------------------------
1302     //! @fn           nw::math::MTX34 & GetTextureMatrix()
1303     //! @brief        テクスチャ行列を取得します。
1304     //---------------------------------------------------------------------------
1305     //---------------------------------------------------------------------------
1306     //! @fn           void SetTextureMatrix(const nw::math::MTX34 & value)
1307     //! @brief        テクスチャ行列を設定します。
1308     //---------------------------------------------------------------------------
1309     NW_RES_FIELD_STRUCT_DECL( nw::math::MTX34, TextureMatrix )   // GetTextureMatrix()
1310 };
1311 //--------------------------------------------------------------------------
1312 //! @brief  マテリアルを表すバイナリリソースクラスです。
1313 //---------------------------------------------------------------------------
1314 class ResMaterial : public ResSceneObject
1315 {
1316 public:
1317     enum { TYPE_INFO = NW_GFX_RES_TYPE_INFO(ResMaterial) };
1318     enum { SIGNATURE = NW_RES_SIGNATURE32('MTOB') };
1319     enum { BINARY_REVISION = REVISION_RES_MATERIAL };
1320 
1321     //! @brief テクスチャコーディネータの設定です。
1322     //!
1323     //!         どのテクスチャコーディネータを割り当てるかを設定します。
1324     //!         テクスチャ 0 、テクスチャ 1 、テクスチャ 2 、プロシージャルテクスチャの順で表します。
1325     enum TextureCoordinateConfig
1326     {
1327         CONFIG_0120,    //!< 0 1 2 0 です。
1328         CONFIG_0110,    //!< 0 1 1 0 です。
1329         CONFIG_0111,    //!< 0 1 1 1 です。
1330         CONFIG_0112,    //!< 0 1 1 2 です。
1331         CONFIG_0121,    //!< 0 1 2 1 です。
1332         CONFIG_0122,    //!< 0 1 2 2 です。
1333         CONFIG_NUM      //!< 使用しません。
1334     };
1335 
1336     //! @brief 描画レイヤーです。
1337     enum TranslucencyKind
1338     {
1339         TRANSLUCENCY_KIND_LAYER0,   //!< レイヤー 0 ( 不透明メッシュとして描画 ) です。
1340         TRANSLUCENCY_KIND_LAYER1,   //!< レイヤー 2 ( 半透明メッシュとして描画 ) です。
1341         TRANSLUCENCY_KIND_LAYER2,   //!< レイヤー 3 ( 減算合成メッシュとして描画 ) です。
1342         TRANSLUCENCY_KIND_LAYER3,   //!< レイヤー 4 ( 加算合成メッシュとして描画 ) です。
1343         TRANSLUCENCY_KIND_OPAQUE = TRANSLUCENCY_KIND_LAYER0,        //!< TRANSLUCENCY_KIND_LAYER0 と同じです。
1344         TRANSLUCENCY_KIND_TRANSLUCENT = TRANSLUCENCY_KIND_LAYER1,   //!< TRANSLUCENCY_KIND_LAYER1 と同じです。
1345         TRANSLUCENCY_KIND_SUBTRACTIVE = TRANSLUCENCY_KIND_LAYER2,   //!< TRANSLUCENCY_KIND_LAYER2 と同じです。
1346         TRANSLUCENCY_KIND_ADDITIVE = TRANSLUCENCY_KIND_LAYER3,      //!< TRANSLUCENCY_KIND_LAYER3 と同じです。
1347 
1348         TRANSLUCENCY_KIND_END = TRANSLUCENCY_KIND_LAYER3   //!< 最後の描画レイヤーです。
1349     };
1350 
NW_RES_CTOR_INHERIT(ResMaterial,ResSceneObject)1351     NW_RES_CTOR_INHERIT( ResMaterial, ResSceneObject )
1352 
1353     //---------------------------------------------------------------------------
1354     //! @fn           u32 GetFlags() const
1355     //! @brief        フラグの値を取得します。
1356     //---------------------------------------------------------------------------
1357     //---------------------------------------------------------------------------
1358     //! @fn           void SetFlags(u32 value)
1359     //! @brief        フラグの値を設定します。
1360     //!               設定されなかったフラグは無効になります。
1361     //---------------------------------------------------------------------------
1362     //---------------------------------------------------------------------------
1363     //! @fn           void EnableFlags(u32 value)
1364     //! @brief        指定された Flag の値を有効にします。
1365     //!               設定されなかったフラグは変更されません。
1366     //---------------------------------------------------------------------------
1367     //---------------------------------------------------------------------------
1368     //! @fn           void DisableFlags(u32 value)
1369     //! @brief        指定された Flag の値を無効にします。
1370     //!               設定されなかったフラグは変更されません。
1371     //---------------------------------------------------------------------------
1372     NW_RES_FIELD_FLAGS_DECL( u32, Flags )               // GetFlags(), SetFlags(), EnableFlags(), DisableFlags()
1373 
1374     //---------------------------------------------------------------------------
1375     //! @fn           void SetTextureCoordinateConfig(TextureCoordinateConfig value)
1376     //! @brief        テクスチャの座標のユニット割当設定を設定します。
1377     //---------------------------------------------------------------------------
1378     //---------------------------------------------------------------------------
1379     //! @fn           TextureCoordinateConfig GetTextureCoordinateConfig() const
1380     //! @brief        テクスチャの座標のユニット割当設定を取得します。
1381     //---------------------------------------------------------------------------
1382     NW_RES_FIELD_PRIMITIVE_DECL( TextureCoordinateConfig, TextureCoordinateConfig )     // GetTextureCoordinateConfig(), SetTextureCoordinateConfig()
1383 
1384     //---------------------------------------------------------------------------
1385     //! @fn           TranslucencyKind GetTranslucencyKind() const
1386     //! @brief        透明性の種類を取得します。
1387     //---------------------------------------------------------------------------
1388     //---------------------------------------------------------------------------
1389     //! @fn           void SetTranslucencyKind(TranslucencyKind value)
1390     //! @brief        透明性の種類を設定します。
1391     //---------------------------------------------------------------------------
1392     NW_RES_FIELD_PRIMITIVE_DECL( TranslucencyKind, TranslucencyKind )     // GetTranslucencyKind(), SetTranslucencyKind()
1393 
1394     //---------------------------------------------------------------------------
1395     //! @fn           ResMaterialColorData & GetMaterialColorData()
1396     //! @brief        マテリアルカラーを取得します。
1397     //---------------------------------------------------------------------------
1398     //---------------------------------------------------------------------------
1399     //! @fn           ResMaterialColor GetMaterialColor()
1400     //! @brief        マテリアルカラーを取得します。
1401     //---------------------------------------------------------------------------
1402     NW_RES_FIELD_RESSTRUCT_DECL( ResMaterialColor, MaterialColor )  // GetMaterialColor(), GetMaterialColorData()
1403 
1404     //---------------------------------------------------------------------------
1405     //! @fn           ResRasterizationData & GetRasterizationData()
1406     //! @brief        ラスタライゼーションを取得します。
1407     //---------------------------------------------------------------------------
1408     //---------------------------------------------------------------------------
1409     //! @fn           ResRasterization GetRasterization()
1410     //! @brief        ラスタライゼーションを取得します。
1411     //---------------------------------------------------------------------------
1412     NW_RES_FIELD_RESSTRUCT_DECL( ResRasterization, Rasterization )  // GetRasterization(), GetRasterizationData()
1413 
1414     //---------------------------------------------------------------------------
1415     //! @fn           ResFragmentOperationData & GetFragmentOperationData()
1416     //! @brief        フラグメントオペレーションを取得します。
1417     //---------------------------------------------------------------------------
1418     //---------------------------------------------------------------------------
1419     //! @fn           ResFragmentOperation GetFragmentOperation()
1420     //! @brief        フラグメントオペレーションを取得します。
1421     //---------------------------------------------------------------------------
1422     NW_RES_FIELD_RESSTRUCT_DECL( ResFragmentOperation, FragmentOperation )              // GetFragmentOperation(), GetFragmentOperationData()
1423 
1424     //---------------------------------------------------------------------------
1425     //! @fn           s32 GetActiveTextureCoordinatorsCount() const
1426     //! @brief        テクスチャコーディネータの有効な数を取得します。
1427     //---------------------------------------------------------------------------
1428     //---------------------------------------------------------------------------
1429     //! @fn           void SetActiveTextureCoordinatorsCount(s32 value)
1430     //! @brief        テクスチャコーディネータの有効な数を設定します。
1431     //---------------------------------------------------------------------------
1432     NW_RES_FIELD_PRIMITIVE_DECL( s32, ActiveTextureCoordinatorsCount )   // SetActiveTextureCoordinatorsCount() GetActiveTextureCoordinatorsCount()
1433 
1434     //---------------------------------------------------------------------------
1435     //! @fn           ResTextureCoordinatorData & GetTextureCoordinatorsData(int idx)
1436     //! @brief        テクスチャコーディネータの配列を取得します。
1437     //---------------------------------------------------------------------------
1438     //---------------------------------------------------------------------------
1439     //! @fn           s32 GetTextureCoordinatorsCount() const
1440     //! @brief        テクスチャコーディネータの要素数を取得します。
1441     //---------------------------------------------------------------------------
1442     //---------------------------------------------------------------------------
1443     //! @fn           ResTextureCoordinator GetTextureCoordinators(int idx)
1444     //! @brief        テクスチャコーディネータを取得します。
1445     //---------------------------------------------------------------------------
1446     NW_RES_FIELD_STRUCT_FIXED_LIST_DECL( ResTextureCoordinator, TextureCoordinators )   // GetTextureCoordinators(int idx), GetTextureCoodinatorsData(), GetTextureCoordinatorsData(int idx), GetTextureCoordinatorsCount()
1447 
1448     //---------------------------------------------------------------------------
1449     //! @fn           s32 GetTextureMappersCount() const
1450     //! @brief        テクスチャマッパーの要素数を取得します。
1451     //---------------------------------------------------------------------------
1452     //---------------------------------------------------------------------------
1453     //! @fn           ResPixelBasedTextureMapper GetTextureMappers(int idx)
1454     //! @brief        テクスチャマッパーを取得します。
1455     //---------------------------------------------------------------------------
1456     NW_RES_FIELD_CLASS_FIXED_LIST_DECL( ResPixelBasedTextureMapper, TextureMappers )    // GetTextureMappers(int idx), GetTextureMappersCount()
1457 
1458     //---------------------------------------------------------------------------
1459     //! @fn           ResProceduralTextureMapper GetProceduralTextureMapper()
1460     //! @brief        プロシージャルテクスチャユニットのマッパーを取得します。
1461     //---------------------------------------------------------------------------
1462     NW_RES_FIELD_CLASS_DECL( ResProceduralTextureMapper, ProceduralTextureMapper )      // GetProceduralTextureMapper()
1463 
1464     //---------------------------------------------------------------------------
1465     //! @fn           ResShader GetShader()
1466     //! @brief        シェーダーを取得します。
1467     //---------------------------------------------------------------------------
1468     NW_RES_FIELD_CLASS_DECL( ResShader, Shader )                    // GetShader()
1469 
1470     //---------------------------------------------------------------------------
1471     //! @fn           ResFragmentShader GetFragmentShader()
1472     //! @brief        フラグメントシェーダーを取得します。
1473     //---------------------------------------------------------------------------
1474     NW_RES_FIELD_CLASS_DECL( ResFragmentShader, FragmentShader )    // GetFragmentShader()
1475 
1476     //---------------------------------------------------------------------------
1477     //! @fn           s32 GetShaderProgramDescriptionIndex() const
1478     //! @brief        シェーダープログラムのインデックスを取得します。
1479     //---------------------------------------------------------------------------
1480     //---------------------------------------------------------------------------
1481     //! @fn           void SetShaderProgramDescriptionIndex(s32 value)
1482     //! @brief        シェーダープログラムのインデックスを設定します。
1483     //---------------------------------------------------------------------------
1484     NW_RES_FIELD_PRIMITIVE_DECL( s32, ShaderProgramDescriptionIndex ) // GetShaderProgramDescriptionIndex()
1485 
1486     //---------------------------------------------------------------------------
1487     //! @fn           s32 GetShaderParametersCount() const
1488     //! @brief        シェーダーパラメータの要素数を取得します。
1489     //---------------------------------------------------------------------------
1490     //---------------------------------------------------------------------------
1491     //! @fn           ResShaderParameter GetShaderParameters(int idx)
1492     //! @brief        シェーダーパラメータを取得します。
1493     //---------------------------------------------------------------------------
1494     NW_RES_FIELD_CLASS_LIST_DECL( ResShaderParameter, ShaderParameters ) // GetParameters(int idx), GetParametersCount()
1495 
1496     //---------------------------------------------------------------------------
1497     //! @fn           s32 GetLightSetIndex() const
1498     //! @brief        ライトセットのインデクスを取得します。
1499     //---------------------------------------------------------------------------
1500     //---------------------------------------------------------------------------
1501     //! @fn           void SetLightSetIndex(s32 value)
1502     //! @brief        ライトセットのインデクスを設定します。
1503     //---------------------------------------------------------------------------
1504     NW_RES_FIELD_PRIMITIVE_DECL( s32, LightSetIndex ) // GetLightSetIndex(), SetLightSetIndex()
1505 
1506     //---------------------------------------------------------------------------
1507     //! @fn           s32 GetFogIndex() const
1508     //! @brief        フォグのインデクスを取得します。
1509     //---------------------------------------------------------------------------
1510     //---------------------------------------------------------------------------
1511     //! @fn           void SetFogIndex(s32 value)
1512     //! @brief        フォグのインデクスを設定します。
1513     //---------------------------------------------------------------------------
1514     NW_RES_FIELD_PRIMITIVE_DECL( s32, FogIndex ) // GetFogIndex(), SetFogIndex()
1515 
1516     NW_RES_FIELD_PRIMITIVE_DECL( u32, ShadingParameterHash ) // GetShadingParameterHash(), SetShadingParameterHash()
1517     NW_RES_FIELD_PRIMITIVE_DECL( u32, ShaderParametersHash ) // GetShaderParametersHash(), SetShaderParametersHash()
1518     NW_RES_FIELD_PRIMITIVE_DECL( u32, TextureCoordinatorsHash ) // GetTextureCoordinatorsHash(), SetTextureCoordinatorsHash()
1519     NW_RES_FIELD_PRIMITIVE_DECL( u32, TextureSamplersHash ) // GetTextureSamplersHash(), SetTextureSamplersHash()
1520     NW_RES_FIELD_PRIMITIVE_DECL( u32, TextureMappersHash ) // GetTextureMappersHash(), SetTextureMappersHash()
1521     NW_RES_FIELD_PRIMITIVE_DECL( u32, MaterialColorHash ) // GetMaterialColorHash(), SetMaterialColorHash()
1522     NW_RES_FIELD_PRIMITIVE_DECL( u32, RasterizationHash ) // GetRasterizationHash(), SetRasterizationHash()
1523     NW_RES_FIELD_PRIMITIVE_DECL( u32, FragmentLightingHash ) // GetFragmentLightingHash(), SetFragmentLightingHash()
1524     NW_RES_FIELD_PRIMITIVE_DECL( u32, FragmentLightingTableHash ) // GetFragmentLightingTableHash(), SetFragmentLightingTableHash()
1525     NW_RES_FIELD_PRIMITIVE_DECL( u32, FragmentLightingTableParametersHash ) // GetFragmentLightingTableParametersHash(), SetFragmentLightingTableParametersHash()
1526     NW_RES_FIELD_PRIMITIVE_DECL( u32, AlphaTestHash ) // GetAlphaTestHash(), SetAlphaTestHash()
1527     NW_RES_FIELD_PRIMITIVE_DECL( u32, TextureCombinersHash ) // GetTextureCombinersHash(), SetTextureCombinersHash()
1528     NW_RES_FIELD_PRIMITIVE_DECL( u32, FragmentOperationHash ) // GetFragmentOperationHash(), SetFragmentOperationHash()
1529 
1530     //---------------------------------------------------------------------------
1531     //! @fn           u32 GetMaterialId() const
1532     //! @brief        描画ソートに使用するマテリアルIDを取得します。
1533     //---------------------------------------------------------------------------
1534     //---------------------------------------------------------------------------
1535     //! @fn           void SetMaterialId(u32 value)
1536     //! @brief        描画ソートに使用するマテリアルIDを設定します。
1537     //---------------------------------------------------------------------------
1538     NW_RES_FIELD_PRIMITIVE_DECL( u32, MaterialId ) // GetMaterialId(), SetMaterialId()
1539 
1540     //! @brief マテリアルバイナリのリビジョンを取得します。
1541     //!
1542     //! @return マテリアルバイナリのリビジョンを返します。
1543     u32 GetRevision() const { return this->GetHeader().revision; }
1544 
1545     //---------------------------------------------------------------------------
1546     //! @brief        リソースの初期化処理をおこないます。
1547     //!
1548     //! @param[in]    allocator アロケータです。
1549     //! @param[in]    graphicsFile グラフィックスリソースです。
1550     //---------------------------------------------------------------------------
1551     Result Setup(os::IAllocator* allocator, ResGraphicsFile graphicsFile);
1552 
1553     //---------------------------------------------------------------------------
1554     //! @brief        リソースの後始末をおこないます。
1555     //---------------------------------------------------------------------------
1556     void Cleanup();
1557 
1558     //! @brief セットアップ済みのシェーダーを設定します。
1559     //!
1560     //! @param[in] resShader 設定するシェーダーです。
1561     //!
1562     void SetShader(ResShader resShader);
1563 
1564     //! @brief targetName で参照しているテクスチャを、 texture で強制的に置き換えます。
1565     //!
1566     void ForceSetupTexture(const char* targetName, ResTexture texture);
1567 
1568     //! @brief 参照しているシェーダを、 shader で強制的に置き換えます。
1569     //!        SetShaderと異なり、内部でsetup時の処理を行います。
1570     //!
1571     void ForceSetupShader(const char* targetName, ResShader resShader);
1572 
1573     //! @brief FragmentShader 内部の Lut を、 lut で強制的に置き換えます。
1574     //!        targetNameで参照解決を行っている LookupTable が対象です。
1575     void ForceSetupLookupTable(const char* targetName, ResLookupTable lut);
1576 
1577     //---------------------------------------------------------------------------
1578     //! @fn           void SetMaterialColorHash(u32 value)
1579     //! @details      :private
1580     //---------------------------------------------------------------------------
1581     //---------------------------------------------------------------------------
1582     //! @fn           void SetFragmentOperationHash(u32 value)
1583     //! @details      :private
1584     //---------------------------------------------------------------------------
1585     //---------------------------------------------------------------------------
1586     //! @fn           void SetFragmentLightingTableParametersHash(u32 value)
1587     //! @details      :private
1588     //---------------------------------------------------------------------------
1589     //---------------------------------------------------------------------------
1590     //! @fn           void SetFragmentLightingTableHash(u32 value)
1591     //! @details      :private
1592     //---------------------------------------------------------------------------
1593     //---------------------------------------------------------------------------
1594     //! @fn           void SetFragmentLightingHash(u32 value)
1595     //! @details      :private
1596     //---------------------------------------------------------------------------
1597     //---------------------------------------------------------------------------
1598     //! @fn           void SetAlphaTestHash(u32 value)
1599     //! @details      :private
1600     //---------------------------------------------------------------------------
1601     //---------------------------------------------------------------------------
1602     //! @fn           u32 GetTextureSamplersHash() const
1603     //! @details      :private
1604     //---------------------------------------------------------------------------
1605     //---------------------------------------------------------------------------
1606     //! @fn           u32 GetTextureMappersHash() const
1607     //! @details      :private
1608     //---------------------------------------------------------------------------
1609     //---------------------------------------------------------------------------
1610     //! @fn           u32 GetTextureCoordinatorsHash() const
1611     //! @details      :private
1612     //---------------------------------------------------------------------------
1613     //---------------------------------------------------------------------------
1614     //! @fn           u32 GetTextureCombinersHash() const
1615     //! @details      :private
1616     //---------------------------------------------------------------------------
1617     //---------------------------------------------------------------------------
1618     //! @fn           u32 GetShadingParameterHash() const
1619     //! @details      :private
1620     //---------------------------------------------------------------------------
1621     //---------------------------------------------------------------------------
1622     //! @fn           u32 GetFragmentOperationHash() const
1623     //! @details      :private
1624     //---------------------------------------------------------------------------
1625     //---------------------------------------------------------------------------
1626     //! @fn           u32 GetMaterialColorHash() const
1627     //! @details      :private
1628     //---------------------------------------------------------------------------
1629     //---------------------------------------------------------------------------
1630     //! @fn           u32 GetRasterizationHash() const
1631     //! @details      :private
1632     //---------------------------------------------------------------------------
1633     //---------------------------------------------------------------------------
1634     //! @fn           u32 GetFragmentLightingTableParametersHash() const
1635     //! @details      :private
1636     //---------------------------------------------------------------------------
1637     //---------------------------------------------------------------------------
1638     //! @fn           u32 GetFragmentLightingTableHash() const
1639     //! @details      :private
1640     //---------------------------------------------------------------------------
1641     //---------------------------------------------------------------------------
1642     //! @fn           u32 GetFragmentLightingHash() const
1643     //! @details      :private
1644     //---------------------------------------------------------------------------
1645     //---------------------------------------------------------------------------
1646     //! @fn           u32 GetAlphaTestHash() const
1647     //! @details      :private
1648     //---------------------------------------------------------------------------
1649     //---------------------------------------------------------------------------
1650     //! @fn           void SetTextureSamplersHash(u32 value)
1651     //! @details      :private
1652     //---------------------------------------------------------------------------
1653     //---------------------------------------------------------------------------
1654     //! @fn           void SetTextureMappersHash(u32 value)
1655     //! @details      :private
1656     //---------------------------------------------------------------------------
1657     //---------------------------------------------------------------------------
1658     //! @fn           void SetTextureCoordinatorsHash(u32 value)
1659     //! @details      :private
1660     //---------------------------------------------------------------------------
1661     //---------------------------------------------------------------------------
1662     //! @fn           void SetTextureCombinersHash(u32 value)
1663     //! @details      :private
1664     //---------------------------------------------------------------------------
1665     //---------------------------------------------------------------------------
1666     //! @fn           void SetShadingParameterHash(u32 value)
1667     //! @details      :private
1668     //---------------------------------------------------------------------------
1669     //---------------------------------------------------------------------------
1670     //! @fn           void SetRasterizationHash(u32 value)
1671     //! @details      :private
1672     //---------------------------------------------------------------------------
1673     //---------------------------------------------------------------------------
1674     //! @fn           void SetShaderParametersHash(u32 value)
1675     //! @details      :private
1676     //---------------------------------------------------------------------------
1677     //---------------------------------------------------------------------------
1678     //! @fn           u32 GetShaderParametersHash() const
1679     //! @details      :private
1680     //---------------------------------------------------------------------------
1681 private:
1682     //! @brief シェーダーをセットアップします。
1683     Result SetupShader(os::IAllocator* allocator, ResShader resShader, ResGraphicsFile graphicsFile);
1684 
1685     //! @brief テクスチャをセットアップします。
1686     Result SetupTextures(os::IAllocator* allocator, ResMaterial resMaterial, ResGraphicsFile graphicsFile);
1687 
1688     //! @brief シェーダーシンボルへのインデックスをキャッシュします。
1689     //!
1690     //! @param[in] symbols キャッシュを行うシェーダーシンボルの配列です。
1691     //!
1692     void CacheUserUniformIndex(ResShaderSymbolArray symbols);
1693 
1694     //! @brief フラグメントライティングテーブルをセットアップします。
1695     Result SetupFragmentLightingTable(os::IAllocator* allocator, ResFragmentLightingTable resLightingTable, ResGraphicsFile graphicsFile);
1696 
1697     //! @brief フラグメントライティングのハッシュを計算します。
1698     void CalcFragmentLightingTableHash();
1699 };
1700 typedef nw::ut::ResArrayPatricia<ResMaterial>::type ResMaterialArray;
1701 typedef nw::ut::ResArrayPatricia<const ResMaterial>::type ResMaterialArrayConst;
1702 
1703 } // namespace res
1704 } // namespace gfx
1705 } // namespace nw
1706 
1707 #endif // NW_GFX_RESMATERIAL_H_
1708