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