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