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