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