use const for readonly strings and set some functions to static
[blender.git] / source / gameengine / Ketsji / KX_IpoActuator.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 KX_IpoActuator.h
29  *  \ingroup ketsji
30  *  \brief Do an object ipo
31  */
32
33 #ifndef __KX_IPOACTUATOR
34 #define __KX_IPOACTUATOR
35
36 #include "SCA_IActuator.h"
37
38 class KX_IpoActuator : public SCA_IActuator
39 {
40         Py_Header;
41 private:
42         /** Computes the IPO start time from the current time
43             and the current frame. */
44         void SetStartTime(float curtime);
45         /** Computes the current frame from the current time
46             and the IPO start time. */
47         void SetLocalTime(float curtime);
48         /** Ensures the current frame is between the start and
49             end frames. */
50         bool ClampLocalTime();
51
52 protected:
53         bool    m_bNegativeEvent;
54
55         /** Begin frame of the ipo. */
56         float   m_startframe;
57         
58         /** End frame of the ipo. */
59         float   m_endframe;
60
61         /** Include children in the transforms? */
62         bool    m_recurse;
63
64         /** Current active frame of the ipo. */
65         float   m_localtime;
66         
67         /** The time this ipo started at. */
68         float   m_starttime;
69
70         /** play backwards or forwards? (positive means forward). */
71         float   m_direction;
72
73         /** Name of the property (only used in from_prop mode). */
74         STR_String      m_propname;
75
76         /** Name of the property where we write the current frame number */
77         STR_String      m_framepropname;
78
79         /** Interpret the ipo as a force? */
80         bool    m_ipo_as_force;
81         
82         /** Add Ipo curve to current loc/rot/scale */
83         bool    m_ipo_add;
84         
85         /** The Ipo curve is applied in local coordinates */
86         bool    m_ipo_local;
87
88         bool    m_bIpoPlaying;
89
90         /** Reset/Update the start time*/
91         void    ResetStartTime();
92
93 public:
94         enum IpoActType
95         {
96                 KX_ACT_IPO_NODEF = 0,
97                 KX_ACT_IPO_PLAY,
98                 KX_ACT_IPO_PINGPONG,
99                 KX_ACT_IPO_FLIPPER,
100                 KX_ACT_IPO_LOOPSTOP,
101                 KX_ACT_IPO_LOOPEND,
102                 KX_ACT_IPO_KEY2KEY,
103                 KX_ACT_IPO_FROM_PROP,
104                 KX_ACT_IPO_MAX
105         };
106
107 #ifdef WITH_PYTHON
108         static PyObject*        pyattr_get_frame_start(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef);
109         static int                      pyattr_set_frame_start(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef, PyObject *value);
110         static PyObject*        pyattr_get_frame_end(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef);
111         static int                      pyattr_set_frame_end(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef, PyObject *value);
112 #endif
113         static const char *S_KX_ACT_IPO_PLAY_STRING;
114         static const char *S_KX_ACT_IPO_PINGPONG_STRING;
115         static const char *S_KX_ACT_IPO_FLIPPER_STRING;
116         static const char *S_KX_ACT_IPO_LOOPSTOP_STRING;
117         static const char *S_KX_ACT_IPO_LOOPEND_STRING;
118         static const char *S_KX_ACT_IPO_KEY2KEY_STRING;
119         static const char *S_KX_ACT_IPO_FROM_PROP_STRING;
120
121         int string2mode(const char *modename);
122         
123         int m_type;
124
125         KX_IpoActuator(SCA_IObject* gameobj,
126                                    const STR_String& propname,
127                                    const STR_String& framePropname,
128                                    float starttime,
129                                    float endtime,
130                                    bool recurse,
131                                    int acttype,
132                                    bool ipo_as_force, 
133                                    bool ipo_add,
134                                    bool ipo_local);
135         virtual ~KX_IpoActuator() {};
136
137         virtual CValue* GetReplica() {
138                 KX_IpoActuator* replica = new KX_IpoActuator(*this);//m_float,GetName());
139                 replica->ProcessReplica();
140                 return replica;
141         };
142
143         void            SetStart(float starttime);
144         void            SetEnd(float endtime);
145         virtual         bool Update(double curtime, bool frame);
146
147         /* --------------------------------------------------------------------- */
148         /* Python interface ---------------------------------------------------- */
149         /* --------------------------------------------------------------------- */
150         
151 };
152
153 #endif //__KX_IPOACTUATOR
154