1 /*---------------------------------------------------------------------------* 2 Project: NintendoWare 3 File: anim_AnimFrameController.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: 28487 $ 14 *---------------------------------------------------------------------------*/ 15 16 #ifndef NW_ANIM_ANIMFRAMECONTROLLER_H_ 17 #define NW_ANIM_ANIMFRAMECONTROLLER_H_ 18 19 #include <nw/types.h> 20 21 namespace nw { 22 namespace anim { 23 24 //--------------------------------------------------------------------------- 25 //! @brief アニメーションフレームのクラスです。 26 //--------------------------------------------------------------------------- 27 class AnimFrame 28 { 29 public: 30 //---------------------------------------- 31 //! @name コンストラクタ/デストラクタ 32 //@{ 33 34 //! コンストラクタです。 AnimFrame()35 AnimFrame() { ResetFrame(0.0f); } 36 37 //! @brief コンストラクタです。 38 //! 39 //! @param[in] frame フレームです。 40 //! AnimFrame(f32 frame)41 AnimFrame(f32 frame) { ResetFrame(frame); } 42 43 //! @brief コンストラクタです。 44 //! 45 //! @param[in] frame フレームです。 46 //! @param[in] lastFrame 前回のフレームです。 47 //! AnimFrame(f32 frame,f32 lastFrame)48 AnimFrame(f32 frame, f32 lastFrame) { Set(frame, lastFrame); } 49 50 //! @brief コンストラクタです。 51 //! 52 //! @param[in] animFrame アニメーションフレームです。 53 //! AnimFrame(const AnimFrame & animFrame)54 AnimFrame(const AnimFrame& animFrame) { Set(animFrame); } 55 56 //! デストラクタです。 ~AnimFrame()57 virtual ~AnimFrame() {} 58 59 //@} 60 61 //---------------------------------------- 62 //! @name 取得/設定 63 //@{ 64 65 //! フレームを取得します。 GetFrame()66 f32 GetFrame() const { return m_Frame; } 67 68 //! @brief フレームを設定します。 69 //! 70 //! @param[in] frame 設定するフレームです。 71 //! SetFrame(f32 frame)72 void SetFrame(f32 frame) 73 { 74 m_LastFrame = m_Frame; 75 m_Frame = frame; 76 } 77 78 //! 前回のフレームを取得します。 GetLastFrame()79 f32 GetLastFrame() const { return m_LastFrame; } 80 81 //! @brief 前回のフレームを設定します。 82 //! 83 //! @param[in] lastFrame 設定する前回のフレームです。 84 //! SetLastFrame(f32 lastFrame)85 void SetLastFrame(f32 lastFrame) { m_LastFrame = lastFrame; } 86 87 //! @brief アニメーションフレームを設定します。 88 //! 89 //! @param[in] animFrame 設定するアニメーションフレームです。 90 //! Set(const AnimFrame & animFrame)91 void Set(const AnimFrame& animFrame) 92 { 93 m_Frame = animFrame.GetFrame(); 94 m_LastFrame = animFrame.GetLastFrame(); 95 } 96 97 //! @brief アニメーションフレームを設定します。 98 //! 99 //! @param[in] frame 設定するフレームです。 100 //! @param[in] lastFrame 設定する前回のフレームです。 101 //! Set(f32 frame,f32 lastFrame)102 void Set(f32 frame, f32 lastFrame) 103 { 104 m_Frame = frame; 105 m_LastFrame = lastFrame; 106 } 107 108 //! @brief アニメーションフレームをリセットします。 109 //! 110 //! @param[in] frame 設定するフレームです。 111 //! ResetFrame(f32 frame)112 void ResetFrame(f32 frame) 113 { 114 m_Frame = m_LastFrame = frame; 115 } 116 117 //! フレーム間隔を取得します。 GetDelta()118 f32 GetDelta() const { return m_Frame - m_LastFrame; } 119 120 //! 順再生かどうかを取得します。 IsOrder()121 bool IsOrder() const { return m_Frame >= m_LastFrame; } 122 123 //@} 124 125 //---------------------------------------- 126 //! @name 比較 127 //@{ 128 129 bool operator==(const AnimFrame& rhs) const 130 { 131 return m_Frame == rhs.m_Frame && m_LastFrame == rhs.m_LastFrame; 132 } 133 bool operator!=(const AnimFrame& rhs) const 134 { 135 return m_Frame != rhs.m_Frame || m_LastFrame != rhs.m_LastFrame; 136 } 137 138 //@} 139 140 private: 141 f32 m_Frame; 142 f32 m_LastFrame; 143 }; 144 145 //--------------------------------------------------------------------------- 146 //! @brief 一回再生用のアニメーション再生方法です。 147 //! 148 //! @param[in] startFrame 開始フレームです。 149 //! @param[in] endFrame 終了フレームです。 150 //! @param[in] inputFrame 元のフレームです。 151 //! @param[in] pUserData ユーザーデータです。 152 //! 153 //! @return 修正したフレームを返します。 154 //--------------------------------------------------------------------------- 155 f32 PlayPolicy_Onetime(f32 startFrame, f32 endFrame, f32 inputFrame, void* pUserData); 156 157 //--------------------------------------------------------------------------- 158 //! @brief ループ再生用のアニメーション再生方法です。 159 //! 160 //! @param[in] startFrame 開始フレームです。 161 //! @param[in] endFrame 終了フレームです。 162 //! @param[in] inputFrame 元のフレームです。 163 //! @param[in] pUserData ユーザーデータです。 164 //! 165 //! @return 修正したフレームを返します。 166 //--------------------------------------------------------------------------- 167 f32 PlayPolicy_Loop(f32 startFrame, f32 endFrame, f32 inputFrame, void* pUserData); 168 169 //--------------------------------------------------------------------------- 170 //! @brief アニメーションフレームを制御するクラスです。 171 //--------------------------------------------------------------------------- 172 class AnimFrameController 173 { 174 public: 175 //! アニメーション再生方法の型です。 176 typedef f32 (*PlayPolicy)(f32 startFrame, f32 endFrame, f32 inputFrame, void* pUserData); 177 178 //---------------------------------------- 179 //! @name コンストラクタ/デストラクタ 180 //@{ 181 182 //! @brief コンストラクタです。 183 //! 184 //! @param[in] startFrame 開始フレームです。 185 //! @param[in] endFrame 終了フレームです。 186 //! @param[in] playPolicy アニメーション再生方法です。 187 //! @param[in] userData ユーザーデータです。 188 //! 189 AnimFrameController( 190 f32 startFrame = 0.0f, 191 f32 endFrame = 1.0f, 192 PlayPolicy playPolicy = PlayPolicy_Onetime, 193 void* userData = NULL) m_AnimFrame(startFrame)194 : m_AnimFrame(startFrame), 195 m_StepFrame(1.0f), 196 m_StartFrame(startFrame), 197 m_EndFrame(endFrame), 198 m_PlayPolicy(playPolicy), 199 m_UserData(userData) 200 {} 201 202 //! デストラクタです。 ~AnimFrameController()203 virtual ~AnimFrameController() {} 204 205 //@} 206 207 //---------------------------------------- 208 //! @name 取得/設定 209 //@{ 210 211 //! アニメーションフレームを取得します。 GetAnimFrame()212 const AnimFrame& GetAnimFrame() const { return m_AnimFrame; } 213 214 //! アニメーションフレームを取得します。 GetAnimFrame()215 AnimFrame& GetAnimFrame() { return m_AnimFrame; } 216 217 //! アニメーションフレームを設定します。 SetAnimFrame(const AnimFrame & animFrame)218 void SetAnimFrame(const AnimFrame& animFrame) { m_AnimFrame = animFrame; } 219 220 //! フレームを取得します。 GetFrame()221 f32 GetFrame() const { return m_AnimFrame.GetFrame(); } 222 223 //! @brief フレームを設定します。 224 //! 225 //! @param[in] frame 設定するフレームです。 226 //! SetFrame(f32 frame)227 void SetFrame(f32 frame) 228 { 229 m_AnimFrame.SetFrame(m_PlayPolicy(m_StartFrame, m_EndFrame, frame, m_UserData)); 230 } 231 232 //! フレームの増分を取得します。 GetStepFrame()233 f32 GetStepFrame() const { return m_StepFrame; } 234 235 //! @brief フレームの増分を設定します。 236 //! 237 //! 1 回の UpdateFrame() で進めるフレーム数です。 238 //! 239 //! @param[in] stepFrame 設定する増分です。 240 //! SetStepFrame(f32 stepFrame)241 void SetStepFrame(f32 stepFrame) { m_StepFrame = stepFrame; } 242 243 //! 開始フレームを取得します。 GetStartFrame()244 f32 GetStartFrame() const { return m_StartFrame; } 245 246 //! @brief 開始フレームを設定します。 247 //! 248 //! @param[in] startFrame 設定する開始フレームです。 249 //! SetStartFrame(f32 startFrame)250 void SetStartFrame(f32 startFrame) { m_StartFrame = startFrame; } 251 252 //! 終了フレームを取得します。 GetEndFrame()253 f32 GetEndFrame() const { return m_EndFrame; } 254 255 //! @brief 終了フレームを設定します。 256 //! 257 //! @param[in] endFrame 設定する終了フレームです。 258 //! SetEndFrame(f32 endFrame)259 void SetEndFrame(f32 endFrame) { m_EndFrame = endFrame; } 260 261 //! アニメーション再生方法を取得します。 GetPlayPolicy()262 PlayPolicy GetPlayPolicy() const { return m_PlayPolicy; } 263 264 //! @brief アニメーション再生方法を設定します。 265 //! 266 //! @param[in] playPolicy 設定するアニメーション再生方法です。 267 //! PlayPolicy_Onetime() と PlayPolicy_Loop() がライブラリで用意されています。 268 //! SetPlayPolicy(PlayPolicy playPolicy)269 void SetPlayPolicy(PlayPolicy playPolicy) { m_PlayPolicy = playPolicy; } 270 271 //! ユーザーデータを取得します。 GetUserData()272 const void* GetUserData() const { return m_UserData; } 273 274 //! ユーザーデータを取得します。 GetUserData()275 void* GetUserData() { return m_UserData; } 276 277 //! @brief ユーザーデータを設定します。 278 //! 279 //! 設定したユーザーデータは、 SetPlayPolicy() で設定した関数に渡されます。 280 //! ユーザー定義の関数を設定している場合に、関数内からアクセスすることができます。 281 //! 例えば、アニメーションの再生が終了したらフラグを立てるといった応用があります。 282 //! 283 //! @param[in] userData 設定するユーザーデータです。 284 //! SetUserData(void * userData)285 void SetUserData(void* userData) { m_UserData = userData; } 286 287 //@} 288 289 //---------------------------------------- 290 //! @name 更新 291 //@{ 292 293 //! アニメーションフレームを進めます。 UpdateFrame()294 void UpdateFrame() 295 { 296 SetFrame(GetFrame() + m_StepFrame); 297 } 298 299 //@} 300 301 private: 302 AnimFrame m_AnimFrame; 303 f32 m_StepFrame; 304 f32 m_StartFrame; 305 f32 m_EndFrame; 306 PlayPolicy m_PlayPolicy; 307 void* m_UserData; 308 }; 309 310 } /* namespace anim */ 311 } /* namespace nw */ 312 313 #endif /* NW_ANIM_ANIMFRAMECONTROLLER_H_ */ 314