get/set Angular velocity for KX_GameObjects python api and for the AddObject actuator.
authorCampbell Barton <ideasman42@gmail.com>
Wed, 27 Aug 2008 03:34:53 +0000 (03:34 +0000)
committerCampbell Barton <ideasman42@gmail.com>
Wed, 27 Aug 2008 03:34:53 +0000 (03:34 +0000)
Needed so objects created in an explosion could start spinning without having motion actuators and collision sensors on each item.

source/blender/makesdna/DNA_actuator_types.h
source/blender/src/buttons_logic.c
source/gameengine/Converter/KX_ConvertActuators.cpp
source/gameengine/Expressions/PyObjectPlus.h
source/gameengine/Ketsji/KX_GameObject.cpp
source/gameengine/Ketsji/KX_GameObject.h
source/gameengine/Ketsji/KX_SCA_AddObjectActuator.cpp
source/gameengine/Ketsji/KX_SCA_AddObjectActuator.h
source/gameengine/PyDoc/KX_GameObject.py
source/gameengine/PyDoc/KX_SCA_AddObjectActuator.py

index 7444ce95f56a47de24e3e868b6290d48bfc805ba..59d0555b4523072e4b9389229b3698a8e2e8428a 100644 (file)
@@ -81,7 +81,9 @@ typedef struct bEditObjectActuator {
        struct Mesh *me;
        char name[32];
        float linVelocity[3]; /* initial lin. velocity on creation */
-       short localflag; /* flag for the lin. vel: apply locally   */
+       float angVelocity[3]; /* initial ang. velocity on creation */
+       float pad;
+       short localflag; /* flag for the lin & ang. vel: apply locally   */
        short dyn_operation;
 } bEditObjectActuator;
 
