Bugfixes: fix for two memory leaks related to dupligroups,
[blender-staging.git] / source / gameengine / SceneGraph / SG_IObject.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 "SG_IObject.h"
30 #include "SG_Controller.h"
31
32 #ifdef HAVE_CONFIG_H
33 #include <config.h>
34 #endif
35
36 SG_IObject::
37 SG_IObject(
38         void* clientobj,
39         void* clientinfo,
40         SG_Callbacks callbacks
41 ): 
42         m_SGclientObject(clientobj),
43         m_SGclientInfo(clientinfo),
44         m_callbacks(callbacks) 
45 {
46         //nothing to do
47 }
48
49 SG_IObject::
50 SG_IObject(
51         const SG_IObject &other
52 ) :
53         m_SGclientObject(other.m_SGclientObject),
54         m_SGclientInfo(other.m_SGclientInfo),
55         m_callbacks(other.m_callbacks) 
56 {
57         //nothing to do
58 }
59
60         void 
61 SG_IObject::
62 AddSGController(
63         SG_Controller* cont
64 ){
65         m_SGcontrollers.push_back(cont);
66 }
67
68         void                            
69 SG_IObject::
70 RemoveAllControllers(
71 ) { 
72         m_SGcontrollers.clear(); 
73 }
74
75 /// Needed for replication
76         SGControllerList&       
77 SG_IObject::
78 GetSGControllerList(
79 ){ 
80         return m_SGcontrollers; 
81 }
82
83         void*                           
84 SG_IObject::
85 GetSGClientObject(
86 ){ 
87         return m_SGclientObject;
88 }
89
90 const 
91         void*                   
92 SG_IObject::
93 GetSGClientObject(
94 ) const {
95         return m_SGclientObject;
96 }
97
98         void    
99 SG_IObject::
100 SetSGClientObject(
101         void* clientObject
102 ){
103         m_SGclientObject = clientObject;
104 }
105
106
107         bool
108 SG_IObject::
109 ActivateReplicationCallback(
110         SG_IObject *replica
111 ){
112         if (m_callbacks.m_replicafunc)
113         {
114                 // Call client provided replication func
115                 if (m_callbacks.m_replicafunc(replica,m_SGclientObject,m_SGclientInfo) == NULL)
116                         return false;
117         }
118         return true;
119 };      
120
121         void
122 SG_IObject::
123 ActivateDestructionCallback(
124 ){
125         if (m_callbacks.m_destructionfunc)
126         {
127                 // Call client provided destruction function on this!
128                 m_callbacks.m_destructionfunc(this,m_SGclientObject,m_SGclientInfo);
129         }
130         else
131         {
132                 // no callback but must still destroy the node to avoid memory leak
133                 delete this;
134         }
135 }
136
137         void
138 SG_IObject::
139 ActivateUpdateTransformCallback(
140 ){
141         if (m_callbacks.m_updatefunc)
142         {
143                 // Call client provided update func.
144                 m_callbacks.m_updatefunc(this, m_SGclientObject, m_SGclientInfo);
145         }
146 }
147
148         void 
149 SG_IObject::
150 SetControllerTime(
151         double time
152 ){
153         SGControllerList::iterator contit;
154
155         for (contit = m_SGcontrollers.begin();contit!=m_SGcontrollers.end();++contit)
156         {
157                 (*contit)->SetSimulatedTime(time);
158         }
159 }
160
161
162 SG_IObject::
163 ~SG_IObject()
164 {
165         SGControllerList::iterator contit;
166
167         for (contit = m_SGcontrollers.begin();contit!=m_SGcontrollers.end();++contit)
168         {
169                 delete (*contit);
170         }
171 }