Merge of itasc branch. Project files, scons and cmake should be working. Makefile...
[blender.git] / source / gameengine / GameLogic / SCA_IActuator.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_IActuator.h"
30
31 #ifdef HAVE_CONFIG_H
32 #include <config.h>
33 #endif
34
35 using namespace std;
36
37 SCA_IActuator::SCA_IActuator(SCA_IObject* gameobj, KX_ACTUATOR_TYPE type) :
38         SCA_ILogicBrick(gameobj),
39         m_type(type),
40         m_links(0),
41         m_posevent(false),
42         m_negevent(false)
43 {
44         // nothing to do
45 }
46
47 bool SCA_IActuator::Update(double curtime, bool frame)
48 {
49         if (frame)
50                 return Update();
51         
52         return true;
53 }
54
55 bool SCA_IActuator::Update()
56 {
57         assert(false && "Actuators should override an Update method.");
58         return false;
59 }
60
61 void SCA_IActuator::Activate(SG_DList& head)
62 {
63         if (QEmpty())
64         {
65                 InsertActiveQList(m_gameobj->m_activeActuators);
66                 head.AddBack(&m_gameobj->m_activeActuators);
67         }
68 }
69
70 // this function is only used to deactivate actuators outside the logic loop
71 // e.g. when an object is deleted.
72 void SCA_IActuator::Deactivate()
73 {
74         if (QDelink())
75         {
76                 // the actuator was in the active list
77                 if (m_gameobj->m_activeActuators.QEmpty())
78                         // the owner object has no more active actuators, remove it from the global list
79                         m_gameobj->m_activeActuators.Delink();
80         }
81 }
82
83
84 void SCA_IActuator::ProcessReplica()
85 {
86         SCA_ILogicBrick::ProcessReplica();
87         RemoveAllEvents();
88         m_linkedcontrollers.clear();
89 }
90
91
92
93 SCA_IActuator::~SCA_IActuator()
94 {
95         RemoveAllEvents();
96 }
97
98 void SCA_IActuator::DecLink()
99 {
100         m_links--;
101         if (m_links < 0) 
102         {
103                 printf("Warning: actuator %s has negative m_links: %d\n", m_name.Ptr(), m_links);
104                 m_links = 0;
105         }
106 }
107
108 void SCA_IActuator::LinkToController(SCA_IController* controller)
109 {
110         m_linkedcontrollers.push_back(controller);
111 }
112
113 void SCA_IActuator::UnlinkController(SCA_IController* controller)
114 {
115         std::vector<class SCA_IController*>::iterator contit;
116         for (contit = m_linkedcontrollers.begin();!(contit==m_linkedcontrollers.end());++contit)
117         {
118                 if ((*contit) == controller)
119                 {
120                         *contit = m_linkedcontrollers.back();
121                         m_linkedcontrollers.pop_back();
122                         return;
123                 }
124         }
125         printf("Missing link from actuator %s:%s to controller %s:%s\n", 
126                 m_gameobj->GetName().ReadPtr(), GetName().ReadPtr(), 
127                 controller->GetParent()->GetName().ReadPtr(), controller->GetName().ReadPtr());
128 }
129
130 void SCA_IActuator::UnlinkAllControllers()
131 {
132         std::vector<class SCA_IController*>::iterator contit;
133         for (contit = m_linkedcontrollers.begin();!(contit==m_linkedcontrollers.end());++contit)
134         {
135                 (*contit)->UnlinkActuator(this);
136         }
137         m_linkedcontrollers.clear();
138 }
139