get/set Angular velocity for KX_GameObjects python api and for the AddObject actuator.

Needed so objects created in an explosion could start spinning without having motion actuators and collision sensors on each item.
This commit is contained in:
Campbell Barton 2008-08-27 03:34:53 +00:00
parent 6778c8dc29
commit d566765635
10 changed files with 220 additions and 80 deletions

@ -81,7 +81,9 @@ typedef struct bEditObjectActuator {
struct Mesh *me; struct Mesh *me;
char name[32]; char name[32];
float linVelocity[3]; /* initial lin. velocity on creation */ 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; short dyn_operation;
} bEditObjectActuator; } bEditObjectActuator;
@ -384,6 +386,9 @@ typedef struct FreeCamera {
#define ACT_EDOB_TRACK_TO 3 #define ACT_EDOB_TRACK_TO 3
#define ACT_EDOB_DYNAMICS 4 #define ACT_EDOB_DYNAMICS 4
/* editObjectActuator->localflag */
#define ACT_EDOB_LOCAL_LINV 2
#define ACT_EDOB_LOCAL_ANGV 4
/* editObjectActuator->flag */ /* editObjectActuator->flag */

@ -2022,7 +2022,7 @@ static short draw_actuatorbuttons(Object *ob, bActuator *act, uiBlock *block, sh
if(eoa->type==ACT_EDOB_ADD_OBJECT) { if(eoa->type==ACT_EDOB_ADD_OBJECT) {
int wval; /* just a temp width */ int wval; /* just a temp width */
ysize = 72; ysize = 92;
glRects(xco, yco-ysize, xco+width, yco); glRects(xco, yco-ysize, xco+width, yco);
uiEmboss((float)xco, (float)yco-ysize, (float)xco+width, (float)yco, 1); 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, uiDefButF(block, NUM, 0, "", xco+45+2*wval, yco-68, wval, 19,
eoa->linVelocity+2, -100.0, 100.0, 10, 0, eoa->linVelocity+2, -100.0, 100.0, 10, 0,
"Velocity upon creation, z component."); "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, &eoa->localflag, 0.0, 0.0, 0, 0,
"Apply the transformation locally"); "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) { else if(eoa->type==ACT_EDOB_END_OBJECT) {

@ -573,10 +573,16 @@ void BL_ConvertActuators(char* maggiename,
originalval = converter->FindGameObject(editobact->ob); 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[1]),
KX_BLENDERTRUNC(editobact->linVelocity[2])); 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 = KX_SCA_AddObjectActuator* tmpaddact =
new KX_SCA_AddObjectActuator( new KX_SCA_AddObjectActuator(
gameobj, gameobj,
@ -584,7 +590,9 @@ void BL_ConvertActuators(char* maggiename,
editobact->time, editobact->time,
scene, scene,
linvelvec.getValue(), 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 //editobact->ob to gameobj

@ -102,6 +102,12 @@ static inline void Py_Fatal(char *M) {
return ((class_name*) self)->Py##method_name(self, args, kwds); \ 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) \ #define KX_PYMETHOD_NOARGS(class_name, method_name) \
PyObject* Py##method_name(PyObject* self); \ PyObject* Py##method_name(PyObject* self); \
static PyObject* sPy##method_name( PyObject* self) { \ static PyObject* sPy##method_name( PyObject* self) { \

@ -885,6 +885,8 @@ PyMethodDef KX_GameObject::Methods[] = {
{"setPosition", (PyCFunction) KX_GameObject::sPySetPosition, METH_O}, {"setPosition", (PyCFunction) KX_GameObject::sPySetPosition, METH_O},
{"getLinearVelocity", (PyCFunction) KX_GameObject::sPyGetLinearVelocity, METH_VARARGS}, {"getLinearVelocity", (PyCFunction) KX_GameObject::sPyGetLinearVelocity, METH_VARARGS},
{"setLinearVelocity", (PyCFunction) KX_GameObject::sPySetLinearVelocity, 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}, {"getVelocity", (PyCFunction) KX_GameObject::sPyGetVelocity, METH_VARARGS},
{"getMass", (PyCFunction) KX_GameObject::sPyGetMass, METH_NOARGS}, {"getMass", (PyCFunction) KX_GameObject::sPyGetMass, METH_NOARGS},
{"getReactionForce", (PyCFunction) KX_GameObject::sPyGetReactionForce, 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* KX_GameObject::PyGetLinearVelocity(PyObject* self, PyObject* args)
PyObject* args,
PyObject* kwds)
{ {
// only can get the velocity if we have a physics object connected to us... // only can get the velocity if we have a physics object connected to us...
int local = 0; int local = 0;
@ -1162,9 +1162,7 @@ PyObject* KX_GameObject::PyGetLinearVelocity(PyObject* self,
} }
} }
PyObject* KX_GameObject::PySetLinearVelocity(PyObject* self, PyObject* KX_GameObject::PySetLinearVelocity(PyObject* self, PyObject* args)
PyObject* args,
PyObject* kwds)
{ {
int local = 0; int local = 0;
PyObject* pyvect; PyObject* pyvect;
@ -1179,6 +1177,35 @@ PyObject* KX_GameObject::PySetLinearVelocity(PyObject* self,
return NULL; 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) PyObject* KX_GameObject::PySetVisible(PyObject* self, PyObject* value)
{ {
int visible = PyInt_AsLong(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* KX_GameObject::PyGetVelocity(PyObject* self, PyObject* args)
PyObject* args,
PyObject* kwds)
{ {
// only can get the velocity if we have a physics object connected to us... // only can get the velocity if we have a physics object connected to us...
MT_Vector3 velocity(0.0,0.0,0.0); MT_Vector3 velocity(0.0,0.0,0.0);
@ -1362,9 +1387,7 @@ PyObject* KX_GameObject::PyGetChildrenRecursive(PyObject* self)
return list; return list;
} }
PyObject* KX_GameObject::PyGetMesh(PyObject* self, PyObject* KX_GameObject::PyGetMesh(PyObject* self, PyObject* args)
PyObject* args,
PyObject* kwds)
{ {
int mesh = 0; int mesh = 0;
@ -1404,9 +1427,7 @@ PyObject* KX_GameObject::PySetCollisionMargin(PyObject* self, PyObject* value)
PyObject* KX_GameObject::PyApplyImpulse(PyObject* self, PyObject* KX_GameObject::PyApplyImpulse(PyObject* self, PyObject* args)
PyObject* args,
PyObject* kwds)
{ {
PyObject* pyattach; PyObject* pyattach;
PyObject* pyimpulse; PyObject* pyimpulse;
@ -1477,9 +1498,7 @@ PyObject* KX_GameObject::PySetOrientation(PyObject* self, PyObject* value)
return NULL; return NULL;
} }
PyObject* KX_GameObject::PyAlignAxisToVect(PyObject* self, PyObject* KX_GameObject::PyAlignAxisToVect(PyObject* self, PyObject* args)
PyObject* args,
PyObject* kwds)
{ {
PyObject* pyvect; PyObject* pyvect;
int axis = 2; //z axis is the default int axis = 2; //z axis is the default

@ -726,9 +726,11 @@ public:
KX_PYMETHOD_NOARGS(KX_GameObject,GetPosition); KX_PYMETHOD_NOARGS(KX_GameObject,GetPosition);
KX_PYMETHOD_O(KX_GameObject,SetPosition); KX_PYMETHOD_O(KX_GameObject,SetPosition);
KX_PYMETHOD(KX_GameObject,GetLinearVelocity); KX_PYMETHOD_VARARGS(KX_GameObject,GetLinearVelocity);
KX_PYMETHOD(KX_GameObject,SetLinearVelocity); KX_PYMETHOD_VARARGS(KX_GameObject,SetLinearVelocity);
KX_PYMETHOD(KX_GameObject,GetVelocity); 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,GetMass);
KX_PYMETHOD_NOARGS(KX_GameObject,GetReactionForce); KX_PYMETHOD_NOARGS(KX_GameObject,GetReactionForce);
KX_PYMETHOD_NOARGS(KX_GameObject,GetOrientation); KX_PYMETHOD_NOARGS(KX_GameObject,GetOrientation);
@ -737,20 +739,20 @@ public:
KX_PYMETHOD_O(KX_GameObject,SetVisible); KX_PYMETHOD_O(KX_GameObject,SetVisible);
KX_PYMETHOD_NOARGS(KX_GameObject,GetState); KX_PYMETHOD_NOARGS(KX_GameObject,GetState);
KX_PYMETHOD_O(KX_GameObject,SetState); 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_O(KX_GameObject,GetAxisVect);
KX_PYMETHOD_NOARGS(KX_GameObject,SuspendDynamics); KX_PYMETHOD_NOARGS(KX_GameObject,SuspendDynamics);
KX_PYMETHOD_NOARGS(KX_GameObject,RestoreDynamics); KX_PYMETHOD_NOARGS(KX_GameObject,RestoreDynamics);
KX_PYMETHOD_NOARGS(KX_GameObject,EnableRigidBody); KX_PYMETHOD_NOARGS(KX_GameObject,EnableRigidBody);
KX_PYMETHOD_NOARGS(KX_GameObject,DisableRigidBody); 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_O(KX_GameObject,SetCollisionMargin);
KX_PYMETHOD_NOARGS(KX_GameObject,GetParent); KX_PYMETHOD_NOARGS(KX_GameObject,GetParent);
KX_PYMETHOD_O(KX_GameObject,SetParent); KX_PYMETHOD_O(KX_GameObject,SetParent);
KX_PYMETHOD_NOARGS(KX_GameObject,RemoveParent); KX_PYMETHOD_NOARGS(KX_GameObject,RemoveParent);
KX_PYMETHOD_NOARGS(KX_GameObject,GetChildren); KX_PYMETHOD_NOARGS(KX_GameObject,GetChildren);
KX_PYMETHOD_NOARGS(KX_GameObject,GetChildrenRecursive); 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,GetPhysicsId);
KX_PYMETHOD_NOARGS(KX_GameObject,GetPropertyNames); KX_PYMETHOD_NOARGS(KX_GameObject,GetPropertyNames);
KX_PYMETHOD_NOARGS(KX_GameObject,EndObject); KX_PYMETHOD_NOARGS(KX_GameObject,EndObject);

@ -52,14 +52,20 @@ KX_SCA_AddObjectActuator::KX_SCA_AddObjectActuator(SCA_IObject *gameobj,
int time, int time,
SCA_IScene* scene, SCA_IScene* scene,
const MT_Vector3& linvel, const MT_Vector3& linvel,
bool local, bool linv_local,
const MT_Vector3& angvel,
bool angv_local,
PyTypeObject* T) PyTypeObject* T)
: :
SCA_IActuator(gameobj, T), SCA_IActuator(gameobj, T),
m_OriginalObject(original), m_OriginalObject(original),
m_scene(scene), m_scene(scene),
m_linear_velocity(linvel), m_linear_velocity(linvel),
m_localFlag(local) m_localLinvFlag(linv_local),
m_angular_velocity(angvel),
m_localAngvFlag(angv_local)
{ {
if (m_OriginalObject) if (m_OriginalObject)
m_OriginalObject->RegisterActuator(this); m_OriginalObject->RegisterActuator(this);
@ -181,13 +187,15 @@ PyParentObject KX_SCA_AddObjectActuator::Parents[] = {
}; };
PyMethodDef KX_SCA_AddObjectActuator::Methods[] = { PyMethodDef KX_SCA_AddObjectActuator::Methods[] = {
{"setObject", (PyCFunction) KX_SCA_AddObjectActuator::sPySetObject, METH_O, SetObject_doc}, {"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}, {"getObject", (PyCFunction) KX_SCA_AddObjectActuator::sPyGetObject, METH_VARARGS, GetObject_doc},
{"getTime", (PyCFunction) KX_SCA_AddObjectActuator::sPyGetTime, METH_VARARGS, GetTime_doc}, {"getTime", (PyCFunction) KX_SCA_AddObjectActuator::sPyGetTime, METH_NOARGS, GetTime_doc},
{"getLinearVelocity", (PyCFunction) KX_SCA_AddObjectActuator::sPyGetLinearVelocity, METH_VARARGS, GetLinearVelocity_doc}, {"getLinearVelocity", (PyCFunction) KX_SCA_AddObjectActuator::sPyGetLinearVelocity, METH_NOARGS, GetLinearVelocity_doc},
{"setLinearVelocity", (PyCFunction) KX_SCA_AddObjectActuator::sPySetLinearVelocity, METH_VARARGS, SetLinearVelocity_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"}, {"getAngularVelocity", (PyCFunction) KX_SCA_AddObjectActuator::sPyGetAngularVelocity, METH_NOARGS, GetAngularVelocity_doc},
{"instantAddObject", (PyCFunction) KX_SCA_AddObjectActuator::sPyInstantAddObject, METH_VARARGS,"instantAddObject() : immediately add object without delay\n"}, {"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 {NULL,NULL} //Sentinel
}; };
@ -231,19 +239,18 @@ char KX_SCA_AddObjectActuator::SetTime_doc[] =
"\tIf the duration is negative, it is set to 0.\n"; "\tIf the duration is negative, it is set to 0.\n";
PyObject* KX_SCA_AddObjectActuator::PySetTime(PyObject* self, PyObject* KX_SCA_AddObjectActuator::PySetTime(PyObject* self, PyObject* value)
PyObject* args,
PyObject* kwds)
{ {
int deltatime; int deltatime = PyInt_AsLong(value);
if (deltatime==-1 && PyErr_Occurred()) {
if (!PyArg_ParseTuple(args, "i", &deltatime)) PyErr_SetString(PyExc_TypeError, "expected an int");
return NULL; return NULL;
}
m_timeProp = deltatime; m_timeProp = deltatime;
if (m_timeProp < 0) m_timeProp = 0; 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"; "\tReturns the lifetime of the object that will be added.\n";
PyObject* KX_SCA_AddObjectActuator::PyGetTime(PyObject* self, PyObject* KX_SCA_AddObjectActuator::PyGetTime(PyObject* self)
PyObject* args,
PyObject* kwds)
{ {
return PyInt_FromLong(m_timeProp); 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" "\tReturns the linear velocity that will be assigned to \n"
"\tthe created object.\n"; "\tthe created object.\n";
PyObject* KX_SCA_AddObjectActuator::PyGetLinearVelocity(PyObject* self)
PyObject* KX_SCA_AddObjectActuator::PyGetLinearVelocity(PyObject* self,
PyObject* args,
PyObject* kwds)
{ {
PyObject *retVal = PyList_New(3); PyObject *retVal = PyList_New(3);
PyList_SetItem(retVal, 0, PyFloat_FromDouble(m_linear_velocity[0])); PyList_SET_ITEM(retVal, 0, PyFloat_FromDouble(m_linear_velocity[0]));
PyList_SetItem(retVal, 1, PyFloat_FromDouble(m_linear_velocity[1])); PyList_SET_ITEM(retVal, 1, PyFloat_FromDouble(m_linear_velocity[1]));
PyList_SetItem(retVal, 2, PyFloat_FromDouble(m_linear_velocity[2])); PyList_SET_ITEM(retVal, 2, PyFloat_FromDouble(m_linear_velocity[2]));
return retVal; return retVal;
} }
@ -313,12 +314,10 @@ char KX_SCA_AddObjectActuator::SetLinearVelocity_doc[] =
"\t- vx: float\n" "\t- vx: float\n"
"\t- vy: float\n" "\t- vy: float\n"
"\t- vz: float\n" "\t- vz: float\n"
"\t- local: bool\n"
"\tAssign this velocity to the created object. \n"; "\tAssign this velocity to the created object. \n";
PyObject* KX_SCA_AddObjectActuator::PySetLinearVelocity(PyObject* self, PyObject* args)
PyObject* KX_SCA_AddObjectActuator::PySetLinearVelocity(PyObject* self,
PyObject* args,
PyObject* kwds)
{ {
float vecArg[3]; float vecArg[3];
@ -326,7 +325,46 @@ PyObject* KX_SCA_AddObjectActuator::PySetLinearVelocity(PyObject* self,
return NULL; return NULL;
m_linear_velocity.setValue(vecArg); 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() void KX_SCA_AddObjectActuator::InstantAddObject()
@ -337,8 +375,9 @@ void KX_SCA_AddObjectActuator::InstantAddObject()
// Now it needs to be added to the current scene. // Now it needs to be added to the current scene.
SCA_IObject* replica = m_scene->AddReplicaObject(m_OriginalObject,GetParent(),m_timeProp ); SCA_IObject* replica = m_scene->AddReplicaObject(m_OriginalObject,GetParent(),m_timeProp );
KX_GameObject * game_obj = static_cast<KX_GameObject *>(replica); KX_GameObject * game_obj = static_cast<KX_GameObject *>(replica);
game_obj->setLinearVelocity(m_linear_velocity,m_localFlag); game_obj->setLinearVelocity(m_linear_velocity,m_localLinvFlag);
game_obj->ResolveCombinedVelocities(m_linear_velocity, MT_Vector3(0., 0., 0.), m_localFlag, false); 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 // keep a copy of the last object, to allow python scripters to change it
if (m_lastCreatedObject) if (m_lastCreatedObject)
@ -355,13 +394,11 @@ void KX_SCA_AddObjectActuator::InstantAddObject()
} }
} }
PyObject* KX_SCA_AddObjectActuator::PyInstantAddObject(PyObject* self, PyObject* KX_SCA_AddObjectActuator::PyInstantAddObject(PyObject* self)
PyObject* args,
PyObject* kwds)
{ {
InstantAddObject(); InstantAddObject();
Py_Return; Py_RETURN_NONE;
} }
@ -372,9 +409,7 @@ char KX_SCA_AddObjectActuator::GetLastCreatedObject_doc[] =
"\tReturn the last created object. \n"; "\tReturn the last created object. \n";
PyObject* KX_SCA_AddObjectActuator::PyGetLastCreatedObject(PyObject* self, PyObject* KX_SCA_AddObjectActuator::PyGetLastCreatedObject(PyObject* self)
PyObject* args,
PyObject* kwds)
{ {
SCA_IObject* result = this->GetLastCreatedObject(); SCA_IObject* result = this->GetLastCreatedObject();
@ -386,5 +421,5 @@ PyObject* KX_SCA_AddObjectActuator::PyGetLastCreatedObject(PyObject* self,
return result; return result;
} }
// don't return NULL to python anymore, it gives trouble in the scripts // don't return NULL to python anymore, it gives trouble in the scripts
Py_Return; Py_RETURN_NONE;
} }

@ -60,9 +60,13 @@ class KX_SCA_AddObjectActuator : public SCA_IActuator
/// Linear velocity upon creation of the object. /// Linear velocity upon creation of the object.
MT_Vector3 m_linear_velocity; MT_Vector3 m_linear_velocity;
/// Angular velocity upon creation of the object.
MT_Vector3 m_angular_velocity;
/// Apply the velocity locally /// Apply the velocity locally
bool m_localFlag; bool m_localLinvFlag;
bool m_localAngvFlag;
SCA_IObject* m_lastCreatedObject; SCA_IObject* m_lastCreatedObject;
@ -79,7 +83,9 @@ public:
int time, int time,
SCA_IScene* scene, SCA_IScene* scene,
const MT_Vector3& linvel, const MT_Vector3& linvel,
bool local, bool linv_local,
const MT_Vector3& angvel,
bool angv_local,
PyTypeObject* T=&Type PyTypeObject* T=&Type
); );
@ -115,19 +121,23 @@ public:
/* 1. setObject */ /* 1. setObject */
KX_PYMETHOD_DOC_O(KX_SCA_AddObjectActuator,SetObject); KX_PYMETHOD_DOC_O(KX_SCA_AddObjectActuator,SetObject);
/* 2. setTime */ /* 2. setTime */
KX_PYMETHOD_DOC(KX_SCA_AddObjectActuator,SetTime); KX_PYMETHOD_DOC_O(KX_SCA_AddObjectActuator,SetTime);
/* 3. getTime */ /* 3. getTime */
KX_PYMETHOD_DOC(KX_SCA_AddObjectActuator,GetTime); KX_PYMETHOD_DOC_NOARGS(KX_SCA_AddObjectActuator,GetTime);
/* 4. getObject */ /* 4. getObject */
KX_PYMETHOD_DOC_VARARGS(KX_SCA_AddObjectActuator,GetObject); KX_PYMETHOD_DOC_VARARGS(KX_SCA_AddObjectActuator,GetObject);
/* 5. getLinearVelocity */ /* 5. getLinearVelocity */
KX_PYMETHOD_DOC(KX_SCA_AddObjectActuator,GetLinearVelocity); KX_PYMETHOD_DOC_NOARGS(KX_SCA_AddObjectActuator,GetLinearVelocity);
/* 6. setLinearVelocity */ /* 6. setLinearVelocity */
KX_PYMETHOD_DOC(KX_SCA_AddObjectActuator,SetLinearVelocity); KX_PYMETHOD_DOC_VARARGS(KX_SCA_AddObjectActuator,SetLinearVelocity);
/* 7. getLastCreatedObject */ /* 7. getAngularVelocity */
KX_PYMETHOD_DOC(KX_SCA_AddObjectActuator,GetLastCreatedObject); KX_PYMETHOD_DOC_NOARGS(KX_SCA_AddObjectActuator,GetAngularVelocity);
/* 8. instantAddObject*/ /* 8. setAngularVelocity */
KX_PYMETHOD_DOC(KX_SCA_AddObjectActuator,InstantAddObject); 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 */ }; /* end of class KX_SCA_AddObjectActuator : public KX_EditObjectActuator */

@ -135,6 +135,26 @@ class KX_GameObject:
@param local: - False: you get the "global" velocity ie: relative to world orientation (default). @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. - 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): def getVelocity(point):
""" """
Gets the game object's velocity at the specified point. Gets the game object's velocity at the specified point.

@ -64,6 +64,23 @@ class KX_SCA_AddObjectActuator(SCA_IActuator):
""" """
Returns the initial linear velocity of added objects. 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] @rtype: list [vx, vy, vz]
""" """
def getLastCreatedObject(): def getLastCreatedObject():