Merge of itasc branch. Project files, scons and cmake should be working. Makefile...
[blender.git] / source / gameengine / GameLogic / SCA_IObject.h
1 /**
2  * $Id$
3  *
4  * ***** BEGIN GPL LICENSE BLOCK *****
5  *
6  * This program is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU General Public License
8  * as published by the Free Software Foundation; either version 2
9  * of the License, or (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, write to the Free Software Foundation,
18  * Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
19  *
20  * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
21  * All rights reserved.
22  *
23  * The Original Code is: all of this file.
24  *
25  * Contributor(s): none yet.
26  *
27  * ***** END GPL LICENSE BLOCK *****
28  * An abstract object that has some logic, python scripting and
29  * reference counting Note: transformation stuff has been moved to
30  * SceneGraph
31  */
32
33 #ifndef SCA_IOBJECT_H
34 #define SCA_IOBJECT_H
35
36 #include "Value.h"
37 #include <vector>
38
39 class SCA_IObject;
40 class SCA_ISensor;
41 class SCA_IController;
42 class SCA_IActuator;
43
44 template<class T> T PyVecTo(PyObject*);
45
46 typedef std::vector<SCA_ISensor *>       SCA_SensorList;
47 typedef std::vector<SCA_IController *>   SCA_ControllerList;
48 typedef std::vector<SCA_IActuator *>     SCA_ActuatorList;
49 typedef std::vector<SCA_IObject *>               SCA_ObjectList;
50
51 class SCA_IObject :     public CValue
52 {
53         
54         Py_Header;
55         
56 protected:
57         friend class KX_StateActuator;
58         friend class SCA_IActuator;
59         friend class SCA_IController;
60         SCA_SensorList         m_sensors;
61         SCA_ControllerList     m_controllers;
62         SCA_ActuatorList       m_actuators;
63         SCA_ActuatorList       m_registeredActuators;   // actuators that use a pointer to this object
64         SCA_ObjectList             m_registeredObjects;         // objects that hold reference to this object
65
66         // SG_Dlist: element of objects with active actuators
67         //           Head: SCA_LogicManager::m_activeActuators
68         // SG_QList: Head of active actuators list on this object
69         //           Elements: SCA_IActuator
70         SG_QList                           m_activeActuators;
71         // SG_Dlist: element of list os lists with active controllers
72         //           Head: SCA_LogicManager::m_activeControllers
73         // SG_QList: Head of active controller list on this object
74         //           Elements: SCA_IController
75         SG_QList                           m_activeControllers;
76         // SG_Dlist: element of list of lists of active controllers
77         //           Head: SCA_LogicManager::m_activeControllers
78         // SG_QList: Head of active bookmarked controller list globally
79         //           Elements: SCA_IController with bookmark option
80         static SG_QList            m_activeBookmarkedControllers;
81
82         static class MT_Point3 m_sDummy;
83
84         /**
85          * Ignore activity culling requests?
86          */
87         bool m_ignore_activity_culling;
88
89         /**
90          * Ignore updates?
91          */
92         bool m_suspended;
93
94         /**
95          * init state of object (used when object is created)
96          */
97         unsigned int                    m_initState;
98
99         /**
100          * current state = bit mask of state that are active
101          */
102         unsigned int                    m_state;
103
104         /**
105          * pointer inside state actuator list for sorting
106          */
107         SG_QList*                               m_firstState;
108
109 public:
110         
111         SCA_IObject();
112         virtual ~SCA_IObject();
113
114         SCA_ControllerList& GetControllers()
115         {
116                 return m_controllers;
117         }
118         SCA_SensorList& GetSensors()
119         {
120                 return m_sensors;
121         }
122         SCA_ActuatorList& GetActuators()
123         {
124                 return m_actuators;
125         }
126         SG_QList& GetActiveActuators()
127         {
128                 return m_activeActuators;
129         }
130
131         void AddSensor(SCA_ISensor* act);
132         void ReserveSensor(int num)
133         {
134                 m_sensors.reserve(num);
135         }
136         void AddController(SCA_IController* act);
137         void ReserveController(int num)
138         {
139                 m_controllers.reserve(num);
140         }
141         void AddActuator(SCA_IActuator* act);
142         void ReserveActuator(int num)
143         {
144                 m_actuators.reserve(num);
145         }
146         void RegisterActuator(SCA_IActuator* act);
147         void UnregisterActuator(SCA_IActuator* act);
148         
149         void RegisterObject(SCA_IObject* objs);
150         void UnregisterObject(SCA_IObject* objs);
151         /**
152          * UnlinkObject(...)
153          * this object is informed that one of the object to which it holds a reference is deleted
154          * returns true if there was indeed a reference.
155          */
156         virtual bool UnlinkObject(SCA_IObject* clientobj) { return false; }
157
158         SCA_ISensor* FindSensor(const STR_String& sensorname);
159         SCA_IActuator* FindActuator(const STR_String& actuatorname);
160         SCA_IController* FindController(const STR_String& controllername);
161
162         void SetCurrentTime(float currentTime) {}
163
164         virtual void ReParentLogic();
165         
166         /**
167          * Set whether or not to ignore activity culling requests
168          */
169         void SetIgnoreActivityCulling(bool b)
170         {
171                 m_ignore_activity_culling = b;
172         }
173
174         /**
175          * Set whether or not this object wants to ignore activity culling
176          * requests
177          */
178         bool GetIgnoreActivityCulling()
179         {
180                 return m_ignore_activity_culling;
181         }
182
183         /**
184          * Suspend all progress.
185          */
186         void Suspend(void);
187         
188         /**
189          * Resume progress
190          */
191         void Resume(void);
192
193         /**
194          * Set init state
195          */
196         void SetInitState(unsigned int initState) { m_initState = initState; }
197
198         /**
199          * initialize the state when object is created
200          */
201         void ResetState(void) { SetState(m_initState); }
202
203         /**
204          * Set the object state
205          */
206         void SetState(unsigned int state);
207
208         /**
209          * Get the object state
210          */
211         unsigned int GetState(void)     { return m_state; }
212
213 //      const class MT_Point3&  ConvertPythonPylist(PyObject* pylist);
214
215         virtual int GetGameObjectType() {return -1;}
216         
217         typedef enum ObjectTypes {
218                 OBJ_ARMATURE=0,
219                 OBJ_CAMERA=1,
220         }ObjectTypes;
221
222 };
223
224 #endif //SCA_IOBJECT_H
225