optionally use guarded alloc for tiles compositor, also replace allocation functions...
[blender.git] / source / gameengine / GameLogic / SCA_IObject.h
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 /** \file SCA_IController.h
28  *  \ingroup gamelogic
29  *  \brief An abstract object that has some logic, python scripting and
30  *   reference counting Note: transformation stuff has been moved to
31  *   SceneGraph
32  */
33
34 #ifndef __SCA_IOBJECT_H__
35 #define __SCA_IOBJECT_H__
36
37 #include "Value.h"
38 #include <vector>
39
40 class SCA_IObject;
41 class SCA_ISensor;
42 class SCA_IController;
43 class SCA_IActuator;
44
45 #ifdef WITH_PYTHON
46 template<class T> T PyVecTo(PyObject*);
47 #endif
48
49 typedef std::vector<SCA_ISensor *>       SCA_SensorList;
50 typedef std::vector<SCA_IController *>   SCA_ControllerList;
51 typedef std::vector<SCA_IActuator *>     SCA_ActuatorList;
52 typedef std::vector<SCA_IObject *>               SCA_ObjectList;
53
54 class SCA_IObject :     public CValue
55 {
56         
57         Py_Header
58         
59 protected:
60         friend class KX_StateActuator;
61         friend class SCA_IActuator;
62         friend class SCA_IController;
63         SCA_SensorList         m_sensors;
64         SCA_ControllerList     m_controllers;
65         SCA_ActuatorList       m_actuators;
66         SCA_ActuatorList       m_registeredActuators;   // actuators that use a pointer to this object
67         SCA_ObjectList             m_registeredObjects;         // objects that hold reference to this object
68
69         // SG_Dlist: element of objects with active actuators
70         //           Head: SCA_LogicManager::m_activeActuators
71         // SG_QList: Head of active actuators list on this object
72         //           Elements: SCA_IActuator
73         SG_QList                           m_activeActuators;
74         // SG_Dlist: element of list os lists with active controllers
75         //           Head: SCA_LogicManager::m_activeControllers
76         // SG_QList: Head of active controller list on this object
77         //           Elements: SCA_IController
78         SG_QList                           m_activeControllers;
79         // SG_Dlist: element of list of lists of active controllers
80         //           Head: SCA_LogicManager::m_activeControllers
81         // SG_QList: Head of active bookmarked controller list globally
82         //           Elements: SCA_IController with bookmark option
83         static SG_QList            m_activeBookmarkedControllers;
84
85         static class MT_Point3 m_sDummy;
86
87         /**
88          * Ignore activity culling requests?
89          */
90         bool m_ignore_activity_culling;
91
92         /**
93          * Ignore updates?
94          */
95         bool m_suspended;
96
97         /**
98          * init state of object (used when object is created)
99          */
100         unsigned int                    m_initState;
101
102         /**
103          * current state = bit mask of state that are active
104          */
105         unsigned int                    m_state;
106
107         /**
108          * pointer inside state actuator list for sorting
109          */
110         SG_QList*                               m_firstState;
111
112 public:
113         
114         SCA_IObject();
115         virtual ~SCA_IObject();
116
117         SCA_ControllerList& GetControllers()
118         {
119                 return m_controllers;
120         }
121         SCA_SensorList& GetSensors()
122         {
123                 return m_sensors;
124         }
125         SCA_ActuatorList& GetActuators()
126         {
127                 return m_actuators;
128         }
129         SG_QList& GetActiveActuators()
130         {
131                 return m_activeActuators;
132         }
133
134         void AddSensor(SCA_ISensor* act);
135         void ReserveSensor(int num)
136         {
137                 m_sensors.reserve(num);
138         }
139         void AddController(SCA_IController* act);
140         void ReserveController(int num)
141         {
142                 m_controllers.reserve(num);
143         }
144         void AddActuator(SCA_IActuator* act);
145         void ReserveActuator(int num)
146         {
147                 m_actuators.reserve(num);
148         }
149         void RegisterActuator(SCA_IActuator* act);
150         void UnregisterActuator(SCA_IActuator* act);
151         
152         void RegisterObject(SCA_IObject* objs);
153         void UnregisterObject(SCA_IObject* objs);
154         /**
155          * UnlinkObject(...)
156          * this object is informed that one of the object to which it holds a reference is deleted
157          * returns true if there was indeed a reference.
158          */
159         virtual bool UnlinkObject(SCA_IObject* clientobj) { return false; }
160
161         SCA_ISensor* FindSensor(const STR_String& sensorname);
162         SCA_IActuator* FindActuator(const STR_String& actuatorname);
163         SCA_IController* FindController(const STR_String& controllername);
164
165         void SetCurrentTime(float currentTime) {}
166
167         virtual void ReParentLogic();
168         
169         /**
170          * Set whether or not to ignore activity culling requests
171          */
172         void SetIgnoreActivityCulling(bool b)
173         {
174                 m_ignore_activity_culling = b;
175         }
176
177         /**
178          * Set whether or not this object wants to ignore activity culling
179          * requests
180          */
181         bool GetIgnoreActivityCulling()
182         {
183                 return m_ignore_activity_culling;
184         }
185
186         /**
187          * Suspend all progress.
188          */
189         void Suspend(void);
190         
191         /**
192          * Resume progress
193          */
194         void Resume(void);
195
196         /**
197          * Set init state
198          */
199         void SetInitState(unsigned int initState) { m_initState = initState; }
200
201         /**
202          * initialize the state when object is created
203          */
204         void ResetState(void) { SetState(m_initState); }
205
206         /**
207          * Set the object state
208          */
209         void SetState(unsigned int state);
210
211         /**
212          * Get the object state
213          */
214         unsigned int GetState(void)     { return m_state; }
215
216 //      const class MT_Point3&  ConvertPythonPylist(PyObject* pylist);
217
218         virtual int GetGameObjectType() {return -1;}
219         
220         typedef enum ObjectTypes {
221                 OBJ_ARMATURE=0,
222                 OBJ_CAMERA=1,
223                 OBJ_LIGHT=2,
224         }ObjectTypes;
225
226 };
227
228 #endif //__SCA_IOBJECT_H__
229