Name attributes added since 2.48a more consistently.
[blender.git] / source / gameengine / GameLogic / SCA_ISensor.h
1 /**
2  * $Id$
3  *
4  * ***** BEGIN GPL LICENSE BLOCK *****
5  *
6  * This program is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU General Public License
8  * as published by the Free Software Foundation; either version 2
9  * of the License, or (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, write to the Free Software Foundation,
18  * Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
19  *
20  * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
21  * All rights reserved.
22  *
23  * The Original Code is: all of this file.
24  *
25  * Contributor(s): none yet.
26  *
27  * ***** END GPL LICENSE BLOCK *****
28  * Interface Class for all logic Sensors. Implements
29  * pulsemode and pulsefrequency, and event suppression.
30  */
31
32 #ifndef __SCA_ISENSOR
33 #define __SCA_ISENSOR
34
35 #include "SCA_IController.h"
36
37 #include <vector>
38
39 /**
40  * Interface Class for all logic Sensors. Implements
41  * pulsemode,pulsefrequency 
42  * Use of SG_DList element: link sensors to their respective event manager
43  *                          Head: SCA_EventManager::m_sensors
44  * Use of SG_QList element: not used
45  */
46 class SCA_ISensor : public SCA_ILogicBrick
47 {
48         Py_Header;
49 protected:
50         class SCA_EventManager* m_eventmgr;
51
52         /** Pulse positive  pulses? */
53         bool m_pos_pulsemode;
54
55         /** Pulse negative pulses? */
56         bool m_neg_pulsemode;
57
58         /** Repeat frequency in pulse mode. */
59         int m_pulse_frequency;
60
61         /** Number of ticks since the last positive pulse. */
62         int m_pos_ticks;
63
64         /** Number of ticks since the last negative pulse. */
65         int m_neg_ticks;
66
67         /** invert the output signal*/
68         bool m_invert;
69
70         /** detect level instead of edge*/
71         bool m_level;
72
73         /** tap mode */
74         bool m_tap;
75
76         /** sensor has been reset */
77         bool m_reset;
78
79         /** Sensor must ignore updates? */
80         bool m_suspended;
81
82         /** number of connections to controller */
83         int m_links;
84
85         /** current sensor state */
86         bool m_state;
87
88         /** previous state (for tap option) */
89         bool m_prev_state;
90
91         std::vector<class SCA_IController*>             m_linkedcontrollers;
92
93 public:
94         SCA_ISensor(SCA_IObject* gameobj,
95                                 class SCA_EventManager* eventmgr,
96                                 PyTypeObject* T );;
97         ~SCA_ISensor();
98         virtual void    ReParent(SCA_IObject* parent);
99
100         /** Because we want sensors to share some behaviour, the Activate has     */
101         /* an implementation on this level. It requires an evaluate on the lower */
102         /* level of individual sensors. Mapping the old activate()s is easy.     */
103         /* The IsPosTrig() also has to change, to keep things consistent.        */
104         void Activate(class SCA_LogicManager* logicmgr);
105         virtual bool Evaluate() = 0;
106         virtual bool IsPositiveTrigger();
107         virtual void Init();
108
109         virtual CValue* GetReplica()=0;
110
111         /** Set parameters for the pulsing behaviour.
112          * @param posmode Trigger positive pulses?
113          * @param negmode Trigger negative pulses?
114          * @param freq    Frequency to use when doing pulsing.
115          */
116         void SetPulseMode(bool posmode,
117                                           bool negmode,
118                                           int freq);
119         
120         /** Set inversion of pulses on or off. */
121         void SetInvert(bool inv);
122         /** set the level detection on or off */
123         void SetLevel(bool lvl);
124         void SetTap(bool tap);
125
126         virtual void RegisterToManager();
127         virtual void UnregisterToManager();
128         void ReserveController(int num)
129         {
130                 m_linkedcontrollers.reserve(num);
131         }
132         void LinkToController(SCA_IController* controller);
133         void UnlinkController(SCA_IController* controller);
134         void UnlinkAllControllers();
135         void ActivateControllers(class SCA_LogicManager* logicmgr);
136
137         virtual void ProcessReplica();
138
139         virtual double GetNumber();
140
141         /** Stop sensing for a while. */
142         void Suspend();
143
144         /** Is this sensor switched off? */
145         bool IsSuspended();
146         
147         /** get the state of the sensor: positive or negative */
148         bool GetState()
149         {
150                 return m_state;
151         }
152
153         /** Resume sensing. */
154         void Resume();
155
156         void ClrLink()
157                 { m_links = 0; }
158         void IncLink()
159                 { if (!m_links++) RegisterToManager(); }
160         void DecLink();
161         bool IsNoLink() const 
162                 { return !m_links; }
163
164         /* Python functions: */
165         
166         virtual PyObject* py_getattro(PyObject *attr);
167         virtual PyObject* py_getattro_dict();
168         virtual int py_setattro(PyObject *attr, PyObject *value);
169
170         //Deprecated functions ----->
171         KX_PYMETHOD_DOC_NOARGS(SCA_ISensor,IsPositive);
172         KX_PYMETHOD_DOC_NOARGS(SCA_ISensor,IsTriggered);
173         KX_PYMETHOD_DOC_NOARGS(SCA_ISensor,GetUsePosPulseMode);
174         KX_PYMETHOD_DOC_VARARGS(SCA_ISensor,SetUsePosPulseMode);
175         KX_PYMETHOD_DOC_NOARGS(SCA_ISensor,GetFrequency);
176         KX_PYMETHOD_DOC_VARARGS(SCA_ISensor,SetFrequency);
177         KX_PYMETHOD_DOC_NOARGS(SCA_ISensor,GetUseNegPulseMode);
178         KX_PYMETHOD_DOC_VARARGS(SCA_ISensor,SetUseNegPulseMode);
179         KX_PYMETHOD_DOC_NOARGS(SCA_ISensor,GetInvert);
180         KX_PYMETHOD_DOC_VARARGS(SCA_ISensor,SetInvert);
181         KX_PYMETHOD_DOC_NOARGS(SCA_ISensor,GetLevel);
182         KX_PYMETHOD_DOC_VARARGS(SCA_ISensor,SetLevel);
183         //<------
184         KX_PYMETHOD_DOC_NOARGS(SCA_ISensor,reset);
185         
186         static PyObject*        pyattr_get_triggered(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef);
187         static PyObject*        pyattr_get_positive(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef);
188         static int          pyattr_check_level(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef);
189         static int          pyattr_check_tap(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef);
190 };
191
192 #endif //__SCA_ISENSOR
193