1 /*---------------------------------------------------------------------------* 2 Project: NintendoWare 3 File: gfx_Camera.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_CAMERA_H_ 19 #define NW_GFX_CAMERA_H_ 20 21 #include <nw/gfx/gfx_CameraViewUpdater.h> 22 #include <nw/gfx/gfx_CameraProjectionUpdater.h> 23 #include <nw/gfx/gfx_TransformNode.h> 24 #include <nw/gfx/gfx_Viewport.h> 25 26 namespace nw 27 { 28 namespace gfx 29 { 30 31 //--------------------------------------------------------------------------- 32 //! @brief カメラを表すクラスです。 33 //--------------------------------------------------------------------------- 34 class Camera : public TransformNode 35 { 36 private: 37 NW_DISALLOW_COPY_AND_ASSIGN(Camera); 38 39 public: 40 NW_UT_RUNTIME_TYPEINFO; 41 42 //! @brief 設定内容です。 43 struct Description : public TransformNode::Description 44 { 45 //! @brief コンストラクタです。 DescriptionDescription46 Description() 47 {} 48 }; 49 50 //---------------------------------------- 51 //! @name 作成/破棄 52 //@{ 53 54 //! @brief カメラを動的に構築するためのクラスです。 55 //! 56 //! IsFixedSizeMemory の初期値は true です。false に変更すると、各種最大数の設定は無視されます。 57 class DynamicBuilder 58 { 59 public: 60 //! コンストラクタです。 DynamicBuilder()61 DynamicBuilder() {} 62 63 //! デストラクタです。 ~DynamicBuilder()64 ~DynamicBuilder() {} 65 66 //! @brief 生成時以外にもメモリを確保するかどうかのフラグを設定します。 67 //! 68 //! true を指定すると、生成時のみ固定サイズのメモリ確保を行います。 69 //! 70 //! false を指定すると、生成時以外にも必要に応じて動的にメモリ確保が行われます。 IsFixedSizeMemory(bool isFixedSizeMemory)71 DynamicBuilder& IsFixedSizeMemory(bool isFixedSizeMemory) 72 { 73 m_Description.isFixedSizeMemory = isFixedSizeMemory; 74 return *this; 75 } 76 77 //! 子の最大数を設定します。 MaxChildren(int maxChildren)78 DynamicBuilder& MaxChildren(int maxChildren) 79 { 80 m_Description.maxChildren = maxChildren; 81 return *this; 82 } 83 84 //! 管理できるコールバックの最大数を設定します。 MaxCallbacks(int maxCallbacks)85 DynamicBuilder& MaxCallbacks(int maxCallbacks) 86 { 87 m_Description.maxCallbacks = maxCallbacks; 88 return *this; 89 } 90 91 //! @brief ビューマトリクスを更新するクラスを設定します。 92 //! 所有権が移動しますので Camera を破棄する際に一緒に破棄されます。 ViewUpdater(CameraViewUpdater * viewUpdater)93 DynamicBuilder& ViewUpdater(CameraViewUpdater* viewUpdater) { m_ViewUpdater.Reset(viewUpdater); return *this; } 94 95 //! @brief プロジェクションマトリクスを更新するクラスを設定します。 96 //! 所有権が移動しますので Camera を破棄する際に一緒に破棄されます。 ProjectionUpdater(CameraProjectionUpdater * projectionUpdater)97 DynamicBuilder& ProjectionUpdater(CameraProjectionUpdater* projectionUpdater) { m_ProjectionUpdater.Reset(projectionUpdater); return *this; } 98 99 //! @brief カメラを生成します。 100 //! 101 //! @param[in] allocator アロケータです。 102 //! 103 //! @return 生成したカメラを返します。 104 //! 105 Camera* Create(os::IAllocator* allocator); 106 107 //! @brief 生成時に必要なメモリサイズを取得します。 108 //! 109 //! メモリサイズは Builder の設定によって変化します。 110 //! すべての設定が終わった後にこの関数を呼び出してください。 111 //! 112 //! @param[in] alignment 計算に用いるアライメントです。2 のべき乗である必要があります。 113 size_t GetMemorySize(size_t alignment = os::IAllocator::DEFAULT_ALIGNMENT) const; 114 115 private: 116 Camera::Description m_Description; 117 GfxPtr<CameraViewUpdater> m_ViewUpdater; 118 GfxPtr<CameraProjectionUpdater> m_ProjectionUpdater; 119 }; 120 121 //! @brief リソースからカメラを生成します。 122 //! 123 //! @param[in] parent 親のノードです。 124 //! @param[in] resource リソースです。 125 //! @param[in] description 設定内容です。 126 //! @param[in] allocator アロケータです。 127 //! 128 //! @return 生成されたカメラです。 129 //! 130 static Camera* Create( 131 SceneNode* parent, 132 ResSceneObject resource, 133 const Camera::Description& description, 134 os::IAllocator* allocator); 135 136 //! @brief 生成時に必要なメモリサイズを取得します。 137 //! 138 //! @param[in] resource リソースです。 139 //! @param[in] description 設定内容です。 140 //! @param[in] alignment 計算に用いるアライメントです。2 のべき乗である必要があります。 141 static size_t GetMemorySize( 142 ResCamera resource, 143 Description description, 144 size_t alignment = os::IAllocator::DEFAULT_ALIGNMENT 145 ) 146 { 147 os::MemorySizeCalculator size(alignment); 148 149 GetMemorySizeInternal(&size, resource, description); 150 151 return size.GetSizeWithPadding(alignment); 152 } 153 154 //! @details :private 155 static void GetMemorySizeInternal( 156 os::MemorySizeCalculator* pSize, 157 ResCamera resource, 158 Description description); 159 160 //@} 161 162 //---------------------------------------- 163 //! @name シーンツリー 164 //@{ 165 166 //! @brief ビジターを受け付けます。 167 //! 168 //! @param[in] visitor ビジターです。 169 //! 170 virtual void Accept(ISceneVisitor* visitor); 171 172 //@} 173 174 //---------------------------------------- 175 //! @name リソース 176 //@{ 177 178 //! @brief カメラのリソースを取得します。 GetResCamera()179 ResCamera GetResCamera() { return ResStaticCast<ResCamera>(GetResSceneObject()); } 180 181 //! @brief カメラのリソースを取得します。 GetResCamera()182 const ResCamera GetResCamera() const { return ResStaticCast<ResCamera>(GetResSceneObject()); } 183 184 //@} 185 186 //---------------------------------------- 187 //! @name カメラマトリクス 188 //@{ 189 190 //! @brief ビューマトリクスとプロジェクションマトリクスを更新します。 191 void UpdateCameraMatrix(); 192 193 //! @brief プロジェクションマトリクスを取得します。 ProjectionMatrix()194 math::MTX44& ProjectionMatrix() { return m_ProjectionMatrix; } 195 196 //! @brief プロジェクションマトリクスを取得します。 ProjectionMatrix()197 const math::MTX44& ProjectionMatrix() const { return m_ProjectionMatrix; } 198 199 //! @brief プロジェクションマトリクスの逆行列を取得します。 InverseProjectionMatrix()200 math::MTX44& InverseProjectionMatrix() { return m_InverseProjectionMatrix; } 201 202 //! @brief プロジェクションマトリクスの逆行列を取得します。 InverseProjectionMatrix()203 const math::MTX44& InverseProjectionMatrix() const { return m_InverseProjectionMatrix; } 204 205 //! @brief ビューマトリクスを取得します。 ViewMatrix()206 math::MTX34& ViewMatrix() { return m_ViewMatrix; } 207 208 //! @brief ビューマトリクスを取得します。 ViewMatrix()209 const math::MTX34& ViewMatrix() const { return m_ViewMatrix; } 210 211 //! @brief ビューマトリクスの逆行列を取得します。 InverseViewMatrix()212 math::MTX34& InverseViewMatrix() { return m_InverseViewMatrix; } 213 214 //! @brief ビューマトリクスの逆行列を取得します。 InverseViewMatrix()215 const math::MTX34& InverseViewMatrix() const { return m_InverseViewMatrix; } 216 217 //! @brief プロジェクションテクスチャマッピング用の射影行列を取得します。 TextureProjectionMatrix()218 math::MTX34& TextureProjectionMatrix() { return m_TextureProjectionMatrix; } 219 220 //! @brief プロジェクションテクスチャマッピング用の射影行列を取得します。 TextureProjectionMatrix()221 const math::MTX34& TextureProjectionMatrix() const { return m_TextureProjectionMatrix; } 222 223 //@} 224 225 //---------------------------------------- 226 //! @name アップデータ 227 //@{ 228 229 //! @brief ビューマトリクスのアップデータを取得します。 GetViewUpdater()230 CameraViewUpdater* GetViewUpdater() { return this->m_ViewUpdater.Get(); } 231 232 //! @brief ビューマトリクスのアップデータを取得します。 GetViewUpdater()233 const CameraViewUpdater* GetViewUpdater() const { return this->m_ViewUpdater.Get(); } 234 235 //! @brief ビューマトリクスのアップデータを設定します。 SetViewUpdater(CameraViewUpdater * viewUpdater)236 void SetViewUpdater(CameraViewUpdater* viewUpdater) { this->m_ViewUpdater.Reset(viewUpdater); } 237 238 //! @brief ビューマトリクスのアップデータを変更します。 239 //! 既に設定されているビューマトリクスのアップデータは破棄されずに戻り値として帰ります。 240 //! 241 //! @param[in] viewUpdater 変更するビューマトリクスのアップデータです。 242 //! 243 //! @return 元々設定されていたビューマトリクスのアップデータです。 244 //! SwapViewUpdater(CameraViewUpdater * viewUpdater)245 CameraViewUpdater* SwapViewUpdater(CameraViewUpdater* viewUpdater) 246 { 247 NW_NULL_ASSERT(viewUpdater); 248 CameraViewUpdater* cameraViewUpdater = this->m_ViewUpdater.Release(); 249 this->m_ViewUpdater.Reset(viewUpdater); 250 return cameraViewUpdater; 251 } 252 253 //! @brief プロジェクションマトリクスのアップデータを取得します。 GetProjectionUpdater()254 CameraProjectionUpdater* GetProjectionUpdater() { return this->m_ProjectionUpdater.Get(); } 255 256 //! @brief プロジェクションマトリクスのアップデータを取得します。 GetProjectionUpdater()257 const CameraProjectionUpdater* GetProjectionUpdater() const { return this->m_ProjectionUpdater.Get(); } 258 259 //! @brief プロジェクションマトリクスのアップデータを設定します。 SetProjectionUpdater(CameraProjectionUpdater * projectionUpdater)260 void SetProjectionUpdater(CameraProjectionUpdater* projectionUpdater) { this->m_ProjectionUpdater.Reset(projectionUpdater); } 261 262 263 //! @brief プロジェクションマトリクスのアップデータを変更します。 264 //! 既に設定されているプロジェクションマトリクスのアップデータは破棄されずに戻り値として帰ります。 265 //! 266 //! @param[in] viewUpdater 変更するプロジェクションマトリクスのアップデータです。 267 //! 268 //! @return 元々設定されていたプロジェクションマトリクスのアップデータです。 269 //! SwapProjectionUpdater(CameraProjectionUpdater * projectionUpdater)270 CameraProjectionUpdater* SwapProjectionUpdater(CameraProjectionUpdater* projectionUpdater) 271 { 272 NW_NULL_ASSERT(projectionUpdater); 273 CameraProjectionUpdater* cameraProjectionUpdater = this->m_ProjectionUpdater.Release(); 274 this->m_ProjectionUpdater.Reset(projectionUpdater); 275 return cameraProjectionUpdater; 276 } 277 278 //@} 279 280 //---------------------------------------- 281 //! @name WScale 282 //@{ 283 284 //! @brief WScaleを取得します。 GetWScale()285 f32 GetWScale() const { return this->m_WScale; } 286 287 //! @brief WScaleを設定します。 SetWScale(f32 wScale)288 void SetWScale(f32 wScale) { m_WScale = wScale; } 289 290 //@} 291 292 //---------------------------------------- 293 //! @name アニメーション 294 //@{ 295 296 //! @brief アニメーショングループを取得します。 297 //! 298 //! カメラを DynamicBuilder で生成した場合は NULL を返します。 299 //! その場合、アニメーションは設定できません。 GetAnimGroup()300 AnimGroup* GetAnimGroup() { return m_AnimGroup; } 301 302 //! @brief アニメーショングループを取得します。 303 //! 304 //! カメラを DynamicBuilder で生成した場合は NULL を返します。 305 //! その場合、アニメーションは設定できません。 GetAnimGroup()306 const AnimGroup* GetAnimGroup() const { return m_AnimGroup; } 307 308 //! @brief アニメーションオブジェクトを取得します。 GetAnimObject()309 AnimObject* GetAnimObject() 310 { 311 NW_NULL_ASSERT(m_AnimBinding); 312 return m_AnimBinding->GetAnimObject(0); 313 } 314 315 //! @brief アニメーションオブジェクトを取得します。 GetAnimObject()316 const AnimObject* GetAnimObject() const 317 { 318 NW_NULL_ASSERT(m_AnimBinding); 319 return m_AnimBinding->GetAnimObject(0); 320 } 321 322 //! @brief アニメーションオブジェクトを設定します。 323 //! 324 //! @param[in] animObject 設定するアニメーションオブジェクトです。NULL を指定するとアニメーションを解除します。 SetAnimObject(AnimObject * animObject)325 void SetAnimObject(AnimObject* animObject) 326 { 327 NW_NULL_ASSERT(m_AnimBinding); 328 NW_FAILSAFE_IF(!ValidateCameraAnimType(animObject)) 329 { 330 NW_LOG("type mismatch between Camera and Animation. Animation did not set.\n"); 331 return; 332 } 333 m_AnimBinding->SetAnimObject(0, animObject); 334 } 335 336 //@} 337 338 //---------------------------------------- 339 //! @name ユーティリティ関数 340 //@{ 341 342 //--------------------------------------------------------------------------- 343 //! @brief カメラの位置座標を取得します。 344 //! 345 //! @return 位置座標ベクトルです。 346 //--------------------------------------------------------------------------- GetPosition()347 nw::math::VEC3 GetPosition() const 348 { 349 return Transform().GetTranslate(); 350 } 351 352 //--------------------------------------------------------------------------- 353 //! @brief カメラの位置座標を設定します。 354 //! 355 //! @param[in] position 位置座標ベクトルです。 356 //--------------------------------------------------------------------------- SetPosition(const nw::math::VEC3 & position)357 void SetPosition(const nw::math::VEC3& position) 358 { 359 Transform().SetTranslate(position); 360 } 361 362 //--------------------------------------------------------------------------- 363 //! @brief カメラの位置座標を設定します。 364 //! 365 //! @param[in] x 位置のX座標です。 366 //! @param[in] y 位置のY座標です。 367 //! @param[in] z 位置のZ座標です。 368 //--------------------------------------------------------------------------- SetPosition(f32 x,f32 y,f32 z)369 void SetPosition(f32 x, f32 y, f32 z) 370 { 371 SetPosition(nw::math::VEC3(x, y, z)); 372 } 373 374 //--------------------------------------------------------------------------- 375 //! @brief 設定されているビューアップデータのターゲット座標を取得します。 376 //! 377 //! この関数はパラメータを簡単に取得するためのユーティリティ関数です。 378 //! 設定されているビューアップデータがAimカメラ用かLookAtカメラ用でなかった場合、プログラムは停止しますので注意してください。 379 //! 380 //! @return ターゲット座標ベクトルです。 381 //--------------------------------------------------------------------------- 382 const nw::math::VEC3& GetTargetPosition() const; 383 384 //--------------------------------------------------------------------------- 385 //! @brief 設定されているビューアップデータのターゲット座標を設定します。 386 //! 387 //! この関数はパラメータを簡単に設定するためのユーティリティ関数です。 388 //! 設定されているビューアップデータがAimカメラ用かLookAtカメラ用でなかった場合、プログラムは停止しますので注意してください。 389 //! 390 //! @param[in] targetPosition ターゲット座標ベクトルです。 391 //--------------------------------------------------------------------------- 392 void SetTargetPosition(const nw::math::VEC3& targetPosition); 393 394 //--------------------------------------------------------------------------- 395 //! @brief 設定されているビューアップデータのターゲット座標を設定します。 396 //! 397 //! この関数はパラメータを簡単に設定するためのユーティリティ関数です。 398 //! 設定されているビューアップデータがAimカメラ用かLookAtカメラ用でなかった場合、プログラムは停止しますので注意してください。 399 //! 400 //! @param[in] x ターゲットのX座標です。 401 //! @param[in] y ターゲットのY座標です。 402 //! @param[in] z ターゲットのZ座標です。 403 //--------------------------------------------------------------------------- SetTargetPosition(f32 x,f32 y,f32 z)404 void SetTargetPosition(f32 x, f32 y, f32 z) 405 { 406 SetTargetPosition(nw::math::VEC3(x, y, z)); 407 } 408 409 //--------------------------------------------------------------------------- 410 //! @brief 設定されているビューアップデータのアップベクトルを取得します。 411 //! 412 //! この関数はパラメータを簡単に取得するためのユーティリティ関数です。 413 //! 設定されているビューアップデータがLookAtカメラ用でなかった場合、プログラムは停止しますので注意してください。 414 //! 415 //! @return アップベクトルです。 416 //--------------------------------------------------------------------------- 417 const nw::math::VEC3& GetUpwardVector() const; 418 419 //--------------------------------------------------------------------------- 420 //! @brief 設定されているビューアップデータのアップベクトルを設定します。 421 //! 422 //! この関数はパラメータを簡単に設定するためのユーティリティ関数です。 423 //! 設定されているビューアップデータがLookAtカメラ用でなかった場合、プログラムは停止しますので注意してください。 424 //! 425 //! @param[in] upwardVector アップベクトルです。 426 //--------------------------------------------------------------------------- 427 void SetUpwardVector(const nw::math::VEC3& upwardVector); 428 429 //--------------------------------------------------------------------------- 430 //! @brief 設定されているビューアップデータのアップベクトルを設定します。 431 //! 432 //! この関数はパラメータを簡単に設定するためのユーティリティ関数です。 433 //! 設定されているビューアップデータがLookAtカメラ用でなかった場合、プログラムは停止しますので注意してください。 434 //! 435 //! @param[in] x アップベクトルのX成分です。 436 //! @param[in] y アップベクトルのY成分です。 437 //! @param[in] z アップベクトルのZ成分です。 438 //--------------------------------------------------------------------------- SetUpwardVector(f32 x,f32 y,f32 z)439 void SetUpwardVector(f32 x, f32 y, f32 z) 440 { 441 SetUpwardVector(nw::math::VEC3(x, y, z)); 442 } 443 444 //--------------------------------------------------------------------------- 445 //! @brief 設定されているビューアップデータのツイストを取得します。 446 //! 447 //! この関数はパラメータを簡単に取得するためのユーティリティ関数です。 448 //! 設定されているビューアップデータがAimカメラ用でなかった場合、プログラムは停止しますので注意してください。 449 //! 450 //! @return ラジアン単位のツイストです。 451 //--------------------------------------------------------------------------- 452 f32 GetTwist() const; 453 454 //--------------------------------------------------------------------------- 455 //! @brief 設定されているビューアップデータのツイストを設定します。 456 //! 457 //! この関数はパラメータを簡単に設定するためのユーティリティ関数です。 458 //! 設定されているビューアップデータがAimカメラ用でなかった場合、プログラムは停止しますので注意してください。 459 //! 460 //! @param[in] twist ラジアン単位のツイストです。 461 //--------------------------------------------------------------------------- 462 void SetTwist(f32 twist); 463 464 //--------------------------------------------------------------------------- 465 //! @brief 設定されているビューアップデータの回転角度を取得します。 466 //! 467 //! この関数はパラメータを簡単に取得するためのユーティリティ関数です。 468 //! 設定されているビューアップデータがRotateカメラ用でなかった場合、プログラムは停止しますので注意してください。 469 //! 470 //! @return 回転角度ベクトルです。各成分の単位はラジアンです。 471 //--------------------------------------------------------------------------- 472 const nw::math::VEC3& GetViewRotate() const; 473 474 //--------------------------------------------------------------------------- 475 //! @brief 設定されているビューアップデータの回転角度を設定します。 476 //! 477 //! この関数はパラメータを簡単に設定するためのユーティリティ関数です。 478 //! 設定されているビューアップデータがRotateカメラ用でなかった場合、プログラムは停止しますので注意してください。 479 //! 480 //! @param[in] viewRotate 角度ベクトルです。各成分の単位はラジアンです。 481 //--------------------------------------------------------------------------- 482 void SetViewRotate(const nw::math::VEC3& viewRotate); 483 484 //--------------------------------------------------------------------------- 485 //! @brief 設定されているビューアップデータの回転角度を設定します。 486 //! 487 //! この関数はパラメータを簡単に設定するためのユーティリティ関数です。 488 //! 設定されているビューアップデータがRotateカメラ用でなかった場合、プログラムは停止しますので注意してください。 489 //! 490 //! @param[in] x X軸の回転角度です。単位はラジアンです。 491 //! @param[in] y Y軸の回転角度です。単位はラジアンです。 492 //! @param[in] z Z軸の回転角度です。単位はラジアンです。 493 //--------------------------------------------------------------------------- SetViewRotate(f32 x,f32 y,f32 z)494 void SetViewRotate(f32 x, f32 y, f32 z){ 495 SetViewRotate(nw::math::VEC3(x, y, z)); 496 } 497 498 //--------------------------------------------------------------------------- 499 //! @brief 設定されているPerspective用プロジェクションアップデータのパラメータを取得します。 500 //! 501 //! この関数はパラメータを簡単に取得するためのユーティリティ関数です。 502 //! 設定されているプロジェクションアップデータがPerspective用でなかった場合、プログラムは停止しますので注意してください。 503 //! 引数にNULLを設定されたパラメータは取得されません。 504 //! 505 //! @param[in] fovy 縦方向の視野角(ラジアン単位)を格納するポインタです。 506 //! @param[in] aspectRatio 視野のアスペクト比(幅/高さ)を格納するポインタです。 507 //! @param[in] nearClip ニアクリッピング面までの距離を格納するポインタです。 508 //! @param[in] farClip ファークリッピング面までの距離を格納するポインタです。 509 //--------------------------------------------------------------------------- 510 void GetPerspective( 511 f32* fovy, 512 f32* aspectRatio, 513 f32* nearClip, 514 f32* farClip 515 ) const; 516 517 //--------------------------------------------------------------------------- 518 //! @brief 設定されているPerspective用プロジェクションアップデータのパラメータを設定します。 519 //! 520 //! この関数はパラメータを簡単に設定するためのユーティリティ関数です。 521 //! 設定されているプロジェクションアップデータがPerspective用でなかった場合、プログラムは停止しますので注意してください。 522 //! 523 //! @param[in] fovy 縦方向の視野角(ラジアン単位)です。 524 //! @param[in] aspectRatio 視野のアスペクト比(幅/高さ)です。 525 //! @param[in] nearClip ニアクリッピング面までの距離です。 526 //! @param[in] farClip ファークリッピング面までの距離です。 527 //--------------------------------------------------------------------------- 528 void SetPerspective( 529 f32 fovy, 530 f32 aspectRatio, 531 f32 nearClip, 532 f32 farClip 533 ); 534 535 //--------------------------------------------------------------------------- 536 //! @brief 設定されているFrustum用プロジェクションアップデータのパラメータを取得します。 537 //! 538 //! この関数はパラメータを簡単に取得するためのユーティリティ関数です。 539 //! 設定されているプロジェクションアップデータがFrustum用でなかった場合、プログラムは停止しますので注意してください。 540 //! 引数にNULLを設定されたパラメータは取得されません。 541 //! 542 //! @param[in] left ニアクリッピング面での視錐台左辺のX座標を格納するポインタです。 543 //! @param[in] right ニアクリッピング面での視錐台右辺のX座標を格納するポインタです。 544 //! @param[in] bottom ニアクリッピング面での視錐台下辺のY座標を格納するポインタです。 545 //! @param[in] top ニアクリッピング面での視錐台上辺のY座標を格納するポインタです。 546 //! @param[in] nearClip ニアクリッピング面までの距離を格納するポインタです。 547 //! @param[in] farClip ファークリッピング面までの距離を格納するポインタです。 548 //--------------------------------------------------------------------------- 549 void GetFrustum( 550 f32* left, 551 f32* right, 552 f32* bottom, 553 f32* top, 554 f32* nearClip, 555 f32* farClip 556 ) const; 557 558 //--------------------------------------------------------------------------- 559 //! @brief 設定されているFrustum用プロジェクションアップデータのパラメータを設定します。 560 //! 561 //! この関数はパラメータを簡単に取得するためのユーティリティ関数です。 562 //! 設定されているプロジェクションアップデータがFrustum用でなかった場合、プログラムは停止しますので注意してください。 563 //! 564 //! @param[in] left ニアクリッピング面での視錐台左辺のX座標です。 565 //! @param[in] right ニアクリッピング面での視錐台右辺のX座標です。 566 //! @param[in] bottom ニアクリッピング面での視錐台下辺のY座標です。 567 //! @param[in] top ニアクリッピング面での視錐台上辺のY座標です。 568 //! @param[in] nearClip ニアクリッピング面までの距離です。 569 //! @param[in] farClip ファークリッピング面までの距離です。 570 //--------------------------------------------------------------------------- 571 void SetFrustum( 572 f32 left, 573 f32 right, 574 f32 bottom, 575 f32 top, 576 f32 nearClip, 577 f32 farClip 578 ); 579 580 //--------------------------------------------------------------------------- 581 //! @brief 設定されているFrustum用プロジェクションアップデータのパラメータを取得します。 582 //! 583 //! この関数はパラメータを簡単に取得するためのユーティリティ関数です。 584 //! 設定されているプロジェクションアップデータがFrustum用でなかった場合、プログラムは停止しますので注意してください。 585 //! 引数にNULLを設定されたパラメータは取得されません。 586 //! 587 //! @param[in] rect ニアクリッピング面での視錐台近平面の矩形を格納するポインタです。 588 //! @param[in] nearClip ニアクリッピング面までの距離を格納するポインタです。 589 //! @param[in] farClip ファークリッピング面までの距離を格納するポインタです。 590 //--------------------------------------------------------------------------- 591 void GetFrustum( 592 ut::Rect* rect, 593 f32* nearClip, 594 f32* farClip 595 ) const; 596 597 //--------------------------------------------------------------------------- 598 //! @brief 設定されているFrustum用プロジェクションアップデータのパラメータを設定します。 599 //! 600 //! この関数はパラメータを簡単に設定するためのユーティリティ関数です。 601 //! 設定されているプロジェクションアップデータがFrustum用でなかった場合、プログラムは停止しますので注意してください。 602 //! 603 //! @param[in] rect ニアクリッピング面での視錐台近平面の矩形です。 604 //! @param[in] nearClip ニアクリッピング面までの距離です。 605 //! @param[in] farClip ファークリッピング面までの距離です。 606 //--------------------------------------------------------------------------- 607 void SetFrustum( 608 const ut::Rect& rect, 609 f32 nearClip, 610 f32 farClip 611 ); 612 613 //--------------------------------------------------------------------------- 614 //! @brief 設定されているFrustum用プロジェクションアップデータのパラメータを設定します。 615 //! 616 //! 与えられたビューポートをもとにパラメータを設定します。 617 //! この関数はパラメータを簡単に設定するためのユーティリティ関数です。 618 //! 設定されているプロジェクションアップデータがFrustum用でなかった場合、プログラムは停止しますので注意してください。 619 //! 620 //! @param[in] viewport ビューポートです。 621 //--------------------------------------------------------------------------- 622 void SetFrustum( 623 const Viewport& viewport 624 ); 625 626 //--------------------------------------------------------------------------- 627 //! @brief 設定されているOrtho用プロジェクションアップデータのパラメータを取得します。 628 //! 629 //! この関数はパラメータを簡単に取得するためのユーティリティ関数です。 630 //! 設定されているプロジェクションアップデータがOrtho用でなかった場合、プログラムは停止しますので注意してください。 631 //! 引数にNULLを設定されたパラメータは取得されません。 632 //! 633 //! @param[in] left ニアクリッピング面での視錐台左辺のX座標を格納するポインタです。 634 //! @param[in] right ニアクリッピング面での視錐台右辺のX座標を格納するポインタです。 635 //! @param[in] bottom ニアクリッピング面での視錐台下辺のY座標を格納するポインタです。 636 //! @param[in] top ニアクリッピング面での視錐台上辺のY座標を格納するポインタです。 637 //! @param[in] nearClip ニアクリッピング面までの距離を格納するポインタです。 638 //! @param[in] farClip ファークリッピング面までの距離を格納するポインタです。 639 //--------------------------------------------------------------------------- 640 void GetOrtho( 641 f32* left, 642 f32* right, 643 f32* bottom, 644 f32* top, 645 f32* nearClip, 646 f32* farClip 647 ) const; 648 649 //--------------------------------------------------------------------------- 650 //! @brief 設定されているOrtho用プロジェクションアップデータのパラメータを設定します。 651 //! 652 //! この関数はパラメータを簡単に設定するためのユーティリティ関数です。 653 //! 設定されているプロジェクションアップデータがOrtho用でなかった場合、プログラムは停止しますので注意してください。 654 //! 655 //! @param[in] left ニアクリッピング面での視錐台左辺のX座標です。 656 //! @param[in] right ニアクリッピング面での視錐台右辺のX座標です。 657 //! @param[in] bottom ニアクリッピング面での視錐台下辺のY座標です。 658 //! @param[in] top ニアクリッピング面での視錐台上辺のY座標です。 659 //! @param[in] nearClip ニアクリッピング面までの距離です。 660 //! @param[in] farClip ファークリッピング面までの距離です。 661 //--------------------------------------------------------------------------- 662 void SetOrtho( 663 f32 left, 664 f32 right, 665 f32 bottom, 666 f32 top, 667 f32 nearClip, 668 f32 farClip 669 ); 670 671 //--------------------------------------------------------------------------- 672 //! @brief 設定されているOrtho用プロジェクションアップデータのパラメータを取得します。 673 //! 674 //! この関数はパラメータを簡単に取得するためのユーティリティ関数です。 675 //! 設定されているプロジェクションアップデータがOrtho用でなかった場合、プログラムは停止しますので注意してください。 676 //! 引数にNULLを設定されたパラメータは取得されません。 677 //! 678 //! @param[in] rect ニアクリッピング面での視錐台近平面の矩形を格納するポインタです。 679 //! @param[in] nearClip ニアクリッピング面までの距離を格納するポインタです。 680 //! @param[in] farClip ファークリッピング面までの距離を格納するポインタです。 681 //--------------------------------------------------------------------------- 682 void GetOrtho( 683 ut::Rect* rect, 684 f32* nearClip, 685 f32* farClip 686 ) const; 687 688 //--------------------------------------------------------------------------- 689 //! @brief 設定されているOrtho用プロジェクションアップデータのパラメータを設定します。 690 //! 691 //! この関数はパラメータを簡単に設定するためのユーティリティ関数です。 692 //! 設定されているプロジェクションアップデータがOrtho用でなかった場合、プログラムは停止しますので注意してください。 693 //! 694 //! @param[in] rect ニアクリッピング面での視錐台近平面の矩形です。 695 //! @param[in] nearClip ニアクリッピング面までの距離です。 696 //! @param[in] farClip ファークリッピング面までの距離です。 697 //--------------------------------------------------------------------------- 698 void SetOrtho( 699 const ut::Rect& rect, 700 f32 nearClip, 701 f32 farClip 702 ); 703 704 //--------------------------------------------------------------------------- 705 //! @brief 設定されているOrtho用プロジェクションアップデータのパラメータを設定します。 706 //! 707 //! 与えられたビューポートをもとにパラメータを設定します。 708 //! この関数はパラメータを簡単に設定するためのユーティリティ関数です。 709 //! 設定されているプロジェクションアップデータがOrtho用でなかった場合、プログラムは停止しますので注意してください。 710 //! 711 //! @param[in] viewport 設定元のビューポートです。 712 //--------------------------------------------------------------------------- 713 void SetOrtho( 714 const Viewport& viewport 715 ); 716 717 //--------------------------------------------------------------------------- 718 //! @brief 設定されているプロジェクションアップデータのニアクリップまでの距離を取得します。 719 //! 720 //! この関数はパラメータを簡単に取得するためのユーティリティ関数です。 721 //! 722 //! @return ニアクリップまでの距離です。 723 //--------------------------------------------------------------------------- 724 f32 GetNear() const; 725 726 //--------------------------------------------------------------------------- 727 //! @brief 設定されているプロジェクションアップデータのニアクリップまでの距離を設定します。 728 //! 729 //! この関数はパラメータを簡単に取得するためのユーティリティ関数です。 730 //! 731 //! @param[in] near ニアクリップまでの距離です。 732 //--------------------------------------------------------------------------- 733 void SetNear(f32 near); 734 735 //--------------------------------------------------------------------------- 736 //! @brief 設定されているプロジェクションアップデータのファークリップまでの距離を取得します。 737 //! 738 //! この関数はパラメータを簡単に取得するためのユーティリティ関数です。 739 //! 740 //! @return ファークリップまでの距離です。 741 //--------------------------------------------------------------------------- 742 f32 GetFar() const; 743 744 //--------------------------------------------------------------------------- 745 //! @brief 設定されているプロジェクションアップデータのファークリップまでの距離を設定します。 746 //! 747 //! この関数はパラメータを簡単に取得するためのユーティリティ関数です。 748 //! 749 //! @param[in] far ファークリップまでの距離です。 750 //--------------------------------------------------------------------------- 751 void SetFar(f32 far); 752 753 //@} 754 755 protected: 756 //---------------------------------------- 757 //! @name コンストラクタ/デストラクタ 758 //@{ 759 760 //! コンストラクタです。 761 Camera( 762 os::IAllocator* allocator, 763 ResTransformNode resObj, 764 const Camera::Description& description, 765 GfxPtr<CameraViewUpdater> viewUpdater, 766 GfxPtr<CameraProjectionUpdater> projectionUpdater, 767 f32 wscale, 768 bool isDynamic); 769 770 //! デストラクタです。 771 virtual ~Camera(); 772 773 //@} 774 775 struct ResCameraDestroyer : public std::unary_function<ResCamera, void> 776 { m_AllocatorResCameraDestroyer777 ResCameraDestroyer(os::IAllocator* allocator = 0) : m_Allocator(allocator) 778 {} operatorResCameraDestroyer779 result_type operator()(argument_type data) 780 { 781 DestroyResCamera(m_Allocator, data); 782 } 783 784 os::IAllocator* m_Allocator; 785 }; 786 787 private: 788 virtual Result Initialize(os::IAllocator* allocator); 789 790 //! アニメーションを初期状態に戻すため、初期化時の状態を保存します。 791 Result StoreOriginal(os::IAllocator* allocator); 792 793 //--------------------------------------------------------------------------- 794 //! @brief ResCamera のリソースを破棄します。 795 //! 796 //! @param[in] allocator リソース用のメモリを解放するアロケータです。 797 //! @param[in] resCamera 解放するリソースです。 798 //--------------------------------------------------------------------------- 799 static void DestroyResCamera(os::IAllocator* allocator, ResCamera resCamera); 800 801 Result CreateAnimGroup(os::IAllocator* allocator); 802 803 //! @brief アニメーションに登録するモデルデータのポインタを取得します。 804 void* GetAnimTargetObject(const anim::ResAnimGroupMember& anim); 805 806 //! @details :private 807 // アニメーションとカメラで、view/projectionのupdaterが一致しているかチェックします。 808 bool ValidateCameraAnimType(AnimObject* animObject); 809 810 math::MTX34 m_ViewMatrix; 811 math::MTX34 m_InverseViewMatrix; 812 math::MTX44 m_ProjectionMatrix; 813 math::MTX44 m_InverseProjectionMatrix; 814 math::MTX34 m_TextureProjectionMatrix; 815 816 GfxPtr<CameraViewUpdater> m_ViewUpdater; 817 GfxPtr<CameraProjectionUpdater> m_ProjectionUpdater; 818 819 AnimGroup* m_AnimGroup; 820 821 ResCamera m_OriginalValue; 822 math::Transform3 m_OriginalTransform; 823 f32 m_WScale; 824 bool m_IsDynamic; 825 }; 826 827 } // namespace gfx 828 } // namespace nw 829 830 #endif // NW_GFX_CAMERA_H_ 831