- added custom get function for navmesh property of steering actuator to accept only objects with NavMesh physics type
- fixed the access to KX_SteeringActuator attributes from scripts - added enum members for KX_SteeringActuator and KX_NavMeshObject to GameLogic dictionary
This commit is contained in:
@@ -441,6 +441,18 @@ static void rna_Actuator_Armature_update(Main *bmain, Scene *scene, PointerRNA *
|
||||
constraint[0] = 0;
|
||||
}
|
||||
|
||||
static void rna_SteeringActuator_navmesh_set(PointerRNA *ptr, PointerRNA value)
|
||||
{
|
||||
bActuator *act = (bActuator*)ptr->data;
|
||||
bSteeringActuator *sa = (bSteeringActuator*) act->data;
|
||||
|
||||
Object* obj = value.data;
|
||||
if (obj && obj->body_type==OB_BODY_TYPE_NAVMESH)
|
||||
sa->navmesh = obj;
|
||||
else
|
||||
sa->navmesh = NULL;
|
||||
}
|
||||
|
||||
/* note: the following set functions exists only to avoid id refcounting */
|
||||
static void rna_Actuator_editobject_mesh_set(PointerRNA *ptr, PointerRNA value)
|
||||
{
|
||||
@@ -1942,6 +1954,7 @@ static void rna_def_steering_actuator(BlenderRNA *brna)
|
||||
RNA_def_property_pointer_sdna(prop, NULL, "navmesh");
|
||||
RNA_def_property_flag(prop, PROP_EDITABLE);
|
||||
RNA_def_property_ui_text(prop, "NavMesh Object", "Navigation mesh");
|
||||
RNA_def_property_pointer_funcs(prop, NULL, "rna_SteeringActuator_navmesh_set", NULL);
|
||||
RNA_def_property_update(prop, NC_LOGIC, NULL);
|
||||
}
|
||||
|
||||
|
||||
@@ -856,18 +856,10 @@ KX_PYMETHODDEF_DOC(KX_NavMeshObject, draw,
|
||||
"draw(mode): navigation mesh debug drawing\n"
|
||||
"mode: WALLS, POLYS, TRIS\n")
|
||||
{
|
||||
char* mode;
|
||||
int arg;
|
||||
NavMeshRenderMode renderMode = RM_TRIS;
|
||||
if (PyArg_ParseTuple(args,"s:rebuild",&mode))
|
||||
{
|
||||
STR_String mode_str(mode);
|
||||
if (mode_str.IsEqualNoCase("WALLS"))
|
||||
renderMode = RM_WALLS;
|
||||
else if (mode_str.IsEqualNoCase("POLYS"))
|
||||
renderMode = RM_POLYS;
|
||||
else if (mode_str.IsEqualNoCase("TRIS"))
|
||||
renderMode = RM_TRIS;
|
||||
}
|
||||
if (PyArg_ParseTuple(args,"i:rebuild",&arg) && arg>=0 && arg<RM_MAX)
|
||||
renderMode = (NavMeshRenderMode)arg;
|
||||
DrawNavMesh(renderMode);
|
||||
Py_RETURN_NONE;
|
||||
}
|
||||
|
||||
@@ -61,7 +61,7 @@ public:
|
||||
int FindPath(const MT_Point3& from, const MT_Point3& to, float* path, int maxPathLen);
|
||||
float Raycast(const MT_Point3& from, const MT_Point3& to);
|
||||
|
||||
enum NavMeshRenderMode {RM_WALLS, RM_POLYS, RM_TRIS};
|
||||
enum NavMeshRenderMode {RM_WALLS, RM_POLYS, RM_TRIS, RM_MAX};
|
||||
void DrawNavMesh(NavMeshRenderMode mode);
|
||||
void DrawPath(const float *path, int pathLen, const MT_Vector3& color);
|
||||
|
||||
|
||||
@@ -69,6 +69,8 @@ extern "C" {
|
||||
#include "KX_GameActuator.h"
|
||||
#include "KX_ParentActuator.h"
|
||||
#include "KX_SCA_DynamicActuator.h"
|
||||
#include "KX_SteeringActuator.h"
|
||||
#include "KX_NavMeshObject.h"
|
||||
|
||||
#include "SCA_IInputDevice.h"
|
||||
#include "SCA_PropertySensor.h"
|
||||
@@ -1586,6 +1588,17 @@ PyObject* initGameLogic(KX_KetsjiEngine *engine, KX_Scene* scene) // quick hack
|
||||
KX_MACRO_addTypesToDict(d, ROT_MODE_ZXY, ROT_MODE_ZXY);
|
||||
KX_MACRO_addTypesToDict(d, ROT_MODE_ZYX, ROT_MODE_ZYX);
|
||||
|
||||
/* Steering actuator */
|
||||
KX_MACRO_addTypesToDict(d, KX_STEERING_SEEK, KX_SteeringActuator::KX_STEERING_SEEK);
|
||||
KX_MACRO_addTypesToDict(d, KX_STEERING_FLEE, KX_SteeringActuator::KX_STEERING_FLEE);
|
||||
KX_MACRO_addTypesToDict(d, KX_STEERING_PATHFOLLOWING, KX_SteeringActuator::KX_STEERING_PATHFOLLOWING);
|
||||
|
||||
/* KX_NavMeshObject render mode */
|
||||
KX_MACRO_addTypesToDict(d, RM_WALLS, KX_NavMeshObject::RM_WALLS);
|
||||
KX_MACRO_addTypesToDict(d, RM_POLYS, KX_NavMeshObject::RM_POLYS);
|
||||
KX_MACRO_addTypesToDict(d, RM_TRIS, KX_NavMeshObject::RM_TRIS);
|
||||
|
||||
|
||||
// Check for errors
|
||||
if (PyErr_Occurred())
|
||||
{
|
||||
|
||||
@@ -62,6 +62,7 @@
|
||||
#include "KX_SCA_ReplaceMeshActuator.h"
|
||||
#include "KX_SceneActuator.h"
|
||||
#include "KX_StateActuator.h"
|
||||
#include "KX_SteeringActuator.h"
|
||||
#include "KX_TrackToActuator.h"
|
||||
#include "KX_VehicleWrapper.h"
|
||||
#include "KX_VertexProxy.h"
|
||||
@@ -215,6 +216,7 @@ void initPyTypes(void)
|
||||
PyType_Ready_Attr(dict, KX_SceneActuator, init_getset);
|
||||
PyType_Ready_Attr(dict, KX_SoundActuator, init_getset);
|
||||
PyType_Ready_Attr(dict, KX_StateActuator, init_getset);
|
||||
PyType_Ready_Attr(dict, KX_SteeringActuator, init_getset);
|
||||
PyType_Ready_Attr(dict, KX_TouchSensor, init_getset);
|
||||
PyType_Ready_Attr(dict, KX_TrackToActuator, init_getset);
|
||||
PyType_Ready_Attr(dict, KX_VehicleWrapper, init_getset);
|
||||
|
||||
@@ -318,7 +318,7 @@ PyMethodDef KX_SteeringActuator::Methods[] = {
|
||||
};
|
||||
|
||||
PyAttributeDef KX_SteeringActuator::Attributes[] = {
|
||||
KX_PYATTRIBUTE_INT_RW("bevaiour", KX_STEERING_NODEF+1, KX_STEERING_MAX-1, true, KX_SteeringActuator, m_mode),
|
||||
KX_PYATTRIBUTE_INT_RW("behaviour", KX_STEERING_NODEF+1, KX_STEERING_MAX-1, true, KX_SteeringActuator, m_mode),
|
||||
KX_PYATTRIBUTE_RW_FUNCTION("target", KX_SteeringActuator, pyattr_get_target, pyattr_set_target),
|
||||
KX_PYATTRIBUTE_RW_FUNCTION("navmesh", KX_SteeringActuator, pyattr_get_navmesh, pyattr_set_navmesh),
|
||||
KX_PYATTRIBUTE_FLOAT_RW("distance", 0.0f, 1000.0f, KX_SteeringActuator, m_distance),
|
||||
@@ -376,10 +376,16 @@ int KX_SteeringActuator::pyattr_set_navmesh(void *self, const struct KX_PYATTRIB
|
||||
if (!ConvertPythonToGameObject(value, &gameobj, true, "actuator.object = value: KX_SteeringActuator"))
|
||||
return PY_SET_ATTR_FAIL; // ConvertPythonToGameObject sets the error
|
||||
|
||||
if (!PyObject_TypeCheck(value, &KX_NavMeshObject::Type))
|
||||
{
|
||||
PyErr_Format(PyExc_TypeError, "KX_NavMeshObject is expected");
|
||||
return PY_SET_ATTR_FAIL;
|
||||
}
|
||||
|
||||
if (actuator->m_navmesh != NULL)
|
||||
actuator->m_navmesh->UnregisterActuator(actuator);
|
||||
|
||||
actuator->m_navmesh = dynamic_cast<KX_NavMeshObject*>(gameobj);
|
||||
actuator->m_navmesh = static_cast<KX_NavMeshObject*>(gameobj);
|
||||
|
||||
if (actuator->m_navmesh)
|
||||
actuator->m_navmesh->RegisterActuator(actuator);
|
||||
|
||||
Reference in New Issue
Block a user