doxygen: prevent GPL license block from being parsed as doxygen comment.
[blender.git] / source / gameengine / Ketsji / KX_StateActuator.cpp
index 976e7ea52047040e087e18cb91a1f51f789c5c9f..ff4c3985a0418091849aa6266e77ed6bb2c97504 100644 (file)
@@ -15,7 +15,7 @@
  *
  * You should have received a copy of the GNU General Public License
  * along with this program; if not, write to the Free Software Foundation,
- * Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  *
  * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
  * All rights reserved.
 #include "KX_StateActuator.h"
 #include "KX_GameObject.h"
 
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
 KX_StateActuator::KX_StateActuator(
        SCA_IObject* gameobj,
        int operation,
-       unsigned int mask,
-       PyTypeObject* T
+       unsigned int mask
        ) 
-       : SCA_IActuator(gameobj,T),
+       : SCA_IActuator(gameobj, KX_ACT_STATE),
          m_operation(operation),
          m_mask(mask)
 {
@@ -55,6 +50,9 @@ KX_StateActuator::~KX_StateActuator(
        // intentionally empty
 }
 
+// used to put state actuator to be executed before any other actuators
+SG_QList KX_StateActuator::m_stateActuatorHead;
+
 CValue*
 KX_StateActuator::GetReplica(
        void
@@ -62,8 +60,6 @@ KX_StateActuator::GetReplica(
 {
        KX_StateActuator* replica = new KX_StateActuator(*this);
        replica->ProcessReplica();
-       // this will copy properties and so on...
-       CValue::AddDataToReplica(replica);
        return replica;
 }
 
@@ -72,7 +68,10 @@ KX_StateActuator::Update()
 {
        bool bNegativeEvent = IsNegativeEvent();
        unsigned int objMask;
-       
+
+       // execution of state actuator means that we are in the execution phase, reset this pointer
+       // because all the active actuator of this object will be removed for sure.
+       m_gameobj->m_firstState = NULL;
        RemoveAllEvents();
        if (bNegativeEvent) return false;
 
@@ -101,6 +100,32 @@ KX_StateActuator::Update()
        return false;
 }
 
+// this function is only used to deactivate actuators outside the logic loop
+// e.g. when an object is deleted.
+void KX_StateActuator::Deactivate()
+{
+       if (QDelink())
+       {
+               // the actuator was in the active list
+               if (m_stateActuatorHead.QEmpty())
+                       // no more state object active
+                       m_stateActuatorHead.Delink();
+       }
+}
+
+void KX_StateActuator::Activate(SG_DList& head)
+{
+       // sort the state actuators per object on the global list
+       if (QEmpty())
+       {
+               InsertSelfActiveQList(m_stateActuatorHead, &m_gameobj->m_firstState);
+               // add front to make sure it runs before other actuators
+               head.AddFront(&m_stateActuatorHead);
+       }
+}
+
+#ifdef WITH_PYTHON
+
 /* ------------------------------------------------------------------------- */
 /* Python functions                                                          */
 /* ------------------------------------------------------------------------- */
@@ -109,8 +134,7 @@ KX_StateActuator::Update()
 
 /* Integration hooks ------------------------------------------------------- */
 PyTypeObject KX_StateActuator::Type = {
-       PyObject_HEAD_INIT(NULL)
-       0,
+       PyVarObject_HEAD_INIT(NULL, 0)
        "KX_StateActuator",
        sizeof(PyObjectPlus_Proxy),
        0,
@@ -120,30 +144,18 @@ PyTypeObject KX_StateActuator::Type = {
        0,
        0,
        py_base_repr,
-       0,0,0,0,0,0,
-       py_base_getattro,
-       py_base_setattro,
        0,0,0,0,0,0,0,0,0,
-       Methods
-};
-
-PyParentObject 
-KX_StateActuator::Parents[] = {
-       &KX_StateActuator::Type,
+       Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
+       0,0,0,0,0,0,0,
+       Methods,
+       0,
+       0,
        &SCA_IActuator::Type,
-       &SCA_ILogicBrick::Type,
-       &CValue::Type,
-       NULL
+       0,0,0,0,0,0,
+       py_base_new
 };
 
-PyMethodDef 
-KX_StateActuator::Methods[] = {
-       // deprecated -->
-       {"setOperation", (PyCFunction) KX_StateActuator::sPySetOperation, 
-        METH_VARARGS, (PY_METHODCHAR)SetOperation_doc},
-       {"setMask", (PyCFunction) KX_StateActuator::sPySetMask, 
-        METH_VARARGS, (PY_METHODCHAR)SetMask_doc},
-        // <--
+PyMethodDef KX_StateActuator::Methods[] = {
        {NULL,NULL} //Sentinel
 };
 
@@ -153,61 +165,4 @@ PyAttributeDef KX_StateActuator::Attributes[] = {
        { NULL }        //Sentinel
 };
 
-PyObject* KX_StateActuator::py_getattro(PyObject *attr)
-{
-       py_getattro_up(SCA_IActuator);
-};
-
-int KX_StateActuator::py_setattro(PyObject *attr, PyObject* value)
-{
-       py_setattro_up(SCA_IActuator);
-}
-
-
-/* set operation ---------------------------------------------------------- */
-const char 
-KX_StateActuator::SetOperation_doc[] = 
-"setOperation(op)\n"
-"\t - op : bit operation (0=Copy, 1=Set, 2=Clear, 3=Negate)"
-"\tSet the type of bit operation to be applied on object state mask.\n"
-"\tUse setMask() to specify the bits that will be modified.\n";
-PyObject* 
-
-KX_StateActuator::PySetOperation(PyObject* args) {
-       ShowDeprecationWarning("setOperation()", "the operation property");
-       int oper;
-
-       if(!PyArg_ParseTuple(args, "i:setOperation", &oper)) {
-               return NULL;
-       }
-
-       m_operation = oper;
-
-       Py_RETURN_NONE;
-}
-
-/* set mask ---------------------------------------------------------- */
-const char 
-KX_StateActuator::SetMask_doc[] = 
-"setMask(mask)\n"
-"\t - mask : bits that will be modified"
-"\tSet the value that defines the bits that will be modified by the operation.\n"
-"\tThe bits that are 1 in the value will be updated in the object state,\n"
-"\tthe bits that are 0 are will be left unmodified expect for the Copy operation\n"
-"\twhich copies the value to the object state.\n";
-PyObject* 
-
-KX_StateActuator::PySetMask(PyObject* args) {
-       ShowDeprecationWarning("setMask()", "the mask property");
-       int mask;
-
-       if(!PyArg_ParseTuple(args, "i:setMask", &mask)) {
-               return NULL;
-       }
-
-       m_mask = mask;
-
-       Py_RETURN_NONE;
-}
-
-
+#endif // WITH_PYTHON