BGE: Some various changes to make moving the character physics type easier:
[blender.git] / source / gameengine / Converter / BL_ShapeActionActuator.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  * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
19  * All rights reserved.
20  *
21  * The Original Code is: all of this file.
22  *
23  * Contributor(s): none yet.
24  *
25  * ***** END GPL LICENSE BLOCK *****
26  */
27
28 /** \file BL_ShapeActionActuator.h
29  *  \ingroup bgeconv
30  */
31
32 #ifndef __BL_SHAPEACTIONACTUATOR_H__
33 #define __BL_SHAPEACTIONACTUATOR_H__
34
35 #include "CTR_HashedPtr.h"
36 #include "SCA_IActuator.h"
37 #include "BL_ActionActuator.h"
38 #include "MT_Point3.h"
39 #include <vector>
40
41 struct Key;
42 class BL_ShapeActionActuator : public SCA_IActuator  
43 {
44 public:
45         Py_Header
46         BL_ShapeActionActuator(SCA_IObject* gameobj,
47                                                 const STR_String& propname,
48                                                 const STR_String& framepropname,
49                                                 float starttime,
50                                                 float endtime,
51                                                 struct bAction *action,
52                                                 short   playtype,
53                                                 short   blendin,
54                                                 short   priority,
55                                                 float   stride);
56         virtual ~BL_ShapeActionActuator();
57         virtual bool Update(double curtime, bool frame);
58         virtual CValue* GetReplica();
59         virtual void ProcessReplica();
60         
61         void SetBlendTime (float newtime);
62         void BlendShape(struct Key* key, float weigth);
63         
64         bAction*        GetAction() { return m_action; }
65         void            SetAction(bAction* act) { m_action= act; }
66
67 #ifdef WITH_PYTHON
68
69         static PyObject*        pyattr_get_action(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef);
70         static int                      pyattr_set_action(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef, PyObject *value);
71
72         static int CheckBlendTime(void *self, const PyAttributeDef*)
73         {
74                 BL_ShapeActionActuator* act = reinterpret_cast<BL_ShapeActionActuator*>(self);
75
76                 if (act->m_blendframe > act->m_blendin)
77                         act->m_blendframe = act->m_blendin;
78
79                 return 0;
80         }
81         static int CheckFrame(void *self, const PyAttributeDef*)
82         {
83                 BL_ShapeActionActuator* act = reinterpret_cast<BL_ShapeActionActuator*>(self);
84
85                 if (act->m_localtime < act->m_startframe)
86                         act->m_localtime = act->m_startframe;
87                 else if (act->m_localtime > act->m_endframe)
88                         act->m_localtime = act->m_endframe;
89
90                 return 0;
91         }
92         static int CheckType(void *self, const PyAttributeDef*)
93         {
94                 BL_ShapeActionActuator* act = reinterpret_cast<BL_ShapeActionActuator*>(self);
95
96                 switch (act->m_playtype) {
97                         case ACT_ACTION_PLAY:
98                         case ACT_ACTION_PINGPONG:
99                         case ACT_ACTION_FLIPPER:
100                         case ACT_ACTION_LOOP_STOP:
101                         case ACT_ACTION_LOOP_END:
102                         case ACT_ACTION_FROM_PROP:
103                                 return 0;
104                         default:
105                                 PyErr_SetString(PyExc_ValueError, "Shape Action Actuator, invalid play type supplied");
106                                 return 1;
107                 }
108
109         }
110
111 #endif  /* WITH_PYTHON */
112
113 protected:
114
115         void SetStartTime(float curtime);
116         void SetLocalTime(float curtime);
117         bool ClampLocalTime();
118
119         MT_Point3       m_lastpos;
120         float   m_blendframe;
121         int             m_flag;
122         /** The frame this action starts */
123         float   m_startframe;
124         /** The frame this action ends */
125         float   m_endframe;
126         /** The time this action started */
127         float   m_starttime;
128         /** The current time of the action */
129         float   m_localtime;
130         
131         float   m_lastUpdate;
132         float   m_blendin;
133         float   m_blendstart;
134         float   m_stridelength;
135         short   m_playtype;
136         short   m_priority;
137         struct bAction *m_action;
138         STR_String      m_framepropname;
139         STR_String      m_propname;
140         vector<float> m_blendshape;
141         struct PointerRNA *m_idptr;
142 };
143
144 #endif  /* __BL_SHAPEACTIONACTUATOR_H__ */