1 /*---------------------------------------------------------------------------* 2 Project: NintendoWare 3 File: gfx_SceneContext.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: 28045 $ 14 *---------------------------------------------------------------------------*/ 15 16 #ifndef NW_GFX_SCENECONTEXT_H_ 17 #define NW_GFX_SCENECONTEXT_H_ 18 19 #include <nw/gfx/gfx_GfxObject.h> 20 21 namespace nw 22 { 23 namespace gfx 24 { 25 26 class SceneNode; 27 class Model; 28 class SkeletalModel; 29 class Light; 30 class FragmentLight; 31 class VertexLight; 32 class HemiSphereLight; 33 class AmbientLight; 34 class Camera; 35 class Fog; 36 class ParticleSet; 37 class ParticleEmitter; 38 class ParticleModel; 39 class LightSet; 40 41 //! @brief シーンノードの Array の定義です。 42 typedef ut::MoveArray<SceneNode*> SceneNodeArray; 43 44 //! @brief モデルの Array の定義です。 45 typedef ut::MoveArray<Model*> ModelArray; 46 47 //! @brief スケルタルモデルの Array の定義です。 48 typedef ut::MoveArray<SkeletalModel*> SkeletalModelArray; 49 50 //! @brief ライトの Array の定義です。 51 typedef ut::MoveArray<Light*> LightArray; 52 53 //! @brief フラグメントライトの Array の定義です。 54 typedef ut::MoveArray<FragmentLight*> FragmentLightArray; 55 56 //! @brief 頂点ライトの Array の定義です。 57 typedef ut::MoveArray<VertexLight*> VertexLightArray; 58 59 //! @brief 半球ライトの Array の定義です。 60 typedef ut::MoveArray<HemiSphereLight*> HemiSphereLightArray; 61 62 //! @brief アンビエントライトの Array の定義です。 63 typedef ut::MoveArray<AmbientLight*> AmbientLightArray; 64 65 //! @brief カメラの Array の定義です。 66 typedef ut::MoveArray<Camera*> CameraArray; 67 68 //! @brief フォグの Array の定義です。 69 typedef ut::MoveArray<Fog*> FogArray; 70 71 //! @brief パーティクルセットの Array の定義です。 72 typedef ut::MoveArray<ParticleSet*> ParticleSetArray; 73 74 //! @brief パーティクルエミッタの Array の定義です。 75 typedef ut::MoveArray<ParticleEmitter*> ParticleEmitterArray; 76 77 //! @brief パーティクルモデルの Array の定義です。 78 typedef ut::MoveArray<ParticleModel*> ParticleModelArray; 79 80 //! @brief ライトセットの配列です。 81 typedef ut::MoveArray<LightSet*> LightSetArray; 82 83 //! @brief アニメーションするノードの Array の定義です。 84 typedef ut::MoveArray<SceneNode*> AnimatableNodeArray; 85 86 //--------------------------------------------------------------------------- 87 //! @brief シーン解析時の内容を保持させるためのクラスです。 88 //--------------------------------------------------------------------------- 89 class SceneContext : public GfxObject 90 { 91 private: 92 NW_DISALLOW_COPY_AND_ASSIGN(SceneContext); 93 94 public: 95 96 // [非推奨] 互換性のために残してありますが、こちらの定義は用いないでください。 97 98 //! @details :private 99 typedef SceneNodeArray SceneNodeArray; 100 //! @details :private 101 typedef ModelArray ModelArray; 102 //! @details :private 103 typedef SkeletalModelArray SkeletalModelArray; 104 //! @details :private 105 typedef FragmentLightArray FragmentLightArray; 106 //! @details :private 107 typedef VertexLightArray VertexLightArray; 108 //! @details :private 109 typedef HemiSphereLightArray HemiSphereLightArray; 110 //! @details :private 111 typedef AmbientLightArray AmbientLightArray; 112 //! @details :private 113 typedef CameraArray CameraArray; 114 //! @details :private 115 typedef FogArray FogArray; 116 //! @details :private 117 typedef ParticleSetArray ParticleSetArray; 118 //! @details :private 119 typedef ParticleEmitterArray ParticleEmitterArray; 120 //! @details :private 121 typedef ParticleModelArray ParticleModelArray; 122 123 enum 124 { 125 DEFAULT_MAX_SCENE_NODES = 64, //!< シーンノードのデフォルト最大数です。 126 DEFAULT_MAX_MODELS = 64, //!< モデルのデフォルト最大数です。 127 DEFAULT_MAX_SKELETAL_MODELS = 64, //!< スケルタルモデルのデフォルト最大数です。 128 DEFAULT_MAX_CAMERAS = 4, //!< カメラのデフォルト最大数です。 129 DEFAULT_MAX_LIGHTS = 8, //!< フラグメントライトのデフォルト最大数です。 130 DEFAULT_MAX_FRAGMENT_LIGHTS = 8, //!< フラグメントライトのデフォルト最大数です。 131 DEFAULT_MAX_VERTEX_LIGHTS = 8, //!< 頂点ライトのデフォルト最大数です。 132 DEFAULT_MAX_HEMISPHERE_LIGHTS = 4, //!< 半球ライトのデフォルト最大数です。 133 DEFAULT_MAX_AMBIENT_LIGHTS = 4, //!< アンビエントライトのデフォルト最大数です。 134 DEFAULT_MAX_FOGS = 4, //!< フォグのデフォルト最大数です。 135 DEFAULT_MAX_PARTICLESETS = 64, //!< パーティクルセットのデフォルト最大数です。 136 DEFAULT_MAX_PARTICLEEMITTERS = 64, //!< パーティクルエミッタのデフォルト最大数です。 137 DEFAULT_MAX_PARTICLEMODELS = 64, //!< パーティクルモデルのデフォルト最大数です。 138 DEFAULT_MAX_ANIMATABLE_NODES = 64 //!< アニメーションを行うシーンノードのデフォルト最大数です。 139 }; 140 141 //---------------------------------------- 142 //! @name 作成 143 //@{ 144 145 //! @brief シーンコンテキストクラスを構築するためのクラスです。 146 //! 147 //! IsFixedSizeMemory の初期値は true です。false に変更すると、各種最大数の設定は無視されます。 148 class Builder 149 { 150 public: Builder()151 Builder() 152 : m_IsFixedSizeMemory(true), 153 m_MaxSceneNodes(DEFAULT_MAX_SCENE_NODES), 154 m_MaxModels(DEFAULT_MAX_MODELS), 155 m_MaxSkeletalModels(DEFAULT_MAX_SKELETAL_MODELS), 156 m_MaxCameras(DEFAULT_MAX_CAMERAS), 157 m_MaxLights(DEFAULT_MAX_LIGHTS), 158 m_MaxFragmentLights(DEFAULT_MAX_FRAGMENT_LIGHTS), 159 m_MaxVertexLights(DEFAULT_MAX_VERTEX_LIGHTS), 160 m_MaxHemiSphereLights(DEFAULT_MAX_HEMISPHERE_LIGHTS), 161 m_MaxAmbientLights(DEFAULT_MAX_AMBIENT_LIGHTS), 162 m_MaxFogs(DEFAULT_MAX_FOGS), 163 m_MaxParticleSets(DEFAULT_MAX_PARTICLESETS), 164 m_MaxParticleEmitters(DEFAULT_MAX_PARTICLEEMITTERS), 165 m_MaxParticleModels(DEFAULT_MAX_PARTICLEMODELS), 166 m_MaxAnimatableNodes(DEFAULT_MAX_ANIMATABLE_NODES) 167 {} 168 169 //! @brief 生成時以外にもメモリを確保するかどうかのフラグを設定します。 170 //! 171 //! true を指定すると、生成時のみ固定サイズのメモリ確保を行います。 172 //! 173 //! false を指定すると、生成時以外にも必要に応じて動的にメモリ確保が行われます。 IsFixedSizeMemory(bool isFixedSizeMemory)174 Builder& IsFixedSizeMemory(bool isFixedSizeMemory) 175 { 176 m_IsFixedSizeMemory = isFixedSizeMemory; 177 return *this; 178 } 179 180 //! @brief シーンノードの最大数を設定します。 MaxSceneNodes(s32 max)181 Builder& MaxSceneNodes(s32 max) { m_MaxSceneNodes = max; return *this; } 182 183 //! @brief モデルの最大数を設定します。 MaxModels(s32 max)184 Builder& MaxModels(s32 max) { m_MaxModels = max; return *this; } 185 186 //! @brief スケルタルモデルの最大数を設定します。 MaxSkeletalModels(s32 max)187 Builder& MaxSkeletalModels(s32 max) { m_MaxSkeletalModels = max; return *this; } 188 189 //! @brief カメラの最大数を設定します。 MaxCameras(s32 max)190 Builder& MaxCameras(s32 max) { m_MaxCameras = max; return *this; } 191 192 //! @brief ライトの最大数を設定します。 MaxLights(s32 max)193 Builder& MaxLights(s32 max) { m_MaxLights = max; return *this; } 194 195 //! @brief フラグメントライトの最大数を設定します。 MaxFragmentLights(s32 max)196 Builder& MaxFragmentLights(s32 max) { m_MaxFragmentLights = max; return *this; } 197 198 //! @brief 頂点ライトの最大数を設定します。 MaxVertexLights(s32 max)199 Builder& MaxVertexLights(s32 max) { m_MaxVertexLights = max; return *this; } 200 201 //! @brief 半球ライトの最大数を設定します。 MaxHemiSphereLights(s32 max)202 Builder& MaxHemiSphereLights(s32 max) { m_MaxHemiSphereLights = max; return *this; } 203 204 //! @brief アンビエントライトの最大数を設定します。 MaxAmbientLights(s32 max)205 Builder& MaxAmbientLights(s32 max) { m_MaxAmbientLights = max; return *this; } 206 207 //! @brief フォグの最大数を設定します。 MaxFogs(s32 max)208 Builder& MaxFogs(s32 max) { m_MaxFogs = max; return *this; } 209 210 //! @brief パーティクルセットの最大数を設定します。 MaxParticleSets(s32 max)211 Builder& MaxParticleSets(s32 max) { m_MaxParticleSets = max; return *this; } 212 213 //! @brief パーティクルエミッタの最大数を設定します。 MaxParticleEmitters(s32 max)214 Builder& MaxParticleEmitters(s32 max) { m_MaxParticleEmitters = max; return *this; } 215 216 //! @brief パーティクルモデルの最大数を設定します。 MaxParticleModels(s32 max)217 Builder& MaxParticleModels(s32 max) { m_MaxParticleModels = max; return *this; } 218 219 //! @brief アニメーションを行うシーンノードの最大数を設定します。 MaxAnimatableNodes(s32 max)220 Builder& MaxAnimatableNodes(s32 max) { m_MaxAnimatableNodes = max; return *this; } 221 222 //! @brief シーンコンテキストを生成します。 223 SceneContext* Create(os::IAllocator* allocator); 224 225 private: 226 bool m_IsFixedSizeMemory; 227 s32 m_MaxSceneNodes; 228 s32 m_MaxModels; 229 s32 m_MaxSkeletalModels; 230 s32 m_MaxCameras; 231 s32 m_MaxLights; 232 s32 m_MaxFragmentLights; 233 s32 m_MaxVertexLights; 234 s32 m_MaxHemiSphereLights; 235 s32 m_MaxAmbientLights; 236 s32 m_MaxFogs; 237 s32 m_MaxParticleSets; 238 s32 m_MaxParticleEmitters; 239 s32 m_MaxParticleModels; 240 s32 m_MaxAnimatableNodes; 241 }; 242 243 //@} 244 245 //---------------------------------------- 246 //! @name 更新 247 //@{ 248 249 //! シーン解析結果をクリアします。 Clear()250 void Clear() 251 { 252 m_SceneNodes.clear(); 253 m_Models.clear(); 254 m_SkeletalModels.clear(); 255 m_Lights.clear(); 256 m_FragmentLights.clear(); 257 m_VertexLights.clear(); 258 m_HemiSphereLights.clear(); 259 m_AmbientLights.clear(); 260 m_Cameras.clear(); 261 m_Fogs.clear(); 262 m_ParticleSets.clear(); 263 m_ParticleEmitters.clear(); 264 m_ParticleModels.clear(); 265 m_AnimatableNodes.clear(); 266 } 267 268 //@} 269 270 //---------------------------------------- 271 //! @name 取得/設定 272 //@{ 273 274 //! @brief 直列化シーンノードを追加します。 275 //! 276 //! @param[in] node 追加するシーンノードです。 277 //! PushSceneNode(SceneNode * node)278 void PushSceneNode(SceneNode* node) 279 { 280 bool isPushed = m_SceneNodes.push_back(node); 281 NW_ASSERT(isPushed); 282 } 283 284 //! @brief 直列化シーンノードを追加します。 285 //! 286 //! @param[in] node 追加するシーンノードです。 287 //! 288 //! @return 追加に成功すると true が返ります。 289 //! TryPushSceneNode(SceneNode * node)290 bool TryPushSceneNode(SceneNode* node) 291 { 292 bool isPushed = m_SceneNodes.push_back(node); 293 return isPushed; 294 } 295 296 //! @brief 直列化したシーンノードの先頭を指すイテレータを取得します。 297 //! 298 //! @return シーンノードの先頭を指すイテレータです。 299 //! GetSceneNodesBegin()300 SceneNodeArray::iterator GetSceneNodesBegin() 301 { 302 return m_SceneNodes.begin(); 303 } 304 305 //! @brief 直列化したシーンノードの先頭を指すイテレータを取得します。 306 //! 307 //! @return シーンノードの先頭を指すイテレータです。 308 //! GetSceneNodesBegin()309 SceneNodeArray::const_iterator GetSceneNodesBegin() const 310 { 311 return m_SceneNodes.begin(); 312 } 313 314 //! @brief 直列化したシーンノードの終端を指すイテレータを取得します。 315 //! 316 //! @return シーンノードの終端を指すイテレータです。 317 //! GetSceneNodesEnd()318 SceneNodeArray::iterator GetSceneNodesEnd() 319 { 320 return m_SceneNodes.end(); 321 } 322 323 //! @brief 直列化したシーンノードの終端を指すイテレータを取得します。 324 //! 325 //! @return シーンノードの終端を指すイテレータです。 326 //! GetSceneNodesEnd()327 SceneNodeArray::const_iterator GetSceneNodesEnd() const 328 { 329 return m_SceneNodes.end(); 330 } 331 332 //! @brief 直列化したシーンノードの先頭と終端を指すイテレータを取得します。 333 //! 334 //! @return シーンノードの先頭と終端を指すイテレータです。 335 //! GetSceneNodes()336 std::pair<SceneNodeArray::iterator, SceneNodeArray::iterator> GetSceneNodes() 337 { 338 return std::make_pair(m_SceneNodes.begin(), m_SceneNodes.end()); 339 } 340 341 //! @brief 直列化したシーンノードの先頭と終端を指すイテレータを取得します。 342 //! 343 //! @return シーンノードの先頭と終端を指すイテレータです。 344 //! GetSceneNodes()345 std::pair<SceneNodeArray::const_iterator, SceneNodeArray::const_iterator> GetSceneNodes() const 346 { 347 return std::make_pair(m_SceneNodes.begin(), m_SceneNodes.end()); 348 } 349 350 //@} 351 352 //---------------------------------------- 353 //! @name モデル関連 354 //@{ 355 356 //! @brief モデルを追加します。 357 //! 「モデル」には、派生クラス(SkeletalModelなど)も含まれます。 358 //! 359 //! @param[in] model モデルです。 360 //! PushModel(Model * model)361 void PushModel(Model* model) 362 { 363 bool isPushed = m_Models.push_back(model); 364 NW_ASSERT(isPushed); 365 } 366 367 //! @brief モデルを追加します。 368 //! 「モデル」には、派生クラス(SkeletalModelなど)も含まれます。 369 //! 370 //! @param[in] model モデルです。 371 //! 372 //! @return 追加に成功すると true が返ります。 373 //! TryPushModel(Model * model)374 bool TryPushModel(Model* model) 375 { 376 bool isPushed = m_Models.push_back(model); 377 return isPushed; 378 } 379 380 //! @brief モデルの先頭を指すイテレータを取得します。 381 //! 382 //! @return モデルの先頭を指すイテレータです。 383 //! GetModelsBegin()384 ModelArray::iterator GetModelsBegin() 385 { 386 return m_Models.begin(); 387 } 388 389 //! @brief モデルの先頭を指すイテレータを取得します。 390 //! 391 //! @return モデルの先頭を指すイテレータです。 392 //! GetModelsBegin()393 ModelArray::const_iterator GetModelsBegin() const 394 { 395 return m_Models.begin(); 396 } 397 398 //! @brief モデルの終端を指すイテレータを取得します。 399 //! 400 //! @return モデルの終端を指すイテレータです。 401 //! GetModelsEnd()402 ModelArray::iterator GetModelsEnd() 403 { 404 return m_Models.end(); 405 } 406 407 //! @brief モデルの終端を指すイテレータを取得します。 408 //! 409 //! @return モデルの終端を指すイテレータです。 410 //! GetModelsEnd()411 ModelArray::const_iterator GetModelsEnd() const 412 { 413 return m_Models.end(); 414 } 415 416 //! @brief スケルタルモデルを追加します。 417 //! 418 //! @param[in] skeletalModel スケルタルモデルです。 419 //! PushSkeletalModel(SkeletalModel * skeletalModel)420 void PushSkeletalModel(SkeletalModel* skeletalModel) 421 { 422 bool isPushed = m_SkeletalModels.push_back(skeletalModel); 423 NW_ASSERT(isPushed); 424 } 425 426 //! @brief スケルタルモデルを追加します。 427 //! 428 //! @param[in] skeletalModel スケルタルモデルです。 429 //! 430 //! @return 追加に成功すると true が返ります。 431 //! TryPushSkeletalModel(SkeletalModel * skeletalModel)432 bool TryPushSkeletalModel(SkeletalModel* skeletalModel) 433 { 434 bool isPushed = m_SkeletalModels.push_back(skeletalModel); 435 return isPushed; 436 } 437 438 //! @brief スケルタルモデルの先頭を指すイテレータを取得します。 439 //! 440 //! @return スケルタルモデルの先頭を指すイテレータです。 441 //! GetSkeletalModelsBegin()442 SkeletalModelArray::iterator GetSkeletalModelsBegin() 443 { 444 return m_SkeletalModels.begin(); 445 } 446 447 //! @brief スケルタルモデルの先頭を指すイテレータを取得します。 448 //! 449 //! @return スケルタルモデルの先頭を指すイテレータです。 450 //! GetSkeletalModelsBegin()451 SkeletalModelArray::const_iterator GetSkeletalModelsBegin() const 452 { 453 return m_SkeletalModels.begin(); 454 } 455 456 //! @brief スケルタルモデルの終端を指すイテレータを取得します。 457 //! 458 //! @return スケルタルモデルの終端を指すイテレータです。 459 //! GetSkeletalModelsEnd()460 SkeletalModelArray::iterator GetSkeletalModelsEnd() 461 { 462 return m_SkeletalModels.end(); 463 } 464 465 //! @brief スケルタルモデルの終端を指すイテレータを取得します。 466 //! 467 //! @return スケルタルモデルの終端を指すイテレータです。 468 //! GetSkeletalModelsEnd()469 SkeletalModelArray::const_iterator GetSkeletalModelsEnd() const 470 { 471 return m_SkeletalModels.end(); 472 } 473 474 //@} 475 476 //---------------------------------------- 477 //! @name ライト関連 478 //@{ 479 480 //! @brief ライトを追加します。 481 //! 「ライト」には、派生クラス(FragmentLightなど)も含まれます。 482 //! 483 //! @param[in] light ライトです。 484 //! PushLight(Light * light)485 void PushLight(Light* light) 486 { 487 bool isPushed = m_Lights.push_back(light); 488 NW_ASSERT(isPushed); 489 } 490 491 //! @brief ライトを追加します。 492 //! 「ライト」には、派生クラス(FragmentLightなど)も含まれます。 493 //! 494 //! @param[in] light ライトです。 495 //! 496 //! @return 追加に成功すると true が返ります。 497 //! TryPushLight(Light * light)498 bool TryPushLight(Light* light) 499 { 500 bool isPushed = m_Lights.push_back(light); 501 return isPushed; 502 } 503 504 //! @brief ライトの先頭を指すイテレータを取得します。 505 //! 506 //! @return ライトの先頭を指すイテレータです。 507 //! GetLightsBegin()508 LightArray::iterator GetLightsBegin() 509 { 510 return m_Lights.begin(); 511 } 512 513 //! @brief ライトの先頭を指すイテレータを取得します。 514 //! 515 //! @return ライトの先頭を指すイテレータです。 516 //! GetLightsBegin()517 LightArray::const_iterator GetLightsBegin() const 518 { 519 return m_Lights.begin(); 520 } 521 522 //! @brief ライトの終端を指すイテレータを取得します。 523 //! 524 //! @return ライトの終端を指すイテレータです。 525 //! GetLightsEnd()526 LightArray::iterator GetLightsEnd() 527 { 528 return m_Lights.end(); 529 } 530 531 //! @brief ライトの終端を指すイテレータを取得します。 532 //! 533 //! @return ライトの終端を指すイテレータです。 534 //! GetLightsEnd()535 LightArray::const_iterator GetLightsEnd() const 536 { 537 return m_Lights.end(); 538 } 539 540 //! @brief フラグメントライトを追加します。 541 //! 542 //! @param[in] light フラグメントライトです。 543 //! PushFragmentLight(FragmentLight * light)544 void PushFragmentLight(FragmentLight* light) 545 { 546 bool isPushed = m_FragmentLights.push_back(light); 547 NW_ASSERT(isPushed); 548 } 549 550 //! @brief フラグメントライトを追加します。 551 //! 552 //! @param[in] light フラグメントライトです。 553 //! 554 //! @return 追加に成功すると true が返ります。 555 //! TryPushFragmentLight(FragmentLight * light)556 bool TryPushFragmentLight(FragmentLight* light) 557 { 558 bool isPushed = m_FragmentLights.push_back(light); 559 return isPushed; 560 } 561 562 //! @brief フラグメントライトの先頭を指すイテレータを取得します。 563 //! 564 //! @return フラグメントライトの先頭を指すイテレータです。 565 //! GetFragmentLightsBegin()566 FragmentLightArray::iterator GetFragmentLightsBegin() 567 { 568 return m_FragmentLights.begin(); 569 } 570 571 //! @brief フラグメントライトの先頭を指すイテレータを取得します。 572 //! 573 //! @return フラグメントライトの先頭を指すイテレータです。 574 //! GetFragmentLightsBegin()575 FragmentLightArray::const_iterator GetFragmentLightsBegin() const 576 { 577 return m_FragmentLights.begin(); 578 } 579 580 //! @brief フラグメントライトの終端を指すイテレータを取得します。 581 //! 582 //! @return フラグメントライトの終端を指すイテレータです。 583 //! GetFragmentLightsEnd()584 FragmentLightArray::iterator GetFragmentLightsEnd() 585 { 586 return m_FragmentLights.end(); 587 } 588 589 //! @brief フラグメントライトの終端を指すイテレータを取得します。 590 //! 591 //! @return フラグメントライトの終端を指すイテレータです。 592 //! GetFragmentLightsEnd()593 FragmentLightArray::const_iterator GetFragmentLightsEnd() const 594 { 595 return m_FragmentLights.end(); 596 } 597 598 //! @brief 頂点ライトを追加します。 599 //! 600 //! @param[in] light 頂点ライトです。 601 //! PushVertexLight(VertexLight * light)602 void PushVertexLight(VertexLight* light) 603 { 604 bool isPushed = m_VertexLights.push_back(light); 605 NW_ASSERT(isPushed); 606 } 607 608 //! @brief 頂点ライトを追加します。 609 //! 610 //! @param[in] light 頂点ライトです。 611 //! 612 //! @return 追加に成功すると true が返ります。 613 //! TryPushVertexLight(VertexLight * light)614 bool TryPushVertexLight(VertexLight* light) 615 { 616 bool isPushed = m_VertexLights.push_back(light); 617 return isPushed; 618 } 619 620 //! @brief 頂点ライトの先頭を指すイテレータを取得します。 621 //! 622 //! @return 頂点ライトの先頭を指すイテレータです。 623 //! GetVertexLightsBegin()624 VertexLightArray::iterator GetVertexLightsBegin() 625 { 626 return m_VertexLights.begin(); 627 } 628 629 //! @brief 頂点ライトの先頭を指すイテレータを取得します。 630 //! 631 //! @return 頂点ライトの先頭を指すイテレータです。 632 //! GetVertexLightsBegin()633 VertexLightArray::const_iterator GetVertexLightsBegin() const 634 { 635 return m_VertexLights.begin(); 636 } 637 638 //! @brief 頂点ライトの終端を指すイテレータを取得します。 639 //! 640 //! @return 頂点ライトの終端を指すイテレータです。 641 //! GetVertexLightsEnd()642 VertexLightArray::iterator GetVertexLightsEnd() 643 { 644 return m_VertexLights.end(); 645 } 646 647 //! @brief 頂点ライトの終端を指すイテレータを取得します。 648 //! 649 //! @return 頂点ライトの終端を指すイテレータです。 650 //! GetVertexLightsEnd()651 VertexLightArray::const_iterator GetVertexLightsEnd() const 652 { 653 return m_VertexLights.end(); 654 } 655 656 //! @brief 半球ライトを追加します。 657 //! 658 //! @param[in] light 半球ライトです。 659 //! PushHemiSphereLight(HemiSphereLight * light)660 void PushHemiSphereLight(HemiSphereLight* light) 661 { 662 bool isPushed = m_HemiSphereLights.push_back(light); 663 NW_ASSERT(isPushed); 664 } 665 666 //! @brief 半球ライトを追加します。 667 //! 668 //! @param[in] light 半球ライトです。 669 //! 670 //! @return 追加に成功すると true が返ります。 671 //! TryPushHemiSphereLight(HemiSphereLight * light)672 bool TryPushHemiSphereLight(HemiSphereLight* light) 673 { 674 bool isPushed = m_HemiSphereLights.push_back(light); 675 return isPushed; 676 } 677 678 //! @brief 半球ライトの先頭を指すイテレータを取得します。 679 //! 680 //! @return 半球ライトの先頭を指すイテレータです。 681 //! GetHemiSphereLightsBegin()682 HemiSphereLightArray::iterator GetHemiSphereLightsBegin() 683 { 684 return m_HemiSphereLights.begin(); 685 } 686 687 //! @brief 半球ライトの先頭を指すイテレータを取得します。 688 //! 689 //! @return 半球ライトの先頭を指すイテレータです。 690 //! GetHemiSphereLightsBegin()691 HemiSphereLightArray::const_iterator GetHemiSphereLightsBegin() const 692 { 693 return m_HemiSphereLights.begin(); 694 } 695 696 //! @brief 半球ライトの終端を指すイテレータを取得します。 697 //! 698 //! @return 半球ライトの終端を指すイテレータです。 699 //! GetHemiSphereLightsEnd()700 HemiSphereLightArray::iterator GetHemiSphereLightsEnd() 701 { 702 return m_HemiSphereLights.end(); 703 } 704 705 //! @brief 半球ライトの終端を指すイテレータを取得します。 706 //! 707 //! @return 半球ライトの終端を指すイテレータです。 708 //! GetHemiSphereLightsEnd()709 HemiSphereLightArray::const_iterator GetHemiSphereLightsEnd() const 710 { 711 return m_HemiSphereLights.end(); 712 } 713 714 //! @brief アンビエントライトを追加します。 715 //! 716 //! @param[in] light アンビエントライトです。 717 //! PushAmbientLight(AmbientLight * light)718 void PushAmbientLight(AmbientLight* light) 719 { 720 bool isPushed = m_AmbientLights.push_back(light); 721 NW_ASSERT(isPushed); 722 } 723 724 //! @brief アンビエントライトを追加します。 725 //! 726 //! @param[in] light アンビエントライトです。 727 //! 728 //! @return 追加に成功すると true が返ります。 729 //! TryPushAmbientLight(AmbientLight * light)730 bool TryPushAmbientLight(AmbientLight* light) 731 { 732 bool isPushed = m_AmbientLights.push_back(light); 733 return isPushed; 734 } 735 736 //! @brief アンビエントライトの先頭を指すイテレータを取得します。 737 //! 738 //! @return アンビエントライトの先頭を指すイテレータです。 739 //! GetAmbientLightsBegin()740 AmbientLightArray::iterator GetAmbientLightsBegin() 741 { 742 return m_AmbientLights.begin(); 743 } 744 745 //! @brief アンビエントライトの先頭を指すイテレータを取得します。 746 //! 747 //! @return アンビエントライトの先頭を指すイテレータです。 748 //! GetAmbientLightsBegin()749 AmbientLightArray::const_iterator GetAmbientLightsBegin() const 750 { 751 return m_AmbientLights.begin(); 752 } 753 754 //! @brief アンビエントライトの終端を指すイテレータを取得します。 755 //! 756 //! @return アンビエントライトの終端を指すイテレータです。 757 //! GetAmbientLightsEnd()758 AmbientLightArray::iterator GetAmbientLightsEnd() 759 { 760 return m_AmbientLights.end(); 761 } 762 763 //! @brief アンビエントライトの終端を指すイテレータを取得します。 764 //! 765 //! @return アンビエントライトの終端を指すイテレータです。 766 //! GetAmbientLightsEnd()767 AmbientLightArray::const_iterator GetAmbientLightsEnd() const 768 { 769 return m_AmbientLights.end(); 770 } 771 772 //@} 773 774 //---------------------------------------- 775 //! @name カメラ関連 776 //@{ 777 778 //! @brief カメラを追加します。 779 //! 780 //! @param[in] camera カメラです。 781 //! PushCamera(Camera * camera)782 void PushCamera(Camera* camera) 783 { 784 bool isPushed = m_Cameras.push_back(camera); 785 NW_ASSERT(isPushed); 786 } 787 788 //! @brief カメラを追加します。 789 //! 790 //! @param[in] camera カメラです。 791 //! 792 //! @return 追加に成功すると true が返ります。 793 //! TryPushCamera(Camera * camera)794 bool TryPushCamera(Camera* camera) 795 { 796 bool isPushed = m_Cameras.push_back(camera); 797 return isPushed; 798 } 799 800 //! @brief カメラの先頭を指すイテレータを取得します。 801 //! 802 //! @return カメラの先頭を指すイテレータです。 803 //! GetCameraBegin()804 CameraArray::iterator GetCameraBegin() 805 { 806 return m_Cameras.begin(); 807 } 808 809 //! @brief カメラの先頭を指すイテレータを取得します。 810 //! 811 //! @return カメラの先頭を指すイテレータです。 812 //! GetCameraBegin()813 CameraArray::const_iterator GetCameraBegin() const 814 { 815 return m_Cameras.begin(); 816 } 817 818 //! @brief カメラの終端を指すイテレータを取得します。 819 //! 820 //! @return カメラの終端を指すイテレータです。 821 //! GetCameraEnd()822 CameraArray::iterator GetCameraEnd() 823 { 824 return m_Cameras.end(); 825 } 826 827 //! @brief カメラの終端を指すイテレータを取得します。 828 //! 829 //! @return カメラの終端を指すイテレータです。 830 //! GetCameraEnd()831 CameraArray::const_iterator GetCameraEnd() const 832 { 833 return m_Cameras.end(); 834 } 835 836 //@} 837 838 //---------------------------------------- 839 //! @name フォグ関連 840 //@{ 841 842 //! @brief フォグを追加します。 843 //! 844 //! @param[in] fog フォグです。 845 //! PushFog(Fog * fog)846 void PushFog(Fog* fog) 847 { 848 bool isPushed = m_Fogs.push_back(fog); 849 NW_ASSERT(isPushed); 850 } 851 852 //! @brief フォグを追加します。 853 //! 854 //! @param[in] fog フォグです。 855 //! 856 //! @return 追加に成功すると true が返ります。 857 //! TryPushFog(Fog * fog)858 bool TryPushFog(Fog* fog) 859 { 860 bool isPushed = m_Fogs.push_back(fog); 861 return isPushed; 862 } 863 864 //! @brief フォグの先頭を指すイテレータを取得します。 865 //! 866 //! @return フォグの先頭を指すイテレータです。 867 //! GetFogBegin()868 FogArray::iterator GetFogBegin() 869 { 870 return m_Fogs.begin(); 871 } 872 873 //! @brief フォグの先頭を指すイテレータを取得します。 874 //! 875 //! @return フォグの先頭を指すイテレータです。 876 //! GetFogBegin()877 FogArray::const_iterator GetFogBegin() const 878 { 879 return m_Fogs.begin(); 880 } 881 882 //! @brief フォグの終端を指すイテレータを取得します。 883 //! 884 //! @return フォグの終端を指すイテレータです。 885 //! GetFogEnd()886 FogArray::iterator GetFogEnd() 887 { 888 return m_Fogs.end(); 889 } 890 891 //! @brief フォグの終端を指すイテレータを取得します。 892 //! 893 //! @return フォグの終端を指すイテレータです。 894 //! GetFogEnd()895 FogArray::const_iterator GetFogEnd() const 896 { 897 return m_Fogs.end(); 898 } 899 900 //@} 901 902 //---------------------------------------- 903 //! @name パーティクルセット関連 904 //@{ 905 906 //! @brief パーティクルセットを追加します。 907 //! 908 //! @param[in] particleSet パーティクルセットです。 909 //! PushParticleSet(ParticleSet * particleSet)910 void PushParticleSet(ParticleSet* particleSet) 911 { 912 bool isPushed = m_ParticleSets.push_back(particleSet); 913 NW_ASSERT(isPushed); 914 } 915 916 //! @brief パーティクルセットを追加します。 917 //! 918 //! @param[in] particleSet パーティクルセットです。 919 //! 920 //! @return 追加に成功すると true が返ります。 921 //! TryPushParticleSet(ParticleSet * particleSet)922 bool TryPushParticleSet(ParticleSet* particleSet) 923 { 924 bool isPushed = m_ParticleSets.push_back(particleSet); 925 return isPushed; 926 } 927 928 //! @brief パーティクルセットの先頭を指すイテレータを取得します。 929 //! 930 //! @return パーティクルセットの先頭を指すイテレータです。 931 //! GetParticleSetBegin()932 ParticleSetArray::iterator GetParticleSetBegin() 933 { 934 return m_ParticleSets.begin(); 935 } 936 937 //! @brief パーティクルセットの先頭を指すイテレータを取得します。 938 //! 939 //! @return パーティクルセットの先頭を指すイテレータです。 940 //! GetParticleSetBegin()941 ParticleSetArray::const_iterator GetParticleSetBegin() const 942 { 943 return m_ParticleSets.begin(); 944 } 945 946 //! @brief パーティクルセットの終端を指すイテレータを取得します。 947 //! 948 //! @return パーティクルセットの終端を指すイテレータです。 949 //! GetParticleSetEnd()950 ParticleSetArray::iterator GetParticleSetEnd() 951 { 952 return m_ParticleSets.end(); 953 } 954 955 //! @brief パーティクルセットの終端を指すイテレータを取得します。 956 //! 957 //! @return パーティクルセットの終端を指すイテレータです。 958 //! GetParticleSetEnd()959 ParticleSetArray::const_iterator GetParticleSetEnd() const 960 { 961 return m_ParticleSets.end(); 962 } 963 964 //@} 965 966 //---------------------------------------- 967 //! @name パーティクルエミッタ関連 968 //@{ 969 970 //! @brief パーティクルエミッタを追加します。 971 //! 972 //! @param[in] particleEmitter パーティクルエミッタです。 973 //! PushParticleEmitter(ParticleEmitter * particleEmitter)974 void PushParticleEmitter(ParticleEmitter* particleEmitter) 975 { 976 bool isPushed = m_ParticleEmitters.push_back(particleEmitter); 977 NW_ASSERT(isPushed); 978 } 979 980 //! @brief パーティクルエミッタを追加します。 981 //! 982 //! @param[in] particleEmitter パーティクルエミッタです。 983 //! 984 //! @return 追加に成功すると true が返ります。 985 //! TryPushParticleEmitter(ParticleEmitter * particleEmitter)986 bool TryPushParticleEmitter(ParticleEmitter* particleEmitter) 987 { 988 bool isPushed = m_ParticleEmitters.push_back(particleEmitter); 989 return isPushed; 990 } 991 992 //! @brief パーティクルエミッタの先頭を指すイテレータを取得します。 993 //! 994 //! @return パーティクルエミッタの先頭を指すイテレータです。 995 //! GetParticleEmitterBegin()996 ParticleEmitterArray::iterator GetParticleEmitterBegin() 997 { 998 return m_ParticleEmitters.begin(); 999 } 1000 1001 //! @brief パーティクルエミッタの先頭を指すイテレータを取得します。 1002 //! 1003 //! @return パーティクルエミッタの先頭を指すイテレータです。 1004 //! GetParticleEmitterBegin()1005 ParticleEmitterArray::const_iterator GetParticleEmitterBegin() const 1006 { 1007 return m_ParticleEmitters.begin(); 1008 } 1009 1010 //! @brief パーティクルエミッタの終端を指すイテレータを取得します。 1011 //! 1012 //! @return パーティクルエミッタの終端を指すイテレータです。 1013 //! GetParticleEmitterEnd()1014 ParticleEmitterArray::iterator GetParticleEmitterEnd() 1015 { 1016 return m_ParticleEmitters.end(); 1017 } 1018 1019 //! @brief パーティクルエミッタの終端を指すイテレータを取得します。 1020 //! 1021 //! @return パーティクルエミッタの終端を指すイテレータです。 1022 //! GetParticleEmitterEnd()1023 ParticleEmitterArray::const_iterator GetParticleEmitterEnd() const 1024 { 1025 return m_ParticleEmitters.end(); 1026 } 1027 1028 //@} 1029 1030 //---------------------------------------- 1031 //! @name パーティクルモデル関連 1032 //@{ 1033 1034 //! @brief パーティクルモデルを追加します。 1035 //! 1036 //! @param[in] particleModel パーティクルモデルです。 1037 //! PushParticleModel(ParticleModel * particleModel)1038 void PushParticleModel(ParticleModel* particleModel) 1039 { 1040 bool isPushed = m_ParticleModels.push_back(particleModel); 1041 NW_ASSERT(isPushed); 1042 } 1043 1044 //! @brief パーティクルモデルを追加します。 1045 //! 1046 //! @param[in] particleModel パーティクルモデルです。 1047 //! 1048 //! @return 追加に成功すると true が返ります。 1049 //! TryPushParticleModel(ParticleModel * particleModel)1050 bool TryPushParticleModel(ParticleModel* particleModel) 1051 { 1052 bool isPushed = m_ParticleModels.push_back(particleModel); 1053 return isPushed; 1054 } 1055 1056 //! @brief パーティクルモデルの先頭を指すイテレータを取得します。 1057 //! 1058 //! @return パーティクルモデルの先頭を指すイテレータです。 1059 //! GetParticleModelBegin()1060 ParticleModelArray::iterator GetParticleModelBegin() 1061 { 1062 return m_ParticleModels.begin(); 1063 } 1064 1065 //! @brief パーティクルモデルの先頭を指すイテレータを取得します。 1066 //! 1067 //! @return パーティクルモデルの先頭を指すイテレータです。 1068 //! GetParticleModelBegin()1069 ParticleModelArray::const_iterator GetParticleModelBegin() const 1070 { 1071 return m_ParticleModels.begin(); 1072 } 1073 1074 //! @brief パーティクルモデルの終端を指すイテレータを取得します。 1075 //! 1076 //! @return パーティクルモデルの終端を指すイテレータです。 1077 //! GetParticleModelEnd()1078 ParticleModelArray::iterator GetParticleModelEnd() 1079 { 1080 return m_ParticleModels.end(); 1081 } 1082 1083 //! @brief パーティクルモデルの終端を指すイテレータを取得します。 1084 //! 1085 //! @return パーティクルモデルの終端を指すイテレータです。 1086 //! GetParticleModelEnd()1087 ParticleModelArray::const_iterator GetParticleModelEnd() const 1088 { 1089 return m_ParticleModels.end(); 1090 } 1091 1092 //@} 1093 1094 //! @name アニメーション関連 1095 //@{ 1096 1097 //! @brief アニメーションを行うノードを追加します。 1098 //! 1099 //! アニメーションを行わないノードについては、引数に渡されても無視します。 1100 //! 1101 //! @param[in] sceneNode アニメーションを行うノードです。 1102 //! PushAnimatableNode(SceneNode * sceneNode)1103 void PushAnimatableNode(SceneNode* sceneNode) 1104 { 1105 if (sceneNode->GetAnimBinding() != NULL) 1106 { 1107 bool isPushed = m_AnimatableNodes.push_back(sceneNode); 1108 NW_ASSERT(isPushed); 1109 } 1110 } 1111 1112 //! @brief アニメーションを行うノードを追加します。 1113 //! 1114 //! アニメーションを行わないノードについては、引数に渡されても無視します。 1115 //! 1116 //! @param[in] sceneNode アニメーションを行うノードです。 1117 //! 1118 //! @return 追加に成功すると true が返ります。 1119 //! TryPushAnimatableNode(SceneNode * sceneNode)1120 bool TryPushAnimatableNode(SceneNode* sceneNode) 1121 { 1122 bool isPushed = true; 1123 if (sceneNode->GetAnimBinding() != NULL) 1124 { 1125 isPushed = m_AnimatableNodes.push_back(sceneNode); 1126 } 1127 return isPushed; 1128 } 1129 1130 //! @brief アニメーションを行うノードの先頭を指すイテレータを取得します。 1131 //! 1132 //! @return アニメーションを行うノードの先頭を指すイテレータです。 1133 //! GetAnimatableNodesBegin()1134 AnimatableNodeArray::iterator GetAnimatableNodesBegin() 1135 { 1136 return m_AnimatableNodes.begin(); 1137 } 1138 1139 //! @brief アニメーションを行うノードの先頭を指すイテレータを取得します。 1140 //! 1141 //! @return アニメーションを行うノードの先頭を指すイテレータです。 1142 //! GetAnimatableNodesBegin()1143 AnimatableNodeArray::const_iterator GetAnimatableNodesBegin() const 1144 { 1145 return m_AnimatableNodes.begin(); 1146 } 1147 1148 //! @brief アニメーションを行うノードの終端を指すイテレータを取得します。 1149 //! 1150 //! @return アニメーションを行うノードの終端を指すイテレータです。 1151 //! GetAnimatableNodesEnd()1152 AnimatableNodeArray::iterator GetAnimatableNodesEnd() 1153 { 1154 return m_AnimatableNodes.end(); 1155 } 1156 1157 //! @brief アニメーションを行うノードの終端を指すイテレータを取得します。 1158 //! 1159 //! @return アニメーションを行うノードの終端を指すイテレータです。 1160 //! GetAnimatableNodesEnd()1161 AnimatableNodeArray::const_iterator GetAnimatableNodesEnd() const 1162 { 1163 return m_AnimatableNodes.end(); 1164 } 1165 1166 //@} 1167 1168 private: SceneContext(os::IAllocator * allocator,SceneNodeArray sceneNodes,ModelArray models,SkeletalModelArray skeletalModels,CameraArray cameras,FogArray fogs,LightArray lights,FragmentLightArray fragmentLights,VertexLightArray vertexLights,HemiSphereLightArray hemiSphereLights,AmbientLightArray ambientLights,ParticleSetArray particleSets,ParticleEmitterArray particleEmitters,ParticleModelArray particleModels,AnimatableNodeArray animatableNodes)1169 SceneContext( 1170 os::IAllocator* allocator, 1171 SceneNodeArray sceneNodes, 1172 ModelArray models, 1173 SkeletalModelArray skeletalModels, 1174 CameraArray cameras, 1175 FogArray fogs, 1176 LightArray lights, 1177 FragmentLightArray fragmentLights, 1178 VertexLightArray vertexLights, 1179 HemiSphereLightArray hemiSphereLights, 1180 AmbientLightArray ambientLights, 1181 ParticleSetArray particleSets, 1182 ParticleEmitterArray particleEmitters, 1183 ParticleModelArray particleModels, 1184 AnimatableNodeArray animatableNodes) 1185 : GfxObject(allocator), 1186 m_SceneNodes(sceneNodes), 1187 m_Models(models), 1188 m_SkeletalModels(skeletalModels), 1189 m_Cameras(cameras), 1190 m_Fogs(fogs), 1191 m_Lights(lights), 1192 m_FragmentLights(fragmentLights), 1193 m_VertexLights(vertexLights), 1194 m_HemiSphereLights(hemiSphereLights), 1195 m_AmbientLights(ambientLights), 1196 m_ParticleSets(particleSets), 1197 m_ParticleEmitters(particleEmitters), 1198 m_ParticleModels(particleModels), 1199 m_AnimatableNodes(animatableNodes) 1200 {} ~SceneContext()1201 virtual ~SceneContext() {} 1202 1203 SceneNodeArray m_SceneNodes; 1204 ModelArray m_Models; 1205 SkeletalModelArray m_SkeletalModels; 1206 CameraArray m_Cameras; 1207 FogArray m_Fogs; 1208 LightArray m_Lights; 1209 FragmentLightArray m_FragmentLights; 1210 VertexLightArray m_VertexLights; 1211 HemiSphereLightArray m_HemiSphereLights; 1212 AmbientLightArray m_AmbientLights; 1213 ParticleSetArray m_ParticleSets; 1214 ParticleEmitterArray m_ParticleEmitters; 1215 ParticleModelArray m_ParticleModels; 1216 AnimatableNodeArray m_AnimatableNodes; 1217 }; 1218 1219 } // namespace gfx 1220 } // namespace nw 1221 1222 #endif // NW_GFX_SCENECONTEXT_H_ 1223