1 /*---------------------------------------------------------------------------*
2   Project:  NintendoWare
3   File:     snd_Sound3DActor.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: $
14  *---------------------------------------------------------------------------*/
15 
16 /**
17  * :include nw/snd/snd_Sound3DActor.h
18  *
19  * @file snd_Sound3DActor.h
20  */
21 
22 #ifndef NW_SND_SOUND_3D_ACTOR_H_
23 #define NW_SND_SOUND_3D_ACTOR_H_
24 
25 #include <nw/snd/snd_SoundActor.h>
26 #include <nw/snd/snd_BasicSound.h>
27 #include <nw/math/math_Types.h>         // nw::math::VEC3
28 
29 namespace nw {
30 namespace snd {
31 
32 class Sound3DManager;
33 class SoundArchivePlayer;
34 class SoundHandle;
35 
36 /* ========================================================================
37         class difinition
38    ======================================================================== */
39 
40 //---------------------------------------------------------------------------
41 //! @brief    3D 空間内での音源を表す 3D サウンドアクタークラスです。
42 //!
43 //!           1 つのアクターは複数のサウンドを同時に管理することができます。
44 //!
45 //!           アクターのインスタンスが存在する間、
46 //!           アクターに設定された位置情報を元に @ref nw::snd::Sound3DManager
47 //!           クラスがサウンドのパラメータを計算して設定します。
48 //!           アクターのインスタンスが無くなっても、
49 //!           そのアクターのサウンド再生は続きますが、
50 //!           3D のパラメータの更新は行われなくなります。
51 //!
52 //! @see Sound3DManager クラス
53 //!
54 //! @date 2010/02/25 初版
55 //---------------------------------------------------------------------------
56 class Sound3DActor
57 : public SoundActor,
58   public internal::BasicSound::AmbientArgUpdateCallback
59 {
60   public:
61 
62     //! @name コンストラクタ/デストラクタ
63     //@{
64     //---------------------------------------------------------------------------
65     //! @brief    コンストラクタです。
66     //!
67     //!           3D サウンドアクターは、
68     //!           引数で渡されたサウンドアーカイブプレイヤーを使用してサウンドを再生します。
69     //!           また、3D サウンドのパラメータ計算には、
70     //!           引数で渡された 3D サウンドマネージャーを使用します。
71     //!
72     //!           引数付きのコンストラクタの場合は、
73     //!           @ref Initialize を呼ぶ必要はありません
74     //!           (呼んでも問題ありません)。
75     //!
76     //! @param[in] player     アクターが使用するサウンドアーカイブプレイヤーです。
77     //! @param[in] manager    アクターが使用する 3D サウンドマネージャーです。
78     //!
79     //! @see SoundArchivePlayer クラス
80     //! @see Sound3DManager クラス
81     //! @see Initialize
82     //!
83     //! @date 2010/03/12 Initialize に関する注意を追記
84     //! @date 2010/02/15 初版
85     //---------------------------------------------------------------------------
86     Sound3DActor( SoundArchivePlayer& player, Sound3DManager& manager );
87 
88     //---------------------------------------------------------------------------
89     //! @brief    コンストラクタです。
90     //!
91     //!           引数なしのコンストラクタは、@ref Initialize を呼ぶ必要があります。
92     //!
93     //! @see Initialize
94     //!
95     //! @date 2010/03/12 初版
96     //---------------------------------------------------------------------------
97     Sound3DActor();
98 
99     //---------------------------------------------------------------------------
100     //! @brief    デストラクタです。
101     //!
102     //! @date 2010/02/15 初版
103     //---------------------------------------------------------------------------
104     virtual ~Sound3DActor();
105     //@}
106 
107     //! @name 初期化
108     //@{
109     //---------------------------------------------------------------------------
110     //! @brief    3D サウンドアクターを初期化します。
111     //!
112     //!           3D サウンドアクターを使用する前に、初期化を行う必要があります。
113     //!           ただし、引数付きコンストラクタを呼んでいる場合は、
114     //!           呼ぶ必要はありません (呼んでも問題ありません)。
115     //!
116     //!           @ref SoundActor::Initialize は本関数内で呼ばれます。
117     //!
118     //!           同じ Sound3DActor インスタンスを再利用するには、
119     //!           あらかじめ @ref Finalize 関数を呼んでから、
120     //!           再度、本関数を呼び出してください。
121     //!
122     //! @param[in] player     アクターが使用するサウンドアーカイブプレイヤーです。
123     //! @param[in] manager    アクターが使用する 3D サウンドマネージャーです。
124     //!
125     //! @see SoundArchivePlayer クラス
126     //! @see Sound3DManager クラス
127     //! @see Sound3DActor()
128     //! @see Finalize
129     //!
130     //! @date 2010/04/27 再利用に関する記述を追記
131     //! @date 2010/03/12 初版
132     //---------------------------------------------------------------------------
133     void Initialize( SoundArchivePlayer& player, Sound3DManager& manager );
134 
135     //---------------------------------------------------------------------------
136     //! @brief    3D サウンドアクターを破棄します。
137     //!
138     //!           デストラクタの中で呼ばれますが、
139     //!           明示的に呼んでも問題ありません。
140     //!
141     //!           同じ Sound3DActor インスタンスを再利用するには、
142     //!           本関数を呼んだ後、再度 @ref Initialize 関数を呼び出してください。
143     //!
144     //! @see ~Sound3DActor
145     //! @see Initialize
146     //!
147     //! @date 2010/04/27 再利用に関する記述を追記
148     //! @date 2010/03/12 初版
149     //---------------------------------------------------------------------------
150     void Finalize();
151     //@}
152 
153     //! @name 位置・速度情報の設定と取得
154     //@{
155     //---------------------------------------------------------------------------
156     //! @brief    アクターの位置情報を設定します。
157     //!
158     //!           3D サウンドアクターの位置情報を設定します。
159     //!           設定された座標は、3D サウンドのパラメータ計算で使用されます。
160     //!
161     //!           新しく位置情報を設定した際、前回設定された位置情報との差分を計算し、
162     //!           3D サウンドアクターの速度が自動的に設定されます。
163     //!           アクターの速度は、ドップラー効果による音程変化に反映されます。
164     //!           速度は @ref nw::snd::Sound3DActor::SetVelocity
165     //!           で明示的に設定することも可能です。
166     //!
167     //!           座標が別の位置に飛んだ場合、飛んだ距離の差分で速度が計算されてしまうため、
168     //!           極めて高速で移動したように処理され、急激な音程変化が発生します。
169     //!           このような場合、この関数を呼び出した後で、
170     //!           @ref nw::snd::Sound3DActor::SetVelocity を呼び出し、
171     //!           速度を明示的に設定する必要があることに注意してください。
172     //!
173     //! @param[in] position   アクターの位置座標です。
174     //!
175     //! @see SetVelocity
176     //! @see GetPosition
177     //!
178     //! @date 2010/02/15 初版
179     //---------------------------------------------------------------------------
180     void SetPosition( const nw::math::VEC3& position );
181 
182     //---------------------------------------------------------------------------
183     //! @brief    アクターの位置情報を取得します。
184     //!
185     //! @return   現在設定されているアクターの位置情報を返します。
186     //!
187     //! @see SetPosition
188     //!
189     //! @date 2010/02/15 初版
190     //---------------------------------------------------------------------------
GetPosition()191     const nw::math::VEC3& GetPosition() const { return m_Position; }
192 
193     //---------------------------------------------------------------------------
194     //! @brief    アクターの位置情報をリセットします。
195     //!
196     //!           3D サウンドアクターの位置情報と速度をゼロクリアします。
197     //!
198     //!           この関数でリセットした直後の @ref nw::snd::Sound3DActor::SetPosition
199     //!           の呼び出しでは、3D サウンドアクターの速度は設定されません。
200     //!
201     //! @see SetPosition
202     //! @see SetVelocity
203     //!
204     //! @date 2010/02/15 初版
205     //---------------------------------------------------------------------------
206     void ResetPosition();
207 
208     //---------------------------------------------------------------------------
209     //! @brief    アクターの速度を設定します。
210     //!
211     //!           設定された速度は、ドップラー効果による音程変化に反映されます。
212     //!
213     //!           3D サウンドアクターの速度は @ref nw::snd::Sound3DActor::SetPosition
214     //!           で座標を設定した際、前回の登録座標との差分から自動的に設定されますが、
215     //!           この関数を使用すると 3D サウンドアクターの速度を手動で設定することができます。
216     //!
217     //! @param[in] velocity   アクターの速度です。
218     //!
219     //! @see GetVelocity
220     //! @see SetPosition
221     //!
222     //! @date 2010/02/15 初版
223     //---------------------------------------------------------------------------
224     void SetVelocity( const nw::math::VEC3& velocity );
225 
226     //---------------------------------------------------------------------------
227     //! @brief    アクターの速度を取得します。
228     //!
229     //! @return   現在設定されているアクターの速度を返します。
230     //!
231     //! @see SetVelocity
232     //! @see SetPosition
233     //!
234     //! @date 2010/02/15 初版
235     //---------------------------------------------------------------------------
GetVelocity()236     const nw::math::VEC3& GetVelocity() const { return m_Velocity; }
237     //@}
238 
239     //! @name パラメータ設定・取得
240     //@{
241     //---------------------------------------------------------------------------
242     //! @brief    アクターにユーザーパラメータを設定します。
243     //!
244     //!           設定されたユーザーパラメータは、
245     //!           @ref nw::snd::Sound3DParam 構造体の actorUserParam に反映されます。
246     //!
247     //! @param[in] param  ユーザーパラメータです。
248     //!
249     //! @see GetUserParam
250     //! @see Sound3DParam 構造体
251     //!
252     //! @date 2010/03/12 初版
253     //---------------------------------------------------------------------------
SetUserParam(u32 param)254     void SetUserParam( u32 param ) { m_UserParam = param; }
255 
256     //---------------------------------------------------------------------------
257     //! @brief    アクターのユーザーパラメータを取得します。
258     //!
259     //! @return   現在設定されているアクターのユーザーパラメータを返します。
260     //!
261     //! @see SetUserParam
262     //!
263     //! @date 2010/02/15 初版
264     //---------------------------------------------------------------------------
GetUserParam()265     u32 GetUserParam() const { return m_UserParam; }
266     //@}
267 
268   protected:
269     // リファレンスは SoundActor::Setup に書かれている
270     virtual SoundStartable::StartResult SetupSound(
271         SoundHandle* handle,
272         u32 soundId,
273         const StartInfo* startInfo,
274         void* setupArg
275     );
276 
277     //! @details :private
278     virtual void detail_UpdateAmbientArg( void* arg, const internal::BasicSound* sound );
279 
280   private:
281     static void ClearUpdateCallback( SoundHandle& handle );
282 
283     Sound3DManager* m_p3dManager;
284     SoundArchivePlayer* m_pArchivePlayer;
285     u32 m_UserParam;
286     nw::math::VEC3 m_Position;
287     nw::math::VEC3 m_Velocity;
288     bool m_ResetPositionFlag;
289     bool m_IsInitialized;
290     bool m_IsFinalized;
291 };
292 
293 } // namespace nw::snd
294 } // namespace nw
295 
296 
297 #endif /* NW_SND_SOUND_3D_ACTOR_H_ */
298 
299