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