doxygen: prevent GPL license block from being parsed as doxygen comment.
[blender.git] / source / gameengine / Ketsji / KX_ParentActuator.cpp
1 /*
2  * Set or remove an objects parent
3  *
4  * $Id$
5  *
6  * ***** BEGIN GPL LICENSE BLOCK *****
7  *
8  * This program is free software; you can redistribute it and/or
9  * modify it under the terms of the GNU General Public License
10  * as published by the Free Software Foundation; either version 2
11  * of the License, or (at your option) any later version. The Blender
12  * Foundation also sells licenses for use in proprietary software under
13  * the Blender License.  See http://www.blender.org/BL/ for information
14  * about this.
15  *
16  * This program is distributed in the hope that it will be useful,
17  * but WITHOUT ANY WARRANTY; without even the implied warranty of
18  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
19  * GNU General Public License for more details.
20  *
21  * You should have received a copy of the GNU General Public License
22  * along with this program; if not, write to the Free Software Foundation,
23  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
24  *
25  * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
26  * All rights reserved.
27  *
28  * The Original Code is: all of this file.
29  *
30  * Contributor(s): none yet.
31  *
32  * ***** END GPL LICENSE BLOCK *****
33  */
34
35 #include "KX_ParentActuator.h"
36 #include "KX_GameObject.h"
37 #include "KX_PythonInit.h"
38
39 #include "PyObjectPlus.h" 
40
41 /* ------------------------------------------------------------------------- */
42 /* Native functions                                                          */
43 /* ------------------------------------------------------------------------- */
44
45 KX_ParentActuator::KX_ParentActuator(SCA_IObject *gameobj, 
46                                                                          int mode,
47                                                                          bool addToCompound,
48                                                                          bool ghost,
49                                                                          SCA_IObject *ob)
50         : SCA_IActuator(gameobj, KX_ACT_PARENT),
51           m_mode(mode),
52           m_addToCompound(addToCompound),
53           m_ghost(ghost),
54           m_ob(ob)
55 {
56         if (m_ob)
57                 m_ob->RegisterActuator(this);
58
59
60
61
62 KX_ParentActuator::~KX_ParentActuator()
63 {
64         if (m_ob)
65                 m_ob->UnregisterActuator(this);
66
67
68
69
70 CValue* KX_ParentActuator::GetReplica()
71 {
72         KX_ParentActuator* replica = new KX_ParentActuator(*this);
73         // replication just copy the m_base pointer => common random generator
74         replica->ProcessReplica();
75         return replica;
76 }
77
78 void KX_ParentActuator::ProcessReplica()
79 {
80         if (m_ob)
81                 m_ob->RegisterActuator(this);
82         SCA_IActuator::ProcessReplica();
83 }
84
85
86 bool KX_ParentActuator::UnlinkObject(SCA_IObject* clientobj)
87 {
88         if (clientobj == m_ob)
89         {
90                 // this object is being deleted, we cannot continue to track it.
91                 m_ob = NULL;
92                 return true;
93         }
94         return false;
95 }
96
97 void KX_ParentActuator::Relink(GEN_Map<GEN_HashedPtr, void*> *obj_map)
98 {
99         void **h_obj = (*obj_map)[m_ob];
100         if (h_obj) {
101                 if (m_ob)
102                         m_ob->UnregisterActuator(this);
103                 m_ob = (SCA_IObject*)(*h_obj);
104                 m_ob->RegisterActuator(this);
105         }
106 }
107
108
109
110 bool KX_ParentActuator::Update()
111 {
112         bool bNegativeEvent = IsNegativeEvent();
113         RemoveAllEvents();
114
115         if (bNegativeEvent)
116                 return false; // do nothing on negative events
117
118         KX_GameObject *obj = (KX_GameObject*) GetParent();
119         KX_Scene *scene = KX_GetActiveScene();
120         switch (m_mode) {
121                 case KX_PARENT_SET:
122                         if (m_ob)
123                                 obj->SetParent(scene, (KX_GameObject*)m_ob, m_addToCompound, m_ghost);
124                         break;
125                 case KX_PARENT_REMOVE:
126                         obj->RemoveParent(scene);
127                         break;
128         };
129         
130         return false;
131 }
132
133 #ifdef WITH_PYTHON
134
135 /* ------------------------------------------------------------------------- */
136 /* Python functions                                                          */
137 /* ------------------------------------------------------------------------- */
138
139 /* Integration hooks ------------------------------------------------------- */
140 PyTypeObject KX_ParentActuator::Type = {
141         PyVarObject_HEAD_INIT(NULL, 0)
142         "KX_ParentActuator",
143         sizeof(PyObjectPlus_Proxy),
144         0,
145         py_base_dealloc,
146         0,
147         0,
148         0,
149         0,
150         py_base_repr,
151         0,0,0,0,0,0,0,0,0,
152         Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
153         0,0,0,0,0,0,0,
154         Methods,
155         0,
156         0,
157         &SCA_IActuator::Type,
158         0,0,0,0,0,0,
159         py_base_new
160 };
161
162 PyMethodDef KX_ParentActuator::Methods[] = {
163         {NULL,NULL} //Sentinel
164 };
165
166 PyAttributeDef KX_ParentActuator::Attributes[] = {
167         KX_PYATTRIBUTE_RW_FUNCTION("object", KX_ParentActuator, pyattr_get_object, pyattr_set_object),
168         KX_PYATTRIBUTE_INT_RW("mode", KX_PARENT_NODEF+1, KX_PARENT_MAX-1, true, KX_ParentActuator, m_mode),
169         KX_PYATTRIBUTE_BOOL_RW("compound", KX_ParentActuator, m_addToCompound),
170         KX_PYATTRIBUTE_BOOL_RW("ghost", KX_ParentActuator, m_ghost),
171         { NULL }        //Sentinel
172 };
173
174 PyObject* KX_ParentActuator::pyattr_get_object(void *self, const struct KX_PYATTRIBUTE_DEF *attrdef)
175 {
176         KX_ParentActuator* actuator = static_cast<KX_ParentActuator*>(self);
177         if (!actuator->m_ob)    
178                 Py_RETURN_NONE;
179         else
180                 return actuator->m_ob->GetProxy();
181 }
182
183 int KX_ParentActuator::pyattr_set_object(void *self, const struct KX_PYATTRIBUTE_DEF *attrdef, PyObject *value)
184 {
185         KX_ParentActuator* actuator = static_cast<KX_ParentActuator*>(self);
186         KX_GameObject *gameobj;
187                 
188         if (!ConvertPythonToGameObject(value, &gameobj, true, "actuator.object = value: KX_ParentActuator"))
189                 return PY_SET_ATTR_FAIL; // ConvertPythonToGameObject sets the error
190                 
191         if (actuator->m_ob != NULL)
192                 actuator->m_ob->UnregisterActuator(actuator);   
193
194         actuator->m_ob = (SCA_IObject*) gameobj;
195                 
196         if (actuator->m_ob)
197                 actuator->m_ob->RegisterActuator(actuator);
198                 
199         return PY_SET_ATTR_SUCCESS;
200 }
201
202 #endif // WITH_PYTHON
203
204 /* eof */