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