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