svn merge -r 15392:15551 https://svn.blender.org/svnroot/bf-blender/trunk/blender
[blender.git] / source / gameengine / GameLogic / SCA_IController.cpp
1 /**
2  * $Id$
3  * ***** BEGIN GPL LICENSE BLOCK *****
4  *
5  * This program is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU General Public License
7  * as published by the Free Software Foundation; either version 2
8  * of the License, or (at your option) any later version.
9  *
10  * This program is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13  * GNU General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License
16  * along with this program; if not, write to the Free Software Foundation,
17  * Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
18  *
19  * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
20  * All rights reserved.
21  *
22  * The Original Code is: all of this file.
23  *
24  * Contributor(s): none yet.
25  *
26  * ***** END GPL LICENSE BLOCK *****
27  */
28
29 #include "SCA_IController.h"
30 #include "SCA_LogicManager.h"
31 #include "SCA_IActuator.h"
32 #include "SCA_ISensor.h"
33
34 #ifdef HAVE_CONFIG_H
35 #include <config.h>
36 #endif
37
38 SCA_IController::SCA_IController(SCA_IObject* gameobj,
39                                                                  PyTypeObject* T)
40         :
41         m_statemask(0),
42         SCA_ILogicBrick(gameobj,T)
43 {
44 }
45         
46
47         
48 SCA_IController::~SCA_IController()
49 {
50         UnlinkAllActuators();
51 }
52
53
54
55 const std::vector<class SCA_ISensor*>& SCA_IController::GetLinkedSensors()
56 {
57         return m_linkedsensors;
58 }
59
60
61
62 const std::vector<class SCA_IActuator*>& SCA_IController::GetLinkedActuators()
63 {
64         return m_linkedactuators;
65 }
66
67
68
69 void SCA_IController::UnlinkAllSensors()
70 {
71         if (IsActive()) 
72         {
73                 std::vector<class SCA_ISensor*>::iterator sensit;
74                 for (sensit = m_linkedsensors.begin();!(sensit==m_linkedsensors.end());++sensit)
75                 {
76                         (*sensit)->DecLink();
77                 }
78         }
79         m_linkedsensors.clear();
80 }
81
82
83
84 void SCA_IController::UnlinkAllActuators()
85 {
86         if (IsActive()) 
87         {
88                 std::vector<class SCA_IActuator*>::iterator actit;
89                 for (actit = m_linkedactuators.begin();!(actit==m_linkedactuators.end());++actit)
90                 {
91                         (*actit)->DecLink();
92                 }
93         }
94         m_linkedactuators.clear();
95 }
96
97
98
99 /*
100 void SCA_IController::Trigger(SCA_LogicManager* logicmgr)
101 {
102         //for (int i=0;i<m_linkedactuators.size();i++)
103         for (vector<SCA_IActuator*>::const_iterator i=m_linkedactuators.begin();
104         !(i==m_linkedactuators.end());i++)
105         {
106                 SCA_IActuator* actua = *i;//m_linkedactuators.at(i);
107                 
108                 logicmgr->AddActiveActuator(actua);
109         }
110
111 }
112 */
113
114 void SCA_IController::LinkToActuator(SCA_IActuator* actua)
115 {
116         m_linkedactuators.push_back(actua);
117         if (IsActive())
118         {
119                 actua->IncLink();
120         }
121 }
122
123 void    SCA_IController::UnlinkActuator(class SCA_IActuator* actua)
124 {
125         std::vector<class SCA_IActuator*>::iterator actit;
126         for (actit = m_linkedactuators.begin();!(actit==m_linkedactuators.end());++actit)
127         {
128                 if ((*actit) == actua)
129                 {
130                         break;
131                 }
132                 
133         }
134         if (!(actit==m_linkedactuators.end()))
135         {
136                 if (IsActive())
137                 {
138                         (*actit)->DecLink();
139                 }
140                 m_linkedactuators.erase(actit);
141         }
142 }
143
144 void SCA_IController::LinkToSensor(SCA_ISensor* sensor)
145 {
146         m_linkedsensors.push_back(sensor);
147         if (IsActive())
148         {
149                 sensor->IncLink();
150         }
151 }
152
153 void SCA_IController::UnlinkSensor(class SCA_ISensor* sensor)
154 {
155         std::vector<class SCA_ISensor*>::iterator sensit;
156         for (sensit = m_linkedsensors.begin();!(sensit==m_linkedsensors.end());++sensit)
157         {
158                 if ((*sensit) == sensor)
159                 {
160                         break;
161                 }
162                 
163         }
164         if (!(sensit==m_linkedsensors.end()))
165         {
166                 if (IsActive())
167                 {
168                         (*sensit)->DecLink();
169                 }
170                 m_linkedsensors.erase(sensit);
171         }
172 }
173
174 void SCA_IController::ApplyState(unsigned int state)
175 {
176         std::vector<class SCA_IActuator*>::iterator actit;
177         std::vector<class SCA_ISensor*>::iterator sensit;
178
179         if (m_statemask & state) 
180         {
181                 if (!IsActive()) 
182                 {
183                         // reactive the controller, all the links to actuator are valid again
184                         for (actit = m_linkedactuators.begin();!(actit==m_linkedactuators.end());++actit)
185                         {
186                                 (*actit)->IncLink();
187                         }
188                         for (sensit = m_linkedsensors.begin();!(sensit==m_linkedsensors.end());++sensit)
189                         {
190                                 (*sensit)->IncLink();
191                         }
192                         SetActive(true);
193                 }
194         } else if (IsActive())
195         {
196                 for (actit = m_linkedactuators.begin();!(actit==m_linkedactuators.end());++actit)
197                 {
198                         (*actit)->DecLink();
199                 }
200                 for (sensit = m_linkedsensors.begin();!(sensit==m_linkedsensors.end());++sensit)
201                 {
202                         (*sensit)->DecLink();
203                 }
204                 SetActive(false);
205         }
206 }
207