00e536655c78af55d7f806873679bdf63d6f141b
[blender.git] / source / gameengine / Ketsji / BL_ActionManager.h
1 /*
2  * ***** BEGIN GPL LICENSE BLOCK *****
3  *
4  * This program is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU General Public License
6  * as published by the Free Software Foundation; either version 2
7  * of the License, or (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software Foundation,
16  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17  *
18  * Contributor(s): Mitchell Stokes.
19  *
20  * ***** END GPL LICENSE BLOCK *****
21  */
22
23 /** \file BL_ActionManager.h
24  *  \ingroup ketsji
25  */
26
27 #ifndef __BL_ACTIONMANAGER_H__
28 #define __BL_ACTIONMANAGER_H__
29
30 #ifdef WITH_CXX_GUARDEDALLOC
31         #include "MEM_guardedalloc.h"
32 #endif
33
34 #include <map>
35
36 // Currently, we use the max value of a short.
37 // We should switch to unsigned short; doesn't make sense to support negative layers.
38 // This will also give us 64k layers instead of 32k.
39 #define MAX_ACTION_LAYERS 32767
40
41 class BL_Action;
42
43 /**
44  * BL_ActionManager is responsible for handling a KX_GameObject's actions.
45  */
46 class BL_ActionManager
47 {
48 private:
49         typedef std::map<short,BL_Action*> BL_ActionMap;
50
51         class KX_GameObject* m_obj;
52         BL_ActionMap             m_layers;
53
54         // The last update time to avoid double animation update.
55         float m_prevUpdate;
56
57         /**
58          * Check if an action exists
59          */
60         BL_Action* GetAction(short layer);
61
62         /**
63          * Add new action with given layer
64          */
65         BL_Action* AddAction(short layer);
66
67 public:
68         BL_ActionManager(class KX_GameObject* obj);
69         ~BL_ActionManager();
70
71         bool PlayAction(const char* name,
72                                         float start,
73                                         float end,
74                                         short layer=0,
75                                         short priority=0,
76                                         float blendin=0.f,
77                                         short play_mode=0,
78                                         float layer_weight=0.f,
79                                         short ipo_flags=0,
80                                         float playback_speed=1.f,
81                                         short blend_mode=0);
82         /**
83          * Gets the current frame of an action
84          */
85         float GetActionFrame(short layer);
86
87         /**
88          * Sets the current frame of an action
89          */
90         void SetActionFrame(short layer, float frame);
91         
92         /**
93          * Gets the currently running action on the given layer
94          */
95         struct bAction *GetCurrentAction(short layer);
96
97         /**
98          * Sets play mode of the action on the given layer
99          */
100         void SetPlayMode(short layer, short mode);
101
102         /**
103          * Sets the start and end times of the action on the given layer
104          */
105         void SetTimes(short layer, float start, float end);
106
107         /**
108          * Stop playing the action on the given layer
109          */
110         void StopAction(short layer);
111
112         /**
113          * Remove playing tagged actions.
114          */
115         void RemoveTaggedActions();
116
117         /**
118          * Check if an action has finished playing
119          */
120         bool IsActionDone(short layer);
121
122         /**
123          * Update any running actions
124          */
125         void Update(float);
126
127         /**
128          * Update object IPOs (note: not thread-safe!)
129          */
130         void UpdateIPOs();
131
132 #ifdef WITH_CXX_GUARDEDALLOC
133         MEM_CXX_CLASS_ALLOC_FUNCS("GE:BL_ActionManager")
134 #endif
135 };
136
137 #endif  /* BL_ACTIONMANAGER */