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