optionally use guarded alloc for tiles compositor, also replace allocation functions...
[blender.git] / source / gameengine / GameLogic / SCA_ISensor.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 SCA_IController.h
29  *  \ingroup gamelogic
30  *  \brief Interface Class for all logic Sensors. Implements
31  *   pulsemode and pulsefrequency, and event suppression.
32  */
33
34 #ifndef __SCA_ISENSOR_H__
35 #define __SCA_ISENSOR_H__
36
37 #include "SCA_IController.h"
38
39 #include <vector>
40
41 /**
42  * Interface Class for all logic Sensors. Implements
43  * pulsemode,pulsefrequency 
44  * Use of SG_DList element: link sensors to their respective event manager
45  *                          Head: SCA_EventManager::m_sensors
46  * Use of SG_QList element: not used
47  */
48 class SCA_ISensor : public SCA_ILogicBrick
49 {
50         Py_Header
51 protected:
52         class SCA_EventManager* m_eventmgr;
53
54         /** Pulse positive  pulses? */
55         bool m_pos_pulsemode;
56
57         /** Pulse negative pulses? */
58         bool m_neg_pulsemode;
59
60         /** Repeat frequency in pulse mode. */
61         int m_pulse_frequency;
62
63         /** Number of ticks since the last positive pulse. */
64         int m_pos_ticks;
65
66         /** Number of ticks since the last negative pulse. */
67         int m_neg_ticks;
68
69         /** invert the output signal*/
70         bool m_invert;
71
72         /** detect level instead of edge*/
73         bool m_level;
74
75         /** tap mode */
76         bool m_tap;
77
78         /** sensor has been reset */
79         bool m_reset;
80
81         /** Sensor must ignore updates? */
82         bool m_suspended;
83
84         /** number of connections to controller */
85         int m_links;
86
87         /** current sensor state */
88         bool m_state;
89
90         /** previous state (for tap option) */
91         bool m_prev_state;
92
93         std::vector<class SCA_IController*>             m_linkedcontrollers;
94
95 public:
96
97         enum sensortype {
98                 ST_NONE = 0,
99                 ST_TOUCH,
100                 ST_NEAR,
101                 ST_RADAR,
102                 // to be updated as needed
103         };
104
105         SCA_ISensor(SCA_IObject* gameobj,
106                                 class SCA_EventManager* eventmgr);
107         ~SCA_ISensor();
108         virtual void    ReParent(SCA_IObject* parent);
109
110         /** Because we want sensors to share some behavior, the Activate has     */
111         /* an implementation on this level. It requires an evaluate on the lower */
112         /* level of individual sensors. Mapping the old activate()s is easy.     */
113         /* The IsPosTrig() also has to change, to keep things consistent.        */
114         void Activate(class SCA_LogicManager* logicmgr);
115         virtual bool Evaluate() = 0;
116         virtual bool IsPositiveTrigger();
117         virtual void Init();
118
119         virtual CValue* GetReplica()=0;
120
121         /** Set parameters for the pulsing behavior.
122          * \param posmode Trigger positive pulses?
123          * \param negmode Trigger negative pulses?
124          * \param freq    Frequency to use when doing pulsing.
125          */
126         void SetPulseMode(bool posmode,
127                                           bool negmode,
128                                           int freq);
129         
130         /** Set inversion of pulses on or off. */
131         void SetInvert(bool inv);
132         /** set the level detection on or off */
133         void SetLevel(bool lvl);
134         void SetTap(bool tap);
135
136         virtual void RegisterToManager();
137         virtual void UnregisterToManager();
138         void Replace_EventManager(class SCA_LogicManager* logicmgr);
139         void ReserveController(int num)
140         {
141                 m_linkedcontrollers.reserve(num);
142         }
143         void LinkToController(SCA_IController* controller);
144         void UnlinkController(SCA_IController* controller);
145         void UnlinkAllControllers();
146         void ActivateControllers(class SCA_LogicManager* logicmgr);
147
148         virtual void ProcessReplica();
149
150         virtual double GetNumber();
151
152         virtual sensortype GetSensorType() { return ST_NONE; }
153
154         /** Stop sensing for a while. */
155         void Suspend();
156
157         /** Is this sensor switched off? */
158         bool IsSuspended();
159         
160         /** get the state of the sensor: positive or negative */
161         bool GetState()
162         {
163                 return m_state;
164         }
165         
166         /** get the previous state of the sensor: positive or negative */
167         bool GetPrevState()
168         {
169                 return m_prev_state;
170         }
171
172         /** get the number of ticks since the last positive pulse */
173         int GetPosTicks()
174         {
175                 return m_pos_ticks;
176         }
177
178         /** get the number of ticks since the last negative pulse */
179         int GetNegTicks()
180         {
181                 return m_neg_ticks;
182         }
183
184         /** Resume sensing. */
185         void Resume();
186
187         void ClrLink()
188                 { m_links = 0; }
189         void IncLink()
190                 { if (!m_links++) RegisterToManager(); }
191         void DecLink();
192         bool IsNoLink() const 
193                 { return !m_links; }
194
195 #ifdef WITH_PYTHON
196         /* Python functions: */
197         KX_PYMETHOD_DOC_NOARGS(SCA_ISensor,reset);
198         
199         static PyObject*        pyattr_get_triggered(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef);
200         static PyObject*        pyattr_get_positive(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef);
201         static PyObject*        pyattr_get_status(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef);
202         static PyObject*        pyattr_get_posTicks(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef);
203         static PyObject*        pyattr_get_negTicks(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef);
204
205         static int          pyattr_check_level(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef);
206         static int          pyattr_check_tap(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef);
207         
208         enum SensorStatus {
209                 KX_SENSOR_INACTIVE = 0,
210                 KX_SENSOR_JUST_ACTIVATED,
211                 KX_SENSOR_ACTIVE,
212                 KX_SENSOR_JUST_DEACTIVATED
213         
214         };
215 #endif // WITH_PYTHON
216 };
217
218 #endif //__SCA_ISENSOR_H__
219