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