0d65270dc7b290e75b656a4ad10e08ffcd535c19
[blender-staging.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_ILogicBrick.h"
36
37 #include <vector>
38
39 /**
40  * Interface Class for all logic Sensors. Implements
41  * pulsemode,pulsefrequency */
42 class SCA_ISensor : public SCA_ILogicBrick
43 {
44         Py_Header;
45         class SCA_EventManager* m_eventmgr;
46         bool    m_triggered;
47
48         /** Pulse positive  pulses? */
49         bool m_pos_pulsemode;
50
51         /** Pulse negative pulses? */
52         bool m_neg_pulsemode;
53
54         /** Repeat frequency in pulse mode. */
55         int m_pulse_frequency;
56
57         /** Number of ticks since the last positive pulse. */
58         int m_pos_ticks;
59
60         /** Number of ticks since the last negative pulse. */
61         int m_neg_ticks;
62
63         /** invert the output signal*/
64         bool m_invert;
65
66         /** detect level instead of edge*/
67         bool m_level;
68
69         /** sensor has been reset */
70         bool m_reset;
71
72         /** Sensor must ignore updates? */
73         bool m_suspended;
74
75         /** number of connections to controller */
76         int m_links;
77
78         /** list of controllers that have just activated this sensor because of a state change */
79         std::vector<class SCA_IController*> m_newControllers;
80
81 public:
82         SCA_ISensor(SCA_IObject* gameobj,
83                                 class SCA_EventManager* eventmgr,
84                                 PyTypeObject* T );;
85         ~SCA_ISensor();
86         virtual void    ReParent(SCA_IObject* parent);
87
88         /** Because we want sensors to share some behaviour, the Activate has     */
89         /* an implementation on this level. It requires an evaluate on the lower */
90         /* level of individual sensors. Mapping the old activate()s is easy.     */
91         /* The IsPosTrig() also has to change, to keep things consistent.        */
92         void Activate(class SCA_LogicManager* logicmgr,CValue* event);
93         virtual bool Evaluate(CValue* event) = 0;
94         virtual bool IsPositiveTrigger();
95         virtual void Init();
96         
97         virtual PyObject* _getattr(const STR_String& attr);
98         virtual CValue* GetReplica()=0;
99
100         /** Set parameters for the pulsing behaviour.
101          * @param posmode Trigger positive pulses?
102          * @param negmode Trigger negative pulses?
103          * @param freq    Frequency to use when doing pulsing.
104          */
105         void SetPulseMode(bool posmode,
106                                           bool negmode,
107                                           int freq);
108         
109         /** Release sensor
110          *  For property sensor, it is used to release the pre-calculated expression
111          *  so that self references are removed before the sensor itself is released
112          */
113         virtual void Delete() { Release(); }
114         /** Set inversion of pulses on or off. */
115         void SetInvert(bool inv);
116         /** set the level detection on or off */
117         void SetLevel(bool lvl);
118
119         void RegisterToManager();
120         void UnregisterToManager();
121
122         virtual float GetNumber();
123
124         /** Stop sensing for a while. */
125         void Suspend();
126
127         /** Is this sensor switched off? */
128         bool IsSuspended();
129         
130         /** Resume sensing. */
131         void Resume();
132
133         void AddNewController(class SCA_IController* controller)
134                 { m_newControllers.push_back(controller); }
135         void ClrLink()
136                 { m_links = 0; }
137         void IncLink()
138                 { if (!m_links++) RegisterToManager(); }
139         void DecLink();
140         bool IsNoLink() const 
141                 { return !m_links; }
142
143         /* Python functions: */
144         KX_PYMETHOD_DOC_NOARGS(SCA_ISensor,IsPositive);
145         KX_PYMETHOD_DOC_NOARGS(SCA_ISensor,IsTriggered);
146         KX_PYMETHOD_DOC_NOARGS(SCA_ISensor,GetUsePosPulseMode);
147         KX_PYMETHOD_DOC(SCA_ISensor,SetUsePosPulseMode);
148         KX_PYMETHOD_DOC_NOARGS(SCA_ISensor,GetFrequency);
149         KX_PYMETHOD_DOC(SCA_ISensor,SetFrequency);
150         KX_PYMETHOD_DOC_NOARGS(SCA_ISensor,GetUseNegPulseMode);
151         KX_PYMETHOD_DOC(SCA_ISensor,SetUseNegPulseMode);
152         KX_PYMETHOD_DOC_NOARGS(SCA_ISensor,GetInvert);
153         KX_PYMETHOD_DOC(SCA_ISensor,SetInvert);
154         KX_PYMETHOD_DOC_NOARGS(SCA_ISensor,GetLevel);
155         KX_PYMETHOD_DOC(SCA_ISensor,SetLevel);
156         KX_PYMETHOD_DOC_NOARGS(SCA_ISensor,Reset);
157
158 };
159
160 #endif //__SCA_ISENSOR
161