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