blender/source/gameengine/Ketsji/KX_SCA_DynamicActuator.cpp
Campbell Barton 5d64dd019e BGE Python API
Use each types dictionary to store attributes PyAttributeDef's so it uses pythons hash lookup (which it was already doing for methods) rather then doing a string lookup on the array each time.

This also means attributes can be found in the type without having to do a dir() on the instance.
2009-04-07 11:06:35 +00:00

223 lines
5.3 KiB
C++

//
// Adjust dynamics settins for this object
//
// $Id$
//
// ***** 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.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// 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.
//
// The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
// All rights reserved.
//
// The Original Code is: all of this file.
//
// Contributor(s): none yet.
//
// ***** END GPL LICENSE BLOCK *****
//
// Previously existed as:
// \source\gameengine\GameLogic\SCA_DynamicActuator.cpp
// Please look here for revision history.
#include "KX_SCA_DynamicActuator.h"
#include "blendef.h"
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
/* ------------------------------------------------------------------------- */
/* Python functions */
/* ------------------------------------------------------------------------- */
/* Integration hooks ------------------------------------------------------- */
PyTypeObject
KX_SCA_DynamicActuator::Type = {
PyObject_HEAD_INIT(NULL)
0,
"KX_SCA_DynamicActuator",
sizeof(KX_SCA_DynamicActuator),
0,
PyDestructor,
0,
0,
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_SCA_DynamicActuator::Parents[] = {
&KX_SCA_DynamicActuator::Type,
&SCA_IActuator::Type,
&SCA_ILogicBrick::Type,
&CValue::Type,
NULL
};
PyMethodDef KX_SCA_DynamicActuator::Methods[] = {
// ---> deprecated
KX_PYMETHODTABLE(KX_SCA_DynamicActuator, setOperation),
KX_PYMETHODTABLE(KX_SCA_DynamicActuator, getOperation),
{NULL,NULL} //Sentinel
};
PyAttributeDef KX_SCA_DynamicActuator::Attributes[] = {
KX_PYATTRIBUTE_SHORT_RW("operation",0,4,false,KX_SCA_DynamicActuator,m_dyn_operation),
KX_PYATTRIBUTE_FLOAT_RW("mass",0.0,MAXFLOAT,KX_SCA_DynamicActuator,m_setmass),
{ NULL } //Sentinel
};
PyObject* KX_SCA_DynamicActuator::py_getattro(PyObject *attr)
{
py_getattro_up(SCA_IActuator);
}
int KX_SCA_DynamicActuator::py_setattro(PyObject *attr, PyObject* value)
{
py_setattro_up(SCA_IActuator);
}
/* 1. setOperation */
KX_PYMETHODDEF_DOC(KX_SCA_DynamicActuator, setOperation,
"setOperation(operation?)\n"
"\t - operation? : type of dynamic operation\n"
"\t 0 = restore dynamics\n"
"\t 1 = disable dynamics\n"
"\t 2 = enable rigid body\n"
"\t 3 = disable rigid body\n"
"Change the dynamic status of the parent object.\n")
{
ShowDeprecationWarning("setOperation()", "the operation property");
int dyn_operation;
if (!PyArg_ParseTuple(args, "i", &dyn_operation))
{
return NULL;
}
if (dyn_operation <0 || dyn_operation>3) {
PyErr_SetString(PyExc_IndexError, "Dynamic Actuator's setOperation() range must be between 0 and 3");
return NULL;
}
m_dyn_operation= dyn_operation;
Py_RETURN_NONE;
}
KX_PYMETHODDEF_DOC(KX_SCA_DynamicActuator, getOperation,
"getOperation() -> integer\n"
"Returns the operation type of this actuator.\n"
)
{
ShowDeprecationWarning("getOperation()", "the operation property");
return PyInt_FromLong((long)m_dyn_operation);
}
/* ------------------------------------------------------------------------- */
/* Native functions */
/* ------------------------------------------------------------------------- */
KX_SCA_DynamicActuator::KX_SCA_DynamicActuator(SCA_IObject *gameobj,
short dyn_operation,
float setmass,
PyTypeObject* T) :
SCA_IActuator(gameobj, T),
m_dyn_operation(dyn_operation),
m_setmass(setmass)
{
} /* End of constructor */
KX_SCA_DynamicActuator::~KX_SCA_DynamicActuator()
{
// there's nothing to be done here, really....
} /* end of destructor */
bool KX_SCA_DynamicActuator::Update()
{
// bool result = false; /*unused*/
KX_GameObject *obj = (KX_GameObject*) GetParent();
bool bNegativeEvent = IsNegativeEvent();
KX_IPhysicsController* controller;
RemoveAllEvents();
if (bNegativeEvent)
return false; // do nothing on negative events
if (!obj)
return false; // object not accessible, shouldnt happen
controller = obj->GetPhysicsController();
if (!controller)
return false; // no physic object
switch (m_dyn_operation)
{
case 0:
obj->RestoreDynamics();
break;
case 1:
obj->SuspendDynamics();
break;
case 2:
controller->setRigidBody(true);
break;
case 3:
controller->setRigidBody(false);
break;
case 4:
controller->SetMass(m_setmass);
break;
}
return false;
}
CValue* KX_SCA_DynamicActuator::GetReplica()
{
KX_SCA_DynamicActuator* replica =
new KX_SCA_DynamicActuator(*this);
if (replica == NULL)
return NULL;
replica->ProcessReplica();
// this will copy properties and so on...
CValue::AddDataToReplica(replica);
return replica;
};
/* eof */