diff options
author | HG1 <HG1_public@gmx.net> | 2014-07-12 02:18:43 +0400 |
---|---|---|
committer | Mitchell Stokes <mogurijin@gmail.com> | 2014-07-12 03:00:14 +0400 |
commit | 984d6c8677a365cf47cc6ad6c89c93b04877a948 (patch) | |
tree | 0433fe2f7f5646d4afddca0c769c42c6cbfca56b /source/gameengine/Ketsji | |
parent | 93278165937273fd0c14eb54deb1c4c25ebb1296 (diff) |
BGE debug API and actuator
This patch adds some new debug methods to the KX_GameObject for manually adding the debug list and bge.render for controlling the debug visualization.
It also adds a new debug actuator, which allows to control the same functions.
This patch is a updated version of T33701.
Thread on Blenderartists:
http://blenderartists.org/forum/showthread.php?264745-Debug-proerties-for-added-objects-patch&p=2256018&viewfull=1#post2256018
Reviewers: moguri
Reviewed By: moguri
Differential Revision: https://developer.blender.org/D635
Diffstat (limited to 'source/gameengine/Ketsji')
-rw-r--r-- | source/gameengine/Ketsji/KX_GameObject.cpp | 111 | ||||
-rw-r--r-- | source/gameengine/Ketsji/KX_GameObject.h | 12 | ||||
-rw-r--r-- | source/gameengine/Ketsji/KX_KetsjiEngine.cpp | 41 | ||||
-rw-r--r-- | source/gameengine/Ketsji/KX_KetsjiEngine.h | 44 | ||||
-rw-r--r-- | source/gameengine/Ketsji/KX_PythonInit.cpp | 70 | ||||
-rw-r--r-- | source/gameengine/Ketsji/KX_Scene.cpp | 12 |
6 files changed, 285 insertions, 5 deletions
diff --git a/source/gameengine/Ketsji/KX_GameObject.cpp b/source/gameengine/Ketsji/KX_GameObject.cpp index f61d08e7f71..639cd98bb47 100644 --- a/source/gameengine/Ketsji/KX_GameObject.cpp +++ b/source/gameengine/Ketsji/KX_GameObject.cpp @@ -68,6 +68,7 @@ typedef unsigned long uint_ptr; #include "SCA_IController.h" #include "NG_NetworkScene.h" //Needed for sendMessage() #include "KX_ObstacleSimulation.h" +#include "KX_Scene.h" #include "BKE_object.h" @@ -979,6 +980,44 @@ KX_GameObject::SetOccluder( } } +static void setDebug_recursive(SG_Node *node, bool debug) +{ + NodeList& children = node->GetSGChildren(); + KX_Scene *scene = KX_GetActiveScene(); + + for (NodeList::iterator childit = children.begin();!(childit==children.end());++childit) { + SG_Node *childnode = (*childit); + KX_GameObject *clientgameobj = static_cast<KX_GameObject*>( (*childit)->GetSGClientObject()); + if (clientgameobj != NULL) { + if (debug) { + if (!scene->ObjectInDebugList(clientgameobj)) + scene->AddObjectDebugProperties(clientgameobj); + } + else + scene->RemoveObjectDebugProperties(clientgameobj); + } + + /* if the childobj is NULL then this may be an inverse parent link + * so a non recursive search should still look down this node. */ + setDebug_recursive(childnode, debug); + } +} + +void KX_GameObject::SetUseDebugProperties( bool debug, bool recursive ) +{ + KX_Scene *scene = KX_GetActiveScene(); + + if (debug) { + if (!scene->ObjectInDebugList(this)) + scene->AddObjectDebugProperties(this); + } + else + scene->RemoveObjectDebugProperties(this); + + if (recursive) + setDebug_recursive(GetSGNode(), debug); +} + void KX_GameObject::SetLayer( int l @@ -1828,6 +1867,7 @@ PyMethodDef KX_GameObject::Methods[] = { KX_PYMETHODTABLE_O(KX_GameObject, getDistanceTo), KX_PYMETHODTABLE_O(KX_GameObject, getVectTo), KX_PYMETHODTABLE(KX_GameObject, sendMessage), + KX_PYMETHODTABLE(KX_GameObject, addDebugProperty), KX_PYMETHODTABLE_KEYWORDS(KX_GameObject, playAction), KX_PYMETHODTABLE(KX_GameObject, stopAction), @@ -1880,6 +1920,8 @@ PyAttributeDef KX_GameObject::Attributes[] = { KX_PYATTRIBUTE_RO_FUNCTION("childrenRecursive", KX_GameObject, pyattr_get_children_recursive), KX_PYATTRIBUTE_RO_FUNCTION("attrDict", KX_GameObject, pyattr_get_attrDict), KX_PYATTRIBUTE_RW_FUNCTION("color", KX_GameObject, pyattr_get_obcolor, pyattr_set_obcolor), + KX_PYATTRIBUTE_RW_FUNCTION("debug", KX_GameObject, pyattr_get_debug, pyattr_set_debug), + KX_PYATTRIBUTE_RW_FUNCTION("debugRecursive", KX_GameObject, pyattr_get_debugRecursive, pyattr_set_debugRecursive), /* experimental, don't rely on these yet */ KX_PYATTRIBUTE_RO_FUNCTION("sensors", KX_GameObject, pyattr_get_sensors), @@ -2796,6 +2838,52 @@ PyObject *KX_GameObject::pyattr_get_attrDict(void *self_v, const KX_PYATTRIBUTE_ return self->m_attr_dict; } +PyObject *KX_GameObject::pyattr_get_debug(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef) +{ + KX_Scene *scene = KX_GetActiveScene(); + KX_GameObject *self = static_cast<KX_GameObject*>(self_v); + + return PyBool_FromLong(scene->ObjectInDebugList(self)); +} + +int KX_GameObject::pyattr_set_debug(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef, PyObject *value) +{ + KX_GameObject *self = static_cast<KX_GameObject*>(self_v); + int param = PyObject_IsTrue(value); + + if (param == -1) { + PyErr_SetString(PyExc_AttributeError, "gameOb.debug = bool: KX_GameObject, expected True or False"); + return PY_SET_ATTR_FAIL; + } + + self->SetUseDebugProperties(param, false); + + return PY_SET_ATTR_SUCCESS; +} + +PyObject *KX_GameObject::pyattr_get_debugRecursive(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef) +{ + KX_Scene *scene = KX_GetActiveScene(); + KX_GameObject *self = static_cast<KX_GameObject*>(self_v); + + return PyBool_FromLong(scene->ObjectInDebugList(self)); +} + +int KX_GameObject::pyattr_set_debugRecursive(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef, PyObject *value) +{ + KX_GameObject *self = static_cast<KX_GameObject*>(self_v); + int param = PyObject_IsTrue(value); + + if (param == -1) { + PyErr_SetString(PyExc_AttributeError, "gameOb.debugRecursive = bool: KX_GameObject, expected True or False"); + return PY_SET_ATTR_FAIL; + } + + self->SetUseDebugProperties(param, true); + + return PY_SET_ATTR_SUCCESS; +} + PyObject *KX_GameObject::PyApplyForce(PyObject *args) { int local = 0; @@ -3617,6 +3705,29 @@ KX_PYMETHODDEF_DOC(KX_GameObject, isPlayingAction, } +KX_PYMETHODDEF_DOC(KX_GameObject, addDebugProperty, +"addDebugProperty(name, visible=1)\n" +"Added or remove a debug property to the debug list.\n") +{ + KX_Scene *scene = KX_GetActiveScene(); + char *name; + int visible = 1; + + if (!PyArg_ParseTuple(args,"s|i:debugProperty", &name , &visible)) + return NULL; + + if (visible) { + if (!scene->PropertyInDebugList(this, name)) + scene->AddDebugProperty(this, name); + } + else { + scene->RemoveDebugProperty(this, name); + } + + Py_RETURN_NONE; +} + + /* dict style access */ diff --git a/source/gameengine/Ketsji/KX_GameObject.h b/source/gameengine/Ketsji/KX_GameObject.h index f7f40acb8f1..d4fa4851696 100644 --- a/source/gameengine/Ketsji/KX_GameObject.h +++ b/source/gameengine/Ketsji/KX_GameObject.h @@ -934,6 +934,11 @@ public: m_pObstacleSimulation = NULL; } + /** + * add debug object to the debuglist. + */ + void SetUseDebugProperties(bool debug, bool recursive); + KX_ClientObjectInfo* getClientInfo() { return m_pClient_info; } CListValue* GetChildren(); @@ -993,6 +998,7 @@ public: KX_PYMETHOD_DOC_O(KX_GameObject,getVectTo); KX_PYMETHOD_DOC_VARARGS(KX_GameObject, sendMessage); KX_PYMETHOD_VARARGS(KX_GameObject, ReinstancePhysicsMesh); + KX_PYMETHOD_DOC(KX_GameObject, addDebugProperty); KX_PYMETHOD_DOC(KX_GameObject, playAction); KX_PYMETHOD_DOC(KX_GameObject, stopAction); @@ -1060,7 +1066,11 @@ public: static int pyattr_set_obcolor(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef, PyObject *value); static PyObject* pyattr_get_collisionCallbacks(void *selv_v, const KX_PYATTRIBUTE_DEF *attrdef); static int pyattr_set_collisionCallbacks(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef, PyObject *value); - + static PyObject* pyattr_get_debug(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef); + static int pyattr_set_debug(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef, PyObject *value); + static PyObject* pyattr_get_debugRecursive(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef); + static int pyattr_set_debugRecursive(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef, PyObject *value); + /* Experimental! */ static PyObject* pyattr_get_sensors(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef); static PyObject* pyattr_get_controllers(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef); diff --git a/source/gameengine/Ketsji/KX_KetsjiEngine.cpp b/source/gameengine/Ketsji/KX_KetsjiEngine.cpp index dde9e0c194d..5a2cb0c3a97 100644 --- a/source/gameengine/Ketsji/KX_KetsjiEngine.cpp +++ b/source/gameengine/Ketsji/KX_KetsjiEngine.cpp @@ -163,6 +163,7 @@ KX_KetsjiEngine::KX_KetsjiEngine(KX_ISystem* system) m_showProperties(false), m_showBackground(false), m_show_debug_properties(false), + m_autoAddDebugProperties(true), m_animation_record(false), @@ -1897,6 +1898,46 @@ short KX_KetsjiEngine::GetExitKey() return m_exitkey; } +void KX_KetsjiEngine::SetShowFramerate(bool frameRate) +{ + m_show_framerate = frameRate; +} + +bool KX_KetsjiEngine::GetShowFramerate() +{ + return m_show_framerate; +} + +void KX_KetsjiEngine::SetShowProfile(bool profile) +{ + m_show_profile = profile; +} + +bool KX_KetsjiEngine::GetShowProfile() +{ + return m_show_profile; +} + +void KX_KetsjiEngine::SetShowProperties(bool properties) +{ + m_show_debug_properties = properties; +} + +bool KX_KetsjiEngine::GetShowProperties() +{ + return m_show_debug_properties; +} + +void KX_KetsjiEngine::SetAutoAddDebugProperties(bool add) +{ + m_autoAddDebugProperties = add; +} + +bool KX_KetsjiEngine::GetAutoAddDebugProperties() +{ + return m_autoAddDebugProperties; +} + void KX_KetsjiEngine::SetTimingDisplay(bool frameRate, bool profile, bool properties) { m_show_framerate = frameRate; diff --git a/source/gameengine/Ketsji/KX_KetsjiEngine.h b/source/gameengine/Ketsji/KX_KetsjiEngine.h index b1ac952731e..45d594e21dc 100644 --- a/source/gameengine/Ketsji/KX_KetsjiEngine.h +++ b/source/gameengine/Ketsji/KX_KetsjiEngine.h @@ -174,8 +174,10 @@ private: bool m_showProperties; /** Show background behind text for readability? */ bool m_showBackground; - + /** Show debug properties on the game display*/ bool m_show_debug_properties; + /** Automatic add debug properties to the debug list*/ + bool m_autoAddDebugProperties; /** record physics into keyframes */ bool m_animation_record; @@ -353,6 +355,46 @@ public: static short GetExitKey(); /** + * \Sets the display for frame rate on or off. + */ + void SetShowFramerate(bool frameRate); + + /** + * \Gets the display for frame rate on or off. + */ + bool GetShowFramerate(); + + /** + * \Sets the display for individual components on or off. + */ + void SetShowProfile(bool profile); + + /** + * \Gets the display for individual components on or off. + */ + bool GetShowProfile(); + + /** + * \Sets the display of scene object debug properties on or off. + */ + void SetShowProperties(bool properties); + + /** + * \Gets the display of scene object debug properties on or off. + */ + bool GetShowProperties(); + + /** + * \Sets if the auto adding of scene object debug properties on or off. + */ + bool GetAutoAddDebugProperties(); + + /** + * \Sets the auto adding of scene object debug properties on or off. + */ + void SetAutoAddDebugProperties(bool add); + + /** * Activates or deactivates timing information display. * \param frameRate Display for frame rate on or off. * \param profile Display for individual components on or off. diff --git a/source/gameengine/Ketsji/KX_PythonInit.cpp b/source/gameengine/Ketsji/KX_PythonInit.cpp index 56b7631e7f1..fa52fab06fc 100644 --- a/source/gameengine/Ketsji/KX_PythonInit.cpp +++ b/source/gameengine/Ketsji/KX_PythonInit.cpp @@ -1389,6 +1389,71 @@ static PyObject *gPyGetVsync(PyObject *) return PyLong_FromLong(gp_Canvas->GetSwapInterval()); } +static PyObject *gPyShowFramerate(PyObject *, PyObject *args) +{ + int visible; + if (!PyArg_ParseTuple(args,"i:showFramerate",&visible)) + return NULL; + + if (visible && gp_KetsjiEngine) + gp_KetsjiEngine->SetShowFramerate(true); + else + gp_KetsjiEngine->SetShowFramerate(false); + + Py_RETURN_NONE; +} + +static PyObject *gPyShowProfile(PyObject *, PyObject *args) +{ + int visible; + if (!PyArg_ParseTuple(args,"i:showProfile",&visible)) + return NULL; + + if (visible && gp_KetsjiEngine) + gp_KetsjiEngine->SetShowProfile(true); + else + gp_KetsjiEngine->SetShowProfile(false); + + Py_RETURN_NONE; +} + +static PyObject *gPyShowProperties(PyObject *, PyObject *args) +{ + int visible; + if (!PyArg_ParseTuple(args,"i:showProperties",&visible)) + return NULL; + + if (visible && gp_KetsjiEngine) + gp_KetsjiEngine->SetShowProperties(true); + else + gp_KetsjiEngine->SetShowProperties(false); + + Py_RETURN_NONE; +} + +static PyObject *gPyAutoDebugList(PyObject *, PyObject *args) +{ + int add; + if (!PyArg_ParseTuple(args,"i:autoAddProperties",&add)) + return NULL; + + if (add && gp_KetsjiEngine) + gp_KetsjiEngine->SetAutoAddDebugProperties(true); + else + gp_KetsjiEngine->SetAutoAddDebugProperties(false); + + Py_RETURN_NONE; +} + +static PyObject *gPyClearDebugList(PyObject *) +{ + if (gp_KetsjiScene) + gp_KetsjiScene->RemoveAllDebugProperties(); + + Py_RETURN_NONE; +} + + static struct PyMethodDef rasterizer_methods[] = { {"getWindowWidth",(PyCFunction) gPyGetWindowWidth, METH_VARARGS, "getWindowWidth doc"}, @@ -1436,6 +1501,11 @@ static struct PyMethodDef rasterizer_methods[] = { {"getMipmapping", (PyCFunction) gPyGetMipmapping, METH_NOARGS, ""}, {"setVsync", (PyCFunction) gPySetVsync, METH_VARARGS, ""}, {"getVsync", (PyCFunction) gPyGetVsync, METH_NOARGS, ""}, + {"showFramerate",(PyCFunction) gPyShowFramerate, METH_VARARGS, "show or hide the framerate"}, + {"showProfile",(PyCFunction) gPyShowProfile, METH_VARARGS, "show or hide the profile"}, + {"showProperties",(PyCFunction) gPyShowProperties, METH_VARARGS, "show or hide the debug properties"}, + {"autoDebugList",(PyCFunction) gPyAutoDebugList, METH_VARARGS, "enable or disable auto adding debug properties to the debug list"}, + {"clearDebugList",(PyCFunction) gPyClearDebugList, METH_NOARGS, "clears the debug property list"}, { NULL, (PyCFunction) NULL, 0, NULL } }; diff --git a/source/gameengine/Ketsji/KX_Scene.cpp b/source/gameengine/Ketsji/KX_Scene.cpp index d57c9b78587..5745e3adbc5 100644 --- a/source/gameengine/Ketsji/KX_Scene.cpp +++ b/source/gameengine/Ketsji/KX_Scene.cpp @@ -595,7 +595,9 @@ KX_GameObject* KX_Scene::AddNodeReplicaObject(class SG_IObject* node, class CVal void KX_Scene::ReplicateLogic(KX_GameObject* newobj) { /* add properties to debug list, for added objects and DupliGroups */ - AddObjectDebugProperties(newobj); + if (KX_GetActiveEngine()->GetAutoAddDebugProperties()) { + AddObjectDebugProperties(newobj); + } // also relink the controller to sensors/actuators SCA_ControllerList& controllers = newobj->GetControllers(); //SCA_SensorList& sensors = newobj->GetSensors(); @@ -1005,7 +1007,7 @@ int KX_Scene::NewRemoveObject(class CValue* gameobj) int ret; KX_GameObject* newobj = (KX_GameObject*) gameobj; - /* remove property to debug list */ + /* remove property from debug list */ RemoveObjectDebugProperties(newobj); /* Invalidate the python reference, since the object may exist in script lists @@ -2022,7 +2024,11 @@ bool KX_Scene::MergeScene(KX_Scene *other) { KX_GameObject* gameobj = (KX_GameObject*)other->GetObjectList()->GetValue(i); MergeScene_GameObject(gameobj, this, other); - AddObjectDebugProperties(gameobj); // add properties to debug list for LibLoad objects + + /* add properties to debug list for LibLoad objects */ + if (KX_GetActiveEngine()->GetAutoAddDebugProperties()) { + AddObjectDebugProperties(gameobj); + } gameobj->UpdateBuckets(false); /* only for active objects */ } |