optionally use guarded alloc for tiles compositor, also replace allocation functions...
[blender.git] / source / gameengine / GameLogic / SCA_IActuator.cpp
1 /*
2  * ***** BEGIN GPL LICENSE BLOCK *****
3  *
4  * This program is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU General Public License
6  * as published by the Free Software Foundation; either version 2
7  * of the License, or (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software Foundation,
16  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17  *
18  * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
19  * All rights reserved.
20  *
21  * The Original Code is: all of this file.
22  *
23  * Contributor(s): none yet.
24  *
25  * ***** END GPL LICENSE BLOCK *****
26  */
27
28 /** \file gameengine/GameLogic/SCA_IActuator.cpp
29  *  \ingroup gamelogic
30  */
31
32
33 #include "SCA_IActuator.h"
34 #include <stdio.h>
35
36 using namespace std;
37
38 SCA_IActuator::SCA_IActuator(SCA_IObject* gameobj, KX_ACTUATOR_TYPE type) :
39         SCA_ILogicBrick(gameobj),
40         m_type(type),
41         m_links(0),
42         m_posevent(false),
43         m_negevent(false)
44 {
45         // nothing to do
46 }
47
48 bool SCA_IActuator::Update(double curtime, bool frame)
49 {
50         if (frame)
51                 return Update();
52         
53         return true;
54 }
55
56 bool SCA_IActuator::Update()
57 {
58         assert(false && "Actuators should override an Update method.");
59         return false;
60 }
61
62 void SCA_IActuator::Activate(SG_DList& head)
63 {
64         if (QEmpty())
65         {
66                 InsertActiveQList(m_gameobj->m_activeActuators);
67                 head.AddBack(&m_gameobj->m_activeActuators);
68         }
69 }
70
71 // this function is only used to deactivate actuators outside the logic loop
72 // e.g. when an object is deleted.
73 void SCA_IActuator::Deactivate()
74 {
75         if (QDelink())
76         {
77                 // the actuator was in the active list
78                 if (m_gameobj->m_activeActuators.QEmpty())
79                         // the owner object has no more active actuators, remove it from the global list
80                         m_gameobj->m_activeActuators.Delink();
81         }
82 }
83
84
85 void SCA_IActuator::ProcessReplica()
86 {
87         SCA_ILogicBrick::ProcessReplica();
88         RemoveAllEvents();
89         m_linkedcontrollers.clear();
90 }
91
92
93
94 SCA_IActuator::~SCA_IActuator()
95 {
96         RemoveAllEvents();
97 }
98
99 void SCA_IActuator::DecLink()
100 {
101         m_links--;
102         if (m_links < 0) 
103         {
104                 printf("Warning: actuator %s has negative m_links: %d\n", m_name.Ptr(), m_links);
105                 m_links = 0;
106         }
107 }
108
109 void SCA_IActuator::LinkToController(SCA_IController* controller)
110 {
111         m_linkedcontrollers.push_back(controller);
112 }
113
114 void SCA_IActuator::UnlinkController(SCA_IController* controller)
115 {
116         std::vector<class SCA_IController*>::iterator contit;
117         for (contit = m_linkedcontrollers.begin();!(contit==m_linkedcontrollers.end());++contit)
118         {
119                 if ((*contit) == controller)
120                 {
121                         *contit = m_linkedcontrollers.back();
122                         m_linkedcontrollers.pop_back();
123                         return;
124                 }
125         }
126         printf("Missing link from actuator %s:%s to controller %s:%s\n", 
127                 m_gameobj->GetName().ReadPtr(), GetName().ReadPtr(), 
128                 controller->GetParent()->GetName().ReadPtr(), controller->GetName().ReadPtr());
129 }
130
131 void SCA_IActuator::UnlinkAllControllers()
132 {
133         std::vector<class SCA_IController*>::iterator contit;
134         for (contit = m_linkedcontrollers.begin();!(contit==m_linkedcontrollers.end());++contit)
135         {
136                 (*contit)->UnlinkActuator(this);
137         }
138         m_linkedcontrollers.clear();
139 }
140