/*---------------------------------------------------------------------------* Project: Horizon File: ulcd_StereoCamera.h Copyright (C)2010 Nintendo Co., Ltd. All rights reserved. These coded instructions, statements, and computer programs contain proprietary information of Nintendo of America Inc. and/or Nintendo Company Ltd., and are protected by Federal copyright law. 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. $Rev: 34282 $ *---------------------------------------------------------------------------*/ /*! @file @brief StereoCamera に関するAPIの宣言 :include nn/ulcd.h */ #ifndef NN_ULCD_CTR_STEREO_CAMERA_H_ #define NN_ULCD_CTR_STEREO_CAMERA_H_ #include #include #include namespace nn { namespace ulcd { namespace CTR { /*! @brief 両眼視差を考慮した絵を描画するためのカメラ行列作成をサポートするクラスです。 */ class StereoCamera { public: /*! @brief 立体視のためのカメラ行列生成モジュールを構築します。初期化は行いません。 初期化を行わないため、別途、@ref Initialize を呼ぶ必要があります。 @return なし。 */ StereoCamera(); /*! @brief 立体視のためのカメラ行列生成モジュールを構築し、初期化します。 @return なし。 */ StereoCamera(const nn::WithInitialize&); /*! @brief 立体視のためのカメラ行列生成モジュールを破棄します。 内部で Finalize() を呼び出します。 @return なし。 */ ~StereoCamera(); /*! @brief 立体視のためのカメラ行列生成モジュールの初期化を行います。 @return なし。 */ void Initialize(void); /*! @brief 立体視のためのカメラ行列生成モジュールの終了処理を行います。 @return なし。 */ void Finalize(void); /*! :overload matrix @brief ベースカメラのビューボリュームを構成するパラメータを設定します。 @param[in] proj ベースカメラに対するプロジェクション行列 @return なし。 */ void SetBaseFrustum(const nn::math::Matrix44 *proj); /*! :overload parameters @brief ベースカメラのビューボリュームを構成するパラメータを設定します。 @param[in] left ベースカメラのビューボリュームにおけるニアクリップ面の左辺位置 @param[in] right ベースカメラのビューボリュームにおけるニアクリップ面の右辺位置 @param[in] bottom ベースカメラのビューボリュームにおけるニアクリップ面の下辺位置 @param[in] top ベースカメラのビューボリュームにおけるニアクリップ面の上辺位置 @param[in] near ベースカメラのビューボリュームにおけるニアクリップ面までの距離 @param[in] far ベースカメラのビューボリュームにおけるファークリップ面までの距離 @return なし。 */ void SetBaseFrustum(const f32 left, const f32 right, const f32 bottom, const f32 top, const f32 near, const f32 far); /*! :overload matrix @brief ベースカメラのビュー行列を設定します。 @param[in] view ベースとなるビュー行列 @return なし。 */ void SetBaseCamera(const nn::math::Matrix34 *view); /*! :overload parameters @brief ベースカメラのビュー行列を設定します。 @param[in] position カメラの位置座標 @param[in] rightDir カメラの右手方向を示す単位ベクトル @param[in] upDir カメラの上方向を示す単位ベクトル @param[in] targetDir カメラの撮影方向を示す単位ベクトル @return なし。 */ void SetBaseCamera(const nn::math::Vector3 *position, const nn::math::Vector3 *rightDir, const nn::math::Vector3 *upDir, const nn::math::Vector3 *targetDir); /*! @brief 奥行き方向の限界視差を設定します。 @param[in] limit 設定する限界視差(mm) @return なし。 */ void SetLimitParallax(const f32 limit); /*! :overload newapi @brief アプリケーション優先の方法で、左右カメラそれぞれのビュー行列とプロジェクション行列を計算します。 @param[out] projL 左のプロジェクション行列計算結果格納場所 @param[out] viewL 左のビュー行列計算結果格納場所 @param[out] projR 右のプロジェクション行列計算結果格納場所 @param[out] viewR 右のビュー行列計算結果格納場所 @param[in] depthLevel LCD 上に配置したい場所(基準面)までのカメラからの距離 @param[in] factor 立体具合の調整係数(0で視差が無くなり、1で標準となります。) @param[in] pivot 上画面におけるカメラの上方向(回転処理に利用) @return なし */ void CalculateMatrices(nn::math::Matrix44* projL, nn::math::Matrix34* viewL, nn::math::Matrix44* projR, nn::math::Matrix34* viewR, const f32 depthLevel, const f32 factor, const nn::math::PivotDirection pivot = nn::math::PIVOT_UPSIDE_TO_TOP); /*! @brief 現実感を優先した方法で、左右カメラそれぞれのビュー行列とプロジェクション行列を計算します。 @param[out] projL 左のプロジェクション行列計算結果格納場所 @param[out] viewL 左のビュー行列計算結果格納場所 @param[out] projR 右のプロジェクション行列計算結果格納場所 @param[out] viewR 右のビュー行列計算結果格納場所 @param[in] depthLevel 液晶面に配置したい場所までのカメラからの仮想空間距離 @param[in] factor 立体具合の調整係数(0で視差が無くなり、1で標準となります。) @param[in] pivot 上画面におけるカメラの上方向(回転処理に利用) @return なし */ void CalculateMatricesReal(nn::math::Matrix44* projL, nn::math::Matrix34* viewL, nn::math::Matrix44* projR, nn::math::Matrix34* viewR, const f32 depthLevel, const f32 factor, const nn::math::PivotDirection pivot = nn::math::PIVOT_UPSIDE_TO_TOP); /*! :overload oldapi @brief 通常描画用のプロジェクション行列とビュー行列から、立体視用の左右それぞれの行列を計算します。 @param[out] projL 左のプロジェクション行列計算結果格納場所 @param[out] viewL 左のビュー行列計算結果格納場所 @param[out] projR 右のプロジェクション行列計算結果格納場所 @param[out] viewR 右のビュー行列計算結果格納場所 @param[in] projOriginal 元のプロジェクション行列 @param[in] viewOriginal 元のビュー行列 @param[in] depthLevel 液晶面に配置したい場所までのカメラからの仮想空間距離 @param[in] factor 立体具合の調整係数(0で視差が無くなり、1で標準となります。) @param[in] realSwitch 現実感を出すために視野角の変更を許すか @return */ f32 CalculateMatrices( nn::math::Matrix44* projL, nn::math::Matrix34* viewL, nn::math::Matrix44* projR, nn::math::Matrix34* viewR, const nn::math::Matrix44* projOriginal, const nn::math::Matrix34* viewOriginal, const f32 depthLevel, const f32 factor, const bool realSwitch); /*! @brief カメラから指定した距離離れた地点における視差を画面幅に対する割合で求めます。 @param[in] distance カメラからの距離 @return 指定した地点における、左右方向それぞれに対するオブジェクトのずれ量(割合 1.0f = 100%) */ f32 GetParallax(const f32 distance) const; f32 GetCoefficientForParallax(void) const; /*! @brief 最も遠い位置における視差を画面幅に対する割合で求めます。 @return 最も遠い位置に表示を行うためのオブジェクトのずれ量 */ f32 GetMaxParallax(void) const; /*! @brief 設定されている奥行き方向の限界視差を取得します。 @return 設定中の限界視差(mm) */ f32 GetLimitParallax(void) const { return m_LimitParallax; } /*! @brief カメラから基準面までの距離を取得します。 @return カメラから基準面までの距離 */ f32 GetDistanceToLevel(void) const { return m_DepthLevel; } /*! @brief カメラからニアクリップ面までの距離を取得します。 @return カメラからニアクリップ面までの距離 */ f32 GetDistanceToNearClip(void) const { return m_DistanceToNearClip; } /*! @brief カメラからファークリップ面までの距離を取得します。 @return カメラからファークリップ面までの距離 */ f32 GetDistanceToFarClip(void) const { return m_DistanceToFarClip; } private: struct CameraInfo { f32 left; //!< ビューボリュームの left 値 f32 right; //!< ビューボリュームの right 値 f32 bottom; //!< ビューボリュームの bottom 値 f32 top; //!< ビューボリュームの top 値 f32 near; //!< ビューボリュームの near 値 f32 far; //!< ビューボリュームの far 値 nn::math::Vector3 position; //!< カメラの位置 nn::math::Vector3 rightDir; //!< カメラの右方向の単位ベクトル nn::math::Vector3 upDir; //!< カメラの上方向の単位ベクトル nn::math::Vector3 targetDir; //!< カメラの注視点方向の単位ベクトル }; CameraInfo m_BaseCamera; f32 m_LimitParallax; f32 m_LevelWidth; f32 m_DepthLevel; f32 m_DistanceToNearClip; f32 m_DistanceToFarClip; f32 m_CameraInterval; // bool m_IsInitialized; // u8 rsv[3]; }; } // namespace CTR { } // namespace ulcd { } // namespace nn { #endif // #ifndef NN_ULCD_CTR_STEREO_CAMERA_H_