Page MenuHome

physics_type.patch

physics_type.patch

.../Converter/BL_BlenderDataConversion.cpp | 42 +++++++++++++++++++++-
.../Converter/BL_BlenderDataConversion.h | 4 +++
source/gameengine/Ketsji/KX_GameObject.cpp | 35 +++++++++++++++---
source/gameengine/Ketsji/KX_GameObject.h | 10 ++++++
source/gameengine/Ketsji/KX_PythonInit.cpp | 11 ++++++
5 files changed, 97 insertions(+), 5 deletions(-)
diff --git a/source/gameengine/Converter/BL_BlenderDataConversion.cpp b/source/gameengine/Converter/BL_BlenderDataConversion.cpp
index 2fefea7..8eb8e36 100644
--- a/source/gameengine/Converter/BL_BlenderDataConversion.cpp
+++ b/source/gameengine/Converter/BL_BlenderDataConversion.cpp
@@ -1427,6 +1427,16 @@ static void BL_CreatePhysicsObjectNew(KX_GameObject* gameobj,
if ((blenderobject->gameflag & OB_RECORD_ANIMATION) != 0)
gameobj->SetRecordAnimation(true);
+ // are we an actor?
+ if ((blenderobject->gameflag & OB_ACTOR) != 0)
+ gameobj->m_isActor = true;
+
+ // are we a ghost?
+ if ((blenderobject->gameflag & OB_GHOST) != 0)
+ gameobj->m_isGhost = true;
+
+
+
// store materialname in auxinfo, needed for touchsensors
if (meshobj)
{
@@ -1701,6 +1711,7 @@ static KX_GameObject *gameobject_from_blenderobject(
/* set the visibility state based on the objects render option in the outliner */
if (ob->restrictflag & OB_RESTRICT_RENDER) gameobj->SetVisible(0, 0);
}
+
return gameobj;
}
@@ -2519,7 +2530,7 @@ void BL_ConvertBlenderObjects(struct Main* maggie,
{
KX_GameObject* gameobj = static_cast<KX_GameObject*>(objectlist->GetValue(i));
struct Object* blenderobject = gameobj->GetBlenderObject();
- if (blenderobject->type==OB_MESH && (blenderobject->gameflag & OB_NAVMESH))
+ if (blenderobject->type == OB_MESH && (blenderobject->gameflag & OB_NAVMESH))
{
KX_NavMeshObject* navmesh = static_cast<KX_NavMeshObject*>(gameobj);
navmesh->SetVisible(0, true);
@@ -2527,6 +2538,8 @@ void BL_ConvertBlenderObjects(struct Main* maggie,
if (obssimulation)
obssimulation->AddObstaclesForNavMesh(navmesh);
}
+ SetPhysicsType(gameobj, blenderobject);
+
}
for ( i=0; i<inactivelist->GetCount();i++)
{
@@ -2537,6 +2550,7 @@ void BL_ConvertBlenderObjects(struct Main* maggie,
KX_NavMeshObject* navmesh = static_cast<KX_NavMeshObject*>(gameobj);
navmesh->SetVisible(0, true);
}
+ SetPhysicsType(gameobj, blenderobject);
}
#define CONVERT_LOGIC
@@ -2603,6 +2617,32 @@ void BL_ConvertBlenderObjects(struct Main* maggie,
bucketmanager->OptimizeBuckets(distance);
}
+void SetPhysicsType(KX_GameObject *gameobj, struct Object *blenderobject)
+{
+ /* Set the physics type of a game object from the blender object flags*/
+ KX_PhysicsType physics_type = KX_PhysicsType::NO_COLLISION;
+ int body_flag = blenderobject->body_type;
+
+ if (body_flag == OB_BODY_TYPE_CHARACTER)
+ physics_type = KX_PhysicsType::CHARACTER;
+ else if (body_flag == OB_BODY_TYPE_NAVMESH)
+ physics_type = KX_PhysicsType::NAVIGATION_MESH;
+ else if (body_flag == OB_BODY_TYPE_SENSOR)
+ physics_type = KX_PhysicsType::SENSOR;
+ else if (body_flag == OB_BODY_TYPE_OCCLUDER)
+ physics_type = KX_PhysicsType::OCCLUDE;
+ else if (body_flag == OB_BODY_TYPE_SOFT)
+ physics_type = KX_PhysicsType::SOFT_BODY;
+ else if (body_flag == OB_BODY_TYPE_RIGID)
+ physics_type = KX_PhysicsType::RIGID_BODY;
+ else if (body_flag == OB_BODY_TYPE_DYNAMIC)
+ physics_type = KX_PhysicsType::DYNAMIC;
+ else if (body_flag == OB_BODY_TYPE_STATIC)
+ physics_type = KX_PhysicsType::STATIC;
+
+ gameobj->m_physicsType = physics_type;
+}
+
SCA_IInputDevice::KX_EnumInputs ConvertKeyCode(int key_code)
{
return gReverseKeyTranslateTable[key_code];
diff --git a/source/gameengine/Converter/BL_BlenderDataConversion.h b/source/gameengine/Converter/BL_BlenderDataConversion.h
index 6bd7795..cead273 100644
--- a/source/gameengine/Converter/BL_BlenderDataConversion.h
+++ b/source/gameengine/Converter/BL_BlenderDataConversion.h
@@ -38,6 +38,8 @@
#include "KX_PhysicsEngineEnums.h"
#include "SCA_IInputDevice.h"
+class KX_GameObject;
+
class RAS_MeshObject* BL_ConvertMesh(struct Mesh* mesh,struct Object* lightobj,class KX_Scene* scene, class KX_BlenderSceneConverter *converter, bool libloading);
void BL_ConvertBlenderObjects(struct Main* maggie,
@@ -53,4 +55,6 @@ void BL_ConvertBlenderObjects(struct Main* maggie,
SCA_IInputDevice::KX_EnumInputs ConvertKeyCode(int key_code);
+void SetPhysicsType(KX_GameObject *gameobj, struct Object *blenderobject);
+
#endif /* __BL_BLENDERDATACONVERSION_H__ */
diff --git a/source/gameengine/Ketsji/KX_GameObject.cpp b/source/gameengine/Ketsji/KX_GameObject.cpp
index 2e39614..f0c7eb1 100644
--- a/source/gameengine/Ketsji/KX_GameObject.cpp
+++ b/source/gameengine/Ketsji/KX_GameObject.cpp
@@ -113,7 +113,10 @@ KX_GameObject::KX_GameObject(
m_pDupliGroupObject(NULL),
m_actionManager(NULL),
m_bRecordAnimation(false),
- m_isDeformable(false)
+ m_isDeformable(false),
+ m_physicsType(KX_PhysicsType::NO_COLLISION),
+ m_isGhost(false),
+ m_isActor(false)
#ifdef WITH_PYTHON
, m_attr_dict(NULL),
@@ -1819,8 +1822,11 @@ PyMethodDef KX_GameObject::Methods[] = {
};
PyAttributeDef KX_GameObject::Attributes[] = {
- KX_PYATTRIBUTE_RO_FUNCTION("name", KX_GameObject, pyattr_get_name),
- KX_PYATTRIBUTE_RO_FUNCTION("parent", KX_GameObject, pyattr_get_parent),
+ KX_PYATTRIBUTE_RO_FUNCTION("name", KX_GameObject, pyattr_get_name),
+ KX_PYATTRIBUTE_RO_FUNCTION("isActor", KX_GameObject, pyattr_get_is_actor),
+ KX_PYATTRIBUTE_RO_FUNCTION("isGhost", KX_GameObject, pyattr_get_is_ghost),
+ KX_PYATTRIBUTE_RO_FUNCTION("parent", KX_GameObject, pyattr_get_parent),
+ KX_PYATTRIBUTE_RO_FUNCTION("physics_type", KX_GameObject, pyattr_get_physics_type),
KX_PYATTRIBUTE_RO_FUNCTION("groupMembers", KX_GameObject, pyattr_get_group_members),
KX_PYATTRIBUTE_RO_FUNCTION("groupObject", KX_GameObject, pyattr_get_group_object),
KX_PYATTRIBUTE_RO_FUNCTION("scene", KX_GameObject, pyattr_get_scene),
@@ -1829,7 +1835,7 @@ PyAttributeDef KX_GameObject::Attributes[] = {
KX_PYATTRIBUTE_RW_FUNCTION("linVelocityMin", KX_GameObject, pyattr_get_lin_vel_min, pyattr_set_lin_vel_min),
KX_PYATTRIBUTE_RW_FUNCTION("linVelocityMax", KX_GameObject, pyattr_get_lin_vel_max, pyattr_set_lin_vel_max),
KX_PYATTRIBUTE_RW_FUNCTION("visible", KX_GameObject, pyattr_get_visible, pyattr_set_visible),
- KX_PYATTRIBUTE_RW_FUNCTION("record_animation", KX_GameObject, pyattr_get_record_animation, pyattr_set_record_animation),
+ KX_PYATTRIBUTE_RW_FUNCTION("recordAnimation", KX_GameObject, pyattr_get_record_animation, pyattr_set_record_animation),
KX_PYATTRIBUTE_BOOL_RW ("occlusion", KX_GameObject, m_bOccluder),
KX_PYATTRIBUTE_RW_FUNCTION("position", KX_GameObject, pyattr_get_worldPosition, pyattr_set_localPosition),
KX_PYATTRIBUTE_RO_FUNCTION("localInertia", KX_GameObject, pyattr_get_localInertia),
@@ -2119,6 +2125,27 @@ PyObject *KX_GameObject::pyattr_get_parent(void *self_v, const KX_PYATTRIBUTE_DE
Py_RETURN_NONE;
}
+PyObject *KX_GameObject::pyattr_get_physics_type(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef)
+{
+ KX_GameObject* self = static_cast<KX_GameObject*>(self_v);
+ int physics_type = (int)self->m_physicsType;
+ return PyLong_FromLong(physics_type);
+}
+
+PyObject *KX_GameObject::pyattr_get_is_actor(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef)
+{
+ KX_GameObject* self = static_cast<KX_GameObject*>(self_v);
+ long is_actor = (long)self->m_isActor;
+ return PyBool_FromLong(is_actor);
+}
+
+PyObject *KX_GameObject::pyattr_get_is_ghost(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef)
+{
+ KX_GameObject* self = static_cast<KX_GameObject*>(self_v);
+ long is_ghost = (long)self->m_isGhost;
+ return PyBool_FromLong(is_ghost);
+}
+
PyObject *KX_GameObject::pyattr_get_group_members(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef)
{
KX_GameObject* self = static_cast<KX_GameObject*>(self_v);
diff --git a/source/gameengine/Ketsji/KX_GameObject.h b/source/gameengine/Ketsji/KX_GameObject.h
index ac0afca..b331fa4 100644
--- a/source/gameengine/Ketsji/KX_GameObject.h
+++ b/source/gameengine/Ketsji/KX_GameObject.h
@@ -64,6 +64,9 @@ struct Object;
class KX_ObstacleSimulation;
struct bAction;
+enum KX_PhysicsType { NO_COLLISION, STATIC, DYNAMIC, RIGID_BODY, SOFT_BODY, OCCLUDE, SENSOR, NAVIGATION_MESH, CHARACTER };
+
+
#ifdef WITH_PYTHON
/* utility conversion function */
bool ConvertPythonToGameObject(PyObject *value, KX_GameObject **object, bool py_none_ok, const char *error_prefix);
@@ -131,6 +134,10 @@ protected:
public:
bool m_isDeformable;
+ KX_PhysicsType m_physicsType;
+ bool m_isActor;
+ bool m_isGhost;
+
/**
* Helper function for modules that can't include KX_ClientObjectInfo.h
*/
@@ -1000,6 +1007,9 @@ public:
/* attributes */
static PyObject* pyattr_get_name(void* self_v, const KX_PYATTRIBUTE_DEF *attrdef);
static PyObject* pyattr_get_parent(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef);
+ static PyObject* pyattr_get_physics_type(void* self_v, const KX_PYATTRIBUTE_DEF *attrdef);
+ static PyObject* pyattr_get_is_actor(void* self_v, const KX_PYATTRIBUTE_DEF *attrdef);
+ static PyObject* pyattr_get_is_ghost(void* self_v, const KX_PYATTRIBUTE_DEF *attrdef);
static PyObject* pyattr_get_group_object(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef);
static PyObject* pyattr_get_group_members(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef);
diff --git a/source/gameengine/Ketsji/KX_PythonInit.cpp b/source/gameengine/Ketsji/KX_PythonInit.cpp
index 234d03a..ca495bd 100644
--- a/source/gameengine/Ketsji/KX_PythonInit.cpp
+++ b/source/gameengine/Ketsji/KX_PythonInit.cpp
@@ -1818,6 +1818,17 @@ PyObject *initGameLogic(KX_KetsjiEngine *engine, KX_Scene* scene) // quick hack
KX_MACRO_addTypesToDict(d, KX_ACTION_BLEND_BLEND, BL_Action::ACT_BLEND_BLEND);
KX_MACRO_addTypesToDict(d, KX_ACTION_BLEND_ADD, BL_Action::ACT_BLEND_ADD);
+ /* KX_PhysicsType enums*/
+ KX_MACRO_addTypesToDict(d, KX_PHYSICS_TYPE_NO_COLLISION, KX_PhysicsType::NO_COLLISION);
+ KX_MACRO_addTypesToDict(d, KX_PHYSICS_TYPE_STATIC, KX_PhysicsType::STATIC);
+ KX_MACRO_addTypesToDict(d, KX_PHYSICS_TYPE_DYNAMIC, KX_PhysicsType::DYNAMIC);
+ KX_MACRO_addTypesToDict(d, KX_PHYSICS_TYPE_RIGID_BODY, KX_PhysicsType::RIGID_BODY);
+ KX_MACRO_addTypesToDict(d, KX_PHYSICS_TYPE_SOFT_BODY, KX_PhysicsType::SOFT_BODY);
+ KX_MACRO_addTypesToDict(d, KX_PHYSICS_TYPE_OCCLUDE, KX_PhysicsType::OCCLUDE);
+ KX_MACRO_addTypesToDict(d, KX_PHYSICS_TYPE_SENSOR, KX_PhysicsType::SENSOR);
+ KX_MACRO_addTypesToDict(d, KX_PHYSICS_TYPE_NAVIGATION_MESH, KX_PhysicsType::NAVIGATION_MESH);
+ KX_MACRO_addTypesToDict(d, KX_PHYSICS_TYPE_CHARACTER, KX_PhysicsType::CHARACTER);
+
// Check for errors
if (PyErr_Occurred())
{

File Metadata

Mime Type
text/x-diff
Storage Engine
local-disk
Storage Format
Raw Data
Storage Handle
e0/10/d9abf9c49295fe22ab7ae4e8cd2c

Event Timeline