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