BGE: bookmark option on controller to make them run before all other controllers.
[blender.git] / source / gameengine / GameLogic / SCA_IObject.h
index e3c06a92b9f93e315091c099029cf795221356a5..c4f346059d444cbe1f81f1fcb8d9fc0a13025e83 100644 (file)
@@ -1,15 +1,12 @@
 /**
  * $Id$
  *
- * ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
+ * ***** BEGIN GPL LICENSE BLOCK *****
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License
  * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version. The Blender
- * Foundation also sells licenses for use in proprietary software under
- * the Blender License.  See http://www.blender.org/BL/ for information
- * about this.
+ * of the License, or (at your option) any later version.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -27,7 +24,7 @@
  *
  * Contributor(s): none yet.
  *
- * ***** END GPL/BL DUAL LICENSE BLOCK *****
+ * ***** END GPL LICENSE BLOCK *****
  * An abstract object that has some logic, python scripting and
  * reference counting Note: transformation stuff has been moved to
  * SceneGraph
@@ -43,21 +40,41 @@ class SCA_ISensor;
 class SCA_IController;
 class SCA_IActuator;
 
+template<class T> T PyVecTo(PyObject*);
 
 typedef std::vector<SCA_ISensor *>       SCA_SensorList;
 typedef std::vector<SCA_IController *>   SCA_ControllerList;
 typedef std::vector<SCA_IActuator *>     SCA_ActuatorList;
 
-
 class SCA_IObject :    public CValue
 {
        
        Py_Header;
        
 protected:
+       friend class SCA_IActuator;
+       friend class SCA_IController;
        SCA_SensorList         m_sensors;
        SCA_ControllerList     m_controllers;
        SCA_ActuatorList       m_actuators;
+       SCA_ActuatorList       m_registeredActuators;   // actuators that use a pointer to this object
+
+       // SG_Dlist: element of objects with active actuators
+       //           Head: SCA_LogicManager::m_activeActuators
+       // SG_QList: Head of active actuators list on this object
+       //           Elements: SCA_IActuator
+       SG_QList                           m_activeActuators;
+       // SG_Dlist: element of list os lists with active controllers
+       //           Head: SCA_LogicManager::m_activeControllers
+       // SG_QList: Head of active controller list on this object
+       //           Elements: SCA_IController
+       SG_QList                           m_activeControllers;
+       // SG_Dlist: element of list of lists of active controllers
+       //           Head: SCA_LogicManager::m_activeControllers
+       // SG_QList: Head of active bookmarked controller list globally
+       //           Elements: SCA_IController with bookmark option
+       static SG_QList            m_activeBookmarkedControllers;
+
        static class MT_Point3 m_sDummy;
 
        /**
@@ -69,38 +86,81 @@ protected:
         * Ignore updates?
         */
        bool m_suspended;
-       
+
+       /**
+        * init state of object (used when object is created)
+        */
+       unsigned int                    m_initState;
+
+       /**
+        * current state = bit mask of state that are active
+        */
+       unsigned int                    m_state;
+
 public:
        
        SCA_IObject(PyTypeObject* T=&Type);
        virtual ~SCA_IObject();
 
-       SCA_ControllerList& GetControllers();
-       SCA_SensorList& GetSensors();
-       SCA_ActuatorList& GetActuators();
+       SCA_ControllerList& GetControllers()
+       {
+               return m_controllers;
+       }
+       SCA_SensorList& GetSensors()
+       {
+               return m_sensors;
+       }
+       SCA_ActuatorList& GetActuators()
+       {
+               return m_actuators;
+       }
+       SG_QList& GetActiveActuators()
+       {
+               return m_activeActuators;
+       }
 
        void AddSensor(SCA_ISensor* act);
+       void ReserveSensor(int num)
+       {
+               m_sensors.reserve(num);
+       }
        void AddController(SCA_IController* act);
+       void ReserveController(int num)
+       {
+               m_controllers.reserve(num);
+       }
        void AddActuator(SCA_IActuator* act);
+       void ReserveActuator(int num)
+       {
+               m_actuators.reserve(num);
+       }
+       void RegisterActuator(SCA_IActuator* act);
+       void UnregisterActuator(SCA_IActuator* act);
        
        SCA_ISensor* FindSensor(const STR_String& sensorname);
        SCA_IActuator* FindActuator(const STR_String& actuatorname);
        SCA_IController* FindController(const STR_String& controllername);
 
-       void SetCurrentTime(float currentTime);
+       void SetCurrentTime(float currentTime) {}
 
        void ReParentLogic();
        
        /**
         * Set whether or not to ignore activity culling requests
         */
-       void SetIgnoreActivityCulling(bool b);
+       void SetIgnoreActivityCulling(bool b)
+       {
+               m_ignore_activity_culling = b;
+       }
 
        /**
         * Set whether or not this object wants to ignore activity culling
         * requests
         */
-       bool GetIgnoreActivityCulling();
+       bool GetIgnoreActivityCulling()
+       {
+               return m_ignore_activity_culling;
+       }
 
        /**
         * Suspend all progress.
@@ -111,16 +171,40 @@ public:
         * Resume progress
         */
        void Resume(void);
-       
-       const class MT_Point3&  ConvertPythonPylist(PyObject* pylist);
-       const class MT_Point3&  ConvertPythonVectorArg(PyObject* args);
+
+       /**
+        * Set init state
+        */
+       void SetInitState(unsigned int initState) { m_initState = initState; }
+
+       /**
+        * initialize the state when object is created
+        */
+       void ResetState(void) { SetState(m_initState); }
+
+       /**
+        * Set the object state
+        */
+       void SetState(unsigned int state);
+
+       /**
+        * Get the object state
+        */
+       unsigned int GetState(void)     { return m_state; }
+
+//     const class MT_Point3&  ConvertPythonPylist(PyObject* pylist);
        
        // here come the python forwarded methods
-       PyObject* _getattr(char* attr);
-       
-};
-#endif //SCA_IOBJECT_H
+       virtual PyObject* py_getattro(PyObject *attr);
+       virtual PyObject* py_getattro_dict();
 
+       virtual int GetGameObjectType() {return -1;}
+       
+       typedef enum ObjectTypes {
+               OBJ_ARMATURE=0,
+       }ObjectTypes;
 
+};
 
+#endif //SCA_IOBJECT_H