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: 24183 $
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     //! @param[in] stepFrame 設定する更新フレームです。
238     //!
SetStepFrame(f32 stepFrame)239     void SetStepFrame(f32 stepFrame) { m_StepFrame = stepFrame; }
240 
241     //! 開始フレームを取得します。
GetStartFrame()242     f32 GetStartFrame() const { return m_StartFrame; }
243 
244     //! @brief 開始フレームを設定します。
245     //!
246     //! @param[in] startFrame 設定する開始フレームです。
247     //!
SetStartFrame(f32 startFrame)248     void SetStartFrame(f32 startFrame) { m_StartFrame = startFrame; }
249 
250     //! 終了フレームを取得します。
GetEndFrame()251     f32 GetEndFrame() const { return m_EndFrame; }
252 
253     //! @brief 終了フレームを設定します。
254     //!
255     //! @param[in] endFrame 設定する終了フレームです。
256     //!
SetEndFrame(f32 endFrame)257     void SetEndFrame(f32 endFrame) { m_EndFrame = endFrame; }
258 
259     //! アニメーション再生方法を取得します。
GetPlayPolicy()260     PlayPolicy GetPlayPolicy() const { return m_PlayPolicy; }
261 
262     //! @brief アニメーション再生方法を設定します。
263     //!
264     //! @param[in] playPolicy 設定するアニメーション再生方法です。
265     //! PlayPolicy_Onetime() と PlayPolicy_Loop() がライブラリで用意されています。
266     //!
SetPlayPolicy(PlayPolicy playPolicy)267     void SetPlayPolicy(PlayPolicy playPolicy) { m_PlayPolicy = playPolicy; }
268 
269     //! ユーザーデータを取得します。
GetUserData()270     const void* GetUserData() const { return m_UserData; }
271 
272     //! ユーザーデータを取得します。
GetUserData()273     void* GetUserData() { return m_UserData; }
274 
275     //! @brief ユーザーデータを設定します。
276     //!
277     //! 設定したユーザーデータは、 SetPlayPolicy() で設定した関数に渡されます。
278     //! ユーザー定義の関数を設定している場合に、関数内からアクセスすることができます。
279     //! 例えば、アニメーションの再生が終了したらフラグを立てるといった応用があります。
280     //!
281     //! @param[in] userData 設定するユーザーデータです。
282     //!
SetUserData(void * userData)283     void SetUserData(void* userData) { m_UserData = userData; }
284 
285     //@}
286 
287     //----------------------------------------
288     //! @name 更新
289     //@{
290 
291     //! アニメーションフレームを進めます。
UpdateFrame()292     void UpdateFrame()
293     {
294         SetFrame(GetFrame() + m_StepFrame);
295     }
296 
297     //@}
298 
299 private:
300     AnimFrame m_AnimFrame;
301     f32 m_StepFrame;
302     f32 m_StartFrame;
303     f32 m_EndFrame;
304     PlayPolicy m_PlayPolicy;
305     void* m_UserData;
306 };
307 
308 } /* namespace anim */
309 } /* namespace nw */
310 
311 #endif /* NW_ANIM_ANIMFRAMECONTROLLER_H_ */
312