1 /*---------------------------------------------------------------------------*
2   Project:  Horizon
3   File:     ulcd_StereoCamera.h
4 
5   Copyright (C)2010 Nintendo Co., Ltd.  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   $Rev: 28083 $
14  *---------------------------------------------------------------------------*/
15 
16 /*! @file
17     @brief    StereoCamera に関するAPIの宣言
18 
19     :include nn/ulcd.h
20 */
21 
22 #ifndef NN_ULCD_CTR_STEREO_CAMERA_H_
23 #define NN_ULCD_CTR_STEREO_CAMERA_H_
24 
25 #include <nn/WithInitialize.h>
26 #include <nn/util/util_NonCopyable.h>
27 #include <nn/math.h>
28 
29 namespace nn {
30 namespace ulcd {
31 namespace CTR {
32 
33     /*!
34         @brief 両眼視差を考慮した絵を描画するためのカメラ行列作成をサポートするクラスです。
35     */
36     class StereoCamera
37     {
38     public:
39 
40         /*!
41             @brief   立体視のためのカメラ行列生成モジュールを構築します。初期化は行いません。
42 
43                      初期化を行わないため、別途、@ref Initialize を呼ぶ必要があります。
44 
45             @return  なし。
46         */
47         StereoCamera();
48         /*!
49             @brief   立体視のためのカメラ行列生成モジュールを構築し、初期化します。
50 
51             @return  なし。
52         */
53         StereoCamera(const nn::WithInitialize&);
54         /*!
55             @brief   立体視のためのカメラ行列生成モジュールを破棄します。
56 
57                      内部で Finalize() を呼び出します。
58 
59             @return  なし。
60         */
61         ~StereoCamera();
62 
63         /*!
64             @brief   立体視のためのカメラ行列生成モジュールの初期化を行います。
65 
66             @return  なし。
67         */
68         void Initialize(void);
69         /*!
70             @brief   立体視のためのカメラ行列生成モジュールの終了処理を行います。
71 
72             @return  なし。
73         */
74         void Finalize(void);
75         /*!
76             :overload matrix
77 
78             @brief   ベースカメラのビューボリュームを構成するパラメータを設定します。
79 
80             @param[in]  proj    ベースカメラに対するプロジェクション行列
81 
82             @return  なし。
83         */
84         void SetBaseFrustum(const nn::math::Matrix44 *proj);
85         /*!
86             :overload parameters
87 
88             @brief   ベースカメラのビューボリュームを構成するパラメータを設定します。
89 
90             @param[in]  left        ベースカメラのビューボリュームにおけるニアクリップ面の左辺位置
91             @param[in]  right       ベースカメラのビューボリュームにおけるニアクリップ面の右辺位置
92             @param[in]  bottom      ベースカメラのビューボリュームにおけるニアクリップ面の下辺位置
93             @param[in]  top         ベースカメラのビューボリュームにおけるニアクリップ面の上辺位置
94             @param[in]  near        ベースカメラのビューボリュームにおけるニアクリップ面までの距離
95             @param[in]  far         ベースカメラのビューボリュームにおけるファークリップ面までの距離
96 
97             @return  なし。
98         */
99         void SetBaseFrustum(const f32 left, const f32 right, const f32 bottom, const f32 top, const f32 near, const f32 far);
100         /*!
101             :overload matrix
102 
103             @brief   ベースカメラのビュー行列を設定します。
104 
105             @param[in]  view            ベースとなるビュー行列
106 
107             @return  なし。
108         */
109         void SetBaseCamera(const nn::math::Matrix34 *view);
110         /*!
111             :overload parameters
112 
113             @brief   ベースカメラのビュー行列を設定します。
114 
115             @param[in]  position        カメラの位置座標
116             @param[in]  rightDir        カメラの右手方向を示す単位ベクトル
117             @param[in]  upDir           カメラの上方向を示す単位ベクトル
118             @param[in]  targetDir       カメラの撮影方向を示す単位ベクトル
119 
120             @return  なし。
121         */
122         void SetBaseCamera(const nn::math::Vector3 *position, const nn::math::Vector3 *rightDir,
123                            const nn::math::Vector3 *upDir, const nn::math::Vector3 *targetDir);
124         /*!
125             @brief   奥行き方向の限界視差を設定します。
126 
127             @param[in] limit        設定する限界視差(mm)
128 
129             @return  なし。
130         */
131         void SetLimitParallax(const f32 limit);
132         /*!
133             :overload newapi
134 
135             @brief   アプリケーション優先の方法で、左右カメラそれぞれのビュー行列とプロジェクション行列を計算します。
136 
137             @param[out]    projL        左のプロジェクション行列計算結果格納場所
138             @param[out]    viewL        左のビュー行列計算結果格納場所
139             @param[out]    projR        右のプロジェクション行列計算結果格納場所
140             @param[out]    viewR        右のビュー行列計算結果格納場所
141             @param[in]     depthLevel   LCD 上に配置したい場所(基準面)までのカメラからの距離
142             @param[in]     factor       立体具合の調整係数(0で視差が無くなり、1で標準となります。)
143             @param[in]     pivot        上画面におけるカメラの上方向(回転処理に利用)
144 
145             @return  なし
146         */
147         void CalculateMatrices(nn::math::Matrix44* projL, nn::math::Matrix34* viewL,
148                                nn::math::Matrix44* projR, nn::math::Matrix34* viewR,
149                                const f32 depthLevel, const f32 factor,
150                                const nn::math::PivotDirection pivot = nn::math::PIVOT_UPSIDE_TO_TOP);
151 
152         /*!
153             @brief   現実感を優先した方法で、左右カメラそれぞれのビュー行列とプロジェクション行列を計算します。
154 
155             @param[out]    projL        左のプロジェクション行列計算結果格納場所
156             @param[out]    viewL        左のビュー行列計算結果格納場所
157             @param[out]    projR        右のプロジェクション行列計算結果格納場所
158             @param[out]    viewR        右のビュー行列計算結果格納場所
159             @param[in]     depthLevel   液晶面に配置したい場所までのカメラからの仮想空間距離
160             @param[in]     factor       立体具合の調整係数(0で視差が無くなり、1で標準となります。)
161             @param[in]     pivot        上画面におけるカメラの上方向(回転処理に利用)
162 
163             @return  なし
164         */
165         void CalculateMatricesReal(nn::math::Matrix44* projL, nn::math::Matrix34* viewL,
166                                    nn::math::Matrix44* projR, nn::math::Matrix34* viewR,
167                                    const f32 depthLevel, const f32 factor,
168                                    const nn::math::PivotDirection pivot = nn::math::PIVOT_UPSIDE_TO_TOP);
169         /*!
170             :overload oldapi
171 
172             @brief   通常描画用のプロジェクション行列とビュー行列から、立体視用の左右それぞれの行列を計算します。
173 
174             @param[out]    projL        左のプロジェクション行列計算結果格納場所
175             @param[out]    viewL        左のビュー行列計算結果格納場所
176             @param[out]    projR        右のプロジェクション行列計算結果格納場所
177             @param[out]    viewR        右のビュー行列計算結果格納場所
178             @param[in]     projOriginal 元のプロジェクション行列
179             @param[in]     viewOriginal 元のビュー行列
180             @param[in]     depthLevel   液晶面に配置したい場所までのカメラからの仮想空間距離
181             @param[in]     factor       立体具合の調整係数(0で視差が無くなり、1で標準となります。)
182             @param[in]     realSwitch   現実感を出すために視野角の変更を許すか
183 
184             @return
185         */
186         f32 CalculateMatrices( nn::math::Matrix44* projL, nn::math::Matrix34* viewL,
187                                nn::math::Matrix44* projR, nn::math::Matrix34* viewR,
188                                const nn::math::Matrix44* projOriginal, const nn::math::Matrix34* viewOriginal,
189                                const f32 depthLevel, const f32 factor, const bool realSwitch);
190         /*!
191             @brief   カメラから指定した距離離れた地点における視差を画面幅に対する割合で求めます。
192 
193             @param[in]  distance        カメラからの距離
194 
195             @return  指定した地点における、左右方向それぞれに対するオブジェクトのずれ量(割合 1.0f = 100%)
196          */
197         f32 GetParallax(const f32 distance) const;
198 
199         f32 GetCoefficientForParallax(void) const;
200         /*!
201             @brief   最も遠い位置における視差を画面幅に対する割合で求めます。
202 
203                      @return  最も遠い位置に表示を行うためのオブジェクトのずれ量
204          */
205         f32 GetMaxParallax(void) const;
206         /*!
207             @brief   設定されている奥行き方向の限界視差を取得します。
208 
209             @return  設定中の限界視差(mm)
210          */
GetLimitParallax(void)211         f32 GetLimitParallax(void) const { return m_LimitParallax; }
212         /*!
213             @brief   カメラから基準面までの距離を取得します。
214 
215                      @return  カメラから基準面までの距離
216          */
GetDistanceToLevel(void)217         f32 GetDistanceToLevel(void) const { return m_DepthLevel; }
218         /*!
219             @brief   カメラからニアクリップ面までの距離を取得します。
220 
221                      @return  カメラからニアクリップ面までの距離
222          */
GetDistanceToNearClip(void)223         f32 GetDistanceToNearClip(void) const { return m_DistanceToNearClip; }
224         /*!
225             @brief   カメラからファークリップ面までの距離を取得します。
226 
227                      @return  カメラからファークリップ面までの距離
228          */
GetDistanceToFarClip(void)229         f32 GetDistanceToFarClip(void) const { return m_DistanceToFarClip; }
230 
231     private:
232 
233         struct CameraInfo
234         {
235             f32 left;       //!< ビューボリュームの left 値
236             f32 right;      //!< ビューボリュームの right 値
237             f32 bottom;     //!< ビューボリュームの bottom 値
238             f32 top;        //!< ビューボリュームの top 値
239             f32 near;       //!< ビューボリュームの near 値
240             f32 far;        //!< ビューボリュームの far 値
241 
242             nn::math::Vector3 position;     //!< カメラの位置
243             nn::math::Vector3 rightDir;     //!< カメラの右方向の単位ベクトル
244             nn::math::Vector3 upDir;        //!< カメラの上方向の単位ベクトル
245             nn::math::Vector3 targetDir;    //!< カメラの注視点方向の単位ベクトル
246         };
247 
248         CameraInfo m_BaseCamera;
249 
250         f32 m_LimitParallax;
251 
252         f32 m_LevelWidth;
253         f32 m_DepthLevel;
254         f32 m_DistanceToNearClip;
255         f32 m_DistanceToFarClip;
256         f32 m_CameraInterval;
257 
258 //        bool m_IsInitialized;
259 //        u8   rsv[3];
260     };
261 
262 }   // namespace CTR {
263 }   // namespace ulcd {
264 }   // namespace nn {
265 
266 
267 #endif  // #ifndef NN_ULCD_CTR_STEREO_CAMERA_H_
268 
269