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