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