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