@@ -384,6 +386,9 @@ typedef struct FreeCamera {
 #define ACT_EDOB_TRACK_TO              3
 #define ACT_EDOB_DYNAMICS              4
 
+/* editObjectActuator->localflag */
+#define ACT_EDOB_LOCAL_LINV            2
+#define ACT_EDOB_LOCAL_ANGV            4
 
 
 /* editObjectActuator->flag */
index 2dd6d705a9edf05a33d09ac1f03ede41a9dc3231..78bab43a3c1b78ec8b52786a0fcbd348e37c9027 100644 (file)
@@ -2022,7 +2022,7 @@ static short draw_actuatorbuttons(Object *ob, bActuator *act, uiBlock *block, sh
 
                if(eoa->type==ACT_EDOB_ADD_OBJECT) {
                        int wval; /* just a temp width */
-                       ysize = 72;
+                       ysize = 92;
                        glRects(xco, yco-ysize, xco+width, yco);
                        uiEmboss((float)xco, (float)yco-ysize, (float)xco+width, (float)yco, 1);
         
@@ -2042,9 +2042,27 @@ static short draw_actuatorbuttons(Object *ob, bActuator *act, uiBlock *block, sh
                        uiDefButF(block, NUM, 0, "",            xco+45+2*wval, yco-68, wval, 19,
                                         eoa->linVelocity+2, -100.0, 100.0, 10, 0,
                                         "Velocity upon creation, z component.");
-                       uiDefButBitS(block, TOG, 2, 0, "L", xco+45+3*wval, yco-68, 15, 19,
+                       uiDefButBitS(block, TOG, ACT_EDOB_LOCAL_LINV, 0, "L", xco+45+3*wval, yco-68, 15, 19,
                                         &eoa->localflag, 0.0, 0.0, 0, 0,
                                         "Apply the transformation locally");
+                       
+                       
+                       uiDefBut(block, LABEL, 0, "AngV",       xco,           yco-90,   45, 19,
+                                        NULL, 0, 0, 0, 0,
+                                        "Angular velocity upon creation.");
+                       uiDefButF(block, NUM, 0, "",            xco+45,        yco-90, wval, 19,
+                                        eoa->angVelocity, -10000.0, 10000.0, 10, 0,
+                                        "Angular velocity upon creation, x component.");
+                       uiDefButF(block, NUM, 0, "",            xco+45+wval,   yco-90, wval, 19,
+                                        eoa->angVelocity+1, -10000.0, 10000.0, 10, 0,
+                                        "Angular velocity upon creation, y component.");
+                       uiDefButF(block, NUM, 0, "",            xco+45+2*wval, yco-90, wval, 19,
+                                        eoa->angVelocity+2, -10000.0, 10000.0, 10, 0,
+                                        "Angular velocity upon creation, z component.");
+                       uiDefButBitS(block, TOG, ACT_EDOB_LOCAL_ANGV, 0, "L", xco+45+3*wval, yco-90, 15, 19,
+                                        &eoa->localflag, 0.0, 0.0, 0, 0,
+                                        "Apply the rotation locally");
+                                        
 
                }
                else if(eoa->type==ACT_EDOB_END_OBJECT) {
index e71928b8cee122d7051dfa2186e59d8f5264bce7..9ec8bdd91fcbddf0cab11bbeab367eec97284cde 100644 (file)
@@ -573,10 +573,16 @@ void BL_ConvertActuators(char* maggiename,
                                                                originalval = converter->FindGameObject(editobact->ob);
                                                        }
                                                }
-                                               MT_Vector3 linvelvec ( KX_BLENDERTRUNC(editobact->linVelocity[0]),
+                                               MT_Vector3 linvelvec (
+                                                       KX_BLENDERTRUNC(editobact->linVelocity[0]),
                                                        KX_BLENDERTRUNC(editobact->linVelocity[1]),
                                                        KX_BLENDERTRUNC(editobact->linVelocity[2]));
-                                                       
+                                               
+                                               MT_Vector3 angvelvec (
+                                                       KX_BLENDERTRUNC(editobact->angVelocity[0]),
+                                                       KX_BLENDERTRUNC(editobact->angVelocity[1]),
+                                                       KX_BLENDERTRUNC(editobact->angVelocity[2]));
+                                               
                                                KX_SCA_AddObjectActuator* tmpaddact = 
                                                        new KX_SCA_AddObjectActuator(
                                                                gameobj, 
@@ -584,7 +590,9 @@ void BL_ConvertActuators(char* maggiename,
                                                                editobact->time,
                                                                scene,
                                                                linvelvec.getValue(),
-                                                               editobact->localflag!=0
+                                                               (editobact->localflag & ACT_EDOB_LOCAL_LINV)!=0,
+                                                               angvelvec.getValue(),
+                                                               (editobact->localflag & ACT_EDOB_LOCAL_ANGV)!=0
                                                                );
                                                                
                                                                //editobact->ob to gameobj
index f433a08fabafe694176a7451991cb9bfc3417374..deb47322d494385113294632fa7d85faaa8cda2e 100644 (file)
@@ -102,6 +102,12 @@ static inline void Py_Fatal(char *M) {
                return ((class_name*) self)->Py##method_name(self, args, kwds);         \
        }; \
 
+#define KX_PYMETHOD_VARARGS(class_name, method_name)                   \
+       PyObject* Py##method_name(PyObject* self, PyObject* args); \
+       static PyObject* sPy##method_name( PyObject* self, PyObject* args) { \
+               return ((class_name*) self)->Py##method_name(self, args);               \
+       }; \
+
 #define KX_PYMETHOD_NOARGS(class_name, method_name)                    \
        PyObject* Py##method_name(PyObject* self); \
        static PyObject* sPy##method_name( PyObject* self) { \
index 700cc00e996c5e5c690e8616628c402d1eacef5b..010ee1ebae977e862c76188c7989f8bc8b4b351e 100644 (file)
@@ -885,6 +885,8 @@ PyMethodDef KX_GameObject::Methods[] = {
        {"setPosition", (PyCFunction) KX_GameObject::sPySetPosition, METH_O},
        {"getLinearVelocity", (PyCFunction) KX_GameObject::sPyGetLinearVelocity, METH_VARARGS},
        {"setLinearVelocity", (PyCFunction) KX_GameObject::sPySetLinearVelocity, METH_VARARGS},
+       {"getAngularVelocity", (PyCFunction) KX_GameObject::sPyGetAngularVelocity, METH_VARARGS},
+       {"setAngularVelocity", (PyCFunction) KX_GameObject::sPySetAngularVelocity, METH_VARARGS},
        {"getVelocity", (PyCFunction) KX_GameObject::sPyGetVelocity, METH_VARARGS},
        {"getMass", (PyCFunction) KX_GameObject::sPyGetMass, METH_NOARGS},
        {"getReactionForce", (PyCFunction) KX_GameObject::sPyGetReactionForce, METH_NOARGS},
@@ -1146,9 +1148,7 @@ int KX_GameObject::_setattr(const STR_String& attr, PyObject *value)      // _setattr
 }
 
 
-PyObject* KX_GameObject::PyGetLinearVelocity(PyObject* self, 
-                                                                                        PyObject* args, 
-                                                                                        PyObject* kwds)
+PyObject* KX_GameObject::PyGetLinearVelocity(PyObject* self, PyObject* args)
 {
        // only can get the velocity if we have a physics object connected to us...
        int local = 0;
@@ -1162,9 +1162,7 @@ PyObject* KX_GameObject::PyGetLinearVelocity(PyObject* self,
        }
 }
 
-PyObject* KX_GameObject::PySetLinearVelocity(PyObject* self, 
-                                                                                        PyObject* args, 
-                                                                                        PyObject* kwds)
+PyObject* KX_GameObject::PySetLinearVelocity(PyObject* self, PyObject* args)
 {
        int local = 0;
        PyObject* pyvect;
@@ -1179,6 +1177,35 @@ PyObject* KX_GameObject::PySetLinearVelocity(PyObject* self,
        return NULL;
 }
 
+PyObject* KX_GameObject::PyGetAngularVelocity(PyObject* self, PyObject* args)
+{
+       // only can get the velocity if we have a physics object connected to us...
+       int local = 0;
+       if (PyArg_ParseTuple(args,"|i",&local))
+       {
+               return PyObjectFrom(GetAngularVelocity((local!=0)));
+       }
+       else
+       {
+               return NULL;
+       }
+}
+
+PyObject* KX_GameObject::PySetAngularVelocity(PyObject* self, PyObject* args)
+{
+       int local = 0;
+       PyObject* pyvect;
+       
+       if (PyArg_ParseTuple(args,"O|i",&pyvect,&local)) {
+               MT_Vector3 velocity;
+               if (PyVecTo(pyvect, velocity)) {
+                       setAngularVelocity(velocity, (local!=0));
+                       Py_RETURN_NONE;
+               }
+       }
+       return NULL;
+}
+
 PyObject* KX_GameObject::PySetVisible(PyObject* self, PyObject* value)
 {
        int visible = PyInt_AsLong(value);
@@ -1228,9 +1255,7 @@ PyObject* KX_GameObject::PySetState(PyObject* self, PyObject* value)
 
 
 
-PyObject* KX_GameObject::PyGetVelocity(PyObject* self, 
-                                                                          PyObject* args, 
-                                                                          PyObject* kwds)
+PyObject* KX_GameObject::PyGetVelocity(PyObject* self, PyObject* args)
 {
        // only can get the velocity if we have a physics object connected to us...
        MT_Vector3 velocity(0.0,0.0,0.0);
@@ -1362,9 +1387,7 @@ PyObject* KX_GameObject::PyGetChildrenRecursive(PyObject* self)
        return list;
 }
 
-PyObject* KX_GameObject::PyGetMesh(PyObject* self, 
-                                                                  PyObject* args, 
-                                                                  PyObject* kwds)
+PyObject* KX_GameObject::PyGetMesh(PyObject* self, PyObject* args)
 {
        int mesh = 0;
 
@@ -1404,9 +1427,7 @@ PyObject* KX_GameObject::PySetCollisionMargin(PyObject* self, PyObject* value)
 
 
 
-PyObject* KX_GameObject::PyApplyImpulse(PyObject* self, 
-                                                                               PyObject* args, 
-                                                                               PyObject* kwds)
+PyObject* KX_GameObject::PyApplyImpulse(PyObject* self, PyObject* args)
 {
        PyObject* pyattach;
        PyObject* pyimpulse;
@@ -1477,9 +1498,7 @@ PyObject* KX_GameObject::PySetOrientation(PyObject* self, PyObject* value)
        return NULL;
 }
 
-PyObject* KX_GameObject::PyAlignAxisToVect(PyObject* self, 
-                                                                                 PyObject* args, 
-                                                                                 PyObject* kwds)
+PyObject* KX_GameObject::PyAlignAxisToVect(PyObject* self, PyObject* args)
 {
        PyObject* pyvect;
        int axis = 2; //z axis is the default
index a7ac2d75a930b2824bd38580cb5c5d7c3f0742f3..061719052206efb0219d6a242a4cce27e1e7d0ee 100644 (file)
@@ -726,9 +726,11 @@ public:
 
        KX_PYMETHOD_NOARGS(KX_GameObject,GetPosition);
        KX_PYMETHOD_O(KX_GameObject,SetPosition);
-       KX_PYMETHOD(KX_GameObject,GetLinearVelocity);
-       KX_PYMETHOD(KX_GameObject,SetLinearVelocity);
-       KX_PYMETHOD(KX_GameObject,GetVelocity);
+       KX_PYMETHOD_VARARGS(KX_GameObject,GetLinearVelocity);
+       KX_PYMETHOD_VARARGS(KX_GameObject,SetLinearVelocity);
+       KX_PYMETHOD_VARARGS(KX_GameObject,GetAngularVelocity);
+       KX_PYMETHOD_VARARGS(KX_GameObject,SetAngularVelocity);
+       KX_PYMETHOD_VARARGS(KX_GameObject,GetVelocity);
        KX_PYMETHOD_NOARGS(KX_GameObject,GetMass);
        KX_PYMETHOD_NOARGS(KX_GameObject,GetReactionForce);
        KX_PYMETHOD_NOARGS(KX_GameObject,GetOrientation);
@@ -737,20 +739,20 @@ public:
        KX_PYMETHOD_O(KX_GameObject,SetVisible);
        KX_PYMETHOD_NOARGS(KX_GameObject,GetState);
        KX_PYMETHOD_O(KX_GameObject,SetState);
-       KX_PYMETHOD(KX_GameObject,AlignAxisToVect);
+       KX_PYMETHOD_VARARGS(KX_GameObject,AlignAxisToVect);
        KX_PYMETHOD_O(KX_GameObject,GetAxisVect);
        KX_PYMETHOD_NOARGS(KX_GameObject,SuspendDynamics);
        KX_PYMETHOD_NOARGS(KX_GameObject,RestoreDynamics);
        KX_PYMETHOD_NOARGS(KX_GameObject,EnableRigidBody);
        KX_PYMETHOD_NOARGS(KX_GameObject,DisableRigidBody);
-       KX_PYMETHOD(KX_GameObject,ApplyImpulse);
+       KX_PYMETHOD_VARARGS(KX_GameObject,ApplyImpulse);
        KX_PYMETHOD_O(KX_GameObject,SetCollisionMargin);
        KX_PYMETHOD_NOARGS(KX_GameObject,GetParent);
        KX_PYMETHOD_O(KX_GameObject,SetParent);
        KX_PYMETHOD_NOARGS(KX_GameObject,RemoveParent);
        KX_PYMETHOD_NOARGS(KX_GameObject,GetChildren);  
        KX_PYMETHOD_NOARGS(KX_GameObject,GetChildrenRecursive);
-       KX_PYMETHOD(KX_GameObject,GetMesh);
+       KX_PYMETHOD_VARARGS(KX_GameObject,GetMesh);
        KX_PYMETHOD_NOARGS(KX_GameObject,GetPhysicsId);
        KX_PYMETHOD_NOARGS(KX_GameObject,GetPropertyNames);
        KX_PYMETHOD_NOARGS(KX_GameObject,EndObject);
index 7e0d0df1ab7bd45795bc22d6dfd83be8cef5c02d..a7330b9a20ac1d0fd798f5346e90b8217b8397e2 100644 (file)
@@ -52,14 +52,20 @@ KX_SCA_AddObjectActuator::KX_SCA_AddObjectActuator(SCA_IObject *gameobj,
                                                                                                   int time,
                                                                                                   SCA_IScene* scene,
                                                                                                   const MT_Vector3& linvel,
-                                                                                                  bool local,
+                                                                                                  bool linv_local,
+                                                                                                  const MT_Vector3& angvel,
+                                                                                                  bool angv_local,
                                                                                                   PyTypeObject* T)
        : 
        SCA_IActuator(gameobj, T),
        m_OriginalObject(original),
        m_scene(scene),
+       
        m_linear_velocity(linvel),
-       m_localFlag(local)
+       m_localLinvFlag(linv_local),
+       
+       m_angular_velocity(angvel),
+       m_localAngvFlag(angv_local)
 {
        if (m_OriginalObject)
                m_OriginalObject->RegisterActuator(this);
@@ -181,13 +187,15 @@ PyParentObject KX_SCA_AddObjectActuator::Parents[] = {
 };
 PyMethodDef KX_SCA_AddObjectActuator::Methods[] = {
   {"setObject", (PyCFunction) KX_SCA_AddObjectActuator::sPySetObject, METH_O, SetObject_doc},
-  {"setTime", (PyCFunction) KX_SCA_AddObjectActuator::sPySetTime, METH_VARARGS, SetTime_doc},
+  {"setTime", (PyCFunction) KX_SCA_AddObjectActuator::sPySetTime, METH_O, SetTime_doc},
   {"getObject", (PyCFunction) KX_SCA_AddObjectActuator::sPyGetObject, METH_VARARGS, GetObject_doc},
-  {"getTime", (PyCFunction) KX_SCA_AddObjectActuator::sPyGetTime, METH_VARARGS, GetTime_doc},
-  {"getLinearVelocity", (PyCFunction) KX_SCA_AddObjectActuator::sPyGetLinearVelocity, METH_VARARGS, GetLinearVelocity_doc},
+  {"getTime", (PyCFunction) KX_SCA_AddObjectActuator::sPyGetTime, METH_NOARGS, GetTime_doc},
+  {"getLinearVelocity", (PyCFunction) KX_SCA_AddObjectActuator::sPyGetLinearVelocity, METH_NOARGS, GetLinearVelocity_doc},
   {"setLinearVelocity", (PyCFunction) KX_SCA_AddObjectActuator::sPySetLinearVelocity, METH_VARARGS, SetLinearVelocity_doc},
-  {"getLastCreatedObject", (PyCFunction) KX_SCA_AddObjectActuator::sPyGetLastCreatedObject, METH_VARARGS,"getLastCreatedObject() : get the object handle to the last created object\n"},
-  {"instantAddObject", (PyCFunction) KX_SCA_AddObjectActuator::sPyInstantAddObject, METH_VARARGS,"instantAddObject() : immediately add object without delay\n"},
+  {"getAngularVelocity", (PyCFunction) KX_SCA_AddObjectActuator::sPyGetAngularVelocity, METH_NOARGS, GetAngularVelocity_doc},
+  {"setAngularVelocity", (PyCFunction) KX_SCA_AddObjectActuator::sPySetAngularVelocity, METH_VARARGS, SetAngularVelocity_doc},
+  {"getLastCreatedObject", (PyCFunction) KX_SCA_AddObjectActuator::sPyGetLastCreatedObject, METH_NOARGS,"getLastCreatedObject() : get the object handle to the last created object\n"},
+  {"instantAddObject", (PyCFunction) KX_SCA_AddObjectActuator::sPyInstantAddObject, METH_NOARGS,"instantAddObject() : immediately add object without delay\n"},
   
   {NULL,NULL} //Sentinel
 };
@@ -231,19 +239,18 @@ char KX_SCA_AddObjectActuator::SetTime_doc[] =
 "\tIf the duration is negative, it is set to 0.\n";
 
 
-PyObject* KX_SCA_AddObjectActuator::PySetTime(PyObject* self,
-                                                                                         PyObject* args,
-                                                                                         PyObject* kwds)
+PyObject* KX_SCA_AddObjectActuator::PySetTime(PyObject* self, PyObject* value)
 {
-       int deltatime;
-       
-       if (!PyArg_ParseTuple(args, "i", &deltatime))
+       int deltatime = PyInt_AsLong(value);
+       if (deltatime==-1 && PyErr_Occurred()) {
+               PyErr_SetString(PyExc_TypeError, "expected an int");
                return NULL;
+       }
        
        m_timeProp = deltatime;
        if (m_timeProp < 0) m_timeProp = 0;
        
-       Py_Return;
+       Py_RETURN_NONE;
 }
 
 
@@ -254,9 +261,7 @@ char KX_SCA_AddObjectActuator::GetTime_doc[] =
 "\tReturns the lifetime of the object that will be added.\n";
 
 
-PyObject* KX_SCA_AddObjectActuator::PyGetTime(PyObject* self,
-                                                                                         PyObject* args,
-                                                                                         PyObject* kwds)
+PyObject* KX_SCA_AddObjectActuator::PyGetTime(PyObject* self)
 {
        return PyInt_FromLong(m_timeProp);
 }
@@ -290,17 +295,13 @@ char KX_SCA_AddObjectActuator::GetLinearVelocity_doc[] =
 "\tReturns the linear velocity that will be assigned to \n"
 "\tthe created object.\n";
 
-
-
-PyObject* KX_SCA_AddObjectActuator::PyGetLinearVelocity(PyObject* self,
-                                                                                                               PyObject* args,
-                                                                                                               PyObject* kwds)
+PyObject* KX_SCA_AddObjectActuator::PyGetLinearVelocity(PyObject* self)
 {
        PyObject *retVal = PyList_New(3);
 
-       PyList_SetItem(retVal, 0, PyFloat_FromDouble(m_linear_velocity[0]));
-       PyList_SetItem(retVal, 1, PyFloat_FromDouble(m_linear_velocity[1]));
-       PyList_SetItem(retVal, 2, PyFloat_FromDouble(m_linear_velocity[2]));
+       PyList_SET_ITEM(retVal, 0, PyFloat_FromDouble(m_linear_velocity[0]));
+       PyList_SET_ITEM(retVal, 1, PyFloat_FromDouble(m_linear_velocity[1]));
+       PyList_SET_ITEM(retVal, 2, PyFloat_FromDouble(m_linear_velocity[2]));
        
        return retVal;
 }
@@ -313,12 +314,10 @@ char KX_SCA_AddObjectActuator::SetLinearVelocity_doc[] =
 "\t- vx: float\n"
 "\t- vy: float\n"
 "\t- vz: float\n"
+"\t- local: bool\n"
 "\tAssign this velocity to the created object. \n";
 
-
-PyObject* KX_SCA_AddObjectActuator::PySetLinearVelocity(PyObject* self,
-                                                                                                               PyObject* args,
-                                                                                                               PyObject* kwds)
+PyObject* KX_SCA_AddObjectActuator::PySetLinearVelocity(PyObject* self, PyObject* args)
 {
        
        float vecArg[3];
@@ -326,7 +325,46 @@ PyObject* KX_SCA_AddObjectActuator::PySetLinearVelocity(PyObject* self,
                return NULL;
 
        m_linear_velocity.setValue(vecArg);
-       Py_Return;
+       Py_RETURN_NONE;
+}
+
+/* 7. getAngularVelocity */
+char KX_SCA_AddObjectActuator::GetAngularVelocity_doc[] = 
+"GetAngularVelocity()\n"
+"\tReturns the angular velocity that will be assigned to \n"
+"\tthe created object.\n";
+
+PyObject* KX_SCA_AddObjectActuator::PyGetAngularVelocity(PyObject* self)
+{
+       PyObject *retVal = PyList_New(3);
+
+       PyList_SET_ITEM(retVal, 0, PyFloat_FromDouble(m_angular_velocity[0]));
+       PyList_SET_ITEM(retVal, 1, PyFloat_FromDouble(m_angular_velocity[1]));
+       PyList_SET_ITEM(retVal, 2, PyFloat_FromDouble(m_angular_velocity[2]));
+       
+       return retVal;
+}
+
+
+
+/* 8. setAngularVelocity                                                 */
+char KX_SCA_AddObjectActuator::SetAngularVelocity_doc[] = 
+"setAngularVelocity(vx, vy, vz)\n"
+"\t- vx: float\n"
+"\t- vy: float\n"
+"\t- vz: float\n"
+"\t- local: bool\n"
+"\tAssign this angular velocity to the created object. \n";
+
+PyObject* KX_SCA_AddObjectActuator::PySetAngularVelocity(PyObject* self, PyObject* args)
+{
+       
+       float vecArg[3];
+       if (!PyArg_ParseTuple(args, "fff", &vecArg[0], &vecArg[1], &vecArg[2]))
+               return NULL;
+
+       m_angular_velocity.setValue(vecArg);
+       Py_RETURN_NONE;
 }
 
 void   KX_SCA_AddObjectActuator::InstantAddObject()
@@ -337,8 +375,9 @@ void        KX_SCA_AddObjectActuator::InstantAddObject()
                // Now it needs to be added to the current scene.
                SCA_IObject* replica = m_scene->AddReplicaObject(m_OriginalObject,GetParent(),m_timeProp );
                KX_GameObject * game_obj = static_cast<KX_GameObject *>(replica);
-               game_obj->setLinearVelocity(m_linear_velocity,m_localFlag);
-               game_obj->ResolveCombinedVelocities(m_linear_velocity, MT_Vector3(0., 0., 0.), m_localFlag, false);
+               game_obj->setLinearVelocity(m_linear_velocity,m_localLinvFlag);
+               game_obj->setAngularVelocity(m_angular_velocity,m_localAngvFlag);
+               game_obj->ResolveCombinedVelocities(m_linear_velocity, m_angular_velocity, m_localLinvFlag, m_localAngvFlag);
 
                // keep a copy of the last object, to allow python scripters to change it
                if (m_lastCreatedObject)
@@ -355,13 +394,11 @@ void      KX_SCA_AddObjectActuator::InstantAddObject()
        }
 }
 
-PyObject* KX_SCA_AddObjectActuator::PyInstantAddObject(PyObject* self,
-                                                                                                                  PyObject* args,
-                                                                                                                  PyObject* kwds)
+PyObject* KX_SCA_AddObjectActuator::PyInstantAddObject(PyObject* self)
 {
        InstantAddObject();
 
-       Py_Return;
+       Py_RETURN_NONE;
 }
 
 
@@ -372,9 +409,7 @@ char KX_SCA_AddObjectActuator::GetLastCreatedObject_doc[] =
 "\tReturn the last created object. \n";
 
 
-PyObject* KX_SCA_AddObjectActuator::PyGetLastCreatedObject(PyObject* self,
-                                                                                                                  PyObject* args,
-                                                                                                                  PyObject* kwds)
+PyObject* KX_SCA_AddObjectActuator::PyGetLastCreatedObject(PyObject* self)
 {
        SCA_IObject* result = this->GetLastCreatedObject();
        
@@ -386,5 +421,5 @@ PyObject* KX_SCA_AddObjectActuator::PyGetLastCreatedObject(PyObject* self,
                return result;
        }
        // don't return NULL to python anymore, it gives trouble in the scripts
-       Py_Return;
+       Py_RETURN_NONE;
 }
index e7fdb2fbfbc0e9e49b014d5a37844fc0ec02f63b..278d41802847832b39bbc89b20d952a5001d0554 100644 (file)
@@ -60,9 +60,13 @@ class KX_SCA_AddObjectActuator : public SCA_IActuator
 
        /// Linear velocity upon creation of the object. 
        MT_Vector3  m_linear_velocity;
+       
+       /// Angular velocity upon creation of the object. 
+       MT_Vector3  m_angular_velocity;
 
        /// Apply the velocity locally 
-       bool m_localFlag;
+       bool m_localLinvFlag;
+       bool m_localAngvFlag;
        
        SCA_IObject*    m_lastCreatedObject;
        
@@ -79,7 +83,9 @@ public:
                int time,
                SCA_IScene* scene,
                const MT_Vector3& linvel,
-               bool local,
+               bool linv_local,
+               const MT_Vector3& angvel,
+               bool angv_local,
                PyTypeObject* T=&Type
        );
 
@@ -115,19 +121,23 @@ public:
        /* 1. setObject */
        KX_PYMETHOD_DOC_O(KX_SCA_AddObjectActuator,SetObject);
        /* 2. setTime */
-       KX_PYMETHOD_DOC(KX_SCA_AddObjectActuator,SetTime);
+       KX_PYMETHOD_DOC_O(KX_SCA_AddObjectActuator,SetTime);
        /* 3. getTime */
-       KX_PYMETHOD_DOC(KX_SCA_AddObjectActuator,GetTime);
+       KX_PYMETHOD_DOC_NOARGS(KX_SCA_AddObjectActuator,GetTime);
        /* 4. getObject */
        KX_PYMETHOD_DOC_VARARGS(KX_SCA_AddObjectActuator,GetObject);
        /* 5. getLinearVelocity */
-       KX_PYMETHOD_DOC(KX_SCA_AddObjectActuator,GetLinearVelocity);
+       KX_PYMETHOD_DOC_NOARGS(KX_SCA_AddObjectActuator,GetLinearVelocity);
        /* 6. setLinearVelocity */
-       KX_PYMETHOD_DOC(KX_SCA_AddObjectActuator,SetLinearVelocity);
-       /* 7. getLastCreatedObject */
-       KX_PYMETHOD_DOC(KX_SCA_AddObjectActuator,GetLastCreatedObject);
-       /* 8. instantAddObject*/
-       KX_PYMETHOD_DOC(KX_SCA_AddObjectActuator,InstantAddObject);
+       KX_PYMETHOD_DOC_VARARGS(KX_SCA_AddObjectActuator,SetLinearVelocity);
+       /* 7. getAngularVelocity */
+       KX_PYMETHOD_DOC_NOARGS(KX_SCA_AddObjectActuator,GetAngularVelocity);
+       /* 8. setAngularVelocity */
+       KX_PYMETHOD_DOC_VARARGS(KX_SCA_AddObjectActuator,SetAngularVelocity);
+       /* 9. getLastCreatedObject */
+       KX_PYMETHOD_DOC_NOARGS(KX_SCA_AddObjectActuator,GetLastCreatedObject);
+       /* 10. instantAddObject*/
+       KX_PYMETHOD_DOC_NOARGS(KX_SCA_AddObjectActuator,InstantAddObject);
 
        
 }; /* end of class KX_SCA_AddObjectActuator : public KX_EditObjectActuator */
index a5ba5b1d63408545d2ff175e6d36ce42f3b5d4bf..033b2864351f416697e1d2d4af4683fbf2c2bd5e 100644 (file)
@@ -135,6 +135,26 @@ class KX_GameObject:
                @param local: - False: you get the "global" velocity ie: relative to world orientation (default).
                              - True: you get the "local" velocity ie: relative to object orientation.
                """
+       def getAngularVelocity(local = 0):
+               """
+               Gets the game object's angular velocity.
+               
+               @type local: boolean
+               @param local: - False: you get the "global" velocity ie: relative to world orientation (default).
+                             - True: you get the "local" velocity ie: relative to object orientation.
+               @rtype: list [vx, vy, vz]
+               @return: the object's angular velocity.
+               """
+       def setAngularVelocity(velocity, local = 0):
+               """
+               Sets the game object's angular velocity.
+               
+               @type velocity: 3d vector.
+               @param velocity: angular velocity vector.
+               @type local: boolean
+               @param local: - False: you get the "global" velocity ie: relative to world orientation (default).
+                             - True: you get the "local" velocity ie: relative to object orientation.
+               """
        def getVelocity(point):
                """
                Gets the game object's velocity at the specified point.
index 4f2bf85bff3bcd058117836d6154686b34f353a2..c3b2e947ddbca023916cbd5ed1a19b6486eb5a6a 100644 (file)
@@ -64,6 +64,23 @@ class KX_SCA_AddObjectActuator(SCA_IActuator):
                """
                Returns the initial linear velocity of added objects.
                
+               @rtype: list [vx, vy, vz]
+               """
+       def setAngularVelocity(vx, vy, vz):
+               """
+               Sets the initial angular velocity of added objects.
+               
+               @type vx: float
+               @param vx: the x component of the initial angular velocity.
+               @type vy: float
+               @param vy: the y component of the initial angular velocity.
+               @type vz: float
+               @param vz: the z component of the initial angular velocity.
+               """
+       def getAngularVelocity():
+               """
+               Returns the initial angular velocity of added objects.
+               
                @rtype: list [vx, vy, vz]
                """
        def getLastCreatedObject():