/*---------------------------------------------------------------------------* Project: NintendoWare File: gfx_Camera.h Copyright (C)2009-2011 Nintendo/HAL Laboratory, Inc. All rights reserved. These coded instructions, statements, and computer programs contain proprietary information of Nintendo and/or its licensed developers and are protected by national and international copyright laws. They may not be disclosed to third parties or copied or duplicated in any form, in whole or in part, without the prior written consent of Nintendo. The content herein is highly confidential and should be handled accordingly. $Revision: 31311 $ *---------------------------------------------------------------------------*/ #ifndef NW_GFX_CAMERA_H_ #define NW_GFX_CAMERA_H_ #include #include #include #include namespace nw { namespace gfx { //--------------------------------------------------------------------------- //! @brief カメラを表すクラスです。 //--------------------------------------------------------------------------- class Camera : public TransformNode { private: NW_DISALLOW_COPY_AND_ASSIGN(Camera); public: NW_UT_RUNTIME_TYPEINFO; //! @brief 設定内容です。 struct Description : public TransformNode::Description { //! @brief コンストラクタです。 Description() {} }; //---------------------------------------- //! @name 作成/破棄 //@{ //! @brief カメラを動的に構築するためのクラスです。 //! //! IsFixedSizeMemory の初期値は true です。false に変更すると、各種最大数の設定は無視されます。 class DynamicBuilder { public: //! コンストラクタです。 DynamicBuilder() {} //! デストラクタです。 ~DynamicBuilder() {} //! @brief 生成時以外にもメモリを確保するかどうかのフラグを設定します。 //! //! true を指定すると、生成時のみ固定サイズのメモリ確保を行います。 //! //! false を指定すると、生成時以外にも必要に応じて動的にメモリ確保が行われます。 DynamicBuilder& IsFixedSizeMemory(bool isFixedSizeMemory) { m_Description.isFixedSizeMemory = isFixedSizeMemory; return *this; } //! 子の最大数を設定します。 DynamicBuilder& MaxChildren(int maxChildren) { m_Description.maxChildren = maxChildren; return *this; } //! 管理できるコールバックの最大数を設定します。 DynamicBuilder& MaxCallbacks(int maxCallbacks) { m_Description.maxCallbacks = maxCallbacks; return *this; } //! @brief ビューマトリクスを更新するクラスを設定します。 //! 所有権が移動しますので Camera を破棄する際に一緒に破棄されます。 DynamicBuilder& ViewUpdater(CameraViewUpdater* viewUpdater) { m_ViewUpdater.Reset(viewUpdater); return *this; } //! @brief プロジェクションマトリクスを更新するクラスを設定します。 //! 所有権が移動しますので Camera を破棄する際に一緒に破棄されます。 DynamicBuilder& ProjectionUpdater(CameraProjectionUpdater* projectionUpdater) { m_ProjectionUpdater.Reset(projectionUpdater); return *this; } //! @brief カメラを生成します。 //! //! @param[in] allocator アロケータです。 //! //! @return 生成したカメラを返します。 //! Camera* Create(os::IAllocator* allocator); //! @brief 生成時に必要なメモリサイズを取得します。 //! //! メモリサイズは Builder の設定によって変化します。 //! すべての設定が終わった後にこの関数を呼び出してください。 //! //! @param[in] alignment 計算に用いるアライメントです。2 のべき乗である必要があります。 size_t GetMemorySize(size_t alignment = os::IAllocator::DEFAULT_ALIGNMENT) const; private: Camera::Description m_Description; GfxPtr m_ViewUpdater; GfxPtr m_ProjectionUpdater; }; //! @brief リソースからカメラを生成します。 //! //! @param[in] parent 親のノードです。 //! @param[in] resource リソースです。 //! @param[in] description 設定内容です。 //! @param[in] allocator アロケータです。 //! //! @return 生成されたカメラです。 //! static Camera* Create( SceneNode* parent, ResSceneObject resource, const Camera::Description& description, os::IAllocator* allocator); //! @brief 生成時に必要なメモリサイズを取得します。 //! //! @param[in] resource リソースです。 //! @param[in] description 設定内容です。 //! @param[in] alignment 計算に用いるアライメントです。2 のべき乗である必要があります。 static size_t GetMemorySize( ResCamera resource, Description description, size_t alignment = os::IAllocator::DEFAULT_ALIGNMENT ) { os::MemorySizeCalculator size(alignment); GetMemorySizeInternal(&size, resource, description); return size.GetSizeWithPadding(alignment); } //! @details :private static void GetMemorySizeInternal( os::MemorySizeCalculator* pSize, ResCamera resource, Description description); //@} //---------------------------------------- //! @name シーンツリー //@{ //! @brief ビジターを受け付けます。 //! //! @param[in] visitor ビジターです。 //! virtual void Accept(ISceneVisitor* visitor); //@} //---------------------------------------- //! @name リソース //@{ //! @brief カメラのリソースを取得します。 ResCamera GetResCamera() { return ResStaticCast(GetResSceneObject()); } //! @brief カメラのリソースを取得します。 const ResCamera GetResCamera() const { return ResStaticCast(GetResSceneObject()); } //@} //---------------------------------------- //! @name カメラマトリクス //@{ //! @brief ビューマトリクスとプロジェクションマトリクスを更新します。 void UpdateCameraMatrix(); //! @brief プロジェクションマトリクスを取得します。 math::MTX44& ProjectionMatrix() { return m_ProjectionMatrix; } //! @brief プロジェクションマトリクスを取得します。 const math::MTX44& ProjectionMatrix() const { return m_ProjectionMatrix; } //! @brief プロジェクションマトリクスの逆行列を取得します。 math::MTX44& InverseProjectionMatrix() { return m_InverseProjectionMatrix; } //! @brief プロジェクションマトリクスの逆行列を取得します。 const math::MTX44& InverseProjectionMatrix() const { return m_InverseProjectionMatrix; } //! @brief ビューマトリクスを取得します。 math::MTX34& ViewMatrix() { return m_ViewMatrix; } //! @brief ビューマトリクスを取得します。 const math::MTX34& ViewMatrix() const { return m_ViewMatrix; } //! @brief ビューマトリクスの逆行列を取得します。 math::MTX34& InverseViewMatrix() { return m_InverseViewMatrix; } //! @brief ビューマトリクスの逆行列を取得します。 const math::MTX34& InverseViewMatrix() const { return m_InverseViewMatrix; } //! @brief プロジェクションテクスチャマッピング用の射影行列を取得します。 math::MTX34& TextureProjectionMatrix() { return m_TextureProjectionMatrix; } //! @brief プロジェクションテクスチャマッピング用の射影行列を取得します。 const math::MTX34& TextureProjectionMatrix() const { return m_TextureProjectionMatrix; } //@} //---------------------------------------- //! @name アップデータ //@{ //! @brief ビューマトリクスのアップデータを取得します。 CameraViewUpdater* GetViewUpdater() { return this->m_ViewUpdater.Get(); } //! @brief ビューマトリクスのアップデータを取得します。 const CameraViewUpdater* GetViewUpdater() const { return this->m_ViewUpdater.Get(); } //! @brief ビューマトリクスのアップデータを設定します。 void SetViewUpdater(CameraViewUpdater* viewUpdater) { this->m_ViewUpdater.Reset(viewUpdater); } //! @brief ビューマトリクスのアップデータを変更します。 //! 既に設定されているビューマトリクスのアップデータは破棄されずに戻り値として帰ります。 //! //! @param[in] viewUpdater 変更するビューマトリクスのアップデータです。 //! //! @return 元々設定されていたビューマトリクスのアップデータです。 //! CameraViewUpdater* SwapViewUpdater(CameraViewUpdater* viewUpdater) { NW_NULL_ASSERT(viewUpdater); CameraViewUpdater* cameraViewUpdater = this->m_ViewUpdater.Release(); this->m_ViewUpdater.Reset(viewUpdater); return cameraViewUpdater; } //! @brief プロジェクションマトリクスのアップデータを取得します。 CameraProjectionUpdater* GetProjectionUpdater() { return this->m_ProjectionUpdater.Get(); } //! @brief プロジェクションマトリクスのアップデータを取得します。 const CameraProjectionUpdater* GetProjectionUpdater() const { return this->m_ProjectionUpdater.Get(); } //! @brief プロジェクションマトリクスのアップデータを設定します。 void SetProjectionUpdater(CameraProjectionUpdater* projectionUpdater) { this->m_ProjectionUpdater.Reset(projectionUpdater); } //! @brief プロジェクションマトリクスのアップデータを変更します。 //! 既に設定されているプロジェクションマトリクスのアップデータは破棄されずに戻り値として帰ります。 //! //! @param[in] viewUpdater 変更するプロジェクションマトリクスのアップデータです。 //! //! @return 元々設定されていたプロジェクションマトリクスのアップデータです。 //! CameraProjectionUpdater* SwapProjectionUpdater(CameraProjectionUpdater* projectionUpdater) { NW_NULL_ASSERT(projectionUpdater); CameraProjectionUpdater* cameraProjectionUpdater = this->m_ProjectionUpdater.Release(); this->m_ProjectionUpdater.Reset(projectionUpdater); return cameraProjectionUpdater; } //@} //---------------------------------------- //! @name WScale //@{ //! @brief WScaleを取得します。 f32 GetWScale() const { return this->m_WScale; } //! @brief WScaleを設定します。 void SetWScale(f32 wScale) { m_WScale = wScale; } //@} //---------------------------------------- //! @name アニメーション //@{ //! @brief アニメーショングループを取得します。 //! //! カメラを DynamicBuilder で生成した場合は NULL を返します。 //! その場合、アニメーションは設定できません。 AnimGroup* GetAnimGroup() { return m_AnimGroup; } //! @brief アニメーショングループを取得します。 //! //! カメラを DynamicBuilder で生成した場合は NULL を返します。 //! その場合、アニメーションは設定できません。 const AnimGroup* GetAnimGroup() const { return m_AnimGroup; } //! @brief アニメーションオブジェクトを取得します。 AnimObject* GetAnimObject() { NW_NULL_ASSERT(m_AnimBinding); return m_AnimBinding->GetAnimObject(0); } //! @brief アニメーションオブジェクトを取得します。 const AnimObject* GetAnimObject() const { NW_NULL_ASSERT(m_AnimBinding); return m_AnimBinding->GetAnimObject(0); } //! @brief アニメーションオブジェクトを設定します。 //! //! @param[in] animObject 設定するアニメーションオブジェクトです。NULL を指定するとアニメーションを解除します。 void SetAnimObject(AnimObject* animObject) { NW_NULL_ASSERT(m_AnimBinding); NW_FAILSAFE_IF(!ValidateCameraAnimType(animObject)) { NW_LOG("type mismatch between Camera and Animation. Animation did not set.\n"); return; } m_AnimBinding->SetAnimObject(0, animObject); } //@} //---------------------------------------- //! @name ユーティリティ関数 //@{ //--------------------------------------------------------------------------- //! @brief カメラの位置座標を取得します。 //! //! @return 位置座標ベクトルです。 //--------------------------------------------------------------------------- nw::math::VEC3 GetPosition() const { return Transform().GetTranslate(); } //--------------------------------------------------------------------------- //! @brief カメラの位置座標を設定します。 //! //! @param[in] position 位置座標ベクトルです。 //--------------------------------------------------------------------------- void SetPosition(const nw::math::VEC3& position) { Transform().SetTranslate(position); } //--------------------------------------------------------------------------- //! @brief カメラの位置座標を設定します。 //! //! @param[in] x 位置のX座標です。 //! @param[in] y 位置のY座標です。 //! @param[in] z 位置のZ座標です。 //--------------------------------------------------------------------------- void SetPosition(f32 x, f32 y, f32 z) { SetPosition(nw::math::VEC3(x, y, z)); } //--------------------------------------------------------------------------- //! @brief 設定されているビューアップデータのターゲット座標を取得します。 //! //! この関数はパラメータを簡単に取得するためのユーティリティ関数です。 //! 設定されているビューアップデータがAimカメラ用かLookAtカメラ用でなかった場合、プログラムは停止しますので注意してください。 //! //! @return ターゲット座標ベクトルです。 //--------------------------------------------------------------------------- const nw::math::VEC3& GetTargetPosition() const; //--------------------------------------------------------------------------- //! @brief 設定されているビューアップデータのターゲット座標を設定します。 //! //! この関数はパラメータを簡単に設定するためのユーティリティ関数です。 //! 設定されているビューアップデータがAimカメラ用かLookAtカメラ用でなかった場合、プログラムは停止しますので注意してください。 //! //! @param[in] targetPosition ターゲット座標ベクトルです。 //--------------------------------------------------------------------------- void SetTargetPosition(const nw::math::VEC3& targetPosition); //--------------------------------------------------------------------------- //! @brief 設定されているビューアップデータのターゲット座標を設定します。 //! //! この関数はパラメータを簡単に設定するためのユーティリティ関数です。 //! 設定されているビューアップデータがAimカメラ用かLookAtカメラ用でなかった場合、プログラムは停止しますので注意してください。 //! //! @param[in] x ターゲットのX座標です。 //! @param[in] y ターゲットのY座標です。 //! @param[in] z ターゲットのZ座標です。 //--------------------------------------------------------------------------- void SetTargetPosition(f32 x, f32 y, f32 z) { SetTargetPosition(nw::math::VEC3(x, y, z)); } //--------------------------------------------------------------------------- //! @brief 設定されているビューアップデータのアップベクトルを取得します。 //! //! この関数はパラメータを簡単に取得するためのユーティリティ関数です。 //! 設定されているビューアップデータがLookAtカメラ用でなかった場合、プログラムは停止しますので注意してください。 //! //! @return アップベクトルです。 //--------------------------------------------------------------------------- const nw::math::VEC3& GetUpwardVector() const; //--------------------------------------------------------------------------- //! @brief 設定されているビューアップデータのアップベクトルを設定します。 //! //! この関数はパラメータを簡単に設定するためのユーティリティ関数です。 //! 設定されているビューアップデータがLookAtカメラ用でなかった場合、プログラムは停止しますので注意してください。 //! //! @param[in] upwardVector アップベクトルです。 //--------------------------------------------------------------------------- void SetUpwardVector(const nw::math::VEC3& upwardVector); //--------------------------------------------------------------------------- //! @brief 設定されているビューアップデータのアップベクトルを設定します。 //! //! この関数はパラメータを簡単に設定するためのユーティリティ関数です。 //! 設定されているビューアップデータがLookAtカメラ用でなかった場合、プログラムは停止しますので注意してください。 //! //! @param[in] x アップベクトルのX成分です。 //! @param[in] y アップベクトルのY成分です。 //! @param[in] z アップベクトルのZ成分です。 //--------------------------------------------------------------------------- void SetUpwardVector(f32 x, f32 y, f32 z) { SetUpwardVector(nw::math::VEC3(x, y, z)); } //--------------------------------------------------------------------------- //! @brief 設定されているビューアップデータのツイストを取得します。 //! //! この関数はパラメータを簡単に取得するためのユーティリティ関数です。 //! 設定されているビューアップデータがAimカメラ用でなかった場合、プログラムは停止しますので注意してください。 //! //! @return ラジアン単位のツイストです。 //--------------------------------------------------------------------------- f32 GetTwist() const; //--------------------------------------------------------------------------- //! @brief 設定されているビューアップデータのツイストを設定します。 //! //! この関数はパラメータを簡単に設定するためのユーティリティ関数です。 //! 設定されているビューアップデータがAimカメラ用でなかった場合、プログラムは停止しますので注意してください。 //! //! @param[in] twist ラジアン単位のツイストです。 //--------------------------------------------------------------------------- void SetTwist(f32 twist); //--------------------------------------------------------------------------- //! @brief 設定されているビューアップデータの回転角度を取得します。 //! //! この関数はパラメータを簡単に取得するためのユーティリティ関数です。 //! 設定されているビューアップデータがRotateカメラ用でなかった場合、プログラムは停止しますので注意してください。 //! //! @return 回転角度ベクトルです。各成分の単位はラジアンです。 //--------------------------------------------------------------------------- const nw::math::VEC3& GetViewRotate() const; //--------------------------------------------------------------------------- //! @brief 設定されているビューアップデータの回転角度を設定します。 //! //! この関数はパラメータを簡単に設定するためのユーティリティ関数です。 //! 設定されているビューアップデータがRotateカメラ用でなかった場合、プログラムは停止しますので注意してください。 //! //! @param[in] viewRotate 角度ベクトルです。各成分の単位はラジアンです。 //--------------------------------------------------------------------------- void SetViewRotate(const nw::math::VEC3& viewRotate); //--------------------------------------------------------------------------- //! @brief 設定されているビューアップデータの回転角度を設定します。 //! //! この関数はパラメータを簡単に設定するためのユーティリティ関数です。 //! 設定されているビューアップデータがRotateカメラ用でなかった場合、プログラムは停止しますので注意してください。 //! //! @param[in] x X軸の回転角度です。単位はラジアンです。 //! @param[in] y Y軸の回転角度です。単位はラジアンです。 //! @param[in] z Z軸の回転角度です。単位はラジアンです。 //--------------------------------------------------------------------------- void SetViewRotate(f32 x, f32 y, f32 z){ SetViewRotate(nw::math::VEC3(x, y, z)); } //--------------------------------------------------------------------------- //! @brief 設定されているPerspective用プロジェクションアップデータのパラメータを取得します。 //! //! この関数はパラメータを簡単に取得するためのユーティリティ関数です。 //! 設定されているプロジェクションアップデータがPerspective用でなかった場合、プログラムは停止しますので注意してください。 //! 引数にNULLを設定されたパラメータは取得されません。 //! //! @param[in] fovy 縦方向の視野角(ラジアン単位)を格納するポインタです。 //! @param[in] aspectRatio 視野のアスペクト比(幅/高さ)を格納するポインタです。 //! @param[in] nearClip ニアクリッピング面までの距離を格納するポインタです。 //! @param[in] farClip ファークリッピング面までの距離を格納するポインタです。 //--------------------------------------------------------------------------- void GetPerspective( f32* fovy, f32* aspectRatio, f32* nearClip, f32* farClip ) const; //--------------------------------------------------------------------------- //! @brief 設定されているPerspective用プロジェクションアップデータのパラメータを設定します。 //! //! この関数はパラメータを簡単に設定するためのユーティリティ関数です。 //! 設定されているプロジェクションアップデータがPerspective用でなかった場合、プログラムは停止しますので注意してください。 //! //! @param[in] fovy 縦方向の視野角(ラジアン単位)です。 //! @param[in] aspectRatio 視野のアスペクト比(幅/高さ)です。 //! @param[in] nearClip ニアクリッピング面までの距離です。 //! @param[in] farClip ファークリッピング面までの距離です。 //--------------------------------------------------------------------------- void SetPerspective( f32 fovy, f32 aspectRatio, f32 nearClip, f32 farClip ); //--------------------------------------------------------------------------- //! @brief 設定されているFrustum用プロジェクションアップデータのパラメータを取得します。 //! //! この関数はパラメータを簡単に取得するためのユーティリティ関数です。 //! 設定されているプロジェクションアップデータがFrustum用でなかった場合、プログラムは停止しますので注意してください。 //! 引数にNULLを設定されたパラメータは取得されません。 //! //! @param[in] left ニアクリッピング面での視錐台左辺のX座標を格納するポインタです。 //! @param[in] right ニアクリッピング面での視錐台右辺のX座標を格納するポインタです。 //! @param[in] bottom ニアクリッピング面での視錐台下辺のY座標を格納するポインタです。 //! @param[in] top ニアクリッピング面での視錐台上辺のY座標を格納するポインタです。 //! @param[in] nearClip ニアクリッピング面までの距離を格納するポインタです。 //! @param[in] farClip ファークリッピング面までの距離を格納するポインタです。 //--------------------------------------------------------------------------- void GetFrustum( f32* left, f32* right, f32* bottom, f32* top, f32* nearClip, f32* farClip ) const; //--------------------------------------------------------------------------- //! @brief 設定されているFrustum用プロジェクションアップデータのパラメータを設定します。 //! //! この関数はパラメータを簡単に取得するためのユーティリティ関数です。 //! 設定されているプロジェクションアップデータがFrustum用でなかった場合、プログラムは停止しますので注意してください。 //! //! @param[in] left ニアクリッピング面での視錐台左辺のX座標です。 //! @param[in] right ニアクリッピング面での視錐台右辺のX座標です。 //! @param[in] bottom ニアクリッピング面での視錐台下辺のY座標です。 //! @param[in] top ニアクリッピング面での視錐台上辺のY座標です。 //! @param[in] nearClip ニアクリッピング面までの距離です。 //! @param[in] farClip ファークリッピング面までの距離です。 //--------------------------------------------------------------------------- void SetFrustum( f32 left, f32 right, f32 bottom, f32 top, f32 nearClip, f32 farClip ); //--------------------------------------------------------------------------- //! @brief 設定されているFrustum用プロジェクションアップデータのパラメータを取得します。 //! //! この関数はパラメータを簡単に取得するためのユーティリティ関数です。 //! 設定されているプロジェクションアップデータがFrustum用でなかった場合、プログラムは停止しますので注意してください。 //! 引数にNULLを設定されたパラメータは取得されません。 //! //! @param[in] rect ニアクリッピング面での視錐台近平面の矩形を格納するポインタです。 //! @param[in] nearClip ニアクリッピング面までの距離を格納するポインタです。 //! @param[in] farClip ファークリッピング面までの距離を格納するポインタです。 //--------------------------------------------------------------------------- void GetFrustum( ut::Rect* rect, f32* nearClip, f32* farClip ) const; //--------------------------------------------------------------------------- //! @brief 設定されているFrustum用プロジェクションアップデータのパラメータを設定します。 //! //! この関数はパラメータを簡単に設定するためのユーティリティ関数です。 //! 設定されているプロジェクションアップデータがFrustum用でなかった場合、プログラムは停止しますので注意してください。 //! //! @param[in] rect ニアクリッピング面での視錐台近平面の矩形です。 //! @param[in] nearClip ニアクリッピング面までの距離です。 //! @param[in] farClip ファークリッピング面までの距離です。 //--------------------------------------------------------------------------- void SetFrustum( const ut::Rect& rect, f32 nearClip, f32 farClip ); //--------------------------------------------------------------------------- //! @brief 設定されているFrustum用プロジェクションアップデータのパラメータを設定します。 //! //! 与えられたビューポートをもとにパラメータを設定します。 //! この関数はパラメータを簡単に設定するためのユーティリティ関数です。 //! 設定されているプロジェクションアップデータがFrustum用でなかった場合、プログラムは停止しますので注意してください。 //! //! @param[in] viewport ビューポートです。 //--------------------------------------------------------------------------- void SetFrustum( const Viewport& viewport ); //--------------------------------------------------------------------------- //! @brief 設定されているOrtho用プロジェクションアップデータのパラメータを取得します。 //! //! この関数はパラメータを簡単に取得するためのユーティリティ関数です。 //! 設定されているプロジェクションアップデータがOrtho用でなかった場合、プログラムは停止しますので注意してください。 //! 引数にNULLを設定されたパラメータは取得されません。 //! //! @param[in] left ニアクリッピング面での視錐台左辺のX座標を格納するポインタです。 //! @param[in] right ニアクリッピング面での視錐台右辺のX座標を格納するポインタです。 //! @param[in] bottom ニアクリッピング面での視錐台下辺のY座標を格納するポインタです。 //! @param[in] top ニアクリッピング面での視錐台上辺のY座標を格納するポインタです。 //! @param[in] nearClip ニアクリッピング面までの距離を格納するポインタです。 //! @param[in] farClip ファークリッピング面までの距離を格納するポインタです。 //--------------------------------------------------------------------------- void GetOrtho( f32* left, f32* right, f32* bottom, f32* top, f32* nearClip, f32* farClip ) const; //--------------------------------------------------------------------------- //! @brief 設定されているOrtho用プロジェクションアップデータのパラメータを設定します。 //! //! この関数はパラメータを簡単に設定するためのユーティリティ関数です。 //! 設定されているプロジェクションアップデータがOrtho用でなかった場合、プログラムは停止しますので注意してください。 //! //! @param[in] left ニアクリッピング面での視錐台左辺のX座標です。 //! @param[in] right ニアクリッピング面での視錐台右辺のX座標です。 //! @param[in] bottom ニアクリッピング面での視錐台下辺のY座標です。 //! @param[in] top ニアクリッピング面での視錐台上辺のY座標です。 //! @param[in] nearClip ニアクリッピング面までの距離です。 //! @param[in] farClip ファークリッピング面までの距離です。 //--------------------------------------------------------------------------- void SetOrtho( f32 left, f32 right, f32 bottom, f32 top, f32 nearClip, f32 farClip ); //--------------------------------------------------------------------------- //! @brief 設定されているOrtho用プロジェクションアップデータのパラメータを取得します。 //! //! この関数はパラメータを簡単に取得するためのユーティリティ関数です。 //! 設定されているプロジェクションアップデータがOrtho用でなかった場合、プログラムは停止しますので注意してください。 //! 引数にNULLを設定されたパラメータは取得されません。 //! //! @param[in] rect ニアクリッピング面での視錐台近平面の矩形を格納するポインタです。 //! @param[in] nearClip ニアクリッピング面までの距離を格納するポインタです。 //! @param[in] farClip ファークリッピング面までの距離を格納するポインタです。 //--------------------------------------------------------------------------- void GetOrtho( ut::Rect* rect, f32* nearClip, f32* farClip ) const; //--------------------------------------------------------------------------- //! @brief 設定されているOrtho用プロジェクションアップデータのパラメータを設定します。 //! //! この関数はパラメータを簡単に設定するためのユーティリティ関数です。 //! 設定されているプロジェクションアップデータがOrtho用でなかった場合、プログラムは停止しますので注意してください。 //! //! @param[in] rect ニアクリッピング面での視錐台近平面の矩形です。 //! @param[in] nearClip ニアクリッピング面までの距離です。 //! @param[in] farClip ファークリッピング面までの距離です。 //--------------------------------------------------------------------------- void SetOrtho( const ut::Rect& rect, f32 nearClip, f32 farClip ); //--------------------------------------------------------------------------- //! @brief 設定されているOrtho用プロジェクションアップデータのパラメータを設定します。 //! //! 与えられたビューポートをもとにパラメータを設定します。 //! この関数はパラメータを簡単に設定するためのユーティリティ関数です。 //! 設定されているプロジェクションアップデータがOrtho用でなかった場合、プログラムは停止しますので注意してください。 //! //! @param[in] viewport 設定元のビューポートです。 //--------------------------------------------------------------------------- void SetOrtho( const Viewport& viewport ); //--------------------------------------------------------------------------- //! @brief 設定されているプロジェクションアップデータのニアクリップまでの距離を取得します。 //! //! この関数はパラメータを簡単に取得するためのユーティリティ関数です。 //! //! @return ニアクリップまでの距離です。 //--------------------------------------------------------------------------- f32 GetNear() const; //--------------------------------------------------------------------------- //! @brief 設定されているプロジェクションアップデータのニアクリップまでの距離を設定します。 //! //! この関数はパラメータを簡単に取得するためのユーティリティ関数です。 //! //! @param[in] near ニアクリップまでの距離です。 //--------------------------------------------------------------------------- void SetNear(f32 near); //--------------------------------------------------------------------------- //! @brief 設定されているプロジェクションアップデータのファークリップまでの距離を取得します。 //! //! この関数はパラメータを簡単に取得するためのユーティリティ関数です。 //! //! @return ファークリップまでの距離です。 //--------------------------------------------------------------------------- f32 GetFar() const; //--------------------------------------------------------------------------- //! @brief 設定されているプロジェクションアップデータのファークリップまでの距離を設定します。 //! //! この関数はパラメータを簡単に取得するためのユーティリティ関数です。 //! //! @param[in] far ファークリップまでの距離です。 //--------------------------------------------------------------------------- void SetFar(f32 far); //@} protected: //---------------------------------------- //! @name コンストラクタ/デストラクタ //@{ //! コンストラクタです。 Camera( os::IAllocator* allocator, ResTransformNode resObj, const Camera::Description& description, GfxPtr viewUpdater, GfxPtr projectionUpdater, f32 wscale, bool isDynamic); //! デストラクタです。 virtual ~Camera(); //@} struct ResCameraDestroyer : public std::unary_function { ResCameraDestroyer(os::IAllocator* allocator = 0) : m_Allocator(allocator) {} result_type operator()(argument_type data) { DestroyResCamera(m_Allocator, data); } os::IAllocator* m_Allocator; }; private: virtual Result Initialize(os::IAllocator* allocator); //! アニメーションを初期状態に戻すため、初期化時の状態を保存します。 Result StoreOriginal(os::IAllocator* allocator); //--------------------------------------------------------------------------- //! @brief ResCamera のリソースを破棄します。 //! //! @param[in] allocator リソース用のメモリを解放するアロケータです。 //! @param[in] resCamera 解放するリソースです。 //--------------------------------------------------------------------------- static void DestroyResCamera(os::IAllocator* allocator, ResCamera resCamera); Result CreateAnimGroup(os::IAllocator* allocator); //! @brief アニメーションに登録するモデルデータのポインタを取得します。 void* GetAnimTargetObject(const anim::ResAnimGroupMember& anim); //! @details :private // アニメーションとカメラで、view/projectionのupdaterが一致しているかチェックします。 bool ValidateCameraAnimType(AnimObject* animObject); math::MTX34 m_ViewMatrix; math::MTX34 m_InverseViewMatrix; math::MTX44 m_ProjectionMatrix; math::MTX44 m_InverseProjectionMatrix; math::MTX34 m_TextureProjectionMatrix; GfxPtr m_ViewUpdater; GfxPtr m_ProjectionUpdater; AnimGroup* m_AnimGroup; ResCamera m_OriginalValue; math::Transform3 m_OriginalTransform; f32 m_WScale; bool m_IsDynamic; }; } // namespace gfx } // namespace nw #endif // NW_GFX_CAMERA_H_