1 /*---------------------------------------------------------------------------*
2   Project:  NintendoWare
3   File:     gfx_RenderContext.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: 26943 $
14  *---------------------------------------------------------------------------*/
15 
16 #ifndef NW_GFX_RENDERCONTEXT_H_
17 #define NW_GFX_RENDERCONTEXT_H_
18 
19 #include <GLES2/gl2.h>
20 
21 #include <nw/types.h>
22 #include <nw/os/os_Memory.h>
23 #include <nw/ut/ut_Color.h>
24 #include <nw/ut/ut_MoveArray.h>
25 #include <nw/gfx/gfx_GfxObject.h>
26 #include <nw/gfx/res/gfx_ResShape.h>
27 #include <nw/gfx/res/gfx_ResModel.h>
28 #include <nw/gfx/gfx_GraphicsDevice.h>
29 #include <nw/gfx/gfx_CommandUtil.h>
30 #include <nw/gfx/gfx_Model.h>
31 #include <nw/gfx/gfx_Material.h>
32 #include <nw/gfx/gfx_SceneEnvironment.h>
33 #include <nw/gfx/gfx_SceneEnvironmentSetting.h>
34 
35 namespace nw
36 {
37 namespace gfx
38 {
39 
40 class IRenderTarget;
41 class Camera;
42 class Model;
43 class LookupTableCache;
44 class Light;
45 class FragmentLight;
46 class VertexLight;
47 class AmbientLight;
48 class HemiSphereLight;
49 class Fog;
50 class ShaderProgram;
51 
52 //---------------------------------------------------------------------------
53 //! @brief        描画プロセスを制御する情報を格納するクラスです。
54 //---------------------------------------------------------------------------
55 class RenderContext : public GfxObject
56 {
57 private:
58     NW_DISALLOW_COPY_AND_ASSIGN(RenderContext);
59 
60 public:
61 
62     //! @details :private
63     enum
64     {
65         DEFAULT_MAX_CAMERAS = 32, //!< カメラのデフォルト最大数です。
66         DEFAULT_MAX_LIGHT_SETS = 128, //!< ライトセットのデフォルト最大数です。
67         DEFAULT_MAX_FOGS = 32, //!< フォグのデフォルト最大数です。
68         ATTRIBUTE_SCALES_VECTOR_COUNT = 3,
69         VERTEX_LIGHT_SET_COUNT = 6,
70         VERTEX_LIGHT_AMBIENT = 0,
71         VERTEX_LIGHT_DIFFUSE = 1,
72         VERTEX_LIGHT_POSITION = 2,
73         VERTEX_LIGHT_SPOT_DIRECTION = 3,
74         VERTEX_LIGHT_DISTANCE_ATTENUATION = 4,
75         VERTEX_LIGHT_SPOT_FACTOR = 5
76     };
77 
78     //! @brief 描画モードの定義です。
79     //!
80     //!        描画モードを変更することでレンダーコンテキストの挙動を変更することができます。
81     enum RenderMode
82     {
83         //! 標準の描画モードです。
84         RENDERMODE_DEFAULT = 0,
85         //! マテリアルの設定を無視します。
86         RENDERMODE_IGNORE_MATERIAL = 0x1 << 0
87     };
88 
89     //! @brief リセットを行うステートの定義です。
90     //!
91     //!        ResetState の引数に渡すことで特定のステートのみリセットできます。
92     enum ResetStateMode
93     {
94         //! 設定されたモデルのワールド行列を表すステートです。
95         RESETSTATEMODE_MODEL_CACHE          = 0x1 << 0,
96         //! ActivateMaterial を行った場合に設定するマテリアルを表すステートです。
97         RESETSTATEMODE_MATERIAL             = 0x1 << 1,
98         //! 設定されたマテリアルを表すステートです。
99         RESETSTATEMODE_MATERIAL_CACHE       = 0x1 << 2,
100         //! 設定された描画に用いるカメラを表すステートです。
101         RESETSTATEMODE_CAMERA_CACHE         = 0x1 << 3,
102         //! 設定されたシーン環境を表すステートです。
103         RESETSTATEMODE_SCENE_ENVIRONMENT    = 0x1 << 4,
104         //! 設定されたシェーダープログラムを表すステートです。
105         RESETSTATEMODE_SHADER_PROGRAM       = 0x1 << 5,
106         //! 設定された参照テーブルを表すステートです。
107         RESETSTATEMODE_LOOK_UP_TABLE        = 0x1 << 6,
108         //! マテリアルのハッシュを表すステートです。
109         RESETSTATEMODE_HASH                 = 0x1 << 7,
110         //! 設定された頂点属性を表すステートです。
111         RESETSTATEMODE_VERTEX_ATTRIBUTE     = 0x1 << 8,
112 
113         //! 全てのステートを表します。
114         RESETSTATEMODE_ALL =
115             RESETSTATEMODE_MODEL_CACHE       |
116             RESETSTATEMODE_MATERIAL          |
117             RESETSTATEMODE_MATERIAL_CACHE    |
118             RESETSTATEMODE_CAMERA_CACHE      |
119             RESETSTATEMODE_SCENE_ENVIRONMENT |
120             RESETSTATEMODE_SHADER_PROGRAM    |
121             RESETSTATEMODE_LOOK_UP_TABLE     |
122             RESETSTATEMODE_HASH              |
123             RESETSTATEMODE_VERTEX_ATTRIBUTE
124     };
125 
126     struct MaterialHash
127     {
MaterialHashMaterialHash128         MaterialHash()
129         {
130             ResetMaterialHash(Model::MULTI_FLAG_BUFFER_MATERIAL);
131         }
132 
133         u32 shaderParameter;
134         u32 shadingParameter;
135         u32 materialColor;
136         u32 rasterization;
137         u32 textureCoordinator;
138         u32 textureMapper;
139         u32 fragmentLighting;
140         u32 fragmentLightingTable;
141         u32 textureCombiner;
142         u32 fragmentOperation;
143         u32 alphaTest;
144 
145         //! @brief マテリアルのハッシュを無効化します。
146         //!
147         //! @param[in] hashMask リセットを行うハッシュを表すマスクです。
148         //!
149         NW_INLINE void ResetMaterialHash(s32 hashMask);
150     };
151 
152     //! @brief 頂点属性の配列です。
153     typedef ut::FixedSizeArray<ResVertexAttribute, VERTEX_ATTRIBUTE_COUNT> VertexAttributeArray;
154 
155     //! @brief 頂点属性のスケール値の配列です。
156     typedef ut::FixedSizeArray<math::VEC4, ATTRIBUTE_SCALES_VECTOR_COUNT> AttributeScaleArray;
157 
158     //----------------------------------------
159     //! @name 作成
160     //@{
161 
162     //! @brief レンダーコンテキストを構築するためのクラスです。
163     class Builder
164     {
165     public:
166         //! @brief コンストラクタです。
Builder()167         Builder()
168         :
169         m_MaxCameras(DEFAULT_MAX_CAMERAS),
170         m_MaxLightSets(DEFAULT_MAX_LIGHT_SETS),
171         m_MaxFogs(DEFAULT_MAX_FOGS),
172         m_MaxVertexLights(LightSet::DEFAULT_MAX_VERTEX_LIGHTS),
173         m_ParticleMaterialActivator(NULL)
174         {}
175 
176         //! @brief デストラクタです。
~Builder()177         ~Builder() {}
178 
179         //! @brief カメラの最大数を設定します。
MaxCameras(int maxCamera)180         Builder& MaxCameras(int maxCamera) { m_MaxCameras = maxCamera; return *this; }
181 
182         //! @brief ライトセットの最大数を設定します。
MaxLights(s32 max)183         Builder& MaxLights(s32 max) { m_MaxLightSets = max; return *this; }
184 
185         //! @brief フォグの最大数を設定します。
MaxFogs(s32 max)186         Builder& MaxFogs(s32 max) { m_MaxFogs = max; return *this; }
187 
188         //! @brief 頂点ライトの最大数を設定します。
MaxVertexLights(int maxVertexLights)189         Builder& MaxVertexLights(int maxVertexLights) { m_MaxVertexLights = maxVertexLights; return *this; }
190 
191         //! @brief パーティクル用マテリアルの有効化クラスを設定します。
192         //!
193         //!        RenderContext に所有権を移動しますので注意してください。
ParticleMaterialActivator(IMaterialActivator * particleMaterialActivator)194         Builder& ParticleMaterialActivator(IMaterialActivator* particleMaterialActivator)
195         {
196             m_ParticleMaterialActivator = particleMaterialActivator;
197             return *this;
198         }
199 
200         //! @brief        レンダーコンテキストを生成します。
201         //!
202         //! @param[in]    allocator  使用するアロケータを指定します。
203         //!
204         //! @return       生成されたレンダーコンテキストです。
205         //!
206         RenderContext* Create(os::IAllocator* allocator);
207 
208     private:
209         int m_MaxCameras;
210         int m_MaxLightSets;
211         int m_MaxFogs;
212         int m_MaxVertexLights;
213         IMaterialActivator* m_ParticleMaterialActivator;
214     };
215 
216     //@}
217 
218     //----------------------------------------
219     //! @name 基本的な描画
220     //@{
221 
222     //! @brief        描画対象を設定します。
223     //!
224     //! @param[in]    renderTarget 描画対象です。
225     //! @param[in]    viewport ビューポートです。
226     //!
227     void SetRenderTarget(IRenderTarget* renderTarget, const Viewport& viewport);
228 
229     //! @brief        描画対象を設定します。
230     //!
231     //! @param[in]    renderTarget 描画対象です。
232     //!
233     void SetRenderTarget(IRenderTarget* renderTarget);
234 
235     //! @brief 描画環境を初期化します。各フレームの描画後に呼び出すことを推奨します。
236     //!
237     void ResetState();
238 
239     //! @brief 描画環境を初期化します。各フレームの描画後に呼び出すことを推奨します。
240     //!
241     //! @param[in] resetStateMode ResetStateMode でリセットを行うステートを指定します。
242     //! @param[in] hashMask リセットを行うハッシュを表すマスクです。
243     //!
244     void ResetState(s32 resetStateMode, s32 hashMask);
245 
246     //! @brief 描画環境を初期化します。各フレームの描画開始時に呼び出すことを推奨します。
247     //!        廃止予定ですので、void ResetState(s32 resetStateMode, s32 hashMask) を使用してください。
248     //!
249     //! @param[in] hashMask リセットを行うハッシュを表すマスクです。
250     //!
251     NW_DEPRECATED_FUNCTION(void ResetState(s32 hashMask));
252 
253     //! @brief        バッファをクリアします。
254     //!
255     //! @param[in]    mask
256     //! @param[in]    color
257     //! @param[in]    depth
258     //!
259     void ClearBuffer(GLbitfield mask, const nw::ut::FloatColor& color, f32 depth);
260 
261     //! @brief レンダーターゲットを取得します。
GetRenderTarget()262     IRenderTarget* GetRenderTarget() { return this->m_RenderTarget; }
263 
264     //! @brief レンダーターゲットを取得します。
GetRenderTarget()265     const IRenderTarget* GetRenderTarget() const { return this->m_RenderTarget; }
266 
267     //! @brief        コンテキストを有効化します。
268     //!
269     //! @details      レンダーコンテキストに設定されている
270     //!               ライト・カメラ・フォグ・マテリアルを有効化します。
271     //!
272     void ActivateContext();
273 
274     //! @brief        パーティクル版のコンテキストを有効化します。
275     //!               パーティクルを有効にする場合は必ずこちらを呼び出してください。
276     //!
277     //! @details      レンダーコンテキストに設定されている
278     //!               ライト・カメラ・フォグ・マテリアルを有効化します。
279     //!
280     void ActivateParticleContext();
281 
282     //! @brief        プリミティブを描画します。
283     //!
284     //! @param[in]    primitive   プリミティブです。
285     //!
286     void RenderPrimitive(ResPrimitive primitive);
287 
288     //@}
289 
290     //----------------------------------------
291     //! @name 描画内容設定・取得
292     //@{
293 
294     //! @brief        インデックスを指定してカメラを有効にします。
295     //!
296     //!               ライトや環境マップの計算に用いられます。
297     //!               ResetState でリセットされますので、毎フレーム設定を行う必要があります。
298     //!
299     //! @param[in]    index 設定するカメラのインデックス番号です。
300     //!
SetActiveCamera(int index)301     void SetActiveCamera(int index)
302     {
303         NW_MINMAXLT_ASSERT(index, 0, m_SceneEnvironment.m_Cameras.size());
304 
305         Camera* camera = m_SceneEnvironment.m_Cameras[index];
306         m_SceneEnvironment.m_CameraIndex = index;
307 
308         if (m_SceneEnvironment.m_Camera != camera)
309         {
310             m_SceneEnvironment.m_Camera = camera;
311             m_SceneEnvironment.m_CameraDirty = true;
312 
313             // wScale を設定します。
314             GraphicsDevice::SetWScale(camera->GetWScale());
315         }
316     }
317 
318     //! @brief        現在有効なカメラを取得します。
GetActiveCamera()319     Camera* GetActiveCamera()
320     {
321         return m_SceneEnvironment.m_Camera;
322     }
323 
324     //! @brief        現在有効なカメラを取得します。
GetActiveCamera()325     const Camera* GetActiveCamera() const
326     {
327         return m_SceneEnvironment.m_Camera;
328     }
329 
330     //! @brief        現在有効なカメラインデクスを取得します。
GetActiveCameraIndex()331     s32 GetActiveCameraIndex() const
332     {
333         return m_SceneEnvironment.m_CameraIndex;
334     }
335 
336     //! @brief        カメラのマトリクスを設定します。
337     //!
338     //! 内部でカメラをキャッシュして、同じカメラを設定した場合は、
339     //! マトリクスの設定を行わない最適化を行います。
340     //!
341     //! @param camera 設定するカメラクラスです。
342     //! @param isForce キャッシュを無視して強制的に設定します。
343     //!
344     void SetCameraMatrix(Camera* camera, bool isForce = false);
345 
346     //! @brief        モデルのマトリクスを設定します。
347     //!
348     //! 内部でモデルをキャッシュして、同じモデルを設定した場合は、
349     //! マトリクスの設定を行わない最適化を行います。
350     //!
351     //! @param[in]    model 設定するモデルクラスです。
352     //!
353     void SetModelMatrix(Model* model);
354 
355     //! @brief        モデルのキャッシュを取得します。
356     //!
357     //! @return       モデルキャッシュのポインタを返します。
358     //!
GetModelCache()359     Model* GetModelCache() { return this->m_ModelCache; }
360 
361     //! @brief        モデルのキャッシュを取得します。
362     //!
363     //! @return       モデルキャッシュのポインタを返します。
364     //!
GetModelCache()365     const Model* GetModelCache() const { return this->m_ModelCache; }
366 
367     //! @brief        マテリアルを取得します。
368     //!
369     //! @return       マテリアルのポインタを返します。
GetMaterial()370     Material* GetMaterial() { return this->m_Material; }
371 
372     //! @brief        マテリアルを取得します。
373     //!
374     //! @return       マテリアルのポインタを返します。
GetMaterial()375     const Material* GetMaterial() const { return this->m_Material; }
376 
377     //! @brief        マテリアルを設定します。
378     //!
379     //! @param[in]    material 設定するマテリアルです。
380     //!
SetMaterial(Material * material)381     void SetMaterial(Material* material)
382     {
383         NW_NULL_ASSERT(material);
384         m_Material = material;
385     }
386 
387     //! @brief        マテリアルのキャッシュを取得します。
388     //!
389     //! 最後に ActivateMaterial を行ったマテリアルです。
390     //!
391     //! @return       マテリアルキャッシュのポインタを返します。
GetMaterialCache()392     Material* GetMaterialCache() { return this->m_MaterialCache; }
393 
394     //! @brief        マテリアルのキャッシュを取得します。
395     //!
396     //! 最後に ActivateMaterial を行ったマテリアルです。
397     //!
398     //! @return       マテリアルキャッシュのポインタを返します。
GetMaterialCache()399     const Material* GetMaterialCache() const { return this->m_MaterialCache; }
400 
401     //! @brief        シェーダープログラムを取得します。
402     //!
403     //! @return       シェーダープログラムを返します。
GetShaderProgram()404     ShaderProgram* GetShaderProgram() { return this->m_ShaderProgram.Get(); }
405 
406     //! @brief        シェーダープログラムを取得します。
407     //!
408     //! @return       シェーダープログラムを返します。
GetShaderProgram()409     const ShaderProgram* GetShaderProgram() const { return this->m_ShaderProgram.Get(); }
410 
411     //! @brief        レンダーコンテキストに設定された環境を取得します。
GetSceneEnvironment()412     SceneEnvironment& GetSceneEnvironment()
413     {
414         return this->m_SceneEnvironment;
415     }
416 
417     //! @brief        レンダーコンテキストに設定された環境を取得します。
GetSceneEnvironment()418     const SceneEnvironment& GetSceneEnvironment() const
419     {
420         return this->m_SceneEnvironment;
421     }
422 
423     //! @brief マトリクスパレットの数を設定します。
SetMatrixPaletteCount(int count)424     void SetMatrixPaletteCount(int count) { m_MatrixPaletteCount = count; }
425 
426     //! @brief マテリアルハッシュを取得します。
SetMaterialHash(const MaterialHash & materialHash)427     void SetMaterialHash(const MaterialHash& materialHash) { this->m_MaterialHash = materialHash; }
428 
429     //! @brief マテリアルハッシュを取得します。
GetMaterialHash()430     MaterialHash GetMaterialHash() { return this->m_MaterialHash; }
431 
432     //! @brief マテリアルハッシュを取得します。
GetMaterialHash()433     const MaterialHash* GetMaterialHash() const { return &this->m_MaterialHash; }
434 
435     //! @brief 描画モードを取得します。
GetRenderMode()436     u32 GetRenderMode() const
437     {
438         return this->m_RenderMode;
439     }
440 
441     //! @brief 描画モードを設定します。
SetRenderMode(u32 renderMode)442     void SetRenderMode(u32 renderMode)
443     {
444         this->m_RenderMode = renderMode;
445     }
446 
447 
448     //! @brief シェーダープログラムが変更されているかどうかのフラグを取得します。
IsShaderProgramDirty()449     bool IsShaderProgramDirty() const
450     {
451         return this->m_IsShaderProgramDirty;
452     }
453 
454 #ifdef NW_GFX_MODEL_TRANSLATE_OFFSET_ENABLED
455     //! @brief モデルの平行移動値に加えるオフセット値を取得または設定します。
ModelTranslateOffset()456     math::VEC3& ModelTranslateOffset()
457     {
458         return m_ModelTranslateOffset;
459     }
460 
461     //! @brief モデルの平行移動値に加えるオフセット値を取得します。
ModelTranslateOffset()462     const math::VEC3& ModelTranslateOffset() const
463     {
464         return m_ModelTranslateOffset;
465     }
466 #endif
467 
468     //---------------------------------------------------------------------------
469     //! @brief        頂点属性の設定を GPU に設定します。
470     //!
471     //! @param[in]    mesh    描画対象のメッシュデータです。
472     //---------------------------------------------------------------------------
473     void ActivateVertexAttribute( ResMesh mesh );
474 
475     //---------------------------------------------------------------------------
476     //! @brief        GPU の頂点属性を無効に設定します。
477     //!
478     //! @param[in]    mesh    描画対象のメッシュデータです。
479     //---------------------------------------------------------------------------
480     void DeactivateVertexAttribute( ResMesh mesh );
481 
482     //@}
483 
484 private:
485     static const ut::FloatColor NULL_AMBIENT;
486 
487     //! @brief コンストラクタです。
488     RenderContext(
489         nw::os::IAllocator* pAllocator,
490         GfxPtr<ShaderProgram> shaderProgram,
491         GfxPtr<IMaterialActivator> particleMaterialActivator,
492         const SceneEnvironment::Description& description);
493 
494     //! @brief InverseScale と MatrixCount の値を更新します。
495     void ActivateInverseScaleAndMatrixCount();
496 
497     //! @brief シェーダープログラムを有効化します。
498     void ActivateShaderProgram();
499 
500     //! @brief 環境設定を有効化します。
501     void ActivateSceneEnvironment();
502 
503     //! @brief マテリアルを有効化します。
ActivateMaterial()504     void ActivateMaterial()
505     {
506         if (!ut::CheckFlag(m_RenderMode, RenderContext::RENDERMODE_IGNORE_MATERIAL))
507         {
508             IMaterialActivator* materialActivator = this->m_Material->GetOwnerModel()->GetMaterialActivator();
509             NW_NULL_ASSERT(materialActivator);
510             materialActivator->Activate(this, this->m_Material);
511         }
512     }
513 
514     //! @brief パーティクル版の簡易マテリアルを有効化します。
ActivateParticleMaterial()515     void ActivateParticleMaterial()
516     {
517         if (!ut::CheckFlag(m_RenderMode, RenderContext::RENDERMODE_IGNORE_MATERIAL))
518         {
519             m_ParticleMaterialActivator.Get()->Activate(this, this->m_Material);
520         }
521     }
522 
523     //! @brief フォグを有効にします。
524     void ActivateFog();
525 
526     //! @brief アンビエントライトを有効化します。
527     void ActivateAmbientLight();
528 
529     //! @brief 半球ライトを有効化します。
530     void ActivateHemiSphereLight();
531 
532     //! @brief フラグメントライトを有効化します。
533     void ActivateFragmentLights();
534 
535     //! @brief フラグメントライトを有効化します。
536     void ActivateFragmentLight(int index, const FragmentLight* light);
537 
538     //! @brief 頂点ライトを有効化します。
539     void ActivateVertexLights();
540 
541     //! @brief 頂点ライトを有効化します。
542     void ActivateVertexLight(int index, const VertexLight* light);
543 
544     //! @brief ベクトルをビュー座標系に変換します。
545     void TransformToViewCoordinate(
546         math::VEC4* out,
547         const math::MTX34* view,
548         const math::VEC4* v);
549 
550     //! @brief インデックス番号を LUT のテクスチャインデックスの定義に変換します。
ToLutTexture(s32 index)551     u32 ToLutTexture(s32 index)
552     {
553         NW_ASSERT(0 <= index && index < LOOKUP_TABLE_COUNT);
554         return index + GL_LUT_TEXTURE0_DMP;
555     }
556 
557     NW_INLINE GLuint ToPrimitiveModeGL(u8 mode, bool isGeometryShaderEnabled);
558 
559     GfxPtr<ShaderProgram> m_ShaderProgram;
560 
561     s32 m_MatrixPaletteCount;
562     bool m_IsVertexAlphaEnabled;
563     bool m_IsBoneWeightWEnabled;
564     bool m_IsVertexAttributeDirty;
565     bool m_IsShaderProgramDirty;
566 
567     u32 m_RenderMode;
568 
569     IRenderTarget* m_RenderTarget;
570     Model* m_ModelCache;
571     Material* m_Material;
572     Material* m_MaterialCache;
573     Camera* m_CameraCache;
574 
575     SceneEnvironment m_SceneEnvironment;
576 
577     MaterialHash m_MaterialHash;
578     GfxPtr<IMaterialActivator> m_ParticleMaterialActivator;
579 
580 #ifdef NW_GFX_MODEL_TRANSLATE_OFFSET_ENABLED
581     math::VEC3 m_ModelTranslateOffset;
582 #endif
583 };
584 
585 
586 //----------------------------------------
587 NW_INLINE void
ResetMaterialHash(s32 hashMask)588 RenderContext::MaterialHash::ResetMaterialHash(s32 hashMask)
589 {
590     NW_UNUSED_VARIABLE(hashMask);
591     const u32 resetValue = ~(0x0);
592 
593     if (ut::CheckFlag(hashMask, Model::FLAG_BUFFER_SHADER_PARAMETER))
594     {
595         shaderParameter = resetValue;
596     }
597 
598     if (ut::CheckFlag(hashMask, Model::FLAG_BUFFER_SHADING_PARAMETER))
599     {
600         shadingParameter = resetValue;
601     }
602 
603     if (ut::CheckFlag(hashMask, Model::FLAG_BUFFER_MATERIAL_COLOR))
604     {
605         materialColor = resetValue;
606     }
607 
608     if (ut::CheckFlag(hashMask, Model::FLAG_BUFFER_RASTERIZATION))
609     {
610         rasterization = resetValue;
611     }
612 
613     if (ut::CheckFlag(hashMask, Model::FLAG_BUFFER_TEXTURE_COORDINATOR))
614     {
615         textureCoordinator = resetValue;
616     }
617 
618     if (ut::CheckFlag(hashMask, Model::FLAG_BUFFER_TEXTURE_MAPPER))
619     {
620         textureMapper = resetValue;
621     }
622 
623     if (ut::CheckFlag(hashMask, Model::FLAG_BUFFER_FRAGMENT_LIGHTING))
624     {
625         fragmentLighting = resetValue;
626     }
627 
628     if (ut::CheckFlag(hashMask, Model::FLAG_BUFFER_FRAGMENT_LIGHTING_TABLE))
629     {
630         fragmentLightingTable = resetValue;
631     }
632 
633     if (ut::CheckFlag(hashMask, Model::FLAG_BUFFER_TEXTURE_COMBINER))
634     {
635         textureCombiner = resetValue;
636     }
637 
638     if (ut::CheckFlag(hashMask, Model::FLAG_BUFFER_FRAGMENT_OPERATION))
639     {
640         fragmentOperation = resetValue;
641     }
642 
643     if (ut::CheckFlag(hashMask, Model::FLAG_BUFFER_ALPHA_TEST))
644     {
645         alphaTest = resetValue;
646     }
647 }
648 
649 //---------------------------------------------------------------------------
650 //! @brief        GL のモードを取得します。
651 //!
652 //! @param[in]    mode 描画モードです。
653 //! @param[in]    isGeometryShaderEnabled ジオメトリシェーダーが有効かどうかを指定します。
654 //!
655 //! @return       GL のモードです。
656 //---------------------------------------------------------------------------
657 NW_INLINE GLuint
ToPrimitiveModeGL(u8 mode,bool isGeometryShaderEnabled)658 RenderContext::ToPrimitiveModeGL(u8 mode, bool isGeometryShaderEnabled)
659 {
660     static const GLuint PRIM_MODE_TABLE[] =
661     {
662         GL_TRIANGLES,              // Triangles
663         GL_TRIANGLE_STRIP,         // TriangleStrip
664         GL_TRIANGLE_FAN            // TriangleFan
665     };
666 
667     NW_ASSERT( mode < (sizeof(PRIM_MODE_TABLE) / sizeof(GLuint)) );
668 
669     GLuint glMode = PRIM_MODE_TABLE[ mode ];
670     if (isGeometryShaderEnabled)
671     {
672         glMode = GL_GEOMETRY_PRIMITIVE_DMP;
673     }
674 
675     return glMode;
676 }
677 
678 //---------------------------------------------------------------------------
679 NW_INLINE void
DeactivateVertexAttribute(ResMesh mesh)680 RenderContext::DeactivateVertexAttribute( ResMesh mesh )
681 {
682     NW_NULL_ASSERT( mesh.ref().m_DeactivateCommandCache );
683 
684     internal::NWUseCmdlist( mesh.ref().m_DeactivateCommandCache, mesh.ref().m_DeactivateCommandCacheSize );
685 }
686 
687 
688 } // namespace gfx
689 } // namespace nw
690 
691 #endif // NW_GFX_RENDERCONTEXT_H_
692