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