BGE LibLoad: Allow the user to disable loading text datablocks if they want to attemp...
[blender.git] / source / gameengine / Converter / BL_ActionActuator.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_ActionActuator.h
29  *  \ingroup bgeconv
30  */
31
32 #ifndef __BL_ACTIONACTUATOR_H__
33 #define __BL_ACTIONACTUATOR_H__
34
35 #include "CTR_HashedPtr.h"
36 #include "SCA_IActuator.h"
37 #include "DNA_actuator_types.h"
38 #include "MT_Point3.h"
39
40 class BL_ActionActuator : public SCA_IActuator  
41 {
42 public:
43         Py_Header
44         BL_ActionActuator(SCA_IObject* gameobj,
45                                                 const STR_String& propname,
46                                                 const STR_String& framepropname,
47                                                 float starttime,
48                                                 float endtime,
49                                                 struct bAction *action,
50                                                 short   playtype,
51                                                 short   blendin,
52                                                 short   priority,
53                                                 short   layer,
54                                                 float   layer_weight,
55                                                 short   ipo_flags,
56                                                 short   end_reset,
57                                                 float   stride);
58
59         virtual ~BL_ActionActuator();
60         virtual bool Update(double curtime, bool frame);
61         virtual CValue* GetReplica();
62         virtual void ProcessReplica();
63         
64         void SetBlendTime (float newtime);
65         void SetLocalTime (float curtime);
66         void ResetStartTime (float curtime);
67         
68         bAction*        GetAction() { return m_action; }
69         void            SetAction(bAction* act) { m_action= act; }
70
71 #ifdef WITH_PYTHON
72
73         KX_PYMETHOD_O(BL_ActionActuator,GetChannel)
74         KX_PYMETHOD_DOC(BL_ActionActuator,setChannel)
75
76         static PyObject*        pyattr_get_action(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef);
77         static int                      pyattr_set_action(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef, PyObject *value);
78         static PyObject*        pyattr_get_channel_names(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef);
79         static PyObject*        pyattr_get_use_continue(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef);
80         static int                      pyattr_set_use_continue(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef, PyObject *value);
81         static PyObject*        pyattr_get_frame(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef);
82         static int                      pyattr_set_frame(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef, PyObject *value);
83
84         static int CheckBlendTime(void *self, const PyAttributeDef*)
85         {
86                 BL_ActionActuator* act = reinterpret_cast<BL_ActionActuator*>(self);
87
88                 if (act->m_blendframe > act->m_blendin)
89                         act->m_blendframe = act->m_blendin;
90
91                 return 0;
92         }
93
94         static int CheckType(void *self, const PyAttributeDef*)
95         {
96                 BL_ActionActuator* act = reinterpret_cast<BL_ActionActuator*>(self);
97
98                 switch (act->m_playtype) {
99                         case ACT_ACTION_PLAY:
100                         case ACT_ACTION_PINGPONG:
101                         case ACT_ACTION_FLIPPER:
102                         case ACT_ACTION_LOOP_STOP:
103                         case ACT_ACTION_LOOP_END:
104                         case ACT_ACTION_FROM_PROP:
105                                 return 0;
106                         default:
107                                 PyErr_SetString(PyExc_ValueError, "Action Actuator, invalid play type supplied");
108                                 return 1;
109                 }
110         }
111 #endif // WITH_PYTHON
112         
113 protected:
114         MT_Point3       m_lastpos;
115         float   m_blendframe;
116         int             m_flag;
117         /** The frame this action starts */
118         float   m_startframe;
119         /** The frame this action ends */
120         float   m_endframe;
121         /** The time this action started */
122         float   m_starttime;
123         /** The current time of the action */
124         float   m_localtime;
125         
126         float   m_lastUpdate;
127         float   m_blendin;
128         float   m_blendstart;
129         float   m_stridelength;
130         float   m_layer_weight;
131         short   m_playtype;
132         short   m_priority;
133         short   m_layer;
134         short   m_ipo_flags;
135         struct bPose* m_pose;
136         struct bPose* m_blendpose;
137         struct bPose* m_userpose;
138         struct bAction *m_action;
139         STR_String      m_propname;
140         STR_String      m_framepropname;
141 };
142
143 // Not all of these values are used in BL_ActionActuator anymore,
144 // but BL_ShapeActionActuator still uses them, so we keep them around
145 // for now.
146 enum {
147         ACT_FLAG_REVERSE        = 1<<0,
148         ACT_FLAG_LOCKINPUT      = 1<<1,
149         ACT_FLAG_KEYUP          = 1<<2,
150         ACT_FLAG_ACTIVE         = 1<<3,
151         ACT_FLAG_CONTINUE       = 1<<4,
152         ACT_FLAG_PLAY_END       = 1<<5,
153         ACT_FLAG_ATTEMPT_PLAY = 1<<6,
154 };
155
156 #endif
157